001 /**
002 * Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE
003 * file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file
004 * to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the
005 * License. You may obtain a copy of the License at
006 *
007 * http://www.apache.org/licenses/LICENSE-2.0
008 *
009 * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
010 * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
011 * specific language governing permissions and limitations under the License.
012 */
013 package org.apache.camel.component.jbi;
014
015 import org.apache.camel.CamelContext;
016 import org.apache.camel.Component;
017 import org.apache.camel.Endpoint;
018 import org.apache.camel.Processor;
019 import org.apache.camel.Exchange;
020 import org.apache.camel.FailedToCreateProducerException;
021 import org.apache.servicemix.common.DefaultComponent;
022 import org.apache.servicemix.jbi.util.IntrospectionSupport;
023 import org.apache.servicemix.jbi.util.URISupport;
024 import org.apache.servicemix.jbi.resolver.URIResolver;
025
026 import javax.jbi.servicedesc.ServiceEndpoint;
027 import javax.xml.namespace.QName;
028 import java.net.URI;
029 import java.net.URISyntaxException;
030 import java.util.ArrayList;
031 import java.util.List;
032 import java.util.Map;
033 import java.util.concurrent.ScheduledExecutorService;
034 import java.util.concurrent.ScheduledThreadPoolExecutor;
035
036 /**
037 * Deploys the camel endpoints within JBI
038 *
039 * @version $Revision: 426415 $
040 */
041 public class CamelJbiComponent extends DefaultComponent implements Component<Exchange> {
042 private JbiBinding binding;
043 private CamelContext camelContext;
044 private ScheduledExecutorService executorService;
045
046 /**
047 * @return List of endpoints
048 * @see org.apache.servicemix.common.DefaultComponent#getConfiguredEndpoints()
049 */
050 @Override
051 protected List<CamelJbiEndpoint> getConfiguredEndpoints() {
052 // TODO need to register to the context for new endpoints...
053 List<CamelJbiEndpoint> answer = new ArrayList<CamelJbiEndpoint>();
054 // Collection<Endpoint> endpoints = camelContext.getEndpoints();
055 // for (Endpoint endpoint : endpoints) {
056 // answer.add(createJbiEndpoint(endpoint));
057 // }
058 return answer;
059 }
060
061 /**
062 * @return Class[]
063 * @see org.apache.servicemix.common.DefaultComponent#getEndpointClasses()
064 */
065 @Override
066 protected Class[] getEndpointClasses() {
067 return new Class[]{CamelJbiEndpoint.class};
068 }
069
070
071 /**
072 * @return the binding
073 */
074 public JbiBinding getBinding() {
075 if (binding == null) {
076 binding = new JbiBinding();
077 }
078 return binding;
079 }
080
081 /**
082 * @param binding the binding to set
083 */
084 public void setBinding(JbiBinding binding) {
085 this.binding = binding;
086 }
087
088 @Override
089 protected String[] getEPRProtocols() {
090 return new String[]{"camel"};
091 }
092
093 protected org.apache.servicemix.common.Endpoint getResolvedEPR(ServiceEndpoint ep) throws Exception {
094 CamelJbiEndpoint endpoint = createEndpoint(ep);
095 endpoint.activate();
096 return endpoint;
097 }
098
099 public CamelJbiEndpoint createEndpoint(ServiceEndpoint ep) throws URISyntaxException {
100 URI uri = new URI(ep.getEndpointName());
101 Map map = URISupport.parseQuery(uri.getQuery());
102 String camelUri = uri.getSchemeSpecificPart();
103 Endpoint camelEndpoint = getCamelContext().getEndpoint(camelUri);
104 Processor processor = null;
105 try {
106 processor = camelEndpoint.createProducer();
107 }
108 catch (Exception e) {
109 throw new FailedToCreateProducerException(camelEndpoint, e);
110 }
111 CamelJbiEndpoint endpoint = new CamelJbiEndpoint(getServiceUnit(), camelEndpoint, getBinding(), processor);
112
113 IntrospectionSupport.setProperties(endpoint, map);
114
115 // TODO
116 //endpoint.setRole(MessageExchange.Role.PROVIDER);
117
118 return endpoint;
119 }
120
121 // Resolve Camel Endpoints
122 //-------------------------------------------------------------------------
123 public Endpoint<Exchange> createEndpoint(String uri) {
124 if (uri.startsWith("jbi:")) {
125 uri = uri.substring("jbi:".length());
126
127 return new JbiEndpoint(this, uri);
128 }
129 return null;
130 }
131
132 public CamelContext getCamelContext() {
133 return camelContext;
134 }
135
136 public void setCamelContext(CamelContext camelContext) {
137 this.camelContext = camelContext;
138 }
139
140 public ScheduledExecutorService getExecutorService() {
141 if (executorService == null) {
142 executorService = new ScheduledThreadPoolExecutor(5);
143 }
144 return executorService;
145 }
146
147 /**
148 * Returns a JBI endpoint created for the given Camel endpoint
149 */
150 public CamelJbiEndpoint activateJbiEndpoint(JbiEndpoint camelEndpoint, Processor processor) throws Exception {
151 CamelJbiEndpoint jbiEndpoint;
152 String endpointUri = camelEndpoint.getEndpointUri();
153 if (endpointUri.startsWith("endpoint:")) {
154 // lets decode "service:serviceNamespace:serviceName:endpointName
155 String uri = endpointUri.substring("endpoint:".length());
156 String[] parts = new String[0];
157 try {
158 parts = URIResolver.split3(uri);
159 }
160 catch (IllegalArgumentException e) {
161 throw new IllegalArgumentException("Expected syntax endpoint:[serviceNamespace]:[serviceName]:[endpointName] but was given: " + endpointUri + ". Cause: " + e, e);
162 }
163 QName service = new QName(parts[0], parts[1]);
164 String endpoint = parts[2];
165 jbiEndpoint = new CamelJbiEndpoint(getServiceUnit(), service, endpoint, camelEndpoint, getBinding(), processor);
166 }
167 else {
168 jbiEndpoint = new CamelJbiEndpoint(getServiceUnit(), camelEndpoint, getBinding(), processor);
169 }
170
171 // the following method will activate the new dynamic JBI endpoint
172 addEndpoint(jbiEndpoint);
173 return jbiEndpoint;
174 }
175 }