Automatically inject ScmProvider implementations
git-svn-id: https://svn.apache.org/repos/asf/continuum/branches/builder@654275 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/continuum-base/continuum-scm/pom.xml b/continuum-base/continuum-scm/pom.xml
index e00d512..e5632c9 100644
--- a/continuum-base/continuum-scm/pom.xml
+++ b/continuum-base/continuum-scm/pom.xml
@@ -26,9 +26,13 @@
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
- <scope>test</scope>
</dependency>
<dependency>
+ <groupId>org.codehaus.plexus</groupId>
+ <artifactId>plexus-spring</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.5.0</version>
diff --git a/continuum-base/continuum-scm/src/main/java/org/apache/continuum/scm/manager/spring/ScmProviderFactoryBean.java b/continuum-base/continuum-scm/src/main/java/org/apache/continuum/scm/manager/spring/ScmProviderFactoryBean.java
new file mode 100644
index 0000000..84f8abc
--- /dev/null
+++ b/continuum-base/continuum-scm/src/main/java/org/apache/continuum/scm/manager/spring/ScmProviderFactoryBean.java
@@ -0,0 +1,66 @@
+package org.apache.continuum.scm.manager.spring;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.maven.scm.provider.ScmProvider;
+import org.springframework.beans.BeansException;
+import org.springframework.beans.factory.BeanFactoryUtils;
+import org.springframework.beans.factory.BeanInitializationException;
+import org.springframework.beans.factory.FactoryBean;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.ApplicationContextAware;
+
+/**
+ * <p>
+ * Factory bean to inject all beans of type {@link ScmProvider}
+ * </p>
+ * <p>
+ * <code><bean id="scmProviders" class="org.apache.continuum.scm.manager.spring.ScmManagerFactoryBean"/>
+ </code>
+ * </p>
+ *
+ * @author Carlos Sanchez <carlos@apache.org>
+ */
+public class ScmProviderFactoryBean
+ implements FactoryBean, ApplicationContextAware
+{
+ private ApplicationContext applicationContext;
+
+ public Object getObject()
+ throws Exception
+ {
+ Map<String, ScmProvider> providers = new HashMap<String, ScmProvider>();
+ Map<String, ScmProvider> beans =
+ BeanFactoryUtils.beansOfTypeIncludingAncestors( applicationContext, ScmProvider.class );
+ for ( ScmProvider provider : beans.values() )
+ {
+ if ( providers.containsKey( provider.getScmType() ) )
+ {
+ throw new BeanInitializationException(
+ "There are to ScmProvider beans in the appllication context for Scm type " +
+ provider.getScmType() +
+ ". Probably two conflicting scm implementations are present in the classpath." );
+ }
+ providers.put( provider.getScmType(), provider );
+ }
+ return providers;
+ }
+
+ public Class getObjectType()
+ {
+ return Map.class;
+ }
+
+ public boolean isSingleton()
+ {
+ return true;
+ }
+
+ public void setApplicationContext( ApplicationContext applicationContext )
+ throws BeansException
+ {
+ this.applicationContext = applicationContext;
+ }
+
+}
diff --git a/continuum-base/continuum-scm/src/test/java/org/apache/continuum/scm/manager/ScmManagerTest.java b/continuum-base/continuum-scm/src/test/java/org/apache/continuum/scm/manager/ScmManagerTest.java
index 3aa79d3..8bef9ca 100644
--- a/continuum-base/continuum-scm/src/test/java/org/apache/continuum/scm/manager/ScmManagerTest.java
+++ b/continuum-base/continuum-scm/src/test/java/org/apache/continuum/scm/manager/ScmManagerTest.java
@@ -19,12 +19,12 @@
* under the License.
*/
-import org.apache.maven.scm.manager.NoSuchScmProviderException;
-import org.springframework.context.ApplicationContext;
-import org.springframework.context.support.ClassPathXmlApplicationContext;
-
import junit.framework.TestCase;
+import org.apache.maven.scm.manager.NoSuchScmProviderException;
+import org.codehaus.plexus.spring.PlexusClassPathXmlApplicationContext;
+import org.springframework.context.ApplicationContext;
+
/**
* @todo replace with a spring integration test
*/
@@ -38,7 +38,8 @@
public void setUp()
{
context =
- new ClassPathXmlApplicationContext( new String[] { "classpath*:META-INF/spring-context.xml",
+ new PlexusClassPathXmlApplicationContext( new String[] { "classpath*:META-INF/spring-context.xml",
+ "classpath*:META-INF/plexus/components.xml",
"classpath*:" + getClass().getName().replace( '.', '/' ) + ".xml" } );
manager = (ScmManager) context.getBean( "scmManager" );
}
@@ -47,6 +48,6 @@
throws NoSuchScmProviderException
{
manager.getScmLogger().info( "Hello, World" );
- assertNotNull( manager.getProviderByType( "svnexe" ) );
+ assertNotNull( manager.getProviderByType( "svn" ) );
}
}
diff --git a/continuum-base/continuum-scm/src/test/resources/org/apache/continuum/scm/manager/ScmManagerTest.xml b/continuum-base/continuum-scm/src/test/resources/org/apache/continuum/scm/manager/ScmManagerTest.xml
index 782680d..0b946d3 100644
--- a/continuum-base/continuum-scm/src/test/resources/org/apache/continuum/scm/manager/ScmManagerTest.xml
+++ b/continuum-base/continuum-scm/src/test/resources/org/apache/continuum/scm/manager/ScmManagerTest.xml
@@ -6,15 +6,9 @@
<bean id="scmManager"
class="org.apache.continuum.scm.manager.ScmManager">
- <!-- TODO: better way to add the providers without having to redeclare all this? -->
<property name="scmLogger" ref="scmLogger" />
<property name="scmProviders">
- <map>
- <entry key="svnexe">
- <bean
- class="org.apache.maven.scm.provider.svn.svnexe.SvnExeScmProvider" />
- </entry>
- </map>
+ <bean class="org.apache.continuum.scm.manager.spring.ScmProviderFactoryBean"/>
</property>
</bean>
</beans>