001: /*
002: * Licensed to the Apache Software Foundation (ASF) under one or more
003: * contributor license agreements. See the NOTICE file distributed with
004: * this work for additional information regarding copyright ownership.
005: * The ASF licenses this file to You under the Apache License, Version 2.0
006: * (the "License"); you may not use this file except in compliance with
007: * the License. You may obtain a copy of the License at
008: *
009: * http://www.apache.org/licenses/LICENSE-2.0
010: *
011: * Unless required by applicable law or agreed to in writing, software
012: * distributed under the License is distributed on an "AS IS" BASIS,
013: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014: * See the License for the specific language governing permissions and
015: * limitations under the License.
016: */
017: package org.apache.servicemix.jbi.servicedesc;
018:
019: import java.util.HashMap;
020: import java.util.HashSet;
021: import java.util.Map;
022: import java.util.Set;
023:
024: import javax.xml.namespace.QName;
025:
026: import org.w3c.dom.DocumentFragment;
027:
028: import org.apache.servicemix.jbi.framework.ComponentNameSpace;
029:
030: /**
031: * Reference generated by NMR to refer to an endpoint registration
032: *
033: * @version $Revision: 564900 $
034: */
035: public class InternalEndpoint extends AbstractServiceEndpoint {
036:
037: /**
038: * Generated serial version UID
039: */
040: private static final long serialVersionUID = -2710298087712302015L;
041:
042: private String endpointName;
043: private QName serviceName;
044: private Set<QName> interfaces = new HashSet<QName>();
045: private transient Map<ComponentNameSpace, InternalEndpoint> remotes = new HashMap<ComponentNameSpace, InternalEndpoint>();
046:
047: /**
048: * Constructor
049: * @param componentName
050: * @param endpointName
051: * @param serviceName
052: */
053: public InternalEndpoint(ComponentNameSpace componentName,
054: String endpointName, QName serviceName) {
055: super (componentName);
056: this .endpointName = endpointName;
057: this .serviceName = serviceName;
058: }
059:
060: /**
061: * Get a reference to this endpoint, using an endpoint reference vocabulary
062: * that is known to the provider.
063: * @param operationName the name of the operation to be performed by a
064: * consumer of the generated endpoint reference. Set to <code>null</code>
065: * if this is not applicable.
066: * @return endpoint reference as an XML fragment; <code>null</code> if the
067: * provider does not support such references.
068: */
069: public DocumentFragment getAsReference(QName operationName) {
070: return EndpointReferenceBuilder.getReference(this );
071: }
072:
073: /**
074: * Returns the name of this endpoint.
075: * @return the endpoint name.
076: */
077: public String getEndpointName() {
078: return endpointName;
079: }
080:
081: /**
082: * Get the qualified names of all the interfaces implemented by this
083: * service endpoint.
084: * @return array of all interfaces implemented by this service endpoint;
085: * must be non-null and non-empty.
086: */
087: public QName[] getInterfaces() {
088: QName[] result = new QName[interfaces.size()];
089: interfaces.toArray(result);
090: return result;
091: }
092:
093: /**
094: * Add an interface
095: * @param name
096: */
097: public void addInterface(QName name) {
098: interfaces.add(name);
099: }
100:
101: /**
102: * Returns the service name of this endpoint.
103: * @return the qualified service name.
104: */
105: public QName getServiceName() {
106: return serviceName;
107: }
108:
109: /**
110: * Retrieve all remote component namespaces where this endpoint is activated
111: * @return component namespaces
112: */
113: public InternalEndpoint[] getRemoteEndpoints() {
114: InternalEndpoint[] result = new InternalEndpoint[remotes.size()];
115: remotes.values().toArray(result);
116: return result;
117: }
118:
119: public void addRemoteEndpoint(InternalEndpoint remote) {
120: remotes.put(remote.getComponentNameSpace(), remote);
121: }
122:
123: public void removeRemoteEndpoint(InternalEndpoint remote) {
124: remotes.remove(remote.getComponentNameSpace());
125: }
126:
127: /**
128: * Check if this endpoint is locally activated
129: * @return true if the endpoint has been activated locally
130: */
131: public boolean isLocal() {
132: return getComponentNameSpace() != null;
133: }
134:
135: /**
136: * Check if the endpoint is remotely activated
137: * @return true if the endpoint has been remotely activated
138: */
139: public boolean isClustered() {
140: return remotes != null && remotes.size() > 0;
141: }
142:
143: /**
144: * @param obj
145: * @return true if equal
146: */
147: public boolean equals(Object obj) {
148: boolean result = false;
149: if (obj instanceof InternalEndpoint) {
150: InternalEndpoint other = (InternalEndpoint) obj;
151: result = other.serviceName.equals(this .serviceName)
152: && other.endpointName.equals(this .endpointName);
153: }
154: return result;
155: }
156:
157: /**
158: * @return has code
159: */
160: public int hashCode() {
161: return serviceName.hashCode() ^ endpointName.hashCode();
162: }
163:
164: /**
165: * @return a pretty print of this
166: */
167: public String toString() {
168: return "ServiceEndpoint[service=" + serviceName + ",endpoint="
169: + endpointName + "]";
170: }
171:
172: protected String getClassifier() {
173: return "internal";
174: }
175:
176: }
|