Return-Path: Delivered-To: apmail-cocoon-users-archive@www.apache.org Received: (qmail 88874 invoked from network); 8 Sep 2003 08:30:34 -0000 Received: from daedalus.apache.org (HELO mail.apache.org) (208.185.179.12) by minotaur-2.apache.org with SMTP; 8 Sep 2003 08:30:34 -0000 Received: (qmail 88094 invoked by uid 500); 8 Sep 2003 08:29:39 -0000 Delivered-To: apmail-cocoon-users-archive@cocoon.apache.org Received: (qmail 88075 invoked by uid 500); 8 Sep 2003 08:29:38 -0000 Mailing-List: contact users-help@cocoon.apache.org; run by ezmlm Precedence: bulk list-help: list-unsubscribe: list-post: Reply-To: users@cocoon.apache.org Delivered-To: mailing list users@cocoon.apache.org Received: (qmail 88041 invoked from network); 8 Sep 2003 08:29:37 -0000 Received: from unknown (HELO ns0b.swx.com) (146.109.240.235) by daedalus.apache.org with SMTP; 8 Sep 2003 08:29:37 -0000 Received: from gate0a.unix.swx.ch (gate0a [192.168.252.17]) by ns0b.swx.com (8.12.9/8.12.9) with ESMTP id h888S2TY027041 for ; Mon, 8 Sep 2003 10:28:02 +0200 (MEST) Received: from SOMEXEVS001.ex.ordersx.org (localhost [127.0.0.1]) by gate0a.unix.swx.ch (8.12.9/8.12.9) with ESMTP id h888S1dZ006035 for ; Mon, 8 Sep 2003 10:28:01 +0200 (MEST) Content-Class: urn:content-classes:message MIME-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable X-MimeOLE: Produced By Microsoft MimeOLE V5.50.4910.0300 Subject: RE: reload problem Date: Mon, 8 Sep 2003 10:28:01 +0200 Message-ID: X-MS-Has-Attach: Importance: normal X-MS-TNEF-Correlator: Priority: normal Thread-Topic: reload problem thread-index: AcN13A1rP/Q9JdiQQhax6IMgg1MlywABjPkw From: "Nathaniel Alfred" To: X-Spam-Rating: daedalus.apache.org 1.6.2 0/1000/N X-Spam-Rating: minotaur-2.apache.org 1.6.2 0/1000/N You've got the startElement arguments completely wrong. 1. uri =3D Namespace 2. name =3D Tagname without prefix 3. raw =3D Prefix:Tagname 4. attr =3D Attributes The second transformer step is currently sterile because it gets uri =3D "". NB why not use configuration parameters to control the transformer's modal behaviour. HTH, Alfred. > -----Original Message----- > From: gregor.bertrand@daimlerchrysler.com > [mailto:gregor.bertrand@daimlerchrysler.com] > Sent: Montag, 8. September 2003 09:36 > To: users@cocoon.apache.org > Subject: reload problem >=20 >=20 > Hello, >=20 > here are the essential parts of my sitemap: >=20 >=20 > > > > > > > >=20 >=20 > "com.daimlerchrysler.mediathek.acl.ACLTransformer"> > >=20 >=20 >=20 >=20 > Here my Java Class, I' m sorry but it' quite big: >=20 >=20 > public class ACLTransformer extends AbstractSAXTransformer implements > Initializable > { > /** > * Field NAMESPACE > * Value: {@value NAMESPACE} > */ > public static final String NAMESPACE =3D > "http://daimlerchrysler.com/mediathek/acl"; > /** > * Field NAMESPACE_ELEMENT > * Value: {@value NAMESPACE_ELEMENT} > */ > public static final String NAMESPACE_ELEMENT =3D "acl"; > /** > * Field ACLTRANSFORMER_ELEMENT_FIRST > * Value: {@value ACLTRANSFORMER_ELEMENT_FIRST} > */ > public static final String ACLTRANSFORMER_ELEMENT_FIRST=20 > =3D "acl1"; > /** > * Field ACLTRANSFORMER_ELEMENT_SECOND > * Value: {@value ACLTRANSFORMER_ELEMENT_SECOND} > */ > public static final String=20 > ACLTRANSFORMER_ELEMENT_SECOND =3D "acl2"; > /** > * Field ACLTRANSFORMER_ELEMENT_THIRD > * Value: {@value ACLTRANSFORMER_ELEMENT_THIRD} > */ > public static final String ACLTRANSFORMER_ELEMENT_THIRD=20 > =3D "acl3"; > /** > * Field ACLS > * Value: {@value ACLS} > */ > public static final String ACLS =3D "acls"; > /** > * Field ITEMS > * Value: {@value ITEMS} > */ > public static final String ITEMS =3D "items"; > /** > * Field ITEM > * Value: {@value ITEM} > */ > public static final String ITEM =3D "item"; > /** > * Field TYPE > * Value: {@value TYPE} > */ > public static final String TYPE =3D "type"; >=20 > /** > * Field MODE_TRANSFORM_NONE > * Value: {@value MODE_TRANSFORM_NONE} > */ > protected static final int MODE_TRANSFORM_NONE =3D 0; > /** > * Field MODE_TRANSFORM_FIRST > * Value: {@value MODE_TRANSFORM_FIRST} > */ > protected static final int MODE_TRANSFORM_FIRST =3D 1; > /** > * Field MODE_TRANSFORM_SECOND > * Value: {@value MODE_TRANSFORM_SECOND} > */ > protected static final int MODE_TRANSFORM_SECOND =3D 2; > /** > * Field MODE_TRANSFORM_THIRD > * Value: {@value MODE_TRANSFORM_THIRD} > */ > protected static final int MODE_TRANSFORM_THIRD =3D 3; > /** > * Field MODE_NONE > * Value: {@value MODE_NONE} > */ > protected static final int MODE_NONE =3D 4; > /** > * Field MODE_ACL > * Value: {@value MODE_ACL} > */ > protected static final int MODE_ACL =3D 7; > /** > * Field MODE_FOLDER > * Value: {@value MODE_FOLDER} > */ > protected static final int MODE_FOLDER =3D 8; >=20 > /** > * Field mode_transform > */ > protected int mode_transform; > /** > * Field mode > */ > protected int mode; > /** > * Field types_count > */ > protected int types_count; > /** > * Field ignore_type > */ > protected boolean ignore_type; > /** > * Field processing_acl > */ > protected boolean processing_acl; > /** > * Field last_in_hierarchy > */ > protected boolean last_in_hierarchy; > /** > * Field rights > */ > protected HashMap rights; > /** > * Field aright > */ > protected Right aright; > /** > * Field hierarch_rights > */ > protected LinkedList hierarch_rights; > /** > * Field types_nums > */ > protected LinkedList types_nums; > /** > * Field endOfTransformation > */ > protected boolean endOfTransformation; >=20 >=20 > /** > * > * setzt die Variablen auf Standardwerte > * @param resolver SourceResolver > * @param objectModel Map > * @param src String > * @param par Parameters > * @throws ProcessingException > * @throws SAXException > * @throws IOException > * @see > org.apache.cocoon.sitemap.SitemapModelComponent#setup(SourceRe > solver, Map, > String, Parameters) > */ > public void setup(SourceResolver resolver, > Map objectModel, > String src, > Parameters par) > throws ProcessingException, SAXException, IOException > { >=20 > this.ignore_type =3D=20 > par.getParameterAsBoolean("ignore_type", > false); > this.mode_transform =3D=20 > par.getParameterAsInteger("trans_mode", > 1); > } >=20 > public void initialize() > { > this.mode =3D MODE_NONE; > this.mode_transform =3D MODE_TRANSFORM_NONE; > this.types_count =3D 0; > this.processing_acl =3D false; > this.rights =3D new HashMap(); > this.aright =3D null; > this.hierarch_rights =3D new LinkedList(); > this.types_nums =3D new LinkedList(); > this.aclt2 =3D new ACLTransformer2(); > } >=20 > /** > * > * verarbeitet die Anfangstags der Elemente der XMLstruktur > * @param uri String > * @param name String > * @param raw String > * @param attr Attributes > * @throws SAXException > * @see org.xml.sax.ContentHandler#startElement(String, String, > String, Attributes) > */ > public void startElement(String uri, String name, String raw, > Attributes attr) throws SAXException > { > if(uri !=3D null && uri.equals(NAMESPACE)) > { >=20 > =20 > if(name.equals(ACLTRANSFORMER_ELEMENT_FIRST)) //soll zum > ersten Mal... > { > this.mode_transform =3D MODE_TRANSFORM_FIRST; > this.endOfTransformation =3D false; > super.startElement("",=20 > NAMESPACE_ELEMENT + ":" + > ACLTRANSFORMER_ELEMENT_SECOND, NAMESPACE_ELEMENT + ":" + > ACLTRANSFORMER_ELEMENT_SECOND, attr); > } > else if(name.equals(ACLTRANSFORMER_ELEMENT_SECOND)) > //...zum zweiten Mal... > { > this.mode_transform =3D MODE_TRANSFORM_SECOND; > this.endOfTransformation =3D false; > super.startElement("",=20 > NAMESPACE_ELEMENT + ":" + > ACLTRANSFORMER_ELEMENT_THIRD, NAMESPACE_ELEMENT + ":" + > ACLTRANSFORMER_ELEMENT_THIRD, attr); > } > else if(name.equals(ACLTRANSFORMER_ELEMENT_THIRD)) > //...oder zum dritten Mal transformiert werden. > { > this.endOfTransformation =3D true; > this.mode_transform =3D MODE_TRANSFORM_THIRD; > } > else if(name.equals(ACLS)) > { > if(this.mode_transform =3D=3D=20 > MODE_TRANSFORM_FIRST) > { > this.mode =3D MODE_ACL; > super.startElement("",=20 > NAMESPACE_ELEMENT + > ":" + name, NAMESPACE_ELEMENT + ":" + name, attr); > } > else if(this.mode_transform =3D=3D > MODE_TRANSFORM_SECOND) > { > this.mode =3D MODE_ACL; > } > } > else if(name.equals(ITEMS)) > { > this.mode =3D MODE_FOLDER; > if(this.mode_transform =3D=3D=20 > MODE_TRANSFORM_FIRST) > { > super.startElement("",=20 > NAMESPACE_ELEMENT + > ":" + name, NAMESPACE_ELEMENT + ":" + name, attr); > } > else if(this.mode_transform =3D=3D > MODE_TRANSFORM_SECOND) > { > this.last_in_hierarchy =3D true; > } > } > else if(name.equals(ITEM)) > { > if(this.mode_transform =3D=3D=20 > MODE_TRANSFORM_FIRST) > { > if(this.mode =3D=3D MODE_ACL) > { > processing_acl =3D true; > save_acl(name, attr, true); > } > else > { > super.startElement("", > NAMESPACE_ELEMENT + ":" + name, NAMESPACE_ELEMENT + ":" + name, attr); > } > } > else if(this.mode_transform =3D=3D > MODE_TRANSFORM_SECOND) > { > if(this.mode =3D=3D MODE_ACL) > { > this.last_in_hierarchy =3D false; > processing_acl =3D true; > save_acl(name, attr, false); > } > } > else if(this.mode_transform =3D=3D > MODE_TRANSFORM_THIRD) > { > processing_acl =3D true; > save_acl(name, attr, true); > } > } > else if(this.processing_acl) > { > if(this.mode_transform =3D=3D=20 > MODE_TRANSFORM_SECOND) > { > save_subrights(name, attr, false); > } > else > { > save_subrights(name, attr, true); > } > } > else > { > throw new SAXException("Unknown=20 > element: " + name); > } > } > else > { > super.startElement(uri, name, raw, attr); > } > } >=20 > /** > * Method save_acl > * @param name String > * @param attr Attributes > * @param additive boolean > */ > private void save_acl(String name, Attributes attr,=20 > boolean additive) > throws SAXException > { > if(this.aright =3D=3D null) this.aright =3D new=20 > Right(name, attr); > else aright.addRight(new Right(name, attr), additive, this > .ignore_type); > } >=20 > /** > * Method save_subrights > * @param name String > * @param attr Attributes > * @param additive boolean > */ > private void save_subrights(String name, Attributes=20 > attr, boolean > additive) > { > this.aright.addSubright(new Simple_right(name,=20 > attr), additive, > this.endOfTransformation); > } >=20 > /** > * > * verarbeitet die Texte zwischen den Tags, > * diese werden vom ACLTransformer nicht verwertet > * @param buffer char[] > * @param start int > * @param length int > * @throws SAXException > * @see org.xml.sax.ContentHandler#characters(char[], int, int) > */ > public void characters(char[] buffer, int start, int length) > throws SAXException > { > switch(this.mode_transform) > { > case MODE_TRANSFORM_NONE : > super.characters(buffer, start, length); > break; > case MODE_TRANSFORM_FIRST : > break; > case MODE_TRANSFORM_SECOND : > break; > case MODE_TRANSFORM_THIRD : > break; > case MODE_ACL : > break; > } > } >=20 > /** > * > * verarbeitet die Endtags > * @param uri String > * @param name String > * @param raw String > * @throws SAXException > * @see org.xml.sax.ContentHandler#endElement(String,=20 > String, String) > */ > public void endElement(String uri, String name, String raw) > throws SAXException > { > if(uri !=3D null && uri.equals(NAMESPACE)) > { >=20 > if(name.equals(ACLTRANSFORMER_ELEMENT_FIRST)) > { > this.mode_transform =3D MODE_TRANSFORM_SECOND; > super.endElement("", NAMESPACE_ELEMENT + ":" + > ACLTRANSFORMER_ELEMENT_SECOND, NAMESPACE_ELEMENT + ":" + > ACLTRANSFORMER_ELEMENT_SECOND); > } > else if(name.equals(ACLTRANSFORMER_ELEMENT_SECOND)) > { > this.mode_transform =3D MODE_TRANSFORM_THIRD; > super.endElement("", NAMESPACE_ELEMENT + ":" + > ACLTRANSFORMER_ELEMENT_THIRD, NAMESPACE_ELEMENT + ":" + > ACLTRANSFORMER_ELEMENT_THIRD); > } > else if(name.equals(ACLTRANSFORMER_ELEMENT_THIRD)) > { > this.write_rights_tags(false); > } > else if(name.equals(ITEM)) > { > if(this.mode_transform =3D=3D=20 > MODE_TRANSFORM_FIRST) > { > if(this.mode =3D=3D MODE_ACL) > // eine ACL wird beim typspezifischen > Addieren > // entweder als neue ACL in die HashMap > rights eingetragen > // oder zu einer bereits in der HashMap > rights vorhandenen > // ACL desselben Typs=20 > dazuaddiert, ansonsten > werden die ACLs > // einfach alle in aright=20 > aufeinanderaddiert > und hier muss > // nichts mehr getan werden > { > if(this.rights =3D=3D null)=20 > this.rights =3D > new HashMap(); > if(!this.ignore_type) > { > =20 > if(this.rights.isEmpty()) this > .rights.put(this.aright.getType(), this.aright); > else > { > Object helper =3D this > .rights.get(this.aright.getType()); > if(helper !=3D null) > { > Right nright > =3D (Right) helper; > =20 > this.rights.remove( > this.aright.getType()); > =20 > nright.addRight(this > .aright, true, this.ignore_type); >=20 > nright.addAllSubrights(this.aright.getSubrights(), true, this > .endOfTransformation); > this > .rights.put(nright.getType(), nright); > } > else=20 > this.rights.put(this > .aright.getType(), this.aright); > } > this.aright =3D null; > } > processing_acl =3D false; > } > else > { > super.endElement("",=20 > NAMESPACE_ELEMENT > + ":" + name, NAMESPACE_ELEMENT + ":" + name); > } > } > else if(this.mode_transform =3D=3D > MODE_TRANSFORM_SECOND) > // die ACLs werden alle in einer LinkedList > hierarch_rights > // zwischengespeichert und, wenn alle=20 > innerhalb > einer > // Ordnerhierarchie eingetragen sind,=20 > verarbeitet > { > if(this.mode =3D=3D MODE_ACL) > { > =20 > this.hierarch_rights.add(this.aright); > this.types_count++; > this.aright =3D null; > this.processing_acl =3D false; > } > } > else if(this.mode_transform =3D=3D > MODE_TRANSFORM_THIRD) > // die ACLs werden bei der typspezifischen > Verarbeitung, > // wie schon im ersten Schritt, in=20 > einer HashMap > verwaltet; > // ACLs, die sich auf noch nicht innerhalb der > HashMap rights > // gespeicherte Typen beziehen, werden in die > HashMap eingetragen; > // ACLs mit gespeicherten Typen=20 > werden zu denen in > der HashMap > // addiert > { > if(this.rights =3D=3D null)=20 > this.rights =3D new > HashMap(); > if(!this.ignore_type) > { > Object helper =3D=20 > this.rights.get(this > .aright.getType()); > if(helper =3D=3D null) > { > this.rights.put(this > .aright.getType(), this.aright); > } > else > { > this.rights.remove(this > .aright.getType()); > Right=20 > existing_right =3D (Right) > helper; > existing_right.addRight(this > .aright, true, this.ignore_type); > =20 > existing_right.addAllSubrights( > this.aright.getSubrights(), true, this.endOfTransformation); > this > .rights.put(existing_right.getType(), existing_right); > } > this.aright =3D null; > } > processing_acl =3D false; > } > } > else if(name.equals(ACLS)) > { > if(this.mode_transform =3D=3D=20 > MODE_TRANSFORM_FIRST) > { > write_rights_tags(true); > super.endElement("",=20 > NAMESPACE_ELEMENT + ":" > + name, NAMESPACE_ELEMENT + ":" + name); > } > else if(this.mode_transform =3D=3D > MODE_TRANSFORM_SECOND) > // f=FCr die typspezifische Speicherung wird = die > Anzahl der > // ACLs auf einer Ebene in einer LinkedList > gespeichert > { > if(this.types_nums =3D=3D null)=20 > this.types_nums > =3D new LinkedList(); > this.types_nums.add(new Integer(this > .types_count)); > this.types_count =3D 0; > } > } > else if(name.equals(ITEMS)) > { > if(this.mode_transform =3D=3D=20 > MODE_TRANSFORM_FIRST) > { > super.endElement("",=20 > NAMESPACE_ELEMENT + ":" > + name, NAMESPACE_ELEMENT + ":" + name); > this.mode =3D MODE_NONE; > } > if(this.mode_transform =3D=3D=20 > MODE_TRANSFORM_SECOND) > { > if(this.last_in_hierarchy) > // wir haben den tiefsten Punkt unserer > ACLHierarchie > // erreicht und k=F6nnen jetzt=20 > die auf dem Weg > in einer LinkedList > // gespeicherten ACLs zusammenaddieren, > entweder typ=FCbergreifend zu > // einer ACL, die in aright=20 > gespeichert wird, > oder typspezifisch zu > // mehreren ACLs, die in der=20 > HashMap rights > gespeichert werden > { > if(this.ignore_type) > { > for(int i =3D 0; i < this > .hierarch_rights.size(); i++) > { > Right helper=20 > =3D (Right)this > .hierarch_rights.get(i); > =20 > if(this.aright =3D=3D null) > this.aright =3D helper; > else > { > this > .aright.addRight(helper, false, this.ignore_type); > this > .aright.addAllSubrights(helper.getSubrights(), false, this > .endOfTransformation); > } > } > } > else > { > for(int i =3D 0; i < this > .hierarch_rights.size(); i++) > { > Right helper=20 > =3D (Right)this > .hierarch_rights.get(i); > Object helper_2 =3D = this > .rights.get(helper.getType()); > if(helper_2=20 > =3D=3D null) this > .rights.put(helper.getType(), helper); > else > { > Right=20 > existing_right > =3D (Right) helper_2; > this > .rights.remove(helper.getType()); >=20 > existing_right.addRight(helper, false, false); >=20 > existing_right.addAllSubrights(helper.getSubrights(), false, this > .endOfTransformation); > this > .rights.put(existing_right.getType(), existing_right); > } > } > } > this.write_rights_tags(true); > this.last_in_hierarchy =3D false; > } > // da wir in der Hierarchie wieder > aufsteigen, m=FCssen wir aus > // der LinkedList=20 > hierarch_rights die auf der > Hierarchieebene > // liegenden ACLs wieder entfernen >=20 > Integer helper =3D (Integer)this > .types_nums.getLast(); > for(int i =3D 0; i <=20 > helper.intValue(); i++) > { > this.hierarch_rights.removeLast(); > } > this.types_nums.removeLast(); > } > } > else if(this.processing_acl) > { >=20 > } > else > { > this.mode =3D MODE_NONE; > } > } > else > { > super.endElement(uri, name, raw); > } > } >=20 > protected void start_an_Element(String name, Attributes=20 > attr) throws > SAXException > { > super.startElement("", name, name, attr); > } >=20 > protected void end_an_Element(String name) throws SAXException > { > super.endElement("", name, name); > } >=20 > /** > * schreibt die gespeicherten Rechte, die entweder=20 > typspezifisch in > * einer HashMap rights addiert wurden oder typfremd in=20 > der Variable > aright > * addiert wurden, in entsprechende Tags > * @param write_nmsp boolean > * @throws SAXException > */ > private void write_rights_tags(boolean write_nmsp) throws > SAXException > { > String nmsp =3D (write_nmsp ? NAMESPACE_ELEMENT + ":" : = ""); > if(this.rights.isEmpty()) //keine typspezifischen ACLS > { > super.startElement("", nmsp +=20 > this.aright.getTarget(), > nmsp + this.aright.getTarget(), this.aright.getAttributes()); > HashMap helper =3D this.aright.getSubrights(); > if(!helper.isEmpty()) > { > Object[] subrights =3D=20 > helper.values().toArray(); > for(int i =3D 0; i < subrights.length; i++) > { > Simple_right sr =3D=20 > (Simple_right)subrights[i]; > super.startElement("", nmsp +=20 > sr.getTarget(), > nmsp + sr.getTarget(), sr.getAttributes()); > super.endElement("", nmsp +=20 > sr.getTarget(), > nmsp + sr.getTarget()); > } > } > super.endElement("", nmsp +=20 > this.aright.getTarget(), nmsp > + this.aright.getTarget()); > this.aright =3D null; > this.processing_acl =3D false; > } > else //Hashmap auslesen und ausgeben > { > Object[] typesrights =3D=20 > this.rights.values().toArray(); > for(int i =3D 0; i < typesrights.length; i++) > { > Right atyperight =3D (Right)typesrights[i]; > super.startElement("", nmsp +=20 > atyperight.getTarget > (), nmsp + atyperight.getTarget(), atyperight.getAttributes()); >=20 > HashMap helper =3D atyperight.getSubrights(); > if(!helper.isEmpty()) > { > Object[] subrights =3D=20 > helper.values().toArray > (); > for(int j =3D 0; j <=20 > subrights.length; j++) > { > Simple_right sr > =3D (Simple_right)subrights[j]; > org.xml.sax.helpers.AttributesImpl > npermissions =3D new=20 > org.xml.sax.helpers.AttributesImpl(sr.getAttributes()); > if(this.endOfTransformation) > //am Ende der=20 > Transformation werden die > Subrechte > //mit den ACLs=20 > abgeglichen, d. h. was > man mit der ACL > //nicht darf, darf man bei den > Subrechten auch nicht > { > for(int k =3D 0; k < > npermissions.getLength(); k++) > { > if > (atyperight.getRightpermission(npermissions.getQName(k)).equals("-")) > =20 > npermissions.setValue(k, " > -"); > } > } > sr =3D new=20 > Simple_right(sr.getTarget(), > npermissions); > super.startElement("", nmsp + > sr.getTarget(), nmsp + sr.getTarget(), sr.getAttributes()); > super.endElement("", nmsp + > sr.getTarget(), nmsp + sr.getTarget()); > } > } > super.endElement("", nmsp +=20 > atyperight.getTarget(), > nmsp + atyperight.getTarget()); > } > this.rights.clear(); > this.processing_acl =3D false; > } > } >=20 > } >=20 >=20 >=20 > --------------------------------------------------------------------- > To unsubscribe, e-mail: users-unsubscribe@cocoon.apache.org > For additional commands, e-mail: users-help@cocoon.apache.org >=20 > This message is for the named person's use only. It may contain confidential, proprietary or legally privileged information. No confidentiality or privilege is waived or lost by any mistransmission. If you receive this message in error, please notify the sender urgently and then immediately delete the message and any copies of it from your system. Please also immediately destroy any hardcopies of the message. You must not, directly or indirectly, use, disclose, distribute, print, or copy any part of this message if you are not the intended recipient. The sender's company reserves the right to monitor all e-mail communications through their networks. Any views expressed in this message are those of the individual sender, except where the message states otherwise and the sender is authorised to state them to be the views of the sender's company.=20 --------------------------------------------------------------------- To unsubscribe, e-mail: users-unsubscribe@cocoon.apache.org For additional commands, e-mail: users-help@cocoon.apache.org