You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ofbiz.apache.org by ad...@apache.org on 2012/04/20 12:26:39 UTC

svn commit: r1328302 [2/3] - in /ofbiz/trunk/framework/minilang: config/ dtd/ src/org/ofbiz/minilang/ src/org/ofbiz/minilang/method/

Added: ofbiz/trunk/framework/minilang/dtd/simple-methods-v2.xsd
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/minilang/dtd/simple-methods-v2.xsd?rev=1328302&view=auto
==============================================================================
--- ofbiz/trunk/framework/minilang/dtd/simple-methods-v2.xsd (added)
+++ ofbiz/trunk/framework/minilang/dtd/simple-methods-v2.xsd Fri Apr 20 10:26:38 2012
@@ -0,0 +1,5278 @@
+<?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.
+-->
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
+<!--
+    ==================================================
+    ========== The Simple Methods Section ==========
+    ==================================================
+    (see further down for the Simple Map Processor Section)
+-->
+
+  <!-- Reusable artifacts (abstract elements, groups, attributeGroups -->
+    <xs:element name="CallOperations" abstract="true"/>
+    <xs:element name="EventOperations" abstract="true"/>
+    <xs:element name="ServiceOperations" abstract="true"/>
+    <xs:element name="EnvOperations" abstract="true"/>
+    <xs:element name="EntityMiscOperations" abstract="true"/>
+    <xs:element name="EntityFindOperations" abstract="true"/>
+    <xs:element name="EntityValueOperations" abstract="true"/>
+    <xs:element name="EntityListOperations" abstract="true"/>
+    <xs:element name="EntityTxOperations" abstract="true"/>
+    <xs:element name="ControlOperations" abstract="true"/>
+    <xs:element name="IfBasicOperations" abstract="true"/>
+    <xs:element name="IfOtherOperations" abstract="true"/>
+    <xs:element name="OtherOperations" abstract="true"/>
+    <xs:group name="AllOperations"> <!-- Any simple-method operation can be nested under an if-* tag. -->
+        <xs:choice>
+            <xs:element ref="CallOperations"/>
+            <xs:element ref="EventOperations"/>
+            <xs:element ref="ServiceOperations"/>
+            <xs:element ref="EnvOperations"/>
+            <xs:element ref="EntityMiscOperations"/>
+            <xs:element ref="EntityFindOperations"/>
+            <xs:element ref="EntityValueOperations"/>
+            <xs:element ref="EntityListOperations"/>
+            <xs:element ref="EntityTxOperations"/>
+            <xs:element ref="ControlOperations"/>
+            <xs:element ref="IfBasicOperations"/>
+            <xs:element ref="IfOtherOperations"/>
+            <xs:element ref="OtherOperations"/>
+        </xs:choice>
+    </xs:group>
+
+    <xs:attributeGroup name="attlist.propertyInfoOptional">
+        <xs:attribute type="xs:string" name="resource"/>
+        <xs:attribute type="xs:string" name="property"/>
+    </xs:attributeGroup>
+    <xs:attributeGroup name="attlist.typeDefaultString">
+        <xs:attribute name="type" default="String">
+            <xs:simpleType>
+                <xs:restriction base="xs:token">
+                    <xs:enumeration value="PlainString"/>
+                    <xs:enumeration value="String"/>
+                    <xs:enumeration value="BigDecimal"/>
+                    <xs:enumeration value="Double"/>
+                    <xs:enumeration value="Float"/>
+                    <xs:enumeration value="Long"/>
+                    <xs:enumeration value="Integer"/>
+                    <xs:enumeration value="Date"/>
+                    <xs:enumeration value="Time"/>
+                    <xs:enumeration value="Timestamp"/>
+                    <xs:enumeration value="Boolean"/>
+                    <xs:enumeration value="Object"/>
+                </xs:restriction>
+            </xs:simpleType>
+        </xs:attribute>
+    </xs:attributeGroup>
+    <xs:attributeGroup name="attlist.operatorRequired">
+        <xs:attribute name="operator" use="required">
+            <xs:simpleType>
+                <xs:restriction base="xs:token">
+                    <xs:enumeration value="less"/>
+                    <xs:enumeration value="greater"/>
+                    <xs:enumeration value="less-equals"/>
+                    <xs:enumeration value="greater-equals"/>
+                    <xs:enumeration value="equals"/>
+                    <xs:enumeration value="not-equals"/>
+                    <xs:enumeration value="contains"/>
+                </xs:restriction>
+            </xs:simpleType>
+        </xs:attribute>
+    </xs:attributeGroup>
+
+  <!-- ELEMENTS start here -->
+    <xs:element name="field">
+        <xs:annotation>
+            <xs:documentation>
+                Used to specify a field to be passed as an argument to the method call.
+                The field can be in a map in the environment or if no map-name is specified
+                then the field will come directly from the environment.
+
+                With the "." Syntax, the map-name is typically no longer necessary because
+                you can do map-name.field-name in the field-name attribute, but those are still there for legacy purposes.
+            </xs:documentation>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:attributeGroup ref="attlist.field"/>
+        </xs:complexType>
+    </xs:element>
+    <xs:attributeGroup name="attlist.field">
+        <xs:attribute type="xs:string" name="field" use="required">
+            <xs:annotation><xs:documentation>Name of the field to put value in.</xs:documentation></xs:annotation>
+        </xs:attribute>
+        <xs:attribute type="xs:string" name="type">
+            <xs:annotation>
+                <xs:documentation>
+                    Type of the value put in the field.
+                    If this is a method call or object creation and the type in the method signature being called is for a parent class or interface,
+                    then it should be the type in that parent class or interface and not the type of the object being passed in.
+                </xs:documentation>
+            </xs:annotation>
+        </xs:attribute>
+    </xs:attributeGroup>
+    <xs:element name="string">
+        <xs:annotation>
+            <xs:documentation>
+                String of type java.lang.String. Inserts the value of the inline string where specified.
+            </xs:documentation>
+        </xs:annotation>
+        <xs:complexType mixed="true">
+            <xs:attributeGroup ref="attlist.string"/>
+        </xs:complexType>
+    </xs:element>
+    <xs:attributeGroup name="attlist.string">
+        <xs:attribute type="xs:string" name="value"/>
+    </xs:attributeGroup>
+    <xs:element name="simple-methods">
+        <xs:annotation>
+            <xs:documentation>
+                Opening tag of simple-method files.
+            </xs:documentation>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:sequence>
+                <xs:element maxOccurs="unbounded" ref="simple-method">
+                    <xs:annotation>
+                        <xs:documentation>
+                            Opening tag of a simple-method definition.
+                        </xs:documentation>
+                    </xs:annotation>
+                </xs:element>
+            </xs:sequence>
+        </xs:complexType>
+    </xs:element>
+    <xs:element name="simple-method">
+        <xs:annotation>
+            <xs:documentation>
+                A simple method can be called in either an event context from the Control
+                Servlet (or another event) or in a service context through the Service
+                Engine, or any other component that has access to a service dispatcher.
+
+                The field-to-request and field-to-session elements will be IGNORED when
+                called in a service context. So, they are ONLY used when called in an event context.
+
+                The field-to-result elements will be ignored in an event context, ie only used in a service.
+
+                The parameter-map-name env entry will contain the HttpRequest parameters for
+                running in an event context and and the input context when running in a service.
+            </xs:documentation>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:group minOccurs="0" maxOccurs="unbounded" ref="AllOperations"/>
+            <xs:attributeGroup ref="attlist.simple-method"/>
+        </xs:complexType>
+    </xs:element>
+    <xs:attributeGroup name="attlist.simple-method">
+        <xs:attribute type="xs:string" name="method-name" use="required">
+            <xs:annotation>
+                <xs:documentation>
+                    A name (preferably a legal Java identifier) for this method.
+                    This name must be unique for the XML file it is in as it will be used to reference this method externally.
+                </xs:documentation>
+            </xs:annotation>
+        </xs:attribute>
+        <xs:attribute type="xs:string" name="short-description" use="required">
+            <xs:annotation>
+                <xs:documentation>
+                    A short description of the method for certain system error messages.
+                </xs:documentation>
+            </xs:annotation>
+        </xs:attribute>
+        <xs:attribute name="login-required" default="true">
+            <xs:annotation>
+                <xs:documentation>
+                    Is a logged in user (UserLogin object, or login.username and login.password Strings) required to run this method?
+                    "true" or "false" (defauts to "true")
+                </xs:documentation>
+            </xs:annotation>
+            <xs:simpleType>
+                <xs:restriction base="xs:token">
+                    <xs:enumeration value="true"/>
+                    <xs:enumeration value="false"/>
+                </xs:restriction>
+            </xs:simpleType>
+        </xs:attribute>
+        <xs:attribute name="use-transaction" default="true">
+            <xs:annotation>
+                <xs:documentation>
+                    Create a transaction if none exists for this thread?
+                    "true" or "false" (defauts to "true")
+                </xs:documentation>
+            </xs:annotation>
+            <xs:simpleType>
+                <xs:restriction base="xs:token">
+                    <xs:enumeration value="true"/>
+                    <xs:enumeration value="false"/>
+                </xs:restriction>
+            </xs:simpleType>
+        </xs:attribute>
+        <xs:attribute type="xs:string" name="default-error-code" default="error">
+            <xs:annotation>
+                <xs:documentation>
+                    The default error return code. (defauts to "error")
+                </xs:documentation>
+            </xs:annotation>
+        </xs:attribute>
+        <xs:attribute type="xs:string" name="default-success-code" default="success">
+            <xs:annotation>
+                <xs:documentation>
+                    The default success return code.  (defauts to "success")
+                </xs:documentation>
+            </xs:annotation>
+        </xs:attribute>
+        <xs:attribute type="xs:string" name="parameter-map-name" default="parameters">
+            <xs:annotation>
+                <xs:documentation>
+                    As event: copy of request parameters.
+                    As service: incoming context.
+                    (defauts to "parameters")
+                </xs:documentation>
+            </xs:annotation>
+        </xs:attribute>
+        <xs:attribute type="xs:string" name="event-request-object-name" default="request">
+            <xs:annotation>
+                <xs:documentation>
+                    As event only (defauts to "request")
+                </xs:documentation>
+            </xs:annotation>
+        </xs:attribute>
+        <xs:attribute type="xs:string" name="event-response-object-name" default="response">
+            <xs:annotation>
+                <xs:documentation>
+                    As event only (defauts to "response")
+                </xs:documentation>
+            </xs:annotation>
+        </xs:attribute>
+        <xs:attribute type="xs:string" name="event-response-code-name" default="_response_code_">
+            <xs:annotation>
+                <xs:documentation>
+                    As event only (defauts to "_response_code")
+                </xs:documentation>
+            </xs:annotation>
+        </xs:attribute>
+        <xs:attribute type="xs:string" name="event-error-message-name" default="_error_message_">
+            <xs:annotation>
+                <xs:documentation>
+                    As event only (defauts to "_error_message_")
+                </xs:documentation>
+            </xs:annotation>
+        </xs:attribute>
+        <xs:attribute type="xs:string" name="event-event-message-name" default="_event_message_">
+            <xs:annotation>
+                <xs:documentation>
+                    As event only (defauts to "_event_message_")
+                </xs:documentation>
+            </xs:annotation>
+        </xs:attribute>
+        <xs:attribute type="xs:string" name="service-response-message-name" default="responseMessage">
+            <xs:annotation>
+                <xs:documentation>
+                    As service only (defauts to "responseMessage")
+                </xs:documentation>
+            </xs:annotation>
+        </xs:attribute>
+        <xs:attribute type="xs:string" name="service-error-message-name" default="errorMessage">
+            <xs:annotation>
+                <xs:documentation>
+                    As service only (defauts to "errorMessage")
+                </xs:documentation>
+            </xs:annotation>
+        </xs:attribute>
+        <xs:attribute type="xs:string" name="service-error-message-list-name" default="errorMessageList">
+            <xs:annotation>
+                <xs:documentation>
+                    As service only (defauts to "errorMessageList")
+                </xs:documentation>
+            </xs:annotation>
+        </xs:attribute>
+        <xs:attribute type="xs:string" name="service-error-message-map-name" default="errorMessageMap">
+            <xs:annotation>
+                <xs:documentation>
+                    As service only (defauts to "errorMessageMap")
+                </xs:documentation>
+            </xs:annotation>
+        </xs:attribute>
+        <xs:attribute type="xs:string" name="service-success-message-name" default="successMessage">
+            <xs:annotation>
+                <xs:documentation>
+                    As service only (defauts to "successMessage")
+                </xs:documentation>
+            </xs:annotation>
+        </xs:attribute>
+        <xs:attribute type="xs:string" name="service-success-message-list-name" default="successMessageList">
+            <xs:annotation>
+                <xs:documentation>
+                    As service only (defauts to "successMessageList")
+                </xs:documentation>
+            </xs:annotation>
+        </xs:attribute>
+        <xs:attribute type="xs:string" name="locale-name" default="locale">
+            <xs:annotation>
+                <xs:documentation>
+                    Name of locale variable (defauts to "locale")
+                </xs:documentation>
+            </xs:annotation>
+        </xs:attribute>
+        <xs:attribute type="xs:string" name="delegator-name" default="delegator">
+            <xs:annotation>
+                <xs:documentation>
+                    A GenericDelegator object to use in the method (defauts to "delegator")
+                </xs:documentation>
+            </xs:annotation>
+        </xs:attribute>
+        <xs:attribute type="xs:string" name="security-name" default="security">
+            <xs:annotation>
+                <xs:documentation>
+                    A Security object to use in the method (defauts to "security")
+                </xs:documentation>
+            </xs:annotation>
+        </xs:attribute>
+        <xs:attribute type="xs:string" name="dispatcher-name" default="dispatcher">
+            <xs:annotation>
+                <xs:documentation>
+                    A LocalDispatcher object to use in the method (defauts to "dispatcher")
+                </xs:documentation>
+            </xs:annotation>
+        </xs:attribute>
+        <xs:attribute type="xs:string" name="user-login-name" default="userLogin">
+            <xs:annotation>
+                <xs:documentation>
+                    Name of user login variable (defauts to "userLogin")
+                </xs:documentation>
+            </xs:annotation>
+        </xs:attribute>
+    </xs:attributeGroup>
+    <xs:element name="call-map-processor" substitutionGroup="CallOperations">
+        <xs:annotation>
+            <xs:documentation>
+                The call-map-processor tag invokes a simple map processor from an existing map, creating a new map or adding to an existing one
+                if the named out-map already exists. Resulting messages are added to the named list, and a new list is created if a list with
+                the given name does not yet exist. Note that all lists and maps exist in the same context and must have unique names.
+
+                An inline simple-map-processor can be used by putting a simple-map-processor tag under the call-map-processor tag.
+
+                If both an external and an inline map-processor are specified, the external
+                one will be called first, allowing the inline one to override its behavior.
+            </xs:documentation>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:sequence>
+                <xs:element minOccurs="0" ref="simple-map-processor">
+                    <xs:annotation>
+                        <xs:documentation>
+                            Uses the same definition as the simple-map-processor in the context of a simple-map-processors XML file.
+                            Allows for an inlined simple-map-processor.
+                        </xs:documentation>
+                    </xs:annotation>
+                </xs:element>
+            </xs:sequence>
+            <xs:attributeGroup ref="attlist.call-map-processor"/>
+        </xs:complexType>
+    </xs:element>
+    <xs:attributeGroup name="attlist.call-map-processor">
+        <xs:attribute type="xs:string" name="xml-resource">
+            <xs:annotation>
+                <xs:documentation>
+                    The full path and filename on the classpath of the XML file which contains an external map processor to execute.
+                    This is only required if an external map processor is desired.
+                </xs:documentation>
+            </xs:annotation>
+        </xs:attribute>
+        <xs:attribute type="xs:string" name="processor-name">
+            <xs:annotation>
+                <xs:documentation>
+                    The name of the external map processor to execute in the specified xml-resource.
+                    This is only required if an external map processor is desired.
+                </xs:documentation>
+            </xs:annotation>
+        </xs:attribute>
+        <xs:attribute type="xs:string" name="in-map-name" use="required">
+            <xs:annotation>
+                <xs:documentation>
+                    The name of a map in the method environment to use as the input map.
+                </xs:documentation>
+            </xs:annotation>
+        </xs:attribute>
+        <xs:attribute type="xs:string" name="out-map-name" use="required">
+            <xs:annotation>
+                <xs:documentation>
+                    The name of a map in the method environment to use as the output map.
+                    Will be created if it does not exist already.
+                    If already exists will be added to in place.
+                </xs:documentation>
+            </xs:annotation>
+        </xs:attribute>
+        <xs:attribute type="xs:string" name="error-list-name" default="error_list">
+            <xs:annotation>
+                <xs:documentation>
+                    The name of a list in the method environment that the error messages will be added to.
+                    Will be created if it does not exist.
+                    Defaults to "error_list".
+                </xs:documentation>
+            </xs:annotation>
+        </xs:attribute>
+    </xs:attributeGroup>
+    <xs:element name="set-service-fields" substitutionGroup="CallOperations">
+        <xs:annotation>
+            <xs:documentation>
+                Take all the incoming files for this service, or all the incoming service attributes,
+                and look for fields with the same name in the incoming map and copy those onto the outgoing map.
+            </xs:documentation>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:attributeGroup ref="attlist.set-service-fields"/>
+        </xs:complexType>
+    </xs:element>
+    <xs:attributeGroup name="attlist.set-service-fields">
+        <xs:attribute type="xs:string" name="service-name" use="required">
+            <xs:annotation><xs:documentation>Name of the service to get all the incoming attributes (parameters) from.</xs:documentation></xs:annotation>
+        </xs:attribute>
+        <xs:attribute type="xs:string" name="map" use="required">
+            <xs:annotation><xs:documentation>Incoming map to copy fields from.</xs:documentation></xs:annotation>
+        </xs:attribute>
+        <xs:attribute type="xs:string" name="to-map" use="required">
+            <xs:annotation><xs:documentation>Map to copy to fields to.</xs:documentation></xs:annotation>
+        </xs:attribute>
+        <xs:attribute type="xs:string" name="error-list-name" default="error_list">
+            <xs:annotation>
+                <xs:documentation>
+                    The name of a list in the method environment that the error messages will be added to.
+                    Will be created if it does not exist.
+                    Defaults to "error_list".
+                </xs:documentation>
+            </xs:annotation>
+        </xs:attribute>
+    </xs:attributeGroup>
+    <xs:element name="call-service" substitutionGroup="CallOperations">
+        <xs:annotation>
+            <xs:documentation>
+                The call-service tag invokes a service through the Service Engine.
+                If the specified error code is returned from the service,
+                the event is aborted and the transaction in the current thread is rolled back.
+                Otherwise, the remaining operations are invoked.
+
+                The result-to-request and result-to-session elements will be IGNORED when
+                called in a service context. So, they are ONLY used when called in an event context.
+            </xs:documentation>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:sequence>
+                <xs:element minOccurs="0" ref="error-prefix"/>
+                <xs:element minOccurs="0" ref="error-suffix"/>
+                <xs:element minOccurs="0" ref="success-prefix"/>
+                <xs:element minOccurs="0" ref="success-suffix"/>
+                <xs:element minOccurs="0" ref="message-prefix"/>
+                <xs:element minOccurs="0" ref="message-suffix"/>
+                <xs:element minOccurs="0" ref="default-message"/>
+                <xs:choice minOccurs="0" maxOccurs="unbounded">
+                    <xs:element ref="results-to-map"/>
+                    <xs:element ref="result-to-field"/>
+                    <xs:element ref="result-to-request"/>
+                    <xs:element ref="result-to-session"/>
+                    <xs:element ref="result-to-result"/>
+                </xs:choice>
+            </xs:sequence>
+            <xs:attributeGroup ref="attlist.call-service"/>
+        </xs:complexType>
+    </xs:element>
+    <xs:attributeGroup name="attlist.call-service">
+        <xs:attribute type="xs:string" name="service-name" use="required">
+            <xs:annotation>
+                <xs:documentation>
+                    Name of the service to call.
+                </xs:documentation>
+            </xs:annotation>
+        </xs:attribute>
+        <xs:attribute type="xs:string" name="in-map-name">
+            <xs:annotation>
+                <xs:documentation>
+                    Optional name of a map in the method environment to use as the input map.
+                    If you're not going to pass any parameters to the service than you can just
+                    leave off the in-map name, although typically in a service tag you will see
+                    a service-name and the in-mapname passed in.
+                </xs:documentation>
+            </xs:annotation>
+        </xs:attribute>
+        <xs:attribute name="include-user-login" default="true">
+            <xs:annotation>
+                <xs:documentation>
+                    Include-user-login by default will include the user login
+                    so if there is a user login for the current simple-method
+                    it will pass that in to the service. If you don't want it to
+                    pass that in you can just set this to false.
+                    Defaults to "true".
+                </xs:documentation>
+            </xs:annotation>
+            <xs:simpleType>
+                <xs:annotation>
+                </xs:annotation>
+                <xs:restriction base="xs:token">
+                    <xs:enumeration value="true"/>
+                    <xs:enumeration value="false"/>
+                </xs:restriction>
+            </xs:simpleType>
+        </xs:attribute>
+        <xs:attribute name="break-on-error" default="true">
+            <xs:annotation>
+                <xs:documentation>
+                    If there's an error in the service by default
+                    it will stop the current simple-method and return an
+                    error message that came from the service it called. If
+                    you don't want it to when there's an error you can just
+                    set that to false.
+                    Defaults to "true".
+                </xs:documentation>
+            </xs:annotation>
+            <xs:simpleType>
+                <xs:restriction base="xs:token">
+                    <xs:enumeration value="true"/>
+                    <xs:enumeration value="false"/>
+                </xs:restriction>
+            </xs:simpleType>
+        </xs:attribute>
+        <xs:attribute type="xs:string" name="error-code" default="error">
+            <xs:annotation>
+                <xs:documentation>
+                    Defaults to "error".
+                </xs:documentation>
+            </xs:annotation>
+        </xs:attribute>
+        <xs:attribute type="xs:string" name="success-code" default="success">
+            <xs:annotation>
+                <xs:documentation>
+                    Defaults to "success".
+                </xs:documentation>
+            </xs:annotation>
+        </xs:attribute>
+        <xs:attribute name="require-new-transaction" default="false">
+            <xs:annotation>
+                <xs:documentation>
+                    Defines if the simple-method requires a new transaction or not.
+                    Defaults to "false".
+                </xs:documentation>
+            </xs:annotation>
+            <xs:simpleType>
+                <xs:restriction base="xs:token">
+                    <xs:enumeration value="true"/>
+                    <xs:enumeration value="false"/>
+                </xs:restriction>
+            </xs:simpleType>
+        </xs:attribute>
+        <xs:attribute type="xs:string" name="transaction-timeout">
+            <xs:annotation>
+                <xs:documentation>
+                    Defines the timeout for the transaction, in seconds.
+                    Defaults to the value set in the service definition which in turn defaults to the setting 
+                    in the TransactionFactory being used (typically 60 seconds).
+                </xs:documentation>
+            </xs:annotation>
+        </xs:attribute>
+    </xs:attributeGroup>
+    <xs:element name="error-prefix">
+        <xs:annotation>
+            <xs:documentation>
+                Specify a resource and a property to prepend to the error message.
+            </xs:documentation>
+        </xs:annotation>
+        <xs:complexType mixed="true">
+            <xs:attributeGroup ref="attlist.propertyInfoOptional"/>
+        </xs:complexType>
+    </xs:element>
+    <xs:element name="error-suffix">
+        <xs:annotation>
+            <xs:documentation>
+                Specify a resource and a property to append to the error message.
+            </xs:documentation>
+        </xs:annotation>
+        <xs:complexType mixed="true">
+            <xs:attributeGroup ref="attlist.propertyInfoOptional"/>
+        </xs:complexType>
+    </xs:element>
+    <xs:element name="success-prefix">
+        <xs:annotation>
+            <xs:documentation>
+                Specify a resource and a property to prepend to the success message.
+            </xs:documentation>
+        </xs:annotation>
+        <xs:complexType mixed="true">
+            <xs:attributeGroup ref="attlist.propertyInfoOptional"/>
+        </xs:complexType>
+    </xs:element>
+    <xs:element name="success-suffix">
+        <xs:annotation>
+            <xs:documentation>
+                Specify a resource and a property to append to the success message.
+            </xs:documentation>
+        </xs:annotation>
+        <xs:complexType mixed="true">
+            <xs:attributeGroup ref="attlist.propertyInfoOptional"/>
+        </xs:complexType>
+    </xs:element>
+    <xs:element name="message-prefix">
+        <xs:annotation>
+            <xs:documentation>
+                Specify a resource and a property to prepend to any kind of message.
+            </xs:documentation>
+        </xs:annotation>
+        <xs:complexType mixed="true">
+            <xs:attributeGroup ref="attlist.propertyInfoOptional"/>
+        </xs:complexType>
+    </xs:element>
+    <xs:element name="message-suffix">
+        <xs:annotation>
+            <xs:documentation>
+                Specify a resource and a property to append to any kind of message.
+            </xs:documentation>
+        </xs:annotation>
+        <xs:complexType mixed="true">
+            <xs:attributeGroup ref="attlist.propertyInfoOptional"/>
+        </xs:complexType>
+    </xs:element>
+    <xs:element name="default-message">
+        <xs:annotation>
+            <xs:documentation>
+                Message that you can specify for the case where the service does not return a message.
+                You can just specify a default-message to use as if the service had returned that default-message.
+            </xs:documentation>
+        </xs:annotation>
+        <xs:complexType mixed="true">
+            <xs:attributeGroup ref="attlist.propertyInfoOptional"/>
+        </xs:complexType>
+    </xs:element>
+    <xs:element name="results-to-map">
+        <xs:annotation>
+            <xs:documentation>
+                results-to-map will take all of the results of the service,
+                the outgoing maps from the service and put them in a map of the given map-name.
+            </xs:documentation>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:attributeGroup ref="attlist.results-to-map"/>
+        </xs:complexType>
+    </xs:element>
+    <xs:attributeGroup name="attlist.results-to-map">
+        <xs:attribute type="xs:string" name="map-name" use="required">
+            <xs:annotation>
+                <xs:documentation>
+                    Name of a map where results will be put in.
+                </xs:documentation>
+            </xs:annotation>
+        </xs:attribute>
+    </xs:attributeGroup>
+    <xs:element name="result-to-field">
+        <xs:annotation>
+            <xs:documentation>
+                Specify the name of the field in the result and then the name of the field in the context you want to put it in,
+                and optionally the  name in the map.
+
+                There's a field-map there. If you don't specify a field-name then the result-name will be used for the field-name,
+                that's the name of the variable that will be created in the current context for the value of that result.
+            </xs:documentation>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:attributeGroup ref="attlist.result-to-field"/>
+        </xs:complexType>
+    </xs:element>
+    <xs:attributeGroup name="attlist.result-to-field">
+        <xs:attribute type="xs:string" name="result-name" use="required">
+            <xs:annotation>
+                <xs:documentation>
+                    Name of the result. May be used for the field-name. If you don't specify a field-name,
+                    this will be name of the variable that will be created in the current context for the value of that result.
+                </xs:documentation>
+            </xs:annotation>
+        </xs:attribute>
+        <xs:attribute type="xs:string" name="field">
+            <xs:annotation><xs:documentation>Optional name of target field. If empty will default to result-name.</xs:documentation></xs:annotation>
+        </xs:attribute>
+    </xs:attributeGroup>
+    <xs:element name="result-to-request">
+        <xs:annotation>
+            <xs:documentation>
+                result-to-request is event specific.
+                It takes the result with the given name and puts it in a request attribute with the given name here.
+                Again the request-name is optional.
+                If you leave it off then it will put it in an attribute with the name of the result-name.
+            </xs:documentation>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:attributeGroup ref="attlist.result-to-request"/>
+        </xs:complexType>
+    </xs:element>
+    <xs:attributeGroup name="attlist.result-to-request">
+        <xs:attribute type="xs:string" name="result-name" use="required">
+            <xs:annotation>
+                <xs:documentation>
+                    Name of the result. May be used for the request attribute name. If you don't specify a request-name ,
+                    that's the name of the request attribute that will be created for the value of that result.
+                </xs:documentation>
+            </xs:annotation>
+        </xs:attribute>
+        <xs:attribute type="xs:string" name="request-name">
+            <xs:annotation>
+                <xs:documentation>
+                    Optionnal request name.
+                </xs:documentation>
+            </xs:annotation>
+        </xs:attribute>
+    </xs:attributeGroup>
+    <xs:element name="result-to-session">
+        <xs:annotation>
+            <xs:documentation>
+                Specify the name of the session attribute that you want it to put the value in.
+                If you don't specify one it will use the result-name.
+            </xs:documentation>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:attributeGroup ref="attlist.result-to-session"/>
+        </xs:complexType>
+    </xs:element>
+    <xs:attributeGroup name="attlist.result-to-session">
+        <xs:attribute type="xs:string" name="result-name" use="required">
+            <xs:annotation>
+                <xs:documentation>
+                    Name of the result. May be used for the session attribute name. If you don't specify a session-name,
+                    that's the name of the session attribute that will be created for the value of that result.
+                </xs:documentation>
+            </xs:annotation>
+        </xs:attribute>
+        <xs:attribute type="xs:string" name="session-name">
+            <xs:annotation>
+                <xs:documentation>
+                    Optionnal session name.
+                </xs:documentation>
+            </xs:annotation>
+        </xs:attribute>
+    </xs:attributeGroup>
+    <xs:element name="result-to-result">
+        <xs:annotation>
+            <xs:documentation>
+                result-to-result is service specific (when the service is being called as a service).
+
+                It will take the result of the service you're calling with the call service operation and it will put it in with the result of the current service.
+                So result-name is the name of the result in the service that was called using the call-service tag.
+
+                NOTE that these attributes are somewhat confusing: result-name is the name of the field in the result of this service call that the value comes FROM;
+                service-result-name is the name of the field in the result of this simple-method called as a service where the value goes TO;
+                in other words FROM result-name and TO service-result-name.
+            </xs:documentation>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:attributeGroup ref="attlist.result-to-result"/>
+        </xs:complexType>
+    </xs:element>
+    <xs:attributeGroup name="attlist.result-to-result">
+        <xs:attribute type="xs:string" name="result-name" use="required">
+            <xs:annotation>
+                <xs:documentation>
+                    Name of the field in the result of this service call that the value comes FROM.
+                </xs:documentation>
+            </xs:annotation>
+        </xs:attribute>
+        <xs:attribute type="xs:string" name="service-result-name">
+            <xs:annotation>
+                <xs:documentation>
+                    Name of the field in the result of this simple-method called as a service where the value goes TO.
+                </xs:documentation>
+            </xs:annotation>
+        </xs:attribute>
+    </xs:attributeGroup>
+    <xs:element name="call-service-asynch" substitutionGroup="CallOperations">
+        <xs:annotation>
+            <xs:documentation>
+                Calls a service asynchronously and ignores the result, so no return messages
+                are used; that doesn't mean no errors will result, but they would just be
+                system errors like database failures, etc. which all have system error messages.
+            </xs:documentation>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:attributeGroup ref="attlist.call-service-asynch"/>
+        </xs:complexType>
+    </xs:element>
+    <xs:attributeGroup name="attlist.call-service-asynch">
+        <xs:attribute type="xs:string" name="service-name" use="required">
+            <xs:annotation>
+                <xs:documentation>
+                    Name of the service called asynchronously.
+                </xs:documentation>
+            </xs:annotation>
+        </xs:attribute>
+        <xs:attribute type="xs:string" name="in-map-name">
+            <xs:annotation>
+                <xs:documentation>
+                    The name of a map in the method environment to use as the input map.
+                </xs:documentation>
+            </xs:annotation>
+        </xs:attribute>
+        <xs:attribute name="include-user-login" default="true">
+            <xs:annotation>
+                <xs:documentation>
+                    Defaults to "true".
+                </xs:documentation>
+            </xs:annotation>
+            <xs:simpleType>
+                <xs:restriction base="xs:token">
+                    <xs:enumeration value="true"/>
+                    <xs:enumeration value="false"/>
+                </xs:restriction>
+            </xs:simpleType>
+        </xs:attribute>
+    </xs:attributeGroup>
+    <xs:element name="script" substitutionGroup="CallOperations">
+        <xs:annotation>
+            <xs:documentation>
+                Runs an external script (minilang, bsh, groovy) from the expanded location provided.               
+                Error messages go on the error list and are handled with the check-errors tag.
+            </xs:documentation>
+        </xs:annotation>
+        <xs:complexType mixed="true">
+            <xs:attributeGroup ref="attlist.script"/>
+        </xs:complexType>
+    </xs:element>
+    <xs:attributeGroup name="attlist.script">
+        <xs:attribute type="xs:string" name="location">
+            <xs:annotation>
+                <xs:documentation>
+                    Script location (component://...)
+                </xs:documentation>
+            </xs:annotation>
+        </xs:attribute>
+        <xs:attribute type="xs:string" name="error-list-name" default="error_list">
+            <xs:annotation>
+                <xs:documentation>
+                    The name of the list in the method environment to check for error messages.
+                    Defaults to "error_list".
+                </xs:documentation>
+            </xs:annotation>
+        </xs:attribute>
+    </xs:attributeGroup>
+    <xs:element name="call-bsh" substitutionGroup="CallOperations">
+        <xs:annotation>
+            <xs:documentation>
+                Runs an external bsh script from the classpath if resource is specified and
+                then runs the inlined bsh script if any is specified.
+
+                The bsh context is the current simple-method environment including maps, lists
+                and special objects whose names are defined in the simple-method attributes.
+
+                The current env cannot be modified, but if a Map is returned by the bsh block
+                the entries in the map will be put into the current env.
+
+                Error messages go on the error list and are handled with the check-errors tag.
+            </xs:documentation>
+        </xs:annotation>
+        <xs:complexType mixed="true">
+            <xs:attributeGroup ref="attlist.call-bsh"/>
+        </xs:complexType>
+    </xs:element>
+    <xs:attributeGroup name="attlist.call-bsh">
+        <xs:attribute type="xs:string" name="resource">
+            <xs:annotation>
+                <xs:documentation>
+                    Name of a properties file on the classpath.
+                </xs:documentation>
+            </xs:annotation>
+        </xs:attribute>
+        <xs:attribute type="xs:string" name="error-list-name" default="error_list">
+            <xs:annotation>
+                <xs:documentation>
+                    The name of the list in the method environment to check for error messages.
+                    Defaults to "error_list".
+                </xs:documentation>
+            </xs:annotation>
+        </xs:attribute>
+    </xs:attributeGroup>
+    <xs:element name="call-simple-method" substitutionGroup="CallOperations">
+        <xs:annotation>
+            <xs:documentation>
+                The call-simple-method tag calls another simple-method in the same context as the current one.
+                In other words the called simple-method will have the same environment as the calling simple-method,
+                including all environment fields, and either the event or service objects that the calling simple-method was called with.
+            </xs:documentation>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:attributeGroup ref="attlist.call-simple-method"/>
+        </xs:complexType>
+    </xs:element>
+    <xs:attributeGroup name="attlist.call-simple-method">
+        <xs:attribute type="xs:string" name="xml-resource">
+            <xs:annotation>
+                <xs:documentation>
+                    The full path and filename on the classpath of the XML file which contains an external simple-method to execute.
+                    This is only required if a simple-method in a different file is desired.
+                </xs:documentation>
+            </xs:annotation>
+        </xs:attribute>
+        <xs:attribute type="xs:string" name="method-name" use="required">
+            <xs:annotation>
+                <xs:documentation>
+                    The name of the simple-method to execute in the specified xml-resource,
+                    or in the current XML file if no xml-resource is specified.
+                </xs:documentation>
+            </xs:annotation>
+        </xs:attribute>
+    </xs:attributeGroup>
+    <!-- Operations to call Java methods and create Java objects -->
+    <xs:element name="call-object-method" substitutionGroup="CallOperations">
+        <xs:annotation>
+            <xs:documentation>
+                Calls a method on an existing object that exists in a field in the environment or in a map in the environment.
+
+                The string and field sub-elements are passed to the method as arguments in the order they are specified.
+                If the sub-elements do not match the method arguments an error will be returned.
+
+                The return value will be put in the named field if an value is returned and
+                if a field and optionally a map name are specified.
+            </xs:documentation>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:choice minOccurs="0" maxOccurs="unbounded">
+                <xs:element ref="string">
+                    <xs:annotation>
+                        <xs:documentation>
+                            Used to specify an inline String argument to the method call.
+                        </xs:documentation>
+                    </xs:annotation>
+                </xs:element>
+                <xs:element ref="field"/>
+            </xs:choice>
+            <xs:attributeGroup ref="attlist.call-object-method"/>
+        </xs:complexType>
+    </xs:element>
+    <xs:attributeGroup name="attlist.call-object-method">
+        <xs:attribute type="xs:string" name="obj-field" use="required">
+            <xs:annotation>
+                <xs:documentation>
+                    The name of the field the object is in that has the method to be called.
+                </xs:documentation>
+            </xs:annotation>
+        </xs:attribute>
+        <xs:attribute type="xs:string" name="method-name" use="required">
+            <xs:annotation>
+                <xs:documentation>
+                    The name of the method to call on the given object.
+                </xs:documentation>
+            </xs:annotation>
+        </xs:attribute>
+        <xs:attribute type="xs:string" name="ret-field">
+            <xs:annotation>
+                <xs:documentation>
+                    The name of the field to put the result in.
+                    If not specified any return value will be ignored.
+                </xs:documentation>
+            </xs:annotation>
+        </xs:attribute>
+    </xs:attributeGroup>
+    <xs:element name="call-class-method" substitutionGroup="CallOperations">
+        <xs:annotation>
+            <xs:documentation>
+                Calls a static method on a class.
+
+                The string and field sub-elements are passed to the method as arguments in the order they are specified.
+                If the sub-elements do not match the method arguments an error will be returned.
+
+                The return value will be put in the named field if an value is returned and if a
+                field and optionally a map name are specified.
+            </xs:documentation>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:choice minOccurs="0" maxOccurs="unbounded">
+                <xs:element ref="string">
+                    <xs:annotation>
+                        <xs:documentation>
+                            Used to specify an inline String argument to the method call.
+                        </xs:documentation>
+                    </xs:annotation>
+                </xs:element>
+                <xs:element ref="field">
+                    <xs:annotation>
+                        <xs:documentation>
+                            Used to specify a field to be passed as an argument to the constructor method.
+                            The field can be in a map in the environment or if no map-name is specified then
+                            the field will come directly from the environment.
+                        </xs:documentation>
+                    </xs:annotation>
+                </xs:element>
+            </xs:choice>
+            <xs:attributeGroup ref="attlist.call-class-method"/>
+        </xs:complexType>
+    </xs:element>
+    <xs:attributeGroup name="attlist.call-class-method">
+        <xs:attribute type="xs:string" name="class-name" use="required">
+            <xs:annotation>
+                <xs:documentation>
+                    The name of the class to call the static method on.
+                </xs:documentation>
+            </xs:annotation>
+        </xs:attribute>
+        <xs:attribute type="xs:string" name="method-name" use="required">
+            <xs:annotation>
+                <xs:documentation>
+                    The name of the static method to call on the given class.
+                </xs:documentation>
+            </xs:annotation>
+        </xs:attribute>
+        <xs:attribute type="xs:string" name="ret-field">
+            <xs:annotation>
+                <xs:documentation>
+                    The name of the field to put the result in. If not specified any return value will be ignored.
+                </xs:documentation>
+            </xs:annotation>
+        </xs:attribute>
+    </xs:attributeGroup>
+    <xs:element name="create-object" substitutionGroup="CallOperations">
+        <xs:annotation>
+            <xs:documentation>
+                Creates an object of the given class and if the field attribute is specified saves it in that field.
+                The string and field sub-elements are passed to the constructor method as arguments in the order they are specified.
+                If the sub-elements do not match the constructor method arguments an error will be returned.
+            </xs:documentation>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:choice minOccurs="0" maxOccurs="unbounded">
+                <xs:element ref="field">
+                    <xs:annotation>
+                        <xs:documentation>
+                            Used to specify a field to be passed as an argument to the constructor method.
+                            The field can be in a map in the environment or if no map-name is specified then
+                            the field will come directly from the environment.
+                        </xs:documentation>
+                    </xs:annotation>
+                </xs:element>
+                <xs:element ref="string">
+                    <xs:annotation>
+                        <xs:documentation>
+                            Used to specify an inline String argument to the method call.
+                        </xs:documentation>
+                    </xs:annotation>
+                </xs:element>
+            </xs:choice>
+            <xs:attributeGroup ref="attlist.create-object"/>
+        </xs:complexType>
+    </xs:element>
+    <xs:attributeGroup name="attlist.create-object">
+        <xs:attribute type="xs:string" name="class-name" use="required">
+            <xs:annotation>
+                <xs:documentation>
+                    The name of the class to construct an object of.
+                </xs:documentation>
+            </xs:annotation>
+        </xs:attribute>
+        <xs:attribute type="xs:string" name="field">
+            <xs:annotation>
+                <xs:documentation>
+                    The name of a field to put the new object in.
+                    If not specified the object will be created but ignored after that.
+                </xs:documentation>
+            </xs:annotation>
+        </xs:attribute>
+    </xs:attributeGroup>
+    <!-- Operations to copy map fields in the current env to context specific containers -->
+    <!-- Event specific operations -->
+    <xs:element name="field-to-request" substitutionGroup="EventOperations">
+        <xs:annotation>
+            <xs:documentation>
+                The field-to-request tag copies a field from a map to the specified servlet request attribute.
+                The tag is only used when the simple-method is called as an event, it is ignored otherwise.
+            </xs:documentation>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:attributeGroup ref="attlist.field-to-request"/>
+        </xs:complexType>
+    </xs:element>
+    <xs:attributeGroup name="attlist.field-to-request">
+        <xs:attribute type="xs:string" name="field" use="required">
+            <xs:annotation><xs:documentation>The context name of the field to use.</xs:documentation></xs:annotation>
+        </xs:attribute>
+        <xs:attribute type="xs:string" name="request-name">
+            <xs:annotation><xs:documentation>The name of the request attribute to use. Defaults to the value of field attribute.</xs:documentation></xs:annotation>
+        </xs:attribute>
+    </xs:attributeGroup>
+    <xs:element name="field-to-session" substitutionGroup="EventOperations">
+        <xs:annotation>
+            <xs:documentation>
+                The field-to-session tag copies a field from a map to the specified servlet session attribute.
+                The tag is only used when the simple-method is called as an event, it is ignored otherwise.
+            </xs:documentation>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:attributeGroup ref="attlist.field-to-session"/>
+        </xs:complexType>
+    </xs:element>
+    <xs:attributeGroup name="attlist.field-to-session">
+        <xs:attribute type="xs:string" name="field" use="required">
+            <xs:annotation><xs:documentation>The context name of the field to use.</xs:documentation></xs:annotation>
+        </xs:attribute>
+        <xs:attribute type="xs:string" name="session-name">
+            <xs:annotation><xs:documentation>The name of the session attribute to use. Defaults to the value of field attribute.</xs:documentation></xs:annotation>
+        </xs:attribute>
+    </xs:attributeGroup>
+    <xs:element name="request-to-field" substitutionGroup="EventOperations">
+        <xs:annotation>
+            <xs:documentation>
+                The request-to-field tag copies an attribute from the servlet request to a field of a map in the method environment.
+                The tag is only used when the simple-method is called as an event, it is ignored otherwise (except the default value, if specified).
+            </xs:documentation>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:attributeGroup ref="attlist.request-to-field"/>
+        </xs:complexType>
+    </xs:element>
+    <xs:attributeGroup name="attlist.request-to-field">
+        <xs:attribute type="xs:string" name="field" use="required">
+            <xs:annotation><xs:documentation>The context name of the field to use.</xs:documentation></xs:annotation>
+        </xs:attribute>
+        <xs:attribute type="xs:string" name="default">
+            <xs:annotation>
+                <xs:documentation>
+                    A default value to use if the request attribute is null or is a String and is empty.
+                    This will also be used when NOT running as an event.
+                </xs:documentation>
+            </xs:annotation>
+        </xs:attribute>
+        <xs:attribute type="xs:string" name="request-name">
+            <xs:annotation><xs:documentation>The name of the request attribute to use. Defaults to the value of the field attribute.</xs:documentation></xs:annotation>
+        </xs:attribute>
+    </xs:attributeGroup>
+    <xs:element name="request-parameters-to-list" substitutionGroup="EventOperations">
+        <xs:annotation>
+            <xs:documentation>
+                The request-parameters-to-list tag appends a request parameter values from the servlet request to the specified list.
+                The tag is only used when the simple-method is called as an event, it is ignored otherwise.
+            </xs:documentation>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:attributeGroup ref="attlist.request-parameters-to-list"/>
+        </xs:complexType>
+    </xs:element>
+    <xs:attributeGroup name="attlist.request-parameters-to-list">
+        <xs:attribute type="xs:string" name="request-name" use="required">
+            <xs:annotation>
+                <xs:documentation>
+                    The name of the request parameter values to use.
+                </xs:documentation>
+            </xs:annotation>
+        </xs:attribute>
+        <xs:attribute type="xs:string" name="list-name">
+            <xs:annotation>
+                <xs:documentation>
+                    The name of the list in the method environment that the request parameter values will be appended to.
+                    (default: request-name)
+                </xs:documentation>
+            </xs:annotation>
+        </xs:attribute>
+    </xs:attributeGroup>
+    <xs:element name="session-to-field" substitutionGroup="EventOperations">
+        <xs:annotation>
+            <xs:documentation>
+                The session-to-field tag copies an attribute from the servlet session to a field of a map in the method environment.
+                The tag is only used when the simple-method is called as an event, it is ignored otherwise (except the default value, if specified).
+            </xs:documentation>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:attributeGroup ref="attlist.session-to-field"/>
+        </xs:complexType>
+    </xs:element>
+    <xs:attributeGroup name="attlist.session-to-field">
+        <xs:attribute type="xs:string" name="field" use="required">
+            <xs:annotation><xs:documentation>The name (key) of the map field to use.</xs:documentation></xs:annotation>
+        </xs:attribute>
+        <xs:attribute type="xs:string" name="default">
+            <xs:annotation>
+                <xs:documentation>
+                    A default value to use if the session attribute is null or is a String and is empty.
+                    This will also be used when NOT running as an event.
+                </xs:documentation>
+            </xs:annotation>
+        </xs:attribute>
+        <xs:attribute type="xs:string" name="session-name">
+            <xs:annotation>
+                <xs:documentation>
+                    The name of the session attribute to use. Defaults to the value of field attribute.
+                </xs:documentation>
+            </xs:annotation>
+        </xs:attribute>
+    </xs:attributeGroup>
+    <xs:element name="webapp-property-to-field" substitutionGroup="EventOperations">
+        <xs:annotation>
+            <xs:documentation>
+                The webapp-property-to-field tag copies a property value from a properties file in a ServletContext resource to a field.
+                The tag is only used when the simple-method is called as an event, it is ignored otherwise (except the default value, if specified).
+            </xs:documentation>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:attributeGroup ref="attlist.webapp-property-to-field"/>
+        </xs:complexType>
+    </xs:element>
+    <xs:attributeGroup name="attlist.webapp-property-to-field">
+        <xs:attribute type="xs:string" name="resource" use="required">
+            <xs:annotation>
+                <xs:documentation>
+                    The resource location of the properties file inside the webapp,
+                    and relative to the root of the webapp (can be inside a war file).
+                    An example of this is "/WEB-INF/myprops.properties".
+                </xs:documentation>
+            </xs:annotation>
+        </xs:attribute>
+        <xs:attribute type="xs:string" name="property" use="required">
+            <xs:annotation><xs:documentation>The property whose value will be put in the field.</xs:documentation></xs:annotation>
+        </xs:attribute>
+        <xs:attribute type="xs:string" name="default">
+            <xs:annotation>
+                <xs:documentation>
+                    A default value to use if the property value is null or empty.
+                    This will also be used when NOT running as an event.
+                </xs:documentation>
+            </xs:annotation>
+        </xs:attribute>
+        <xs:attribute type="xs:string" name="field" use="required">
+            <xs:annotation><xs:documentation>The name (key) of the field to use.</xs:documentation></xs:annotation>
+        </xs:attribute>
+        <xs:attribute type="xs:string" name="session-name">
+            <xs:annotation><xs:documentation>The name of the session attribute to use. Defaults to the value of field attribute</xs:documentation></xs:annotation>
+        </xs:attribute>
+    </xs:attributeGroup>
+    <!-- Service specific operations -->
+    <xs:element name="field-to-result" substitutionGroup="ServiceOperations">
+        <xs:annotation>
+            <xs:documentation>
+                The field-to-result tag copies a field from a map to the specified service result field.
+                The tag is only used when the simple-method is called as a service, it is ignored otherwise.
+            </xs:documentation>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:attributeGroup ref="attlist.field-to-result"/>
+        </xs:complexType>
+    </xs:element>
+    <xs:attributeGroup name="attlist.field-to-result">
+        <xs:attribute type="xs:string" name="field" use="required">
+            <xs:annotation><xs:documentation>The name (key) of the map field to use.</xs:documentation></xs:annotation>
+        </xs:attribute>
+        <xs:attribute type="xs:string" name="result-name">
+            <xs:annotation><xs:documentation>The name of the result Map name/key to use. Defaults to the value of field attribute.</xs:documentation></xs:annotation>
+        </xs:attribute>
+    </xs:attributeGroup>
+    <!-- Environment specific operations -->
+    <xs:element name="map-to-map" substitutionGroup="EnvOperations">
+        <xs:annotation>
+            <xs:documentation>
+                The map-to-map tag copies all fields from one map to another map.
+            </xs:documentation>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:attributeGroup ref="attlist.map-to-map"/>
+        </xs:complexType>
+    </xs:element>
+    <xs:attributeGroup name="attlist.map-to-map">
+        <xs:attribute type="xs:string" name="map" use="required">
+            <xs:annotation><xs:documentation>The name of the map in the method environment the fields will come from.</xs:documentation></xs:annotation>
+        </xs:attribute>
+        <xs:attribute type="xs:string" name="to-map">
+            <xs:annotation>
+                <xs:documentation>
+                    The name of the map in the method environment the fields will go to.
+                    If empty the fields will be copied to the environment.
+                </xs:documentation>
+            </xs:annotation>
+        </xs:attribute>
+    </xs:attributeGroup>
+    <xs:element name="field-to-list" substitutionGroup="EnvOperations">
+        <xs:annotation><xs:documentation>The field-to-list tag appends a field to the specified list.</xs:documentation></xs:annotation>
+        <xs:complexType><xs:attributeGroup ref="attlist.field-to-list"/></xs:complexType>
+    </xs:element>
+    <xs:attributeGroup name="attlist.field-to-list">
+        <xs:attribute type="xs:string" name="field" use="required">
+            <xs:annotation><xs:documentation>The name (key) of the map field to use.</xs:documentation></xs:annotation>
+        </xs:attribute>
+        <xs:attribute type="xs:string" name="list" use="required">
+            <xs:annotation><xs:documentation>The name of the list in the method environment that the object will be appended to.</xs:documentation></xs:annotation>
+        </xs:attribute>
+    </xs:attributeGroup>
+    <xs:element name="list-to-list" substitutionGroup="EnvOperations">
+        <xs:annotation><xs:documentation>Copy a list to another list.</xs:documentation></xs:annotation>
+        <xs:complexType><xs:attributeGroup ref="attlist.list-to-list"/></xs:complexType>
+    </xs:element>
+    <xs:attributeGroup name="attlist.list-to-list">
+        <xs:attribute type="xs:string" name="list" use="required">
+            <xs:annotation><xs:documentation>Name of the list to copy from</xs:documentation></xs:annotation>
+        </xs:attribute>
+        <xs:attribute type="xs:string" name="to-list" use="required">
+            <xs:annotation><xs:documentation>Name of the list to copy to.</xs:documentation></xs:annotation>
+        </xs:attribute>
+    </xs:attributeGroup>
+    <xs:element name="order-map-list" substitutionGroup="EnvOperations">
+        <xs:annotation><xs:documentation>Sort a List containing Maps: order by fields names given in order-by sub-element.</xs:documentation>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:sequence><xs:element maxOccurs="unbounded" ref="order-by"/></xs:sequence>
+            <xs:attributeGroup ref="attlist.order-map-list"/>
+        </xs:complexType>
+    </xs:element>
+    <xs:attributeGroup name="attlist.order-map-list">
+        <xs:attribute type="xs:string" name="list" use="required">
+            <xs:annotation><xs:documentation>Name of the list to be sorted.</xs:documentation></xs:annotation>
+        </xs:attribute>
+    </xs:attributeGroup>
+    <xs:element name="set" substitutionGroup="EnvOperations">
+        <xs:annotation>
+            <xs:documentation>
+                Move a value from one field to another field.
+                You can also take a value, just a string constant or a string
+                that is made up of a mixture of constant and flexible
+                string expansion variables using the ${} syntax, that will be
+                put in the field.
+
+                You can also specify a default value in the case that the
+                value evaluates to an empty string or the from-field is
+                null or empty. Then the default-value will be used.
+
+                Again you can use the flexible string expander here, the
+                ${} syntax and such. It can also do a type conversion,
+                so going from whatever type the source data is in,
+                which would be a string value or whatever the variable
+                type is for a from field, it can convert that to any of
+                these types before setting it in the target field.
+            </xs:documentation>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:attributeGroup ref="attlist.set"/>
+        </xs:complexType>
+    </xs:element>
+    <xs:attributeGroup name="attlist.set">
+        <xs:attribute type="xs:string" name="field" use="required">
+            <xs:annotation>
+                <xs:documentation>
+                    Name of the field to copy value to.
+                </xs:documentation>
+            </xs:annotation>
+        </xs:attribute>
+        <xs:attribute type="xs:string" name="from-field">
+            <xs:annotation>
+                <xs:documentation>
+                    Name of the field to copy value from.
+                </xs:documentation>
+            </xs:annotation>
+        </xs:attribute>
+        <xs:attribute type="xs:string" name="value">
+            <xs:annotation>
+                <xs:documentation>
+                    Simple value to copy in field.
+                </xs:documentation>
+            </xs:annotation>
+        </xs:attribute>
+        <xs:attribute type="xs:string" name="default-value">
+            <xs:annotation>
+                <xs:documentation>
+                    Default value to copy in field if value evaluates to an empty string or the from-field is null or empty.
+                </xs:documentation>
+            </xs:annotation>
+        </xs:attribute>
+        <xs:attribute name="type">
+            <xs:annotation>
+                <xs:documentation>
+                    Type to convert to. NewList will create a new List, NewMap will create a new Map.
+                </xs:documentation>
+            </xs:annotation>
+            <xs:simpleType>
+                <xs:restriction base="xs:token">
+                    <xs:enumeration value="PlainString"/>
+                    <xs:enumeration value="String"/>
+                    <xs:enumeration value="BigDecimal"/>
+                    <xs:enumeration value="Double"/>
+                    <xs:enumeration value="Float"/>
+                    <xs:enumeration value="List"/>
+                    <xs:enumeration value="Long"/>
+                    <xs:enumeration value="Integer"/>
+                    <xs:enumeration value="Date"/>
+                    <xs:enumeration value="Time"/>
+                    <xs:enumeration value="Timestamp"/>
+                    <xs:enumeration value="Boolean"/>
+                    <xs:enumeration value="Object"/>
+                    <xs:enumeration value="NewList"/>
+                    <xs:enumeration value="NewMap"/>
+                </xs:restriction>
+            </xs:simpleType>
+        </xs:attribute>
+        <xs:attribute name="set-if-null" default="false">
+            <xs:annotation>
+                <xs:documentation>
+                    Specifies whether or not to set fields that are null or empty.
+                    Defaults to true.
+                </xs:documentation>
+            </xs:annotation>
+            <xs:simpleType>
+                <xs:restriction base="xs:token">
+                    <xs:enumeration value="true"/>
+                    <xs:enumeration value="false"/>
+                </xs:restriction>
+            </xs:simpleType>
+        </xs:attribute>
+        <xs:attribute name="set-if-empty" default="true">
+            <xs:annotation>
+                <xs:documentation>
+                    If the source value, either from a value or from a field, is empty, and
+                    empty-string an empty list or a null value.
+                    In this case it's set to true.
+
+                    If you don't want to set, if you want it to
+                    leave the target field alone when the source is empty,
+                    then you need to set this to false.
+                </xs:documentation>
+            </xs:annotation>
+            <xs:simpleType>
+                <xs:restriction base="xs:token">
+                    <xs:enumeration value="true"/>
+                    <xs:enumeration value="false"/>
+                </xs:restriction>
+            </xs:simpleType>
+        </xs:attribute>
+    </xs:attributeGroup>
+    <xs:element name="string-append" substitutionGroup="EnvOperations">
+        <xs:annotation>
+            <xs:documentation>
+                NOTE: the prefix and suffix will only be used IFF the current string and the string to be appended are both not empty.
+
+                So if the field does not exist then it will create a new field with this string value.
+                If it does exist then it will append this string value to the end.
+            </xs:documentation>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:attributeGroup ref="attlist.string-append"/>
+        </xs:complexType>
+    </xs:element>
+    <xs:attributeGroup name="attlist.string-append">
+        <xs:attribute type="xs:string" name="field" use="required">
+            <xs:annotation>
+                <xs:documentation>
+                    The field that you want string-append to operate on.
+                    This is the target field where the value will be put, and this is the string to append to that field.
+
+                    So if the field does not exist then it will create a new field with this string value.
+                    If it does exist then it will append this string value to the end.
+                </xs:documentation>
+            </xs:annotation>
+        </xs:attribute>
+        <xs:attribute type="xs:string" name="string" use="required">
+            <xs:annotation>
+                <xs:documentation>
+                    The string to append to the field named in field-name.
+                </xs:documentation>
+            </xs:annotation>
+        </xs:attribute>
+        <xs:attribute type="xs:string" name="arg-list">
+            <xs:annotation>
+                <xs:documentation>
+                    arg-list-name is used to insert values from a list into
+                    the string using the object in the standard Java library
+                    that does this sort of string expression with a { } brackets
+                    and a number, no dollar sign.
+
+                    This pattern of the arg-list-name with the prefix and
+                    suffix is something form the early days which is still
+                    supported, but the best thing to do here is just use the
+                    flexible string expander which is far more flexible and
+                    powerful. So you can have the prefix variables to expand
+                    and everything all mixed into one string.
+                </xs:documentation>
+            </xs:annotation>
+        </xs:attribute>
+        <xs:attribute type="xs:string" name="prefix">
+            <xs:annotation>
+                <xs:documentation>
+                    Used in conjunction with arg-list-name.
+                    String that will be prepended to the string,
+                </xs:documentation>
+            </xs:annotation>
+        </xs:attribute>
+        <xs:attribute type="xs:string" name="suffix">
+            <xs:annotation>
+                <xs:documentation>
+                    Used in conjunction with arg-list-name.
+                    String that will be appended to the string,
+                </xs:documentation>
+            </xs:annotation>
+        </xs:attribute>
+    </xs:attributeGroup>
+    <xs:element name="string-to-list" substitutionGroup="EnvOperations">
+        <xs:annotation>
+            <xs:documentation>
+                Take a string literally that can also have a flexible string expander and such in it,
+                and it will add it to a list.
+
+                Note that you can have an arg-listname for using the standard
+                Java style argument list where you have in the source
+                string numbers inside of { } brackets that represent the
+                number the index in the argument list to insert at that point.
+            </xs:documentation>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:attributeGroup ref="attlist.string-to-list"/>
+        </xs:complexType>
+    </xs:element>
+    <xs:attributeGroup name="attlist.string-to-list">
+        <xs:attribute type="xs:string" name="string" use="required">
+            <xs:annotation>
+                <xs:documentation>
+                    String to add to the list named in list-name.
+                </xs:documentation>
+            </xs:annotation>
+        </xs:attribute>
+        <xs:attribute type="xs:string" name="list" use="required">
+            <xs:annotation>
+                <xs:documentation>
+                    List to add string to.
+                </xs:documentation>
+            </xs:annotation>
+        </xs:attribute>
+        <xs:attribute type="xs:string" name="arg-list">
+            <xs:annotation>
+                <xs:documentation>
+                    arg-list-name is used to insert values from a list into
+                    the string using the object in the standard Java library
+                    that does this sort of string expresison with a { } brackets
+                    and a number, no dollar sign.
+
+                    This pattern of the arg-list-name with the prefix and
+                    suffix is something form the early days which is still
+                    supported, but the best thing to do here is just use the
+                    flexible string expander which is far more flexible and
+                    powerful. So you can have the prefix variables to expand
+                    and everything all mixed into one string.
+                </xs:documentation>
+            </xs:annotation>
+        </xs:attribute>
+        <xs:attribute type="xs:string" name="message-field">
+            <xs:annotation>
+                <xs:documentation>
+                    To insert a message above a field (used in conjunction with @fieldErrors FTL macro)
+                </xs:documentation>
+            </xs:annotation>
+        </xs:attribute>
+    </xs:attributeGroup>
+    <xs:element name="to-string" substitutionGroup="EnvOperations">
+        <xs:annotation>
+            <xs:documentation>
+                The to-string tag converts the Object in the specified field to a String, putting the string in the same field.
+            </xs:documentation>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:attributeGroup ref="attlist.to-string"/>
+        </xs:complexType>
+    </xs:element>
+    <xs:attributeGroup name="attlist.to-string">
+        <xs:attribute type="xs:string" name="field" use="required">
+            <xs:annotation>
+                <xs:documentation>
+                    The name (key) of the map field to use.
+                </xs:documentation>
+            </xs:annotation>
+        </xs:attribute>
+        <xs:attribute type="xs:string" name="format">
+            <xs:annotation>
+                <xs:documentation>
+                    Format based on the type of the object (date,number, etc.).
+                </xs:documentation>
+            </xs:annotation>
+        </xs:attribute>
+        <xs:attribute type="xs:string" name="numeric-padding">
+            <xs:annotation>
+                <xs:documentation>
+                    Padding to use if a numeric object is used.
+                </xs:documentation>
+            </xs:annotation>
+        </xs:attribute>
+    </xs:attributeGroup>
+    <xs:element name="clear-field" substitutionGroup="EnvOperations">
+        <xs:annotation>
+            <xs:documentation>
+                Sets the value of the specified field to null.
+            </xs:documentation>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:attributeGroup ref="attlist.clear-field"/>
+        </xs:complexType>
+    </xs:element>
+    <xs:attributeGroup name="attlist.clear-field">
+        <xs:attribute type="xs:string" name="field" use="required">
+            <xs:annotation>
+                <xs:documentation>
+                    The name (key) of the map field to use.
+                </xs:documentation>
+            </xs:annotation>
+        </xs:attribute>
+    </xs:attributeGroup>
+    <xs:element name="first-from-list" substitutionGroup="EnvOperations">
+        <xs:annotation>
+            <xs:documentation>
+                The first-from-list tag will get the first entry from the given list and put it in the environment field with the given entry-name.
+            </xs:documentation>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:attributeGroup ref="attlist.first-from-list"/>
+        </xs:complexType>
+    </xs:element>
+    <xs:attributeGroup name="attlist.first-from-list">
+        <xs:attribute type="xs:string" name="entry" use="required">
+            <xs:annotation>
+                <xs:documentation>
+                    The name of the method environment field that will contain the first entry in the list.
+                </xs:documentation>
+            </xs:annotation>
+        </xs:attribute>
+        <xs:attribute type="xs:string" name="list" use="required">
+            <xs:annotation>
+                <xs:documentation>
+                    The name of the method environment field that contains the list to get the first entry from.
+                </xs:documentation>
+            </xs:annotation>
+        </xs:attribute>
+    </xs:attributeGroup>
+    <!--
+        These operations are used to interact with a data source through the entity
+        engine and facilitate related operations.
+    -->
+    <xs:element name="transaction-begin" substitutionGroup="EntityTxOperations">
+        <xs:annotation>
+            <xs:documentation>
+                The transaction-begin tag will begin a transaction if one is not already in place.
+                If a transaction is begun the environment field named as the began-transaction-name will be set to true, otherwise it will be set to false.
+
+                Note that unless the simple-method is flagged to not use a transaction all simple-methods will be inside a transaction.
+                The same is true for service calls through the Service Engine.
+            </xs:documentation>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:attributeGroup ref="attlist.transaction-begin"/>
+        </xs:complexType>
+    </xs:element>
+    <xs:attributeGroup name="attlist.transaction-begin">
+        <xs:attribute type="xs:string" name="began-transaction-name" default="beganTransaction">
+            <xs:annotation>
+                <xs:documentation>
+                    The name of the method environment field that contains a Boolean specifying whether or not a transaction was begun in the current transaction demarcation.
+                    Defaults to "beganTransaction".
+                </xs:documentation>
+            </xs:annotation>
+        </xs:attribute>
+    </xs:attributeGroup>
+    <xs:element name="transaction-commit" substitutionGroup="EntityTxOperations">
+        <xs:annotation>
+            <xs:documentation>
+                The transaction-commit tag will commit a transaction if a transaction was begun in the current demarcation context as represented by the environment field named as the began-transaction-name.
+                If the Boolean in that field is false no commit will be done.
+            </xs:documentation>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:attributeGroup ref="attlist.transaction-commit"/>
+        </xs:complexType>
+    </xs:element>
+    <xs:attributeGroup name="attlist.transaction-commit">
+        <xs:attribute type="xs:string" name="began-transaction-name" default="beganTransaction">
+            <xs:annotation>
+                <xs:documentation>
+                    The name of the method environment field that contains a Boolean specifying whether or not a transaction was begun in the current transaction demarcation.
+                    Defaults to "beganTransaction".
+                </xs:documentation>
+            </xs:annotation>
+        </xs:attribute>
+    </xs:attributeGroup>
+    <xs:element name="transaction-rollback" substitutionGroup="EntityTxOperations">
+        <xs:annotation>
+            <xs:documentation>
+                The transaction-rollback tag will rollback a transaction if a transaction was begun in the current demarcation context as represented by the environment field named as the began-transaction-name.
+                If the Boolean in that field is false a set rollback only will operation will be done instead of rollback which will force the transaction to rollback regardless of which method or object is responsible for beginning and ending the transaction.
+            </xs:documentation>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:attributeGroup ref="attlist.transaction-rollback"/>
+        </xs:complexType>
+    </xs:element>
+    <xs:attributeGroup name="attlist.transaction-rollback">
+        <xs:attribute type="xs:string" name="began-transaction-name" default="beganTransaction">
+            <xs:annotation>
+                <xs:documentation>
+                    The name of the method environment field that contains a Boolean specifying whether or not a transaction was begun in the current transaction demarcation.
+                    Defaults to "beganTransaction".
+                </xs:documentation>
+            </xs:annotation>
+        </xs:attribute>
+    </xs:attributeGroup>
+    <xs:element name="sequenced-id" substitutionGroup="EntityMiscOperations">
+        <xs:annotation>
+            <xs:documentation>
+                The sequenced-id tag gets a sequenced ID from the Entity Engine (through the delegator) and puts it in the specified method environment field.
+                The object will be a java.lang.Long, but can of course be converted to a String.
+            </xs:documentation>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:attributeGroup ref="attlist.sequenced-id"/>
+        </xs:complexType>
+    </xs:element>
+    <xs:attributeGroup name="attlist.sequenced-id">
+        <xs:attribute type="xs:string" name="sequence-name" use="required">
+            <xs:annotation>
+                <xs:documentation>
+                    The name of the sequence to pass to the delegator.
+                    The same name must always be used for sequenced IDs that will be used for a certain entity field otherwise non-unique keys may result.
+                </xs:documentation>
+            </xs:annotation>
+        </xs:attribute>
+        <xs:attribute type="xs:string" name="field" use="required">
+            <xs:annotation>
+                <xs:documentation>
+                    The name of the method environment field the sequenced ID will be put in.
+                </xs:documentation>
+            </xs:annotation>
+        </xs:attribute>
+        <xs:attribute name="get-long-only" default="false">
+            <xs:annotation>
+                <xs:documentation>
+                    Get a numerical long value and put it there, so it does not do that by default.
+                    By default getlong-only is false. If you want it to just get a long number
+                    then you can set that to true. That's in there for supporting lower level functionality,
+                    but that's not the typical pattern used in OFBiz as we do use strings for sequencing.
+                </xs:documentation>
+            </xs:annotation>
+            <xs:simpleType>
+                <xs:restriction base="xs:token">
+                    <xs:enumeration value="true"/>
+                    <xs:enumeration value="false"/>
+                </xs:restriction>
+            </xs:simpleType>
+        </xs:attribute>
+        <xs:attribute type="xs:string" name="stagger-max">
+            <xs:annotation>
+                <xs:documentation>
+                    By default this is one. But if you want to have sequenced Ids that are staggered, instead
+                    of consecutive, then you can set this to something like twenty. And then it will do a random staggering for
+                    each sequenced id; instead of picking the next value all the time it will pick something between the next value
+                    and twenty away from the next value, if stagger-max is set to twenty.

[... 3513 lines stripped ...]