You are viewing a plain text version of this content. The canonical link for it is here.
Posted to slide-dev@jakarta.apache.org by df...@apache.org on 2004/05/05 17:32:45 UTC

cvs commit: jakarta-slide/proposals/projector/src/java/org/apache/slide/projector/descriptor MapValueDescriptor.java

dflorey     2004/05/05 08:32:45

  Modified:    proposals/projector/src/java/org/apache/slide/projector/engine
                        SystemContext.java Process.java
               proposals/projector/src/java/org/apache/slide/projector/processor/form
                        Control.java Form.java FormHandler.java
                        Textbutton.java FormGenerator.java Trigger.java
               proposals/projector/src/java/org/apache/slide/projector/processor
                        TemplateRenderer.java
               proposals/projector/src/java/org/apache/slide/projector/resource
                        MapResource.java
               proposals/projector/src/java/org/apache/slide/projector
                        Constants.java Context.java
               proposals/projector/src/java/org/apache/slide/projector/descriptor
                        MapValueDescriptor.java
  Added:       proposals/projector/src/java/org/apache/slide/projector/processor/form
                        ControlComposer.java
  Log:
  Rebuilding form handling to enable multiple page spanning forms
  
  Revision  Changes    Path
  1.2       +0 -14     jakarta-slide/proposals/projector/src/java/org/apache/slide/projector/engine/SystemContext.java
  
  Index: SystemContext.java
  ===================================================================
  RCS file: /home/cvs/jakarta-slide/proposals/projector/src/java/org/apache/slide/projector/engine/SystemContext.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- SystemContext.java	3 May 2004 14:20:20 -0000	1.1
  +++ SystemContext.java	5 May 2004 15:32:44 -0000	1.2
  @@ -61,18 +61,4 @@
       public URI getBookmark() throws IOException {
       	return (URI)transientProcessStore.get(BOOKMARK);
       }
  -
  -    public void setFormStep(URI form, String step) throws IOException {
  -    	MapResource formMapResource = (MapResource)transientProcessStore.get(FORM_MAP);
  -    	if ( formMapResource == null ) formMapResource = new MapResource(new HashMap());
  -    	Map formMap = formMapResource.getMap();
  -    	formMap.put(form.toString(), step);
  -    	transientProcessStore.put(FORM_MAP, formMapResource);
  -    }
  -    
  -    public String getFormStep(URI form) throws IOException {
  -    	MapResource formMapResource = (MapResource)transientProcessStore.get(FORM_MAP);
  -    	if ( formMapResource == null ) return null;
  -    	return (String)formMapResource.getMap().get(form.toString());
  -    }
   }
  
  
  
  1.2       +25 -6     jakarta-slide/proposals/projector/src/java/org/apache/slide/projector/engine/Process.java
  
  Index: Process.java
  ===================================================================
  RCS file: /home/cvs/jakarta-slide/proposals/projector/src/java/org/apache/slide/projector/engine/Process.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- Process.java	3 May 2004 14:20:20 -0000	1.1
  +++ Process.java	5 May 2004 15:32:44 -0000	1.2
  @@ -10,6 +10,7 @@
   import org.apache.slide.projector.i18n.DefaultMessage;
   import org.apache.slide.projector.i18n.ErrorMessage;
   import org.apache.slide.projector.i18n.ParameterMessage;
  +import org.apache.slide.projector.resource.MapResource;
   import org.apache.slide.projector.resource.NullResource;
   import org.apache.slide.projector.resource.NumberResource;
   import org.apache.slide.projector.resource.StreamableResource;
  @@ -31,7 +32,8 @@
       private final static String OK = "ok";
   
       protected Map steps;
  -    protected String firstStep = null;
  +    protected String firstStep, domain;
  +    protected int store;
   
       protected EnvironmentDescriptor[] requiredContextDescriptors, providedContextDescriptors;
       protected ExpressionFactory expressionFactory = new ExpressionFactory();
  @@ -64,11 +66,7 @@
       }
   
       public Result process(Map parameter, Context context) throws Exception {
  -        String nextStep = firstStep;
  -        Object stepParameter = parameter.get(STEP);
  -        if (stepParameter != null && !(stepParameter instanceof NullResource) ) {
  -            nextStep = StringValueDescriptor.toString(stepParameter);
  -        }
  +        String nextStep = getStep(parameter, context);
           Result result = null;
           Step step;
           do {
  @@ -175,6 +173,25 @@
           return key;
       }
   
  +    private String getStep(Map parameter, Context context) {
  +        if ( domain != null ) {
  +        	try {
  +        		MapResource mapResource = (MapResource)context.getStore(store).get(domain);
  +        		if ( mapResource != null ) {
  +        			Map map = mapResource.getMap();
  +        	        Resource stepParameter = (Resource)parameter.get(STEP);
  +        	        if (stepParameter != null && stepParameter instanceof StringResource ) {
  +        	            return stepParameter.toString();
  +        	        }
  +        		}
  +        	} catch ( IOException exception ) {
  +                logger.log(Level.SEVERE, "Error while accessing store", exception);
  +        		return firstStep;
  +        	}
  +        }
  +		return firstStep;
  +    }
  +    
       private Map loadParameters(Step step, Processor processor, Map parameter, Result previousResult, Context context) throws Exception {
           // Collect parameters for this processor
           Map parameters = new HashMap();
  @@ -290,6 +307,8 @@
           public void startElement(SimplePath path, String name, AttributesImpl attributes, String leadingCDdata) {
               if (path.matches("process")) {
                   firstStep = attributes.getValue("first-step");
  +                store = StoreHelper.getStoreByName(attributes.getValue("store"));
  +                domain = attributes.getValue("domain");
               } else if (path.matches("description")) {
                   parsingDescription = true;
               } else if (path.matches("input/parameter")) {
  
  
  
  1.2       +2 -3      jakarta-slide/proposals/projector/src/java/org/apache/slide/projector/processor/form/Control.java
  
  Index: Control.java
  ===================================================================
  RCS file: /home/cvs/jakarta-slide/proposals/projector/src/java/org/apache/slide/projector/processor/form/Control.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- Control.java	3 May 2004 14:20:18 -0000	1.1
  +++ Control.java	5 May 2004 15:32:44 -0000	1.2
  @@ -35,7 +35,6 @@
       public final static String PARAMETER = "parameter";
       public final static String VALUE = "value";
       public final static String STATE = "state";
  -    public final static String ERROR = "error";
   
       protected Template optionalFragment, requiredFragment, validOptionalFragment, invalidOptionalFragment, validRequiredFragment, invalidRequiredFragment;
   
  @@ -70,7 +69,7 @@
           return new Result(state, OUTPUT, renderFragment(fragment, parameter));
       }
   
  -    protected ParameterDescriptor getParameterDescriptor(Map parameter, Context context) throws ProcessException {
  +    public ParameterDescriptor getParameterDescriptor(Map parameter, Context context) throws ProcessException {
           URI actionUri = (URIResource)parameter.get(ACTION);
           Processor action = ProcessorManager.getInstance().getProcessor(actionUri);
           String parameterName = parameter.get(PARAMETER).toString();
  
  
  
  1.3       +59 -149   jakarta-slide/proposals/projector/src/java/org/apache/slide/projector/processor/form/Form.java
  
  Index: Form.java
  ===================================================================
  RCS file: /home/cvs/jakarta-slide/proposals/projector/src/java/org/apache/slide/projector/processor/form/Form.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- Form.java	5 May 2004 09:58:08 -0000	1.2
  +++ Form.java	5 May 2004 15:32:44 -0000	1.3
  @@ -25,15 +25,12 @@
   
   import org.apache.slide.projector.*;
   import org.apache.slide.projector.descriptor.*;
  +import org.apache.slide.projector.engine.Process;
   import org.apache.slide.projector.engine.ContentType;
  -import org.apache.slide.projector.engine.ProcessorManager;
   import org.apache.slide.projector.i18n.DefaultMessage;
   import org.apache.slide.projector.i18n.ErrorMessage;
  -import org.apache.slide.projector.i18n.MessageNotFoundException;
   import org.apache.slide.projector.i18n.ParameterMessage;
  -import org.apache.slide.projector.processor.TemplateRenderer;
   import org.apache.slide.projector.resource.*;
  -import org.apache.slide.projector.util.ProcessorHelper;
   
   import java.util.*;
   
  @@ -42,41 +39,27 @@
    * 
    * @author <a href="mailto:dflorey@c1-fse.de">Daniel Florey</a>
    */
  -public class Form extends TemplateRenderer {
  -    public final static String CONTROL = "control";
  -    public final static String CONTROLS = "controls";
  -    public final static String VALIDATE = "validate";
  -    public final static String INFO = "info";
  -    public final static String LOCALE = "locale";
  -    public final static String METHOD = "method";
  -    public final static String HANDLER = "handler";
  -    public final static String SUBMIT = "submit";
  -
  -    public final static String ERROR_NUMBER = "error-number";
  -    public final static String ERROR_TITLE = "error-title";
  -    public final static String ERROR_TEXT = "error-text";
  -    public final static String ERROR_DETAILS = "error-details";
  -    public final static String ERROR_SUMMARY = "error-summary";
  -
  -    public final static String CONTROL_IDENTIFIER = "control:";
  +public class Form extends ControlComposer {
  +	public final static String HANDLER = "handler";
  +	public final static String METHOD = "method";
  +	
  +	public final static String CONTROL_IDENTIFIER = "control:";
       public final static String TRIGGER_IDENTIFIER = "trigger:";
   
  -    public final static String DEFAULT_STATE ="default";
  -    public final static String VALID_STATE ="valid";
  -    public final static String INVALID_STATE ="invalid";
  -
       protected final static String DEFAULT_FORM = "default form";
       protected final static String INVALID_FORM = "invalid form";
       protected final static String VALID_FORM = "valid form";
   
  -    protected ErrorMessage NO_ERROR_MESSAGE_AVAILABLE = new ErrorMessage("errorMessageNotFound");
  +    private final static String GET = "GET";
  +    private final static String POST = "POST";
  +    private final static String[] methods = new String[] { GET, POST }; 
   
       protected Template defaultTemplate;
       protected Template validTemplate;
       protected Template invalidTemplate;
   
       private ParameterDescriptor[] parameterDescriptors;
  -
  +    
       private final static ResultDescriptor resultDescriptor = new ResultDescriptor(
               new StateDescriptor[] {
                   new StateDescriptor(DEFAULT_STATE, new DefaultMessage("form/state/default")),
  @@ -92,10 +75,42 @@
           setOptionalFragments(new String[] { VALID_FORM, INVALID_FORM });
       }
   
  +    public Result process(Map parameter, Context context) throws Exception {
  +    	String domain = parameter.get(DOMAIN).toString();
  +    	URI actionUri = (URI)parameter.get(ACTION);
  +    	Locale locale = ((LocaleResource)parameter.get(LOCALE)).getLocale();
  +        boolean validate = ((BooleanResource)parameter.get(VALIDATE)).booleanValue();
  +        List informations = context.getInformations();
  +        MapResource controlDescriptions = new MapResource();
  +        for (int i = 0; i < parameterDescriptors.length; i++) {
  +        	String parameterName = parameterDescriptors[i].getName(); 
  +        	Resource value = (Resource)parameter.get(parameterName);
  +            if (value instanceof MapResource) {
  +            	controlDescriptions.getMap().put(parameterName, value);
  +            }
  +        }
  +        parameter.put(ControlComposer.CONTROL_DESCRIPTIONS, controlDescriptions);
  +        Result controlComposerResult = super.process(parameter, context);
  +        MapResource generatedControls = (MapResource)controlComposerResult.getResultEntries().get(ControlComposer.GENERATED_CONTROLS);
  +        for ( Iterator i = generatedControls.getMap().entrySet().iterator(); i.hasNext(); ) {
  +        	Map.Entry entry = (Map.Entry)i.next();
  +        	parameter.put(entry.getKey(), entry.getValue());
  +        }
  +    	parameter.put(RENDERED_ERRORS, controlComposerResult.getResultEntries().get(RENDERED_ERRORS));
  +        Template template = defaultTemplate;
  +        String state = controlComposerResult.getState();
  +        if ( state == VALID_STATE && validTemplate != null ) {
  +            template = validTemplate;
  +        } else if ( state == INVALID_STATE && invalidTemplate != null ) {
  +            template = invalidTemplate;
  +        }
  +        return new Result(state, OUTPUT, renderFragment(template, parameter));
  +    }
  +
       public void configure(StreamableResource config) throws ConfigurationException {
           super.configure(config);
           ParameterDescriptor[] parentParameterDescriptors = super.getParameterDescriptors();
  -        parameterDescriptors = new ParameterDescriptor[parentParameterDescriptors.length + 1 ];
  +        parameterDescriptors = new ParameterDescriptor[parentParameterDescriptors.length + 6 ];
           int counter = 0;
           for (int i = 0; i < parentParameterDescriptors.length; i++) {
               if (parentParameterDescriptors[i].getName().startsWith(CONTROL_IDENTIFIER)) {
  @@ -103,7 +118,7 @@
                           new ParameterMessage("form/control"),
                           new MapValueDescriptor(new ParameterDescriptor[] {
                               new ParameterDescriptor(CONTROL, new ParameterMessage("form/control"), new URIValueDescriptor()),
  -                            new ParameterDescriptor(Control.ACTION, new ParameterMessage("control/action"), new URIValueDescriptor()),
  +                            new ParameterDescriptor(Control.ACTION, new ParameterMessage("control/action"), new URIValueDescriptor(), NullResource.NULL),
                               new ParameterDescriptor(Control.PARAMETER, new ParameterMessage("control/parameter"), new StringValueDescriptor()),
                           }));
                   counter++;
  @@ -112,8 +127,8 @@
                               new ParameterMessage("form/trigger"),
                               new MapValueDescriptor(new ParameterDescriptor[] {
                                   new ParameterDescriptor(CONTROL, new ParameterMessage("form/trigger"), new URIValueDescriptor()),
  -                                new ParameterDescriptor(Trigger.ACTION, new ParameterMessage("trigger/action"), new URIValueDescriptor()),
  -                                new ParameterDescriptor(Trigger.STEP, new ParameterMessage("trigger/step"),  new ResourceValueDescriptor(), new NullResource()),
  +                                new ParameterDescriptor(Trigger.ACTION, new ParameterMessage("trigger/action"), new URIValueDescriptor(), NullResource.NULL),
  +                                new ParameterDescriptor(Process.STEP, new ParameterMessage("trigger/step"),  new ResourceValueDescriptor(), new NullResource()),
                               }));
                       counter++;
               } else if (!parentParameterDescriptors[i].getName().equals(FRAGMENT)) {
  @@ -122,9 +137,17 @@
               }
           }
           parameterDescriptors[counter] =
  -                            new ParameterDescriptor(VALIDATE, new ParameterMessage("form/validate"), new BooleanValueDescriptor(), new BooleanResource(false));
  +        	new ParameterDescriptor(HANDLER, new ParameterMessage("form/handler"), new URIValueDescriptor(), Constants.DEFAULT_FORM_HANDLER);
           parameterDescriptors[counter+1] =
  -                            new ParameterDescriptor(LOCALE, new ParameterMessage("form/locale"), new LocaleValueDescriptor());
  +        	new ParameterDescriptor(METHOD, new ParameterMessage("form/method"), new StringValueDescriptor(methods), new StringResource(POST));
  +        parameterDescriptors[counter+2] =
  +        	new ParameterDescriptor(LOCALE, new ParameterMessage("form/locale"), new LocaleValueDescriptor());
  +        parameterDescriptors[counter+3] =
  +        	new ParameterDescriptor(ACTION, new ParameterMessage("form/action"), new URIValueDescriptor());
  +        parameterDescriptors[counter+4] =
  +        	new ParameterDescriptor(STORE, new ParameterMessage("form/store"), new StringValueDescriptor(Store.stores));
  +        parameterDescriptors[counter+5] =
  +        	new ParameterDescriptor(DOMAIN, new ParameterMessage("form/domain"), new StringValueDescriptor());
   
           try {
               defaultTemplate = getRequiredFragment(DEFAULT_FORM);
  @@ -133,119 +156,6 @@
           }
           validTemplate = getOptionalFragment(VALID_FORM);
           invalidTemplate = getOptionalFragment(INVALID_FORM);
  -    }
  -
  -    public Result process(Map parameter, Context context) throws Exception {
  -        Locale locale = ((LocaleResource)parameter.get(LOCALE)).getLocale();
  -        boolean validate = ((BooleanResource)parameter.get(VALIDATE)).booleanValue();
  -        String state = DEFAULT_STATE;
  -        List informations = context.getInformations();
  -        for (int i = 0; i < parameterDescriptors.length; i++) {
  -            Resource value = (Resource)parameter.get(parameterDescriptors[i].getName());
  -            if (value instanceof MapResource) {
  -                String parameterName = parameterDescriptors[i].getName();
  -                Map controlParameters = ((MapResource)value).getMap();
  -                URI controlUri = ((URIResource)controlParameters.get(CONTROL));
  -                Processor control = ProcessorManager.getInstance().getProcessor(controlUri);
  -                try {
  -                    ProcessorHelper.validate(control.getParameterDescriptors(), controlParameters, context);
  -                } catch ( ValidationException exception ) {
  -                    throw new ValidationException(new ErrorMessage("form/controlParameterInvalid", new Object[] { control }), exception);
  -                }
  -                boolean required = parameterDescriptors[i].isRequired();
  -                String controlState = Control.OPTIONAL_CONTROL;
  -                if ( required ) {
  -                    controlState = Control.REQUIRED_CONTROL;
  -                }
  -                if ( validate ) {
  -                    Object controlValue = context.getStore(Store.TRANSIENT_PROCESS).get(parameterName);
  -                    try {
  -                        controlValue = ProcessorHelper.validate(parameterDescriptors[i], controlValue, context);
  -                    } catch ( ValidationException exception ) {
  -                        controlValue = StringValueDescriptor.toString(controlValue);
  -                        context.addInformation(new Information(Information.ERROR, exception.getErrorMessage(), new String[] { parameterName }));
  -                    }
  -                    controlParameters.put(Control.VALUE, controlValue);
  -                    if ( hasErrors(informations, parameterName) ) {
  -                        if ( required ) {
  -                            controlState = Control.REQUIRED_INVALID_CONTROL;
  -                        } else {
  -                            controlState = Control.OPTIONAL_INVALID_CONTROL;
  -                        }
  -                        explodeInformations(controlParameters, informations, parameterName, locale);
  -                    } else {
  -                        if ( required ) {
  -                            controlState = Control.REQUIRED_INVALID_CONTROL;
  -                        } else {
  -                            controlState = Control.OPTIONAL_VALID_CONTROL;
  -                        }
  -                    }
  -                }
  -                controlParameters.put(Control.STATE, controlState);
  -                Result controlResult = control.process(controlParameters, context);
  -                parameter.put(parameterDescriptors[i].getName(), controlResult.getResultEntries().get(OUTPUT));
  -                if ( controlState == Control.OPTIONAL_INVALID_CONTROL || controlState == Control.REQUIRED_INVALID_CONTROL  ) {
  -                    state = INVALID_STATE;
  -                } else if ( state == OPTIONAL && ( controlState == Control.OPTIONAL_VALID_CONTROL || controlState == Control.REQUIRED_VALID_CONTROL ) ) {
  -                    state = VALID_STATE;
  -                }
  -            }
  -        }
  -        Template template = defaultTemplate;
  -        if ( state == VALID_STATE && validTemplate != null ) {
  -            template = validTemplate;
  -        } else if ( state == INVALID_STATE && invalidTemplate != null ) {
  -            template = invalidTemplate;
  -        }
  -        return new Result(state, OUTPUT, renderFragment(template, parameter));
  -    }
  -
  -    protected void explodeInformations(Map parameters, List informations, String parameterName, Locale locale) {
  -        // FIXME: Use template for error numbers
  -        List matchingInfos = getErrors(informations, parameterName);
  -        StringBuffer buffer = new StringBuffer();
  -        for ( Iterator i = matchingInfos.iterator(); i.hasNext(); ) {
  -            Information info = (Information)i.next();
  -        	buffer.append(info.getNumber()).append(") ");
  -            explodeInformation(parameters, info, locale);
  -        }
  -        parameters.put(ERROR_NUMBER, buffer.toString());
  -    }
  -
  -    protected void explodeInformation(Map parameters, Information info, Locale locale) {
  -        parameters.put(ERROR_NUMBER, String.valueOf(info.getNumber()));
  -        try {
  -            parameters.put(ERROR_TITLE, info.getErrorMessage().getTitle(locale));
  -            parameters.put(ERROR_TEXT, info.getErrorMessage().getText(locale));
  -            parameters.put(ERROR_SUMMARY, info.getErrorMessage().getSummary(locale));
  -            parameters.put(ERROR_DETAILS, info.getErrorMessage().getDetails(locale));
  -        } catch ( MessageNotFoundException exception ) {
  -            parameters.put(ERROR_TITLE, NO_ERROR_MESSAGE_AVAILABLE.getTitle(locale, "no error title available"));
  -            parameters.put(ERROR_TEXT, NO_ERROR_MESSAGE_AVAILABLE.getText(locale, "no error text available"));
  -            parameters.put(ERROR_SUMMARY, NO_ERROR_MESSAGE_AVAILABLE.getSummary(locale, "no error summary available"));
  -            parameters.put(ERROR_DETAILS, NO_ERROR_MESSAGE_AVAILABLE.getDetails(locale, "no error details available"));
  -        }
  -    }
  -
  -   protected boolean hasErrors(List informations, String parameterName) {
  -       for ( Iterator i = informations.iterator(); i.hasNext(); ) {
  -       	Information info = (Information)i.next();
  -           if ( info.isParameterInvolved(parameterName) && info.getSeverity() == Information.ERROR ) {
  -               return true;
  -           }
  -       }
  -       return false;
  -   }
  -
  -    protected List getErrors(List informations, String parameterName) {
  -        List matchingInfos = new ArrayList();
  -        for ( Iterator i = informations.iterator(); i.hasNext(); ) {
  -        	Information info = (Information)i.next();
  -        	if ( info.isParameterInvolved(parameterName) && info.getSeverity() == Information.ERROR ) {
  -                matchingInfos.add(info);
  -            }
  -        }
  -        return matchingInfos;
       }
   
       public ParameterDescriptor[] getParameterDescriptors() {
  
  
  
  1.4       +33 -23    jakarta-slide/proposals/projector/src/java/org/apache/slide/projector/processor/form/FormHandler.java
  
  Index: FormHandler.java
  ===================================================================
  RCS file: /home/cvs/jakarta-slide/proposals/projector/src/java/org/apache/slide/projector/processor/form/FormHandler.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- FormHandler.java	5 May 2004 09:58:08 -0000	1.3
  +++ FormHandler.java	5 May 2004 15:32:44 -0000	1.4
  @@ -7,11 +7,16 @@
   import org.apache.slide.projector.i18n.ParameterMessage;
   import org.apache.slide.projector.processor.SimpleProcessor;
   import org.apache.slide.projector.resource.BooleanResource;
  -import org.apache.slide.projector.resource.NullResource;
  +import org.apache.slide.projector.resource.MapResource;
  +import org.apache.slide.projector.resource.URIResource;
   import org.apache.slide.projector.util.ProcessorHelper;
  +import org.apache.slide.projector.util.StoreHelper;
  +import org.apache.slide.projector.engine.Process;
   
  +import java.util.HashMap;
   import java.util.Iterator;
   import java.util.Map;
  +import java.util.StringTokenizer;
   
   /**
    * @author <a href="mailto:dflorey@c1-fse.de">Daniel Florey</a>
  @@ -21,15 +26,11 @@
   public class FormHandler implements Processor {
   	private final static String FORM_PARAMETER_IDENTIFIER = "form:";
   
  -	private final static String FORM_PROCESSOR = "form-processor";
  -	private final static String FORM_STEP = "form-step";
  -	
   	private final static ParameterDescriptor[] parameterDescriptors = new ParameterDescriptor[] {
  -        new ParameterDescriptor(Trigger.ACTION, new ParameterMessage("formHandler/action"), new URIValueDescriptor()),
  -        new ParameterDescriptor(Trigger.VALIDATE, new ParameterMessage("formHandler/validate"), new BooleanValueDescriptor(), BooleanResource.TRUE),
  -        new ParameterDescriptor(Trigger.STEP, new ParameterMessage("formHandler/step"),  new StringValueDescriptor(), NullResource.NULL ),
  -        new ParameterDescriptor(FORM_STEP, new ParameterMessage("formHandler/form-step"),  new StringValueDescriptor(), NullResource.NULL ),
  -        new ParameterDescriptor(FORM_PROCESSOR, new ParameterMessage("formHandler/form-processor"), new URIValueDescriptor())
  +        new ParameterDescriptor(Trigger.INSTRUCTION, new ParameterMessage("formHandler/instruction"),  new StringValueDescriptor()),
  +        new ParameterDescriptor(Trigger.LAST_STEP, new ParameterMessage("formHandler/last-step"), new URIValueDescriptor()),
  +        new ParameterDescriptor(ControlComposer.STORE, new ParameterMessage("formHandler/store"),  new StringValueDescriptor(Store.stores)),
  +        new ParameterDescriptor(ControlComposer.DOMAIN, new ParameterMessage("formHandler/form-step"),  new StringValueDescriptor())
       };
   
   	private final static ResultDescriptor resultDescriptor = new ResultDescriptor(
  @@ -39,32 +40,41 @@
               });
   
       public Result process(Map parameter, Context context) throws Exception {
  -    	boolean validate = ((BooleanResource)parameter.get(Trigger.VALIDATE)).booleanValue();
  -		URI processorURI = (URI)parameter.get(Trigger.ACTION);
  -		URI formURI = (URI)parameter.get(FORM_PROCESSOR);
  -		Processor formProcessor = ProcessorManager.getInstance().getProcessor(formURI);
  -		String formStep = parameter.get(FORM_STEP).toString();
  -		String targetStep = parameter.get(Trigger.STEP).toString();
  -		// 1. Store all (request) parameters into process store
  +		// Decode instruction
  +		StringTokenizer tokenizer = new StringTokenizer(parameter.get(Trigger.INSTRUCTION).toString(), ";");
  +		URI actionURI = new URIResource(tokenizer.nextToken());
  +		boolean validate = Boolean.valueOf(tokenizer.nextToken()).booleanValue();
  +		String targetStep = tokenizer.nextToken();
  +		String lastStep = parameter.get(Trigger.LAST_STEP).toString();
  +		String domain = parameter.get(ControlComposer.DOMAIN).toString();
  +		Store store = context.getStore(StoreHelper.getStoreByName(parameter.get(ControlComposer.STORE).toString()));
  +		// 1. Store all (request) parameters into requested domain
  +		Map map; 
  +		MapResource mapResource = (MapResource)store.get(domain);
  +		if ( mapResource == null ) {
  +			map = new HashMap();
  +			mapResource = new MapResource(map);
  +			store.put(domain, mapResource);
  +		} else {
  +			map = mapResource.getMap();
  +		}
       	for ( Iterator i = parameter.entrySet().iterator(); i.hasNext(); ) {
       		Map.Entry entry = (Map.Entry)i.next();
       		String key = (String)entry.getKey();
  -    		if ( key.startsWith(FORM_PARAMETER_IDENTIFIER) ) {
  -    			context.getStore(Store.TRANSIENT_PROCESS).put(key.substring(FORM_PARAMETER_IDENTIFIER.length()), entry.getValue());
  -    		}
  +   			map.put(key, entry.getValue());
       	}
       	if ( validate ) {
       		// 2. Validate parameters
  -    		Processor processor = ProcessorManager.getInstance().getProcessor(processorURI);
  +    		Processor processor = ProcessorManager.getInstance().getProcessor(actionURI);
       		try {
       			ProcessorHelper.validate(processor.getParameterDescriptors(), parameter, context);
       		} catch ( ValidationException exception ) {
       	    	// 3. Go back to form step if validation failes
  -    			context.setFormStep(formURI, formStep);
  +    			map.put(Process.STEP, lastStep);
       		}
       	}
       	// 4. Launch target step if validation is successfull
  -		context.setFormStep(formURI, targetStep);
  +    	map.put(Process.STEP, targetStep);
   		Processor bookmark = ProcessorManager.getInstance().getProcessor(context.getBookmark());
           return bookmark.process(parameter,  context);
       }
  
  
  
  1.2       +5 -10     jakarta-slide/proposals/projector/src/java/org/apache/slide/projector/processor/form/Textbutton.java
  
  Index: Textbutton.java
  ===================================================================
  RCS file: /home/cvs/jakarta-slide/proposals/projector/src/java/org/apache/slide/projector/processor/form/Textbutton.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- Textbutton.java	3 May 2004 14:20:18 -0000	1.1
  +++ Textbutton.java	5 May 2004 15:32:44 -0000	1.2
  @@ -1,10 +1,5 @@
   package org.apache.slide.projector.processor.form;
   
  -import org.apache.slide.projector.Context;
  -import org.apache.slide.projector.Result;
  -
  -import java.util.Map;
  -
   /**
    * @author <a href="mailto:dflorey@c1-fse.de">Daniel Florey</a>
    * @version $Revision$
  @@ -14,10 +9,10 @@
       private final static String FRAGMENT = "textbutton";
   
       public Textbutton() {
  -        setRequiredFragments(new String[] { FRAGMENT });
  +        super();
       }
  -
  -    public Result process(Map parameter, Context context) throws Exception {
  -        return new Result(OK, OUTPUT, renderFragment(FRAGMENT, parameter));
  +    
  +    protected String getName() {
  +    	return FRAGMENT;
       }
   }
  
  
  
  1.3       +9 -14     jakarta-slide/proposals/projector/src/java/org/apache/slide/projector/processor/form/FormGenerator.java
  
  Index: FormGenerator.java
  ===================================================================
  RCS file: /home/cvs/jakarta-slide/proposals/projector/src/java/org/apache/slide/projector/processor/form/FormGenerator.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- FormGenerator.java	5 May 2004 09:58:08 -0000	1.2
  +++ FormGenerator.java	5 May 2004 15:32:44 -0000	1.3
  @@ -19,7 +19,7 @@
    * @version $Revision$
    */
   public class FormGenerator extends Form {
  -    public final static String CONTROL = " control";
  +    public final static String CONTROL_FRAGMENT = " control";
   
       protected final static URI TEXTFIELD = new URIResource("/textfield");
       protected final static URI TEXTAREA = new URIResource("/textarea");
  @@ -36,12 +36,6 @@
   
       protected final static String STYLE = "style";
       protected final static String ORANGE_STYLE = "/orangeStyle";
  -    protected final static String TITLE = "title";
  -    protected final static String TEXT = "text";
  -    protected final static String PROMPT = "prompt";
  -    protected final static String ERRORS = "errors";
  -    protected final static String ERRORS_TITLE = "errors-title";
  -    protected final static String CLASS = "class";
       protected ParameterMessage NO_PARAMETER_MESSAGE_AVAILABLE = new ParameterMessage("parameterMessageNotFound");
   
       private ParameterDescriptor[] parameterDescriptors;
  @@ -53,6 +47,8 @@
       }
   
       public Result process(Map parameter, Context context) throws Exception {
  +    	// FIXME: Redo!!
  +    	/*
       	// Collect involved parameters and call super
       	
       	boolean validate = ((BooleanResource)parameter.get(VALIDATE)).booleanValue();
  @@ -152,6 +148,8 @@
           errorsParameter.put(SimpleProcessor.INPUT, new ArrayResource((MapResource[])errorList.toArray(errorsArray)));
           ProcessorHelper.validate(errorsTable.getParameterDescriptors(), errorsParameter, context);
           Result renderedErrors = errorsTable.process(errorsParameter, context);
  +        parameter.put(ERRORS, renderedErrors.getResultEntries().get(OUTPUT));
  +
           ProcessorDescriptor processorDescriptor = ProcessorManager.getInstance().getProcessorDescriptor(actionUri);
           parameter.put(PROCESSOR_NAME, processorDescriptor.getName());
           parameter.put(PROCESSOR_TITLE, ((DefaultMessage)processorDescriptor.getDescription()).getTitle(locale, processorDescriptor.getName()));
  @@ -161,18 +159,15 @@
           parameter.put(TITLE, processorDescriptor.getName());
           parameter.put(STYLE, ((HttpContext)context).getContextPath() + ORANGE_STYLE);
           parameter.put(ERRORS_TITLE, "Fehler:");
  -        parameter.put(ERRORS, renderedErrors.getResultEntries().get(OUTPUT));
           return new Result(state, OUTPUT, renderFragment(template, parameter));
  +        */
  +        return null;
       }
   
       public void configure(StreamableResource config) throws ConfigurationException {
           super.configure(config);
           parameterDescriptors = new ParameterDescriptor[] {
  -            new ParameterDescriptor(Control.ACTION, new ParameterMessage("formGenerator/action"), new URIValueDescriptor()),
  -            new ParameterDescriptor(HANDLER, new ParameterMessage("formGenerator/handler"), new URIValueDescriptor()),
  -            new ParameterDescriptor(VALIDATE, new ParameterMessage("formGenerator/validate"), new BooleanValueDescriptor(), BooleanResource.FALSE ),
  -            new ParameterDescriptor(METHOD, new ParameterMessage("formGenerator/method"), new StringValueDescriptor(), new StringResource("POST")),
  -            new ParameterDescriptor(SUBMIT, new ParameterMessage("formGenerator/submit"), new StringValueDescriptor(), new StringResource("Submit")),
  +            new ParameterDescriptor(ACTION, new ParameterMessage("formGenerator/action"), new URIValueDescriptor()),
               new ParameterDescriptor(LOCALE, new ParameterMessage("formGenerator/locale"), new LocaleValueDescriptor(), new LocaleResource(Locale.getDefault()))
           };
       }
  
  
  
  1.3       +30 -11    jakarta-slide/proposals/projector/src/java/org/apache/slide/projector/processor/form/Trigger.java
  
  Index: Trigger.java
  ===================================================================
  RCS file: /home/cvs/jakarta-slide/proposals/projector/src/java/org/apache/slide/projector/processor/form/Trigger.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- Trigger.java	5 May 2004 09:58:08 -0000	1.2
  +++ Trigger.java	5 May 2004 15:32:44 -0000	1.3
  @@ -1,33 +1,52 @@
   package org.apache.slide.projector.processor.form;
   
  +import java.util.Map;
  +
  +import org.apache.slide.projector.engine.Process;
   import org.apache.slide.projector.ConfigurationException;
  +import org.apache.slide.projector.Context;
  +import org.apache.slide.projector.Result;
  +import org.apache.slide.projector.URI;
   import org.apache.slide.projector.descriptor.BooleanValueDescriptor;
   import org.apache.slide.projector.descriptor.ParameterDescriptor;
  -import org.apache.slide.projector.descriptor.ResourceValueDescriptor;
  +import org.apache.slide.projector.descriptor.StringValueDescriptor;
   import org.apache.slide.projector.descriptor.URIValueDescriptor;
   import org.apache.slide.projector.i18n.ParameterMessage;
   import org.apache.slide.projector.processor.TemplateRenderer;
   import org.apache.slide.projector.resource.BooleanResource;
  -import org.apache.slide.projector.resource.NullResource;
   import org.apache.slide.projector.resource.StreamableResource;
  +import org.apache.slide.projector.resource.StringResource;
   
   /**
    * @author <a href="mailto:dflorey@c1-fse.de">Daniel Florey</a>
    * @version $Revision$
    */
   
  -public class Trigger extends TemplateRenderer {
  +public abstract class Trigger extends TemplateRenderer {
  +	public final static String INSTRUCTION = "instruction";
       public final static String ACTION = "action";
  -    public final static String STEP = "step";
  +    public final static String LAST_STEP = "last-step";
       public final static String VALIDATE = "validate";
  -    public final static String VALUE = "value";
   
       private ParameterDescriptor[] parameterDescriptors;
   
  +    public Trigger() {
  +        setRequiredFragments(new String[] { getName() });
  +    }
  +
  +    public Result process(Map parameter, Context context) throws Exception {
  +        String targetStep = parameter.get(Process.STEP).toString();
  +        BooleanResource validate = (BooleanResource)parameter.get(VALIDATE);
  +        URI actionUri = (URI)parameter.get(ACTION);
  +        String instruction = actionUri + ";" + validate + ";" + targetStep;
  +        parameter.put(INSTRUCTION, new StringResource(instruction));
  +        return new Result(OK, OUTPUT, renderFragment(getName(), parameter));
  +    }
  +    
       public void configure(StreamableResource config) throws ConfigurationException {
           super.configure(config);
           ParameterDescriptor[] parentParameterDescriptors = super.getParameterDescriptors();
  -        parameterDescriptors = new ParameterDescriptor[parentParameterDescriptors.length + 2];
  +        parameterDescriptors = new ParameterDescriptor[parentParameterDescriptors.length + 3];
           int counter = 0;
           for ( int i = 0; i < parentParameterDescriptors.length; i++ ) {
               if (!parentParameterDescriptors[i].getName().equals(FRAGMENT)) {
  @@ -38,14 +57,14 @@
           parameterDescriptors[parentParameterDescriptors.length - 1] =
                   new ParameterDescriptor(ACTION, new ParameterMessage("trigger/action"), new URIValueDescriptor());
           parameterDescriptors[parentParameterDescriptors.length ] =
  -                new ParameterDescriptor(STEP, new ParameterMessage("trigger/step"), new ResourceValueDescriptor(), NullResource.NULL );
  -        parameterDescriptors[parentParameterDescriptors.length + 1] =
  -                new ParameterDescriptor(VALUE, new ParameterMessage("trigger/value"), new ResourceValueDescriptor(), NullResource.NULL);
  -        parameterDescriptors[parentParameterDescriptors.length + 1] =
  +            new ParameterDescriptor(Process.STEP, new ParameterMessage("trigger/step"), new StringValueDescriptor());
  +        parameterDescriptors[parentParameterDescriptors.length + 2] =
               new ParameterDescriptor(VALIDATE, new ParameterMessage("trigger/validate"), new BooleanValueDescriptor(), BooleanResource.TRUE);
       }
   
       public ParameterDescriptor[] getParameterDescriptors() {
           return parameterDescriptors;
       }
  +
  +    protected abstract String getName();
   }
  
  
  
  1.1                  jakarta-slide/proposals/projector/src/java/org/apache/slide/projector/processor/form/ControlComposer.java
  
  Index: ControlComposer.java
  ===================================================================
  package org.apache.slide.projector.processor.form;
  
  import org.apache.slide.projector.*;
  import org.apache.slide.projector.descriptor.*;
  import org.apache.slide.projector.engine.ProcessorManager;
  import org.apache.slide.projector.i18n.DefaultMessage;
  import org.apache.slide.projector.i18n.ErrorMessage;
  import org.apache.slide.projector.i18n.MessageNotFoundException;
  import org.apache.slide.projector.i18n.ParameterMessage;
  import org.apache.slide.projector.processor.SimpleProcessor;
  import org.apache.slide.projector.processor.TemplateRenderer;
  import org.apache.slide.projector.resource.*;
  import org.apache.slide.projector.util.ProcessorHelper;
  import org.apache.slide.projector.util.StoreHelper;
  
  import java.util.*;
  
  /**
   * The ControlComposer class
   * 
   * @author <a href="mailto:dflorey@c1-fse.de">Daniel Florey</a>
   */
  public class ControlComposer extends TemplateRenderer {
  	//	 Parameters for the control composer
      public final static String VALIDATE = "validate";
      public final static String LOCALE = "locale";
      public final static String ACTION = "action";
      public final static String STORE = "store";
      public final static String DOMAIN = "domain";
      public final static String ERRORS_PROCESSOR = "errorsProcessor";
      public final static String CONTROL_DESCRIPTIONS = "controlDescriptions";
  
      // Parameters for each control 
      public final static String CONTROL = "control";
      public final static String CONTROL_CONTAINER = "control-container";
      
      // Parameters for the control container
      protected final static String TITLE = "title";
      protected final static String TEXT = "text";
      protected final static String PROMPT = "prompt";
      protected final static String ERRORS = "errors";
      protected final static String ERRORS_TITLE = "errors-title";
      
      public final static String ERROR_NUMBER = "error-number";
      public final static String ERROR_TITLE = "error-title";
      public final static String ERROR_TEXT = "error-text";
      public final static String ERROR_DETAILS = "error-details";
      public final static String ERROR_SUMMARY = "error-summary";
  
      // Result
      public final static String GENERATED_CONTROLS = "renderedControls";
      public final static String RENDERED_ERRORS = "renderedErrors";
      public final static String DEFAULT_STATE ="default";
      public final static String VALID_STATE ="valid";
      public final static String INVALID_STATE ="invalid";
  
      protected ErrorMessage NO_ERROR_MESSAGE_AVAILABLE = new ErrorMessage("errorMessageNotFound");
      protected ParameterMessage NO_PARAMETER_MESSAGE_AVAILABLE = new ParameterMessage("parameterMessageNotFound");
  
      private ParameterDescriptor[] parameterDescriptors;
  
      private final static ResultDescriptor resultDescriptor = new ResultDescriptor(
              new StateDescriptor[] {
                  new StateDescriptor(DEFAULT_STATE, new DefaultMessage("controlComposer/state/default")),
                  new StateDescriptor(VALID_STATE, new DefaultMessage("controlComposer/state/valid")),
                  new StateDescriptor(INVALID_STATE, new DefaultMessage("controlComposer/state/invalid"))
              },
              new ResultEntryDescriptor[]{
                  new ResultEntryDescriptor(GENERATED_CONTROLS, new DefaultMessage("controlComposer/generatedControls"), MapResource.CONTENT_TYPE, false)
              });
  
      public void configure(StreamableResource config) throws ConfigurationException {
          super.configure(config);
          ParameterDescriptor[] parentParameterDescriptors = super.getParameterDescriptors();
          parameterDescriptors = new ParameterDescriptor[parentParameterDescriptors.length + 6];
          parameterDescriptors[parentParameterDescriptors.length] =
          	new ParameterDescriptor(CONTROL_DESCRIPTIONS, new ParameterMessage("controlComposer/controlDescriptions"), new MapValueDescriptor());
          parameterDescriptors[parentParameterDescriptors.length+1] =
          	new ParameterDescriptor(LOCALE, new ParameterMessage("controlComposer/locale"), new LocaleValueDescriptor());
          parameterDescriptors[parentParameterDescriptors.length+2] =
          	new ParameterDescriptor(ACTION, new ParameterMessage("controlComposer/action"), new URIValueDescriptor());
          parameterDescriptors[parentParameterDescriptors.length+3] =
          	new ParameterDescriptor(STORE, new ParameterMessage("controlComposer/store"), new StringValueDescriptor(Store.stores));
          parameterDescriptors[parentParameterDescriptors.length+4] =
          	new ParameterDescriptor(DOMAIN, new ParameterMessage("controlComposer/domain"), new StringValueDescriptor());
          parameterDescriptors[parentParameterDescriptors.length+5] =
          	new ParameterDescriptor(ERRORS_PROCESSOR, new ParameterMessage("controlComposer/errorsProcessor"), new URIValueDescriptor(), NullResource.NULL);
      }
  
      public Result process(Map parameter, Context context) throws Exception {
      	Map controlDescriptions = ((MapResource)parameter.get(CONTROL_DESCRIPTIONS)).getMap();
      	String store = parameter.get(STORE).toString();
      	String domain = parameter.get(DOMAIN).toString();
      	URI actionUri = (URI)parameter.get(ACTION);
      	URI errorsProcessorUri = (URI)parameter.get(ERRORS_PROCESSOR);
      	Locale locale = ((LocaleResource)parameter.get(LOCALE)).getLocale();
          boolean validate = ((BooleanResource)parameter.get(VALIDATE)).booleanValue();
          String state = DEFAULT_STATE;
          List informations = context.getInformations();
          MapResource generatedControls = new MapResource();
          for (Iterator i = controlDescriptions.entrySet().iterator(); i.hasNext(); ) {
          	Map.Entry entry = (Map.Entry)i.next();
          	String controlName = (String)entry.getKey();
          	Map controlParameters = ((MapResource)entry.getValue()).getMap();
          	if ( ((URI)controlParameters.get(Control.ACTION)) == null ) controlParameters.put(Control.ACTION, actionUri);
          	Control control = (Control)ProcessorManager.getInstance().getProcessor((URI)controlParameters.get(CONTROL));
          	try {
          		ProcessorHelper.validate(control.getParameterDescriptors(), controlParameters, context);
          	} catch ( ValidationException exception ) {
          		throw new ValidationException(new ErrorMessage("controlComposer/controlParameterInvalid", new Object[] { control }), exception);
          	}
          	ParameterDescriptor parameterDescriptor = control.getParameterDescriptor(controlParameters, context); 
              String parameterName = parameterDescriptor.getName();
              ParameterMessage description = (ParameterMessage)parameterDescriptor.getDescription();
          	boolean required = parameterDescriptor.isRequired();
          	String controlState = Control.OPTIONAL_CONTROL;
          	if ( required ) {
          		controlState = Control.REQUIRED_CONTROL;
          	}
      		Object controlValue = null;
          	if ( validate ) {
          		MapResource mapResource = (MapResource)context.getStore(StoreHelper.getStoreByName(store)).get(domain);
          		if ( mapResource != null ) {
          			controlValue = mapResource.getMap().get(parameterName);
          		}
          		try {
          			controlValue = ProcessorHelper.validate(parameterDescriptor, controlValue, context);
          		} catch ( ValidationException exception ) {
          			controlValue = StringValueDescriptor.toString(controlValue);
          			context.addInformation(new Information(Information.ERROR, exception.getErrorMessage(), new String[] { parameterName }));
          		}
          		controlParameters.put(Control.VALUE, controlValue);
          		if ( hasErrors(informations, parameterName) ) {
          			if ( required ) {
          				controlState = Control.REQUIRED_INVALID_CONTROL;
          			} else {
          				controlState = Control.OPTIONAL_INVALID_CONTROL;
          			}
          			explodeInformations(controlParameters, informations, parameterName, locale);
          		} else {
          			if ( required ) {
          				controlState = Control.REQUIRED_INVALID_CONTROL;
          			} else {
          				controlState = Control.OPTIONAL_VALID_CONTROL;
          			}
          		}
          	}
          	controlParameters.put(Control.STATE, controlState);
              controlParameters.put(Control.VALUE, controlValue);
          	Result controlResult = control.process(controlParameters, context);
          	Resource controlContainerUri = (Resource)controlParameters.get(CONTROL_CONTAINER); 
          	if ( controlContainerUri != null ) {
              	Processor controlContainer = ProcessorManager.getInstance().getProcessor((URI)controlContainerUri);
              	Map controlContainerParameters = new HashMap();
              	controlContainerParameters.putAll(parameter);
              	if ( hasErrors(informations, parameterName) ) {
              		explodeInformations(controlContainerParameters, informations, parameterName, locale);
              	}
              	controlContainerParameters.put(CONTROL, controlResult.getResultEntries().get(OUTPUT));
              	controlContainerParameters.put(TITLE, description.getTitle(locale, parameterName ));
              	try {
              		controlContainerParameters.put(TEXT, description.getText(locale));
              		controlContainerParameters.put(PROMPT, description.getPrompt(locale));
              	} catch ( MessageNotFoundException exception ) {
              		controlContainerParameters.put(TEXT, NO_PARAMETER_MESSAGE_AVAILABLE.getText(locale, "&nbsp;"));
              		controlContainerParameters.put(PROMPT, NO_PARAMETER_MESSAGE_AVAILABLE.getPrompt(locale, "&nbsp;"));
              	}
              	try {
              		ProcessorHelper.validate(controlContainer.getParameterDescriptors(), controlContainerParameters, context);
              	} catch ( ValidationException exception ) {
              		throw new ValidationException(new ErrorMessage("controlComposer/controlContainerParameterInvalid", new Object[] { controlContainerUri }), exception);
              	}
              	Result controlContainerResult = controlContainer.process(controlContainerParameters, context);
              	generatedControls.getMap().put(controlName, controlContainerResult.getResultEntries().get(OUTPUT));
          	} else {
              	generatedControls.getMap().put(controlName, controlResult.getResultEntries().get(OUTPUT));
          	}
          	if ( controlState == Control.OPTIONAL_INVALID_CONTROL || controlState == Control.REQUIRED_INVALID_CONTROL  ) {
          		state = INVALID_STATE;
          	} else if ( state == DEFAULT_STATE && ( controlState == Control.OPTIONAL_VALID_CONTROL || controlState == Control.REQUIRED_VALID_CONTROL ) ) {
          		state = VALID_STATE;
          	}
          }
          Result composerResult = new Result(state, GENERATED_CONTROLS, generatedControls); 
          if ( errorsProcessorUri != null ) {
          	Processor errorsTable = ProcessorManager.getInstance().getProcessor(errorsProcessorUri);
          	List errorList = new ArrayList();
          	for ( Iterator i = context.getInformations().iterator(); i.hasNext(); ) {
          		Information info = (Information)i.next();
          		Map errors = new HashMap();
          		explodeInformation(errors, info, locale );
          		errorList.add(new MapResource(errors));
          	}
          	Map errorsParameter = new HashMap();
          	MapResource[] errorsArray = new MapResource[errorList.size()];
          	errorsParameter.put(SimpleProcessor.INPUT, new ArrayResource((MapResource[])errorList.toArray(errorsArray)));
          	ProcessorHelper.validate(errorsTable.getParameterDescriptors(), errorsParameter, context);
          	Result renderedErrors = errorsTable.process(errorsParameter, context);
          	composerResult.addResultEntry(RENDERED_ERRORS, (Resource)renderedErrors.getResultEntries().get(OUTPUT));
          }
          return composerResult;
      }
  
      protected void explodeInformations(Map parameters, List informations, String parameterName, Locale locale) {
          // FIXME: Use template for error numbers
          List matchingInfos = getErrors(informations, parameterName);
          StringBuffer buffer = new StringBuffer();
          for ( Iterator i = matchingInfos.iterator(); i.hasNext(); ) {
              Information info = (Information)i.next();
          	buffer.append(info.getNumber()).append(") ");
              explodeInformation(parameters, info, locale);
          }
          parameters.put(ERROR_NUMBER, buffer.toString());
      }
  
      protected void explodeInformation(Map parameters, Information info, Locale locale) {
          parameters.put(ERROR_NUMBER, String.valueOf(info.getNumber()));
          try {
              parameters.put(ERROR_TITLE, info.getErrorMessage().getTitle(locale));
              parameters.put(ERROR_TEXT, info.getErrorMessage().getText(locale));
              parameters.put(ERROR_SUMMARY, info.getErrorMessage().getSummary(locale));
              parameters.put(ERROR_DETAILS, info.getErrorMessage().getDetails(locale));
          } catch ( MessageNotFoundException exception ) {
              parameters.put(ERROR_TITLE, NO_ERROR_MESSAGE_AVAILABLE.getTitle(locale, "no error title available"));
              parameters.put(ERROR_TEXT, NO_ERROR_MESSAGE_AVAILABLE.getText(locale, "no error text available"));
              parameters.put(ERROR_SUMMARY, NO_ERROR_MESSAGE_AVAILABLE.getSummary(locale, "no error summary available"));
              parameters.put(ERROR_DETAILS, NO_ERROR_MESSAGE_AVAILABLE.getDetails(locale, "no error details available"));
          }
      }
  
     protected boolean hasErrors(List informations, String parameterName) {
         for ( Iterator i = informations.iterator(); i.hasNext(); ) {
         	Information info = (Information)i.next();
             if ( info.isParameterInvolved(parameterName) && info.getSeverity() == Information.ERROR ) {
                 return true;
             }
         }
         return false;
     }
  
      protected List getErrors(List informations, String parameterName) {
          List matchingInfos = new ArrayList();
          for ( Iterator i = informations.iterator(); i.hasNext(); ) {
          	Information info = (Information)i.next();
          	if ( info.isParameterInvolved(parameterName) && info.getSeverity() == Information.ERROR ) {
                  matchingInfos.add(info);
              }
          }
          return matchingInfos;
      }
  
      public ParameterDescriptor[] getParameterDescriptors() {
          return parameterDescriptors;
      }
  
      public ResultDescriptor getResultDescriptor() {
          return resultDescriptor;
      }
  }
  
  
  1.2       +6 -1      jakarta-slide/proposals/projector/src/java/org/apache/slide/projector/processor/TemplateRenderer.java
  
  Index: TemplateRenderer.java
  ===================================================================
  RCS file: /home/cvs/jakarta-slide/proposals/projector/src/java/org/apache/slide/projector/processor/TemplateRenderer.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- TemplateRenderer.java	3 May 2004 14:20:24 -0000	1.1
  +++ TemplateRenderer.java	5 May 2004 15:32:44 -0000	1.2
  @@ -51,6 +51,7 @@
   
       private Map templates;
       private String[] requiredFragments, optionalFragments;
  +    private boolean ignoreUndefinedFragments = true;
       protected List optionalParameters = new ArrayList(); // all variables used in conditions reflect optional parameters
   
       // FIXME: Nested fragments
  @@ -136,6 +137,10 @@
       public void setOptionalFragments(String[] optionalFragments) {
           this.optionalFragments = optionalFragments;
       }
  +    
  +	public void ignoreUndefinedFragments(boolean ignoreUndefinedFragments) {
  +		this.ignoreUndefinedFragments = ignoreUndefinedFragments; 
  +	}
   
       public StringResource renderFragment(String fragment, Map parameter)  throws ProcessException {
           Template template = getRequiredFragment(fragment);
  @@ -204,7 +209,7 @@
                   if ( fragmentName.startsWith(optionalFragments[i])) return false;
               }
           }
  -        return true;
  +        return ignoreUndefinedFragments;
       }
   
       protected class Template {
  
  
  
  1.2       +5 -0      jakarta-slide/proposals/projector/src/java/org/apache/slide/projector/resource/MapResource.java
  
  Index: MapResource.java
  ===================================================================
  RCS file: /home/cvs/jakarta-slide/proposals/projector/src/java/org/apache/slide/projector/resource/MapResource.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- MapResource.java	3 May 2004 14:20:24 -0000	1.1
  +++ MapResource.java	5 May 2004 15:32:44 -0000	1.2
  @@ -4,6 +4,7 @@
   import de.zeigermann.xml.XMLWriter;
   import org.apache.slide.projector.Resource;
   
  +import java.util.HashMap;
   import java.util.Iterator;
   import java.util.Map;
   
  @@ -12,6 +13,10 @@
   
       public final static String CONTENT_TYPE = "application/x-java-map";
   
  +    public MapResource() {
  +    	map = new HashMap();
  +    }
  +    
       public MapResource(Map map) {
           this.map = map;
       }
  
  
  
  1.4       +3 -0      jakarta-slide/proposals/projector/src/java/org/apache/slide/projector/Constants.java
  
  Index: Constants.java
  ===================================================================
  RCS file: /home/cvs/jakarta-slide/proposals/projector/src/java/org/apache/slide/projector/Constants.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- Constants.java	5 May 2004 09:58:08 -0000	1.3
  +++ Constants.java	5 May 2004 15:32:44 -0000	1.4
  @@ -4,6 +4,7 @@
   import org.apache.commons.httpclient.UsernamePasswordCredentials;
   import org.apache.commons.httpclient.contrib.ssl.EasySSLProtocolSocketFactory;
   import org.apache.commons.httpclient.protocol.Protocol;
  +import org.apache.slide.projector.resource.URIResource;
   
   public interface Constants {
       // FIXME should be read from configuration
  @@ -51,4 +52,6 @@
       public final static String CLASSES_DIR = SYSTEM_HOME + "classes/";
   
       public static final String PROCESS_STORAGE_PREFIX = SYSTEM_HOME+"jobs/";
  +
  +    public static final URI DEFAULT_FORM_HANDLER = new URIResource("/formHandler");
   }
  
  
  
  1.2       +1 -5      jakarta-slide/proposals/projector/src/java/org/apache/slide/projector/Context.java
  
  Index: Context.java
  ===================================================================
  RCS file: /home/cvs/jakarta-slide/proposals/projector/src/java/org/apache/slide/projector/Context.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- Context.java	3 May 2004 14:20:23 -0000	1.1
  +++ Context.java	5 May 2004 15:32:44 -0000	1.2
  @@ -21,11 +21,7 @@
       void setBookmark(URI processor) throws IOException ;
       
       URI getBookmark() throws IOException ;
  -    
  -    void setFormStep(URI form, String nextStep) throws IOException;
  -    
  -    String getFormStep(URI form) throws IOException;
  -    
  +
       Credentials getCredentials();
   
       void addInformation(Information information);
  
  
  
  1.2       +21 -10    jakarta-slide/proposals/projector/src/java/org/apache/slide/projector/descriptor/MapValueDescriptor.java
  
  Index: MapValueDescriptor.java
  ===================================================================
  RCS file: /home/cvs/jakarta-slide/proposals/projector/src/java/org/apache/slide/projector/descriptor/MapValueDescriptor.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- MapValueDescriptor.java	3 May 2004 14:20:21 -0000	1.1
  +++ MapValueDescriptor.java	5 May 2004 15:32:45 -0000	1.2
  @@ -11,20 +11,24 @@
   import java.util.Map;
   
   public class MapValueDescriptor implements ValueDescriptor {
  -    protected List entryDescriptors;
  +	public final static String ALL = "*";
  +
  +	protected List entryDescriptors = new ArrayList();
   
       protected ValueDescriptor entryValueDescriptor;
   
       public MapValueDescriptor() {
  -        entryDescriptors = new ArrayList();
       }
   
       public MapValueDescriptor(List entryDescriptors) {
           this.entryDescriptors = entryDescriptors;
       }
   
  +    public MapValueDescriptor(ParameterDescriptor parameterDescriptor) {
  +    	entryDescriptors.add(parameterDescriptor);
  +    }
  +
       public MapValueDescriptor(ParameterDescriptor[] parameterDescriptors) {
  -        entryDescriptors = new ArrayList();
           for ( int i = 0; i < parameterDescriptors.length; i++ ) {
               entryDescriptors.add(parameterDescriptors[i]);
           }
  @@ -54,14 +58,21 @@
               ParameterDescriptor parameterDescriptor = (ParameterDescriptor)i.next();
               ValueDescriptor entryDescriptor = parameterDescriptor.getValueDescriptor();
               String key = parameterDescriptor.getName();
  -            if ( !map.containsKey(key) ) {
  -                if ( parameterDescriptor.isRequired() ) {
  -                    throw new ValidationException(new ErrorMessage("mapEntryMissing", new String[] { key }));
  -                } else {
  -                    map.put(key, parameterDescriptor.getDefaultValue());
  -                }
  +            if ( key.equals(ALL) ) {
  +            	for ( Iterator j = map.entrySet().iterator(); j.hasNext(); ) {
  +            		Map.Entry entry = (Map.Entry)j.next();
  +                	map.put(entry.getKey(), entryDescriptor.validate(entry.getValue(), context));
  +            	}
               } else {
  -                map.put(key, entryDescriptor.validate(map.get(key), context));
  +            	if ( !map.containsKey(key) ) {
  +            		if ( parameterDescriptor.isRequired() ) {
  +            			throw new ValidationException(new ErrorMessage("mapEntryMissing", new String[] { key }));
  +            		} else {
  +            			map.put(key, parameterDescriptor.getDefaultValue());
  +            		}
  +            	} else {
  +            		map.put(key, entryDescriptor.validate(map.get(key), context));
  +            	}
               }
           }
           return new MapResource(map);
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: slide-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: slide-dev-help@jakarta.apache.org