Author: nicolas
Date: Sun Feb 24 05:52:54 2008
New Revision: 630623
URL: http://svn.apache.org/viewvc?rev=630623&view=rev
Log:
add support in spring context for Map<role-hint, component> as
@plexus.requirement
Added:
maven/archiva/branches/springy/plexus-spring/src/test/java/org/codehaus/plexus/spring/ComplexPlexusBean.java
(with props)
Modified:
maven/archiva/branches/springy/plexus-spring/ (props changed)
maven/archiva/branches/springy/plexus-spring/src/main/java/org/codehaus/plexus/spring/PlexusComponentFactoryBean.java
maven/archiva/branches/springy/plexus-spring/src/main/java/org/codehaus/plexus/spring/PlexusNamespaceHandler.java
maven/archiva/branches/springy/plexus-spring/src/main/java/org/codehaus/plexus/spring/PlexusToSpringUtils.java
maven/archiva/branches/springy/plexus-spring/src/test/java/org/codehaus/plexus/spring/FieldInjectionTest.java
maven/archiva/branches/springy/plexus-spring/src/test/resources/components.xml
Propchange: maven/archiva/branches/springy/plexus-spring/
------------------------------------------------------------------------------
--- svn:ignore (added)
+++ svn:ignore Sun Feb 24 05:52:54 2008
@@ -0,0 +1,2 @@
+.* target bin *.log
+
Modified:
maven/archiva/branches/springy/plexus-spring/src/main/java/org/codehaus/plexus/spring/PlexusComponentFactoryBean.java
URL:
http://svn.apache.org/viewvc/maven/archiva/branches/springy/plexus-spring/src/main/java/org/codehaus/plexus/spring/PlexusComponentFactoryBean.java?rev=630623&r1=630622&r2=630623&view=diff
==============================================================================
---
maven/archiva/branches/springy/plexus-spring/src/main/java/org/codehaus/plexus/spring/PlexusComponentFactoryBean.java
(original)
+++
maven/archiva/branches/springy/plexus-spring/src/main/java/org/codehaus/plexus/spring/PlexusComponentFactoryBean.java
Sun Feb 24 05:52:54 2008
@@ -20,6 +20,7 @@
*/
import java.lang.reflect.Field;
+import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
@@ -29,8 +30,6 @@
import org.codehaus.plexus.logging.LoggerManager;
import org.codehaus.plexus.personality.plexus.lifecycle.phase.Disposable;
import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable;
-import org.codehaus.plexus.personality.plexus.lifecycle.phase.Startable;
-import
org.codehaus.plexus.personality.plexus.lifecycle.phase.StartingException;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
@@ -40,17 +39,17 @@
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.ListableBeanFactory;
import org.springframework.beans.factory.config.RuntimeBeanReference;
-import org.springframework.context.Lifecycle;
import org.springframework.util.ReflectionUtils;
/**
* A FactoryBean dedicated to building plexus components. This includes :
* <ul>
- * <li>Support for direct field injection or "requirements"</li>
- * <li>Support for LogEnabled, Initializable and Disposable plexus
interfaces</li>
+ * <li>Support for direct field injection or "requirements"</li>
+ * <li>Support for LogEnabled, Initializable and Disposable plexus
interfaces</li>
+ * <li>Support for plexus.requirement to get a Map<role-hint, component> for a
role
* </ul>
- * If not set, the beanFActory will auto-detect the loggerManager to use by
searching for the
- * adequate bean in the spring context.
+ * If not set, the beanFActory will auto-detect the loggerManager to use by
searching for the adequate bean in the
+ * spring context.
*
* @author <a href="mailto:[EMAIL PROTECTED]">Nicolas De Loof</a>
*/
@@ -70,7 +69,7 @@
private LoggerManager loggerManager;
private List instances = new LinkedList();
-
+
public void afterPropertiesSet()
throws Exception
{
@@ -92,7 +91,7 @@
}
}
}
-
+
public void destroy()
throws Exception
{
@@ -103,13 +102,13 @@
Object component = (Object) iterator.next();
if ( component instanceof Disposable )
{
- ((Disposable) component).dispose();
-
+ ( (Disposable) component ).dispose();
+
}
}
- }
+ }
}
-
+
public Object getObject()
throws Exception
{
@@ -128,7 +127,31 @@
Object dependency = requirements.get( field.getName() );
if ( dependency instanceof RuntimeBeanReference )
{
- dependency = beanFactory.getBean(
((RuntimeBeanReference) dependency).getBeanName() );
+ String beanName = ( (RuntimeBeanReference) dependency
).getBeanName();
+ if ( Map.class.isAssignableFrom( field.getType() ) )
+ {
+ // component ask plexus for a Map of all available
components for the role
+ Map map = new HashMap();
+ String mask = beanName + '#';
+ String[] beans =
beanFactory.getBeanDefinitionNames();
+ for ( int i = 0; i < beans.length; i++ )
+ {
+ String name = beans[i];
+ if ( name.startsWith( mask ) )
+ {
+ map.put( name.substring( mask.length() ),
beanFactory.getBean( name ) );
+ }
+ }
+ if ( beanFactory.containsBean( beanName ) )
+ {
+ map.put( "default", beanFactory.getBean(
beanName ) );
+ }
+ dependency = map;
+ }
+ else
+ {
+ dependency = beanFactory.getBean( beanName );
+ }
}
if ( dependency != null )
{
Modified:
maven/archiva/branches/springy/plexus-spring/src/main/java/org/codehaus/plexus/spring/PlexusNamespaceHandler.java
URL:
http://svn.apache.org/viewvc/maven/archiva/branches/springy/plexus-spring/src/main/java/org/codehaus/plexus/spring/PlexusNamespaceHandler.java?rev=630623&r1=630622&r2=630623&view=diff
==============================================================================
---
maven/archiva/branches/springy/plexus-spring/src/main/java/org/codehaus/plexus/spring/PlexusNamespaceHandler.java
(original)
+++
maven/archiva/branches/springy/plexus-spring/src/main/java/org/codehaus/plexus/spring/PlexusNamespaceHandler.java
Sun Feb 24 05:52:54 2008
@@ -19,7 +19,6 @@
* under the License.
*/
-import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
@@ -33,7 +32,6 @@
import
org.springframework.beans.factory.xml.AbstractSingleBeanDefinitionParser;
import org.springframework.beans.factory.xml.NamespaceHandlerSupport;
import org.springframework.beans.factory.xml.ParserContext;
-import org.springframework.util.ClassUtils;
import org.springframework.util.xml.DomUtils;
import org.w3c.dom.Element;
@@ -90,14 +88,6 @@
String role = child.getAttribute( "role" );
String roleHint = child.getAttribute( "role-hint" );
String ref = PlexusToSpringUtils.buildSpringId( role, roleHint
);
- if ( roleHint == null )
- {
-// Field f = ClassUtils.forName( implementation ).getField(
name );
-// if ( Map.class.isAssignableFrom( f.getType() ) )
-// {
-// // TODO add add support for plexus role -->
Map<role-hint, component>
-// }
- }
dependencies.put( name, new RuntimeBeanReference( ref ) );
}
@@ -113,7 +103,7 @@
builder.addPropertyValue( "requirements", dependencies );
}
-
+
protected String resolveId( Element element, AbstractBeanDefinition
definition, ParserContext parserContext )
throws BeanDefinitionStoreException
{
Modified:
maven/archiva/branches/springy/plexus-spring/src/main/java/org/codehaus/plexus/spring/PlexusToSpringUtils.java
URL:
http://svn.apache.org/viewvc/maven/archiva/branches/springy/plexus-spring/src/main/java/org/codehaus/plexus/spring/PlexusToSpringUtils.java?rev=630623&r1=630622&r2=630623&view=diff
==============================================================================
---
maven/archiva/branches/springy/plexus-spring/src/main/java/org/codehaus/plexus/spring/PlexusToSpringUtils.java
(original)
+++
maven/archiva/branches/springy/plexus-spring/src/main/java/org/codehaus/plexus/spring/PlexusToSpringUtils.java
Sun Feb 24 05:52:54 2008
@@ -1,6 +1,5 @@
package org.codehaus.plexus.spring;
-
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
@@ -28,7 +27,7 @@
/**
* Utility method to convert plexus descriptors to spring bean context.
- *
+ *
* @author <a href="mailto:[EMAIL PROTECTED]">Nicolas De Loof</a>
* @since 1.1
*/
@@ -38,7 +37,7 @@
public static String toSpringId( String string )
{
int i = string.lastIndexOf( '.' );
- if (i >= 0 )
+ if ( i >= 0 )
{
return Character.toLowerCase( string.charAt( i + 1 ) ) +
string.substring( i + 2 );
}
@@ -104,5 +103,6 @@
i = 0;
}
String id = Character.toLowerCase( role.charAt( i ) ) +
role.substring( i + 1 );
- return roleHint.length() == 0 ? id : id + '#' + roleHint;
- }}
+ return ( roleHint.length() == 0 || "default".equals( roleHint ) ) ? id
: id + '#' + roleHint;
+ }
+}
Added:
maven/archiva/branches/springy/plexus-spring/src/test/java/org/codehaus/plexus/spring/ComplexPlexusBean.java
URL:
http://svn.apache.org/viewvc/maven/archiva/branches/springy/plexus-spring/src/test/java/org/codehaus/plexus/spring/ComplexPlexusBean.java?rev=630623&view=auto
==============================================================================
---
maven/archiva/branches/springy/plexus-spring/src/test/java/org/codehaus/plexus/spring/ComplexPlexusBean.java
(added)
+++
maven/archiva/branches/springy/plexus-spring/src/test/java/org/codehaus/plexus/spring/ComplexPlexusBean.java
Sun Feb 24 05:52:54 2008
@@ -0,0 +1,43 @@
+package org.codehaus.plexus.spring;
+
+import java.util.Map;
+
+/*
+ * 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.
+ */
+
+/**
+ * A typical plexus component implementation
+ *
+ * @author <a href="mailto:[EMAIL PROTECTED]">Nicolas De Loof</a>
+ */
+public class ComplexPlexusBean
+{
+ /**
+ * @plexus.requirement role="org.codehaus.plexus.spring.PlexusBean"
+ */
+ private Map plexusBeans;
+
+ /**
+ * @see org.codehaus.plexus.spring.PlexusBean#toString()
+ */
+ public String toString()
+ {
+ return plexusBeans.size() + " components for role
org.codehaus.plexus.spring.PlexusBean";
+ }
+}
Propchange:
maven/archiva/branches/springy/plexus-spring/src/test/java/org/codehaus/plexus/spring/ComplexPlexusBean.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Modified:
maven/archiva/branches/springy/plexus-spring/src/test/java/org/codehaus/plexus/spring/FieldInjectionTest.java
URL:
http://svn.apache.org/viewvc/maven/archiva/branches/springy/plexus-spring/src/test/java/org/codehaus/plexus/spring/FieldInjectionTest.java?rev=630623&r1=630622&r2=630623&view=diff
==============================================================================
---
maven/archiva/branches/springy/plexus-spring/src/test/java/org/codehaus/plexus/spring/FieldInjectionTest.java
(original)
+++
maven/archiva/branches/springy/plexus-spring/src/test/java/org/codehaus/plexus/spring/FieldInjectionTest.java
Sun Feb 24 05:52:54 2008
@@ -37,5 +37,13 @@
assertEquals( PlexusBean.DISPOSED, plexusBean.getState() );
}
+
+ public void testIbjectMapForRole()
+ throws Exception
+ {
+ ConfigurableApplicationContext applicationContext = new
PlexusClassPathXmlApplicationContext( new String[] { "components.xml",
"applicationContext.xml" } );
+ ComplexPlexusBean plexusBean = (ComplexPlexusBean)
applicationContext.getBean( "complexPlexusBean" );
+ assertEquals( "2 components for role
org.codehaus.plexus.spring.PlexusBean", plexusBean.toString() );
+ }
}
Modified:
maven/archiva/branches/springy/plexus-spring/src/test/resources/components.xml
URL:
http://svn.apache.org/viewvc/maven/archiva/branches/springy/plexus-spring/src/test/resources/components.xml?rev=630623&r1=630622&r2=630623&view=diff
==============================================================================
---
maven/archiva/branches/springy/plexus-spring/src/test/resources/components.xml
(original)
+++
maven/archiva/branches/springy/plexus-spring/src/test/resources/components.xml
Sun Feb 24 05:52:54 2008
@@ -2,6 +2,7 @@
<components>
<component>
<role>org.codehaus.plexus.spring.PlexusBean</role>
+ <role-hint>default</role-hint>
<implementation>org.codehaus.plexus.spring.PlexusBeanImpl</implementation>
<requirements>
<requirement>
@@ -13,5 +14,29 @@
<message>expected</message>
</configuration>
</component>
+ <component>
+ <role>org.codehaus.plexus.spring.PlexusBean</role>
+ <role-hint>another</role-hint>
+
<implementation>org.codehaus.plexus.spring.PlexusBeanImpl</implementation>
+ <requirements>
+ <requirement>
+ <field-name>bean</field-name>
+ <role>springBean</role>
+ </requirement>
+ </requirements>
+ <configuration>
+ <message>another</message>
+ </configuration>
+ </component>
+ <component>
+ <role>org.codehaus.plexus.spring.ComplexPlexusBean</role>
+
<implementation>org.codehaus.plexus.spring.ComplexPlexusBean</implementation>
+ <requirements>
+ <requirement>
+ <field-name>plexusBeans</field-name>
+ <role>org.codehaus.plexus.spring.PlexusBean</role>
+ </requirement>
+ </requirements>
+ </component>
</components>
</component-set>