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>


Reply via email to