PageRenderTime 23ms CodeModel.GetById 19ms RepoModel.GetById 0ms app.codeStats 1ms

/components/camel-cdi/src/main/java/org/apache/camel/cdi/CdiCamelFactory.java

https://gitlab.com/matticala/apache-camel
Java | 227 lines | 180 code | 21 blank | 26 comment | 7 complexity | e7bf6dfed4462fcb495f391c0f64e705 MD5 | raw file
  1. /**
  2. * Licensed to the Apache Software Foundation (ASF) under one or more
  3. * contributor license agreements. See the NOTICE file distributed with
  4. * this work for additional information regarding copyright ownership.
  5. * The ASF licenses this file to You under the Apache License, Version 2.0
  6. * (the "License"); you may not use this file except in compliance with
  7. * the License. You may obtain a copy of the License at
  8. *
  9. * http://www.apache.org/licenses/LICENSE-2.0
  10. *
  11. * Unless required by applicable law or agreed to in writing, software
  12. * distributed under the License is distributed on an "AS IS" BASIS,
  13. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  14. * See the License for the specific language governing permissions and
  15. * limitations under the License.
  16. */
  17. package org.apache.camel.cdi;
  18. import java.lang.annotation.Annotation;
  19. import java.lang.reflect.ParameterizedType;
  20. import java.lang.reflect.Type;
  21. import java.util.Collection;
  22. import java.util.HashSet;
  23. import java.util.Optional;
  24. import javax.enterprise.event.Event;
  25. import javax.enterprise.inject.Any;
  26. import javax.enterprise.inject.Default;
  27. import javax.enterprise.inject.InjectionException;
  28. import javax.enterprise.inject.Instance;
  29. import javax.enterprise.inject.Produces;
  30. import javax.enterprise.inject.Typed;
  31. import javax.enterprise.inject.UnsatisfiedResolutionException;
  32. import javax.enterprise.inject.spi.InjectionPoint;
  33. import org.apache.camel.CamelContext;
  34. import org.apache.camel.ConsumerTemplate;
  35. import org.apache.camel.Endpoint;
  36. import org.apache.camel.FluentProducerTemplate;
  37. import org.apache.camel.ProducerTemplate;
  38. import org.apache.camel.TypeConverter;
  39. import org.apache.camel.component.mock.MockEndpoint;
  40. import static org.apache.camel.cdi.CdiEventEndpoint.eventEndpointUri;
  41. import static org.apache.camel.cdi.CdiSpiHelper.isAnnotationType;
  42. import static org.apache.camel.cdi.DefaultLiteral.DEFAULT;
  43. final class CdiCamelFactory {
  44. @Produces
  45. private static TypeConverter typeConverter(InjectionPoint ip, @Any Instance<CamelContext> instance, CdiCamelExtension extension) {
  46. return selectContext(ip, instance, extension).getTypeConverter();
  47. }
  48. @Produces
  49. // Qualifiers are dynamically added in CdiCamelExtension
  50. private static ConsumerTemplate consumerTemplate(InjectionPoint ip, @Any Instance<CamelContext> instance, CdiCamelExtension extension) {
  51. return selectContext(ip, instance, extension).createConsumerTemplate();
  52. }
  53. @Produces
  54. @Default @Uri("")
  55. // Qualifiers are dynamically added in CdiCamelExtension
  56. private static ProducerTemplate producerTemplate(InjectionPoint ip, @Any Instance<CamelContext> instance, CdiCamelExtension extension) {
  57. return getQualifierByType(ip, Uri.class)
  58. .map(uri -> producerTemplateFromUri(ip, instance, extension, uri))
  59. .orElseGet(() -> defaultProducerTemplate(ip, instance, extension));
  60. }
  61. private static ProducerTemplate producerTemplateFromUri(InjectionPoint ip, @Any Instance<CamelContext> instance, CdiCamelExtension extension, Uri uri) {
  62. try {
  63. CamelContext context = uri.context().isEmpty()
  64. ? selectContext(ip, instance, extension)
  65. : selectContext(uri.context(), instance);
  66. ProducerTemplate producerTemplate = context.createProducerTemplate();
  67. Endpoint endpoint = context.getEndpoint(uri.value(), Endpoint.class);
  68. producerTemplate.setDefaultEndpoint(endpoint);
  69. return producerTemplate;
  70. } catch (Exception cause) {
  71. throw new InjectionException("Error injecting producer template annotated with " + uri + " into " + ip, cause);
  72. }
  73. }
  74. private static ProducerTemplate defaultProducerTemplate(InjectionPoint ip, @Any Instance<CamelContext> instance, CdiCamelExtension extension) {
  75. try {
  76. CamelContext context = selectContext(ip, instance, extension);
  77. return context.createProducerTemplate();
  78. } catch (Exception cause) {
  79. throw new InjectionException("Error injecting producer template into " + ip, cause);
  80. }
  81. }
  82. @Produces
  83. @Default @Uri("")
  84. // Qualifiers are dynamically added in CdiCamelExtension
  85. private static FluentProducerTemplate fluentProducerTemplate(InjectionPoint ip, @Any Instance<CamelContext> instance, CdiCamelExtension extension) {
  86. return getQualifierByType(ip, Uri.class)
  87. .map(uri -> fluentProducerTemplateFromUri(ip, instance, extension, uri))
  88. .orElseGet(() -> defaultFluentProducerTemplate(ip, instance, extension));
  89. }
  90. private static FluentProducerTemplate fluentProducerTemplateFromUri(InjectionPoint ip, @Any Instance<CamelContext> instance, CdiCamelExtension extension, Uri uri) {
  91. try {
  92. CamelContext context = uri.context().isEmpty()
  93. ? selectContext(ip, instance, extension)
  94. : selectContext(uri.context(), instance);
  95. FluentProducerTemplate producerTemplate = context.createFluentProducerTemplate();
  96. Endpoint endpoint = context.getEndpoint(uri.value(), Endpoint.class);
  97. producerTemplate.setDefaultEndpoint(endpoint);
  98. return producerTemplate;
  99. } catch (Exception cause) {
  100. throw new InjectionException("Error injecting fluent producer template annotated with " + uri + " into " + ip, cause);
  101. }
  102. }
  103. private static FluentProducerTemplate defaultFluentProducerTemplate(InjectionPoint ip, @Any Instance<CamelContext> instance, CdiCamelExtension extension) {
  104. try {
  105. CamelContext context = selectContext(ip, instance, extension);
  106. return context.createFluentProducerTemplate();
  107. } catch (Exception cause) {
  108. throw new InjectionException("Error injecting fluent producer template into " + ip, cause);
  109. }
  110. }
  111. @Produces
  112. @Typed(MockEndpoint.class)
  113. // Qualifiers are dynamically added in CdiCamelExtension
  114. private static MockEndpoint mockEndpointFromMember(InjectionPoint ip, @Any Instance<CamelContext> instance, CdiCamelExtension extension) {
  115. String uri = "mock:" + ip.getMember().getName();
  116. try {
  117. return selectContext(ip, instance, extension).getEndpoint(uri, MockEndpoint.class);
  118. } catch (Exception cause) {
  119. throw new InjectionException("Error injecting mock endpoint into " + ip, cause);
  120. }
  121. }
  122. @Uri("")
  123. @Produces
  124. @Typed(MockEndpoint.class)
  125. // Qualifiers are dynamically added in CdiCamelExtension
  126. private static MockEndpoint mockEndpointFromUri(InjectionPoint ip, @Any Instance<CamelContext> instance, CdiCamelExtension extension) {
  127. Uri uri = getQualifierByType(ip, Uri.class).get();
  128. try {
  129. CamelContext context = uri.context().isEmpty()
  130. ? selectContext(ip, instance, extension)
  131. : selectContext(uri.context(), instance);
  132. return context.getEndpoint(uri.value(), MockEndpoint.class);
  133. } catch (Exception cause) {
  134. throw new InjectionException("Error injecting mock endpoint annotated with " + uri
  135. + " into " + ip, cause);
  136. }
  137. }
  138. // Maintained for backward compatibility reason though this is redundant with @Uri
  139. // see https://issues.apache.org/jira/browse/CAMEL-5553?focusedCommentId=13445936&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-13445936
  140. @Mock
  141. @Produces
  142. @Typed(MockEndpoint.class)
  143. // Qualifiers are dynamically added in CdiCamelExtension
  144. private static MockEndpoint createMockEndpoint(InjectionPoint ip, @Any Instance<CamelContext> instance, CdiCamelExtension extension) {
  145. Mock mock = getQualifierByType(ip, Mock.class).get();
  146. try {
  147. CamelContext context = mock.context().isEmpty()
  148. ? selectContext(ip, instance, extension)
  149. : selectContext(mock.context(), instance);
  150. return context.getEndpoint(mock.value(), MockEndpoint.class);
  151. } catch (Exception cause) {
  152. throw new InjectionException("Error injecting mock endpoint annotated with " + mock + " into " + ip, cause);
  153. }
  154. }
  155. @Uri("")
  156. @Produces
  157. // Qualifiers are dynamically added in CdiCamelExtension
  158. private static Endpoint endpoint(InjectionPoint ip, @Any Instance<CamelContext> instance, CdiCamelExtension extension) {
  159. Uri uri = getQualifierByType(ip, Uri.class).get();
  160. try {
  161. CamelContext context = uri.context().isEmpty()
  162. ? selectContext(ip, instance, extension)
  163. : selectContext(uri.context(), instance);
  164. return context.getEndpoint(uri.value(), Endpoint.class);
  165. } catch (Exception cause) {
  166. throw new InjectionException("Error injecting endpoint annotated with " + uri + " into " + ip, cause);
  167. }
  168. }
  169. @Produces
  170. @SuppressWarnings("unchecked")
  171. // Qualifiers are dynamically added in CdiCamelExtension
  172. private static <T> CdiEventEndpoint<T> cdiEventEndpoint(InjectionPoint ip, @Any Instance<CamelContext> instance, CdiCamelExtension extension, @Any Event<Object> event) throws Exception {
  173. CamelContext context = selectContext(ip, instance, extension);
  174. Type type = Object.class;
  175. if (ip.getType() instanceof ParameterizedType) {
  176. type = ((ParameterizedType) ip.getType()).getActualTypeArguments()[0];
  177. }
  178. String uri = eventEndpointUri(type, ip.getQualifiers());
  179. if (context.hasEndpoint(uri) == null) {
  180. context.addEndpoint(uri, extension.getEventEndpoint(uri));
  181. }
  182. return context.getEndpoint(uri, CdiEventEndpoint.class);
  183. }
  184. private static <T extends CamelContext> T selectContext(String name, Instance<T> instance) {
  185. for (T context : instance) {
  186. if (name.equals(context.getName())) {
  187. return context;
  188. }
  189. }
  190. throw new UnsatisfiedResolutionException("No Camel context with name [" + name + "] is deployed!");
  191. }
  192. private static <T extends CamelContext> T selectContext(InjectionPoint ip, Instance<T> instance, CdiCamelExtension extension) {
  193. Collection<Annotation> qualifiers = new HashSet<>(ip.getQualifiers());
  194. qualifiers.retainAll(extension.getContextQualifiers());
  195. if (qualifiers.isEmpty() && !instance.select(DEFAULT).isUnsatisfied()) {
  196. return instance.select(DEFAULT).get();
  197. }
  198. return instance.select(qualifiers.toArray(new Annotation[0])).get();
  199. }
  200. private static <T extends Annotation> Optional<T> getQualifierByType(InjectionPoint ip, Class<T> type) {
  201. return ip.getQualifiers().stream()
  202. .filter(isAnnotationType(type))
  203. .findAny()
  204. .map(type::cast);
  205. }
  206. }