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