001: /*
002: * Copyright 2004-2006 Fouad HAMDI.
003: *
004: * Licensed under the Apache License, Version 2.0 (the "License");
005: * you may not use this file except in compliance with the License.
006: * You may obtain a copy of the License at
007: *
008: * http://www.apache.org/licenses/LICENSE-2.0
009: *
010: * Unless required by applicable law or agreed to in writing, software
011: * distributed under the License is distributed on an "AS IS" BASIS,
012: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013: * See the License for the specific language governing permissions and
014: * limitations under the License.
015: */
016: package org.csvbeans.specs;
017:
018: import java.io.BufferedInputStream;
019: import java.io.FileInputStream;
020: import java.io.FileNotFoundException;
021: import java.io.IOException;
022: import java.io.InputStream;
023:
024: import org.apache.commons.digester.Digester;
025: import org.csvbeans.utils.MessagesBundle;
026: import org.xml.sax.SAXException;
027:
028: /**
029: * Parse a specifications file using commons-digester
030: *
031: * @author Fouad Hamdi
032: * @since 0.7
033: */
034: public class SpecificationsFileParser {
035: private boolean validate;
036:
037: /**
038: * Default constructor.
039: */
040: public SpecificationsFileParser() {
041: }
042:
043: /**
044: * Parse an XML specifications file.
045: */
046: public SpecificationsFile parse(String name)
047: throws SpecificationsFileException {
048: try {
049: return parse(new BufferedInputStream(new FileInputStream(
050: name)));
051: } catch (FileNotFoundException e) {
052: throw new SpecificationsFileException(MessagesBundle
053: .getMessage("specifications.not.found", name), e);
054: }
055: }
056:
057: /**
058: * Parse an XML specifications file.
059: */
060: public SpecificationsFile parse(InputStream is)
061: throws SpecificationsFileException {
062: try {
063: Digester digester = new Digester();
064: digester.setValidating(isValidate());
065: initPropertiesRules(digester);
066: initStrategiesRules(digester);
067: initFieldRules(digester);
068: initChildrenRules(digester);
069: initConverterRules(digester);
070: initValidatorRules(digester);
071: return (SpecificationsFile) digester.parse(is);
072: } catch (IOException e) {
073: throw new SpecificationsFileException(MessagesBundle
074: .getMessage("error.io.reading"), e);
075: } catch (SAXException e) {
076: throw new SpecificationsFileException(MessagesBundle
077: .getMessage("xml.error"), e);
078: }
079: }
080:
081: /**
082: */
083: private void initChildrenRules(Digester digester) {
084: digester.addObjectCreate("csvbeans/record/children/child",
085: "org.csvbeans.specs.ChildSpecificationImpl");
086: digester.addSetProperties("csvbeans/record/children/child");
087: digester.addSetNext("csvbeans/record/children/child",
088: "addChild");
089:
090: digester.addObjectCreate("*/bean/children/child",
091: "org.csvbeans.specs.ChildSpecificationImpl");
092: digester.addSetProperties("*/bean/children/child");
093: digester.addSetNext("*/bean/children/child", "addChild");
094: }
095:
096: /**
097: */
098: private void initFieldRules(Digester digester) {
099: digester.addObjectCreate("csvbeans/header",
100: "org.csvbeans.specs.BeanSpecificationImpl");
101: digester.addSetProperties("csvbeans/header");
102: digester.addSetNext("csvbeans/header", "setHeader");
103: digester.addObjectCreate("csvbeans/record",
104: "org.csvbeans.specs.RecordSpecificationImpl");
105: digester.addSetProperties("csvbeans/record");
106: digester.addSetNext("csvbeans/record", "addRecord");
107: digester.addObjectCreate("*/bean",
108: "org.csvbeans.specs.BeanSpecificationImpl");
109: digester.addSetProperties("*/bean");
110: digester.addSetNext("*/bean", "addField");
111: digester.addObjectCreate("*/field",
112: "org.csvbeans.specs.FieldSpecificationImpl");
113: digester.addSetProperties("*/field");
114: digester.addSetNext("*/field", "addField");
115: digester.addCallMethod("*/field/authorized-values/value",
116: "addAuthorizedValue", 0);
117: digester.addObjectCreate("*/constant",
118: "org.csvbeans.specs.FieldSpecificationImpl");
119: digester.addSetProperties("*/constant");
120: digester.addSetNext("*/constant", "addConstant");
121: }
122:
123: /**
124: */
125: private void initConverterRules(Digester digester) {
126: digester.addObjectCreate("csvbeans/converters/converter",
127: "org.csvbeans.specs.ConverterSpecificationImpl");
128: digester.addSetProperties("csvbeans/converters/converter");
129: digester.addObjectCreate(
130: "csvbeans/converters/converter/property",
131: "org.csvbeans.specs.PropertySpecificationImpl");
132: digester
133: .addSetProperties("csvbeans/converters/converter/property");
134: digester.addSetNext("csvbeans/converters/converter/property",
135: "addProperty");
136: digester.addSetRoot("csvbeans/converters/converter",
137: "addConverterSpecification");
138:
139: digester.addObjectCreate("*/field/converter",
140: "org.csvbeans.specs.ConverterSpecificationImpl");
141: digester.addSetProperties("*/field/converter");
142: digester.addObjectCreate("*/field/converter/property",
143: "org.csvbeans.specs.PropertySpecificationImpl");
144: digester.addSetProperties("*/field/converter/property");
145: digester
146: .addSetNext("*/field/converter/property", "addProperty");
147: digester.addSetNext("*/field/converter",
148: "setConverterSpecification");
149: digester.addSetRoot("*/field/converter",
150: "addConverterSpecification");
151: }
152:
153: /**
154: */
155: private void initValidatorRules(Digester digester) {
156: digester.addObjectCreate("*/field/validators/validator",
157: "org.csvbeans.specs.ValidatorSpecificationImpl");
158: digester.addSetProperties("*/field/validators/validator");
159: digester.addObjectCreate(
160: "*/field/validators/validator/property",
161: "org.csvbeans.specs.PropertySpecificationImpl");
162: digester
163: .addSetProperties("*/field/validators/validator/property");
164: digester.addSetNext("*/field/validators/validator/property",
165: "addProperty");
166: digester.addSetNext("*/field/validators/validator",
167: "addValidatorSpecification");
168: digester.addSetRoot("*/field/validators/validator",
169: "addValidatorSpecification");
170: }
171:
172: /**
173: */
174: private void initStrategiesRules(Digester digester) {
175: digester.addObjectCreate("csvbeans/strategy/parser",
176: "org.csvbeans.specs.ParserSpecificationsImpl");
177: digester.addSetProperties("csvbeans/strategy/parser");
178: digester.addSetNext("csvbeans/strategy/parser",
179: "setParserSpecifications");
180: digester.addObjectCreate("csvbeans/strategy/parser/property",
181: "org.csvbeans.specs.PropertySpecificationImpl");
182: digester.addSetProperties("csvbeans/strategy/parser/property");
183: digester.addSetNext("csvbeans/strategy/parser/property",
184: "addProperty");
185: digester.addObjectCreate("csvbeans/strategy/builder",
186: "org.csvbeans.specs.BuilderSpecificationImpl");
187: digester.addSetProperties("csvbeans/strategy/builder");
188: digester.addSetNext("csvbeans/strategy/builder",
189: "setBuilderSpecifications");
190: digester.addObjectCreate("csvbeans/strategy/builder/property",
191: "org.csvbeans.specs.PropertySpecificationImpl");
192: digester.addSetProperties("csvbeans/strategy/builder/property");
193: digester.addSetNext("csvbeans/strategy/builder/property",
194: "addProperty");
195: digester.addObjectCreate("csvbeans/strategy/context",
196: "org.csvbeans.specs.ContextSpecification");
197: digester.addSetProperties("csvbeans/strategy/context/property");
198: digester.addSetNext("csvbeans/strategy/builder/property",
199: "addProperty");
200:
201: }
202:
203: /**
204: */
205: private void initPropertiesRules(Digester digester) {
206: digester.addObjectCreate("csvbeans",
207: "org.csvbeans.specs.SpecificationsFileImpl");
208: digester.addObjectCreate("csvbeans/property",
209: "org.csvbeans.specs.PropertySpecificationImpl");
210: digester.addSetProperties("csvbeans/property");
211: digester.addSetNext("csvbeans/property", "addProperty");
212: }
213:
214: /**
215: * @return Returns the validate.
216: */
217: public boolean isValidate() {
218: return validate;
219: }
220:
221: /**
222: * @param validate The validate to set.
223: */
224: public void setValidate(boolean validate) {
225: this.validate = validate;
226: }
227: }
|