X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;f=runtime%2Forg.argeo.slc.support.osgi%2Fsrc%2Fmain%2Fjava%2Forg%2Fargeo%2Fslc%2Fosgi%2FMultipleServiceExporterPostProcessor.java;h=d457c3b4b8a5234c99ac7119c19460492bd962e7;hb=d00482eedbd988497bf33fc202bb2b2b1282f30b;hp=087a90facedebe67670fd9b1c550d82942ce0d97;hpb=ca9363bb07fd21254dd25e3d51017eff0d688332;p=gpl%2Fargeo-slc.git diff --git a/runtime/org.argeo.slc.support.osgi/src/main/java/org/argeo/slc/osgi/MultipleServiceExporterPostProcessor.java b/runtime/org.argeo.slc.support.osgi/src/main/java/org/argeo/slc/osgi/MultipleServiceExporterPostProcessor.java index 087a90fac..d457c3b4b 100644 --- a/runtime/org.argeo.slc.support.osgi/src/main/java/org/argeo/slc/osgi/MultipleServiceExporterPostProcessor.java +++ b/runtime/org.argeo.slc.support.osgi/src/main/java/org/argeo/slc/osgi/MultipleServiceExporterPostProcessor.java @@ -1,3 +1,19 @@ +/* + * Copyright (C) 2010 Mathieu Baudier + * + * Licensed 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.argeo.slc.osgi; import java.util.ArrayList; @@ -16,12 +32,12 @@ import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.beans.factory.support.BeanDefinitionRegistry; import org.springframework.beans.factory.support.RootBeanDefinition; import org.springframework.core.Ordered; -import org.springframework.core.PriorityOrdered; +import org.springframework.osgi.service.exporter.support.ExportContextClassLoader; import org.springframework.osgi.service.exporter.support.OsgiServiceFactoryBean; @SuppressWarnings(value = { "unchecked" }) public class MultipleServiceExporterPostProcessor implements - BeanFactoryPostProcessor, PriorityOrdered { + BeanFactoryPostProcessor, Ordered { private final static Log log = LogFactory .getLog(MultipleServiceExporterPostProcessor.class); @@ -29,6 +45,10 @@ public class MultipleServiceExporterPostProcessor implements private Class osgiServiceFactoryClass = OsgiServiceFactoryBean.class; + private Boolean useServiceProviderContextClassLoader = false; + + private int order = Ordered.LOWEST_PRECEDENCE; + public void postProcessBeanFactory( ConfigurableListableBeanFactory beanFactory) throws BeansException { if (!(beanFactory instanceof BeanDefinitionRegistry)) { @@ -36,6 +56,8 @@ public class MultipleServiceExporterPostProcessor implements + BeanDefinitionRegistry.class); } + long begin = System.currentTimeMillis(); + // Merge all beans implementing these interfaces Set beanNames = new HashSet(); for (Class clss : interfaces) { @@ -48,6 +70,9 @@ public class MultipleServiceExporterPostProcessor implements MutablePropertyValues mpv = new MutablePropertyValues(); mpv.addPropertyValue("interfaces", interfaces.toArray()); mpv.addPropertyValue("targetBeanName", beanName); + if (useServiceProviderContextClassLoader) + mpv.addPropertyValue("contextClassLoader", + ExportContextClassLoader.SERVICE_PROVIDER); RootBeanDefinition bd = new RootBeanDefinition( osgiServiceFactoryClass, mpv); @@ -58,6 +83,12 @@ public class MultipleServiceExporterPostProcessor implements ((BeanDefinitionRegistry) beanFactory).registerBeanDefinition( exporterBeanName, bd); } + + long end = System.currentTimeMillis(); + if (log.isTraceEnabled()) + log.debug("Multiple services exported in " + (end - begin) + + " ms in bundle."); + } public void setInterfaces(List interfaces) { @@ -69,7 +100,16 @@ public class MultipleServiceExporterPostProcessor implements } public int getOrder() { - return Ordered.LOWEST_PRECEDENCE; + return order; + } + + public void setOrder(int order) { + this.order = order; + } + + public void setUseServiceProviderContextClassLoader( + Boolean useServiceProviderContextClassLoader) { + this.useServiceProviderContextClassLoader = useServiceProviderContextClassLoader; } }