1 16 package org.apache.cocoon.forms.formmodel; 17 18 import java.util.Iterator ; 19 import java.util.Locale ; 20 21 import org.apache.avalon.framework.service.ServiceSelector; 22 import org.apache.cocoon.forms.FormsConstants; 23 import org.apache.cocoon.forms.datatype.Datatype; 24 import org.apache.cocoon.forms.datatype.SelectionList; 25 import org.apache.cocoon.forms.datatype.SelectionListBuilder; 26 import org.apache.cocoon.forms.datatype.convertor.ConversionResult; 27 import org.apache.cocoon.forms.event.ValueChangedListener; 28 import org.apache.cocoon.forms.util.DomHelper; 29 import org.apache.cocoon.i18n.I18nUtils; 30 import org.w3c.dom.Element ; 31 32 37 public abstract class AbstractDatatypeWidgetDefinitionBuilder extends AbstractWidgetDefinitionBuilder { 38 39 protected void setupDefinition(Element widgetElement, AbstractDatatypeWidgetDefinition definition) throws Exception { 40 super.setupDefinition(widgetElement, definition); 41 setDisplayData(widgetElement, definition); 43 44 Iterator iter = buildEventListeners(widgetElement, "on-value-changed", ValueChangedListener.class).iterator(); 46 while (iter.hasNext()) { 47 definition.addValueChangedListener((ValueChangedListener)iter.next()); 48 } 49 50 Element datatypeElement = DomHelper.getChildElement(widgetElement, FormsConstants.DEFINITION_NS, "datatype"); 52 if (datatypeElement != null) { 53 Datatype datatype = datatypeManager.createDatatype(datatypeElement, false); 54 55 Object initialValue = null; 57 Element initialValueElement = DomHelper.getChildElement(widgetElement, FormsConstants.DEFINITION_NS, "initial-value", false); 58 if (initialValueElement != null) { 59 String localeValue = DomHelper.getAttribute(initialValueElement, "locale", null); 60 Locale locale = localeValue == null ? null : I18nUtils.parseLocale(localeValue); 61 String value = DomHelper.getElementText(initialValueElement); 62 ConversionResult result = datatype.convertFromString(value, locale); 63 if (!result.isSuccessful()) { 64 throw new Exception ("Cannot parse initial value '" + value + "' at " + 65 DomHelper.getLocation(initialValueElement)); 66 } 67 initialValue = result.getResult(); 68 } 69 70 definition.setDatatype(datatype, initialValue); 71 } 72 73 74 definition.service(this.serviceManager); 78 79 SelectionList list = buildSelectionList(widgetElement, definition, "selection-list"); 80 if (list != null) { 81 definition.setSelectionList(list); 82 } 83 } 84 85 protected SelectionList buildSelectionList( 86 Element widgetElement, AbstractDatatypeWidgetDefinition definition, String name) throws Exception { 87 Element selectionListElement = DomHelper.getChildElement(widgetElement, FormsConstants.DEFINITION_NS, name); 88 89 if(selectionListElement != null && definition.getDatatype() == null) 90 throw new Exception ("A widget with a selection list always requires a datatype as well! (at "+DomHelper.getLocation(selectionListElement)+" )"); 91 92 if (selectionListElement == null) 93 return null; 94 95 ServiceSelector builderSelector = (ServiceSelector)this.serviceManager.lookup(SelectionListBuilder.ROLE + "Selector"); 97 SelectionListBuilder builder = null; 98 try { 99 String listType = selectionListElement.getAttribute("type"); 101 if ("".equals(listType)) { 102 listType = null; 103 } 104 105 builder = (SelectionListBuilder)builderSelector.select(listType); 106 return builder.build(selectionListElement, definition.getDatatype()); 107 108 } finally { 109 if (builder != null) { 110 builderSelector.release(builder); 111 } 112 this.serviceManager.release(builderSelector); 113 } 114 } 115 } 116 | Popular Tags |