You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@cocoon.apache.org by br...@apache.org on 2003/07/15 16:11:03 UTC
cvs commit: cocoon-2.1/src/blocks/woody/java/org/apache/cocoon/woody/datatype DynamicSelectionList.java SelectionListBuilder.java StaticSelectionList.java
bruno 2003/07/15 07:11:03
Modified: src/blocks/woody/java/org/apache/cocoon/woody/datatype
DynamicSelectionList.java SelectionListBuilder.java
StaticSelectionList.java
Log:
Use Convertors when building and serializing selection lists.
Revision Changes Path
1.2 +131 -9 cocoon-2.1/src/blocks/woody/java/org/apache/cocoon/woody/datatype/DynamicSelectionList.java
Index: DynamicSelectionList.java
===================================================================
RCS file: /home/cvs/cocoon-2.1/src/blocks/woody/java/org/apache/cocoon/woody/datatype/DynamicSelectionList.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- DynamicSelectionList.java 26 Jun 2003 15:33:11 -0000 1.1
+++ DynamicSelectionList.java 15 Jul 2003 14:11:03 -0000 1.2
@@ -59,13 +59,20 @@
import org.apache.cocoon.components.source.SourceUtil;
import org.apache.cocoon.xml.AttributesImpl;
import org.apache.cocoon.xml.AbstractXMLPipe;
+import org.apache.cocoon.xml.dom.DOMBuilder;
import org.apache.cocoon.woody.Constants;
+import org.apache.cocoon.woody.datatype.convertor.Convertor;
+import org.apache.cocoon.woody.datatype.convertor.DefaultFormatCache;
+import org.w3c.dom.Element;
import java.util.Locale;
/**
* SelectionList implementation that always reads its content from the source
* each time it is requested.
+ *
+ * <p>Note: the class {@link SelectionListBuilder} also interprets the same wd:selection-list XML, so if
+ * anything changes here to how that XML is interpreted, it also needs to change over there and vice versa.
*/
public class DynamicSelectionList implements SelectionList {
private String src;
@@ -107,8 +114,15 @@
*/
public class SelectionListHandler extends AbstractXMLPipe {
private Object currentValue;
+ private String currentValueAsString;
private boolean hasLabel;
private Locale locale;
+ /** The convertor used to parse the values in the selection list. */
+ private Convertor convertor;
+ private DOMBuilder convertorConfigDOMBuilder;
+ private int convertorConfigNestingLevel = 0;
+ private Convertor.FormatCache fromFormatCache = new DefaultFormatCache();
+ private Convertor.FormatCache toFormatCache = new DefaultFormatCache();
public SelectionListHandler(Locale locale) {
this.locale = locale;
@@ -132,25 +146,36 @@
public void startElement(String namespaceURI, String localName, String qName, Attributes attributes)
throws SAXException {
- if (namespaceURI.equals(Constants.WD_NS)) {
+ if (convertorConfigNestingLevel > 0) {
+ convertorConfigNestingLevel++;
+ convertorConfigDOMBuilder.startElement(namespaceURI, localName, qName, attributes);
+ } else if (namespaceURI.equals(Constants.WD_NS)) {
if (localName.equals("item")) {
+ if (convertor == null) {
+ // if no convertor was explicitely configured, use the default one of the datatype
+ convertor = datatype.getConvertor();
+ }
hasLabel = false;
String unparsedValue = attributes.getValue("value");
if (unparsedValue == null)
throw new SAXException("Missing value attribute on " + qName + " element.");
- currentValue = datatype.convertFromString(unparsedValue);
+ currentValue = convertor.convertFromString(unparsedValue, locale, fromFormatCache);
if (currentValue == null)
throw new SAXException("Could not interpret the following value: \"" + unparsedValue + "\".");
AttributesImpl attrs = new AttributesImpl();
- // currently the duo convertFromString and convertToString here seems meaningless,
- // but in the future the formats of input and output could change
- attrs.addCDATAAttribute("value", datatype.convertToString(currentValue));
+ currentValueAsString = datatype.getConvertor().convertToString(currentValue, locale, toFormatCache);
+ attrs.addCDATAAttribute("value", currentValueAsString);
super.startElement(Constants.WI_NS, localName, Constants.WI_PREFIX_COLON + localName, attrs);
} else if (localName.equals("label")) {
hasLabel = true;
super.startElement(Constants.WI_NS, localName, Constants.WI_PREFIX_COLON + localName, attributes);
} else if (localName.equals("selection-list")) {
super.startElement(Constants.WI_NS, localName, Constants.WI_PREFIX_COLON + localName, attributes);
+ } else if (convertor == null && localName.equals("convertor")) {
+ // record the content of this element in a dom-tree
+ convertorConfigDOMBuilder = new DOMBuilder();
+ convertorConfigDOMBuilder.startElement(namespaceURI, localName, qName, attributes);
+ convertorConfigNestingLevel++;
} else {
super.startElement(namespaceURI, localName, qName, attributes);
}
@@ -163,13 +188,23 @@
public void endElement(String namespaceURI, String localName, String qName)
throws SAXException {
- if (namespaceURI.equals(Constants.WD_NS)) {
+ if (convertorConfigNestingLevel > 0) {
+ convertorConfigNestingLevel--;
+ convertorConfigDOMBuilder.endElement(namespaceURI, localName, qName);
+ if (convertorConfigNestingLevel == 0) {
+ Element convertorElement = convertorConfigDOMBuilder.getDocument().getDocumentElement();
+ try {
+ convertor = datatype.getBuilder().buildConvertor(convertorElement);
+ } catch (Exception e) {
+ throw new SAXException("Error building convertor from convertor configuration embedded in selection list XML.", e);
+ }
+ }
+ } else if (namespaceURI.equals(Constants.WD_NS)) {
if (localName.equals("item")) {
if (!hasLabel) {
// make the label now
super.startElement(Constants.WI_NS, LABEL_EL, Constants.WI_PREFIX_COLON + LABEL_EL, new AttributesImpl());
- String label = datatype.convertToStringLocalized(currentValue, locale);
- super.characters(label.toCharArray(), 0, label.length());
+ super.characters(currentValueAsString.toCharArray(), 0, currentValueAsString.length());
super.endElement(Constants.WI_NS, LABEL_EL, Constants.WI_PREFIX_COLON + LABEL_EL);
}
super.endElement(Constants.WI_NS, localName, Constants.WI_PREFIX_COLON + localName);
@@ -184,6 +219,93 @@
super.endElement(namespaceURI, localName, qName);
}
}
- }
+ public void comment(char ch[], int start, int len)
+ throws SAXException {
+ if (convertorConfigNestingLevel > 0) {
+ convertorConfigDOMBuilder.comment(ch, start, len);
+ } else
+ super.comment(ch, start, len);
+ }
+
+ public void startPrefixMapping(String prefix, String uri)
+ throws SAXException {
+ if (convertorConfigNestingLevel > 0) {
+ convertorConfigDOMBuilder.startPrefixMapping(prefix, uri);
+ } else
+ super.startPrefixMapping(prefix, uri);
+ }
+
+ public void endPrefixMapping(String prefix)
+ throws SAXException {
+ if (convertorConfigNestingLevel > 0) {
+ convertorConfigDOMBuilder.endPrefixMapping(prefix);
+ } else
+ super.endPrefixMapping(prefix);
+ }
+
+ public void characters(char c[], int start, int len)
+ throws SAXException {
+ if (convertorConfigNestingLevel > 0) {
+ convertorConfigDOMBuilder.characters(c, start, len);
+ } else
+ super.characters(c, start, len);
+ }
+
+ public void ignorableWhitespace(char c[], int start, int len)
+ throws SAXException {
+ if (convertorConfigNestingLevel > 0) {
+ convertorConfigDOMBuilder.ignorableWhitespace(c, start, len);
+ } else
+ super.ignorableWhitespace(c, start, len);
+ }
+
+ public void processingInstruction(String target, String data)
+ throws SAXException {
+ if (convertorConfigNestingLevel > 0) {
+ convertorConfigDOMBuilder.processingInstruction(target, data);
+ } else
+ super.processingInstruction(target, data);
+ }
+
+ public void skippedEntity(String name)
+ throws SAXException {
+ if (convertorConfigNestingLevel > 0) {
+ convertorConfigDOMBuilder.skippedEntity(name);
+ } else
+ super.skippedEntity(name);
+ }
+
+ public void startEntity(String name)
+ throws SAXException {
+ if (convertorConfigNestingLevel > 0) {
+ convertorConfigDOMBuilder.startEntity(name);
+ } else
+ super.startEntity(name);
+ }
+
+ public void endEntity(String name)
+ throws SAXException {
+ if (convertorConfigNestingLevel > 0) {
+ convertorConfigDOMBuilder.endEntity(name);
+ } else
+ super.endEntity(name);
+ }
+
+ public void startCDATA()
+ throws SAXException {
+ if (convertorConfigNestingLevel > 0) {
+ convertorConfigDOMBuilder.startCDATA();
+ } else
+ super.startCDATA();
+ }
+
+ public void endCDATA()
+ throws SAXException {
+ if (convertorConfigNestingLevel > 0) {
+ convertorConfigDOMBuilder.endCDATA();
+ } else
+ super.endCDATA();
+ }
+ }
}
1.2 +22 -2 cocoon-2.1/src/blocks/woody/java/org/apache/cocoon/woody/datatype/SelectionListBuilder.java
Index: SelectionListBuilder.java
===================================================================
RCS file: /home/cvs/cocoon-2.1/src/blocks/woody/java/org/apache/cocoon/woody/datatype/SelectionListBuilder.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- SelectionListBuilder.java 22 Apr 2003 12:04:18 -0000 1.1
+++ SelectionListBuilder.java 15 Jul 2003 14:11:03 -0000 1.2
@@ -54,23 +54,43 @@
import org.w3c.dom.NodeList;
import org.w3c.dom.Node;
import org.apache.cocoon.woody.Constants;
+import org.apache.cocoon.woody.datatype.convertor.Convertor;
+import org.apache.cocoon.woody.datatype.convertor.DefaultFormatCache;
import org.apache.cocoon.woody.util.DomHelper;
+import org.xml.sax.SAXException;
+
+import java.util.Locale;
/**
* Builds {@link SelectionList}s from an XML description.
+ *
+ * <p>Note: the class {@link DynamicSelectionList} also interprets the same wd:selection-list XML, so if
+ * anything changes here to how that XML is interpreted, it also needs to change over there and vice versa.
*/
public class SelectionListBuilder {
public static SelectionList build(Element selectionListElement, Datatype datatype) throws Exception {
StaticSelectionList selectionList = new StaticSelectionList(datatype);
+ Convertor convertor = null;
+ Convertor.FormatCache formatCache = new DefaultFormatCache();
NodeList children = selectionListElement.getChildNodes();
for (int i = 0; children.item(i) != null; i++) {
Node node = children.item(i);
- if (node instanceof Element && Constants.WD_NS.equals(node.getNamespaceURI()) && "item".equals(node.getLocalName())) {
+ if (convertor == null && node instanceof Element && Constants.WD_NS.equals(node.getNamespaceURI()) && "convertor".equals(node.getLocalName())) {
+ Element convertorConfigElement = (Element)node;
+ try {
+ convertor = datatype.getBuilder().buildConvertor(convertorConfigElement);
+ } catch (Exception e) {
+ throw new SAXException("Error building convertor from convertor configuration embedded in selection list XML.", e);
+ }
+ } else if (node instanceof Element && Constants.WD_NS.equals(node.getNamespaceURI()) && "item".equals(node.getLocalName())) {
+ if (convertor == null) {
+ convertor = datatype.getConvertor();
+ }
Element element = (Element)node;
String stringValue = element.getAttribute("value");
- Object value = datatype.convertFromString(stringValue);
+ Object value = convertor.convertFromString(stringValue, Locale.US, formatCache);
if (value == null)
throw new Exception("Could not convert the value \"" + stringValue + "\" to the type " + datatype.getDescriptiveName() + ", defined at " + DomHelper.getLocation(element));
1.3 +12 -7 cocoon-2.1/src/blocks/woody/java/org/apache/cocoon/woody/datatype/StaticSelectionList.java
Index: StaticSelectionList.java
===================================================================
RCS file: /home/cvs/cocoon-2.1/src/blocks/woody/java/org/apache/cocoon/woody/datatype/StaticSelectionList.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- StaticSelectionList.java 14 May 2003 11:45:43 -0000 1.2
+++ StaticSelectionList.java 15 Jul 2003 14:11:03 -0000 1.3
@@ -53,6 +53,8 @@
import org.xml.sax.ContentHandler;
import org.xml.sax.SAXException;
import org.apache.cocoon.woody.Constants;
+import org.apache.cocoon.woody.datatype.convertor.Convertor;
+import org.apache.cocoon.woody.datatype.convertor.DefaultFormatCache;
import org.apache.cocoon.components.sax.XMLByteStreamInterpreter;
import org.apache.cocoon.xml.AttributesImpl;
@@ -64,8 +66,9 @@
/**
* An implementation of a SelectionList. Create instances of this class by using
* the {@link SelectionListBuilder}. This implementation is called "Static" because
- * the list of items is not retrieved dynamically, but only ones and shared for
- * all users of the {@link Datatype}.
+ * the items in the list are build once from its source, and then list items are
+ * cached as part of this object. In contrast, the {@link DynamicSelectionList}
+ * will retrieve its content from its source each time it's needed.
*/
public class StaticSelectionList implements SelectionList {
/** The datatype to which this selection list belongs */
@@ -86,11 +89,12 @@
}
public void generateSaxFragment(ContentHandler contentHandler, Locale locale) throws SAXException {
+ Convertor.FormatCache formatCache = new DefaultFormatCache();
contentHandler.startElement(Constants.WI_NS, SELECTION_LIST_EL, Constants.WI_PREFIX_COLON + SELECTION_LIST_EL, Constants.EMPTY_ATTRS);
Iterator itemIt = items.iterator();
while (itemIt.hasNext()) {
SelectionListItem item = (SelectionListItem)itemIt.next();
- item.generateSaxFragment(contentHandler, locale);
+ item.generateSaxFragment(contentHandler, locale, formatCache);
}
contentHandler.endElement(Constants.WI_NS, SELECTION_LIST_EL, Constants.WI_PREFIX_COLON + SELECTION_LIST_EL);
}
@@ -113,10 +117,12 @@
this.label = label;
}
- public void generateSaxFragment(ContentHandler contentHandler, Locale locale) throws SAXException
+ public void generateSaxFragment(ContentHandler contentHandler, Locale locale, Convertor.FormatCache formatCache)
+ throws SAXException
{
AttributesImpl itemAttrs = new AttributesImpl();
- itemAttrs.addCDATAAttribute("value", datatype.convertToString(value));
+ String stringValue = datatype.getConvertor().convertToString(value, locale, formatCache);;
+ itemAttrs.addCDATAAttribute("value", stringValue);
contentHandler.startElement(Constants.WI_NS, ITEM_EL, Constants.WI_PREFIX_COLON + ITEM_EL, itemAttrs);
contentHandler.startElement(Constants.WI_NS, LABEL_EL, Constants.WI_PREFIX_COLON + LABEL_EL, Constants.EMPTY_ATTRS);
if (label != null) {
@@ -124,8 +130,7 @@
interpreter.setContentHandler(contentHandler);
interpreter.deserialize(label);
} else {
- String formattedLabel = datatype.convertToStringLocalized(value, locale);
- contentHandler.characters(formattedLabel.toCharArray(), 0, formattedLabel.length());
+ contentHandler.characters(stringValue.toCharArray(), 0, stringValue.length());
}
contentHandler.endElement(Constants.WI_NS, LABEL_EL, Constants.WI_PREFIX_COLON + LABEL_EL);
contentHandler.endElement(Constants.WI_NS, ITEM_EL, Constants.WI_PREFIX_COLON + ITEM_EL);