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.common.endpoints;
018:
019: import javax.jbi.component.ComponentContext;
020: import javax.jbi.management.DeploymentException;
021: import javax.jbi.messaging.MessageExchange;
022: import javax.jbi.messaging.MessageExchange.Role;
023: import javax.jbi.servicedesc.ServiceEndpoint;
024: import javax.xml.namespace.QName;
025:
026: import org.apache.servicemix.common.DefaultComponent;
027: import org.apache.servicemix.common.ExternalEndpoint;
028: import org.apache.servicemix.common.ServiceMixComponent;
029: import org.apache.servicemix.common.ServiceUnit;
030: import org.apache.servicemix.jbi.resolver.URIResolver;
031:
032: public abstract class ConsumerEndpoint extends SimpleEndpoint {
033:
034: private ServiceEndpoint activated;
035: private QName targetInterface;
036: private QName targetService;
037: private String targetEndpoint;
038: private QName targetOperation;
039: private String targetUri;
040:
041: public ConsumerEndpoint() {
042: }
043:
044: public ConsumerEndpoint(ServiceUnit serviceUnit, QName service,
045: String endpoint) {
046: super (serviceUnit, service, endpoint);
047: }
048:
049: public ConsumerEndpoint(DefaultComponent component,
050: ServiceEndpoint endpoint) {
051: super (component.getServiceUnit(), endpoint.getServiceName(),
052: endpoint.getEndpointName());
053: }
054:
055: public Role getRole() {
056: return Role.CONSUMER;
057: }
058:
059: public synchronized void start() throws Exception {
060: ServiceMixComponent component = getServiceUnit().getComponent();
061: ComponentContext ctx = component.getComponentContext();
062: activated = new ExternalEndpoint(component.getEPRElementName(),
063: getLocationURI(), getService(), getEndpoint(),
064: getInterfaceName());
065: ctx.registerExternalEndpoint(activated);
066: }
067:
068: public synchronized void stop() throws Exception {
069: ServiceMixComponent component = getServiceUnit().getComponent();
070: ComponentContext ctx = component.getComponentContext();
071: if (activated != null) {
072: ServiceEndpoint se = activated;
073: activated = null;
074: ctx.deregisterExternalEndpoint(se);
075: }
076: }
077:
078: public abstract String getLocationURI();
079:
080: /**
081: * @return the targetEndpoint
082: */
083: public String getTargetEndpoint() {
084: return targetEndpoint;
085: }
086:
087: /**
088: * @param targetEndpoint the targetEndpoint to set
089: */
090: public void setTargetEndpoint(String targetEndpoint) {
091: this .targetEndpoint = targetEndpoint;
092: }
093:
094: /**
095: * @return the targetInterface
096: */
097: public QName getTargetInterface() {
098: return targetInterface;
099: }
100:
101: /**
102: * @param targetInterface the targetInterface to set
103: */
104: public void setTargetInterface(QName targetInterface) {
105: this .targetInterface = targetInterface;
106: }
107:
108: /**
109: * @return the targetService
110: */
111: public QName getTargetService() {
112: return targetService;
113: }
114:
115: /**
116: * @param targetService the targetService to set
117: */
118: public void setTargetService(QName targetService) {
119: this .targetService = targetService;
120: }
121:
122: /**
123: * @return the targetOperation
124: */
125: public QName getTargetOperation() {
126: return targetOperation;
127: }
128:
129: /**
130: * @param targetOperation the targetOperation to set
131: */
132: public void setTargetOperation(QName targetOperation) {
133: this .targetOperation = targetOperation;
134: }
135:
136: /**
137: * @return the targetUri
138: */
139: public String getTargetUri() {
140: return targetUri;
141: }
142:
143: /**
144: * @param targetUri the targetUri to set
145: */
146: public void setTargetUri(String targetUri) {
147: this .targetUri = targetUri;
148: }
149:
150: protected void configureExchangeTarget(MessageExchange exchange) {
151: if (targetUri != null) {
152: URIResolver.configureExchange(exchange, getContext(),
153: targetUri);
154: }
155: if (exchange.getInterfaceName() == null
156: && targetInterface != null) {
157: exchange.setInterfaceName(targetInterface);
158: }
159: if (exchange.getOperation() == null && targetOperation != null) {
160: exchange.setOperation(targetOperation);
161: }
162: if (exchange.getService() == null && targetService != null) {
163: exchange.setService(targetService);
164: if (targetEndpoint != null) {
165: ServiceEndpoint se = getContext().getEndpoint(
166: targetService, targetEndpoint);
167: if (se != null) {
168: exchange.setEndpoint(se);
169: } else {
170: logger
171: .warn("Target service ("
172: + targetService
173: + ") and endpoint ("
174: + targetEndpoint
175: + ")"
176: + " specified, but no matching endpoint found. Only the service will be used for routing.");
177: }
178: }
179: }
180: }
181:
182: public void validate() throws DeploymentException {
183: super .validate();
184: if (targetInterface == null && targetService == null
185: && targetUri == null) {
186: throw new DeploymentException(
187: "targetInterface, targetService or targetUri should be specified");
188: }
189: }
190: }
|