You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@cocoon.apache.org by cz...@apache.org on 2007/02/09 12:44:51 UTC
svn commit: r505258 - in
/cocoon/trunk/core/cocoon-sitemap/cocoon-sitemap-impl: ./
src/main/java/org/apache/cocoon/components/treeprocessor/
src/main/resources/META-INF/cocoon/properties/dev/
src/main/resources/org/apache/cocoon/sitemap/ src/main/resou...
Author: cziegeler
Date: Fri Feb 9 03:44:50 2007
New Revision: 505258
URL: http://svn.apache.org/viewvc?view=rev&rev=505258
Log:
Add sitemap validation.
Validation is turned off by default, but turned on for running mode "dev"
Added:
cocoon/trunk/core/cocoon-sitemap/cocoon-sitemap-impl/src/main/resources/META-INF/cocoon/properties/dev/
cocoon/trunk/core/cocoon-sitemap/cocoon-sitemap-impl/src/main/resources/META-INF/cocoon/properties/dev/cocoon-core-sitemap.properties
cocoon/trunk/core/cocoon-sitemap/cocoon-sitemap-impl/src/main/resources/org/apache/cocoon/sitemap/
cocoon/trunk/core/cocoon-sitemap/cocoon-sitemap-impl/src/main/resources/org/apache/cocoon/sitemap/schema/
cocoon/trunk/core/cocoon-sitemap/cocoon-sitemap-impl/src/main/resources/org/apache/cocoon/sitemap/schema/cocoon-sitemap-1.0.xsd
Modified:
cocoon/trunk/core/cocoon-sitemap/cocoon-sitemap-impl/pom.xml
cocoon/trunk/core/cocoon-sitemap/cocoon-sitemap-impl/src/main/java/org/apache/cocoon/components/treeprocessor/TreeProcessor.java
Modified: cocoon/trunk/core/cocoon-sitemap/cocoon-sitemap-impl/pom.xml
URL: http://svn.apache.org/viewvc/cocoon/trunk/core/cocoon-sitemap/cocoon-sitemap-impl/pom.xml?view=diff&rev=505258&r1=505257&r2=505258
==============================================================================
--- cocoon/trunk/core/cocoon-sitemap/cocoon-sitemap-impl/pom.xml (original)
+++ cocoon/trunk/core/cocoon-sitemap/cocoon-sitemap-impl/pom.xml Fri Feb 9 03:44:50 2007
@@ -163,6 +163,11 @@
</dependency>
<dependency>
+ <groupId>xml-apis</groupId>
+ <artifactId>xml-apis</artifactId>
+ <version>1.3.02</version>
+ </dependency>
+ <dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.4</version>
Modified: cocoon/trunk/core/cocoon-sitemap/cocoon-sitemap-impl/src/main/java/org/apache/cocoon/components/treeprocessor/TreeProcessor.java
URL: http://svn.apache.org/viewvc/cocoon/trunk/core/cocoon-sitemap/cocoon-sitemap-impl/src/main/java/org/apache/cocoon/components/treeprocessor/TreeProcessor.java?view=diff&rev=505258&r1=505257&r2=505258
==============================================================================
--- cocoon/trunk/core/cocoon-sitemap/cocoon-sitemap-impl/src/main/java/org/apache/cocoon/components/treeprocessor/TreeProcessor.java (original)
+++ cocoon/trunk/core/cocoon-sitemap/cocoon-sitemap-impl/src/main/java/org/apache/cocoon/components/treeprocessor/TreeProcessor.java Fri Feb 9 03:44:50 2007
@@ -19,6 +19,12 @@
import java.io.IOException;
import java.net.URL;
+import javax.xml.XMLConstants;
+import javax.xml.transform.stream.StreamSource;
+import javax.xml.validation.Schema;
+import javax.xml.validation.SchemaFactory;
+import javax.xml.validation.Validator;
+
import org.apache.avalon.framework.activity.Disposable;
import org.apache.avalon.framework.activity.Initializable;
import org.apache.avalon.framework.configuration.Configurable;
@@ -101,12 +107,23 @@
/** The actual processor */
protected ConcreteTreeProcessor concreteProcessor;
+ /** The sitemap schema used for validation. */
+ protected Schema sitemapSchema;
+
/**
* Create a TreeProcessor.
*/
public TreeProcessor() {
this.checkReload = true;
this.lastModifiedDelay = 1000;
+ // create sitemap schema
+ final SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
+ final StreamSource ss = new StreamSource(this.getClass().getResourceAsStream("/org/apache/cocoon/sitemap/schema/cocoon-sitemap-1.0.xsd"));
+ try {
+ this.sitemapSchema = factory.newSchema(ss);
+ } catch (SAXException se) {
+ throw new RuntimeException("Unable to parse sitemap schema.", se);
+ }
}
/**
@@ -135,6 +152,7 @@
ContainerUtil.service(this.environmentHelper, this.manager);
this.environmentHelper.changeContext(sitemapSource, prefix);
this.sitemapExecutor = parent.sitemapExecutor;
+ this.sitemapSchema = parent.sitemapSchema;
}
/**
@@ -328,6 +346,15 @@
private Configuration createSitemapProgram(Source sitemapSource)
throws ProcessingException, SAXException, IOException {
+ // do we validate? Default is false
+ final String value = this.settings.getProperty("org.apache.cocoon.sitemap.validating", "false");
+ if ( Boolean.valueOf(value).booleanValue() ) {
+ if ( this.getLogger().isDebugEnabled() ) {
+ this.getLogger().debug("Validating sitemap " + sitemapSource.getURI());
+ }
+ final Validator validator = this.sitemapSchema.newValidator();
+ validator.validate(new StreamSource(sitemapSource.getInputStream()));
+ }
NamespacedSAXConfigurationHandler handler = new NamespacedSAXConfigurationHandler();
AnnotationsFilter annotationsFilter = new AnnotationsFilter(handler);
SourceUtil.toSAX(this.manager, sitemapSource, null, annotationsFilter);
Added: cocoon/trunk/core/cocoon-sitemap/cocoon-sitemap-impl/src/main/resources/META-INF/cocoon/properties/dev/cocoon-core-sitemap.properties
URL: http://svn.apache.org/viewvc/cocoon/trunk/core/cocoon-sitemap/cocoon-sitemap-impl/src/main/resources/META-INF/cocoon/properties/dev/cocoon-core-sitemap.properties?view=auto&rev=505258
==============================================================================
--- cocoon/trunk/core/cocoon-sitemap/cocoon-sitemap-impl/src/main/resources/META-INF/cocoon/properties/dev/cocoon-core-sitemap.properties (added)
+++ cocoon/trunk/core/cocoon-sitemap/cocoon-sitemap-impl/src/main/resources/META-INF/cocoon/properties/dev/cocoon-core-sitemap.properties Fri Feb 9 03:44:50 2007
@@ -0,0 +1,17 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Validate a sitemap when it is loaded
+org.apache.cocoon.sitemap.validation=true
Added: cocoon/trunk/core/cocoon-sitemap/cocoon-sitemap-impl/src/main/resources/org/apache/cocoon/sitemap/schema/cocoon-sitemap-1.0.xsd
URL: http://svn.apache.org/viewvc/cocoon/trunk/core/cocoon-sitemap/cocoon-sitemap-impl/src/main/resources/org/apache/cocoon/sitemap/schema/cocoon-sitemap-1.0.xsd?view=auto&rev=505258
==============================================================================
--- cocoon/trunk/core/cocoon-sitemap/cocoon-sitemap-impl/src/main/resources/org/apache/cocoon/sitemap/schema/cocoon-sitemap-1.0.xsd (added)
+++ cocoon/trunk/core/cocoon-sitemap/cocoon-sitemap-impl/src/main/resources/org/apache/cocoon/sitemap/schema/cocoon-sitemap-1.0.xsd Fri Feb 9 03:44:50 2007
@@ -0,0 +1,513 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<!--+
+ | XML Schema for the sitemap
+ |
+ | @version $Id$
+ +-->
+<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ targetNamespace="http://apache.org/cocoon/sitemap/1.0"
+ xmlns:map="http://apache.org/cocoon/sitemap/1.0"
+ xmlns="http://apache.org/cocoon/sitemap/1.0">
+
+ <xsd:element name="sitemap">
+ <xsd:annotation>
+ <xsd:documentation>
+ This is the root element of a sitemap.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:all>
+ <xsd:element ref="components" minOccurs="0" maxOccurs="1"/>
+ <xsd:element ref="resources" minOccurs="0" maxOccurs="1"/>
+ <xsd:element ref="views" minOccurs="0" maxOccurs="1"/>
+ <xsd:element ref="flow" minOccurs="0" maxOccurs="1"/>
+ <xsd:element ref="action-sets" minOccurs="0" maxOccurs="1"/>
+ <xsd:element ref="pipelines" minOccurs="1" maxOccurs="1"/>
+ </xsd:all>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="components">
+ <xsd:complexType>
+ <xsd:all>
+ <xsd:element ref="generators" minOccurs="0" maxOccurs="1"/>
+ <xsd:element ref="transformers" minOccurs="0" maxOccurs="1"/>
+ <xsd:element ref="serializers" minOccurs="0" maxOccurs="1"/>
+ <xsd:element ref="readers" minOccurs="0" maxOccurs="1"/>
+ <xsd:element ref="selectors" minOccurs="0" maxOccurs="1"/>
+ <xsd:element ref="matchers" minOccurs="0" maxOccurs="1"/>
+ <xsd:element ref="actions" minOccurs="0" maxOccurs="1"/>
+ <xsd:element ref="pipes" minOccurs="0" maxOccurs="1"/>
+ </xsd:all>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="generators">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="generator" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ <xsd:attribute name="default" type="xsd:string" use="optional"/>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="transformers">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="transformer" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ <xsd:attribute name="default" type="xsd:string" use="optional"/>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="serializers">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="serializer" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ <xsd:attribute name="default" type="xsd:string" use="optional"/>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="readers">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="reader" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ <xsd:attribute name="default" type="xsd:string" use="optional"/>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="selectors">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="selector" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ <xsd:attribute name="default" type="xsd:string" use="optional"/>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="matchers">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="matcher" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ <xsd:attribute name="default" type="xsd:string" use="optional"/>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="actions">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="action" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="pipes">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="pipe" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ <xsd:attribute name="default" type="xsd:string" use="optional"/>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="generator">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:any namespace="##any" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required"/>
+ <xsd:attribute name="src" type="xsd:string" use="required"/>
+ <xsd:attribute name="logger" type="xsd:string" use="optional"/>
+ <xsd:attribute name="label" type="xsd:string" use="optional"/>
+ <xsd:attribute name="pool-max" type="xsd:string" use="optional"/>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="transformer">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:any namespace="##any" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required"/>
+ <xsd:attribute name="src" type="xsd:string" use="required"/>
+ <xsd:attribute name="logger" type="xsd:string" use="optional"/>
+ <xsd:attribute name="label" type="xsd:string" use="optional"/>
+ <xsd:attribute name="pool-max" type="xsd:string" use="optional"/>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="serializer">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:any namespace="##any" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required"/>
+ <xsd:attribute name="src" type="xsd:string" use="required"/>
+ <xsd:attribute name="logger" type="xsd:string" use="optional"/>
+ <xsd:attribute name="label" type="xsd:string" use="optional"/>
+ <xsd:attribute name="mime-type" type="xsd:string" use="optional"/>
+ <xsd:attribute name="pool-max" type="xsd:string" use="optional"/>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="reader">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:any namespace="##any" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required"/>
+ <xsd:attribute name="src" type="xsd:string" use="required"/>
+ <xsd:attribute name="logger" type="xsd:string" use="optional"/>
+ <xsd:attribute name="label" type="xsd:string" use="optional"/>
+ <xsd:attribute name="mime-type" type="xsd:string" use="optional"/>
+ <xsd:attribute name="pool-max" type="xsd:string" use="optional"/>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="selector">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:any namespace="##any" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required"/>
+ <xsd:attribute name="src" type="xsd:string" use="required"/>
+ <xsd:attribute name="logger" type="xsd:string" use="optional"/>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="matcher">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:any namespace="##any" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required"/>
+ <xsd:attribute name="src" type="xsd:string" use="required"/>
+ <xsd:attribute name="logger" type="xsd:string" use="optional"/>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="action">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:any namespace="##any" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required"/>
+ <xsd:attribute name="src" type="xsd:string" use="required"/>
+ <xsd:attribute name="logger" type="xsd:string" use="optional"/>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="pipe">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:any namespace="##any" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required"/>
+ <xsd:attribute name="src" type="xsd:string" use="required"/>
+ <xsd:attribute name="logger" type="xsd:string" use="optional"/>
+ <xsd:attribute name="pool-max" type="xsd:string" use="optional"/>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="resources">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="resource" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="resource">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:group ref="pipeline-content"/>
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required"/>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="views">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="view" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="view">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:group ref="pipeline-content"/>
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required"/>
+ <xsd:attribute name="from-label" type="xsd:string" use="optional"/>
+ <xsd:attribute name="from-position" type="xsd:string" use="optional"/>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="flow">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="script" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ <xsd:attribute name="language" type="xsd:string" use="required"/>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="script">
+ <xsd:complexType>
+ <xsd:attribute name="src" type="xsd:string" use="required"/>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="action-sets">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="action-set" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="action-set">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="act">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="parameter" minOccurs="0" maxOccurs="unbounded"/>
+ <xsd:element ref="act" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ <xsd:attribute name="action" type="xsd:string" use="optional"/>
+ <xsd:attribute name="type" type="xsd:string" use="required"/>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required"/>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="pipelines">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="component-configurations" minOccurs="0" maxOccurs="1"/>
+ <xsd:element ref="pipeline" minOccurs="0" maxOccurs="unbounded"/>
+ <xsd:element ref="handle-errors" minOccurs="0" maxOccurs="1"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="component-configurations">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:any namespace="##any" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="pipeline">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="parameter" minOccurs="0" maxOccurs="unbounded"/>
+ <xsd:group ref="pipeline-content"/>
+ <xsd:element ref="handle-errors" minOccurs="0" maxOccurs="1"/>
+ </xsd:sequence>
+ <xsd:attribute name="type" type="xsd:string" use="optional"/>
+ <xsd:attribute name="internal-only" type="xsd:string" use="optional"/>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="parameter">
+ <xsd:complexType>
+ <xsd:attribute name="name" type="xsd:string" use="required"/>
+ <xsd:attribute name="value" type="xsd:string" use="required"/>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:group name="pipeline-content">
+ <xsd:sequence>
+ <xsd:choice minOccurs="0" maxOccurs="unbounded">
+ <xsd:element ref="match"/>
+ <xsd:element ref="mount"/>
+ <xsd:element ref="call"/>
+ <xsd:element ref="aggregate"/>
+ <xsd:element ref="generate"/>
+ <xsd:element ref="transform"/>
+ <xsd:element ref="serialize"/>
+ <xsd:element ref="read"/>
+ <xsd:element ref="select"/>
+ <xsd:element ref="act"/>
+ <xsd:element ref="redirect-to"/>
+ </xsd:choice>
+ </xsd:sequence>
+ </xsd:group>
+
+ <xsd:element name="match">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="parameter" minOccurs="0" maxOccurs="unbounded"/>
+ <xsd:group ref="pipeline-content"/>
+ </xsd:sequence>
+ <xsd:attribute name="type" type="xsd:string" use="optional"/>
+ <xsd:attribute name="pattern" type="xsd:string" use="optional"/>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="mount">
+ <xsd:complexType>
+ <xsd:attribute name="src" type="xsd:string" use="required"/>
+ <xsd:attribute name="check-reload" type="xsd:string" use="optional"/>
+ <xsd:attribute name="uri-prefix" type="xsd:string" use="optional"/>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="call">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="parameter" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ <xsd:attribute name="resource" type="xsd:string" use="optional"/>
+ <xsd:attribute name="function" type="xsd:string" use="optional"/>
+ <xsd:attribute name="continuation" type="xsd:string" use="optional"/>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="aggregate">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="part" minOccurs="1" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ <xsd:attribute name="element" type="xsd:string" use="required"/>
+ <xsd:attribute name="ns" type="xsd:string" use="optional"/>
+ <xsd:attribute name="prefix" type="xsd:string" use="optional"/>
+ <xsd:attribute name="label" type="xsd:string" use="optional"/>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="part">
+ <xsd:complexType>
+ <xsd:attribute name="src" type="xsd:string" use="required"/>
+ <xsd:attribute name="element" type="xsd:string" use="optional"/>
+ <xsd:attribute name="ns" type="xsd:string" use="optional"/>
+ <xsd:attribute name="prefix" type="xsd:string" use="optional"/>
+ <xsd:attribute name="strip-root" type="xsd:string" use="optional"/>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="generate">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="parameter" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ <xsd:attribute name="src" type="xsd:string" use="optional"/>
+ <xsd:attribute name="type" type="xsd:string" use="optional"/>
+ <xsd:attribute name="label" type="xsd:string" use="optional"/>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="transform">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="parameter" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ <xsd:attribute name="src" type="xsd:string" use="optional"/>
+ <xsd:attribute name="type" type="xsd:string" use="optional"/>
+ <xsd:attribute name="label" type="xsd:string" use="optional"/>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="serialize">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="parameter" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ <xsd:attribute name="src" type="xsd:string" use="optional"/>
+ <xsd:attribute name="type" type="xsd:string" use="optional"/>
+ <xsd:attribute name="status-code" type="xsd:string" use="optional"/>
+ <xsd:attribute name="label" type="xsd:string" use="optional"/>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="read">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="parameter" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ <xsd:attribute name="src" type="xsd:string" use="optional"/>
+ <xsd:attribute name="type" type="xsd:string" use="optional"/>
+ <xsd:attribute name="mime-type" type="xsd:string" use="optional"/>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="select">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="parameter" minOccurs="0" maxOccurs="unbounded"/>
+ <xsd:element ref="when" minOccurs="0" maxOccurs="unbounded"/>
+ <xsd:element ref="otherwise" minOccurs="0" maxOccurs="1"/>
+ </xsd:sequence>
+ <xsd:attribute name="type" type="xsd:string" use="optional"/>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="when">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:group ref="pipeline-content"/>
+ </xsd:sequence>
+ <xsd:attribute name="test" type="xsd:string" use="required"/>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="otherwise">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:group ref="pipeline-content"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="act">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="parameter" minOccurs="0" maxOccurs="unbounded"/>
+ <xsd:group ref="pipeline-content"/>
+ </xsd:sequence>
+ <xsd:attribute name="type" type="xsd:string" use="optional"/>
+ <xsd:attribute name="set" type="xsd:string" use="optional"/>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="redirect-to">
+ <xsd:complexType>
+ <xsd:attribute name="uri" type="xsd:string" use="optional"/>
+ <xsd:attribute name="resource" type="xsd:string" use="optional"/>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="handle-errors">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:group ref="pipeline-content"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+</xsd:schema>
\ No newline at end of file