KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > apache > cocoon > forms > datatype > typeimpl > AbstractDatatypeBuilder


1 /*
2  * Copyright 1999-2004 The Apache Software Foundation.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */

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 JavaDoc;
37
38 /**
39  * Abstract base class for datatype builders, most concrete datatype builders
40  * will derive from this class.
41  * @version $Id: AbstractDatatypeBuilder.java 326838 2005-10-20 06:26:53Z sylvain $
42  */

43 public abstract class AbstractDatatypeBuilder extends AbstractLogEnabled implements DatatypeBuilder, Serviceable, Configurable, Contextualizable {
44     protected ServiceManager serviceManager;
45     private SimpleServiceSelector convertorBuilders;
46     private String JavaDoc 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 JavaDoc 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 JavaDoc 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 JavaDoc e) {
82             throw new ConfigurationException("Error create plain convertor.", e);
83         }
84     }
85
86     public void buildConvertor(Element JavaDoc datatypeEl, AbstractDatatype datatype) throws Exception JavaDoc {
87         Element JavaDoc 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 JavaDoc convertorEl) throws Exception JavaDoc {
93         String JavaDoc type = null;
94         // convertor configuration is allowed to be null, so check that it is not null
95
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 JavaDoc datatypeElement, AbstractDatatype datatype, DatatypeManager datatypeManager) throws Exception JavaDoc {
108         Element JavaDoc validationElement = DomHelper.getChildElement(datatypeElement, FormsConstants.DEFINITION_NS, "validation");
109         if (validationElement != null) {
110             Element JavaDoc[] 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 JavaDoc("Validation rule \"" + validationElements[i].getLocalName() + "\" cannot be used with strings, error at " + DomHelper.getLocation(validationElements[i]));
117                 }
118             }
119         }
120     }
121 }
122
Popular Tags