You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@cocoon.apache.org by pi...@apache.org on 2004/11/01 12:19:57 UTC

svn commit: rev 56226 - cocoon/whiteboard/kernel/src/org/apache/cocoon/kernel/runtime

Author: pier
Date: Mon Nov  1 03:19:56 2004
New Revision: 56226

Modified:
   cocoon/whiteboard/kernel/src/org/apache/cocoon/kernel/runtime/Factory.java
Log:
Adding support for arrays and collections in component setters

Modified: cocoon/whiteboard/kernel/src/org/apache/cocoon/kernel/runtime/Factory.java
==============================================================================
--- cocoon/whiteboard/kernel/src/org/apache/cocoon/kernel/runtime/Factory.java	(original)
+++ cocoon/whiteboard/kernel/src/org/apache/cocoon/kernel/runtime/Factory.java	Mon Nov  1 03:19:56 2004
@@ -13,9 +13,13 @@
 package org.apache.cocoon.kernel.runtime;
 
 import java.beans.PropertyDescriptor;
+import java.lang.reflect.Array;
 import java.lang.reflect.Proxy;
 import java.net.URL;
+import java.util.HashSet;
 import java.util.Iterator;
+import java.util.Set;
+import java.util.StringTokenizer;
 
 import org.apache.cocoon.kernel.Kernel;
 import org.apache.cocoon.kernel.configuration.Configuration;
@@ -112,65 +116,92 @@
     /**
      * <p>Configure the specified component from a {@link Configuration}.</p>
      */
-    public static void configure(Object o, Deployer deployer, Configuration config)
+    public static void configure(Object obj, Deployer depl, Configuration conf)
     throws DeployerException {
-        Iterator iterator = config.children("set");
+        Iterator iterator = conf.children("set");
         while (iterator.hasNext()) {
 
             /* Look up the configurator and figure out the property name */
-            Configuration current = (Configuration) iterator.next();
-            String property = current.getStringAttribute("property", null);
-            if (property == null) {
+            Configuration curr = (Configuration) iterator.next();
+            String prop = curr.getStringAttribute("property", null);
+            if (prop == null) {
                 throw new DeployerException("Property name not specified at "
-                        + current.location());
+                        + curr.location());
             }
 
             /* Using beans, access the property descriptor */
-            PropertyDescriptor descriptor = null;
+            PropertyDescriptor descr = null;
             try {
-                String s = "set" + property.substring(0, 1).toUpperCase()
-                        + property.substring(1);
-                descriptor = new PropertyDescriptor(property, o.getClass(), null, s);
+                String s = "set" + prop.substring(0, 1).toUpperCase()
+                        + prop.substring(1);
+                descr = new PropertyDescriptor(prop, obj.getClass(), null, s);
             } catch (Throwable t) {
-                throw new DeployerException("Unable to retrieve setter method for pro"
-                        + "perty \"" + property + "\" at " + current.location(), t);
+                throw new DeployerException("Unable to retrieve setter method for "
+                        + "property \"" + prop + "\" at " + curr.location(), t);
             }
 
             /* Do we have to set a value? */
-            if (current.hasAttribute("value")) try {
-                Class type = descriptor.getPropertyType();
-                Object value = current.getAttributeAs(property, type);
-                descriptor.getWriteMethod().invoke(o, new Object[] { value });
+            if (curr.hasAttribute("value")) try {
+                Class type = descr.getPropertyType();
+                Object value = curr.getAttributeAs(prop, type);
+                descr.getWriteMethod().invoke(obj, new Object[] { value });
                 continue;
             } catch (Throwable t) {
                 throw new DeployerException("Unable to set value for property \""
-                        + property + "\" specified at " + current.location(), t);
+                        + prop + "\" specified at " + curr.location(), t);
             }
 
             /* Do we have to set a component? */
-            if (current.hasAttribute("component")) try {
-                Object value = deployer.lookup(current.getStringAttribute("component"));
-                descriptor.getWriteMethod().invoke(o, new Object[] { value });
+            if (curr.hasAttribute("component")) try {
+                Object value = depl.lookup(curr.getStringAttribute("component"));
+                descr.getWriteMethod().invoke(obj, new Object[] { value });
                 continue;
             } catch (Throwable t) {
                 throw new DeployerException("Unable to set component for property \""
-                        + property + "\" specified at " + current.location(), t);
+                        + prop + "\" specified at " + curr.location(), t);
+            }
+
+            /* Do we have to set a set of components? */
+            if (curr.hasAttribute("components")) try {
+                Set s = new HashSet();
+                String v = curr.getStringAttribute("components"); 
+                StringTokenizer t = new StringTokenizer(v);
+                while (t.hasMoreTokens()) s.add(depl.lookup(t.nextToken()));
+
+                /* String to array, if needed... This ain't fun */
+                Class type = descr.getPropertyType();
+                if (type.isAssignableFrom(Set.class)) {
+                    descr.getWriteMethod().invoke(obj, new Object[] { s });
+                } else if (type.isArray()) {
+                    type = type.getComponentType();
+                    Object a[] = (Object[]) Array.newInstance(type, s.size());
+                    descr.getWriteMethod().invoke(obj, new Object[] {s.toArray(a)});
+                } else {
+                    throw new ClassCastException("Invalid type " + type);
+                }
+
+                /* No exceptions, continue */
+                continue;
+
+            } catch (Throwable t) {
+                throw new DeployerException("Unable to set component for property \""
+                        + prop + "\" specified at " + curr.location(), t);
             }
 
             /* Do we have to set the kernel itself? */
-            if (current.getBooleanAttribute("kernel", false)) try {
-                Wiring w = new Wiring(deployer);
+            if (curr.getBooleanAttribute("kernel", false)) try {
+                Wiring w = new Wiring(depl);
                 Class i[] = new Class[] { Kernel.class };
-                Object value = Proxy.newProxyInstance(deployer.getRuntime(), i, w);
-                descriptor.getWriteMethod().invoke(o, new Object[] { value });
+                Object value = Proxy.newProxyInstance(depl.getRuntime(), i, w);
+                descr.getWriteMethod().invoke(obj, new Object[] { value });
                 continue;
             } catch (Throwable t) {
                 throw new DeployerException("Unable to set kernel for property \""
-                        + property + "\" specified at " + current.location(), t);
+                        + prop + "\" specified at " + curr.location(), t);
             }
             
             /* We haven't continue(d), something bad happened */
-            throw new DeployerException("Invalid declaration at " + current.location());
+            throw new DeployerException("Invalid declaration at " + curr.location());
         }
     }
 }