You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2019/04/25 10:33:21 UTC
[camel] 16/17: CAMEL-13449: camel3 - Move bean component out of
camel-core
This is an automated email from the ASF dual-hosted git repository.
davsclaus pushed a commit to branch bean
in repository https://gitbox.apache.org/repos/asf/camel.git
commit 9ce71a5c67f3d5ca5bd7822f9bb007563e54187b
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Thu Apr 25 12:08:04 2019 +0200
CAMEL-13449: camel3 - Move bean component out of camel-core
---
.../bean/DefaultBeanProcessorFactory.java | 35 +++++++++++
.../org/apache/camel/bean-processor-factory | 18 ++++++
.../main/java/org/apache/camel/CamelContext.java | 6 ++
.../org/apache/camel/spi/BeanProcessorFactory.java | 42 +++++++++++++
.../apache/camel/impl/AbstractCamelContext.java | 16 +++++
.../camel/impl/BeanProcessorFactoryResolver.java | 71 ++++++++++++++++++++++
.../org/apache/camel/impl/DefaultCamelContext.java | 5 ++
.../camel/impl/SubscribeMethodProcessor.java | 9 +--
8 files changed, 195 insertions(+), 7 deletions(-)
diff --git a/components/camel-bean/src/main/java/org/apache/camel/component/bean/DefaultBeanProcessorFactory.java b/components/camel-bean/src/main/java/org/apache/camel/component/bean/DefaultBeanProcessorFactory.java
new file mode 100644
index 0000000..9c7b184
--- /dev/null
+++ b/components/camel-bean/src/main/java/org/apache/camel/component/bean/DefaultBeanProcessorFactory.java
@@ -0,0 +1,35 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.bean;
+
+import java.lang.reflect.Method;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.Processor;
+import org.apache.camel.spi.BeanProcessorFactory;
+
+public final class DefaultBeanProcessorFactory implements BeanProcessorFactory {
+
+ public DefaultBeanProcessorFactory() {
+ }
+
+ @Override
+ public Processor createBeanProcessor(CamelContext camelContext, Object pojo, Method method) throws Exception {
+ BeanInfo info = new BeanInfo(camelContext, method);
+ return new BeanProcessor(pojo, info);
+ }
+}
diff --git a/components/camel-bean/src/main/resources/META-INF/services/org/apache/camel/bean-processor-factory b/components/camel-bean/src/main/resources/META-INF/services/org/apache/camel/bean-processor-factory
new file mode 100644
index 0000000..289a548
--- /dev/null
+++ b/components/camel-bean/src/main/resources/META-INF/services/org/apache/camel/bean-processor-factory
@@ -0,0 +1,18 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+class=org.apache.camel.component.bean.DefaultBeanProcessorFactory
diff --git a/core/camel-api/src/main/java/org/apache/camel/CamelContext.java b/core/camel-api/src/main/java/org/apache/camel/CamelContext.java
index 80aaa76..355ff69 100644
--- a/core/camel-api/src/main/java/org/apache/camel/CamelContext.java
+++ b/core/camel-api/src/main/java/org/apache/camel/CamelContext.java
@@ -25,6 +25,7 @@ import java.util.concurrent.ScheduledExecutorService;
import org.apache.camel.spi.AnnotationBasedProcessorFactory;
import org.apache.camel.spi.AsyncProcessorAwaitManager;
+import org.apache.camel.spi.BeanProcessorFactory;
import org.apache.camel.spi.BeanProxyFactory;
import org.apache.camel.spi.CamelBeanPostProcessor;
import org.apache.camel.spi.CamelContextNameStrategy;
@@ -1491,4 +1492,9 @@ public interface CamelContext extends SuspendableService, RuntimeConfiguration {
*/
BeanProxyFactory getBeanProxyFactory();
+ /**
+ * Gets the {@link BeanProcessorFactory} to use.
+ */
+ BeanProcessorFactory getBeanProcessorFactory();
+
}
diff --git a/core/camel-api/src/main/java/org/apache/camel/spi/BeanProcessorFactory.java b/core/camel-api/src/main/java/org/apache/camel/spi/BeanProcessorFactory.java
new file mode 100644
index 0000000..08efe7d
--- /dev/null
+++ b/core/camel-api/src/main/java/org/apache/camel/spi/BeanProcessorFactory.java
@@ -0,0 +1,42 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.spi;
+
+import java.lang.reflect.Method;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.Processor;
+
+/**
+ * Factory for creating a {@link Processor} that can invoke a method on a bean and supporting using Camel
+ * bean parameter bindings.
+ * <p/>
+ * This requires to have camel-bean on the classpath.
+ */
+public interface BeanProcessorFactory {
+
+ /**
+ * Creates the bean processor
+ *
+ * @param camelContext the camel context
+ * @param pojo the bean
+ * @param method the method to invoke
+ * @return the created processor
+ * @throws Exception is thrown if error creating the processor
+ */
+ Processor createBeanProcessor(CamelContext camelContext, Object pojo, Method method) throws Exception;
+}
diff --git a/core/camel-core/src/main/java/org/apache/camel/impl/AbstractCamelContext.java b/core/camel-core/src/main/java/org/apache/camel/impl/AbstractCamelContext.java
index 748554d..4b8eaa0 100644
--- a/core/camel-core/src/main/java/org/apache/camel/impl/AbstractCamelContext.java
+++ b/core/camel-core/src/main/java/org/apache/camel/impl/AbstractCamelContext.java
@@ -105,6 +105,7 @@ import org.apache.camel.reifier.RouteReifier;
import org.apache.camel.runtimecatalog.RuntimeCamelCatalog;
import org.apache.camel.spi.AnnotationBasedProcessorFactory;
import org.apache.camel.spi.AsyncProcessorAwaitManager;
+import org.apache.camel.spi.BeanProcessorFactory;
import org.apache.camel.spi.BeanProxyFactory;
import org.apache.camel.spi.CamelBeanPostProcessor;
import org.apache.camel.spi.CamelContextNameStrategy;
@@ -256,6 +257,7 @@ public abstract class AbstractCamelContext extends ServiceSupport implements Mod
private volatile RestRegistry restRegistry;
private volatile HeadersMapFactory headersMapFactory;
private volatile BeanProxyFactory beanProxyFactory;
+ private volatile BeanProcessorFactory beanProcessorFactory;
private volatile ClassResolver classResolver;
private volatile PackageScanClassResolver packageScanClassResolver;
private volatile ServicePool<Producer> producerServicePool;
@@ -3956,6 +3958,18 @@ public abstract class AbstractCamelContext extends ServiceSupport implements Mod
return beanProxyFactory;
}
+ @Override
+ public BeanProcessorFactory getBeanProcessorFactory() {
+ if (beanProcessorFactory == null) {
+ synchronized (lock) {
+ if (beanProcessorFactory == null) {
+ beanProcessorFactory = createBeanProcessorFactory();
+ }
+ }
+ }
+ return beanProcessorFactory;
+ }
+
protected Map<String, RouteService> getRouteServices() {
return routeServices;
}
@@ -4059,6 +4073,8 @@ public abstract class AbstractCamelContext extends ServiceSupport implements Mod
protected abstract BeanProxyFactory createBeanProxyFactory();
+ protected abstract BeanProcessorFactory createBeanProcessorFactory();
+
protected abstract LanguageResolver createLanguageResolver();
protected abstract RestRegistry createRestRegistry();
diff --git a/core/camel-core/src/main/java/org/apache/camel/impl/BeanProcessorFactoryResolver.java b/core/camel-core/src/main/java/org/apache/camel/impl/BeanProcessorFactoryResolver.java
new file mode 100644
index 0000000..94a9d41
--- /dev/null
+++ b/core/camel-core/src/main/java/org/apache/camel/impl/BeanProcessorFactoryResolver.java
@@ -0,0 +1,71 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.impl;
+
+import java.io.IOException;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.spi.BeanProcessorFactory;
+import org.apache.camel.spi.FactoryFinder;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Factory resolver to find the {@link org.apache.camel.spi.BeanProcessorFactory} from the classpath in camel-bean.
+ */
+public class BeanProcessorFactoryResolver {
+
+ public static final String RESOURCE_PATH = "META-INF/services/org/apache/camel/";
+
+ private static final Logger LOG = LoggerFactory.getLogger(BeanProcessorFactoryResolver.class);
+
+ private FactoryFinder factoryFinder;
+
+ public BeanProcessorFactory resolve(CamelContext context) {
+ // use factory finder to find a custom implementations
+ Class<?> type = null;
+ try {
+ type = findFactory("bean-processor-factory", context);
+ } catch (Exception e) {
+ // ignore
+ }
+
+ if (type != null) {
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("Found BeanProxyFactory: {} via: {}{}", type.getName(), factoryFinder.getResourcePath(), "bean-processor-factory");
+ }
+ if (BeanProcessorFactory.class.isAssignableFrom(type)) {
+ BeanProcessorFactory answer = (BeanProcessorFactory) context.getInjector().newInstance(type);
+ LOG.info("Detected and using custom BeanProcessorFactory: {}", answer);
+ return answer;
+ } else {
+ throw new IllegalArgumentException("Type is not a BeanProcessorFactory implementation. Found: " + type.getName());
+ }
+ }
+
+ LOG.debug("Cannot find BeanProcessorFactory. Make sure camel-bean is on the classpath.");
+ return null;
+ }
+
+ private Class<?> findFactory(String name, CamelContext context) throws ClassNotFoundException, IOException {
+ if (factoryFinder == null) {
+ factoryFinder = context.getFactoryFinder(RESOURCE_PATH);
+ }
+ return factoryFinder.findClass(name);
+ }
+
+}
diff --git a/core/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java b/core/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java
index f635af3..7909feb 100644
--- a/core/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java
+++ b/core/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java
@@ -36,6 +36,7 @@ import org.apache.camel.model.validator.ValidatorDefinition;
import org.apache.camel.runtimecatalog.RuntimeCamelCatalog;
import org.apache.camel.runtimecatalog.impl.DefaultRuntimeCamelCatalog;
import org.apache.camel.spi.AsyncProcessorAwaitManager;
+import org.apache.camel.spi.BeanProcessorFactory;
import org.apache.camel.spi.BeanProxyFactory;
import org.apache.camel.spi.BeanRepository;
import org.apache.camel.spi.CamelBeanPostProcessor;
@@ -281,6 +282,10 @@ public class DefaultCamelContext extends AbstractCamelContext {
return new BeanProxyFactoryResolver().resolve(this);
}
+ protected BeanProcessorFactory createBeanProcessorFactory() {
+ return new BeanProcessorFactoryResolver().resolve(this);
+ }
+
protected LanguageResolver createLanguageResolver() {
return new DefaultLanguageResolver();
}
diff --git a/core/camel-core/src/main/java/org/apache/camel/impl/SubscribeMethodProcessor.java b/core/camel-core/src/main/java/org/apache/camel/impl/SubscribeMethodProcessor.java
index a9cf35e..51e13c7 100644
--- a/core/camel-core/src/main/java/org/apache/camel/impl/SubscribeMethodProcessor.java
+++ b/core/camel-core/src/main/java/org/apache/camel/impl/SubscribeMethodProcessor.java
@@ -30,8 +30,6 @@ import org.apache.camel.Navigate;
import org.apache.camel.Predicate;
import org.apache.camel.Processor;
import org.apache.camel.builder.PredicateBuilder;
-import org.apache.camel.component.bean.BeanInfo;
-import org.apache.camel.component.bean.BeanProcessor;
import org.apache.camel.processor.CamelInternalProcessor;
import org.apache.camel.support.AsyncProcessorSupport;
import org.apache.camel.support.service.ServiceHelper;
@@ -43,8 +41,6 @@ import org.apache.camel.util.ObjectHelper;
*/
public final class SubscribeMethodProcessor extends AsyncProcessorSupport implements Navigate<Processor> {
- // TODO: requires camel-bean
-
private final Endpoint endpoint;
private final Map<AsyncProcessor, Predicate> methods = new LinkedHashMap<>();
@@ -56,9 +52,8 @@ public final class SubscribeMethodProcessor extends AsyncProcessorSupport implem
return endpoint;
}
- protected void addMethod(final Object pojo, final Method method, final Endpoint endpoint, String predicate) {
- BeanInfo info = new BeanInfo(endpoint.getCamelContext(), method);
- BeanProcessor answer = new BeanProcessor(pojo, info);
+ protected void addMethod(final Object pojo, final Method method, final Endpoint endpoint, String predicate) throws Exception {
+ Processor answer = endpoint.getCamelContext().getBeanProcessorFactory().createBeanProcessor(endpoint.getCamelContext(), pojo, method);
// must ensure the consumer is being executed in an unit of work so synchronization callbacks etc is invoked
CamelInternalProcessor internal = new CamelInternalProcessor(answer);
internal.addAdvice(new CamelInternalProcessor.UnitOfWorkProcessorAdvice(null));