1 package org.apache.slide.projector.processor.form; 2 3 import java.util.ArrayList ; 4 import java.util.Iterator ; 5 import java.util.List ; 6 import java.util.Locale ; 7 import java.util.Map ; 8 9 import org.apache.slide.projector.ConfigurationException; 10 import org.apache.slide.projector.Constants; 11 import org.apache.slide.projector.Context; 12 import org.apache.slide.projector.HttpContext; 13 import org.apache.slide.projector.ProcessException; 14 import org.apache.slide.projector.Processor; 15 import org.apache.slide.projector.Result; 16 import org.apache.slide.projector.URI; 17 import org.apache.slide.projector.descriptor.ArrayValueDescriptor; 18 import org.apache.slide.projector.descriptor.BooleanValueDescriptor; 19 import org.apache.slide.projector.descriptor.LocaleValueDescriptor; 20 import org.apache.slide.projector.descriptor.NumberValueDescriptor; 21 import org.apache.slide.projector.descriptor.ParameterDescriptor; 22 import org.apache.slide.projector.descriptor.ProcessorDescriptor; 23 import org.apache.slide.projector.descriptor.StringValueDescriptor; 24 import org.apache.slide.projector.descriptor.URIValueDescriptor; 25 import org.apache.slide.projector.descriptor.ValueDescriptor; 26 import org.apache.slide.projector.engine.ProcessorManager; 27 import org.apache.slide.projector.i18n.DefaultMessage; 28 import org.apache.slide.projector.i18n.ErrorMessage; 29 import org.apache.slide.projector.i18n.ParameterMessage; 30 import org.apache.slide.projector.processor.process.Process; 31 import org.apache.slide.projector.value.ArrayValue; 32 import org.apache.slide.projector.value.BooleanValue; 33 import org.apache.slide.projector.value.LocaleValue; 34 import org.apache.slide.projector.value.MapValue; 35 import org.apache.slide.projector.value.NullValue; 36 import org.apache.slide.projector.value.StreamableValue; 37 import org.apache.slide.projector.value.StringValue; 38 import org.apache.slide.projector.value.URIValue; 39 import org.apache.slide.projector.value.Value; 40 41 44 public class FormGenerator extends ControlComposer { 45 public final static String CONTROLS = "controls"; 46 public final static String TRIGGERS = "triggers"; 47 public final static String TARGET_STEP = "targetStep"; 48 49 protected final static String TRIGGER_IMAGE = "image"; 50 protected final static URI TEXTFIELD = new URIValue("textfield"); 51 protected final static URI TEXTAREA = new URIValue("textarea"); 52 protected final static URI LISTBOX = new URIValue("listbox"); 53 protected final static URI COMBOBOX = new URIValue("combobox"); 54 protected final static URI CHECKBOX = new URIValue("checkbox"); 55 protected final static URI ERRORS_TABLE = new URIValue("errors"); 56 protected final static URI TRIGGER_URI = new URIValue("textTrigger"); 57 protected final static URI DEFAULT_TRIGGER_IMAGE = new URIValue("/files/contelligent/images/ok.gif"); 58 protected final static URI DEFAULT_CONTROL_CONTAINER = new URIValue("bigControl"); 59 protected final static URI DEFAULT_TRIGGER_CONTAINER = new URIValue("triggerContainer"); 60 protected final static URI DEFAULT_ERROR_RENDERER = new URIValue("errors"); 61 62 protected final static String PROCESSOR_NAME = "processor-name"; 63 protected final static String PROCESSOR_TITLE = "processor-title"; 64 protected final static String PROCESSOR_TEXT = "processor-text"; 65 protected final static String PROCESSOR_SMALL_ICON = "processor-small-icon"; 66 protected final static String PROCESSOR_LARGE_ICON = "processor-large-icon"; 67 68 protected final static String STYLE = "style"; 69 protected final static String ORANGE_STYLE = "style.html"; 70 protected final static String LAUNCH_PROCESSOR = "trigger:launch"; 71 72 private ParameterDescriptor[] parameterDescriptors; 73 74 public FormGenerator() { 75 super(); 76 } 77 78 public Result process(Map parameter, Context context) throws Exception { 79 URI actionUri = (URIValue)parameter.get(Control.ACTION); 80 Processor action = ProcessorManager.getInstance().getProcessor(actionUri); 81 Locale locale = ((LocaleValue)parameter.get(LOCALE)).getLocale(); 82 ParameterDescriptor []actionParameterDescriptors = action.getParameterDescriptors(); 83 StringBuffer buffer = new StringBuffer (); 84 List controlDescriptors = new ArrayList (); 85 for (int i = 0; i < actionParameterDescriptors.length; i++) { 87 String parameterName = actionParameterDescriptors[i].getName(); 88 MapValue controlDescriptor = new MapValue(); 89 controlDescriptor.getMap().put(Control.ACTION, actionUri); 90 controlDescriptor.getMap().put(Control.PARAMETER, parameterName); 91 controlDescriptor.getMap().put(CONTROL, getControlURI(actionParameterDescriptors[i].getValueDescriptor())); 92 controlDescriptor.getMap().put(CONTROL_CONTAINER, DEFAULT_CONTROL_CONTAINER); 93 controlDescriptor.getMap().put(CONTROL_NAME, parameterName); 94 controlDescriptors.add(controlDescriptor); 95 } 96 parameter.put(CONTROL_DESCRIPTIONS, new ArrayValue((Value[])controlDescriptors.toArray(new Value[controlDescriptors.size()]))); 97 98 MapValue triggerDescriptor = new MapValue(); 100 triggerDescriptor.getMap().put(Trigger.ACTION, actionUri); 101 triggerDescriptor.getMap().put(Trigger.VALIDATE, BooleanValue.TRUE); 102 triggerDescriptor.getMap().put(Trigger.INVOLVED_PARAMETERS, NullValue.NULL); 103 triggerDescriptor.getMap().put(Process.STEP, parameter.get(TARGET_STEP)); 104 triggerDescriptor.getMap().put(TRIGGER, TRIGGER_URI); 105 triggerDescriptor.getMap().put(TRIGGER_NAME, LAUNCH_PROCESSOR); 106 triggerDescriptor.getMap().put(TRIGGER_IMAGE, ProcessorManager.getInstance().process(ProcessorManager.BINARY, DEFAULT_TRIGGER_IMAGE, "url", context)); 107 triggerDescriptor.getMap().put(TRIGGER_CONTAINER, DEFAULT_TRIGGER_CONTAINER); 108 parameter.put(TRIGGER_DESCRIPTIONS, new ArrayValue(new Value[] { triggerDescriptor })); 109 parameter.put(ERRORS_PROCESSOR, DEFAULT_ERROR_RENDERER); 110 111 parameter.put(HANDLER, ProcessorManager.getInstance().process(ProcessorManager.URL, Constants.DEFAULT_FORM_HANDLER, context)); 112 parameter.put(METHOD, new StringValue(POST)); 113 Result controlComposerResult = super.process(parameter, context); 114 StringBuffer controlBuffer = new StringBuffer (); 115 Value []generatedControls = ((ArrayValue)controlComposerResult.getResultEntries().get(ControlComposer.GENERATED_CONTROLS)).getArray(); 116 for ( int i = 0; i < generatedControls.length; i++ ) { 117 Iterator j = ((MapValue)generatedControls[i]).getMap().values().iterator(); 118 StringValue renderedControl = (StringValue)j.next(); 119 buffer.append(renderedControl.toString()); 120 } 121 StringValue composedControls = new StringValue(buffer.toString()); 122 parameter.put(CONTROLS, composedControls); 123 StringBuffer triggerBuffer = new StringBuffer (); 124 Value []generatedTriggers = ((ArrayValue)controlComposerResult.getResultEntries().get(ControlComposer.GENERATED_TRIGGERS)).getArray(); 125 for ( int i = 0; i < generatedTriggers.length; i++ ) { 126 Iterator j = ((MapValue)generatedTriggers[i]).getMap().values().iterator(); 127 StringValue renderedTrigger = (StringValue)j.next(); 128 triggerBuffer.append(renderedTrigger.toString()); 129 } 130 StringValue composedTriggers= new StringValue(triggerBuffer.toString()); 131 parameter.put(TRIGGERS, composedTriggers); 132 ProcessorDescriptor processorDescriptor = ProcessorManager.getInstance().getProcessorDescriptor(actionUri); 133 parameter.put(PROCESSOR_NAME, processorDescriptor.getName()); 134 parameter.put(PROCESSOR_TITLE, ((DefaultMessage)processorDescriptor.getDescription()).getTitle(locale, processorDescriptor.getName())); 135 parameter.put(PROCESSOR_TEXT, ((DefaultMessage)processorDescriptor.getDescription()).getText(locale, "")); 136 parameter.put(PROCESSOR_LARGE_ICON, ProcessorManager.getInstance().process(ProcessorManager.BINARY, processorDescriptor.getLargeIcon(), "url", context)); 137 parameter.put(PROCESSOR_SMALL_ICON, ProcessorManager.getInstance().process(ProcessorManager.BINARY, processorDescriptor.getSmallIcon(), "url", context)); 138 parameter.put(TITLE, processorDescriptor.getName()); 139 parameter.put(STYLE, ((HttpContext)context).getContextPath() + ORANGE_STYLE); 140 parameter.put(ERRORS, controlComposerResult.getResultEntries().get(ControlComposer.RENDERED_ERRORS)); 141 parameter.put(ERRORS_TITLE, "Fehler:"); 142 Template template = defaultTemplate; 143 String state = controlComposerResult.getState(); 144 if ( state == VALID_STATE && validTemplate != null ) { 145 template = validTemplate; 146 } else if ( state == INVALID_STATE && invalidTemplate != null ) { 147 template = invalidTemplate; 148 } 149 return new Result(state, OUTPUT, renderFragment(template, parameter)); 150 } 151 152 public void configure(StreamableValue config) throws ConfigurationException { 153 super.configure(config); 154 parameterDescriptors = new ParameterDescriptor[] { 155 new ParameterDescriptor(ACTION, new ParameterMessage("formGenerator/action"), new URIValueDescriptor()), 156 new ParameterDescriptor(LOCALE, new ParameterMessage("formGenerator/locale"), new LocaleValueDescriptor(), new LocaleValue(Locale.getDefault())), 157 new ParameterDescriptor(TARGET_STEP, new ParameterMessage("formGenerator/targetStep"), new StringValueDescriptor()) 158 }; 159 try { 160 defaultTemplate = getRequiredFragment(DEFAULT_FORM); 161 } catch ( ProcessException exception ) { 162 throw new ConfigurationException(new ErrorMessage("form/defaultFragmentMissing")); 163 } 164 validTemplate = getOptionalFragment(VALID_FORM); 165 invalidTemplate = getOptionalFragment(INVALID_FORM); 166 } 167 168 public ParameterDescriptor[] getParameterDescriptors() { 169 return parameterDescriptors; 170 } 171 172 public static URI getControlURI(ValueDescriptor descriptor) { 173 if ( descriptor instanceof ArrayValueDescriptor ) { 174 return LISTBOX; 175 } 176 if ( descriptor instanceof StringValueDescriptor ) { 177 if ( ((StringValueDescriptor)descriptor).isEnumrable() ) { 178 return COMBOBOX; 179 } else if ( ((StringValueDescriptor)descriptor).getMaximumLength() < 256 ) { 180 return TEXTFIELD; 181 } else { 182 return TEXTAREA; 183 } 184 } 185 if ( descriptor instanceof BooleanValueDescriptor ) { 186 return CHECKBOX; 187 } 188 if ( descriptor instanceof NumberValueDescriptor ) { 189 if ( ((NumberValueDescriptor)descriptor).isConstrained() ) { 190 return COMBOBOX; 191 } 192 return TEXTFIELD; 193 } 194 return TEXTFIELD; 195 } 196 } | Popular Tags |