1 16 package org.apache.cocoon.forms.datatype; 17 18 import org.apache.avalon.framework.thread.ThreadSafe; 19 import org.apache.avalon.framework.configuration.Configurable; 20 import org.apache.avalon.framework.configuration.Configuration; 21 import org.apache.avalon.framework.configuration.ConfigurationException; 22 import org.apache.avalon.framework.logger.AbstractLogEnabled; 23 import org.apache.avalon.framework.service.ServiceException; 24 import org.apache.avalon.framework.service.Serviceable; 25 import org.apache.avalon.framework.service.ServiceManager; 26 import org.apache.avalon.framework.activity.Initializable; 27 import org.apache.avalon.framework.activity.Disposable; 28 import org.apache.avalon.framework.CascadingException; 29 import org.apache.avalon.framework.context.Contextualizable; 30 import org.apache.avalon.framework.context.Context; 31 import org.apache.avalon.framework.context.ContextException; 32 import org.apache.cocoon.forms.datatype.convertor.Convertor; 33 import org.apache.cocoon.forms.util.DomHelper; 34 import org.apache.cocoon.forms.util.SimpleServiceSelector; 35 import org.w3c.dom.Element ; 36 37 48 public class DefaultDatatypeManager extends AbstractLogEnabled implements DatatypeManager, ThreadSafe, Serviceable, 49 Configurable, Initializable, Disposable, Contextualizable { 50 private SimpleServiceSelector typeBuilderSelector; 51 private SimpleServiceSelector validationRuleBuilderSelector; 52 private ServiceManager serviceManager; 53 private Configuration configuration; 54 private Context context; 55 56 public void contextualize(Context context) throws ContextException { 57 this.context = context; 58 } 59 60 public void configure(Configuration configuration) throws ConfigurationException { 61 this.configuration = configuration; 62 } 63 64 public void service(ServiceManager serviceManager) throws ServiceException { 65 this.serviceManager = serviceManager; 66 } 67 68 public void initialize() throws Exception { 69 typeBuilderSelector = new SimpleServiceSelector("datatype", DatatypeBuilder.class); 70 typeBuilderSelector.enableLogging(getLogger()); 71 typeBuilderSelector.contextualize(context); 72 typeBuilderSelector.service(serviceManager); 73 typeBuilderSelector.configure(configuration.getChild("datatypes")); 74 75 validationRuleBuilderSelector = new SimpleServiceSelector("validation-rule", ValidationRuleBuilder.class); 76 validationRuleBuilderSelector.enableLogging(getLogger()); 77 validationRuleBuilderSelector.contextualize(context); 78 validationRuleBuilderSelector.service(serviceManager); 79 validationRuleBuilderSelector.configure(configuration.getChild("validation-rules")); 80 81 configuration = null; 82 } 83 84 public Datatype createDatatype(Element datatypeElement, boolean arrayType) throws Exception { 85 String typeName = DomHelper.getAttribute(datatypeElement, "base"); 86 DatatypeBuilder builder = null; 87 try { 88 builder = (DatatypeBuilder)typeBuilderSelector.select(typeName); 89 } catch (ServiceException e) { 90 throw new CascadingException("Unknown datatype '" + typeName + "' specified at " + DomHelper.getLocation(datatypeElement), e); 91 } 92 return builder.build(datatypeElement, arrayType, this); 93 } 94 95 public ValidationRule createValidationRule(Element validationRuleElement) throws Exception { 96 String name = validationRuleElement.getLocalName(); 97 ValidationRuleBuilder builder = null; 98 try { 99 builder = (ValidationRuleBuilder)validationRuleBuilderSelector.select(name); 100 } catch (ServiceException e) { 101 throw new CascadingException("Unknown validation rule \"" + name + "\" specified at " + DomHelper.getLocation(validationRuleElement), e); 102 } 103 return builder.build(validationRuleElement); 104 } 105 106 public Convertor createConvertor(String dataTypeName, Element convertorElement) throws Exception { 107 DatatypeBuilder datatypeBulder = (DatatypeBuilder)typeBuilderSelector.select(dataTypeName); 108 return datatypeBulder.buildConvertor(convertorElement); 109 } 110 111 public void dispose() { 112 typeBuilderSelector.dispose(); 113 validationRuleBuilderSelector.dispose(); 114 } 115 } 116 | Popular Tags |