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><propertyAlias></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><propertyAlias></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><propertyAlias></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><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
+ * "<code>##other</code>"-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;
+ }
+ }
+
+}