You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ode.apache.org by mr...@apache.org on 2006/05/01 23:38:03 UTC

svn commit: r398694 [4/9] - in /incubator/ode/trunk: ./ bpel-bom/ bpel-bom/src/ bpel-bom/src/main/ bpel-bom/src/main/java/ bpel-bom/src/main/java/org/ bpel-bom/src/main/java/org/apache/ bpel-bom/src/main/java/org/apache/ode/ bpel-bom/src/main/java/org/...

Added: incubator/ode/trunk/bpel-bom/src/main/java/org/apache/ode/bom/wsdl/PropertyAliasImpl.java
URL: http://svn.apache.org/viewcvs/incubator/ode/trunk/bpel-bom/src/main/java/org/apache/ode/bom/wsdl/PropertyAliasImpl.java?rev=398694&view=auto
==============================================================================
--- incubator/ode/trunk/bpel-bom/src/main/java/org/apache/ode/bom/wsdl/PropertyAliasImpl.java (added)
+++ incubator/ode/trunk/bpel-bom/src/main/java/org/apache/ode/bom/wsdl/PropertyAliasImpl.java Mon May  1 14:37:44 2006
@@ -0,0 +1,148 @@
+/*
+ * File:      $RCSfile$
+ * Copyright: (C) 1999-2005 FiveSight Technologies Inc.
+ *
+ */
+package org.apache.ode.bom.wsdl;
+
+import org.apache.ode.bom.api.Query;
+import org.apache.ode.utils.NSContext;
+
+import java.io.Serializable;
+
+import javax.wsdl.extensions.ExtensibilityElement;
+import javax.xml.namespace.QName;
+
+
+/**
+ * WSDL extension element for a BPEL <code>&lt;propertyAlias&gt;</code> element.
+ * @see org.apache.ode.bom.wsdl.PropertyAliasSerializer_11
+ */
+class PropertyAliasImpl implements PropertyAlias, ExtensibilityElement, Serializable {
+	
+	private static final long serialVersionUID = -1L;
+
+  private QName _propertyName;
+  private QName _messageType;
+  private String _part;
+  private Query _query;
+  private NSContext _nsc;
+  private QName _elementType;
+
+  /**
+   * @see javax.wsdl.extensions.ExtensibilityElement#setElementType(javax.xml.namespace.QName)
+   */
+  public void setElementType(QName arg0) {
+    _elementType = arg0;
+  }
+
+  /**
+   * @see javax.wsdl.extensions.ExtensibilityElement#getElementType()
+   */
+  public QName getElementType() {
+    return _elementType;
+  }
+
+  /**
+   * Set the name of the WSDL <code>message</code> type that this alias is to apply to.
+   * @param name the <code>QName</code> of the message type
+   */
+  public void setMessageType(QName name) {
+    _messageType = name;
+  }
+
+  /**
+   * Get the name of the WSDL <code>message</code> type that this alias it to apply to.
+   * @return the <code>QName</code> for the <code>messageType</code>
+   */
+  public QName getMessageType() {
+    return _messageType;
+  }
+
+  /**
+   * Set the name of the WSDL <code>part</code> that this alias is to apply to (within the
+   * specified <code>message</code>).
+   * @param name
+   * @see #setMessageType(QName)
+   */
+  public void setPart(String name) {
+    _part = name;
+  }
+
+  /**
+   * Get the name of the WSDL <code>part</code> that this alias is to apply to (within the
+   * specified <code>message</code>).
+   * @return the name of the part
+   * @see #getMessageType() 
+   */
+  public String getPart() {
+    return _part;
+  }
+
+  /**
+   * Set the <code>QName</code> of the property that this alias applies to.
+   * @param name the <code>QName</code> of the property.
+   */
+  public void setPropertyName(QName name) {
+    _propertyName = name;
+  }
+
+  /**
+   * Get the <code>QName</code> of the property that this alias applies to.
+   * @return the property <code>QName</code>
+   */
+  public QName getPropertyName() {
+    return _propertyName;
+  }
+
+  /**
+   * Set the location path query for this <code>OPropertyAlias</code>.  <em>No attempt is
+   * made at this point to determine whether the path is a valid location path.</em>
+   *
+   * @param string the location path
+   */
+  public void setQuery(Query string) {
+    _query = string;
+  }
+
+  /**
+   * Get the location path query for the <code>OPropertyAlias</code> as originally
+   * specified in the WSDL.
+   *
+   * @return the query
+   */
+  public Query getQuery() {
+    return _query;
+  }
+
+  /**
+   * @see javax.wsdl.extensions.ExtensibilityElement#setRequired(java.lang.Boolean)
+   */
+  public void setRequired(Boolean arg0) {
+  }
+
+  /**
+   * @see javax.wsdl.extensions.ExtensibilityElement#getRequired()
+   */
+  public Boolean getRequired() {
+    return Boolean.FALSE;
+  }
+  
+  /**
+   * Set the namespace context for the <code>&lt;propertyAlias&gt;</code> element that
+   * created this object.  It will be used later.
+   * @param n the <code>NSContext</code> that encapsulates the namespace context
+   */
+  public void setNSContext(NSContext n) {
+    _nsc = n;
+  }
+  
+  /**
+   * Get the namespace context for the <code>&lt;propertyAlias&gt;</code> element that
+   * created this object.
+   * @return the <code>NSContext</code> the encapsulates the namespace context
+   */
+  public NSContext getNSContext() {
+    return _nsc;
+  }
+}

Added: incubator/ode/trunk/bpel-bom/src/main/java/org/apache/ode/bom/wsdl/PropertyAliasSerializer_11.java
URL: http://svn.apache.org/viewcvs/incubator/ode/trunk/bpel-bom/src/main/java/org/apache/ode/bom/wsdl/PropertyAliasSerializer_11.java?rev=398694&view=auto
==============================================================================
--- incubator/ode/trunk/bpel-bom/src/main/java/org/apache/ode/bom/wsdl/PropertyAliasSerializer_11.java (added)
+++ incubator/ode/trunk/bpel-bom/src/main/java/org/apache/ode/bom/wsdl/PropertyAliasSerializer_11.java Mon May  1 14:37:44 2006
@@ -0,0 +1,114 @@
+/*
+ * File:      $RCSfile$
+ * Copyright: (C) 1999-2005 FiveSight Technologies Inc.
+ *
+ */
+package org.apache.ode.bom.wsdl;
+
+import org.apache.ode.bom.api.Query;
+import org.apache.ode.bom.impl.nodes.ExpressionImpl;
+import org.apache.ode.utils.DOMUtils;
+import org.apache.ode.utils.msg.MessageBundle;
+import com.ibm.wsdl.util.xml.XPathUtils;
+
+import java.io.PrintWriter;
+import java.io.Serializable;
+
+import javax.wsdl.Definition;
+import javax.wsdl.Message;
+import javax.wsdl.WSDLException;
+import javax.wsdl.extensions.ExtensibilityElement;
+import javax.wsdl.extensions.ExtensionDeserializer;
+import javax.wsdl.extensions.ExtensionRegistry;
+import javax.wsdl.extensions.ExtensionSerializer;
+import javax.xml.namespace.QName;
+
+import org.w3c.dom.Attr;
+import org.w3c.dom.Element;
+
+
+/**
+ * WSDL serializer/deserializer for the BPEL <code>propertyAlias</code> extension.
+ */
+class PropertyAliasSerializer_11
+        extends BaseSerializerDeserializer
+        implements ExtensionDeserializer,
+        ExtensionSerializer,
+        Serializable {
+  private static final long serialVersionUID = -1L;
+  
+  private static final Messages __msgs = MessageBundle.getMessages(Messages.class);
+  
+	/* (non-Javadoc)
+   * @see javax.wsdl.extensions.ExtensionSerializer#marshall(java.lang.Class, javax.xml.namespace.QName, javax.wsdl.extensions.ExtensibilityElement, java.io.PrintWriter, javax.wsdl.Definition, javax.wsdl.extensions.ExtensionRegistry)
+   */
+  public void marshall(Class arg0, QName arg1, ExtensibilityElement arg2,
+                       PrintWriter arg3, Definition arg4,
+                       ExtensionRegistry arg5)
+                throws WSDLException {
+    throw new UnsupportedOperationException();
+  }
+
+  /* (non-Javadoc)
+   * @see javax.wsdl.extensions.ExtensionDeserializer#unmarshall(java.lang.Class, javax.xml.namespace.QName, org.w3c.dom.Element, javax.wsdl.Definition, javax.wsdl.extensions.ExtensionRegistry)
+   */
+  public ExtensibilityElement unmarshall(Class arg0, QName arg1, Element el,
+                                         Definition def, ExtensionRegistry arg4)
+                                  throws WSDLException {
+
+    validateExtensibilityElementContext(el);
+    
+    if (!DOMUtils.isEmptyElement(el)) {
+      InvalidBpelPropertyException ibpe = new InvalidBpelPropertyException(
+          __msgs.msgElementMustBeEmpty(arg1.toString()));
+      ibpe.setLocation(XPathUtils.getXPathExprFromNode(el));
+    }
+    
+    PropertyAliasImpl alias = new PropertyAliasImpl();
+    alias.setElementType(arg1);
+    alias.setPropertyName(checkAttr(arg1, el,"propertyName"));
+    alias.setMessageType(checkAttr(arg1, el,"messageType"));
+    
+    Message msg =def.getMessage(alias.getMessageType()); 
+    if (msg == null) {
+      InvalidBpelPropertyAliasException ibpae = new InvalidBpelPropertyAliasException(
+          __msgs.msgNoSuchMessageTypeForPropertyAlias(alias.getMessageType().toString()));
+      ibpae.setLocation(XPathUtils.getXPathExprFromNode(el));
+      throw ibpae;
+    }
+    
+    if (el.getAttributeNode("part") != null) {
+      alias.setPart(el.getAttribute("part"));
+      if (msg.getPart(alias.getPart()) == null) {
+        InvalidBpelPropertyAliasException i = new InvalidBpelPropertyAliasException(
+            __msgs.msgNoSuchPartForPropertyAlias(alias.getMessageType().toString(),
+                alias.getPart()));
+        i.setLocation(XPathUtils.getXPathExprFromNode(el));
+        throw i;
+      }
+    }
+    
+    if (el.getAttributeNode("query") != null) {
+      Query qry = new ExpressionImpl(null);
+      qry.setNamespaceContext(DOMUtils.getMyNSContext(el));
+      qry.setXPathString(getAttribute(el, "query"));
+      qry.setLineNo(-1); // TODO: Fix location information
+      alias.setQuery(qry);
+    }
+
+    alias.setNSContext(DOMUtils.getMyNSContext(el));
+    
+    return alias;
+  }
+  
+  private QName checkAttr(QName qname, Element el, String attr) throws WSDLException {
+    Attr att = el.getAttributeNode(attr);
+    if (att == null) {
+      InvalidBpelPropertyAliasException ibpae = new InvalidBpelPropertyAliasException(
+          __msgs.msgElementRequiresAttr(qname.toString(),attr));
+      ibpae.setLocation(XPathUtils.getXPathExprFromNode(el));
+      throw ibpae;
+    }
+    return derefQName(att.getValue(), el);
+  }
+}

Added: incubator/ode/trunk/bpel-bom/src/main/java/org/apache/ode/bom/wsdl/PropertyAliasSerializer_20.java
URL: http://svn.apache.org/viewcvs/incubator/ode/trunk/bpel-bom/src/main/java/org/apache/ode/bom/wsdl/PropertyAliasSerializer_20.java?rev=398694&view=auto
==============================================================================
--- incubator/ode/trunk/bpel-bom/src/main/java/org/apache/ode/bom/wsdl/PropertyAliasSerializer_20.java (added)
+++ incubator/ode/trunk/bpel-bom/src/main/java/org/apache/ode/bom/wsdl/PropertyAliasSerializer_20.java Mon May  1 14:37:44 2006
@@ -0,0 +1,121 @@
+/*
+ * File:      $RCSfile$
+ * Copyright: (C) 1999-2005 FiveSight Technologies Inc.
+ *
+ */
+package org.apache.ode.bom.wsdl;
+
+import org.apache.ode.bom.api.Constants;
+import org.apache.ode.bom.api.Query;
+import org.apache.ode.bom.impl.nodes.ExpressionImpl;
+import org.apache.ode.utils.DOMUtils;
+import org.apache.ode.utils.msg.MessageBundle;
+import com.ibm.wsdl.util.xml.XPathUtils;
+
+import java.io.PrintWriter;
+import java.io.Serializable;
+
+import javax.wsdl.Definition;
+import javax.wsdl.Message;
+import javax.wsdl.WSDLException;
+import javax.wsdl.extensions.ExtensibilityElement;
+import javax.wsdl.extensions.ExtensionDeserializer;
+import javax.wsdl.extensions.ExtensionRegistry;
+import javax.wsdl.extensions.ExtensionSerializer;
+import javax.xml.namespace.QName;
+
+import org.w3c.dom.Attr;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+
+/**
+ * WSDL serializer/deserializer for the BPEL <code>propertyAlias</code> extension.
+ */
+class PropertyAliasSerializer_20
+        extends BaseSerializerDeserializer
+        implements ExtensionDeserializer,
+        ExtensionSerializer,
+        Serializable {
+  private static final long serialVersionUID = -1L;
+  
+  private static final Messages __msgs = MessageBundle.getMessages(Messages.class);
+  
+	/* (non-Javadoc)
+   * @see javax.wsdl.extensions.ExtensionSerializer#marshall(java.lang.Class, javax.xml.namespace.QName, javax.wsdl.extensions.ExtensibilityElement, java.io.PrintWriter, javax.wsdl.Definition, javax.wsdl.extensions.ExtensionRegistry)
+   */
+  public void marshall(Class arg0, QName arg1, ExtensibilityElement arg2,
+                       PrintWriter arg3, Definition arg4,
+                       ExtensionRegistry arg5)
+                throws WSDLException {
+    throw new UnsupportedOperationException();
+  }
+
+  /* (non-Javadoc)
+   * @see javax.wsdl.extensions.ExtensionDeserializer#unmarshall(java.lang.Class, javax.xml.namespace.QName, org.w3c.dom.Element, javax.wsdl.Definition, javax.wsdl.extensions.ExtensionRegistry)
+   */
+  public ExtensibilityElement unmarshall(Class arg0, QName arg1, Element el,
+                                         Definition def, ExtensionRegistry arg4)
+                                  throws WSDLException {
+
+    validateExtensibilityElementContext(el);
+    
+    if (!DOMUtils.isEmptyElement(el)) {
+      InvalidBpelPropertyException ibpe = new InvalidBpelPropertyException(
+          __msgs.msgElementMustBeEmpty(arg1.toString()));
+      ibpe.setLocation(XPathUtils.getXPathExprFromNode(el));
+    }
+    
+    PropertyAliasImpl alias = new PropertyAliasImpl();
+    alias.setElementType(arg1);
+    alias.setPropertyName(checkAttr(arg1, el,"propertyName"));
+    alias.setMessageType(checkAttr(arg1, el,"messageType"));
+    
+    Message msg =def.getMessage(alias.getMessageType()); 
+    if (msg == null) {
+      InvalidBpelPropertyAliasException ibpae = new InvalidBpelPropertyAliasException(
+          __msgs.msgNoSuchMessageTypeForPropertyAlias(alias.getMessageType().toString()));
+      ibpae.setLocation(XPathUtils.getXPathExprFromNode(el));
+      throw ibpae;
+    }
+    
+    
+    if(el.getNamespaceURI().equals(Constants.NS_WSBPEL_2004_03)){
+      // fine query elemetn
+      NodeList nl = el.getChildNodes();
+      for(int i =  0; i < nl.getLength(); ++i){
+      	Node child = nl.item(i);
+        if(child.getNodeType() == Node.ELEMENT_NODE
+          && child.getNamespaceURI().equals(Constants.NS_WSBPEL_2004_03)
+          && child.getLocalName().equals("query")){
+          Element qe = (Element)child;
+          String ql = qe.getAttribute("queryLanguage");
+          
+          Query qry = (ql != null && !"".equals(ql.trim()))
+          		? new ExpressionImpl(ql)
+          		: new ExpressionImpl();
+          qry.setNamespaceContext(DOMUtils.getMyNSContext(qe));
+          qry.setNode(qe.getFirstChild());
+          qry.setLineNo(-1); // TODO: Fix location information
+          alias.setQuery(qry);
+        }
+      }
+    }
+
+    alias.setNSContext(DOMUtils.getMyNSContext(el));
+    
+    return alias;
+  }
+  
+  private QName checkAttr(QName qname, Element el, String attr) throws WSDLException {
+    Attr att = el.getAttributeNode(attr);
+    if (att == null) {
+      InvalidBpelPropertyAliasException ibpae = new InvalidBpelPropertyAliasException(
+          __msgs.msgElementRequiresAttr(qname.toString(),attr));
+      ibpae.setLocation(XPathUtils.getXPathExprFromNode(el));
+      throw ibpae;
+    }
+    return derefQName(att.getValue(), el);
+  }
+}

Added: incubator/ode/trunk/bpel-bom/src/main/java/org/apache/ode/bom/wsdl/PropertyImpl.java
URL: http://svn.apache.org/viewcvs/incubator/ode/trunk/bpel-bom/src/main/java/org/apache/ode/bom/wsdl/PropertyImpl.java?rev=398694&view=auto
==============================================================================
--- incubator/ode/trunk/bpel-bom/src/main/java/org/apache/ode/bom/wsdl/PropertyImpl.java (added)
+++ incubator/ode/trunk/bpel-bom/src/main/java/org/apache/ode/bom/wsdl/PropertyImpl.java Mon May  1 14:37:44 2006
@@ -0,0 +1,84 @@
+/*
+ * File:      $RCSfile$
+ * Copyright: (C) 1999-2005 FiveSight Technologies Inc.
+ *
+ */
+package org.apache.ode.bom.wsdl;
+
+import java.io.Serializable;
+
+import javax.wsdl.extensions.ExtensibilityElement;
+import javax.xml.namespace.QName;
+
+
+/**
+ * Interim object representation of a BPEL <code>&lt;property</code> element.
+ */
+class PropertyImpl implements org.apache.ode.bom.wsdl.Property, ExtensibilityElement, Serializable {
+	
+	private static final long serialVersionUID = -1L;
+
+  private QName _name;
+  private QName _propertyType;
+  private QName _elementType;
+  
+  /**
+   * @see javax.wsdl.extensions.ExtensibilityElement#setElementType(javax.xml.namespace.QName)
+   */
+  public void setElementType(QName arg0) {
+    _elementType = arg0;
+  }
+
+  /**
+   * @see javax.wsdl.extensions.ExtensibilityElement#getElementType()
+   */
+  public QName getElementType() {
+    return _elementType;
+  }
+
+  /**
+   * Set the name of this property for reference.
+   * @param name the <code>QName</code> of the property
+   */
+  public void setName(QName name) {
+    _name = name;
+  }
+
+  /**
+   * Get the name of the property.
+   * @return the <code>QName</code> of the property.
+   */
+  public QName getName() {
+    return _name;
+  }
+
+  /**
+   * Set the name of the schema type for this property.
+   * @param name the <code>QName</code> of the type.
+   */
+  public void setPropertyType(QName name) {
+    _propertyType = name;
+  }
+
+  /**
+   * Get the name of the schema type for this property
+   * @return the <code>QName</code> for the schema type of this property.
+   */
+  public QName getPropertyType() {
+    return _propertyType;
+  }
+
+  /**
+   * @see javax.wsdl.extensions.ExtensibilityElement#setRequired(java.lang.Boolean)
+   */
+  public void setRequired(Boolean arg0) {
+  }
+
+  /**
+   * @see javax.wsdl.extensions.ExtensibilityElement#getRequired()
+   */
+  public Boolean getRequired() {
+    return Boolean.FALSE;
+  }
+  
+}

Added: incubator/ode/trunk/bpel-bom/src/main/java/org/apache/ode/bom/wsdl/PropertySerializer.java
URL: http://svn.apache.org/viewcvs/incubator/ode/trunk/bpel-bom/src/main/java/org/apache/ode/bom/wsdl/PropertySerializer.java?rev=398694&view=auto
==============================================================================
--- incubator/ode/trunk/bpel-bom/src/main/java/org/apache/ode/bom/wsdl/PropertySerializer.java (added)
+++ incubator/ode/trunk/bpel-bom/src/main/java/org/apache/ode/bom/wsdl/PropertySerializer.java Mon May  1 14:37:44 2006
@@ -0,0 +1,86 @@
+/*
+ * File:      $RCSfile$
+ * Copyright: (C) 1999-2005 FiveSight Technologies Inc.
+ *
+ */
+package org.apache.ode.bom.wsdl;
+
+import org.apache.ode.utils.DOMUtils;
+import com.ibm.wsdl.util.xml.XPathUtils;
+
+import java.io.PrintWriter;
+import java.io.Serializable;
+
+import javax.wsdl.Definition;
+import javax.wsdl.WSDLException;
+import javax.wsdl.extensions.ExtensibilityElement;
+import javax.wsdl.extensions.ExtensionDeserializer;
+import javax.wsdl.extensions.ExtensionRegistry;
+import javax.wsdl.extensions.ExtensionSerializer;
+import javax.xml.namespace.QName;
+
+import org.w3c.dom.Attr;
+import org.w3c.dom.Element;
+
+
+/**
+ * WSDL serializer/deserializer for the BPEL <code>property</code> WSDL extension.
+ */
+class PropertySerializer
+        extends BaseSerializerDeserializer
+        implements ExtensionDeserializer, ExtensionSerializer, Serializable {
+
+  private static final long serialVersionUID = -1L;
+
+	/* (non-Javadoc)
+   * @see javax.wsdl.extensions.ExtensionSerializer#marshall(java.lang.Class, javax.xml.namespace.QName, javax.wsdl.extensions.ExtensibilityElement, java.io.PrintWriter, javax.wsdl.Definition, javax.wsdl.extensions.ExtensionRegistry)
+   */
+  public void marshall(Class arg0, QName arg1, ExtensibilityElement arg2,
+                       PrintWriter arg3, Definition arg4,
+                       ExtensionRegistry arg5)
+                throws WSDLException {
+    throw new UnsupportedOperationException();
+  }
+
+  /**
+   * @see javax.wsdl.extensions.ExtensionDeserializer#unmarshall(java.lang.Class, javax.xml.namespace.QName, org.w3c.dom.Element, javax.wsdl.Definition, javax.wsdl.extensions.ExtensionRegistry)
+   */
+  public ExtensibilityElement unmarshall(Class arg0, QName qn, Element el,
+                                         Definition def, ExtensionRegistry er)
+                                  throws WSDLException {
+    
+    validateExtensibilityElementContext(el);
+    
+    if (!DOMUtils.isEmptyElement(el)) {
+      InvalidBpelPropertyException ibpe = new InvalidBpelPropertyException(
+          __msgs.msgElementMustBeEmpty(qn.toString()));
+      ibpe.setLocation(XPathUtils.getXPathExprFromNode(el));
+    }
+    
+    PropertyImpl property = new PropertyImpl();
+    property.setElementType(qn);
+
+    Attr name = el.getAttributeNode("name");
+    if (name == null) {
+      InvalidBpelPropertyException ibpe = new InvalidBpelPropertyException(
+          __msgs.msgElementRequiresAttr(qn.toString(),"name"));
+      ibpe.setLocation(XPathUtils.getXPathExprFromNode(el));
+      throw ibpe;
+    }
+    
+    property.setName(new QName(def.getTargetNamespace(), name.getValue()));
+    
+    Attr type = el.getAttributeNode("type");
+    if (type == null) {
+      InvalidBpelPropertyException ibpe = new InvalidBpelPropertyException(
+          __msgs.msgElementRequiresAttr(qn.toString(),"type"));
+      ibpe.setLocation(XPathUtils.getXPathExprFromNode(el));
+      throw ibpe;
+    }
+    property.setPropertyType(derefQName(type.getValue(), el));
+    
+    return property;
+  }
+
+
+}

Added: incubator/ode/trunk/bpel-bom/src/main/java/org/apache/ode/bom/wsdl/WSDLFactory4BPEL.java
URL: http://svn.apache.org/viewcvs/incubator/ode/trunk/bpel-bom/src/main/java/org/apache/ode/bom/wsdl/WSDLFactory4BPEL.java?rev=398694&view=auto
==============================================================================
--- incubator/ode/trunk/bpel-bom/src/main/java/org/apache/ode/bom/wsdl/WSDLFactory4BPEL.java (added)
+++ incubator/ode/trunk/bpel-bom/src/main/java/org/apache/ode/bom/wsdl/WSDLFactory4BPEL.java Mon May  1 14:37:44 2006
@@ -0,0 +1,23 @@
+/*
+ * File:      $RCSfile$
+ * Copyright: (C) 1999-2005 FiveSight Technologies Inc.
+ *
+ */
+package org.apache.ode.bom.wsdl;
+
+import javax.wsdl.Definition;
+import javax.wsdl.xml.WSDLReader;
+import javax.wsdl.xml.WSDLWriter;
+
+/**
+ * Marker interface for WSDL factories that understand BPEL WSDL extensions.
+ */
+public interface WSDLFactory4BPEL {
+
+  Definition newDefinition();
+
+  WSDLReader newWSDLReader();
+
+  WSDLWriter newWSDLWriter();
+
+}

Added: incubator/ode/trunk/bpel-bom/src/main/java/org/apache/ode/bom/wsdl/WSDLFactoryBPEL11.java
URL: http://svn.apache.org/viewcvs/incubator/ode/trunk/bpel-bom/src/main/java/org/apache/ode/bom/wsdl/WSDLFactoryBPEL11.java?rev=398694&view=auto
==============================================================================
--- incubator/ode/trunk/bpel-bom/src/main/java/org/apache/ode/bom/wsdl/WSDLFactoryBPEL11.java (added)
+++ incubator/ode/trunk/bpel-bom/src/main/java/org/apache/ode/bom/wsdl/WSDLFactoryBPEL11.java Mon May  1 14:37:44 2006
@@ -0,0 +1,45 @@
+/*
+ * File:      $RCSfile$
+ * Copyright: (C) 1999-2005 FiveSight Technologies Inc.
+ *
+ */
+package org.apache.ode.bom.wsdl;
+
+import org.apache.ode.bom.api.Constants;
+
+import javax.wsdl.Definition;
+import javax.wsdl.Types;
+import javax.wsdl.extensions.ExtensionRegistry;
+import javax.wsdl.factory.WSDLFactory;
+import javax.xml.namespace.QName;
+
+/**
+ * Factory for {@link WSDLFactory} objects that are pre-configured to handle
+ * BPEL 2.0 extension elements.
+ */
+public class WSDLFactoryBPEL11 extends WSDLFactoryImpl implements WSDLFactory4BPEL {
+
+  public WSDLFactoryBPEL11() {
+    super(Constants.NS_BPEL4WS_2003_03, Constants.NS_BPEL4WS_PARTNERLINK_2003_05);
+  }
+
+  public static WSDLFactory newInstance() {
+    return new WSDLFactoryBPEL11();
+  }
+
+  public ExtensionRegistry newPopulatedExtensionRegistry() {
+    ExtensionRegistry extRegistry;
+    extRegistry = super.newPopulatedExtensionRegistry();
+    extRegistry.registerDeserializer(Definition.class, new QName(_bpwsNS, "property"),
+                             new PropertySerializer());
+    extRegistry.registerDeserializer(Definition.class, new QName(_bpwsNS, "propertyAlias"),
+                             new PropertyAliasSerializer_11());
+    extRegistry.registerDeserializer(Types.class, XMLSchemaType.QNAME,
+                             new XMLSchemaTypeSerializer());
+    extRegistry.registerDeserializer(Definition.class, new QName(Constants.NS_BPEL4WS_PARTNERLINK_2003_05, "partnerLinkType"),
+        new PartnerLinkTypeSerializer_1_1(Constants.NS_BPEL4WS_PARTNERLINK_2003_05));
+    return extRegistry;
+
+  }
+
+}

Added: incubator/ode/trunk/bpel-bom/src/main/java/org/apache/ode/bom/wsdl/WSDLFactoryBPEL20.java
URL: http://svn.apache.org/viewcvs/incubator/ode/trunk/bpel-bom/src/main/java/org/apache/ode/bom/wsdl/WSDLFactoryBPEL20.java?rev=398694&view=auto
==============================================================================
--- incubator/ode/trunk/bpel-bom/src/main/java/org/apache/ode/bom/wsdl/WSDLFactoryBPEL20.java (added)
+++ incubator/ode/trunk/bpel-bom/src/main/java/org/apache/ode/bom/wsdl/WSDLFactoryBPEL20.java Mon May  1 14:37:44 2006
@@ -0,0 +1,45 @@
+/*
+ * File:      $RCSfile$
+ * Copyright: (C) 1999-2005 FiveSight Technologies Inc.
+ *
+ */
+package org.apache.ode.bom.wsdl;
+
+import org.apache.ode.bom.api.Constants;
+
+import javax.wsdl.Definition;
+import javax.wsdl.Types;
+import javax.wsdl.extensions.ExtensionRegistry;
+import javax.wsdl.factory.WSDLFactory;
+import javax.xml.namespace.QName;
+
+/**
+ * Factory for {@link WSDLFactory} objects that are pre-configured to handle
+ * BPEL 2.0 extension elements.
+ */
+public class WSDLFactoryBPEL20 extends WSDLFactoryImpl implements WSDLFactory4BPEL {
+
+  public WSDLFactoryBPEL20() {
+    super(Constants.NS_WSBPEL_2004_03, Constants.NS_WSBPEL_PARTNERLINK_2004_03);
+  }
+
+  public static WSDLFactory newInstance() {
+    return new WSDLFactoryBPEL20();
+  }
+
+  public ExtensionRegistry newPopulatedExtensionRegistry() {
+    ExtensionRegistry extRegistry;
+    extRegistry = super.newPopulatedExtensionRegistry();
+    extRegistry.registerDeserializer(Definition.class, new QName(_bpwsNS, "property"),
+                             new PropertySerializer());
+    extRegistry.registerDeserializer(Definition.class, new QName(_bpwsNS, "propertyAlias"),
+                             new PropertyAliasSerializer_20());
+    extRegistry.registerDeserializer(Types.class, XMLSchemaType.QNAME,
+                             new XMLSchemaTypeSerializer());
+    extRegistry.registerDeserializer(Definition.class, new QName(Constants.NS_WSBPEL_PARTNERLINK_2004_03, "partnerLinkType"),
+        new PartnerLinkTypeSerializer_2_0(Constants.NS_WSBPEL_PARTNERLINK_2004_03));
+    return extRegistry;
+
+  }
+
+}

Added: incubator/ode/trunk/bpel-bom/src/main/java/org/apache/ode/bom/wsdl/WSDLFactoryImpl.java
URL: http://svn.apache.org/viewcvs/incubator/ode/trunk/bpel-bom/src/main/java/org/apache/ode/bom/wsdl/WSDLFactoryImpl.java?rev=398694&view=auto
==============================================================================
--- incubator/ode/trunk/bpel-bom/src/main/java/org/apache/ode/bom/wsdl/WSDLFactoryImpl.java (added)
+++ incubator/ode/trunk/bpel-bom/src/main/java/org/apache/ode/bom/wsdl/WSDLFactoryImpl.java Mon May  1 14:37:44 2006
@@ -0,0 +1,75 @@
+/*
+ * File:      $RCSfile$
+ * Copyright: (C) 1999-2005 FiveSight Technologies Inc.
+ *
+ */
+package org.apache.ode.bom.wsdl;
+
+import javax.wsdl.Definition;
+import javax.wsdl.WSDLException;
+import javax.wsdl.extensions.ExtensionRegistry;
+import javax.wsdl.factory.WSDLFactory;
+import javax.wsdl.xml.WSDLReader;
+import javax.wsdl.xml.WSDLWriter;
+
+/**
+ * Implementation of the BPEL-aware {@link javax.wsdl.factory.WSDLFactory}.
+ */
+abstract class WSDLFactoryImpl extends WSDLFactory implements WSDLFactory4BPEL {
+  private WSDLFactory _wsdlFactory;
+
+  /** BPEL Namespace (<code>bpws</code>). */
+  protected String _bpwsNS;
+
+  /** Partner Link Namespace (<code>plnk</code>). */
+  private String _plnkNS;
+
+  WSDLFactoryImpl(String bpwsNS, String plnkNS)  {
+    try {
+      _wsdlFactory  = WSDLFactory.newInstance();
+    } catch (WSDLException e) {
+      throw new AssertionError("Unable to load WSDL4J!");
+    }
+    
+    _bpwsNS = bpwsNS;
+    _plnkNS = plnkNS;
+
+  }
+
+  /**
+   * Create a {@link Definition4BPEL} object out of a standard
+   * WSDL {@link Definition}.
+   * @param wsdlDef WSDL {@link Definition}
+   * @return new {@link Definition4BPEL} object
+   */
+  public Definition4BPEL narrow(Definition wsdlDef) {
+    if (wsdlDef instanceof Definition4BPEL)
+      return (Definition4BPEL) wsdlDef;
+    return new Definition4BPELImpl(wsdlDef, _bpwsNS, _plnkNS);
+  }
+
+  public Definition newDefinition() {
+    Definition def = _wsdlFactory.newDefinition();
+    def.setExtensionRegistry(newPopulatedExtensionRegistry());
+    return new Definition4BPELImpl(def, _bpwsNS, _plnkNS);
+  }
+
+
+  public WSDLReader newWSDLReader() {
+    WSDLReader reader = _wsdlFactory.newWSDLReader();
+    reader.setFactoryImplName(getClass().getName());
+    reader.setFeature("javax.wsdl.verbose", false);
+    reader.setExtensionRegistry(newPopulatedExtensionRegistry());
+    return reader;
+  }
+
+  public WSDLWriter newWSDLWriter() {
+    WSDLWriter writer = _wsdlFactory.newWSDLWriter();
+    writer.setFeature("javax.wsdl.verbose", false);
+    return writer;
+  }
+
+  public ExtensionRegistry newPopulatedExtensionRegistry() {
+    return _wsdlFactory.newPopulatedExtensionRegistry();
+  }
+}

Added: incubator/ode/trunk/bpel-bom/src/main/java/org/apache/ode/bom/wsdl/XMLSchemaType.java
URL: http://svn.apache.org/viewcvs/incubator/ode/trunk/bpel-bom/src/main/java/org/apache/ode/bom/wsdl/XMLSchemaType.java?rev=398694&view=auto
==============================================================================
--- incubator/ode/trunk/bpel-bom/src/main/java/org/apache/ode/bom/wsdl/XMLSchemaType.java (added)
+++ incubator/ode/trunk/bpel-bom/src/main/java/org/apache/ode/bom/wsdl/XMLSchemaType.java Mon May  1 14:37:44 2006
@@ -0,0 +1,69 @@
+/*
+ * File:      $RCSfile$
+ * Copyright: (C) 1999-2005 FiveSight Technologies Inc.
+ *
+ */
+package org.apache.ode.bom.wsdl;
+
+import java.io.Serializable;
+
+import javax.wsdl.extensions.ExtensibilityElement;
+import javax.xml.namespace.QName;
+
+/**
+ * Extensibility element that contains the xml-schema text as a string.
+ */
+public class XMLSchemaType implements ExtensibilityElement, Serializable {
+  
+  private static final long serialVersionUID = -5826656164421594730L;
+
+  private static final String NS_XSD_2001 = "http://www.w3.org/2001/XMLSchema";
+  
+  /** WSDL QNAME identifier */
+  public static final QName QNAME = new QName(NS_XSD_2001, "schema");
+
+  /** For compatibility with some older classes. */
+  public static final QName qname = QNAME;
+
+  private String _xmlSchema;
+
+  public XMLSchemaType(String xmlSchema) {
+    super();
+    _xmlSchema = xmlSchema;
+  }
+
+  /* (non-Javadoc)
+   * @see javax.wsdl.extensions.ExtensibilityElement#setElementType(javax.xml.namespace.QName)
+   */
+  public void setElementType(QName arg0) {
+  }
+
+  /* (non-Javadoc)
+   * @see javax.wsdl.extensions.ExtensibilityElement#getElementType()
+   */
+  public QName getElementType() {
+    return QNAME;
+  }
+
+  /* (non-Javadoc)
+   * @see javax.wsdl.extensions.ExtensibilityElement#setRequired(java.lang.Boolean)
+   */
+  public void setRequired(Boolean arg0) {
+  }
+
+  /* (non-Javadoc)
+   * @see javax.wsdl.extensions.ExtensibilityElement#getRequired()
+   */
+  public Boolean getRequired() {
+    return Boolean.FALSE;
+  }
+
+  /**
+   * Returns the schema content as string.
+   *
+   * @return
+   */
+  public String getXMLSchema() {
+    return _xmlSchema;
+  }
+}

Added: incubator/ode/trunk/bpel-bom/src/main/java/org/apache/ode/bom/wsdl/XMLSchemaTypeSerializer.java
URL: http://svn.apache.org/viewcvs/incubator/ode/trunk/bpel-bom/src/main/java/org/apache/ode/bom/wsdl/XMLSchemaTypeSerializer.java?rev=398694&view=auto
==============================================================================
--- incubator/ode/trunk/bpel-bom/src/main/java/org/apache/ode/bom/wsdl/XMLSchemaTypeSerializer.java (added)
+++ incubator/ode/trunk/bpel-bom/src/main/java/org/apache/ode/bom/wsdl/XMLSchemaTypeSerializer.java Mon May  1 14:37:44 2006
@@ -0,0 +1,68 @@
+/*
+ * File:      $RCSfile$
+ * Copyright: (C) 1999-2005 FiveSight Technologies Inc.
+ *
+ */
+package org.apache.ode.bom.wsdl;
+
+import org.apache.ode.utils.DOMUtils;
+
+import java.io.PrintWriter;
+import java.io.Serializable;
+
+import javax.wsdl.Definition;
+import javax.wsdl.WSDLException;
+import javax.wsdl.extensions.ExtensibilityElement;
+import javax.wsdl.extensions.ExtensionDeserializer;
+import javax.wsdl.extensions.ExtensionRegistry;
+import javax.wsdl.extensions.ExtensionSerializer;
+import javax.xml.namespace.QName;
+
+import org.w3c.dom.Element;
+
+
+/**
+ * WSDL extension to capture (read-only) the schema type info.
+ *
+ * @author jguinney
+ */
+public class XMLSchemaTypeSerializer implements ExtensionSerializer,
+                                                ExtensionDeserializer,
+                                                Serializable {
+    
+  private static final long serialVersionUID = -870479908175017298L;
+
+  public XMLSchemaTypeSerializer() {
+    super();
+  }
+
+  /**
+   * Unimplemented.
+   *
+   * @see javax.wsdl.extensions.ExtensionSerializer#marshall(java.lang.Class,
+   *      javax.xml.namespace.QName,
+   *      javax.wsdl.extensions.ExtensibilityElement, java.io.PrintWriter,
+   *      javax.wsdl.Definition, javax.wsdl.extensions.ExtensionRegistry)
+   */
+  public void marshall(Class clazz, QName qname, ExtensibilityElement element,
+                       PrintWriter writer, Definition definition,
+                       ExtensionRegistry extensionRegistry)
+                throws WSDLException {
+    throw new UnsupportedOperationException();
+  }
+
+  /**
+   * Returns a {@link XMLSchemaType}
+   *
+   * @see javax.wsdl.extensions.ExtensionDeserializer#unmarshall(java.lang.Class,
+   *      javax.xml.namespace.QName, org.w3c.dom.Element,
+   *      javax.wsdl.Definition, javax.wsdl.extensions.ExtensionRegistry)
+   */
+  public ExtensibilityElement unmarshall(Class clazz, QName qname, Element element,
+                                         Definition definition,
+                                         ExtensionRegistry extensionRegistry)
+                                  throws WSDLException {
+    DOMUtils.pancakeNamespaces(element);
+    return new XMLSchemaType(DOMUtils.domToString(element));
+  }
+}

Added: incubator/ode/trunk/bpel-parser/pom.xml
URL: http://svn.apache.org/viewcvs/incubator/ode/trunk/bpel-parser/pom.xml?rev=398694&view=auto
==============================================================================
--- incubator/ode/trunk/bpel-parser/pom.xml (added)
+++ incubator/ode/trunk/bpel-parser/pom.xml Mon May  1 14:37:44 2006
@@ -0,0 +1,29 @@
+<project>
+  <groupId>ode</groupId>
+  <artifactId>ode-bpel-parser</artifactId>
+  <name>ODE :: BPEL Parser</name>
+
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <groupId>ode</groupId>
+    <artifactId>ode</artifactId>
+    <version>0.1-SNAPSHOT</version>
+  </parent>
+  <version>0.1-SNAPSHOT</version>
+  <dependencies>
+    <dependency>
+      <groupId>ode</groupId>
+      <artifactId>ode-bpel-bom</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>ode</groupId>
+      <artifactId>ode-utils</artifactId>
+    </dependency>
+
+    <dependency>
+      <groupId>wsdl4j</groupId>
+      <artifactId>wsdl4j</artifactId>
+    </dependency>
+
+  </dependencies>
+</project>

Added: incubator/ode/trunk/bpel-parser/src/main/java/org/apache/ode/bpel/parser/BpelParseErrorCollector.java
URL: http://svn.apache.org/viewcvs/incubator/ode/trunk/bpel-parser/src/main/java/org/apache/ode/bpel/parser/BpelParseErrorCollector.java?rev=398694&view=auto
==============================================================================
--- incubator/ode/trunk/bpel-parser/src/main/java/org/apache/ode/bpel/parser/BpelParseErrorCollector.java (added)
+++ incubator/ode/trunk/bpel-parser/src/main/java/org/apache/ode/bpel/parser/BpelParseErrorCollector.java Mon May  1 14:37:44 2006
@@ -0,0 +1,89 @@
+/*
+ * File:      $RCSfile$
+ * Copyright: (C) 1999-2005 FiveSight Technologies Inc.
+ *
+ */
+package org.apache.ode.bpel.parser;
+
+import org.apache.ode.bom.api.BpelObject;
+import org.apache.ode.sax.fsa.ParseError;
+import org.apache.ode.sax.fsa.ParseException;
+import org.apache.ode.sax.evt.SaxEvent;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.xml.sax.Locator;
+import org.xml.sax.SAXException;
+import org.xml.sax.SAXParseException;
+
+
+public class BpelParseErrorCollector implements BpelParseErrorHandler {
+
+  private ArrayList<ParseError> _errors;
+  
+  private short _abort = ParseError.ERROR;
+  private String _baseUri;
+
+  public BpelParseErrorCollector(String id) {
+    _errors = new ArrayList<ParseError>();
+    _baseUri = id;
+  }
+  
+  public void setAbortThreshold(short s) {
+    _abort = s;
+  }
+  
+  public void parseError(ParseError bpe) throws ParseException {
+    _errors.add(bpe);
+    if (bpe.getSeverity() >= _abort) {
+      throw new ParseException(bpe);
+    }
+  }
+  
+  public String getBaseUri() {
+    return _baseUri;
+  }
+
+  private void parseError(short severity, String uri, int line, int col, String key, String msg) throws ParseException {
+    parseError(new ParseErrorImpl(severity,uri,line,col,key,msg));
+  }
+  
+  public void parseError(short severity, BpelObject bo, String key, String msg) throws ParseException {
+    parseError(severity,_baseUri,bo.getLineNo(),-1,key,msg);   
+  }
+
+  public void parseError(short severity, SaxEvent se, String key, String msg) throws ParseException {
+    if (se.getLocation() != null) {
+      Locator l = se.getLocation();
+      parseError(severity,l.getSystemId(),l.getLineNumber(),l.getColumnNumber(),key, "INTERNAL PARSE ERROR: " + msg);
+    } else {
+      parseError(severity,_baseUri,-1,-1,key,"INTERNAL PARSE ERROR: " + msg);
+    }
+  }
+
+  public void parseError(short severity, String key, String msg) throws ParseException {
+    parseError(severity,_baseUri,-1,-1,key,msg);
+  }
+
+  public void setBaseUri(String uri) {
+    _baseUri = uri;
+ }
+
+  public List<ParseError> getErrors() {
+    return Collections.unmodifiableList(_errors);
+  }
+  
+  public void warning(SAXParseException exception) throws SAXException {
+    parseError(new ParseErrorImpl(ParseError.WARNING, _baseUri, exception.getLineNumber(), exception.getColumnNumber(), "SAX_WARNING", exception.getLocalizedMessage()));
+  }
+
+  public void error(SAXParseException exception) throws SAXException {
+    parseError(new ParseErrorImpl(ParseError.ERROR,_baseUri, exception.getLineNumber(), exception.getColumnNumber(), "SAX_ERROR",exception.getLocalizedMessage()));
+  }
+
+  public void fatalError(SAXParseException exception) throws SAXException {
+    parseError(new ParseErrorImpl(ParseError.FATAL, _baseUri, exception.getLineNumber(), exception.getColumnNumber(), "SAX_FATAL",exception.getLocalizedMessage()));
+  }
+}

Added: incubator/ode/trunk/bpel-parser/src/main/java/org/apache/ode/bpel/parser/BpelParseErrorHandler.java
URL: http://svn.apache.org/viewcvs/incubator/ode/trunk/bpel-parser/src/main/java/org/apache/ode/bpel/parser/BpelParseErrorHandler.java?rev=398694&view=auto
==============================================================================
--- incubator/ode/trunk/bpel-parser/src/main/java/org/apache/ode/bpel/parser/BpelParseErrorHandler.java (added)
+++ incubator/ode/trunk/bpel-parser/src/main/java/org/apache/ode/bpel/parser/BpelParseErrorHandler.java Mon May  1 14:37:44 2006
@@ -0,0 +1,22 @@
+/*
+ * File:      $RCSfile$
+ * Copyright: (C) 1999-2005 FiveSight Technologies Inc.
+ *
+ */
+package org.apache.ode.bpel.parser;
+
+import org.apache.ode.sax.fsa.ParseContext;
+
+import org.xml.sax.ErrorHandler;
+
+/**
+ * <p>
+ * Simple interface for handling either SAX-related (i.e., validation and
+ * well-formedness) errors and BPEL-specific errors at parse time.  The most
+ * common use case for the interface will be a collector that holds errors until
+ * later.
+ * </p>
+ */
+public interface BpelParseErrorHandler extends ErrorHandler, ParseContext {
+    
+}

Added: incubator/ode/trunk/bpel-parser/src/main/java/org/apache/ode/bpel/parser/BpelParseException.java
URL: http://svn.apache.org/viewcvs/incubator/ode/trunk/bpel-parser/src/main/java/org/apache/ode/bpel/parser/BpelParseException.java?rev=398694&view=auto
==============================================================================
--- incubator/ode/trunk/bpel-parser/src/main/java/org/apache/ode/bpel/parser/BpelParseException.java (added)
+++ incubator/ode/trunk/bpel-parser/src/main/java/org/apache/ode/bpel/parser/BpelParseException.java Mon May  1 14:37:44 2006
@@ -0,0 +1,19 @@
+/*
+ * File:      $RCSfile$
+ * Copyright: (C) 1999-2005 FiveSight Technologies Inc.
+ *
+ */
+package org.apache.ode.bpel.parser;
+
+/**
+ * Exception thrown to indicate an error in the BOM parser.
+ */
+public class BpelParseException extends Exception {
+
+  private static final long serialVersionUID = 1L;
+
+	/** Constructor. */
+  public BpelParseException(String msg, Throwable cause) {
+    super(msg, cause);
+  }
+}

Added: incubator/ode/trunk/bpel-parser/src/main/java/org/apache/ode/bpel/parser/BpelParser.java
URL: http://svn.apache.org/viewcvs/incubator/ode/trunk/bpel-parser/src/main/java/org/apache/ode/bpel/parser/BpelParser.java?rev=398694&view=auto
==============================================================================
--- incubator/ode/trunk/bpel-parser/src/main/java/org/apache/ode/bpel/parser/BpelParser.java (added)
+++ incubator/ode/trunk/bpel-parser/src/main/java/org/apache/ode/bpel/parser/BpelParser.java Mon May  1 14:37:44 2006
@@ -0,0 +1,84 @@
+/*
+ * File:      $RCSfile$
+ * Copyright: (C) 1999-2005 FiveSight Technologies Inc.
+ *
+ */
+package org.apache.ode.bpel.parser;
+
+import java.io.IOException;
+import java.net.URL;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+import org.xml.sax.XMLReader;
+
+import org.apache.ode.bom.api.Process;
+import org.apache.ode.sax.fsa.FsaHandler;
+import org.apache.ode.utils.XMLParserUtils;
+
+class BpelParser {
+  
+  private static final Log __log = LogFactory.getLog(BpelParser.class);
+
+  public static final String WSDL = "http://schemas.xmlsoap.org/wsdl/";
+
+  public static final String WSBPEL2_PLINK = "http://schemas.xmlsoap.org/ws/2004/03/partner-link/";
+
+  public static final String XML = "http://www.w3.org/2001/xml.xsd";
+
+  private XMLReader _xr;
+  private RootFSA _b;
+  private BpelParseErrorHandler _eh;
+  
+  
+  public BpelParser() {
+    _b = new RootFSA();
+    _xr = XMLParserUtils.getXMLReader();
+    try {
+      XMLParserUtils.addExternalSchemaURL(_xr,BpelProcessBuilder.BPEL4WS_NS,
+          getResource("/bpel4ws_1_1-fivesight.xsd").toExternalForm());
+      XMLParserUtils.addExternalSchemaURL(_xr,BpelProcessBuilder.WSBPEL2_0_NS,
+          getResource("/wsbpel_main-draft-Sep-06-2005.xsd").toExternalForm());
+      XMLParserUtils.addExternalSchemaURL(_xr,XML,
+          getResource("/xml.xsd").toExternalForm());
+      XMLParserUtils.addExternalSchemaURL(_xr,WSDL,
+          getResource("/wsdl.xsd").toExternalForm());
+      XMLParserUtils.addExternalSchemaURL(_xr,WSBPEL2_PLINK,
+          getResource("/wsbpel_plinkType-draft-Sep-06-2005.xsd").toExternalForm());
+    } catch (SAXException se) {
+      // complain but let it slide; who knows -- we might not be using Xerces...
+      __log.error("Unable to configure XMLReader ("  + _xr.getClass().getName() +
+          ") for schema validation.", se);
+    }
+    _xr.setContentHandler(new FsaHandler(_b));
+  }
+  
+  private URL getResource(String name) {
+    URL url = BpelParser.class.getResource( name );
+    if ( url == null ) {
+      throw new RuntimeException( "Unable to load resource: " + name );
+    }
+    return url;
+  }
+
+  public void setBpelParseErrorHandler(BpelParseErrorHandler bpeh) {
+    _eh = bpeh;
+  }
+  
+  public BpelParseErrorHandler getBpelParseErrorHandler() {
+    return _eh;
+  }
+  
+  public Process parse(InputSource is) throws SAXException, IOException {
+    _b.reset();
+    if (_eh != null) {
+      _xr.setErrorHandler(_eh);
+      _b.setParseContext(_eh);
+    }
+    _xr.parse(is);
+    return _b.getProcess();
+  }
+  
+}

Added: incubator/ode/trunk/bpel-parser/src/main/java/org/apache/ode/bpel/parser/BpelProcessBuilder.java
URL: http://svn.apache.org/viewcvs/incubator/ode/trunk/bpel-parser/src/main/java/org/apache/ode/bpel/parser/BpelProcessBuilder.java?rev=398694&view=auto
==============================================================================
--- incubator/ode/trunk/bpel-parser/src/main/java/org/apache/ode/bpel/parser/BpelProcessBuilder.java (added)
+++ incubator/ode/trunk/bpel-parser/src/main/java/org/apache/ode/bpel/parser/BpelProcessBuilder.java Mon May  1 14:37:44 2006
@@ -0,0 +1,53 @@
+/*
+ * File:      $RCSfile$
+ * Copyright: (C) 1999-2005 FiveSight Technologies Inc.
+ *
+ */
+package org.apache.ode.bpel.parser;
+
+import org.apache.ode.sax.fsa.ParseError;
+
+import org.xml.sax.InputSource;
+
+
+/**
+ * <p>
+ * Factory for creating the various BPEL Object Model objects.  Use an instance of
+ * {@link org.apache.ode.bpel.parser.BpelProcessBuilderFactory} to create an instance of
+ * this interface.
+ * </p>
+ */
+public interface BpelProcessBuilder {
+
+  /**
+   * The XML namespace of the schema for the specification as contributed to OASIS
+   * in 2003.
+   */
+  public static final String BPEL4WS_NS =
+    "http://schemas.xmlsoap.org/ws/2003/03/business-process/";
+ 
+  /**
+   * The XML namespace for schema of WS-BPEL 2.0, i.e., the first OASIS-sanctioned
+   * version of the specification.
+   */
+  public static final String WSBPEL2_0_NS =
+    "http://schemas.xmlsoap.org/ws/2004/03/business-process/";
+
+  /**
+   * Parse a BPEL process definition.
+   * @param bpelSource input source
+   * @param id source id 
+   * @return BOM representation of BPEL process
+   * @throws BpelParseException in case of parse error
+   */
+  org.apache.ode.bom.api.Process parse(InputSource bpelSource, String id) throws BpelParseException;
+
+  /**
+   * Get the errors from the last {@link #parse(org.xml.sax.InputSource,String)}
+   * call.
+   *
+   * @return array of errors
+   */
+  ParseError[] getParseErrors();
+
+}

Added: incubator/ode/trunk/bpel-parser/src/main/java/org/apache/ode/bpel/parser/BpelProcessBuilderFactory.java
URL: http://svn.apache.org/viewcvs/incubator/ode/trunk/bpel-parser/src/main/java/org/apache/ode/bpel/parser/BpelProcessBuilderFactory.java?rev=398694&view=auto
==============================================================================
--- incubator/ode/trunk/bpel-parser/src/main/java/org/apache/ode/bpel/parser/BpelProcessBuilderFactory.java (added)
+++ incubator/ode/trunk/bpel-parser/src/main/java/org/apache/ode/bpel/parser/BpelProcessBuilderFactory.java Mon May  1 14:37:44 2006
@@ -0,0 +1,46 @@
+/*
+ * File:      $RCSfile$
+ * Copyright: (C) 1999-2005 FiveSight Technologies Inc.
+ *
+ */
+package org.apache.ode.bpel.parser;
+
+/**
+ * Factory for creating {@link BpelProcessBuilder} objects.
+ */
+public abstract class BpelProcessBuilderFactory {
+  
+  /**
+   * Get a {@link BpelProcessBuilderFactory} object.
+   * @return a usable {@link BpelProcessBuilderFactory} object
+   * @throws BpelProcessBuilderFactoryException
+   */
+  public static BpelProcessBuilderFactory newProcessBuilderFactory() throws BpelProcessBuilderFactoryException {
+    return new org.apache.ode.bpel.parser.BpelProcessBuilderFactoryImpl();
+  }
+
+  /**
+   * Enable or disable strict parsing mode. In strict parsing mode the BPEL schema is
+   * enforced, any parse problems will resultin a {@link BpelParseException}. In
+   * non-strict mode, schema conformance is relaxed, and a best-effort will be made
+   * to load the BPEL process description.
+   *
+   * @param strict if <code>true</code> strict parsing will be used
+   */
+  abstract public void setStrict(boolean strict);
+
+  /**
+   * Get the strict parsing flag.
+   *
+   * @return value of strict parse flag
+   * @see #setStrict(boolean)
+   */
+  abstract public boolean getStrict();
+
+  /**
+   * Create a new {@link BpelProcessBuilder}.
+   *
+   * @return
+   */
+  abstract public BpelProcessBuilder newBpelProcessBuilder();
+}

Added: incubator/ode/trunk/bpel-parser/src/main/java/org/apache/ode/bpel/parser/BpelProcessBuilderFactoryException.java
URL: http://svn.apache.org/viewcvs/incubator/ode/trunk/bpel-parser/src/main/java/org/apache/ode/bpel/parser/BpelProcessBuilderFactoryException.java?rev=398694&view=auto
==============================================================================
--- incubator/ode/trunk/bpel-parser/src/main/java/org/apache/ode/bpel/parser/BpelProcessBuilderFactoryException.java (added)
+++ incubator/ode/trunk/bpel-parser/src/main/java/org/apache/ode/bpel/parser/BpelProcessBuilderFactoryException.java Mon May  1 14:37:44 2006
@@ -0,0 +1,20 @@
+/*
+ * File:      $RCSfile$
+ * Copyright: (C) 1999-2005 FiveSight Technologies Inc.
+ *
+ */
+package org.apache.ode.bpel.parser;
+
+/**
+ * Exception thrown by {@link BpelProcessBuilderFactory} to indicate configuration
+ * error.
+ */
+public class BpelProcessBuilderFactoryException extends Exception {
+
+  private static final long serialVersionUID = 1L;
+
+	/** Constructor. */
+  public BpelProcessBuilderFactoryException(String msg, Throwable cause) {
+    super(msg, cause);
+  }
+}

Added: incubator/ode/trunk/bpel-parser/src/main/java/org/apache/ode/bpel/parser/BpelProcessBuilderFactoryImpl.java
URL: http://svn.apache.org/viewcvs/incubator/ode/trunk/bpel-parser/src/main/java/org/apache/ode/bpel/parser/BpelProcessBuilderFactoryImpl.java?rev=398694&view=auto
==============================================================================
--- incubator/ode/trunk/bpel-parser/src/main/java/org/apache/ode/bpel/parser/BpelProcessBuilderFactoryImpl.java (added)
+++ incubator/ode/trunk/bpel-parser/src/main/java/org/apache/ode/bpel/parser/BpelProcessBuilderFactoryImpl.java Mon May  1 14:37:44 2006
@@ -0,0 +1,22 @@
+/*
+ * File:      $RCSfile$
+ * Copyright: (C) 1999-2005 FiveSight Technologies Inc.
+ *
+ */
+package org.apache.ode.bpel.parser;
+
+public class BpelProcessBuilderFactoryImpl extends BpelProcessBuilderFactory {
+  private boolean _strict;
+
+  public BpelProcessBuilder newBpelProcessBuilder() {
+    return new BpelProcessBuilderImpl();
+  }
+
+  public void setStrict(boolean strict) {
+    _strict = strict;
+  }
+
+  public boolean getStrict() {
+    return _strict;
+  }
+}

Added: incubator/ode/trunk/bpel-parser/src/main/java/org/apache/ode/bpel/parser/BpelProcessBuilderImpl.java
URL: http://svn.apache.org/viewcvs/incubator/ode/trunk/bpel-parser/src/main/java/org/apache/ode/bpel/parser/BpelProcessBuilderImpl.java?rev=398694&view=auto
==============================================================================
--- incubator/ode/trunk/bpel-parser/src/main/java/org/apache/ode/bpel/parser/BpelProcessBuilderImpl.java (added)
+++ incubator/ode/trunk/bpel-parser/src/main/java/org/apache/ode/bpel/parser/BpelProcessBuilderImpl.java Mon May  1 14:37:44 2006
@@ -0,0 +1,54 @@
+/*
+ * File:      $RCSfile$
+ * Copyright: (C) 1999-2005 FiveSight Technologies Inc.
+ *
+ */
+package org.apache.ode.bpel.parser;
+
+import org.apache.ode.sax.fsa.ParseError;
+
+import java.io.IOException;
+
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+
+class BpelProcessBuilderImpl implements BpelProcessBuilder {
+  private BpelParser _lastParser;
+  private BpelParseErrorCollector _bpec;
+  
+  BpelProcessBuilderImpl() {
+    _lastParser = new BpelParser();
+    _bpec = new BpelParseErrorCollector("<<unknown>>");
+  }
+
+  public org.apache.ode.bom.api.Process parse(InputSource bpelSource, String id)
+    throws BpelParseException
+  {
+    _bpec = new BpelParseErrorCollector(id);
+    _lastParser.setBpelParseErrorHandler(_bpec);
+    try {
+      return _lastParser.parse(bpelSource);
+    } catch (SAXException se) {
+      // Force these to go into the parse-error array.
+      try {
+        _bpec.parseError(ParseError.FATAL,"SAX", se.getMessage());
+      } catch (Exception ex) {
+        // ignore.
+      }
+      throw new BpelParseException(se.getMessage(),se);
+    } catch (IOException ioe) {
+      // Force these to go into the parse-error array.
+      try {
+        _bpec.parseError(ParseError.FATAL,"IO", ioe.getMessage());
+      } catch (Exception ex) {
+        // ignore.
+      }
+      throw new BpelParseException(ioe.getMessage(),ioe);
+    }
+  }
+
+  public ParseError[] getParseErrors() {
+    return _bpec.getErrors().toArray(new ParseError[] {});
+  }
+
+}

Added: incubator/ode/trunk/bpel-parser/src/main/java/org/apache/ode/bpel/parser/BpelProcessState.java
URL: http://svn.apache.org/viewcvs/incubator/ode/trunk/bpel-parser/src/main/java/org/apache/ode/bpel/parser/BpelProcessState.java?rev=398694&view=auto
==============================================================================
--- incubator/ode/trunk/bpel-parser/src/main/java/org/apache/ode/bpel/parser/BpelProcessState.java (added)
+++ incubator/ode/trunk/bpel-parser/src/main/java/org/apache/ode/bpel/parser/BpelProcessState.java Mon May  1 14:37:44 2006
@@ -0,0 +1,12 @@
+/*
+ * File:      $RCSfile$
+ * Copyright: (C) 1999-2005 FiveSight Technologies Inc.
+ *
+ */
+package org.apache.ode.bpel.parser;
+
+import org.apache.ode.bom.api.Process;
+
+public interface BpelProcessState {
+  Process getProcess();
+}

Added: incubator/ode/trunk/bpel-parser/src/main/java/org/apache/ode/bpel/parser/ParseErrorImpl.java
URL: http://svn.apache.org/viewcvs/incubator/ode/trunk/bpel-parser/src/main/java/org/apache/ode/bpel/parser/ParseErrorImpl.java?rev=398694&view=auto
==============================================================================
--- incubator/ode/trunk/bpel-parser/src/main/java/org/apache/ode/bpel/parser/ParseErrorImpl.java (added)
+++ incubator/ode/trunk/bpel-parser/src/main/java/org/apache/ode/bpel/parser/ParseErrorImpl.java Mon May  1 14:37:44 2006
@@ -0,0 +1,70 @@
+/*
+ * File:      $RCSfile$
+ * Copyright: (C) 1999-2005 FiveSight Technologies Inc.
+ *
+ */
+package org.apache.ode.bpel.parser;
+
+import org.apache.ode.sax.fsa.ParseError;
+
+/**
+ * Implementation of the {@link ParseError} interface.
+ */
+class ParseErrorImpl implements ParseError {
+  private String _locationURI;
+  private int _lineNo;
+  private int _column;
+  private String _message;
+  private String _key;
+  private short _severity;
+
+  ParseErrorImpl(short severity, String locationURI, int lineno, int column, String key, String msg) {
+    _severity = severity;
+    _locationURI = locationURI;
+    _lineNo = lineno;
+    _column = column;
+    _key = key;
+    _message = msg;
+  }
+
+    
+  public String getLocationURI() {
+    return _locationURI;
+  }
+
+  public int getLine() {
+    return _lineNo;
+  }
+
+  public int getColumn() {
+    return _column;
+  }
+
+  public short getSeverity() {
+    return _severity;
+  }
+
+  public String getMessage() {
+    return _message;
+  }
+
+  public String getKey() {
+    return _key;
+  }
+
+  /**
+   * Emacs-like error output.
+   *
+   * @return
+   */
+  public String toString() {
+    StringBuffer buf = new StringBuffer(_locationURI);
+    buf.append(':');
+    buf.append(_lineNo);
+    buf.append(':');
+    buf.append(_column);
+    buf.append(": ");
+    buf.append(_message);
+    return buf.toString();
+  }
+}
\ No newline at end of file

Added: incubator/ode/trunk/bpel-parser/src/main/java/org/apache/ode/bpel/parser/RootFSA.java
URL: http://svn.apache.org/viewcvs/incubator/ode/trunk/bpel-parser/src/main/java/org/apache/ode/bpel/parser/RootFSA.java?rev=398694&view=auto
==============================================================================
--- incubator/ode/trunk/bpel-parser/src/main/java/org/apache/ode/bpel/parser/RootFSA.java (added)
+++ incubator/ode/trunk/bpel-parser/src/main/java/org/apache/ode/bpel/parser/RootFSA.java Mon May  1 14:37:44 2006
@@ -0,0 +1,118 @@
+/*
+ * File:      $RCSfile$
+ * Copyright: (C) 1999-2005 FiveSight Technologies Inc.
+ *
+ */
+package org.apache.ode.bpel.parser;
+
+import org.apache.ode.bom.api.Process;
+import org.apache.ode.sax.fsa.*;
+import org.apache.ode.sax.fsa.bpel_1_1.BpelGraph_1_1;
+import org.apache.ode.sax.fsa.bpel_2_0.BpelGraph_2_0;
+import org.apache.ode.sax.evt.Characters;
+import org.apache.ode.sax.evt.SaxEvent;
+
+class RootFSA extends FSA {
+	
+  private static final String START = "START_STATE";
+  private static final String PROCESS_11 = "11PROCESS";
+  private static final String PROCESS_20 = "20PROCESS";
+  
+  private BpelStartState _initialState;
+  private GraphProvider _11Graph = new BpelGraph_1_1();
+  private GraphProvider _20Graph = new BpelGraph_2_0();
+  
+	RootFSA() {
+    super(new RootGraphProvider());
+    reset();
+	}
+
+  void reset(){
+    setGraphProvider(new RootGraphProvider());
+    setStart(START,_initialState = new BpelStartState(getParseContext()));
+  }
+  
+  Process getProcess(){
+    return _initialState.getProcess();
+  }
+  
+  protected void onStateChange(String fromState, String toState)
+      throws ParseException {
+    if (fromState.equals(START)) {
+      if (toState.equals(PROCESS_11)) {
+        setGraphProvider(_11Graph);
+      } else if (toState.equals(PROCESS_20)) {
+        setGraphProvider(_20Graph);
+      } else {
+        // TODO: Internationalize.
+        getParseContext().parseError(ParseError.FATAL, "PARSER_FATAL",
+            "This parser can only consume either 1.1 or 2.0 BPEL processes.");
+      }
+    }
+  }
+  
+  private static final class RootGraphProvider extends AbstractGraphProvider {
+    RootGraphProvider(){
+      addStateFactory(PROCESS_11, BpelGraph_1_1.getRootStateFactory());
+      addStateFactory(PROCESS_20, BpelGraph_2_0.getRootStateFactory());
+      addQNameEdge(START, PROCESS_11, BpelGraph_1_1.get11QName("process"));
+      addQNameEdge(START, PROCESS_20, BpelGraph_2_0.get20QName("process")); 
+    }
+  }
+  
+  private static final class BpelStartState extends AbstractState {
+
+    private Process _process;
+    
+    public BpelStartState(ParseContext pc) {
+      super(pc);
+    }
+    
+    /**
+     * @see org.apache.ode.sax.fsa.State#handleSaxEvent(org.apache.ode.sax.evt.SaxEvent)
+     */
+    public void handleSaxEvent(SaxEvent se) throws ParseException {
+      if (se.getType() == SaxEvent.CHARACTERS
+          &&
+          ((Characters)se).getContent().trim().length() == 0)
+      {
+        return;
+      }
+      String msg = "Expected a process element in the namespace " + 
+      BpelProcessBuilder.BPEL4WS_NS + " or " + BpelProcessBuilder.WSBPEL2_0_NS + " instead of ";
+      if (se.getType() == SaxEvent.CHARACTERS) {
+        msg += " non-whitespace characters.";
+      } else {
+        msg += se.toString();
+      }
+      getParseContext().parseError(ParseError.ERROR, se, "PARSER_ERROR", msg);
+    }
+
+    public Process getProcess() {
+      return _process;
+    }
+    
+    /**
+     * @see org.apache.ode.sax.fsa.State#handleChildCompleted(org.apache.ode.sax.fsa.State)
+     */
+    public void handleChildCompleted(State pn) throws ParseException {
+      if(pn instanceof BpelProcessState) {
+        _process = ((BpelProcessState)pn).getProcess();
+      } else {
+        throw new IllegalStateException("The parser should not normally complete when processing a non-process.");
+      }
+    }
+
+    public int getType() {
+      return -1;
+    }
+    
+    /**
+     * @see org.apache.ode.sax.fsa.State#getFactory()
+     */
+    public StateFactory getFactory() {
+      throw new UnsupportedOperationException("getFactory() should never be called on "
+          + BpelStartState.class.getName());
+    }
+  }
+}

Added: incubator/ode/trunk/bpel-parser/src/main/java/org/apache/ode/sax/evt/Characters.java
URL: http://svn.apache.org/viewcvs/incubator/ode/trunk/bpel-parser/src/main/java/org/apache/ode/sax/evt/Characters.java?rev=398694&view=auto
==============================================================================
--- incubator/ode/trunk/bpel-parser/src/main/java/org/apache/ode/sax/evt/Characters.java (added)
+++ incubator/ode/trunk/bpel-parser/src/main/java/org/apache/ode/sax/evt/Characters.java Mon May  1 14:37:44 2006
@@ -0,0 +1,32 @@
+/*
+ * File:      $RCSfile$
+ * Copyright: (C) 1999-2005 FiveSight Technologies Inc.
+ *
+ */
+package org.apache.ode.sax.evt;
+
+import org.apache.ode.utils.NSContext;
+
+import org.xml.sax.Locator;
+
+public class Characters extends SaxEvent {
+  
+  private String _content;
+  
+  public Characters(String content, Locator loc, NSContext nsc) {
+    super(loc,nsc);
+    _content = content;
+  }
+  
+  public String getContent() {
+    return _content;
+  }
+  
+  public short getType() {
+    return CHARACTERS;
+  }
+  
+  public String toString() {
+    return _content;
+  }
+}

Added: incubator/ode/trunk/bpel-parser/src/main/java/org/apache/ode/sax/evt/EndElement.java
URL: http://svn.apache.org/viewcvs/incubator/ode/trunk/bpel-parser/src/main/java/org/apache/ode/sax/evt/EndElement.java?rev=398694&view=auto
==============================================================================
--- incubator/ode/trunk/bpel-parser/src/main/java/org/apache/ode/sax/evt/EndElement.java (added)
+++ incubator/ode/trunk/bpel-parser/src/main/java/org/apache/ode/sax/evt/EndElement.java Mon May  1 14:37:44 2006
@@ -0,0 +1,34 @@
+/*
+ * File:      $RCSfile$
+ * Copyright: (C) 1999-2005 FiveSight Technologies Inc.
+ *
+ */
+package org.apache.ode.sax.evt;
+
+import org.apache.ode.utils.NSContext;
+
+import javax.xml.namespace.QName;
+
+import org.xml.sax.Locator;
+
+public class EndElement extends SaxEvent {
+  
+  private QName _name;
+  
+  public EndElement(QName name, Locator loc, NSContext nsc) {
+    super(loc,nsc);
+    _name = name;
+  }
+  
+  public QName getName() {
+    return _name;
+  }
+  
+  public short getType() {
+    return END_ELEMENT;
+  }
+  
+  public String toString() {
+    return "</" + _name.toString() + ">";
+  }
+}

Added: incubator/ode/trunk/bpel-parser/src/main/java/org/apache/ode/sax/evt/SaxEvent.java
URL: http://svn.apache.org/viewcvs/incubator/ode/trunk/bpel-parser/src/main/java/org/apache/ode/sax/evt/SaxEvent.java?rev=398694&view=auto
==============================================================================
--- incubator/ode/trunk/bpel-parser/src/main/java/org/apache/ode/sax/evt/SaxEvent.java (added)
+++ incubator/ode/trunk/bpel-parser/src/main/java/org/apache/ode/sax/evt/SaxEvent.java Mon May  1 14:37:44 2006
@@ -0,0 +1,35 @@
+/*
+ * File:      $RCSfile$
+ * Copyright: (C) 1999-2005 FiveSight Technologies Inc.
+ *
+ */
+package org.apache.ode.sax.evt;
+
+import org.apache.ode.utils.NSContext;
+
+import org.xml.sax.Locator;
+
+public abstract class SaxEvent {
+  
+  public static final short START_ELEMENT = 0;
+  public static final short END_ELEMENT = 1;
+  public static final short CHARACTERS = 2;
+  
+  private Locator _loc;
+  private NSContext _nsc;
+  
+  public SaxEvent(Locator loc, NSContext nsc) {
+    _loc = loc;
+    _nsc = nsc;
+  }
+  
+  public Locator getLocation() {
+    return _loc;
+  }
+  
+  public NSContext getNamespaceContext() {
+    return _nsc;
+  }
+  
+  public abstract short getType();
+}

Added: incubator/ode/trunk/bpel-parser/src/main/java/org/apache/ode/sax/evt/StartElement.java
URL: http://svn.apache.org/viewcvs/incubator/ode/trunk/bpel-parser/src/main/java/org/apache/ode/sax/evt/StartElement.java?rev=398694&view=auto
==============================================================================
--- incubator/ode/trunk/bpel-parser/src/main/java/org/apache/ode/sax/evt/StartElement.java (added)
+++ incubator/ode/trunk/bpel-parser/src/main/java/org/apache/ode/sax/evt/StartElement.java Mon May  1 14:37:44 2006
@@ -0,0 +1,40 @@
+/*
+ * File:      $RCSfile$
+ * Copyright: (C) 1999-2005 FiveSight Technologies Inc.
+ *
+ */
+package org.apache.ode.sax.evt;
+
+import org.apache.ode.utils.NSContext;
+
+import javax.xml.namespace.QName;
+
+import org.xml.sax.Locator;
+
+public class StartElement extends SaxEvent {
+  
+  private QName _name;
+  private XmlAttributes _atts;
+  
+  public StartElement(QName name, XmlAttributes atts, Locator loc, NSContext nsc) {
+    super(loc,nsc);
+    _name = name;
+    _atts = atts;
+  }
+  
+  public QName getName() {
+    return _name;
+  }
+  
+  public XmlAttributes getAttributes() {
+    return _atts;
+  }
+  
+  public short getType() {
+    return START_ELEMENT;
+  }
+  
+  public String toString() {
+    return "<" + _name.toString() + ">";
+  }
+}

Added: incubator/ode/trunk/bpel-parser/src/main/java/org/apache/ode/sax/evt/XmlAttributes.java
URL: http://svn.apache.org/viewcvs/incubator/ode/trunk/bpel-parser/src/main/java/org/apache/ode/sax/evt/XmlAttributes.java?rev=398694&view=auto
==============================================================================
--- incubator/ode/trunk/bpel-parser/src/main/java/org/apache/ode/sax/evt/XmlAttributes.java (added)
+++ incubator/ode/trunk/bpel-parser/src/main/java/org/apache/ode/sax/evt/XmlAttributes.java Mon May  1 14:37:44 2006
@@ -0,0 +1,65 @@
+/*
+ * File:      $RCSfile$
+ * Copyright: (C) 1999-2005 FiveSight Technologies Inc.
+ *
+ */
+package org.apache.ode.sax.evt;
+
+import java.util.HashMap;
+import java.util.Iterator;
+
+import javax.xml.namespace.QName;
+
+import org.xml.sax.Attributes;
+
+public class XmlAttributes {
+  
+  private HashMap<QName,String> _hm;
+  
+  public XmlAttributes(Attributes atts) {
+    _hm = new HashMap<QName,String>();
+    for (int i=0; i < atts.getLength(); ++i) {
+      _hm.put(new QName(atts.getURI(i),atts.getLocalName(i)),atts.getValue(i));
+    }
+  }
+  
+  public String getValue(QName qn) {
+    return _hm.get(qn);
+  }
+  
+  public boolean hasAtt(QName qn) {
+    return _hm.get(qn) != null;
+  }
+  
+  public boolean hasAtt(String s) {
+    return _hm.get(new QName(s)) != null;
+  }
+  
+  public String getValue(String s) {
+    return getValue(new QName(s));
+  }
+  
+  public int getCount() {
+    return _hm.size();
+  }
+  
+  public Iterator<QName> getQNames() {
+    return _hm.keySet().iterator();
+  }
+  
+  public String toString() {
+    if (_hm.size() == 0) {
+      return "<<none>>";
+    }
+    StringBuffer sb = new StringBuffer();
+    boolean flag = true;
+    for (Iterator<QName> it = getQNames(); it.hasNext(); ) {
+      if (!flag) {
+        sb.append(' ');
+      }
+      sb.append( it.next());
+      flag = false;
+    }
+    return sb.toString();
+  }
+}

Added: incubator/ode/trunk/bpel-parser/src/main/java/org/apache/ode/sax/evt/attspec/AlwaysMatchSpec.java
URL: http://svn.apache.org/viewcvs/incubator/ode/trunk/bpel-parser/src/main/java/org/apache/ode/sax/evt/attspec/AlwaysMatchSpec.java?rev=398694&view=auto
==============================================================================
--- incubator/ode/trunk/bpel-parser/src/main/java/org/apache/ode/sax/evt/attspec/AlwaysMatchSpec.java (added)
+++ incubator/ode/trunk/bpel-parser/src/main/java/org/apache/ode/sax/evt/attspec/AlwaysMatchSpec.java Mon May  1 14:37:44 2006
@@ -0,0 +1,17 @@
+/*
+ * File:      $RCSfile$
+ * Copyright: (C) 1999-2005 FiveSight Technologies Inc.
+ *
+ */
+package org.apache.ode.sax.evt.attspec;
+
+import org.apache.ode.sax.evt.XmlAttributes;
+
+public class AlwaysMatchSpec implements XmlAttributeSpec {
+
+  public static final AlwaysMatchSpec SINGLETON = new AlwaysMatchSpec();
+  
+  public boolean matches(XmlAttributes atts) {
+    return true;
+  }
+}

Added: incubator/ode/trunk/bpel-parser/src/main/java/org/apache/ode/sax/evt/attspec/AndSpec.java
URL: http://svn.apache.org/viewcvs/incubator/ode/trunk/bpel-parser/src/main/java/org/apache/ode/sax/evt/attspec/AndSpec.java?rev=398694&view=auto
==============================================================================
--- incubator/ode/trunk/bpel-parser/src/main/java/org/apache/ode/sax/evt/attspec/AndSpec.java (added)
+++ incubator/ode/trunk/bpel-parser/src/main/java/org/apache/ode/sax/evt/attspec/AndSpec.java Mon May  1 14:37:44 2006
@@ -0,0 +1,23 @@
+/*
+ * File:      $RCSfile$
+ * Copyright: (C) 1999-2005 FiveSight Technologies Inc.
+ *
+ */
+package org.apache.ode.sax.evt.attspec;
+
+import org.apache.ode.sax.evt.XmlAttributes;
+
+public class AndSpec implements XmlAttributeSpec {
+  
+  XmlAttributeSpec _lhs;
+  XmlAttributeSpec _rhs;
+  
+  public AndSpec(XmlAttributeSpec lhs, XmlAttributeSpec rhs) {
+    _lhs = lhs;
+    _rhs = rhs;
+  }
+  
+  public boolean matches(XmlAttributes xatts) {
+    return _lhs.matches(xatts) && _rhs.matches(xatts);
+  }
+}

Added: incubator/ode/trunk/bpel-parser/src/main/java/org/apache/ode/sax/evt/attspec/FilterSpec.java
URL: http://svn.apache.org/viewcvs/incubator/ode/trunk/bpel-parser/src/main/java/org/apache/ode/sax/evt/attspec/FilterSpec.java?rev=398694&view=auto
==============================================================================
--- incubator/ode/trunk/bpel-parser/src/main/java/org/apache/ode/sax/evt/attspec/FilterSpec.java (added)
+++ incubator/ode/trunk/bpel-parser/src/main/java/org/apache/ode/sax/evt/attspec/FilterSpec.java Mon May  1 14:37:44 2006
@@ -0,0 +1,63 @@
+/*
+ * File:      $RCSfile$
+ * Copyright: (C) 1999-2005 FiveSight Technologies Inc.
+ *
+ */
+package org.apache.ode.sax.evt.attspec;
+
+import org.apache.ode.sax.evt.XmlAttributes;
+
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Set;
+
+import javax.xml.namespace.QName;
+
+public class FilterSpec implements XmlAttributeSpec {
+
+  private Set<QName> _required;
+  private Set<QName> _optional;
+  
+  public FilterSpec(String[] required, String[] optional) {
+    _required = new HashSet<QName>();
+    for (int i=0; i < required.length; ++i) {
+      _required.add(new QName(required[i]));
+    }
+    _optional = new HashSet<QName>();
+    for (int i=0; i < optional.length; ++i) {
+      _optional.add(new QName(optional[i]));
+    }
+  }
+  
+  public FilterSpec(QName[] required, QName[] optional) {
+    _required = new HashSet<QName>();
+    for (int i=0; i < required.length; ++i) {
+      _required.add(required[i]);
+    }
+    _optional = new HashSet<QName>();
+    for (int i=0; i < optional.length; ++i) {
+      _optional.add(optional[i]);
+    }
+  }
+  
+  /**
+   * @see org.apache.ode.sax.evt.attspec.XmlAttributeSpec#matches(org.apache.ode.sax.evt.XmlAttributes)
+   */
+  public boolean matches(XmlAttributes atts) {
+    // check for all required.
+    for (Iterator<QName> it = _required.iterator(); it.hasNext();) {
+      if (atts.getValue(it.next()) == null) {
+        // TODO: return a message.
+        return false;
+      }
+    }
+    for (Iterator<QName> it = atts.getQNames(); it.hasNext();) {
+      QName qn = it.next();
+      if (!_required.contains(qn) && !_optional.contains(qn) && qn.getNamespaceURI().equals("")) {
+        // TODO: return a message.
+        return false;
+      }
+    }
+    return true;
+  }
+}

Added: incubator/ode/trunk/bpel-parser/src/main/java/org/apache/ode/sax/evt/attspec/HasAttSpec.java
URL: http://svn.apache.org/viewcvs/incubator/ode/trunk/bpel-parser/src/main/java/org/apache/ode/sax/evt/attspec/HasAttSpec.java?rev=398694&view=auto
==============================================================================
--- incubator/ode/trunk/bpel-parser/src/main/java/org/apache/ode/sax/evt/attspec/HasAttSpec.java (added)
+++ incubator/ode/trunk/bpel-parser/src/main/java/org/apache/ode/sax/evt/attspec/HasAttSpec.java Mon May  1 14:37:44 2006
@@ -0,0 +1,23 @@
+/*
+ * File:      $RCSfile$
+ * Copyright: (C) 1999-2005 FiveSight Technologies Inc.
+ *
+ */
+package org.apache.ode.sax.evt.attspec;
+
+import org.apache.ode.sax.evt.XmlAttributes;
+
+import javax.xml.namespace.QName;
+
+public class HasAttSpec implements XmlAttributeSpec {
+  
+  private QName _name;
+  
+  public HasAttSpec(QName name) {
+    _name = name;
+  }
+  
+  public boolean matches(XmlAttributes xatts) {
+    return xatts.getValue(_name) != null;
+  }
+}

Added: incubator/ode/trunk/bpel-parser/src/main/java/org/apache/ode/sax/evt/attspec/HasAttsSpec.java
URL: http://svn.apache.org/viewcvs/incubator/ode/trunk/bpel-parser/src/main/java/org/apache/ode/sax/evt/attspec/HasAttsSpec.java?rev=398694&view=auto
==============================================================================
--- incubator/ode/trunk/bpel-parser/src/main/java/org/apache/ode/sax/evt/attspec/HasAttsSpec.java (added)
+++ incubator/ode/trunk/bpel-parser/src/main/java/org/apache/ode/sax/evt/attspec/HasAttsSpec.java Mon May  1 14:37:44 2006
@@ -0,0 +1,27 @@
+/*
+ * File:      $RCSfile$
+ * Copyright: (C) 1999-2005 FiveSight Technologies Inc.
+ *
+ */
+package org.apache.ode.sax.evt.attspec;
+
+import org.apache.ode.sax.evt.XmlAttributes;
+
+import javax.xml.namespace.QName;
+
+public class HasAttsSpec implements XmlAttributeSpec {
+  
+  private QName[] _names;
+  
+  public HasAttsSpec(QName[] names) {
+    _names = names;
+  }
+  
+  public boolean matches(XmlAttributes xatts) {
+    boolean match = true;
+    for (int i=0; i < _names.length && match; ++i) {
+      match &= xatts.getValue(_names[i]) != null;
+    }
+    return match;
+  }
+}

Added: incubator/ode/trunk/bpel-parser/src/main/java/org/apache/ode/sax/evt/attspec/OrSpec.java
URL: http://svn.apache.org/viewcvs/incubator/ode/trunk/bpel-parser/src/main/java/org/apache/ode/sax/evt/attspec/OrSpec.java?rev=398694&view=auto
==============================================================================
--- incubator/ode/trunk/bpel-parser/src/main/java/org/apache/ode/sax/evt/attspec/OrSpec.java (added)
+++ incubator/ode/trunk/bpel-parser/src/main/java/org/apache/ode/sax/evt/attspec/OrSpec.java Mon May  1 14:37:44 2006
@@ -0,0 +1,23 @@
+/*
+ * File:      $RCSfile$
+ * Copyright: (C) 1999-2005 FiveSight Technologies Inc.
+ *
+ */
+package org.apache.ode.sax.evt.attspec;
+
+import org.apache.ode.sax.evt.XmlAttributes;
+
+public class OrSpec implements XmlAttributeSpec {
+  
+  XmlAttributeSpec _lhs;
+  XmlAttributeSpec _rhs;
+  
+  public OrSpec(XmlAttributeSpec lhs, XmlAttributeSpec rhs) {
+    _lhs = lhs;
+    _rhs = rhs;
+  }
+  
+  public boolean matches(XmlAttributes xatts) {
+    return _lhs.matches(xatts) || _rhs.matches(xatts);
+  }
+}

Added: incubator/ode/trunk/bpel-parser/src/main/java/org/apache/ode/sax/evt/attspec/XmlAttributeSpec.java
URL: http://svn.apache.org/viewcvs/incubator/ode/trunk/bpel-parser/src/main/java/org/apache/ode/sax/evt/attspec/XmlAttributeSpec.java?rev=398694&view=auto
==============================================================================
--- incubator/ode/trunk/bpel-parser/src/main/java/org/apache/ode/sax/evt/attspec/XmlAttributeSpec.java (added)
+++ incubator/ode/trunk/bpel-parser/src/main/java/org/apache/ode/sax/evt/attspec/XmlAttributeSpec.java Mon May  1 14:37:44 2006
@@ -0,0 +1,15 @@
+/*
+ * File:      $RCSfile$
+ * Copyright: (C) 1999-2005 FiveSight Technologies Inc.
+ *
+ */
+package org.apache.ode.sax.evt.attspec;
+
+import org.apache.ode.sax.evt.XmlAttributes;
+
+public interface XmlAttributeSpec {
+  
+  public boolean matches(XmlAttributes atts);
+
+}
+

Added: incubator/ode/trunk/bpel-parser/src/main/java/org/apache/ode/sax/fsa/AbstractGraphProvider.java
URL: http://svn.apache.org/viewcvs/incubator/ode/trunk/bpel-parser/src/main/java/org/apache/ode/sax/fsa/AbstractGraphProvider.java?rev=398694&view=auto
==============================================================================
--- incubator/ode/trunk/bpel-parser/src/main/java/org/apache/ode/sax/fsa/AbstractGraphProvider.java (added)
+++ incubator/ode/trunk/bpel-parser/src/main/java/org/apache/ode/sax/fsa/AbstractGraphProvider.java Mon May  1 14:37:44 2006
@@ -0,0 +1,129 @@
+/*
+ * File:      $RCSfile$
+ * Copyright: (C) 1999-2005 FiveSight Technologies Inc.
+ *
+ */
+package org.apache.ode.sax.fsa;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.xml.namespace.QName;
+
+public abstract class AbstractGraphProvider implements GraphProvider{
+  
+  private Map<String,StateFactory> _nodes = new HashMap<String,StateFactory>();
+  private Map<QNameStringPair,String> _qNameEdges = new HashMap<QNameStringPair,String>();
+  private Map<String,UriStringPair> _otherUriEdges = new HashMap<String,UriStringPair>();
+
+  public StateFactory getStateFactory(String name) {
+    return _nodes.get(name);
+  }
+  
+  /**
+   * Add a state factory to the graph with the specified name.  This plays the role
+   * of a labeled vertex.
+   * @param name the name (label) for the vertex
+   * @param sf the {@link StateFactory} that can produce handlers for the named state.
+   */
+  public void addStateFactory(String name, StateFactory sf) {
+    _nodes.put(name,sf);
+  }
+  
+  /**
+   * Add an edge to the graph that connects one state to another based on an element
+   * with the supplied <code>QName</code>.  Note that no effort is made to ensure
+   * that the source and target vertices are present in the graph at the time that
+   * the edge is added.
+   * @param src the source vertex for the edge, by name
+   * @param target the target vertex for the edge, by name
+   * @param child the {@link QName} of the element that would trigger this transition.
+   */
+  public void addQNameEdge(String src, String target, QName child) {
+    _qNameEdges.put(new QNameStringPair(src,child),target);
+  }
+  
+  /**
+   * <p>
+   * Add an edge to the graph that connects one state to another based on a
+   * &quot;<code>##other</code>&quot;-style match, i.e., any element outside of the
+   * named namespace.
+   * </p>
+   * <p>
+   * <em>N.B.</em>  Only one of these is stored per vertex, and the uri is only used
+   * as a sanity check when determining non-matches.
+   * </p>
+   * @param src the source vertex for the edge, by name
+   * @param target the target vertex for the edge, by name
+   * @param uri the namespace URI not to match
+   */
+  public void addOtherEdge(String src, String target, String uri)  {
+    _otherUriEdges.put(src, new UriStringPair(target,uri));
+  }
+  
+  public String getOtherEdge(String src, String uri){
+    UriStringPair notUri =  _otherUriEdges.get(src);
+    if (notUri == null) {
+      return null;
+    } else if (! notUri.uri.equals(uri)) {
+      return notUri.str;
+    } else {
+      return null;
+    }
+  }
+  
+  public String getQNameEdge(String src, QName child){
+    return _qNameEdges.get(new QNameStringPair(src, child));
+  }
+  
+  private class QNameStringPair {
+    String src;
+    QName qname;
+    
+    QNameStringPair(String s, QName q) {
+      src = s;
+      qname = q;
+    }
+    
+    public boolean equals(Object o) {
+      if (o == null) {
+        return false;
+      } else if (o instanceof QNameStringPair) {
+        QNameStringPair qsp = (QNameStringPair) o;        
+        return qsp.src.equals(src) && qsp.qname.equals(qname);
+      } else {
+        return false;
+      }
+    }
+    
+    public int hashCode() {
+      return src.hashCode() | qname.hashCode(); 
+    }
+  }
+  
+  private class UriStringPair {
+    String str;
+    String uri;
+    
+    UriStringPair(String s, String u) {
+      str = s;
+      uri = u;
+    }
+    
+    public boolean equals(Object o) {
+      if (o == null) {
+        return false;
+      } else if (o instanceof UriStringPair) {
+        UriStringPair usp = (UriStringPair) o;        
+        return usp.str.equals(str) && usp.uri.equals(uri);
+      } else {
+        return false;
+      }
+    }
+    
+    public int hashCode() {
+      return str.hashCode() | uri.hashCode();
+    }
+  }
+
+}

Added: incubator/ode/trunk/bpel-parser/src/main/java/org/apache/ode/sax/fsa/AbstractState.java
URL: http://svn.apache.org/viewcvs/incubator/ode/trunk/bpel-parser/src/main/java/org/apache/ode/sax/fsa/AbstractState.java?rev=398694&view=auto
==============================================================================
--- incubator/ode/trunk/bpel-parser/src/main/java/org/apache/ode/sax/fsa/AbstractState.java (added)
+++ incubator/ode/trunk/bpel-parser/src/main/java/org/apache/ode/sax/fsa/AbstractState.java Mon May  1 14:37:44 2006
@@ -0,0 +1,52 @@
+/*
+ * File:      $RCSfile$
+ * Copyright: (C) 1999-2005 FiveSight Technologies Inc.
+ *
+ */
+package org.apache.ode.sax.fsa;
+
+import org.apache.ode.sax.evt.Characters;
+import org.apache.ode.sax.evt.SaxEvent;
+
+public abstract class AbstractState implements State{
+
+  public static final int EXTENSIBILITY_ELEMENT = 0;
+  
+  private ParseContext _pc;
+
+  protected AbstractState(ParseContext pc) {
+    super();
+      _pc = pc;
+  }
+  
+  public final ParseContext getParseContext() {
+    return _pc;
+  }
+  
+   public void handleChildCompleted(State pn) throws ParseException {
+    switch (pn.getType()) {
+      case EXTENSIBILITY_ELEMENT:
+        // ignore.  This will get logged up front.
+        break;
+    default:
+      throw new IllegalStateException(
+          "Implementation error; unknown state " + pn.getClass().getName() +
+          " encountered.");
+    }
+  }
+  
+  
+  public void handleSaxEvent(SaxEvent se) throws ParseException {
+    if (se.getType() == SaxEvent.CHARACTERS) {
+      Characters c = (Characters) se;
+      if (c.getContent().trim().length() != 0) {
+        // TODO: Non-whitespace content -- throw exception.
+      }
+    } else {
+      getParseContext().parseError(ParseError.ERROR,se,"","Unexpected SAX event " + 
+          se.toString()); // TODO: Error key.
+    }
+  }
+  
+  public void done(){}
+}

Added: incubator/ode/trunk/bpel-parser/src/main/java/org/apache/ode/sax/fsa/DOMGenerator.java
URL: http://svn.apache.org/viewcvs/incubator/ode/trunk/bpel-parser/src/main/java/org/apache/ode/sax/fsa/DOMGenerator.java?rev=398694&view=auto
==============================================================================
--- incubator/ode/trunk/bpel-parser/src/main/java/org/apache/ode/sax/fsa/DOMGenerator.java (added)
+++ incubator/ode/trunk/bpel-parser/src/main/java/org/apache/ode/sax/fsa/DOMGenerator.java Mon May  1 14:37:44 2006
@@ -0,0 +1,75 @@
+/*
+ * File:      $RCSfile$
+ * Copyright: (C) 1999-2005 FiveSight Technologies Inc.
+ *
+ */
+package org.apache.ode.sax.fsa;
+
+import org.apache.ode.sax.evt.Characters;
+import org.apache.ode.sax.evt.SaxEvent;
+import org.apache.ode.sax.evt.StartElement;
+import org.apache.ode.utils.DOMUtils;
+
+import java.util.Iterator;
+import java.util.Stack;
+
+import javax.xml.namespace.QName;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+
+public class DOMGenerator {
+	
+  private Node _root; // this may be character node
+  private Document _doc;
+  private Stack<Element> _nodeStack = new Stack<Element>();
+  
+	public DOMGenerator(Document doc) {
+		_doc = doc;
+	}
+  
+  public DOMGenerator(){
+  	_doc = DOMUtils.newDocument();
+  }
+  
+  public Node getRoot(){
+  	return _root;
+  }
+  
+  public void handleSaxEvent(SaxEvent se) throws ParseException {
+    switch(se.getType()){
+      case SaxEvent.START_ELEMENT:
+        StartElement ste = (StartElement)se;
+        Element e = _doc.createElementNS(ste.getName().getNamespaceURI(), ste.getName().getLocalPart());
+        for(Iterator<QName> iter = ste.getAttributes().getQNames(); iter.hasNext(); ){
+          QName attr = iter.next();
+          e.setAttributeNS(attr.getNamespaceURI(), attr.getLocalPart(), ste.getAttributes().getValue(attr));
+        }
+        if(_nodeStack.isEmpty()){
+          _doc.appendChild(e);
+          // set root, even if already set as text node
+          _root = e;
+        }else{
+          _nodeStack.peek().appendChild(e);
+        }
+        _nodeStack.add(e);
+        break;
+        
+      case SaxEvent.END_ELEMENT:
+        _nodeStack.pop();
+        break;
+        
+      case SaxEvent.CHARACTERS:
+        Node text = _doc.createTextNode(((Characters)se).getContent());
+        if(!_nodeStack.isEmpty())
+          _nodeStack.peek().appendChild(text);
+              
+        if(_root == null)
+          _root = text;
+        break;
+      default:
+        // do nothing
+    }
+  }
+}

Added: incubator/ode/trunk/bpel-parser/src/main/java/org/apache/ode/sax/fsa/FSA.java
URL: http://svn.apache.org/viewcvs/incubator/ode/trunk/bpel-parser/src/main/java/org/apache/ode/sax/fsa/FSA.java?rev=398694&view=auto
==============================================================================
--- incubator/ode/trunk/bpel-parser/src/main/java/org/apache/ode/sax/fsa/FSA.java (added)
+++ incubator/ode/trunk/bpel-parser/src/main/java/org/apache/ode/sax/fsa/FSA.java Mon May  1 14:37:44 2006
@@ -0,0 +1,161 @@
+/*
+ * File:      $RCSfile$
+ * Copyright: (C) 1999-2005 FiveSight Technologies Inc.
+ *
+ */
+package org.apache.ode.sax.fsa;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.ode.sax.evt.Characters;
+import org.apache.ode.sax.evt.EndElement;
+import org.apache.ode.sax.evt.SaxEvent;
+import org.apache.ode.sax.evt.StartElement;
+
+import java.util.Stack;
+
+public class FSA {
+    
+  /*
+   * The path in the graph, at present.  As we exit elements, we'll move backwards
+   * in the path.
+   */
+  private Stack<ParseState> _state;
+  private String _start;
+  private State _startState;
+  private GraphProvider _graphProvider;
+  private ParseContext _pc;
+  
+  private static final Log __log = LogFactory.getLog(FSA.class);
+  
+  protected FSA(GraphProvider provider) {
+    _state = new Stack<ParseState>();
+    _graphProvider = provider;
+  }
+  
+  protected void onStateChange(String fromState, String toState) throws ParseException {}
+  
+  public void setGraphProvider(GraphProvider graphProvider){
+  	_graphProvider = graphProvider;
+  }
+  
+  public void setStart(String name, State node) {
+    _start = name;
+    _startState = node;
+  }
+  
+  public void setParseContext(ParseContext pc) {
+    _pc = pc;
+  }
+  
+  protected ParseContext getParseContext() {
+    return _pc;
+  }
+  
+  public void begin() {
+    if (__log.isDebugEnabled()) {
+      __log.debug("FSA.begin()");
+    }
+    if (_start == null || _startState == null) {
+      throw new IllegalStateException("A start state must be set.");
+    }
+    _state.push(new ParseState(_start,_startState));
+  }
+  
+  public void end() {
+    if (__log.isDebugEnabled()) {
+      __log.debug("FSA.end()");
+    }
+  }
+  
+  public State getStart() {
+    return _startState;
+  }
+  
+    
+  private ParseState current() {
+    return _state.peek();
+  }
+    
+  public void handleSaxEvent(SaxEvent se) throws ParseException {
+    if (__log.isDebugEnabled()) {
+      String msg;
+      if (se.getType() == SaxEvent.CHARACTERS && ((Characters)se).getContent().trim().length() == 0) {
+        msg = "<<whitespace>>";
+      } else {
+        msg = se.toString();
+      }
+      __log.debug("FSA handling " + msg + " from state " + current().stateName +
+          " at depth " + current().depth);
+    }
+    switch (se.getType()) {
+    case SaxEvent.CHARACTERS:
+      current().state.handleSaxEvent(se);
+      break;
+    case SaxEvent.START_ELEMENT:
+      StartElement ste = (StartElement) se;
+      String target = _graphProvider.getQNameEdge(current().stateName,ste.getName());
+      if (target == null) {
+        target = _graphProvider.getOtherEdge(current().stateName, ste.getName().getNamespaceURI());
+      }
+      if (target != null) {
+        StateFactory factory = _graphProvider.getStateFactory(target);
+        if(factory == null)
+          throw new IllegalStateException("No state factory for target '" + target + "'");
+        String old = current().stateName;
+        _state.push(new ParseState(target,factory.newInstance(ste,_pc)));
+        onStateChange(old, target);
+      } else {
+        ++current().depth;
+        current().state.handleSaxEvent(ste);
+      }
+      break;
+    case SaxEvent.END_ELEMENT:
+      EndElement ee = (EndElement)se;
+      if (current().isDone()) {
+        State pn =  current().state;   
+        pn.done();
+        _state.pop();
+        current().state.handleChildCompleted(pn);
+      } else {
+        --current().depth;
+        current().state.handleSaxEvent(ee);
+      }
+      break;
+    }
+    if (__log.isDebugEnabled()) {
+      __log.debug("new state is " + current().stateName + " at depth " + current().depth);
+    }
+    
+  }
+  
+   
+  private class ParseState {
+  
+    String stateName;
+    State state;
+    int depth;
+ 
+    ParseState(String name, State node) {
+      stateName = name;
+      state = node;
+      depth = 0;
+    }
+
+    void sink() {
+      ++depth;
+    }
+    
+    void rise() {
+      --depth;
+      if (depth < 0) {
+        // bitch about it!
+      }
+    }
+    
+    boolean isDone() {
+      return depth == 0;
+    }
+  }
+
+}