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 /**
049 * Constructor
050 * @param componentName
051 * @param endpointName
052 * @param serviceName
053 */
054 public InternalEndpoint(ComponentNameSpace componentName, 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 /**
159 * @return has code
160 */
161 public int hashCode() {
162 return serviceName.hashCode()
163 ^ endpointName.hashCode();
164 }
165
166 /**
167 * @return a pretty print of this
168 */
169 public String toString() {
170 return "ServiceEndpoint[service=" + serviceName + ",endpoint=" + endpointName + "]";
171 }
172
173 protected String getClassifier() {
174 return "internal";
175 }
176
177 }