ivelin 2002/09/08 16:02:57
Modified: src/java/org/apache/cocoon/transformation
XMLFormTransformer.java
Log:
update for itemset
Revision Changes Path
1.11 +157 -42
xml-cocoon2/src/java/org/apache/cocoon/transformation/XMLFormTransformer.java
Index: XMLFormTransformer.java
===================================================================
RCS file:
/home/cvs/xml-cocoon2/src/java/org/apache/cocoon/transformation/XMLFormTransformer.java,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -r1.10 -r1.11
--- XMLFormTransformer.java 7 Aug 2002 10:52:13 -0000 1.10
+++ XMLFormTransformer.java 8 Sep 2002 23:02:57 -0000 1.11
@@ -173,6 +173,8 @@
public final static String TAG_SELECTBOOLEAN = "selectBoolean";
public final static String TAG_SELECTONE = "selectOne";
public final static String TAG_SELECTMANY = "selectMany";
+ public final static String TAG_ITEMSET = "itemset";
+ public final static String TAG_ITEM = "item";
public final static String TAG_VALUE = "value";
public final static String TAG_HIDDEN = "hidden";
@@ -375,10 +377,10 @@
// just record the SAX event
super.startElement( uri, name, raw, attributes);
}
- // when a new repeat tag is discovered
- // start recording
- // the repeat will be unrolled after the repeat tag ends
- else if (TAG_REPEAT.equals( name) )
+ // when a new repeat tag is discovered
+ // start recording
+ // the repeat will be unrolled after the repeat tag ends
+ else if (TAG_REPEAT.equals( name ))
{
repeatTagDepth = currentTagDepth;
isRecording = true;
@@ -396,6 +398,27 @@
// and start recording its content
startRecording();
}
+ // when a new itemset tag (used within select) is discovered
+ // start recording
+ // the itemset will be unrolled after the tag ends
+ // The difference with the repeat tag is that itemset if
+ // unrolled in multiple item tags.
+ else if ( TAG_ITEMSET.equals( name ) )
+ {
+ repeatTagDepth = currentTagDepth;
+ isRecording = true;
+
+ // get the nodeset selector string
+ nodeset = attributes.getValue(TAG_REPEAT_ATTR_NODESET);
+
+ if (nodeset == null)
+ {
+ throw new SAXException( name + " element should provide a '" +
TAG_REPEAT_ATTR_NODESET + "' attribute" );
+ }
+
+ // start recording its content
+ startRecording();
+ }
else // if not a repeat tag
{
// if this tag has a "ref" attribute, then
@@ -434,11 +457,6 @@
{
startElementOutput( uri, name, raw, attributes );
} // end if TAG_OUTPUT
- else if ( TAG_CAPTION.equals( name ) )
- {
- super.startElement( uri, name, raw, attributes);
- this.ignoreHooksCount = 0;
- }
else if (TAG_INSERTVIOLATIONS.equals(name))
{
startElementViolations( uri, name, raw, attributes );
@@ -466,15 +484,20 @@
TAG_TEXTAREA.equals(name) ||
TAG_PASSWORD.equals(name) ||
TAG_SELECTBOOLEAN.equals(name) ||
- TAG_SELECTONE.equals(name))
- {
- startElementSimpleField( uri, name, raw, attributes, currentForm );
- }
- else if (TAG_SELECTMANY.equals(name))
+ TAG_SELECTONE.equals(name) ||
+ TAG_SELECTMANY.equals(name)
+ )
{
startElementSimpleField( uri, name, raw, attributes, currentForm );
}
else if (
+ TAG_CAPTION.equals(name) ||
+ TAG_VALUE.equals(name)
+ )
+ {
+ startElementWithOptionalRefAndSimpleContent( uri, name, raw, attributes,
currentForm );
+ }
+ else if (
TAG_SUBMIT.equals(name) ||
TAG_CANCEL.equals(name) ||
TAG_RESET.equals(name) )
@@ -486,8 +509,8 @@
// raise the flag that we're within a hidden element
// since there are intricacies in
// handling the value sub-element
- isHiddenTag = true;
- startElementSimpleField( uri, name, raw, attributes,
currentForm );
+ isHiddenTag = true;
+ startElementSimpleField( uri, name, raw, attributes,
currentForm );
}
else
{
@@ -683,6 +706,39 @@
} // end of startElementSimpleField
+ protected void startElementWithOptionalRefAndSimpleContent(String uri, String
name, String raw, Attributes attributes, Form form)
+ throws SAXException
+ {
+ String ref = attributes.getValue(TAG_COMMON_ATTR_REF);
+
+ if (ref == null) // ref attribute is not provided
+ {
+ this.startElement( uri, name, raw, attributes );
+ return;
+ }
+
+ if ( form == null)
+ {
+ throw new SAXException( name + " element should be either nested within a
form tag or provide a form attribute" );
+ }
+
+ getLogger().debug("[" + String.valueOf( name ) + "] getting value from form
[id=" + form.getId() + ", ref=" + String.valueOf(ref) + "]");
+
+ value_ = form.getValue( ref );
+
+ // we will only forward the SAX event once we know
+ // that the value of the tag is available
+ super.startElement(uri, name, raw, attributes);
+
+ getLogger().debug("Value of form [id=" + form.getId() + ", ref=" +
String.valueOf(ref) + "] = [" + value_ + "]") ;
+
+ // Now render the character data inside the tag
+ String v = String.valueOf( value_ );
+ super.characters(v.toCharArray(),0,v.length());
+
+ } // end of startElementSimpleFieldWithOptionalRef
+
+
/**
* Renders one or more xf:value elements
* depending on whether _value is a
@@ -768,7 +824,8 @@
// stop recording, unroll the repeat tag content
// for each node in the node set,
// then close the repeat tag
- if (TAG_REPEAT.equals( name) && (repeatTagDepth == currentTagDepth))
+ if ( (TAG_REPEAT.equals( name ) )
+ && (repeatTagDepth == currentTagDepth))
{
isRecording = false;
DocumentFragment docFragment = endRecording();
@@ -777,6 +834,15 @@
// close the repeat tag
super.endElement(uri, name, raw);
}
+ // similarly for an itemset tag
+ else if ( (TAG_ITEMSET.equals( name ))
+ && (repeatTagDepth == currentTagDepth))
+ {
+ isRecording = false;
+ DocumentFragment docFragment = endRecording();
+ unrollItemSetTag( docFragment );
+ nodeset = null;
+ }
// if within a repeat tag, keep recording
// when recording, nothing is actively processed
else if (isRecording)
@@ -810,39 +876,33 @@
currentForm = null;
super.endElement(uri, name, raw);
}
- else if (TAG_OUTPUT.equals(name) ||
+ else if (
+ TAG_OUTPUT.equals(name) ||
TAG_TEXTBOX.equals(name) ||
TAG_PASSWORD.equals(name) ||
TAG_SELECTBOOLEAN.equals(name) ||
- TAG_SELECTONE.equals(name) )
- {
- super.endElement(uri, name, raw);
- }
- else if (TAG_SELECTMANY.equals(name))
- {
- super.endElement(uri, name, raw);
- }
- else if (TAG_SUBMIT.equals(name))
- {
- super.endElement(uri, name, raw);
- }
- else if ( TAG_CAPTION.equals( name ) )
+ TAG_SELECTONE.equals(name) ||
+ TAG_SELECTMANY.equals(name) ||
+ TAG_SUBMIT.equals(name) ||
+ TAG_CAPTION.equals( name ) ||
+ TAG_VALUE.equals( name )
+ )
{
super.endElement(uri, name, raw);
}
else if (TAG_HIDDEN.equals(name))
{
- isHiddenTag = false;
- hasHiddenTagValue = false;
- // if value sub-element was not
- // provided in the markup
- // then render the value of the referenced
- // model attribute, like normally done
- // for other elements
- if(! hasHiddenTagValue)
- {
- renderValueSubElements();
- }
+ isHiddenTag = false;
+ hasHiddenTagValue = false;
+ // if value sub-element was not
+ // provided in the markup
+ // then render the value of the referenced
+ // model attribute, like normally done
+ // for other elements
+ if(! hasHiddenTagValue)
+ {
+ renderValueSubElements();
+ }
super.endElement(uri, name, raw);
}
else
@@ -919,6 +979,61 @@
ignoreHooksCount = oldIgnoreHooksCount;
}
} // unrollRepeatTag
+
+
+
+
+ /**
+ * Unroll the itemset tag.
+ * For each node in the itemset tag's nodeset selector result,
+ * render a <code>item</code> tag with a <code>ref</code>
+ * attribute which points to the location of the current node
+ * in the nodeset.
+ * Within each <code>item</code> tag,
+ * output the content of the itemset tag,
+ * by resolving all model references within nested caption and value tags,
+ * relative to the <code>ref</code> attribute of the <code>item</code> element.
+ *
+ * @param docFragment the content of the repeat tag
+ * @param nodeset the nodeset selector string
+ */
+ protected void unrollItemSetTag( DocumentFragment docFragment )
+ throws SAXException
+ {
+ int oldIgnoreHooksCount = ignoreHooksCount;
+ try
+ {
+ // reset ignore hooks counter
+ this.ignoreHooksCount = 0;
+
+ Collection locations = currentForm.locate( nodeset );
+ Iterator iter = locations.iterator();
+ // iterate over each node in the nodeset
+ while ( iter.hasNext() )
+ {
+ String nextNodeLocation = (String) iter.next ();
+
+ // set the ref attribute to point to the current node
+ AttributesImpl atts = new AttributesImpl();
+ atts.addAttribute( null, TAG_COMMON_ATTR_REF, TAG_COMMON_ATTR_REF, "CDATA",
nextNodeLocation);
+
+ super.startElement(NS, TAG_ITEM, NS_PREFIX + ":" + TAG_ITEM, atts);
+ if (value_ != null)
+ {
+ // stream back the recorder repeat content
+ DOMStreamer streamer = new DOMStreamer( this, this);
+ streamer.stream( docFragment );
+ }
+
+ super.endElement( NS, TAG_ITEM, NS_PREFIX + ":" + TAG_ITEM );
+
+ }
+ }
+ finally
+ {
+ ignoreHooksCount = oldIgnoreHooksCount;
+ }
+ } // unrollItemSetTag
----------------------------------------------------------------------
In case of troubles, e-mail: [EMAIL PROTECTED]
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]