1 16 package org.apache.cocoon.woody.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.cocoon.woody.Constants; 25 import org.apache.cocoon.woody.datatype.DatatypeBuilder; 26 import org.apache.cocoon.woody.datatype.DatatypeManager; 27 import org.apache.cocoon.woody.datatype.ValidationRule; 28 import org.apache.cocoon.woody.datatype.convertor.Convertor; 29 import org.apache.cocoon.woody.datatype.convertor.ConvertorBuilder; 30 import org.apache.cocoon.woody.util.DomHelper; 31 import org.apache.cocoon.woody.util.SimpleServiceSelector; 32 import org.w3c.dom.Element ; 33 34 39 public abstract class AbstractDatatypeBuilder implements DatatypeBuilder, Serviceable, Configurable { 40 protected ServiceManager serviceManager; 41 private SimpleServiceSelector convertorBuilders; 42 private String defaultConvertorHint; 43 private Convertor plainConvertor; 44 45 public void service(ServiceManager serviceManager) throws ServiceException { 46 this.serviceManager = serviceManager; 47 } 48 49 public void configure(Configuration configuration) throws ConfigurationException { 50 convertorBuilders = new SimpleServiceSelector("convertor", ConvertorBuilder.class); 51 Configuration convertorsConf = configuration.getChild("convertors"); 52 convertorBuilders.configure(convertorsConf); 53 defaultConvertorHint = convertorsConf.getAttribute("default"); 54 55 String plainConvertorHint = convertorsConf.getAttribute("plain"); 56 ConvertorBuilder plainConvertorBuilder; 57 try { 58 plainConvertorBuilder = (ConvertorBuilder)convertorBuilders.select(plainConvertorHint); 59 } catch (ServiceException e) { 60 throw new ConfigurationException("Convertor defined in plain attribute unavailable.", e); 61 } 62 63 try { 64 plainConvertor = plainConvertorBuilder.build(null); 65 } catch (Exception e) { 66 throw new ConfigurationException("Error create plain convertor.", e); 67 } 68 } 69 70 public void buildConvertor(Element datatypeEl, AbstractDatatype datatype) throws Exception { 71 Element convertorEl = DomHelper.getChildElement(datatypeEl, Constants.WD_NS, "convertor", false); 72 Convertor convertor = buildConvertor(convertorEl); 73 datatype.setConvertor(convertor); 74 } 75 76 public Convertor buildConvertor(Element convertorEl) throws Exception { 77 String type = null; 78 if (convertorEl != null) 80 type = convertorEl.getAttribute("type"); 81 if (type == null || type.equals("")) 82 type = defaultConvertorHint; 83 ConvertorBuilder convertorBuilder = (ConvertorBuilder)convertorBuilders.select(type); 84 return convertorBuilder.build(convertorEl); 85 } 86 87 public Convertor getPlainConvertor() { 88 return plainConvertor; 89 } 90 91 protected void buildValidationRules(Element datatypeElement, AbstractDatatype datatype, DatatypeManager datatypeManager) throws Exception { 92 Element validationElement = DomHelper.getChildElement(datatypeElement, Constants.WD_NS, "validation"); 93 if (validationElement != null) { 94 Element [] validationElements = DomHelper.getChildElements(validationElement, Constants.WD_NS); 95 for (int i = 0; i < validationElements.length; i++) { 96 ValidationRule rule = datatypeManager.createValidationRule(validationElements[i]); 97 if (rule.supportsType(datatype.getTypeClass(), datatype.isArrayType())) { 98 datatype.addValidationRule(rule); 99 } else { 100 throw new Exception ("Validation rule \"" + validationElements[i].getLocalName() + "\" cannot be used with strings, error at " + DomHelper.getLocation(validationElements[i])); 101 } 102 } 103 } 104 } 105 } 106 | Popular Tags |