Author: sylvain Date: Mon Mar 21 22:54:56 2005 New Revision: 158557 URL: http://svn.apache.org/viewcvs?view=rev&rev=158557 Log: Fix XMLAdapter handling of MultiValueField and properly buffer character events
Modified: cocoon/branches/BRANCH_2_1_X/src/blocks/forms/java/org/apache/cocoon/forms/util/XMLAdapter.java Modified: cocoon/branches/BRANCH_2_1_X/src/blocks/forms/java/org/apache/cocoon/forms/util/XMLAdapter.java URL: http://svn.apache.org/viewcvs/cocoon/branches/BRANCH_2_1_X/src/blocks/forms/java/org/apache/cocoon/forms/util/XMLAdapter.java?view=diff&r1=158556&r2=158557 ============================================================================== --- cocoon/branches/BRANCH_2_1_X/src/blocks/forms/java/org/apache/cocoon/forms/util/XMLAdapter.java (original) +++ cocoon/branches/BRANCH_2_1_X/src/blocks/forms/java/org/apache/cocoon/forms/util/XMLAdapter.java Mon Mar 21 22:54:56 2005 @@ -80,6 +80,8 @@ private Locale locale; /** Is a <code>MultiValueField</code> handled? */ private boolean isMultiValueItem = false; + /** The buffer used to receive character events */ + private StringBuffer textBuffer; /** @@ -133,6 +135,7 @@ */ public void startElement(String uri, String loc, String raw, Attributes a) throws SAXException { + handleText(); if (this.currentWidget == null) { // The name of the root element is ignored this.currentWidget = this.widget; @@ -175,6 +178,7 @@ */ public void endElement(String uri, String loc, String raw) throws SAXException { + handleText(); if (this.currentWidget == null) throw new SAXException("Wrong state"); @@ -208,11 +212,45 @@ */ public void characters(char ch[], int start, int len) throws SAXException { - String input = new String(ch, start, len); - if ("".equals(input.trim())) + // Buffer text, as a single text node can be sent in several chunks. + if (this.textBuffer == null) { + this.textBuffer = new StringBuffer(); + } + this.textBuffer.append(ch, start, len); + } + + /** + * Handle text nodes, if any. Called on every potential text node boundary, + * i.e. start and end element events. + * + * @throws SAXException + */ + private void handleText() throws SAXException { + if (this.textBuffer == null) + return; + + String input = this.textBuffer.toString().trim(); + this.textBuffer = null; // clear buffer + if (input.length() == 0) return; - if (this.currentWidget instanceof DataWidget) { + if (this.currentWidget instanceof MultiValueField && isMultiValueItem) { + MultiValueField field = (MultiValueField)this.currentWidget; + Datatype type = field.getDatatype(); + ConversionResult conv = + type.convertFromString(input, this.locale); + if (conv.isSuccessful()) { + Object[] values = (Object[])field.getValue(); + int valLen = values == null ? 0 : values.length; + Object[] newValues = new Object[valLen + 1]; + for (int i = 0; i < valLen; i++) + newValues[i] = values[i]; + newValues[valLen] = conv.getResult(); + field.setValues(newValues); + } else + throw new SAXException("Could not convert: " + input + + " to " + type.getTypeClass()); + } else if (this.currentWidget instanceof DataWidget) { DataWidget data = (DataWidget)this.currentWidget; Datatype type = data.getDatatype(); ConversionResult conv = @@ -231,24 +269,9 @@ this.currentWidget.setValue(Boolean.FALSE); else throw new SAXException("Unkown boolean: " + input); - } else if (this.currentWidget instanceof MultiValueField && isMultiValueItem) { - MultiValueField field = (MultiValueField)this.currentWidget; - Datatype type = field.getDatatype(); - ConversionResult conv = - type.convertFromString(input, this.locale); - if (conv.isSuccessful()) { - Object[] values = (Object[])field.getValue(); - int valLen = values == null ? 0 : values.length; - Object[] newValues = new Object[valLen + 1]; - for (int i = 0; i < valLen; i++) - newValues[i] = values[i]; - newValues[valLen] = conv.getResult(); - field.setValues(newValues); - } else - throw new SAXException("Could not convert: " + input + - " to " + type.getTypeClass()); - } else + } else { throw new SAXException("Unknown widget type: " + this.currentWidget); + } } @@ -299,7 +322,16 @@ start(id, attr); // Placing the handling DataWidget before ContainerWidget // means that an AggregateField is handled like a DataWidget - if (widget instanceof DataWidget) { + if (widget instanceof MultiValueField) { + Datatype datatype = ((MultiValueField)widget).getDatatype(); + Object[] values = (Object[])widget.getValue(); + if (values != null) + for (int i = 0; i < values.length; i++) { + start(ITEM, attr); + data(datatype.convertToString(values[i], this.locale)); + end(ITEM); + } + } else if (widget instanceof DataWidget) { Datatype datatype = ((DataWidget)widget).getDatatype(); if (widget.getValue() != null) data(datatype.convertToString(widget.getValue(), this.locale)); @@ -309,15 +341,6 @@ if (widget.getValue() != null) { data(widget.getValue().toString()); } - } else if (widget instanceof MultiValueField) { - Datatype datatype = ((MultiValueField)widget).getDatatype(); - Object[] values = (Object[])widget.getValue(); - if (values != null) - for (int i = 0; i < values.length; i++) { - start(ITEM, attr); - data(datatype.convertToString(values[i], this.locale)); - end(ITEM); - } } else if (widget instanceof ContainerWidget) { Iterator children = ((ContainerWidget)widget).getChildren(); while (children.hasNext())