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    }