KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > apache > cocoon > woody > formmodel > AggregateFieldDefinitionBuilder


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.woody.formmodel;
17
18 import org.apache.cocoon.woody.Constants;
19 import org.apache.cocoon.woody.util.DomHelper;
20 import org.apache.excalibur.xml.sax.XMLizable;
21 import org.apache.oro.text.regex.MalformedPatternException;
22 import org.apache.oro.text.regex.Pattern;
23 import org.apache.oro.text.regex.Perl5Compiler;
24
25 import org.outerj.expression.Expression;
26 import org.w3c.dom.Element JavaDoc;
27
28 import java.util.HashSet JavaDoc;
29
30 /**
31  * Builds {@link AggregateFieldDefinition}s.
32  *
33  * @version $Id: AggregateFieldDefinitionBuilder.java 30932 2004-07-29 17:35:38Z vgritsenko $
34  */

35 public class AggregateFieldDefinitionBuilder extends FieldDefinitionBuilder {
36
37     public WidgetDefinition buildWidgetDefinition(Element JavaDoc widgetElement) throws Exception JavaDoc {
38         AggregateFieldDefinition aggregateDefinition = new AggregateFieldDefinition();
39         buildWidgetDefinition(aggregateDefinition, widgetElement);
40
41         // make children fields
42
Element JavaDoc widgetsElement = DomHelper.getChildElement(widgetElement, Constants.WD_NS, "widgets", true);
43         Element JavaDoc[] fieldElements = DomHelper.getChildElements(widgetsElement, Constants.WD_NS, "field");
44         for (int i = 0; i < fieldElements.length; i++) {
45             FieldDefinition fieldDefinition = (FieldDefinition)buildAnotherWidgetDefinition(fieldElements[i]);
46             aggregateDefinition.addWidgetDefinition(fieldDefinition);
47         }
48
49         // compile splitpattern
50
Element JavaDoc splitElement = DomHelper.getChildElement(widgetElement, Constants.WD_NS, "split", true);
51         String JavaDoc patternString = DomHelper.getAttribute(splitElement, "pattern");
52         Perl5Compiler compiler = new Perl5Compiler();
53         Pattern pattern = null;
54         try {
55             pattern = compiler.compile(patternString, Perl5Compiler.READ_ONLY_MASK);
56         } catch (MalformedPatternException e) {
57             throw new Exception JavaDoc("Invalid regular expression at " + DomHelper.getLocation(splitElement) + ": " + e.getMessage());
58         }
59         aggregateDefinition.setSplitPattern(pattern, patternString);
60
61         // read split mappings
62
Element JavaDoc[] mapElements = DomHelper.getChildElements(splitElement, Constants.WD_NS, "map");
63         HashSet JavaDoc encounteredFieldMappings = new HashSet JavaDoc();
64         for (int i = 0; i < mapElements.length; i++) {
65             int group = DomHelper.getAttributeAsInteger(mapElements[i], "group");
66             String JavaDoc field = DomHelper.getAttribute(mapElements[i], "field");
67             // check that this field exists
68
if (!aggregateDefinition.hasWidget(field)) {
69                 throw new Exception JavaDoc("Unkwon widget id \"" + field + "\", at " +
70                                     DomHelper.getLocation(mapElements[i]));
71             }
72             if (encounteredFieldMappings.contains(field)) {
73                 throw new Exception JavaDoc("Two groups are mapped to the same widget id \"" + field + "\", at " +
74                                     DomHelper.getLocation(mapElements[i]));
75             }
76             encounteredFieldMappings.add(field);
77             aggregateDefinition.addSplitMapping(group, field);
78         }
79
80         // read split fail message (if any)
81
Element JavaDoc failMessageElement = DomHelper.getChildElement(splitElement, Constants.WD_NS, "failmessage");
82         if (failMessageElement != null) {
83             XMLizable failMessage = DomHelper.compileElementContent(failMessageElement);
84             aggregateDefinition.setSplitFailMessage(failMessage);
85         }
86
87         // compile combine expression
88
Element JavaDoc combineElement = DomHelper.getChildElement(widgetElement, Constants.WD_NS, "combine", true);
89         String JavaDoc combineExprString = DomHelper.getAttribute(combineElement, "expression");
90         Expression combineExpr = null;
91         try {
92             combineExpr = expressionManager.parse(combineExprString);
93         } catch (Exception JavaDoc e) {
94             throw new Exception JavaDoc("Problem with combine expression defined at " +
95                                 DomHelper.getLocation(combineElement) + ": " + e.getMessage());
96         }
97         Class JavaDoc clazz = aggregateDefinition.getDatatype().getTypeClass();
98         if (combineExpr.getResultType() != null && !clazz.isAssignableFrom(combineExpr.getResultType())) {
99             throw new Exception JavaDoc("The result of the combine expression should be " + clazz.getName() + ", at " +
100                                 DomHelper.getLocation(combineElement));
101         }
102         aggregateDefinition.setCombineExpression(combineExpr);
103
104         return aggregateDefinition;
105     }
106 }
107
Popular Tags