You are viewing a plain text version of this content. The canonical link for it is here.
Posted to woden-dev@ws.apache.org by sa...@apache.org on 2009/09/01 07:54:21 UTC
svn commit: r809835 [8/11] - in /webservices/woden/trunk/java/woden-api: ./
src/ src/main/ src/main/java/ src/main/java/javax/ src/main/java/javax/xml/
src/main/java/javax/xml/namespace/ src/main/java/org/
src/main/java/org/apache/ src/main/java/org/ap...
Added: webservices/woden/trunk/java/woden-api/src/main/java/org/apache/woden/xml/IntOrTokenAttr.java
URL: http://svn.apache.org/viewvc/webservices/woden/trunk/java/woden-api/src/main/java/org/apache/woden/xml/IntOrTokenAttr.java?rev=809835&view=auto
==============================================================================
--- webservices/woden/trunk/java/woden-api/src/main/java/org/apache/woden/xml/IntOrTokenAttr.java (added)
+++ webservices/woden/trunk/java/woden-api/src/main/java/org/apache/woden/xml/IntOrTokenAttr.java Tue Sep 1 05:54:15 2009
@@ -0,0 +1,51 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.woden.xml;
+
+
+/**
+ * This interface represents XML attribute information items of type
+ * 'Union of xs:int, xs:token', for example
+ * the whttp:code extension attribute of binding <fault>.
+ * <p>
+ * The <code>isInt</code> and <code>isToken</code> methods determine whether
+ * to call the <code>getInt</code> or <code>getToken</code> methods.
+ * If the implementor object is initialized with an int,
+ * <code>isInt</code> will return 'true', <code>isToken</code> will return
+ * 'false', <code>getInt</code> will return the int value and <code>getToken</code>
+ * will return null. If it is initialized with an xs:token, <code>isInt</code>
+ * will return 'false', <code>isToken</code> will return 'true', <code>getInt</code>
+ * will return null and <code>getToken</code> will return the token string.
+ * <p>
+ * If the implementor object is initialized with a null value (i.e. because
+ * of an attribute value conversion error or because the attribute value
+ * was empty in the WSDL), the <code>getContents</code>, <code>getInt</code>
+ * and <code>getToken</code> methods will return null and <code>isInt</code>,
+ * <code>isToken</code> and <code>isValid</code> will return false.
+ *
+ * @author jkaputin@apache.org
+ */
+public interface IntOrTokenAttr extends XMLAttr
+{
+ public boolean isInt();
+
+ public boolean isToken();
+
+ public Integer getInt();
+
+ public String getToken();
+}
Added: webservices/woden/trunk/java/woden-api/src/main/java/org/apache/woden/xml/QNameAttr.java
URL: http://svn.apache.org/viewvc/webservices/woden/trunk/java/woden-api/src/main/java/org/apache/woden/xml/QNameAttr.java?rev=809835&view=auto
==============================================================================
--- webservices/woden/trunk/java/woden-api/src/main/java/org/apache/woden/xml/QNameAttr.java (added)
+++ webservices/woden/trunk/java/woden-api/src/main/java/org/apache/woden/xml/QNameAttr.java Tue Sep 1 05:54:15 2009
@@ -0,0 +1,32 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.woden.xml;
+
+import javax.xml.namespace.QName;
+
+/**
+ * This interface represents XML attribute information items of type xs:QName.
+ * If the attribute's string value cannot be converted into a QName object the
+ * getContent() and getQName() methods will return null and isValid() will return
+ * false.
+ *
+ * @author jkaputin@apache.org
+ */
+public interface QNameAttr extends XMLAttr
+{
+ public QName getQName();
+}
Added: webservices/woden/trunk/java/woden-api/src/main/java/org/apache/woden/xml/QNameListAttr.java
URL: http://svn.apache.org/viewvc/webservices/woden/trunk/java/woden-api/src/main/java/org/apache/woden/xml/QNameListAttr.java?rev=809835&view=auto
==============================================================================
--- webservices/woden/trunk/java/woden-api/src/main/java/org/apache/woden/xml/QNameListAttr.java (added)
+++ webservices/woden/trunk/java/woden-api/src/main/java/org/apache/woden/xml/QNameListAttr.java Tue Sep 1 05:54:15 2009
@@ -0,0 +1,35 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.woden.xml;
+
+import javax.xml.namespace.QName;
+
+/**
+ * This interface represents XML attribute information items of type
+ * xs:list of QNames. The string is converted into a collection of QNames,
+ * one for each valid name in the string. The QNames can be retrieved as an
+ * array of QName. If an error occurs converting a QName it will not be included
+ * in the array and the isValid() method will return false (even if there are
+ * some valid QNames in the list). If no qnames can be converted from the string,
+ * getContent() and getQNames() will return null and isValid() will return false.
+ *
+ * @author jkaputin@apache.org
+ */
+public interface QNameListAttr extends XMLAttr
+{
+ public QName[] getQNames();
+}
Added: webservices/woden/trunk/java/woden-api/src/main/java/org/apache/woden/xml/QNameListOrTokenAttr.java
URL: http://svn.apache.org/viewvc/webservices/woden/trunk/java/woden-api/src/main/java/org/apache/woden/xml/QNameListOrTokenAttr.java?rev=809835&view=auto
==============================================================================
--- webservices/woden/trunk/java/woden-api/src/main/java/org/apache/woden/xml/QNameListOrTokenAttr.java (added)
+++ webservices/woden/trunk/java/woden-api/src/main/java/org/apache/woden/xml/QNameListOrTokenAttr.java Tue Sep 1 05:54:15 2009
@@ -0,0 +1,52 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.woden.xml;
+
+import javax.xml.namespace.QName;
+
+/**
+ * This interface represents XML attribute information items of type
+ * 'Union of list of xs:QName or xs:token', for example
+ * the wsoap:subcodes extension attribute of binding <fault>.
+ * <p>
+ * The <code>isQNameList</code> method can be used to determine whether
+ * to call the <code>getQNames</code> method or the <code>getToken</code>
+ * method. If the implementor object is initialized with a list of QNames,
+ * <code>isQNameList</code> will return 'true', <code>getQNames</code>
+ * will return an array of QName objects and <code>getToken</code> will return
+ * null. If it is initialized with a xs:token, <code>isQNameList</code> will
+ * return 'false', <code>getQNames</code> will return null and
+ * <code>getToken</code> will return the token string.
+ * <p>
+ * If the implementor object is initialized with a null value (i.e. because
+ * of an attribute value conversion error or because the attribute value
+ * was empty in the WSDL), the <code>getContents</code>,
+ * <code>getQNameList</code> and <code>getToken</code> methods will return null
+ * and <code>isQNameList</code> and <code>isValid</code> will return false.
+ *
+ * @author jkaputin@apache.org
+ */
+public interface QNameListOrTokenAttr extends XMLAttr
+{
+ public boolean isQNameList();
+
+ public boolean isToken();
+
+ public QName[] getQNames();
+
+ public String getToken();
+}
Added: webservices/woden/trunk/java/woden-api/src/main/java/org/apache/woden/xml/QNameOrTokenAttr.java
URL: http://svn.apache.org/viewvc/webservices/woden/trunk/java/woden-api/src/main/java/org/apache/woden/xml/QNameOrTokenAttr.java?rev=809835&view=auto
==============================================================================
--- webservices/woden/trunk/java/woden-api/src/main/java/org/apache/woden/xml/QNameOrTokenAttr.java (added)
+++ webservices/woden/trunk/java/woden-api/src/main/java/org/apache/woden/xml/QNameOrTokenAttr.java Tue Sep 1 05:54:15 2009
@@ -0,0 +1,52 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.woden.xml;
+
+import javax.xml.namespace.QName;
+
+/**
+ * This interface represents XML attribute information items of type
+ * 'Union of xs:QName or xs:token', for example
+ * the wsoap:code extension attribute of binding <fault>.
+ * <p>
+ * The <code>isQName</code> method can be used to determine whether
+ * to call the <code>getQName</code> method or the <code>getToken</code>
+ * method. If the implementor object is initialized with a QName,
+ * <code>isQName</code> will return 'true', <code>getQName</code>
+ * will return the QName object and <code>getToken</code> will return
+ * null. If it is initialized with a xs:token, <code>isQName</code> will
+ * return 'false', <code>getQName</code> will return null and
+ * <code>getToken</code> will return the token string.
+ * <p>
+ * If the implementor object is initialized with a null value (i.e. because
+ * of an attribute value conversion error or because the attribute value
+ * was empty in the WSDL), the <code>getContents</code>,
+ * <code>getQName</code> and <code>getToken</code> methods will return null
+ * and <code>isQName</code> and <code>isValid</code> will return false.
+ *
+ * @author jkaputin@apache.org
+ */
+public interface QNameOrTokenAttr extends XMLAttr
+{
+ public boolean isQName();
+
+ public boolean isToken();
+
+ public QName getQName();
+
+ public String getToken();
+}
Added: webservices/woden/trunk/java/woden-api/src/main/java/org/apache/woden/xml/StringAttr.java
URL: http://svn.apache.org/viewvc/webservices/woden/trunk/java/woden-api/src/main/java/org/apache/woden/xml/StringAttr.java?rev=809835&view=auto
==============================================================================
--- webservices/woden/trunk/java/woden-api/src/main/java/org/apache/woden/xml/StringAttr.java (added)
+++ webservices/woden/trunk/java/woden-api/src/main/java/org/apache/woden/xml/StringAttr.java Tue Sep 1 05:54:15 2009
@@ -0,0 +1,30 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.woden.xml;
+
+
+/**
+ * This interface represents XML attribute information items of type xs:string.
+ * If the object is initialized with a null value, the getContents() and getString()
+ * methods will return null and isValid() will return false.
+ *
+ * @author jkaputin@apache.org
+ */
+public interface StringAttr extends XMLAttr
+{
+ public String getString();
+}
Added: webservices/woden/trunk/java/woden-api/src/main/java/org/apache/woden/xml/TokenAttr.java
URL: http://svn.apache.org/viewvc/webservices/woden/trunk/java/woden-api/src/main/java/org/apache/woden/xml/TokenAttr.java?rev=809835&view=auto
==============================================================================
--- webservices/woden/trunk/java/woden-api/src/main/java/org/apache/woden/xml/TokenAttr.java (added)
+++ webservices/woden/trunk/java/woden-api/src/main/java/org/apache/woden/xml/TokenAttr.java Tue Sep 1 05:54:15 2009
@@ -0,0 +1,33 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.woden.xml;
+
+
+/**
+ * This interface represents XML attribute information items of type xs:token.
+ * If the object is initialized with a null value, the getContents() and getToken()
+ * methods will return null and isValid() will return false.
+ *
+ * TODO create org.apache.woden.types.Token based on the same class in org.apache.axis.types
+ * and modify the getToken method here to return Token instead of String.
+ *
+ * @author jkaputin@apache.org
+ */
+public interface TokenAttr extends XMLAttr
+{
+ public String getToken();
+}
Added: webservices/woden/trunk/java/woden-api/src/main/java/org/apache/woden/xml/URIAttr.java
URL: http://svn.apache.org/viewvc/webservices/woden/trunk/java/woden-api/src/main/java/org/apache/woden/xml/URIAttr.java?rev=809835&view=auto
==============================================================================
--- webservices/woden/trunk/java/woden-api/src/main/java/org/apache/woden/xml/URIAttr.java (added)
+++ webservices/woden/trunk/java/woden-api/src/main/java/org/apache/woden/xml/URIAttr.java Tue Sep 1 05:54:15 2009
@@ -0,0 +1,31 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.woden.xml;
+
+import java.net.URI;
+
+/**
+ * This interface represents XML attribute information items of type xs:anyURI.
+ * If the attribute value cannot be converted into a java.net.URI the getContent()
+ * and getURI() methods will return null and isValid() will return false.
+ *
+ * @author jkaputin@apache.org
+ */
+public interface URIAttr extends XMLAttr
+{
+ public URI getURI();
+}
Added: webservices/woden/trunk/java/woden-api/src/main/java/org/apache/woden/xml/UnknownAttr.java
URL: http://svn.apache.org/viewvc/webservices/woden/trunk/java/woden-api/src/main/java/org/apache/woden/xml/UnknownAttr.java?rev=809835&view=auto
==============================================================================
--- webservices/woden/trunk/java/woden-api/src/main/java/org/apache/woden/xml/UnknownAttr.java (added)
+++ webservices/woden/trunk/java/woden-api/src/main/java/org/apache/woden/xml/UnknownAttr.java Tue Sep 1 05:54:15 2009
@@ -0,0 +1,80 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.woden.xml;
+
+import javax.xml.namespace.QName;
+
+import org.apache.woden.ErrorReporter;
+import org.apache.woden.WSDLException;
+import org.apache.woden.XMLElement;
+
+/**
+ * This class represents extension attributes (those not in the WSDL namespace)
+ * that do not have a Java type registered in the Extension Registry.
+ * It treats the attribute's value as a string.
+ *
+ * @author jkaputin@apache.org
+ */
+public class UnknownAttr implements XMLAttr
+{
+ private QName fAttrType = null;
+ private Object fContent = null;
+ private String fExternalForm = null;
+ private boolean fValid = true;
+ private ErrorReporter fErrorReporter = null;
+
+ public UnknownAttr(XMLElement ownerEl, QName attrType,
+ String attrValue, ErrorReporter errRpt) throws WSDLException
+ {
+ fErrorReporter = errRpt;
+ fAttrType = attrType;
+ fExternalForm = attrValue;
+ fContent = attrValue;
+ if(fContent == null) {
+ fValid = false;
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.woden.xml.XMLAttr#getAttributeType()
+ */
+ public QName getAttributeType() {
+ return fAttrType;
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.woden.xml.XMLAttr#getContent()
+ */
+ public Object getContent() {
+ return fContent;
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.woden.xml.XMLAttr#toExternalForm()
+ */
+ public String toExternalForm() {
+ return fExternalForm;
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.woden.xml.XMLAttr#isValid()
+ */
+ public boolean isValid() {
+ return fValid;
+ }
+
+}
Added: webservices/woden/trunk/java/woden-api/src/main/java/org/apache/woden/xml/XMLAttr.java
URL: http://svn.apache.org/viewvc/webservices/woden/trunk/java/woden-api/src/main/java/org/apache/woden/xml/XMLAttr.java?rev=809835&view=auto
==============================================================================
--- webservices/woden/trunk/java/woden-api/src/main/java/org/apache/woden/xml/XMLAttr.java (added)
+++ webservices/woden/trunk/java/woden-api/src/main/java/org/apache/woden/xml/XMLAttr.java Tue Sep 1 05:54:15 2009
@@ -0,0 +1,45 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.woden.xml;
+
+import javax.xml.namespace.QName;
+
+import org.apache.woden.ErrorReporter;
+import org.apache.woden.WSDLException;
+import org.apache.woden.XMLElement;
+
+/**
+ * This interface represents an XML attribute information item. It can be initialized
+ * with the string value of an attribute and the implementation must convert the string into
+ * an object of the appropriate type. The getContent() method will return the converted
+ * Object and the caller must cast this to the appropriate type.
+ * If a conversion error occured because the string was not in the correct form,
+ * the isValid() method will return false. The toExternalForm() method will return the
+ * attribute's original string value.
+ *
+ * @author jkaputin@apache.org
+ */
+public interface XMLAttr
+{
+ public QName getAttributeType();
+
+ public Object getContent();
+
+ public String toExternalForm();
+
+ public boolean isValid();
+}
Added: webservices/woden/trunk/java/woden-api/src/main/java/org/apache/woden/xpointer/ElementPointerPart.java
URL: http://svn.apache.org/viewvc/webservices/woden/trunk/java/woden-api/src/main/java/org/apache/woden/xpointer/ElementPointerPart.java?rev=809835&view=auto
==============================================================================
--- webservices/woden/trunk/java/woden-api/src/main/java/org/apache/woden/xpointer/ElementPointerPart.java (added)
+++ webservices/woden/trunk/java/woden-api/src/main/java/org/apache/woden/xpointer/ElementPointerPart.java Tue Sep 1 05:54:15 2009
@@ -0,0 +1,264 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.woden.xpointer;
+
+import org.apache.woden.types.NCName;
+
+import java.util.List;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.lang.StringBuffer;
+
+import java.lang.NumberFormatException;
+
+/**
+ * ElementPointerPart is a class which represents the element() scheme for the XPointer Framework.
+ * The specification is defined at <a href="http://www.w3.org/TR/xptr-element/">http://www.w3.org/TR/xptr-element/</a>
+ *
+ * This class is immutable.
+ *
+ * @author Dan Harvey (danharvey42@gmail.com)
+ *
+ */
+public class ElementPointerPart implements PointerPart {
+ private final NCName ncname;
+ private final List childSequence;
+
+ /**
+ * Constructs an ElementPointerPart with only an elementID NCName.
+ *
+ * @param elementID an NCName of the elementID to reference.
+ * @throws NullPointerException is a null elementID is given.
+ */
+ public ElementPointerPart(NCName elementID) {
+ if(elementID == null) {
+ throw new NullPointerException("The elementID argument is null.");
+ }
+ this.ncname = elementID;
+ this.childSequence = null;
+ }
+
+ /**
+ * Constructs an ElementPointerPart with only a childSequence.
+ *
+ * @param childSequence a List of Integers representing the child sequence.
+ * @throws NullPointerException if childSequence is null.
+ * @throws IllegalArgumentException if childSequence is empty or contains elements other than Integers.
+ */
+ public ElementPointerPart(List childSequence) {
+ if(childSequence == null) {
+ throw new NullPointerException("The childSequence argument is null.");
+ }
+ if(childSequence.isEmpty()) {
+ throw new IllegalArgumentException("The childSequence list is empty.");
+ }
+ for(Iterator it = childSequence.iterator(); it.hasNext();) {
+ if(!(it.next() instanceof Integer)){
+ throw new IllegalArgumentException("The childSequence list must only contain Integers.");
+ }
+ }
+ this.ncname = null;
+ this.childSequence = childSequence;
+ }
+
+ /**
+ * Constructs an ElementPointerPart with both an NCName and a childSequence.
+ *
+ * @param elementID an NCName of the elementID to reference.
+ * @param childSequence a List of Integers representing the child sequence.
+ * @throws NullPointerException if elementID or childSequence are null.
+ * @throws IllegalArgumentException if childSequence is empty or contains elements other than Integers.
+ */
+ public ElementPointerPart(NCName elementID, List childSequence) {
+ if(elementID == null) {
+ throw new NullPointerException("The elementID argument is null.");
+ }
+ if(childSequence == null) {
+ throw new NullPointerException("The childSequence argument is null.");
+ }
+ if(childSequence.isEmpty()) {
+ throw new IllegalArgumentException("The childSequence list is empty.");
+ }
+ for(Iterator it = childSequence.iterator(); it.hasNext();) {
+ Object integer = it.next();
+ if(!(integer instanceof Integer)){
+ throw new IllegalArgumentException("the childSequence list must only contain Integers.");
+ } else if (((Integer)integer).intValue() == 0){
+ throw new IllegalArgumentException("the childSequence list must only contain Integers bigger than 0.");
+ }
+ }
+ this.ncname = elementID;
+ this.childSequence = childSequence;
+ }
+
+ /**
+ * Returns the NCName for this Element PointerPart.
+ *
+ * @return an NCName if it exists in this Element PointerPart, otherwise null.
+ */
+ public NCName getNCName() {
+ return ncname;
+ }
+
+ /**
+ * Returns the child sequence of this Element PointerPart.
+ *
+ * @return a Integer[] of the child sequence for this element pointer part, or an empty array if none exists.
+ */
+ public Integer[] getChildSequence() {
+ int size = childSequence.size();
+ Integer[] sequence = new Integer[size];
+ for(int i=0; i<size; i++) {
+ sequence[i] = (Integer)childSequence.get(i);
+ }
+ return sequence;
+ }
+
+ /**
+ * Checks if this Element PointerPart has a NCName or not.
+ *
+ * @return a boolean, true if it has a NCName or false if not.
+ */
+ public boolean hasNCName() {
+ return ncname != null;
+ }
+
+ /**
+ * Checks if this Element PointerPart has a childSequence or not.
+ *
+ * @return a boolean, true if this has a childSequence or false if not.
+ */
+ public boolean hasChildSequence() {
+ return childSequence != null;
+ }
+
+ /*
+ *(non-Javadoc)
+ * @see org.apache.woden.xpointer.PointerPart#toString()
+ */
+ public String toString() {
+ String schemeData;
+ if (childSequence == null) {
+ schemeData = ncname.toString();
+ } else if (ncname == null) {
+ schemeData = serialiseChildSequence();
+ } else {
+ schemeData = ncname.toString() + serialiseChildSequence();
+ }
+ return "element(" + schemeData + ")";
+ }
+
+ /**
+ * Serialises the child sequence and returns it as a string.
+ *
+ * @return a String of the serialised child sequence.
+ */
+ private String serialiseChildSequence() {
+ StringBuffer buffer = new StringBuffer();
+ for(Iterator it = childSequence.iterator(); it.hasNext();) {
+ Integer child = (Integer)it.next();
+ buffer.append("/" + child.toString());
+ }
+ return buffer.toString();
+ }
+
+ /**
+ * Deserialises the schemaData for an ElementPointerPart and constructs a new ElementPointerPart from it.
+ *
+ * @param schemeData a String of the schemeaData parsed from the string XPointer.
+ * @return an ElementPointerPart representing the parsed schemaData.
+ * @throws IllegalArgumentException if the schemeData has invalid scheme syntax.
+ */
+ public static ElementPointerPart parseFromString(final String schemeData) throws InvalidXPointerException {
+ List childSequence = null;
+ NCName elementID = null;
+ int startChar;
+ int endChar;
+
+ //Find an NCName if it exists?
+ startChar = schemeData.indexOf("/");
+ // -1 Only an NCName. 0 No NCName. > 1 An NCName.
+
+ switch (startChar) {
+ case -1: //Only an NCName.
+ try {
+ elementID = new NCName(schemeData);
+ }
+ catch (IllegalArgumentException e) {
+ throw new InvalidXPointerException("Invalid NCName in the XPointer", schemeData);
+ }
+ return new ElementPointerPart(elementID);
+ case 0: //No NCName.
+ break;
+ default: //An NCName.
+ try {
+ elementID = new NCName(schemeData.substring(0, startChar));
+ } catch (IllegalArgumentException e) {
+ throw new InvalidXPointerException("Invalid NCName in the XPointer", schemeData, 0, startChar);
+ }
+ break;
+ }
+
+ //Find remaining child sequence.
+ childSequence = new ArrayList();
+
+ endChar = schemeData.indexOf("/", startChar+1);
+ // -1 Only single child sequence element. > 0 A childSequence.
+
+ if (endChar < 0) { //Only single child sequence element.
+ childSequence.add(parseIntegerFromChildSequence(schemeData, startChar+1, schemeData.length()));
+ } else { //Multiple child sequence elements.
+ while(true) {
+ if (endChar < 0) {//Last integer.
+ childSequence.add(parseIntegerFromChildSequence(schemeData, startChar+1, schemeData.length()));
+ break;
+ } else { //Inner sequence integer.
+ childSequence.add(parseIntegerFromChildSequence(schemeData, startChar+1, endChar));
+ startChar = endChar;
+ endChar = schemeData.indexOf("/", startChar+1);
+ }
+ }
+ }
+
+ if (elementID == null) { //Only a childSequence
+ return new ElementPointerPart(childSequence);
+ } else { //Both NCName and childSequence
+ return new ElementPointerPart(elementID, childSequence);
+ }
+ }
+
+ /**
+ * Parses a String for an integer between two indices and returns this as an Integer.
+ *
+ * @param string a String to parse.
+ * @param start an int char index to the start of the Integer.
+ * @param end an int char index to the end of the Integer.
+ * @return an Integer resulting from parsing the given String in the index range.
+ * @throws IllegalArgumentException if the given char range does not contain an integer.
+ */
+ private static Integer parseIntegerFromChildSequence(String string, int start, int end) throws InvalidXPointerException{
+ if (start < end) { //Make sure sub string is not of zero length.
+ try { //Make sure the integer is valid.
+ return new Integer(string.substring(start, end));
+ } catch (NumberFormatException e) {
+ throw new InvalidXPointerException("The child sequence part contained a invalid integer.", string, start, end);
+ }
+ } else {
+ throw new InvalidXPointerException("The child sequence part contained a empty item at " + String.valueOf(start), string, start, end);
+ }
+ }
+}
Added: webservices/woden/trunk/java/woden-api/src/main/java/org/apache/woden/xpointer/InvalidXPointerException.java
URL: http://svn.apache.org/viewvc/webservices/woden/trunk/java/woden-api/src/main/java/org/apache/woden/xpointer/InvalidXPointerException.java?rev=809835&view=auto
==============================================================================
--- webservices/woden/trunk/java/woden-api/src/main/java/org/apache/woden/xpointer/InvalidXPointerException.java (added)
+++ webservices/woden/trunk/java/woden-api/src/main/java/org/apache/woden/xpointer/InvalidXPointerException.java Tue Sep 1 05:54:15 2009
@@ -0,0 +1,141 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.woden.xpointer;
+
+/**
+ * This class represents Exceptions that can happen during parsing an XPointer Expression.
+ *
+ * @author Dan Harvey <da...@gmail.com>
+ *
+ */
+public class InvalidXPointerException extends Exception {
+ private static final long serialVersionUID = 0;
+ private final String fragment;
+ private final Integer startChar;
+ private final Integer endChar;
+
+ /**
+ * Constructs a InvalidXPointerException with a message and fragment properties.
+ *
+ * @param message a String message of error.
+ * @param fragment a String fragment of the cause.
+ */
+ public InvalidXPointerException(String message, String fragment) {
+ this(message, fragment, null, null, null);
+ }
+
+ /**
+ * Constructs a InvalidXPointerException with a message and fragment properties.
+ *
+ * It also has a Throwable argument to support exception chaining.
+ *
+ * @param message a String message of error.
+ * @param fragment a String fragment of the cause of the error.
+ * @param cause a Throwable which caused this exception to be thrown.
+ */
+ public InvalidXPointerException(String message, String fragment, Throwable cause) {
+ this(message, fragment, null, null, cause);
+ }
+
+ /**
+ * Constructs a InvalidXPointerException with a message and fragment properties,
+ * and index to the cause inside the fragment.
+ *
+ * @param message a String message of error.
+ * @param fragment a String fragment of the cause of the error.
+ * @param startChar a int char index to the start of the cause in the fragment.
+ * @param endChar a int char index to the end of the cause in the fragment.
+ */
+ public InvalidXPointerException(String message, String fragment, int startChar, int endChar) {
+ this(message, fragment, new Integer(startChar), new Integer(endChar), null);
+ }
+
+ /**
+ * Constructs a InvalidXPointerException with a message and fragment properties,
+ * and index to the cause inside the fragment.
+ *
+ * It also has a Throwable argument to support exception chaining.
+ *
+ * @param message a String message of error.
+ * @param fragment a String fragment of the cause of the error.
+ * @param startChar an int char index to the start of the cause in the fragment.
+ * @param endChar an int char index to the end of the cause in the fragment.
+ * @param cause a Throwable which caused the exception to be thrown.
+ */
+ public InvalidXPointerException(String message, String fragment, int startChar, int endChar, Throwable cause) {
+ this(message, fragment, new Integer(startChar), new Integer(endChar), cause);
+ }
+
+ /**
+ * Constructs a new InvalidXPointerException.
+ * This constructor is called by all of the above constructors and stores the in indexes and Integers internally.
+ *
+ * @param message a String message of error.
+ * @param fragment a String fragment of the cause of the error.
+ * @param startChar an Integer char index to the start of the cause in the fragment.
+ * @param endChar an Integer char index to the end of the cause in the fragment.
+ * @param cause a Throwable which caused the exception to be thrown.
+ */
+ private InvalidXPointerException(String message, String fragment, Integer startChar, Integer endChar, Throwable cause) {
+ super(message, cause);
+ this.fragment = fragment;
+ this.startChar = startChar;
+ this.endChar = endChar;
+ }
+
+ /**
+ * Returns the fragment String stored inside this exception.
+ *
+ * @return a String fragment.
+ */
+ public String getFragment() {
+ return fragment;
+ }
+
+ /**
+ * Returns the startChar index of the cause of this error in the fragment.
+ *
+ * @return an Integer of the startChar index if one exists, otherwise null.
+ */
+ public Integer getStartChar() {
+ return startChar;
+ }
+
+ /**
+ * Returns the endChar index of the cause of this error in the fragment.
+ *
+ * @return an Integer of the startChar index if one exists, otherwise null.
+ */
+ public Integer getEndChar() {
+ return endChar;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see java.lang.Throwable#toString()
+ */
+ public String toString() {
+ String postString;
+ if (startChar != null && endChar!= null) {
+ postString = "{XPointer: " + fragment + ", start: " + startChar.toString()+ ", end: " + endChar.toString() + ", substr: " + fragment.substring(startChar.intValue(), endChar.intValue()) + "}";
+ } else {
+ postString = "{XPointer: " + fragment + "}";
+ }
+ return "InvalidXPointerException: " + getMessage() + ". " + postString;
+ }
+
+}
Added: webservices/woden/trunk/java/woden-api/src/main/java/org/apache/woden/xpointer/PointerPart.java
URL: http://svn.apache.org/viewvc/webservices/woden/trunk/java/woden-api/src/main/java/org/apache/woden/xpointer/PointerPart.java?rev=809835&view=auto
==============================================================================
--- webservices/woden/trunk/java/woden-api/src/main/java/org/apache/woden/xpointer/PointerPart.java (added)
+++ webservices/woden/trunk/java/woden-api/src/main/java/org/apache/woden/xpointer/PointerPart.java Tue Sep 1 05:54:15 2009
@@ -0,0 +1,32 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.woden.xpointer;
+
+/**
+ * Interface to be implemented by pointer parts (XPointer schemes).
+ */
+
+public interface PointerPart {
+
+ /**
+ * Returns a String serialisation of this xpointer PointerPart.
+ *
+ * @return a String containing the serialisation of this xpointer PointerPart.
+ */
+ public String toString();
+
+}
Added: webservices/woden/trunk/java/woden-api/src/main/java/org/apache/woden/xpointer/XPointer.java
URL: http://svn.apache.org/viewvc/webservices/woden/trunk/java/woden-api/src/main/java/org/apache/woden/xpointer/XPointer.java?rev=809835&view=auto
==============================================================================
--- webservices/woden/trunk/java/woden-api/src/main/java/org/apache/woden/xpointer/XPointer.java (added)
+++ webservices/woden/trunk/java/woden-api/src/main/java/org/apache/woden/xpointer/XPointer.java Tue Sep 1 05:54:15 2009
@@ -0,0 +1,257 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.woden.xpointer;
+
+import java.util.List;
+import java.util.ArrayList;
+import java.util.Map;
+import java.util.HashMap;
+
+import java.util.Iterator;
+import java.lang.StringBuffer;
+
+import org.apache.woden.types.NCName;
+
+/**
+ * XPointer is a class which represents an XPointer defined in the XPointer Framework.
+ * This is specified at <a href="http://www.w3.org/TR/xptr-framework/">http://www.w3.org/TR/xptr-framework/</a>
+ *
+ * @author Dan Harvey (danharvey42@gmail.com)
+ *
+ */
+public class XPointer {
+ private static final String emptyString = "".intern();
+ private final Map prefixBindingContex;
+ private final Map namespaceBindingContex;
+ private NCName shorthandPointer;
+ private final List pointerParts;
+
+ private static final NCName emptyNCName = new NCName(emptyString);
+
+ private static final String NS_URI_XML = "http://www.w3.org/XML/1998/namespace";
+ private static final String NS_URI_XMLNS = "http://www.w3.org/2000/xmlns/";
+ private static final NCName NS_PREFIX_XMLNS = new NCName("xmlns");
+
+ /**
+ * Constructs a new XPointer.
+ *
+ */
+ public XPointer() {
+ pointerParts = new ArrayList();
+ shorthandPointer = emptyNCName;
+
+ //Setup prefix/namespace binding context.
+ prefixBindingContex = new HashMap();
+ namespaceBindingContex = new HashMap();
+ addPrefixNamespaceBinding(new NCName("xml"), NS_URI_XML);
+ }
+
+ /**
+ * Constructs a new XPointer from the serialised string.
+ *
+ * @param xpointerString a String form of the XPointer to deserialise.
+ */
+ public XPointer(String xpointerString) throws InvalidXPointerException {
+ this(); //Construct a new XPointer.
+ if (xpointerString == null || xpointerString.equals(emptyString))
+ throw new InvalidXPointerException("The XPointer string is either null or empty", emptyString);
+ XPointerParser.parseXPointer(xpointerString, this); //Parse the string and add the Pointers to the new XPointer.
+ }
+
+ /**
+ * Appends a pointer part to the end of this XPointer.
+ *
+ * @param pointerPart the Pointer Part to append.
+ * @throws UnsupportedOperationException() if a Shorthand Pointer is already set.
+ */
+ public void addPointerPart(PointerPart pointerPart) {
+ if(!shorthandPointer.equals(emptyNCName)) {
+ throw new UnsupportedOperationException("A Shortname Pointer already exists for this XPointer.");
+ } else {
+ pointerParts.add(pointerPart);
+ }
+ }
+
+ /**
+ * Inserts a pointer part at index of this XPointer.
+ *
+ * @param pointerPart the Pointer Part to inserted.
+ * @param index an integer specifying the point to insert the pointer part.
+ * @throws UnsupportedOperationException() if a Shorthand Pointer is already set.
+ */
+ public void addPointerPart(int index, PointerPart pointerPart) {
+ if(hasShorthandPointer()) {
+ throw new UnsupportedOperationException("A Shortname Pointer already exists for this XPointer.");
+ }
+ if(index < 0 || index > pointerParts.size()) {
+ throw new IndexOutOfBoundsException("The index you gave is out of the bounds of the list of XPointers");
+ }
+ pointerParts.add(index, pointerPart);
+ }
+
+ /**
+ * Returns the pointer parts in this XPointer.
+ *
+ * @return a PointerPart[] of type Object[] containing the pointer parts in this XPointer.
+ * @throws IllegalStateException if this XPointer has a shorthand pointer.
+ */
+ public Object[] getPointerParts() {
+ if (hasPointerParts()) {
+ int size = pointerParts.size();
+ Object[] parts = new Object[size]; //Ugly but it will have to do for Java 1.4
+ for(int i=0; i<size; i++) {
+ parts[i] = pointerParts.get(i);
+ }
+ return parts;
+ } else {
+ throw new IllegalStateException("This XPointer has a shorthand pointer.");
+ }
+ }
+
+ /**
+ * Sets the Shorthand Pointer of this XPointer to the NCName given as an argument.
+ *
+ * @param shorthandPointer an NCName of the Shorthand Pointer to set.
+ * @throws UnsupportedOperationException() is a PointerPart Pointer is already set.
+ */
+ public void setShorthandPointer(NCName shorthandPointer) {
+ if (hasPointerParts()) {
+ throw new UnsupportedOperationException("A PointerPart Pointer already exists for this XPointer");
+ }
+ if (shorthandPointer.equals(null)) {
+ throw new NullPointerException("The shorthandPointer argument is null");
+ }
+
+ this.shorthandPointer = shorthandPointer;
+ }
+
+ /**
+ * Returns the shorthandPointer in this XPointer.
+ *
+ * @return an NCName containing the shorthand pointer for this XPointer.
+ * @throws IllegalStateException if this XPointer has a shorthand pointer.
+ */
+ public NCName getShorthandPointer() {
+ if (hasShorthandPointer()) {
+ return shorthandPointer;
+ } else {
+ throw new IllegalStateException("This XPointer has scheme based pointers.");
+ }
+ }
+
+ /**
+ * Adds a Prefix/Namespace binding to this XPointers contex.
+ *
+ * @param prefix a NCName of the prefix too bind to the namespace.
+ * @param namespace a String of the namespace to bind to the prefix.
+ * @throws NullPointerException if the prefix or namespace arguments are null.
+ * @throws IllegalArgumentException if the prefix or namespace are invalid as specified at <a href="http://www.w3.org/TR/xptr-framework/#nsContext">http://www.w3.org/TR/xptr-framework/#nsContext</a>
+ */
+ public void addPrefixNamespaceBinding(NCName prefix, String namespace) {
+ if (prefix == null)
+ throw new NullPointerException("The prefix argument provided has a null pointer.");
+ if (namespace == null)
+ throw new NullPointerException("The namespace argument provided has a null pointer.");
+ if (prefix.equals(NS_PREFIX_XMLNS))
+ throw new IllegalArgumentException("The xmlns prefix must not be bound to any namespace.");
+ if (namespace.equals(NS_URI_XMLNS))
+ throw new IllegalArgumentException("The " + NS_URI_XMLNS + " namespace must not be bound to any prefix.");
+ //Its a valid binding so add it to the binding contex.
+ prefixBindingContex.put(prefix, namespace);
+ namespaceBindingContex.put(namespace, prefix);
+ }
+
+ /**
+ * Gets the Namespace the Prefix is bound to if the binding exists,
+ * otherwise it will return null.
+ *
+ * @param prefix a NCName of the prefix bound to the namespace.
+ * @return A String of the namespace bound to this prefix or null if none exists.
+ */
+ public String getPrefixBinding(NCName prefix) {
+ return (String)prefixBindingContex.get(prefix);
+ }
+
+ /**
+ * Gets Prefix the Namespace is bound to if the binding exists,
+ * otherwise it will return null.
+ *
+ * @param namespace a String of the prefix bound to the prefix.
+ * @return A NCName of the prefix bound to this namespace or null if none exists.
+ */
+ public NCName getNamespaceBinding(String namespace) {
+ return (NCName)namespaceBindingContex.get(namespace);
+ }
+
+ /**
+ * Checks whether a prefix is bound or not.
+ *
+ * @param prefix A NCName of the prefix to check.
+ * @return a boolean value that is true if the binding exists, or false otherwise.
+ */
+ public boolean hasPrefixBinding(NCName prefix) {
+ return prefixBindingContex.containsKey(prefix);
+ }
+
+ /**
+ * Checks whether a namespace is bound or not.
+ *
+ * @param namespace A String of the namespace to check.
+ * @return a boolean value that is true if the binding exists, or false otherwise.
+ */
+ public boolean hasNamespaceBinding(String namespace) {
+ return namespaceBindingContex.containsKey(namespace);
+ }
+
+ /**
+ * Tests whether this XPointer has a shorthand pointer or not.
+ *
+ * @return a boolean which is true if this XPointer contains an shorthand pointer, false otherwise.
+ */
+ public boolean hasShorthandPointer() {
+ return !shorthandPointer.equals(emptyNCName);
+ }
+
+ /**
+ * Tests whether this XPointer has scheme based pointers or not.
+ *
+ * @return a boolean which is true if this XPointer contains scheme based pointers, false otherwise.
+ */
+ public boolean hasPointerParts() {
+ return !pointerParts.isEmpty();
+ }
+
+ /**
+ * Returns a String serialisation of this XPointer.
+ *
+ * @return a String containing the serialisation of this XPointer
+ */
+ public String toString() {
+ if (shorthandPointer.equals(emptyNCName)) {
+ StringBuffer buffer = new StringBuffer();
+ Iterator parts = pointerParts.iterator();
+ while (parts.hasNext()) {
+ buffer.append(parts.next());
+ }
+ return buffer.toString();
+ } else {
+ return shorthandPointer.toString();
+ }
+ }
+
+}
\ No newline at end of file
Added: webservices/woden/trunk/java/woden-api/src/main/java/org/apache/woden/xpointer/XPointerParser.java
URL: http://svn.apache.org/viewvc/webservices/woden/trunk/java/woden-api/src/main/java/org/apache/woden/xpointer/XPointerParser.java?rev=809835&view=auto
==============================================================================
--- webservices/woden/trunk/java/woden-api/src/main/java/org/apache/woden/xpointer/XPointerParser.java (added)
+++ webservices/woden/trunk/java/woden-api/src/main/java/org/apache/woden/xpointer/XPointerParser.java Tue Sep 1 05:54:15 2009
@@ -0,0 +1,636 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.woden.xpointer;
+
+import java.util.Hashtable;
+
+import org.apache.woden.types.XMLChar;
+import org.apache.woden.types.NCName;
+
+/**
+ * This class parses a String to the XPointer Framework specification for shorthand and scheme based pointers.
+ * For scheme based pointers each know pointer part
+ *
+ * See the <a href="http://www.w3.org/TR/xptr-framework/">XPointer Framework Recommendation</a> for
+ * more information on the XPointer Framework, ShortHand and Scheme based Pointers.
+ *
+ * This class based on the org.apache.xerces.xpointer.XPointerHandler class in the Apache Xerces Project
+ * for the core XPointer parsing code. It has been modified to be used inside the Woden XPointer model.
+ *
+ * @author Dan Harvey (danharvey42@gmail.com)
+ *
+ */
+final class XPointerParser {
+
+ private static final String emptyString = "".intern();
+ /**
+ * Parses a String XPointer and stores the results into the given XPointer object.
+ *
+ * @param xpointerString
+ * @param xpointer
+ * @throws InvalidXPointerException if the XPointer being parsed contains invalid syntax.
+ */
+ public static void parseXPointer(String xpointerString, XPointer xpointer) throws InvalidXPointerException{
+ final String ELEMENT_SCHEME_NAME = "element"; // Supported schemes
+
+ final Tokens tokens = new Tokens(); // tokens
+
+ // scan the XPointer expression
+ int length = xpointerString.length();
+ boolean success = Scanner.scanExpr(tokens, xpointerString, 0, length);
+
+ if (!success)
+ throw new InvalidXPointerException("Invalid XPointer expression", xpointerString);
+
+ while (tokens.hasMore()) {
+ int token = tokens.nextToken();
+
+ switch (token) {
+ case Tokens.XPTRTOKEN_SHORTHAND: {
+
+ // The shorthand name
+ token = tokens.nextToken();
+ String shortHandPointerName = tokens.getTokenString(token);
+
+ if (shortHandPointerName == null)
+ throw new InvalidXPointerException("Invalid Shorthand XPointer", xpointerString);
+
+ xpointer.setShorthandPointer(new NCName(shortHandPointerName));
+ break;
+ }
+ case Tokens.XPTRTOKEN_SCHEMENAME: {
+
+ // Retrieve the local name and prefix to form the scheme name
+ token = tokens.nextToken();
+ String prefix = tokens.getTokenString(token);
+ token = tokens.nextToken();
+ String localName = tokens.getTokenString(token);
+
+ String schemeName = prefix + localName;
+
+ // The next character should be an open parenthesis
+ int openParenCount = 0;
+ int closeParenCount = 0;
+
+ token = tokens.nextToken();
+ String openParen = tokens.getTokenString(token);
+ if (openParen != "XPTRTOKEN_OPEN_PAREN") {
+
+ // can not have more than one ShortHand Pointer
+ if (token == Tokens.XPTRTOKEN_SHORTHAND) {
+ throw new InvalidXPointerException("MultipleShortHandPointers", xpointerString);
+ } else {
+ throw new InvalidXPointerException("Invalid XPointer Expression", xpointerString);
+ }
+ }
+ openParenCount++;
+
+ // followed by zero or more ( and the schemeData
+ String schemeData = null;
+ while (tokens.hasMore()) {
+ token = tokens.nextToken();
+ schemeData = tokens.getTokenString(token);
+ if (schemeData != "XPTRTOKEN_OPEN_PAREN") {
+ break;
+ }
+ openParenCount++;
+ }
+ token = tokens.nextToken();
+ schemeData = tokens.getTokenString(token);
+
+ // followed by the same number of )
+ if (tokens.hasMore()) {
+ token = tokens.nextToken();
+ String closeParen = tokens.getTokenString(token);
+ if (closeParen != "XPTRTOKEN_CLOSE_PAREN")
+ new InvalidXPointerException("SchemeDataNotFollowedByCloseParenthesis", xpointerString);
+ } else {
+ new InvalidXPointerException("SchemeDataNotFollowedByCloseParenthesis", xpointerString);
+ }
+
+ closeParenCount++;
+
+ while (tokens.hasMore()) {
+ if (tokens.getTokenString(tokens.peekToken()) != "XPTRTOKEN_OPEN_PAREN") {
+ break;
+ }
+ closeParenCount++;
+ }
+
+ // check if the number of open parenthesis are equal to the number of close parenthesis
+ if (openParenCount != closeParenCount) {
+ throw new InvalidXPointerException("UnbalancedParenthesisInXPointerExpression", xpointerString);
+ }
+
+ // Perform scheme specific parsing of the pointer part, make this more generic for any pointer part?
+ if (schemeName.equals(ELEMENT_SCHEME_NAME)) {
+ PointerPart elementSchemePointer = ElementPointerPart.parseFromString(schemeData);
+ xpointer.addPointerPart(elementSchemePointer);
+ } //Else an unknown scheme.
+ break;
+ }
+ default:
+ throw new InvalidXPointerException("InvalidXPointerExpression", xpointerString);
+ }
+ }
+
+ }
+
+ /**
+ * List of XPointer Framework tokens.
+ *
+ */
+ private static class Tokens {
+
+ /**
+ * XPointer Framework tokens
+ * [1] Pointer ::= Shorthand | SchemeBased
+ * [2] Shorthand ::= NCName
+ * [3] SchemeBased ::= PointerPart (S? PointerPart)*
+ * [4] PointerPart ::= SchemeName '(' SchemeData ')'
+ * [5] SchemeName ::= QName
+ * [6] SchemeData ::= EscapedData*
+ * [7] EscapedData ::= NormalChar | '^(' | '^)' | '^^' | '(' SchemeData ')'
+ * [8] NormalChar ::= UnicodeChar - [()^]
+ * [9] UnicodeChar ::= [#x0-#x10FFFF]
+ *
+ */
+ private static final int XPTRTOKEN_OPEN_PAREN = 0,
+ XPTRTOKEN_CLOSE_PAREN = 1, XPTRTOKEN_SHORTHAND = 2,
+ XPTRTOKEN_SCHEMENAME = 3, XPTRTOKEN_SCHEMEDATA = 4;
+
+ // Token count
+ private static final int INITIAL_TOKEN_COUNT = 1 << 8;
+
+ private int[] fTokens = new int[INITIAL_TOKEN_COUNT];
+
+ private int fTokenCount = 0;
+
+ // Current token position
+ private int fCurrentTokenIndex;
+
+ private Hashtable fTokenNames = new Hashtable();
+
+ /**
+ * Constructor
+ *
+ */
+ private Tokens() {
+
+ fTokenNames.put(new Integer(XPTRTOKEN_OPEN_PAREN),
+ "XPTRTOKEN_OPEN_PAREN");
+ fTokenNames.put(new Integer(XPTRTOKEN_CLOSE_PAREN),
+ "XPTRTOKEN_CLOSE_PAREN");
+ fTokenNames.put(new Integer(XPTRTOKEN_SHORTHAND),
+ "XPTRTOKEN_SHORTHAND");
+ fTokenNames.put(new Integer(XPTRTOKEN_SCHEMENAME),
+ "XPTRTOKEN_SCHEMENAME");
+ fTokenNames.put(new Integer(XPTRTOKEN_SCHEMEDATA),
+ "XPTRTOKEN_SCHEMEDATA");
+ }
+
+ /**
+ * Returns the token String
+ * @param token The index of the token
+ * @return String The token string
+ */
+ private String getTokenString(int token) {
+ return (String) fTokenNames.get(new Integer(token));
+ }
+
+ /**
+ * Add the specified string as a token
+ *
+ * @param token The token string
+ */
+ private void addToken(String tokenStr) {
+ Integer tokenInt = (Integer) fTokenNames.get(tokenStr);
+ if (tokenInt == null) {
+ tokenInt = new Integer(fTokenNames.size());
+ fTokenNames.put(tokenInt, tokenStr);
+ }
+ addToken(tokenInt.intValue());
+ }
+
+ /**
+ * Add the specified int token
+ *
+ * @param token The int specifying the token
+ */
+ private void addToken(int token) {
+ try {
+ fTokens[fTokenCount] = token;
+ } catch (ArrayIndexOutOfBoundsException ex) {
+ int[] oldList = fTokens;
+ fTokens = new int[fTokenCount << 1];
+ System.arraycopy(oldList, 0, fTokens, 0, fTokenCount);
+ fTokens[fTokenCount] = token;
+ }
+ fTokenCount++;
+ }
+
+
+
+ /**
+ * Returns true if the {@link #getNextToken()} method
+ * returns a valid token.
+ */
+ private boolean hasMore() {
+ return fCurrentTokenIndex < fTokenCount;
+ }
+
+ /**
+ * Obtains the token at the current position, then advance
+ * the current position by one.
+ *
+ * throws If there's no such next token, this method throws
+ * <tt>new XNIException("XPointerProcessingError");</tt>.
+ */
+ private int nextToken() {
+ if (fCurrentTokenIndex == fTokenCount) {
+ throw new IndexOutOfBoundsException("There are no more tokens to return.");
+ }
+ return fTokens[fCurrentTokenIndex++];
+ }
+
+ /**
+ * Obtains the token at the current position, without advancing
+ * the current position.
+ *
+ * If there's no such next token, this method throws
+ * <tt>new XNIException("XPointerProcessingError");</tt>.
+ */
+ private int peekToken() {
+ if (fCurrentTokenIndex == fTokenCount) {
+ throw new IndexOutOfBoundsException("There are no more tokens to return.");
+ }
+ return fTokens[fCurrentTokenIndex];
+ }
+ }
+
+ /**
+ * The XPointer expression scanner. Scans the XPointer framework expression.
+ *
+ */
+ private static class Scanner {
+
+ /**
+ * 7-bit ASCII subset
+ *
+ * 0 1 2 3 4 5 6 7 8 9 A B C D E F
+ * 0, 0, 0, 0, 0, 0, 0, 0, 0, HT, LF, 0, 0, CR, 0, 0, // 0
+ * 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 1
+ * SP, !, ", #, $, %, &, ', (, ), *, +, ,, -, ., /, // 2
+ * 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, :, ;, <, =, >, ?, // 3
+ * @, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, // 4
+ * P, Q, R, S, T, U, V, W, X, Y, Z, [, \, ], ^, _, // 5
+ * `, a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, // 6
+ * p, q, r, s, t, u, v, w, x, y, z, {, |, }, ~, DEL // 7
+ */
+ private static final byte CHARTYPE_INVALID = 0, // invalid XML character
+ CHARTYPE_OTHER = 1, // not special - one of "#%&;?\`{}~" or DEL
+ CHARTYPE_WHITESPACE = 2, // one of "\t\n\r " (0x09, 0x0A, 0x0D, 0x20)
+ CHARTYPE_CARRET = 3, // ^
+ CHARTYPE_OPEN_PAREN = 4, // '(' (0x28)
+ CHARTYPE_CLOSE_PAREN = 5, // ')' (0x29)
+ CHARTYPE_MINUS = 6, // '-' (0x2D)
+ CHARTYPE_PERIOD = 7, // '.' (0x2E)
+ CHARTYPE_SLASH = 8, // '/' (0x2F)
+ CHARTYPE_DIGIT = 9, // '0'-'9' (0x30 to 0x39)
+ CHARTYPE_COLON = 10, // ':' (0x3A)
+ CHARTYPE_EQUAL = 11, // '=' (0x3D)
+ CHARTYPE_LETTER = 12, // 'A'-'Z' or 'a'-'z' (0x41 to 0x5A and 0x61 to 0x7A)
+ CHARTYPE_UNDERSCORE = 13, // '_' (0x5F)
+ CHARTYPE_NONASCII = 14; // Non-ASCII Unicode codepoint (>= 0x80)
+
+ private static final byte[] fASCIICharMap = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2,
+ 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 2, 1, 1, 1, 1, 1, 1, 1, 4, 5, 1, 1, 1, 6, 7, 8, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 10, 1, 1, 11, 1, 1, 1, 12, 12, 12, 12, 12, 12,
+ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+ 12, 12, 12, 12, 1, 1, 1, 3, 13, 1, 12, 12, 12, 12, 12, 12, 12,
+ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+ 12, 12, 12, 1, 1, 1, 1, 1 };
+
+ /**
+ * Scans the XPointer Expression
+ *
+ */
+ private static boolean scanExpr(Tokens tokens, String data, int currentOffset, int endOffset) throws InvalidXPointerException {
+ int ch;
+ int openParen = 0;
+ int closeParen = 0;
+ int nameOffset, dataOffset;
+ boolean isQName = false;
+ String name = null;
+ String prefix = null;
+ String schemeData = null;
+ StringBuffer schemeDataBuff = new StringBuffer();
+
+ while (true) {
+
+ if (currentOffset == endOffset) {
+ break;
+ }
+ ch = data.charAt(currentOffset);
+
+ //
+ while (ch == ' ' || ch == 0x0A || ch == 0x09 || ch == 0x0D) {
+ if (++currentOffset == endOffset) {
+ break;
+ }
+ ch = data.charAt(currentOffset);
+ }
+ if (currentOffset == endOffset) {
+ break;
+ }
+
+ //
+ // [1] Pointer ::= Shorthand | SchemeBased
+ // [2] Shorthand ::= NCName
+ // [3] SchemeBased ::= PointerPart (S? PointerPart)*
+ // [4] PointerPart ::= SchemeName '(' SchemeData ')'
+ // [5] SchemeName ::= QName
+ // [6] SchemeData ::= EscapedData*
+ // [7] EscapedData ::= NormalChar | '^(' | '^)' | '^^' | '(' SchemeData ')'
+ // [8] NormalChar ::= UnicodeChar - [()^]
+ // [9] UnicodeChar ::= [#x0-#x10FFFF]
+ // [?] QName ::= (NCName ':')? NCName
+ // [?] NCName ::= (Letter | '_') (NCNameChar)*
+ // [?] NCNameChar ::= Letter | Digit | '.' | '-' | '_' (ascii subset of 'NCNameChar')
+ // [?] Letter ::= [A-Za-z] (ascii subset of 'Letter')
+ // [?] Digit ::= [0-9] (ascii subset of 'Digit')
+ //
+ byte chartype = (ch >= 0x80) ? CHARTYPE_NONASCII
+ : fASCIICharMap[ch];
+
+ switch (chartype) {
+
+ case CHARTYPE_OPEN_PAREN: // '('
+ addToken(tokens, Tokens.XPTRTOKEN_OPEN_PAREN);
+ openParen++;
+ ++currentOffset;
+ break;
+
+ case CHARTYPE_CLOSE_PAREN: // ')'
+ addToken(tokens, Tokens.XPTRTOKEN_CLOSE_PAREN);
+ closeParen++;
+ ++currentOffset;
+ break;
+
+ case CHARTYPE_CARRET:
+ case CHARTYPE_COLON:
+ case CHARTYPE_DIGIT:
+ case CHARTYPE_EQUAL:
+ case CHARTYPE_LETTER:
+ case CHARTYPE_MINUS:
+ case CHARTYPE_NONASCII:
+ case CHARTYPE_OTHER:
+ case CHARTYPE_PERIOD:
+ case CHARTYPE_SLASH:
+ case CHARTYPE_UNDERSCORE:
+ case CHARTYPE_WHITESPACE:
+ // Scanning SchemeName | Shorthand
+ if (openParen == 0) {
+ nameOffset = currentOffset;
+ currentOffset = scanNCName(data, endOffset,
+ currentOffset);
+
+ if (currentOffset == nameOffset)
+ throw new InvalidXPointerException("InvalidShortHandPointer", data);
+
+ if (currentOffset < endOffset) {
+ ch = data.charAt(currentOffset);
+ } else {
+ ch = -1;
+ }
+
+ name = data.substring(nameOffset, currentOffset).intern();
+ prefix = emptyString;
+
+ // The name is a QName => a SchemeName
+ if (ch == ':') {
+ if (++currentOffset == endOffset) {
+ return false;
+ }
+
+ ch = data.charAt(currentOffset);
+ prefix = name;
+ nameOffset = currentOffset;
+ currentOffset = scanNCName(data, endOffset,
+ currentOffset);
+
+ if (currentOffset == nameOffset) {
+ return false;
+ }
+
+ if (currentOffset < endOffset) {
+ ch = data.charAt(currentOffset);
+ } else {
+ ch = -1;
+ }
+
+ isQName = true;
+ name = data.substring(nameOffset, currentOffset).intern();
+ }
+
+ // REVISIT:
+ if (currentOffset != endOffset) {
+ addToken(tokens, Tokens.XPTRTOKEN_SCHEMENAME);
+ tokens.addToken(prefix);
+ tokens.addToken(name);
+ isQName = false;
+ } else if (currentOffset == endOffset) {
+ // NCName => Shorthand
+ addToken(tokens, Tokens.XPTRTOKEN_SHORTHAND);
+ tokens.addToken(name);
+ isQName = false;
+ }
+
+ // reset open/close paren for the next pointer part
+ closeParen = 0;
+
+ break;
+
+ } else if (openParen > 0 && closeParen == 0 && name != null) {
+ // Scanning SchemeData
+ dataOffset = currentOffset;
+ currentOffset = scanData(data, schemeDataBuff,
+ endOffset, currentOffset);
+
+ if (currentOffset == dataOffset)
+ throw new InvalidXPointerException("InvalidSchemeDataInXPointer", data);
+
+ if (currentOffset < endOffset) {
+ ch = data.charAt(currentOffset);
+ } else {
+ ch = -1;
+ }
+
+ schemeData = schemeDataBuff.toString().intern();
+ addToken(tokens, Tokens.XPTRTOKEN_SCHEMEDATA);
+ tokens.addToken(schemeData);
+
+ // reset open/close paren for the next pointer part
+ openParen = 0;
+ schemeDataBuff.delete(0, schemeDataBuff.length());
+
+ } else {
+ // ex. schemeName()
+ // Should we throw an exception with a more suitable message instead??
+ return false;
+ }
+ }
+ } // end while
+ return true;
+ }
+
+ /**
+ * Scans a NCName.
+ * From Namespaces in XML
+ * [5] NCName ::= (Letter | '_') (NCNameChar)*
+ * [6] NCNameChar ::= Letter | Digit | '.' | '-' | '_' | CombiningChar | Extender
+ *
+ * @param data A String containing the XPointer expression
+ * @param endOffset The int XPointer expression length
+ * @param currentOffset An int representing the current position of the XPointer expression pointer
+ */
+ private static int scanNCName(String data, int endOffset, int currentOffset) {
+ int ch = data.charAt(currentOffset);
+ if (ch >= 0x80) {
+ if (!XMLChar.isNameStart(ch)) {
+ return currentOffset;
+ }
+ } else {
+ byte chartype = fASCIICharMap[ch];
+ if (chartype != CHARTYPE_LETTER
+ && chartype != CHARTYPE_UNDERSCORE) {
+ return currentOffset;
+ }
+ }
+
+ //while (currentOffset++ < endOffset) {
+ while (++currentOffset < endOffset) {
+ ch = data.charAt(currentOffset);
+ if (ch >= 0x80) {
+ if (!XMLChar.isName(ch)) {
+ break;
+ }
+ } else {
+ byte chartype = fASCIICharMap[ch];
+ if (chartype != CHARTYPE_LETTER
+ && chartype != CHARTYPE_DIGIT
+ && chartype != CHARTYPE_PERIOD
+ && chartype != CHARTYPE_MINUS
+ && chartype != CHARTYPE_UNDERSCORE) {
+ break;
+ }
+ }
+ }
+ return currentOffset;
+ }
+
+ /**
+ * Scans the SchemeData.
+ * [6] SchemeData ::= EscapedData*
+ * [7] EscapedData ::= NormalChar | '^(' | '^)' | '^^' | '(' SchemeData ')'
+ * [8] NormalChar ::= UnicodeChar - [()^]
+ * [9] UnicodeChar ::= [#x0-#x10FFFF]
+ *
+ */
+ private static int scanData(String data, StringBuffer schemeData,
+ int endOffset, int currentOffset) {
+ while (true) {
+
+ if (currentOffset == endOffset) {
+ break;
+ }
+
+ int ch = data.charAt(currentOffset);
+ byte chartype = (ch >= 0x80) ? CHARTYPE_NONASCII
+ : fASCIICharMap[ch];
+
+ if (chartype == CHARTYPE_OPEN_PAREN) {
+ schemeData.append(ch);
+ //schemeData.append(Tokens.XPTRTOKEN_OPEN_PAREN);
+ currentOffset = scanData(data, schemeData, endOffset,
+ ++currentOffset);
+ if (currentOffset == endOffset) {
+ return currentOffset;
+ }
+
+ ch = data.charAt(currentOffset);
+ chartype = (ch >= 0x80) ? CHARTYPE_NONASCII
+ : fASCIICharMap[ch];
+
+ if (chartype != CHARTYPE_CLOSE_PAREN) {
+ return endOffset;
+ }
+ schemeData.append((char) ch);
+ ++currentOffset;//
+
+ } else if (chartype == CHARTYPE_CLOSE_PAREN) {
+ return currentOffset;
+
+ } else if (chartype == CHARTYPE_CARRET) {
+ ch = data.charAt(++currentOffset);
+ chartype = (ch >= 0x80) ? CHARTYPE_NONASCII
+ : fASCIICharMap[ch];
+
+ if (chartype != CHARTYPE_CARRET
+ && chartype != CHARTYPE_OPEN_PAREN
+ && chartype != CHARTYPE_CLOSE_PAREN) {
+ break;
+ }
+ schemeData.append((char) ch);
+ ++currentOffset;
+
+ } else {
+ schemeData.append((char) ch);
+ ++currentOffset;//
+ }
+ }
+
+ return currentOffset;
+ }
+
+ //
+ // Protected methods
+ //
+
+ /**
+ * This method adds the specified token to the token list. By
+ * default, this method allows all tokens. However, subclasses
+ * of the XPathExprScanner can override this method in order
+ * to disallow certain tokens from being used in the scanned
+ * XPath expression. This is a convenient way of allowing only
+ * a subset of XPath.
+ */
+ protected static void addToken(Tokens tokens, int token) {
+ if (token == Tokens.XPTRTOKEN_OPEN_PAREN
+ || token == Tokens.XPTRTOKEN_CLOSE_PAREN
+ || token == Tokens.XPTRTOKEN_SCHEMENAME
+ || token == Tokens.XPTRTOKEN_SCHEMEDATA
+ || token == Tokens.XPTRTOKEN_SHORTHAND) {
+ tokens.addToken(token);
+ return;
+ }
+ throw new IllegalArgumentException("InvalidXPointerToken");
+ }
+
+ } // class Scanner
+}
Added: webservices/woden/trunk/java/woden-api/src/main/java/org/apache/woden/xpointer/XmlnsPointerPart.java
URL: http://svn.apache.org/viewvc/webservices/woden/trunk/java/woden-api/src/main/java/org/apache/woden/xpointer/XmlnsPointerPart.java?rev=809835&view=auto
==============================================================================
--- webservices/woden/trunk/java/woden-api/src/main/java/org/apache/woden/xpointer/XmlnsPointerPart.java (added)
+++ webservices/woden/trunk/java/woden-api/src/main/java/org/apache/woden/xpointer/XmlnsPointerPart.java Tue Sep 1 05:54:15 2009
@@ -0,0 +1,48 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.woden.xpointer;
+
+import org.apache.woden.types.NCName;
+
+/**
+ * Represents a fragment identifier conforming to the XML Pointer Language Framework.
+ *
+ * This class is based upon a class of the same name in the Apache Coccon.
+ *
+ * @author Dan Harvey (danharvey42@gmail.com)
+ */
+public class XmlnsPointerPart implements PointerPart {
+ private final NCName prefix;
+ private final String namespace;
+
+ public XmlnsPointerPart(NCName prefix, String namespace) {
+ if (prefix == null | namespace == null) {
+ throw new IllegalArgumentException();
+ }
+ this.prefix = prefix;
+ this.namespace = namespace;
+ }
+
+ public String toString() {
+ return "xmlns(" + prefix + "=" + namespace + ")";
+ }
+
+ public void prefixNamespaces(XPointer xpointer) {
+ //This PointerPart does not have any namespaces.
+ }
+}
Added: webservices/woden/trunk/java/woden-api/src/main/resources/org/apache/woden/about-this-package
URL: http://svn.apache.org/viewvc/webservices/woden/trunk/java/woden-api/src/main/resources/org/apache/woden/about-this-package?rev=809835&view=auto
==============================================================================
--- webservices/woden/trunk/java/woden-api/src/main/resources/org/apache/woden/about-this-package (added)
+++ webservices/woden/trunk/java/woden-api/src/main/resources/org/apache/woden/about-this-package Tue Sep 1 05:54:15 2009
@@ -0,0 +1,5 @@
+Interfaces for the main functional components of the Woden API,
+such as factories, readers, writers, extension registry.
+Initially these may be WSDL 2.0 specific in places, but eventually
+this package should probably be WSDL-version independent -
+i.e. the framework API that hides version specific interfaces.
\ No newline at end of file
---------------------------------------------------------------------
To unsubscribe, e-mail: woden-dev-unsubscribe@ws.apache.org
For additional commands, e-mail: woden-dev-help@ws.apache.org