1 16 package org.apache.cocoon.forms.datatype.typeimpl; 17 18 import org.apache.avalon.framework.configuration.Configurable; 19 import org.apache.avalon.framework.configuration.Configuration; 20 import org.apache.avalon.framework.configuration.ConfigurationException; 21 import org.apache.avalon.framework.service.ServiceException; 22 import org.apache.avalon.framework.service.ServiceManager; 23 import org.apache.avalon.framework.service.Serviceable; 24 import org.apache.avalon.framework.context.Contextualizable; 25 import org.apache.avalon.framework.context.Context; 26 import org.apache.avalon.framework.context.ContextException; 27 import org.apache.avalon.framework.logger.AbstractLogEnabled; 28 import org.apache.cocoon.forms.FormsConstants; 29 import org.apache.cocoon.forms.datatype.DatatypeBuilder; 30 import org.apache.cocoon.forms.datatype.DatatypeManager; 31 import org.apache.cocoon.forms.datatype.ValidationRule; 32 import org.apache.cocoon.forms.datatype.convertor.Convertor; 33 import org.apache.cocoon.forms.datatype.convertor.ConvertorBuilder; 34 import org.apache.cocoon.forms.util.DomHelper; 35 import org.apache.cocoon.forms.util.SimpleServiceSelector; 36 import org.w3c.dom.Element ; 37 38 43 public abstract class AbstractDatatypeBuilder extends AbstractLogEnabled implements DatatypeBuilder, Serviceable, Configurable, Contextualizable { 44 protected ServiceManager serviceManager; 45 private SimpleServiceSelector convertorBuilders; 46 private String defaultConvertorHint; 47 private Convertor plainConvertor; 48 private Context context; 49 50 public void service(ServiceManager serviceManager) throws ServiceException { 51 this.serviceManager = serviceManager; 52 } 53 54 public void contextualize(Context context) throws ContextException { 55 this.context = context; 56 } 57 58 public void configure(Configuration configuration) throws ConfigurationException { 59 convertorBuilders = new SimpleServiceSelector("convertor", ConvertorBuilder.class); 60 try { 61 convertorBuilders.enableLogging(getLogger()); 62 convertorBuilders.contextualize(context); 63 convertorBuilders.service(serviceManager); 64 } catch (Exception e) { 65 throw new ConfigurationException("Error setting up convertor builder selector.", e); 66 } 67 Configuration convertorsConf = configuration.getChild("convertors"); 68 convertorBuilders.configure(convertorsConf); 69 defaultConvertorHint = convertorsConf.getAttribute("default"); 70 71 String plainConvertorHint = convertorsConf.getAttribute("plain"); 72 ConvertorBuilder plainConvertorBuilder; 73 try { 74 plainConvertorBuilder = (ConvertorBuilder)convertorBuilders.select(plainConvertorHint); 75 } catch (ServiceException e) { 76 throw new ConfigurationException("Convertor defined in plain attribute unavailable.", e); 77 } 78 79 try { 80 plainConvertor = plainConvertorBuilder.build(null); 81 } catch (Exception e) { 82 throw new ConfigurationException("Error create plain convertor.", e); 83 } 84 } 85 86 public void buildConvertor(Element datatypeEl, AbstractDatatype datatype) throws Exception { 87 Element convertorEl = DomHelper.getChildElement(datatypeEl, FormsConstants.DEFINITION_NS, "convertor", false); 88 Convertor convertor = buildConvertor(convertorEl); 89 datatype.setConvertor(convertor); 90 } 91 92 public Convertor buildConvertor(Element convertorEl) throws Exception { 93 String type = null; 94 if (convertorEl != null) 96 type = convertorEl.getAttribute("type"); 97 if (type == null || type.equals("")) 98 type = defaultConvertorHint; 99 ConvertorBuilder convertorBuilder = (ConvertorBuilder)convertorBuilders.select(type); 100 return convertorBuilder.build(convertorEl); 101 } 102 103 public Convertor getPlainConvertor() { 104 return plainConvertor; 105 } 106 107 protected void buildValidationRules(Element datatypeElement, AbstractDatatype datatype, DatatypeManager datatypeManager) throws Exception { 108 Element validationElement = DomHelper.getChildElement(datatypeElement, FormsConstants.DEFINITION_NS, "validation"); 109 if (validationElement != null) { 110 Element [] validationElements = DomHelper.getChildElements(validationElement, FormsConstants.DEFINITION_NS); 111 for (int i = 0; i < validationElements.length; i++) { 112 ValidationRule rule = datatypeManager.createValidationRule(validationElements[i]); 113 if (rule.supportsType(datatype.getTypeClass(), datatype.isArrayType())) { 114 datatype.addValidationRule(rule); 115 } else { 116 throw new Exception ("Validation rule \"" + validationElements[i].getLocalName() + "\" cannot be used with strings, error at " + DomHelper.getLocation(validationElements[i])); 117 } 118 } 119 } 120 } 121 } 122 | Popular Tags |