1 package org.codehaus.xfire.service; 2 3 import java.lang.reflect.Method; 4 import java.util.Collection; 5 import java.util.Collections; 6 import java.util.HashMap; 7 import java.util.Iterator; 8 import java.util.Map; 9 10 import javax.xml.namespace.QName; 11 12 /*** 13 * Represents an description of a service. A service consists of a number of <code>OperationInfo</code> objects, a 14 * qualified name, and a service class. 15 * 16 * @author <a href="mailto:poutsma@mac.com">Arjen Poutsma</a> 17 * @see OperationInfo 18 */ 19 public class ServiceInfo 20 implements Visitable 21 { 22 private QName name; 23 private Map operations = new HashMap(); 24 private Map opsByAction = new HashMap(); 25 private Class serviceClass; 26 27 /*** 28 * Initializes a new instance of the <code>ServiceInfo</code> class with the given qualified name and service 29 * class. 30 * 31 * @param name the qualified name. 32 * @param serviceClass the service class. 33 */ 34 public ServiceInfo(QName name, Class serviceClass) 35 { 36 this.name = name; 37 this.serviceClass = serviceClass; 38 } 39 40 /*** 41 * Acceps the given visitor. Iterates over all operation infos. 42 * 43 * @param visitor the visitor. 44 */ 45 public void accept(Visitor visitor) 46 { 47 visitor.startService(this); 48 for (Iterator iterator = operations.values().iterator(); iterator.hasNext();) 49 { 50 OperationInfo operationInfo = (OperationInfo) iterator.next(); 51 operationInfo.accept(visitor); 52 } 53 visitor.endService(this); 54 } 55 56 /*** 57 * Adds an operation to this service. 58 * 59 * @param name the qualified name of the operation. 60 * @return the operation. 61 */ 62 public OperationInfo addOperation(String name, Method method) 63 { 64 if ((name == null) || (name.length() == 0)) 65 { 66 throw new IllegalArgumentException("Invalid name [" + name + "]"); 67 } 68 if (operations.containsKey(name)) 69 { 70 throw new IllegalArgumentException("An operation with name [" + name + "] already exists in this service"); 71 } 72 73 OperationInfo operation = new OperationInfo(name, method, this); 74 addOperation(operation); 75 return operation; 76 } 77 78 /*** 79 * Adds an operation to this service. 80 * 81 * @param operation the operation. 82 */ 83 void addOperation(OperationInfo operation) 84 { 85 operations.put(operation.getName(), operation); 86 } 87 88 /*** 89 * Returns the qualified name of the service descriptor. 90 * 91 * @return the qualified name. 92 */ 93 public QName getName() 94 { 95 return name; 96 } 97 98 /*** 99 * Sets the qualified name of the service descriptor. 100 * 101 * @param name the new qualified name. 102 */ 103 public void setName(QName name) 104 { 105 this.name = name; 106 } 107 108 /*** 109 * Returns the operation info with the given name, if found. 110 * 111 * @param name the name. 112 * @return the operation; or <code>null</code> if not found. 113 */ 114 public OperationInfo getOperation(String name) 115 { 116 return (OperationInfo) operations.get(name); 117 } 118 119 /*** 120 * Returns the operation info with the given action, if found. 121 * 122 * @param name the name. 123 * @return the operation; or <code>null</code> if not found. 124 */ 125 public OperationInfo getOperationByAction(String name) 126 { 127 for (Iterator itr = operations.values().iterator(); itr.hasNext();) 128 { 129 OperationInfo op = (OperationInfo) itr.next(); 130 if (op.getAction() != null && op.getAction().equals(name)) 131 { 132 return op; 133 } 134 } 135 136 if (!name.equals("*")) 137 { 138 return getOperationByAction("*"); 139 } 140 141 return null; 142 } 143 144 /*** 145 * Returns all operations for this service. 146 * 147 * @return all operations. 148 */ 149 public Collection getOperations() 150 { 151 return Collections.unmodifiableCollection(operations.values()); 152 } 153 154 /*** 155 * Returns the service class of the service descriptor. 156 * 157 * @return 158 */ 159 public Class getServiceClass() 160 { 161 return serviceClass; 162 } 163 164 /*** 165 * Removes an operation from this service. 166 * 167 * @param name the operation name. 168 */ 169 public void removeOperation(String name) 170 { 171 operations.remove(name); 172 } 173 }