1 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 ; 27 28 import java.util.HashSet ; 29 30 35 public class AggregateFieldDefinitionBuilder extends FieldDefinitionBuilder { 36 37 public WidgetDefinition buildWidgetDefinition(Element widgetElement) throws Exception { 38 AggregateFieldDefinition aggregateDefinition = new AggregateFieldDefinition(); 39 buildWidgetDefinition(aggregateDefinition, widgetElement); 40 41 Element widgetsElement = DomHelper.getChildElement(widgetElement, Constants.WD_NS, "widgets", true); 43 Element [] 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 Element splitElement = DomHelper.getChildElement(widgetElement, Constants.WD_NS, "split", true); 51 String 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 ("Invalid regular expression at " + DomHelper.getLocation(splitElement) + ": " + e.getMessage()); 58 } 59 aggregateDefinition.setSplitPattern(pattern, patternString); 60 61 Element [] mapElements = DomHelper.getChildElements(splitElement, Constants.WD_NS, "map"); 63 HashSet encounteredFieldMappings = new HashSet (); 64 for (int i = 0; i < mapElements.length; i++) { 65 int group = DomHelper.getAttributeAsInteger(mapElements[i], "group"); 66 String field = DomHelper.getAttribute(mapElements[i], "field"); 67 if (!aggregateDefinition.hasWidget(field)) { 69 throw new Exception ("Unkwon widget id \"" + field + "\", at " + 70 DomHelper.getLocation(mapElements[i])); 71 } 72 if (encounteredFieldMappings.contains(field)) { 73 throw new Exception ("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 Element 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 Element combineElement = DomHelper.getChildElement(widgetElement, Constants.WD_NS, "combine", true); 89 String combineExprString = DomHelper.getAttribute(combineElement, "expression"); 90 Expression combineExpr = null; 91 try { 92 combineExpr = expressionManager.parse(combineExprString); 93 } catch (Exception e) { 94 throw new Exception ("Problem with combine expression defined at " + 95 DomHelper.getLocation(combineElement) + ": " + e.getMessage()); 96 } 97 Class clazz = aggregateDefinition.getDatatype().getTypeClass(); 98 if (combineExpr.getResultType() != null && !clazz.isAssignableFrom(combineExpr.getResultType())) { 99 throw new Exception ("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 |