Update of /var/cvs/src/org/mmbase/framework
In directory james.mmbase.org:/tmp/cvs-serv31754

Modified Files:
        BasicComponent.java Block.java 
Log Message:
ensuring that 'PatternParameters' are always the last in the definition. Went 
wrong if you had a processor with parameters.   MMB-1769


See also: http://cvs.mmbase.org/viewcvs/src/org/mmbase/framework
See also: http://www.mmbase.org/jira/browse/MMB-1769


Index: BasicComponent.java
===================================================================
RCS file: /var/cvs/src/org/mmbase/framework/BasicComponent.java,v
retrieving revision 1.51
retrieving revision 1.52
diff -u -b -r1.51 -r1.52
--- BasicComponent.java 15 Oct 2008 13:03:53 -0000      1.51
+++ BasicComponent.java 5 Jan 2009 17:51:39 -0000       1.52
@@ -24,7 +24,7 @@
  * components, and may be requested several blocks.
  *
  * @author Michiel Meeuwissen
- * @version $Id: BasicComponent.java,v 1.51 2008/10/15 13:03:53 michiel Exp $
+ * @version $Id: BasicComponent.java,v 1.52 2009/01/05 17:51:39 michiel Exp $
  * @since MMBase-1.9
  */
 public class BasicComponent implements Component {
@@ -156,9 +156,9 @@
                 b.getDescription().fillFromXml("description", element);
                 b.getTitle().fillFromXml("title", element);
                 log.trace("Found block: " + blockName);
-                b.getRenderers().put(Renderer.Type.HEAD, getRenderer("head", 
element, b));
-                b.getRenderers().put(Renderer.Type.BODY, getRenderer("body", 
element, b));
-                b.processor = getProcessor("process", element, b);
+                b.putRenderer(Renderer.Type.HEAD, getRenderer("head", element, 
b));
+                b.putRenderer(Renderer.Type.BODY, getRenderer("body", element, 
b));
+                b.setProcessor(getProcessor("process", element, b));
                 if (defaultBlock == null) defaultBlock = b;
                 blocks.put(blockName, b);
             }


Index: Block.java
===================================================================
RCS file: /var/cvs/src/org/mmbase/framework/Block.java,v
retrieving revision 1.41
retrieving revision 1.42
diff -u -b -r1.41 -r1.42
--- Block.java  7 Aug 2008 14:51:06 -0000       1.41
+++ Block.java  5 Jan 2009 17:51:39 -0000       1.42
@@ -37,7 +37,7 @@
  *
  * @author Johannes Verelst
  * @author Michiel Meeuwissen
- * @version $Id: Block.java,v 1.41 2008/08/07 14:51:06 michiel Exp $
+ * @version $Id: Block.java,v 1.42 2009/01/05 17:51:39 michiel Exp $
  * @since MMBase-1.9
  */
 public class Block {
@@ -45,9 +45,10 @@
     private static final Logger log = Logging.getLoggerInstance(Block.class);
 
     private final Map<Renderer.Type, Renderer> renderers = new 
EnumMap<Renderer.Type, Renderer>(Renderer.Type.class);
-    Processor processor;
+    private Processor processor;
 
-    protected Parameter.Wrapper specific;
+    protected Parameter[] specific;
+    protected Parameter[] paramDefinition = null;
 
     private final String name;
     private final String mimetype;
@@ -126,7 +127,7 @@
      * the block). Use {...@link #getRenderer(Renderer.Type}).
      */
     Map<Renderer.Type, Renderer> getRenderers() {
-        return renderers;
+        return Collections.unmodifiableMap(renderers);
     }
 
     /**
@@ -148,15 +149,47 @@
     void addParameters(Parameter ... params) {
         List<Parameter> help = new ArrayList<Parameter>();
         if (specific != null) {
-            help.addAll(Arrays.asList(specific.getArguments()));
+            help.addAll(Arrays.asList(specific));
         }
         for (Parameter p : params) {
             help.add(p);
         }
-        specific = new Parameter.Wrapper(help.toArray(Parameter.emptyArray()));
+        specific = help.toArray(Parameter.emptyArray());
         log.debug("Set parameters of " + this + " to " + help);
     }
 
+    private void addParameters(List<Parameter> list, Parameter[] params) {
+        for (Parameter p : params) {
+            if (! (p instanceof PatternParameter)) {
+                list.add(p);
+            }
+        }
+    }
+    private void addPatternParameters(List<Parameter> list, Parameter[] 
params) {
+        for (Parameter p : params) {
+            if (p instanceof PatternParameter) {
+                list.add(p);
+            }
+        }
+    }
+
+    private synchronized void calculateParameterDefinition() {
+        List<Parameter> list     = new ArrayList<Parameter>();
+
+        addParameters(list, specific);
+        addParameters(list, getRenderer(Renderer.Type.HEAD).getParameters());
+        addParameters(list, getRenderer(Renderer.Type.BODY).getParameters());
+        addParameters(list, getProcessor().getParameters());
+
+        addPatternParameters(list, specific);
+        addPatternParameters(list, 
getRenderer(Renderer.Type.HEAD).getParameters());
+        addPatternParameters(list, 
getRenderer(Renderer.Type.BODY).getParameters());
+        addPatternParameters(list, getProcessor().getParameters());
+
+        paramDefinition = list.toArray(Parameter.emptyArray());
+
+    }
+
 
     /**
      * Before rendering, it may have to be fed with certain parameters. Obtain 
a parameters
@@ -166,10 +199,10 @@
         if (specific == null) {
             return new AutodefiningParameters();
         } else {
-            return new Parameters(specific,
-                                  new 
Parameter.Wrapper(getRenderer(Renderer.Type.HEAD).getParameters()),
-                                  new 
Parameter.Wrapper(getRenderer(Renderer.Type.BODY).getParameters()),
-                                  new 
Parameter.Wrapper(getProcessor().getParameters()));
+            if (paramDefinition == null) {
+                calculateParameterDefinition();
+            }
+            return new Parameters(paramDefinition);
         }
     }
 
@@ -184,6 +217,17 @@
         return getName();
     }
 
+    Processor setProcessor(Processor p) {
+        paramDefinition = null;
+        Processor r = processor;
+        processor = p;
+        return r;
+    }
+    Renderer putRenderer(Renderer.Type type, Renderer renderer) {
+        paramDefinition = null;
+        return renderers.put(type, renderer);
+    }
+
     /**
      * Every block can be assigned a hierarchal 'Type', which can classify it.
      */
_______________________________________________
Cvs mailing list
Cvs@lists.mmbase.org
http://lists.mmbase.org/mailman/listinfo/cvs

Reply via email to