You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ws.apache.org by dk...@apache.org on 2019/10/31 14:48:37 UTC

[ws-axiom] branch datatypes created (now bed05c6)

This is an automated email from the ASF dual-hosted git repository.

dkulp pushed a change to branch datatypes
in repository https://gitbox.apache.org/repos/asf/ws-axiom.git.


      at bed05c6  Fix SVN location in DOAP file.

This branch includes the following new commits:

     new 63b2601  Create development branch to implement a datatype library.
     new d63b90c  Initial datatype library code.
     new f61b55e  Simplify the handling of XSD datatypes with whiteSpace=collapse.
     new b6b20c1  Use the datatypes library to process boolean attributes in SOAP headers.
     new 51c4443  Add datatypes to code-coverage.
     new bdc830a  Merge latest changes from trunk.
     new c4de7e5  Complete the Javadoc of Temporal.
     new 9f2b5b6  Merge latest changes from trunk.
     new ec380fc  Merge latest changes from trunk.
     new 96c4257  Move API specific helpers to distinct packages for improved OSGi integration.
     new 016632f  Move API specific helpers to distinct packages for improved OSGi integration.
     new 1cb5c08  Merge latest changes from trunk.
     new 226091f  Update version.
     new 23df3a6  Use the isWhitespace method from XMLChar.
     new 786cd7e  Merge latest changes from trunk.
     new 9dbd4c2  Increase test coverage and add Javadoc.
     new 843e7c5  Correctly support xs:QName values with prefixes xml and xmlns.
     new 8c0abe6  Merge latest changes from trunk.
     new c05cc4a  Build test cases for XSQNameType that don't depend on DOMHelper.
     new 222d79d  Finalize the implementation of XSQNameType.
     new 2ddaa56  Use the datatypes library to manipulate SOAP fault codes.
     new 35eb756  Merge latest changes from trunk.
     new f4bf057  Simplify class hierarchy.
     new 8ccc9bb  Fix type parameter bound.
     new bed05c6  Fix SVN location in DOAP file.

The 25 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



[ws-axiom] 05/25: Add datatypes to code-coverage.

Posted by dk...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

dkulp pushed a commit to branch datatypes
in repository https://gitbox.apache.org/repos/asf/ws-axiom.git

commit 51c444328741937d27a3558266a8c8282679f9e0
Author: Andreas Veithen <ve...@apache.org>
AuthorDate: Tue Nov 17 19:55:09 2015 +0000

    Add datatypes to code-coverage.
---
 code-coverage/pom.xml | 19 +++++++++++++++++++
 1 file changed, 19 insertions(+)

diff --git a/code-coverage/pom.xml b/code-coverage/pom.xml
index 508b67a..8cd0fe1 100644
--- a/code-coverage/pom.xml
+++ b/code-coverage/pom.xml
@@ -66,6 +66,25 @@
         
         <dependency>
             <groupId>${project.groupId}</groupId>
+            <artifactId>datatypes</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>${project.groupId}</groupId>
+            <artifactId>datatypes</artifactId>
+            <version>${project.version}</version>
+            <classifier>sources</classifier>
+        </dependency>
+        <dependency>
+            <groupId>${project.groupId}</groupId>
+            <artifactId>datatypes</artifactId>
+            <version>${project.version}</version>
+            <classifier>jacoco</classifier>
+            <type>exec</type>
+        </dependency>
+        
+        <dependency>
+            <groupId>${project.groupId}</groupId>
             <artifactId>om-aspects</artifactId>
             <version>${project.version}</version>
         </dependency>


[ws-axiom] 20/25: Finalize the implementation of XSQNameType.

Posted by dk...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

dkulp pushed a commit to branch datatypes
in repository https://gitbox.apache.org/repos/asf/ws-axiom.git

commit 222d79d6f0d2e7bd406d8d1670e4d200205b9adc
Author: Andreas Veithen <ve...@apache.org>
AuthorDate: Sat Dec 5 10:30:33 2015 +0000

    Finalize the implementation of XSQNameType.
---
 .../org/apache/axiom/core/ContextAccessorImpl.java |  5 +++
 .../org/apache/axiom/datatype/ContextAccessor.java |  2 +
 .../datatype/helper/dom/DOMContextAccessor.java    |  5 +++
 .../apache/axiom/datatype/xsd/XSQNameTypeImpl.java | 17 +++++---
 .../axiom/datatype/xsd/MapContextAccessor.java     | 12 +++++-
 .../apache/axiom/datatype/xsd/XSQNameTypeTest.java | 45 ++++++++++++++++++++--
 6 files changed, 75 insertions(+), 11 deletions(-)

diff --git a/aspects/core-aspects/src/main/java/org/apache/axiom/core/ContextAccessorImpl.java b/aspects/core-aspects/src/main/java/org/apache/axiom/core/ContextAccessorImpl.java
index d28636b..32e9353 100644
--- a/aspects/core-aspects/src/main/java/org/apache/axiom/core/ContextAccessorImpl.java
+++ b/aspects/core-aspects/src/main/java/org/apache/axiom/core/ContextAccessorImpl.java
@@ -32,4 +32,9 @@ final class ContextAccessorImpl implements ContextAccessor<CoreElement,Semantics
     public String lookupPrefix(CoreElement element, Semantics semantics, String namespaceURI) {
         return element.coreLookupPrefix(namespaceURI, semantics);
     }
+
+    public void declareNamespace(CoreElement element, Semantics semantics, String prefix, String namespaceURI) {
+        // TODO
+        throw new UnsupportedOperationException();
+    }
 }
diff --git a/datatypes/src/main/java/org/apache/axiom/datatype/ContextAccessor.java b/datatypes/src/main/java/org/apache/axiom/datatype/ContextAccessor.java
index 4abd1fc..f66619d 100644
--- a/datatypes/src/main/java/org/apache/axiom/datatype/ContextAccessor.java
+++ b/datatypes/src/main/java/org/apache/axiom/datatype/ContextAccessor.java
@@ -39,4 +39,6 @@ public interface ContextAccessor<T,O> {
     String lookupNamespaceURI(T contextObject, O options, String prefix);
     
     String lookupPrefix(T contextObject, O options, String namespaceURI);
+    
+    void declareNamespace(T contextObject, O options, String prefix, String namespaceURI);
 }
diff --git a/datatypes/src/main/java/org/apache/axiom/datatype/helper/dom/DOMContextAccessor.java b/datatypes/src/main/java/org/apache/axiom/datatype/helper/dom/DOMContextAccessor.java
index 6ce6156..9ca5d04 100644
--- a/datatypes/src/main/java/org/apache/axiom/datatype/helper/dom/DOMContextAccessor.java
+++ b/datatypes/src/main/java/org/apache/axiom/datatype/helper/dom/DOMContextAccessor.java
@@ -36,4 +36,9 @@ final class DOMContextAccessor implements ContextAccessor<Element,Void> {
     public String lookupPrefix(Element element, Void options, String namespaceURI) {
         return element.lookupPrefix(namespaceURI.length() == 0 ? null : namespaceURI);
     }
+
+    public void declareNamespace(Element element, Void options, String prefix, String namespaceURI) {
+        // TODO
+        throw new UnsupportedOperationException();
+    }
 }
diff --git a/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSQNameTypeImpl.java b/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSQNameTypeImpl.java
index a192956..e896f97 100644
--- a/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSQNameTypeImpl.java
+++ b/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSQNameTypeImpl.java
@@ -26,6 +26,7 @@ import javax.xml.namespace.QName;
 import org.apache.axiom.datatype.ContextAccessor;
 import org.apache.axiom.datatype.TypeHelper;
 import org.apache.axiom.datatype.UnexpectedCharacterException;
+import org.apache.axiom.util.xml.NSUtils;
 
 final class XSQNameTypeImpl implements XSQNameType {
     public <S,O> QName parse(String literal, ContextAccessor<S,O> contextAccessor, S contextObject, O options)
@@ -69,12 +70,18 @@ final class XSQNameTypeImpl implements XSQNameType {
         String prefix = value.getPrefix();
         String namespaceURI = value.getNamespaceURI();
         if (!namespaceURI.equals(contextAccessor.lookupNamespaceURI(contextObject, options, prefix))) {
-            String existingPrefix = contextAccessor.lookupPrefix(contextObject, options, namespaceURI);
-            if (existingPrefix != null) {
-                prefix = existingPrefix;
+            if (namespaceURI.length() == 0) {
+                contextAccessor.declareNamespace(contextObject, options, "", "");
             } else {
-                // TODO
-                throw new RuntimeException();
+                if (prefix.length() == 0) {
+                    prefix = contextAccessor.lookupPrefix(contextObject, options, namespaceURI);
+                    if (prefix == null) {
+                        prefix = NSUtils.generatePrefix(namespaceURI);
+                        contextAccessor.declareNamespace(contextObject, options, prefix, namespaceURI);;
+                    }
+                } else {
+                    contextAccessor.declareNamespace(contextObject, options, prefix, namespaceURI);;
+                }
             }
         }
         if (prefix.length() == 0) {
diff --git a/datatypes/src/test/java/org/apache/axiom/datatype/xsd/MapContextAccessor.java b/datatypes/src/test/java/org/apache/axiom/datatype/xsd/MapContextAccessor.java
index a8c55bc..3b7a63b 100644
--- a/datatypes/src/test/java/org/apache/axiom/datatype/xsd/MapContextAccessor.java
+++ b/datatypes/src/test/java/org/apache/axiom/datatype/xsd/MapContextAccessor.java
@@ -36,7 +36,15 @@ public final class MapContextAccessor implements ContextAccessor<Map<String,Stri
     }
 
     public String lookupPrefix(Map<String,String> context, Void options, String namespaceURI) {
-        // TODO
-        throw new UnsupportedOperationException();
+        for (Map.Entry<String,String> entry : context.entrySet()) {
+            if (entry.getValue().equals(namespaceURI)) {
+                return entry.getKey();
+            }
+        }
+        return null;
+    }
+
+    public void declareNamespace(Map<String,String> context, Void options, String prefix, String namespaceURI) {
+        context.put(prefix, namespaceURI);
     }
 }
diff --git a/datatypes/src/test/java/org/apache/axiom/datatype/xsd/XSQNameTypeTest.java b/datatypes/src/test/java/org/apache/axiom/datatype/xsd/XSQNameTypeTest.java
index eb0ae7c..311b986 100644
--- a/datatypes/src/test/java/org/apache/axiom/datatype/xsd/XSQNameTypeTest.java
+++ b/datatypes/src/test/java/org/apache/axiom/datatype/xsd/XSQNameTypeTest.java
@@ -22,6 +22,8 @@ import static com.google.common.truth.Truth.assertThat;
 
 import java.text.ParseException;
 import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
 
 import javax.xml.XMLConstants;
 import javax.xml.namespace.QName;
@@ -30,7 +32,7 @@ import org.junit.Test;
 
 public class XSQNameTypeTest {
     @Test
-    public void testBoundPrefix() throws ParseException {
+    public void testParseWithBoundPrefix() throws ParseException {
         QName qname = XSQNameType.INSTANCE.parse("p:test", MapContextAccessor.INSTANCE,
                 Collections.singletonMap("p", "urn:test"), null);
         assertThat(qname.getNamespaceURI()).isEqualTo("urn:test");
@@ -39,13 +41,13 @@ public class XSQNameTypeTest {
     }
     
     @Test(expected=ParseException.class)
-    public void testUnboundPrefix() throws ParseException {
+    public void testParseWithUnboundPrefix() throws ParseException {
         XSQNameType.INSTANCE.parse("ns:test", MapContextAccessor.INSTANCE,
                 Collections.<String,String>emptyMap(), null);
     }
     
     @Test
-    public void testXmlPrefix() throws ParseException {
+    public void testParseWithXmlPrefix() throws ParseException {
         QName qname = XSQNameType.INSTANCE.parse("xml:value", MapContextAccessor.INSTANCE,
                 Collections.<String,String>emptyMap(), null);
         assertThat(qname.getNamespaceURI()).isEqualTo(XMLConstants.XML_NS_URI);
@@ -54,11 +56,46 @@ public class XSQNameTypeTest {
     }
     
     @Test
-    public void testXmlnsPrefix() throws ParseException {
+    public void testParseWithXmlnsPrefix() throws ParseException {
         QName qname = XSQNameType.INSTANCE.parse("xmlns:value", MapContextAccessor.INSTANCE,
                 Collections.<String,String>emptyMap(), null);
         assertThat(qname.getNamespaceURI()).isEqualTo(XMLConstants.XMLNS_ATTRIBUTE_NS_URI);
         assertThat(qname.getLocalPart()).isEqualTo("value");
         assertThat(qname.getPrefix()).isEqualTo(XMLConstants.XMLNS_ATTRIBUTE);
     }
+    
+    @Test
+    public void testFormatWithUnboundPrefix() {
+        Map<String,String> context = new HashMap<String,String>();
+        assertThat(XSQNameType.INSTANCE.format(new QName("urn:test", "test", "p"),
+                MapContextAccessor.INSTANCE, context, null)).isEqualTo("p:test");
+        assertThat(context).hasSize(1);
+        assertThat(context).containsEntry("p", "urn:test");
+    }
+    
+    @Test
+    public void testFormatWithExistingNamespace() {
+        assertThat(XSQNameType.INSTANCE.format(new QName("urn:test", "test"),
+                MapContextAccessor.INSTANCE, Collections.singletonMap("p", "urn:test"),
+                null)).isEqualTo("p:test");
+    }
+    
+    @Test
+    public void testFormatWithGeneratedPrefix() {
+        Map<String,String> context = new HashMap<String,String>();
+        String literal = XSQNameType.INSTANCE.format(new QName("urn:test", "test"),
+                MapContextAccessor.INSTANCE, context, null);
+        assertThat(context).hasSize(1);
+        Map.Entry<String,String> entry = context.entrySet().iterator().next();
+        assertThat(entry.getValue()).isEqualTo("urn:test");
+        assertThat(entry.getKey()).isNotEmpty();
+        assertThat(literal).isEqualTo(entry.getKey() + ":test");
+    }
+    
+    @Test
+    public void testFormatWithNoNamespace() {
+        assertThat(XSQNameType.INSTANCE.format(new QName("test"),
+                MapContextAccessor.INSTANCE, Collections.<String,String>emptyMap(),
+                null)).isEqualTo("test");
+    }
 }


[ws-axiom] 09/25: Merge latest changes from trunk.

Posted by dk...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

dkulp pushed a commit to branch datatypes
in repository https://gitbox.apache.org/repos/asf/ws-axiom.git

commit ec380fc2f6aca19d16eda6c326286b4138e618ba
Merge: 9f2b5b6 882432c
Author: Andreas Veithen <ve...@apache.org>
AuthorDate: Wed Nov 18 19:19:50 2015 +0000

    Merge latest changes from trunk.

 .../src/main/java/org/apache/axiom/soap/SOAPProcessingException.java  | 4 ++++
 1 file changed, 4 insertions(+)


[ws-axiom] 07/25: Complete the Javadoc of Temporal.

Posted by dk...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

dkulp pushed a commit to branch datatypes
in repository https://gitbox.apache.org/repos/asf/ws-axiom.git

commit c4de7e5dbdc9041f4ce347307745282ff9645bb6
Author: Andreas Veithen <ve...@apache.org>
AuthorDate: Tue Nov 17 22:56:15 2015 +0000

    Complete the Javadoc of Temporal.
---
 .../src/main/java/org/apache/axiom/datatype/xsd/Temporal.java  | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/datatypes/src/main/java/org/apache/axiom/datatype/xsd/Temporal.java b/datatypes/src/main/java/org/apache/axiom/datatype/xsd/Temporal.java
index 0d808f6..c971da9 100644
--- a/datatypes/src/main/java/org/apache/axiom/datatype/xsd/Temporal.java
+++ b/datatypes/src/main/java/org/apache/axiom/datatype/xsd/Temporal.java
@@ -21,13 +21,19 @@ package org.apache.axiom.datatype.xsd;
 import java.util.GregorianCalendar;
 import java.util.TimeZone;
 
+/**
+ * A temporal value. This is the base interface for {@link XSDate}, {@link XSTime} and
+ * {@link XSDateTime}.
+ */
 public interface Temporal {
     /**
+     * Convert this value to a calendar. For {@link XSDate} and {@link XSTime}, only the
+     * corresponding fields are filled in and all other fields are left unspecified.
      * 
      * @param defaultTimeZone
      *            the time zone to use if this temporal object has no time zone; may be
      *            <code>null</code>
-     * @return
+     * @return the calendar
      * @throws NoTimeZoneException
      *             if this temporal object doesn't have a time zone and no default time zone was
      *             specified
@@ -35,7 +41,7 @@ public interface Temporal {
     GregorianCalendar getCalendar(TimeZone defaultTimeZone);
     
     /**
-     * Determine if this temporal object has a time zone.
+     * Determine if this temporal value has a time zone.
      * 
      * @return <code>true</code> if the object has a time zone, <code>false</code> otherwise
      */


[ws-axiom] 01/25: Create development branch to implement a datatype library.

Posted by dk...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

dkulp pushed a commit to branch datatypes
in repository https://gitbox.apache.org/repos/asf/ws-axiom.git

commit 63b26019354fcb4b288baf37a42f3089576ec48c
Author: Andreas Veithen <ve...@apache.org>
AuthorDate: Sun Nov 15 19:27:25 2015 +0000

    Create development branch to implement a datatype library.


[ws-axiom] 08/25: Merge latest changes from trunk.

Posted by dk...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

dkulp pushed a commit to branch datatypes
in repository https://gitbox.apache.org/repos/asf/ws-axiom.git

commit 9f2b5b62526dd3402efad9f755038c14361badcf
Merge: c4de7e5 3a520ab
Author: Andreas Veithen <ve...@apache.org>
AuthorDate: Wed Nov 18 08:18:50 2015 +0000

    Merge latest changes from trunk.

 .../impl/common/AxiomSOAP11FaultCodeSupport.aj     | 28 +++++++++++++++++++++
 ...ort.aj => AxiomSOAP12FaultClassifierSupport.aj} | 21 ++++++++++++----
 .../axiom/soap/impl/common/SOAP12Factory.java      |  2 +-
 ...ubCode.java => AxiomSOAP12FaultClassifier.java} |  4 +--
 .../axiom/soap/impl/intf/AxiomSOAP12FaultCode.java |  2 +-
 .../soap/impl/intf/AxiomSOAP12FaultSubCode.java    |  2 +-
 .../axiom/soap/impl/dom/SOAPFaultCodeImpl.java     |  6 +----
 .../soap/impl/dom/soap11/SOAP11FaultCodeImpl.java  | 24 ------------------
 .../soap/impl/dom/soap12/SOAP12FaultCodeImpl.java  | 14 ++---------
 .../impl/dom/soap12/SOAP12FaultSubCodeImpl.java    | 16 ------------
 .../soap/impl/llom/soap11/SOAP11FaultCodeImpl.java | 29 ----------------------
 .../soap/impl/llom/soap12/SOAP12FaultCodeImpl.java | 14 -----------
 .../impl/llom/soap12/SOAP12FaultSubCodeImpl.java   | 16 ------------
 13 files changed, 52 insertions(+), 126 deletions(-)


[ws-axiom] 14/25: Use the isWhitespace method from XMLChar.

Posted by dk...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

dkulp pushed a commit to branch datatypes
in repository https://gitbox.apache.org/repos/asf/ws-axiom.git

commit 23df3a6dbf31224fb37fd232e2946d66028147b1
Author: Andreas Veithen <ve...@apache.org>
AuthorDate: Sun Nov 22 21:48:42 2015 +0000

    Use the isWhitespace method from XMLChar.
---
 datatypes/pom.xml                                       |  5 +++++
 .../main/java/org/apache/axiom/datatype/TypeHelper.java | 17 ++++-------------
 2 files changed, 9 insertions(+), 13 deletions(-)

diff --git a/datatypes/pom.xml b/datatypes/pom.xml
index d794f62..a931b19 100644
--- a/datatypes/pom.xml
+++ b/datatypes/pom.xml
@@ -34,6 +34,11 @@
 
     <dependencies>
         <dependency>
+            <groupId>${project.groupId}</groupId>
+            <artifactId>xml-utils</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
             <groupId>junit</groupId>
             <artifactId>junit</artifactId>
             <scope>test</scope>
diff --git a/datatypes/src/main/java/org/apache/axiom/datatype/TypeHelper.java b/datatypes/src/main/java/org/apache/axiom/datatype/TypeHelper.java
index 34b7d99..b9615b2 100644
--- a/datatypes/src/main/java/org/apache/axiom/datatype/TypeHelper.java
+++ b/datatypes/src/main/java/org/apache/axiom/datatype/TypeHelper.java
@@ -18,6 +18,8 @@
  */
 package org.apache.axiom.datatype;
 
+import static org.apache.axiom.util.xml.XMLChar.isWhitespace;
+
 /**
  * Contains utility methods for usage by {@link Type} implementations.
  */
@@ -25,17 +27,6 @@ public final class TypeHelper {
     private TypeHelper() {}
     
     /**
-     * Determine if the given character is whitespace according to the XML specification.
-     * 
-     * @param c
-     *            the character to examine
-     * @return {@code true} if the character is whitespace, {@code false} otherwise
-     */
-    public static boolean isWhitespace(char c) {
-        return c == ' ' || c == '\r' || c == '\n' || c == '\t';
-    }
-    
-    /**
      * Determine the index of the first non whitespace character in the given literal. This method
      * is intended for use in implementations of XSD datatypes for which the {@code whiteSpace}
      * facet is {@code collapse}.
@@ -52,7 +43,7 @@ public final class TypeHelper {
             throw new UnexpectedEndOfStringException(literal);
         }
         int start = 0;
-        while (TypeHelper.isWhitespace(literal.charAt(start))) {
+        while (isWhitespace(literal.charAt(start))) {
             if (++start == len) {
                 throw new UnexpectedEndOfStringException(literal);
             }
@@ -78,7 +69,7 @@ public final class TypeHelper {
             throw new UnexpectedEndOfStringException(literal);
         }
         int end = len;
-        while (TypeHelper.isWhitespace(literal.charAt(end-1))) {
+        while (isWhitespace(literal.charAt(end-1))) {
             if (--end == 0) {
                 throw new UnexpectedEndOfStringException(literal);
             }


[ws-axiom] 25/25: Fix SVN location in DOAP file.

Posted by dk...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

dkulp pushed a commit to branch datatypes
in repository https://gitbox.apache.org/repos/asf/ws-axiom.git

commit bed05c66054aecc7dee45fed5bab6c5d63530afa
Author: Andreas Veithen <ve...@apache.org>
AuthorDate: Sun Dec 6 14:05:17 2015 +0000

    Fix SVN location in DOAP file.
---
 etc/axiom.rdf | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/etc/axiom.rdf b/etc/axiom.rdf
index 8c01872..8cc1b4d 100644
--- a/etc/axiom.rdf
+++ b/etc/axiom.rdf
@@ -59,8 +59,8 @@
     <release><Version><name>Apache Axiom</name><created>2015-11-19</created><revision>1.2.16</revision></Version></release>
     <repository>
       <SVNRepository>
-        <location rdf:resource="http://svn.apache.org/repos/asf/webservices/commons/trunk/modules/axiom"/>
-        <browse rdf:resource="http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom"/>
+        <location rdf:resource="http://svn.apache.org/repos/asf/webservices/axiom/trunk"/>
+        <browse rdf:resource="http://svn.apache.org/viewvc/webservices/axiom/trunk"/>
       </SVNRepository>
     </repository>
     <maintainer>


[ws-axiom] 06/25: Merge latest changes from trunk.

Posted by dk...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

dkulp pushed a commit to branch datatypes
in repository https://gitbox.apache.org/repos/asf/ws-axiom.git

commit bdc830a0a8a738d70ebde07dea84597af0267adb
Merge: 51c4443 ad66650
Author: Andreas Veithen <ve...@apache.org>
AuthorDate: Tue Nov 17 20:17:06 2015 +0000

    Merge latest changes from trunk.

 .../java/org/apache/axiom/testing/multiton/Adapters.java |  2 +-
 .../java/org/apache/axiom/testing/multiton/Multiton.java |  8 ++++----
 .../java/org/apache/axiom/ts/soap/SOAPElementType.java   |  4 ++--
 .../main/java/org/apache/axiom/ts/soap/SOAPSample.java   |  2 +-
 .../src/main/java/org/apache/axiom/ts/soap/SOAPSpec.java | 16 ++++++++--------
 .../org/apache/axiom/testutils/InvocationCounter.java    |  6 +++---
 .../axiom/testutils/concurrent/ConcurrentTestUtils.java  |  6 ++----
 .../testutils/namespace/NamespaceContextTestUtils.java   |  4 ++--
 .../testutils/net/protocol/mem/DataSourceRegistry.java   |  2 +-
 .../stax/AttributeSortingXMLStreamReaderFilter.java      |  2 +-
 .../axiom/testutils/stax/XMLStreamReaderComparator.java  | 12 ++++++------
 .../org/apache/axiom/testutils/suite/MatrixTestCase.java |  2 +-
 .../axiom/testutils/suite/MatrixTestSuiteBuilder.java    |  2 +-
 .../net/protocol/mem/DataSourceRegistryTest.java         |  2 +-
 .../src/main/java/org/apache/axiom/ts/xml/XMLSample.java |  2 +-
 .../java/org/apache/axiom/truth/xml/DOMTraverser.java    |  4 ++--
 .../truth/xml/RedundantNamespaceDeclarationFilter.java   |  4 ++--
 .../java/org/apache/axiom/truth/xml/StAXTraverser.java   |  4 ++--
 .../main/java/org/apache/axiom/truth/xml/XMLSubject.java |  4 ++--
 19 files changed, 43 insertions(+), 45 deletions(-)


[ws-axiom] 04/25: Use the datatypes library to process boolean attributes in SOAP headers.

Posted by dk...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

dkulp pushed a commit to branch datatypes
in repository https://gitbox.apache.org/repos/asf/ws-axiom.git

commit b6b20c19f058c449595c53d28e13c0d615c766c2
Author: Andreas Veithen <ve...@apache.org>
AuthorDate: Tue Nov 17 19:45:12 2015 +0000

    Use the datatypes library to process boolean attributes in SOAP headers.
---
 .../impl/common/AxiomSOAPHeaderBlockSupport.aj     | 21 ++++----
 .../axiom/soap/impl/intf/SOAP11BooleanType.java    | 46 ++++++++++++++++
 .../apache/axiom/soap/impl/intf/SOAPHelper.java    | 50 +++++------------
 .../apache/axiom/datatype/xsd/XSBooleanType.java   | 25 +++++++++
 .../axiom/datatype/xsd/XSBooleanTypeImpl.java      | 62 ++++++++++++++++++++++
 5 files changed, 157 insertions(+), 47 deletions(-)

diff --git a/aspects/om-aspects/src/main/java/org/apache/axiom/soap/impl/common/AxiomSOAPHeaderBlockSupport.aj b/aspects/om-aspects/src/main/java/org/apache/axiom/soap/impl/common/AxiomSOAPHeaderBlockSupport.aj
index bd16428..16db7fb 100644
--- a/aspects/om-aspects/src/main/java/org/apache/axiom/soap/impl/common/AxiomSOAPHeaderBlockSupport.aj
+++ b/aspects/om-aspects/src/main/java/org/apache/axiom/soap/impl/common/AxiomSOAPHeaderBlockSupport.aj
@@ -18,6 +18,8 @@
  */
 package org.apache.axiom.soap.impl.common;
 
+import java.text.ParseException;
+
 import javax.xml.namespace.QName;
 
 import org.apache.axiom.core.ClonePolicy;
@@ -64,10 +66,9 @@ public aspect AxiomSOAPHeaderBlockSupport {
     private boolean AxiomSOAPHeaderBlock.getBooleanAttributeValue(String key, QName qname) {
         String literal = getAttributeValue(key, qname);
         if (literal != null) {
-            Boolean value = getSOAPHelper().parseBoolean(literal);
-            if (value != null) {
-                return value.booleanValue();
-            } else {
+            try {
+                return getSOAPHelper().getBooleanType().parse(literal);
+            } catch (ParseException ex) {
                 throw new SOAPProcessingException(
                         "Invalid value for attribute " + qname.getLocalPart() + " in header block " + getQName());
             }
@@ -82,17 +83,17 @@ public aspect AxiomSOAPHeaderBlockSupport {
     
     public final void AxiomSOAPHeaderBlock.setMustUnderstand(String mustUnderstand) throws SOAPProcessingException {
         SOAPHelper helper = getSOAPHelper();
-        Boolean value = helper.parseBoolean(mustUnderstand);
-        if (value != null) {
-            _setAttributeValue(helper.getMustUnderstandAttributeQName(), mustUnderstand);
-        } else {
+        try {
+            helper.getBooleanType().parse(mustUnderstand);
+        } catch (ParseException ex) {
             throw new SOAPProcessingException("Invalid value for mustUnderstand attribute");
         }
+        _setAttributeValue(helper.getMustUnderstandAttributeQName(), mustUnderstand);
     }
 
     public final void AxiomSOAPHeaderBlock.setMustUnderstand(boolean mustUnderstand) {
         SOAPHelper helper = getSOAPHelper();
-        _setAttributeValue(helper.getMustUnderstandAttributeQName(), helper.formatBoolean(mustUnderstand));
+        _setAttributeValue(helper.getMustUnderstandAttributeQName(), helper.getBooleanType().format(mustUnderstand));
     }
 
     public final String AxiomSOAPHeaderBlock.getRole() {
@@ -119,7 +120,7 @@ public aspect AxiomSOAPHeaderBlockSupport {
         if (attributeQName == null) {
             throw new UnsupportedOperationException("Not supported for " + helper.getSpecName());
         } else {
-            _setAttributeValue(attributeQName, helper.formatBoolean(relay));
+            _setAttributeValue(attributeQName, helper.getBooleanType().format(relay));
         }
     }
 
diff --git a/aspects/om-aspects/src/main/java/org/apache/axiom/soap/impl/intf/SOAP11BooleanType.java b/aspects/om-aspects/src/main/java/org/apache/axiom/soap/impl/intf/SOAP11BooleanType.java
new file mode 100644
index 0000000..c2b113f
--- /dev/null
+++ b/aspects/om-aspects/src/main/java/org/apache/axiom/soap/impl/intf/SOAP11BooleanType.java
@@ -0,0 +1,46 @@
+/*
+ * 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.axiom.soap.impl.intf;
+
+import java.text.ParseException;
+
+import org.apache.axiom.datatype.AbstractInvariantType;
+import org.apache.axiom.datatype.TypeHelper;
+
+final class SOAP11BooleanType extends AbstractInvariantType<Boolean> {
+    static final SOAP11BooleanType INSTANCE = new SOAP11BooleanType();
+    
+    private SOAP11BooleanType() {}
+    
+    public Boolean parse(String literal) throws ParseException {
+        int start = TypeHelper.getStartIndex(literal);
+        int end = TypeHelper.getEndIndex(literal);
+        if (end-start == 1) {
+            switch (literal.charAt(start)) {
+                case '0': return Boolean.FALSE;
+                case '1': return Boolean.TRUE;
+            }
+        }
+        throw new ParseException("Unexpected boolean literal", start);
+    }
+
+    public String format(Boolean value) {
+        return value ? "1" : "0";
+    }
+}
diff --git a/aspects/om-aspects/src/main/java/org/apache/axiom/soap/impl/intf/SOAPHelper.java b/aspects/om-aspects/src/main/java/org/apache/axiom/soap/impl/intf/SOAPHelper.java
index 90597b8..ebf9855 100644
--- a/aspects/om-aspects/src/main/java/org/apache/axiom/soap/impl/intf/SOAPHelper.java
+++ b/aspects/om-aspects/src/main/java/org/apache/axiom/soap/impl/intf/SOAPHelper.java
@@ -20,6 +20,8 @@ package org.apache.axiom.soap.impl.intf;
 
 import javax.xml.namespace.QName;
 
+import org.apache.axiom.datatype.InvariantType;
+import org.apache.axiom.datatype.xsd.XSBooleanType;
 import org.apache.axiom.om.OMMetaFactory;
 import org.apache.axiom.om.OMNamespace;
 import org.apache.axiom.om.impl.common.OMNamespaceImpl;
@@ -47,27 +49,12 @@ public abstract class SOAPHelper {
             AxiomSOAP11FaultReason.class,
             AxiomSOAP11FaultRole.class,
             AxiomSOAP11FaultDetail.class,
-            SOAP11Constants.ATTR_ACTOR, null) {
+            SOAP11Constants.ATTR_ACTOR, null,
+            SOAP11BooleanType.INSTANCE) {
         @Override
         public SOAPFactory getSOAPFactory(OMMetaFactory metaFactory) {
             return metaFactory.getSOAP11Factory();
         }
-
-        @Override
-        public Boolean parseBoolean(String literal) {
-            if (literal.equals("1")) {
-                return Boolean.TRUE;
-            } else if (literal.equals("0")) {
-                return Boolean.FALSE;
-            } else {
-                return null;
-            }
-        }
-
-        @Override
-        public String formatBoolean(boolean value) {
-            return value ? "1" : "0";
-        }
     };
     
     public static final SOAPHelper SOAP12 = new SOAPHelper(SOAP12Version.getSingleton(), "SOAP 1.2",
@@ -80,27 +67,12 @@ public abstract class SOAPHelper {
             AxiomSOAP12FaultReason.class,
             AxiomSOAP12FaultRole.class,
             AxiomSOAP12FaultDetail.class,
-            SOAP12Constants.SOAP_ROLE, SOAP12Constants.SOAP_RELAY) {
+            SOAP12Constants.SOAP_ROLE, SOAP12Constants.SOAP_RELAY,
+            XSBooleanType.INSTANCE) {
         @Override
         public SOAPFactory getSOAPFactory(OMMetaFactory metaFactory) {
             return metaFactory.getSOAP12Factory();
         }
-
-        @Override
-        public Boolean parseBoolean(String literal) {
-            if (literal.equals("true") || literal.equals("1")) {
-                return Boolean.TRUE;
-            } else if (literal.equals("false") || literal.equals("0")) {
-                return Boolean.FALSE;
-            } else {
-                return null;
-            }
-        }
-
-        @Override
-        public String formatBoolean(boolean value) {
-            return String.valueOf(value);
-        }
     };
     
     private final SOAPVersion version;
@@ -121,6 +93,7 @@ public abstract class SOAPHelper {
     private final QName mustUnderstandAttributeQName;
     private final QName roleAttributeQName;
     private final QName relayAttributeQName;
+    private final InvariantType<Boolean> booleanType;
     
     private SOAPHelper(SOAPVersion version, String specName,
             Class<? extends AxiomSOAPEnvelope> envelopeClass,
@@ -132,7 +105,8 @@ public abstract class SOAPHelper {
             Class<? extends AxiomSOAPFaultReason> faultReasonClass,
             Class<? extends AxiomSOAPFaultRole> faultRoleClass,
             Class<? extends AxiomSOAPFaultDetail> faultDetailClass,
-            String roleAttributeLocalName, String relayAttributeLocalName) {
+            String roleAttributeLocalName, String relayAttributeLocalName,
+            InvariantType<Boolean> booleanType) {
         this.version = version;
         namespace = new OMNamespaceImpl(version.getEnvelopeURI(),
                 SOAPConstants.SOAP_DEFAULT_NAMESPACE_PREFIX);
@@ -158,6 +132,7 @@ public abstract class SOAPHelper {
                 version.getEnvelopeURI(), roleAttributeLocalName, SOAPConstants.SOAP_DEFAULT_NAMESPACE_PREFIX);
         relayAttributeQName = relayAttributeLocalName == null ? null :
             new QName(version.getEnvelopeURI(), relayAttributeLocalName, SOAPConstants.SOAP_DEFAULT_NAMESPACE_PREFIX);
+        this.booleanType = booleanType;
     }
     
     public final SOAPVersion getVersion() {
@@ -254,6 +229,7 @@ public abstract class SOAPHelper {
         return relayAttributeQName;
     }
 
-    public abstract Boolean parseBoolean(String literal);
-    public abstract String formatBoolean(boolean value);
+    public InvariantType<Boolean> getBooleanType() {
+        return booleanType;
+    }
 }
diff --git a/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSBooleanType.java b/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSBooleanType.java
new file mode 100644
index 0000000..df66daf
--- /dev/null
+++ b/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSBooleanType.java
@@ -0,0 +1,25 @@
+/*
+ * 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.axiom.datatype.xsd;
+
+import org.apache.axiom.datatype.InvariantType;
+
+public interface XSBooleanType extends InvariantType<Boolean> {
+    XSBooleanType INSTANCE = new XSBooleanTypeImpl();
+}
diff --git a/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSBooleanTypeImpl.java b/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSBooleanTypeImpl.java
new file mode 100644
index 0000000..8912274
--- /dev/null
+++ b/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSBooleanTypeImpl.java
@@ -0,0 +1,62 @@
+/*
+ * 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.axiom.datatype.xsd;
+
+import java.text.ParseException;
+
+import org.apache.axiom.datatype.AbstractInvariantType;
+import org.apache.axiom.datatype.TypeHelper;
+
+final class XSBooleanTypeImpl extends AbstractInvariantType<Boolean> implements XSBooleanType {
+    private static boolean equals(String s1, int start, String s2) {
+        for (int i=0, len=s2.length(); i<len; i++) {
+            if (s1.charAt(start+i) != s2.charAt(i)) {
+                return false;
+            }
+        }
+        return true;
+    }
+    
+    public Boolean parse(String literal) throws ParseException {
+        int start = TypeHelper.getStartIndex(literal);
+        int end = TypeHelper.getEndIndex(literal);
+        switch (end-start) {
+            case 1:
+                switch (literal.charAt(start)) {
+                    case '0': return Boolean.FALSE;
+                    case '1': return Boolean.TRUE;
+                }
+                break;
+            case 4:
+                if (equals(literal, start, "true")) {
+                    return Boolean.TRUE;
+                }
+                break;
+            case 5:
+                if (equals(literal, start, "false")) {
+                    return Boolean.FALSE;
+                }
+        }
+        throw new ParseException("Unexpected boolean literal", start);
+    }
+
+    public String format(Boolean value) {
+        return value.toString();
+    }
+}


[ws-axiom] 22/25: Merge latest changes from trunk.

Posted by dk...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

dkulp pushed a commit to branch datatypes
in repository https://gitbox.apache.org/repos/asf/ws-axiom.git

commit 35eb75619a795fdf1ce05e344d42fd8847c02d31
Merge: 2ddaa56 9083b01
Author: Andreas Veithen <ve...@apache.org>
AuthorDate: Sun Dec 6 00:16:03 2015 +0000

    Merge latest changes from trunk.

 axiom-compat/pom.xml                               |   5 +-
 .../om/impl/jaxp/StreamSourceToOMResultTest.java   |   4 +-
 code-coverage/pom.xml                              |   8 --
 devguide/src/docbkx/devguide.xml                   |  37 ++++++-
 implementations/axiom-dom/pom.xml                  |   5 -
 implementations/axiom-impl/pom.xml                 |   5 -
 pom.xml                                            |  10 --
 systests/integration-tests/pom.xml                 | 111 --------------------
 .../om/impl/builder/JAXBCustomBuilderTest.java     | 114 ---------------------
 systests/osgi-tests/pom.xml                        |   2 +-
 systests/pom.xml                                   |   1 -
 testing/axiom-testsuite/pom.xml                    |  39 ++++---
 .../org/apache/axiom/ts/om/OMTestSuiteBuilder.java |  21 +++-
 .../ts/om}/builder/AttachmentUnmarshallerImpl.java |   2 +-
 .../axiom/ts/om}/builder/JAXBCustomBuilder.java    |   9 +-
 .../apache/axiom/ts/om}/builder/MyDocument.java    |   2 +-
 ...egisterCustomBuilderForPayloadJAXBTestCase.java |  64 ++++++++++++
 ...stRegisterCustomBuilderForPayloadJAXBPlain.java |  46 +++++++++
 ...rPayloadJAXBWithDataHandlerReaderExtension.java |  37 +++----
 ...RegisterCustomBuilderForPayloadJAXBWithXOP.java |  52 ++++++++++
 .../axiom/ts/om/container/OMElementExtractor.java  |   4 +-
 .../axiom/ts/om/document/TestGetSAXResult.java     |   4 +-
 .../axiom/ts/om/document/TestGetSAXResultJAXB.java |  24 +++--
 .../ts/om/document/TestGetSAXResultSAXParser.java  |  43 +++-----
 .../ts/om/document/TestGetSAXResultXMLBeans.java   |  26 +++--
 .../apache/axiom/ts/om/document}/jaxb/Order.java   |   2 +-
 .../axiom/ts/om/document}/jaxb/OrderItem.java      |   2 +-
 .../axiom/ts/om/document}/jaxb/package-info.java   |   2 +-
 .../element/TestGetSAXSourceIdentityTransform.java |   4 +-
 ...estGetSAXSourceIdentityTransformOnFragment.java |   4 +-
 .../axiom-testsuite/src/main}/xsd/order.xsd        |   2 +-
 testing/dom-testsuite/pom.xml                      |  17 +--
 .../apache/axiom/ts/dom/DOMTestSuiteBuilder.java   |   5 +-
 .../TestTransformerWithIdentityStylesheet.java     |   2 +-
 .../document/TestTransformerWithStylesheet.java    |   2 +-
 .../axiom/ts/dom/document/TransformerTestCase.java |   4 +-
 testing/{testutils => jaxp-testsuite}/pom.xml      |  45 ++++----
 .../apache/axiom/ts/jaxp/SAXImplementation.java    |  65 ++++++++++++
 .../apache/axiom/ts/jaxp}/XSLTImplementation.java  |  70 ++++++-------
 testing/pom.xml                                    |   1 +
 testing/testutils/pom.xml                          |  10 --
 41 files changed, 451 insertions(+), 461 deletions(-)



[ws-axiom] 02/25: Initial datatype library code.

Posted by dk...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

dkulp pushed a commit to branch datatypes
in repository https://gitbox.apache.org/repos/asf/ws-axiom.git

commit d63b90cdbe9f6955401712b1ea6f3b15babc584a
Author: Andreas Veithen <ve...@apache.org>
AuthorDate: Sun Nov 15 19:30:57 2015 +0000

    Initial datatype library code.
---
 aspects/core-aspects/pom.xml                       |   5 +
 .../org/apache/axiom/core/ContextAccessorImpl.java |  18 +-
 .../java/org/apache/axiom/core/CoreElement.java    |   5 +
 .../org/apache/axiom/core/CoreElementSupport.aj    |  17 ++
 aspects/fom-aspects/pom.xml                        |   5 +
 .../org/apache/axiom/fom/AbderaDateTimeMixin.aj    |  18 +-
 {aspects/core-aspects => datatypes}/pom.xml        |  35 ++-
 .../axiom/datatype/AbstractInvariantType.java      |  14 +-
 .../org/apache/axiom/datatype/ContextAccessor.java |   7 +-
 .../apache/axiom/datatype/DOMContextAccessor.java  |  21 +-
 .../java/org/apache/axiom/datatype/DOMHelper.java  |  19 +-
 .../org/apache/axiom/datatype/InvariantType.java   |   9 +-
 .../main/java/org/apache/axiom/datatype/Type.java  |   9 +-
 .../datatype/UnexpectedCharacterException.java     |  12 +-
 .../datatype/UnexpectedEndOfStringException.java   |  12 +-
 .../AbstractWhitespaceCollapsingInvariantType.java |  46 ++++
 .../axiom/datatype/xsd/NoTimeZoneException.java    |   6 +-
 .../apache/axiom/datatype/xsd/SimpleTimeZone.java  |  95 ++++++++
 .../org/apache/axiom/datatype/xsd/Temporal.java    |  26 ++-
 .../apache/axiom/datatype/xsd/TemporalImpl.java    |  68 ++++++
 .../apache/axiom/datatype/xsd/TemporalType.java    | 245 +++++++++++++++++++++
 .../java/org/apache/axiom/datatype/xsd/Util.java   |  10 +-
 .../java/org/apache/axiom/datatype/xsd/XSDate.java |   6 +-
 .../org/apache/axiom/datatype/xsd/XSDateImpl.java  | 106 +++++++++
 .../org/apache/axiom/datatype/xsd/XSDateTime.java  |  21 +-
 .../apache/axiom/datatype/xsd/XSDateTimeImpl.java  | 129 +++++++++++
 .../apache/axiom/datatype/xsd/XSDateTimeType.java  |   8 +-
 .../axiom/datatype/xsd/XSDateTimeTypeImpl.java     |  22 +-
 .../org/apache/axiom/datatype/xsd/XSDateType.java  |   8 +-
 .../apache/axiom/datatype/xsd/XSDateTypeImpl.java  |  21 +-
 .../org/apache/axiom/datatype/xsd/XSQNameType.java |  10 +-
 .../apache/axiom/datatype/xsd/XSQNameTypeImpl.java |  97 ++++++++
 .../apache/axiom/datatype/xsd/XSStringType.java    |   8 +-
 .../axiom/datatype/xsd/XSStringTypeImpl.java       |  16 +-
 .../java/org/apache/axiom/datatype/xsd/XSTime.java |   5 +-
 .../org/apache/axiom/datatype/xsd/XSTimeImpl.java  | 103 +++++++++
 .../org/apache/axiom/datatype/xsd/XSTimeType.java  |   8 +-
 .../apache/axiom/datatype/xsd/XSTimeTypeImpl.java  |  21 +-
 .../org/apache/axiom/datatype/DOMHelperTest.java   |  42 ++++
 .../axiom/datatype/xsd/XSDateTimeTypeTest.java     |  53 +++++
 implementations/pom.xml                            |   1 +
 pom.xml                                            |   1 +
 testing/soap-testsuite/pom.xml                     |   5 +
 .../axiom/ts/soap/ConvertedSOAPSampleContent.java  |  57 +++--
 44 files changed, 1336 insertions(+), 114 deletions(-)

diff --git a/aspects/core-aspects/pom.xml b/aspects/core-aspects/pom.xml
index a4c1348..afb0952 100644
--- a/aspects/core-aspects/pom.xml
+++ b/aspects/core-aspects/pom.xml
@@ -40,6 +40,11 @@
             <version>${project.version}</version>
         </dependency>
         <dependency>
+            <groupId>${project.groupId}</groupId>
+            <artifactId>datatypes</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
             <groupId>org.aspectj</groupId>
             <artifactId>aspectjrt</artifactId>
         </dependency>
diff --git a/testing/soap-testsuite/src/main/java/org/apache/axiom/ts/soap/TextTransformer.java b/aspects/core-aspects/src/main/java/org/apache/axiom/core/ContextAccessorImpl.java
similarity index 56%
copy from testing/soap-testsuite/src/main/java/org/apache/axiom/ts/soap/TextTransformer.java
copy to aspects/core-aspects/src/main/java/org/apache/axiom/core/ContextAccessorImpl.java
index 900ce36..d28636b 100644
--- a/testing/soap-testsuite/src/main/java/org/apache/axiom/ts/soap/TextTransformer.java
+++ b/aspects/core-aspects/src/main/java/org/apache/axiom/core/ContextAccessorImpl.java
@@ -16,8 +16,20 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.axiom.ts.soap;
+package org.apache.axiom.core;
 
-interface TextTransformer {
-    String transform(String in);
+import org.apache.axiom.datatype.ContextAccessor;
+
+final class ContextAccessorImpl implements ContextAccessor<CoreElement,Semantics> {
+    public static final ContextAccessorImpl INSTANCE = new ContextAccessorImpl();
+    
+    private ContextAccessorImpl() {}
+
+    public String lookupNamespaceURI(CoreElement element, Semantics semantics, String prefix) {
+        return element.coreLookupNamespaceURI(prefix, semantics);
+    }
+
+    public String lookupPrefix(CoreElement element, Semantics semantics, String namespaceURI) {
+        return element.coreLookupPrefix(namespaceURI, semantics);
+    }
 }
diff --git a/aspects/core-aspects/src/main/java/org/apache/axiom/core/CoreElement.java b/aspects/core-aspects/src/main/java/org/apache/axiom/core/CoreElement.java
index a5dd131..be5e79f 100644
--- a/aspects/core-aspects/src/main/java/org/apache/axiom/core/CoreElement.java
+++ b/aspects/core-aspects/src/main/java/org/apache/axiom/core/CoreElement.java
@@ -18,8 +18,11 @@
  */
 package org.apache.axiom.core;
 
+import java.text.ParseException;
 import java.util.Iterator;
 
+import org.apache.axiom.datatype.Type;
+
 public interface CoreElement extends CoreChildNode, CoreMixedContentContainer, CoreNamedNode, DeferringParentNode {
     /**
      * Get the first attribute of this element.
@@ -153,4 +156,6 @@ public interface CoreElement extends CoreChildNode, CoreMixedContentContainer, C
     // TODO: wrong Javadoc: null vs. empty string
     // TODO: we can support default namespaces!
     String coreLookupPrefix(String namespaceURI, Semantics semantics);
+    
+    <T> T coreGetValue(Type<T> type, Semantics semantics) throws ParseException;
 }
diff --git a/aspects/core-aspects/src/main/java/org/apache/axiom/core/CoreElementSupport.aj b/aspects/core-aspects/src/main/java/org/apache/axiom/core/CoreElementSupport.aj
index 2a271d2..e3e7f32 100644
--- a/aspects/core-aspects/src/main/java/org/apache/axiom/core/CoreElementSupport.aj
+++ b/aspects/core-aspects/src/main/java/org/apache/axiom/core/CoreElementSupport.aj
@@ -18,8 +18,11 @@
  */
 package org.apache.axiom.core;
 
+import java.text.ParseException;
 import java.util.Iterator;
 
+import org.apache.axiom.datatype.Type;
+
 public aspect CoreElementSupport {
     private CoreAttribute CoreElement.firstAttribute;
 
@@ -220,4 +223,18 @@ public aspect CoreElementSupport {
     // This is basically a hook for OMSourcedElement
     public <T> void CoreElement.initSource(ClonePolicy<T> policy, T options, CoreElement other) {
     }
+    
+    public final <T> T CoreElement.coreGetValue(Type<T> type, Semantics semantics) throws ParseException {
+        Object characterData = coreGetCharacterData(ElementAction.RETURN_NULL);
+        if (characterData == null) {
+            throw new ParseException("Element has mixed content", 0);
+        } else {
+            return type.parse(characterData.toString(), ContextAccessorImpl.INSTANCE, this, semantics);
+        }
+    }
+    
+    public final <T> void CoreElement.coreSetValue(Type<T> type, T value, Semantics semantics) {
+        // TODO: actually set value
+        type.format(value, ContextAccessorImpl.INSTANCE, this, semantics);
+    }
 }
diff --git a/aspects/fom-aspects/pom.xml b/aspects/fom-aspects/pom.xml
index 3a66c31..e2b467c 100644
--- a/aspects/fom-aspects/pom.xml
+++ b/aspects/fom-aspects/pom.xml
@@ -43,6 +43,11 @@
             <version>${project.version}</version>
         </dependency>
         <dependency>
+            <groupId>${project.groupId}</groupId>
+            <artifactId>datatypes</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
             <groupId>org.aspectj</groupId>
             <artifactId>aspectjrt</artifactId>
         </dependency>
diff --git a/aspects/fom-aspects/src/main/java/org/apache/axiom/fom/AbderaDateTimeMixin.aj b/aspects/fom-aspects/src/main/java/org/apache/axiom/fom/AbderaDateTimeMixin.aj
index 9bf2142..fb75b3b 100644
--- a/aspects/fom-aspects/src/main/java/org/apache/axiom/fom/AbderaDateTimeMixin.aj
+++ b/aspects/fom-aspects/src/main/java/org/apache/axiom/fom/AbderaDateTimeMixin.aj
@@ -17,19 +17,35 @@
  */
 package org.apache.axiom.fom;
 
+import java.text.ParseException;
 import java.util.Calendar;
 import java.util.Date;
 
 import org.apache.abdera.model.AtomDate;
 import org.apache.abdera.model.DateTime;
+import org.apache.axiom.datatype.xsd.XSDateTime;
+import org.apache.axiom.datatype.xsd.XSDateTimeType;
 import org.apache.axiom.fom.AbderaDateTime;
 
 public aspect AbderaDateTimeMixin {
     private AtomDate AbderaDateTime.value;
 
+    private XSDateTime AbderaDateTime.getXSDateTime() {
+        XSDateTime dateTime;
+        try {
+            dateTime = coreGetValue(XSDateTimeType.INSTANCE, FOMSemantics.INSTANCE);
+        } catch (ParseException ex) {
+            throw new IllegalArgumentException("Invalid Date Format", ex);
+        }
+        if (!dateTime.hasTimeZone()) {
+            throw new IllegalArgumentException("Not a valid RFC3339 date/time value: no time zone");
+        }
+        return dateTime;
+    }
+    
     public final AtomDate AbderaDateTime.getValue() {
         if (value == null) {
-            value = AtomDate.valueOf(getText());
+            value = new AtomDate(getXSDateTime().getDate(null));
         }
         return value;
     }
diff --git a/aspects/core-aspects/pom.xml b/datatypes/pom.xml
similarity index 61%
copy from aspects/core-aspects/pom.xml
copy to datatypes/pom.xml
index a4c1348..9111070 100644
--- a/aspects/core-aspects/pom.xml
+++ b/datatypes/pom.xml
@@ -17,31 +17,46 @@
   ~ specific language governing permissions and limitations
   ~ under the License.
   -->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
     <modelVersion>4.0.0</modelVersion>
 
     <parent>
         <groupId>org.apache.ws.commons.axiom</groupId>
-        <artifactId>aspects</artifactId>
+        <artifactId>axiom</artifactId>
         <version>1.2.16-SNAPSHOT</version>
     </parent>
 
-    <artifactId>core-aspects</artifactId>
+    <artifactId>datatypes</artifactId>
     <packaging>bundle</packaging>
 
-    <name>Core Aspects</name>
     <url>http://ws.apache.org/axiom/</url>
 
     <dependencies>
         <dependency>
-            <!-- This dependency will eventually go away -->
-            <groupId>${project.groupId}</groupId>
-            <artifactId>axiom-api</artifactId>
-            <version>${project.version}</version>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <scope>test</scope>
         </dependency>
         <dependency>
-            <groupId>org.aspectj</groupId>
-            <artifactId>aspectjrt</artifactId>
+            <groupId>com.google.truth</groupId>
+            <artifactId>truth</artifactId>
+            <scope>test</scope>
         </dependency>
     </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <extensions>true</extensions>
+                <configuration>
+                    <instructions>
+                        <Export-Package>*;-noimport:=true</Export-Package>
+                    </instructions>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
 </project>
diff --git a/testing/soap-testsuite/src/main/java/org/apache/axiom/ts/soap/TextTransformer.java b/datatypes/src/main/java/org/apache/axiom/datatype/AbstractInvariantType.java
similarity index 63%
copy from testing/soap-testsuite/src/main/java/org/apache/axiom/ts/soap/TextTransformer.java
copy to datatypes/src/main/java/org/apache/axiom/datatype/AbstractInvariantType.java
index 900ce36..30a4a97 100644
--- a/testing/soap-testsuite/src/main/java/org/apache/axiom/ts/soap/TextTransformer.java
+++ b/datatypes/src/main/java/org/apache/axiom/datatype/AbstractInvariantType.java
@@ -16,8 +16,16 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.axiom.ts.soap;
+package org.apache.axiom.datatype;
 
-interface TextTransformer {
-    String transform(String in);
+import java.text.ParseException;
+
+public abstract class AbstractInvariantType<T> implements InvariantType<T> {
+    public final <S,O> T parse(String literal, ContextAccessor<S,O> contextAccessor, S contextObject, O options) throws ParseException {
+        return parse(literal);
+    }
+
+    public final <S,O> String format(T value, ContextAccessor<S,O> contextAccessor, S contextObject, O options) {
+        return format(value);
+    }
 }
diff --git a/testing/soap-testsuite/src/main/java/org/apache/axiom/ts/soap/TextTransformer.java b/datatypes/src/main/java/org/apache/axiom/datatype/ContextAccessor.java
similarity index 78%
copy from testing/soap-testsuite/src/main/java/org/apache/axiom/ts/soap/TextTransformer.java
copy to datatypes/src/main/java/org/apache/axiom/datatype/ContextAccessor.java
index 900ce36..a384eb0 100644
--- a/testing/soap-testsuite/src/main/java/org/apache/axiom/ts/soap/TextTransformer.java
+++ b/datatypes/src/main/java/org/apache/axiom/datatype/ContextAccessor.java
@@ -16,8 +16,9 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.axiom.ts.soap;
+package org.apache.axiom.datatype;
 
-interface TextTransformer {
-    String transform(String in);
+public interface ContextAccessor<T,O> {
+    String lookupNamespaceURI(T contextObject, O options, String prefix);
+    String lookupPrefix(T contextObject, O options, String namespaceURI);
 }
diff --git a/testing/soap-testsuite/src/main/java/org/apache/axiom/ts/soap/TextTransformer.java b/datatypes/src/main/java/org/apache/axiom/datatype/DOMContextAccessor.java
similarity index 52%
copy from testing/soap-testsuite/src/main/java/org/apache/axiom/ts/soap/TextTransformer.java
copy to datatypes/src/main/java/org/apache/axiom/datatype/DOMContextAccessor.java
index 900ce36..fc3ed9f 100644
--- a/testing/soap-testsuite/src/main/java/org/apache/axiom/ts/soap/TextTransformer.java
+++ b/datatypes/src/main/java/org/apache/axiom/datatype/DOMContextAccessor.java
@@ -16,8 +16,23 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.axiom.ts.soap;
+package org.apache.axiom.datatype;
 
-interface TextTransformer {
-    String transform(String in);
+import org.w3c.dom.Element;
+
+final class DOMContextAccessor implements ContextAccessor<Element,Void> {
+    static final DOMContextAccessor INSTANCE = new DOMContextAccessor();
+
+    public String lookupNamespaceURI(Element element, Void options, String prefix) {
+        String namespaceURI = element.lookupNamespaceURI(prefix.length() == 0 ? null : prefix);
+        if (namespaceURI != null) {
+            return namespaceURI;
+        } else {
+            return prefix.length() == 0 ? "" : null;
+        }
+    }
+
+    public String lookupPrefix(Element element, Void options, String namespaceURI) {
+        return element.lookupPrefix(namespaceURI.length() == 0 ? null : namespaceURI);
+    }
 }
diff --git a/testing/soap-testsuite/src/main/java/org/apache/axiom/ts/soap/TextTransformer.java b/datatypes/src/main/java/org/apache/axiom/datatype/DOMHelper.java
similarity index 55%
copy from testing/soap-testsuite/src/main/java/org/apache/axiom/ts/soap/TextTransformer.java
copy to datatypes/src/main/java/org/apache/axiom/datatype/DOMHelper.java
index 900ce36..46f13cc 100644
--- a/testing/soap-testsuite/src/main/java/org/apache/axiom/ts/soap/TextTransformer.java
+++ b/datatypes/src/main/java/org/apache/axiom/datatype/DOMHelper.java
@@ -16,8 +16,21 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.axiom.ts.soap;
+package org.apache.axiom.datatype;
 
-interface TextTransformer {
-    String transform(String in);
+import java.text.ParseException;
+
+import org.w3c.dom.Element;
+
+public final class DOMHelper {
+    private DOMHelper() {}
+    
+    public static <T> T getValue(Element element, Type<T> type) throws ParseException {
+        // TODO: using getTextContent here is actually incorrect because it extracts text recursively
+        return type.parse(element.getTextContent(), DOMContextAccessor.INSTANCE, element, null);
+    }
+    
+    public static <T> void setValue(Element element, Type<T> type, T value) {
+        element.setTextContent(type.format(value, DOMContextAccessor.INSTANCE, element, null));
+    }
 }
diff --git a/testing/soap-testsuite/src/main/java/org/apache/axiom/ts/soap/TextTransformer.java b/datatypes/src/main/java/org/apache/axiom/datatype/InvariantType.java
similarity index 80%
copy from testing/soap-testsuite/src/main/java/org/apache/axiom/ts/soap/TextTransformer.java
copy to datatypes/src/main/java/org/apache/axiom/datatype/InvariantType.java
index 900ce36..88faefe 100644
--- a/testing/soap-testsuite/src/main/java/org/apache/axiom/ts/soap/TextTransformer.java
+++ b/datatypes/src/main/java/org/apache/axiom/datatype/InvariantType.java
@@ -16,8 +16,11 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.axiom.ts.soap;
+package org.apache.axiom.datatype;
 
-interface TextTransformer {
-    String transform(String in);
+import java.text.ParseException;
+
+public interface InvariantType<T> extends Type<T> {
+    T parse(String literal) throws ParseException;
+    String format(T value);
 }
diff --git a/testing/soap-testsuite/src/main/java/org/apache/axiom/ts/soap/TextTransformer.java b/datatypes/src/main/java/org/apache/axiom/datatype/Type.java
similarity index 71%
copy from testing/soap-testsuite/src/main/java/org/apache/axiom/ts/soap/TextTransformer.java
copy to datatypes/src/main/java/org/apache/axiom/datatype/Type.java
index 900ce36..b5351b8 100644
--- a/testing/soap-testsuite/src/main/java/org/apache/axiom/ts/soap/TextTransformer.java
+++ b/datatypes/src/main/java/org/apache/axiom/datatype/Type.java
@@ -16,8 +16,11 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.axiom.ts.soap;
+package org.apache.axiom.datatype;
 
-interface TextTransformer {
-    String transform(String in);
+import java.text.ParseException;
+
+public interface Type<T> {
+    <S,O> T parse(String literal, ContextAccessor<S,O> contextAccessor, S contextObject, O options) throws ParseException;
+    <S,O> String format(T value, ContextAccessor<S,O> contextAccessor, S contextObject, O options);
 }
diff --git a/testing/soap-testsuite/src/main/java/org/apache/axiom/ts/soap/TextTransformer.java b/datatypes/src/main/java/org/apache/axiom/datatype/UnexpectedCharacterException.java
similarity index 69%
copy from testing/soap-testsuite/src/main/java/org/apache/axiom/ts/soap/TextTransformer.java
copy to datatypes/src/main/java/org/apache/axiom/datatype/UnexpectedCharacterException.java
index 900ce36..ac03ac4 100644
--- a/testing/soap-testsuite/src/main/java/org/apache/axiom/ts/soap/TextTransformer.java
+++ b/datatypes/src/main/java/org/apache/axiom/datatype/UnexpectedCharacterException.java
@@ -16,8 +16,14 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.axiom.ts.soap;
+package org.apache.axiom.datatype;
 
-interface TextTransformer {
-    String transform(String in);
+import java.text.ParseException;
+
+public class UnexpectedCharacterException extends ParseException {
+    private static final long serialVersionUID = 1L;
+
+    public UnexpectedCharacterException(String literal, int errorOffset) {
+        super("Unexpected character '" + literal.charAt(errorOffset) + "'", errorOffset);
+    }
 }
diff --git a/testing/soap-testsuite/src/main/java/org/apache/axiom/ts/soap/TextTransformer.java b/datatypes/src/main/java/org/apache/axiom/datatype/UnexpectedEndOfStringException.java
similarity index 71%
copy from testing/soap-testsuite/src/main/java/org/apache/axiom/ts/soap/TextTransformer.java
copy to datatypes/src/main/java/org/apache/axiom/datatype/UnexpectedEndOfStringException.java
index 900ce36..879f78d 100644
--- a/testing/soap-testsuite/src/main/java/org/apache/axiom/ts/soap/TextTransformer.java
+++ b/datatypes/src/main/java/org/apache/axiom/datatype/UnexpectedEndOfStringException.java
@@ -16,8 +16,14 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.axiom.ts.soap;
+package org.apache.axiom.datatype;
 
-interface TextTransformer {
-    String transform(String in);
+import java.text.ParseException;
+
+public class UnexpectedEndOfStringException extends ParseException {
+    private static final long serialVersionUID = 1L;
+
+    public UnexpectedEndOfStringException(String literal) {
+        super("Unexpected end of string", literal.length());
+    }
 }
diff --git a/datatypes/src/main/java/org/apache/axiom/datatype/xsd/AbstractWhitespaceCollapsingInvariantType.java b/datatypes/src/main/java/org/apache/axiom/datatype/xsd/AbstractWhitespaceCollapsingInvariantType.java
new file mode 100644
index 0000000..03cd2d8
--- /dev/null
+++ b/datatypes/src/main/java/org/apache/axiom/datatype/xsd/AbstractWhitespaceCollapsingInvariantType.java
@@ -0,0 +1,46 @@
+/*
+ * 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.axiom.datatype.xsd;
+
+import java.text.ParseException;
+
+import org.apache.axiom.datatype.AbstractInvariantType;
+import org.apache.axiom.datatype.UnexpectedEndOfStringException;
+
+abstract class AbstractWhitespaceCollapsingInvariantType<T> extends AbstractInvariantType<T> {
+    public final T parse(String literal) throws ParseException {
+        final int len = literal.length();
+        if (len == 0) {
+            throw new UnexpectedEndOfStringException(literal);
+        }
+        int begin = 0;
+        while (Util.isWhitespace(literal.charAt(begin))) {
+            if (++begin == len) {
+                throw new UnexpectedEndOfStringException(literal);
+            }
+        }
+        int end = len;
+        while (Util.isWhitespace(literal.charAt(end-1))) {
+            end--;
+        }
+        return parse(literal, begin, end);
+    }
+    
+    protected abstract T parse(String literal, int begin, int end) throws ParseException;
+}
diff --git a/testing/soap-testsuite/src/main/java/org/apache/axiom/ts/soap/TextTransformer.java b/datatypes/src/main/java/org/apache/axiom/datatype/xsd/NoTimeZoneException.java
similarity index 84%
copy from testing/soap-testsuite/src/main/java/org/apache/axiom/ts/soap/TextTransformer.java
copy to datatypes/src/main/java/org/apache/axiom/datatype/xsd/NoTimeZoneException.java
index 900ce36..12d1d69 100644
--- a/testing/soap-testsuite/src/main/java/org/apache/axiom/ts/soap/TextTransformer.java
+++ b/datatypes/src/main/java/org/apache/axiom/datatype/xsd/NoTimeZoneException.java
@@ -16,8 +16,8 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.axiom.ts.soap;
+package org.apache.axiom.datatype.xsd;
 
-interface TextTransformer {
-    String transform(String in);
+public class NoTimeZoneException extends RuntimeException {
+    private static final long serialVersionUID = 1L;
 }
diff --git a/datatypes/src/main/java/org/apache/axiom/datatype/xsd/SimpleTimeZone.java b/datatypes/src/main/java/org/apache/axiom/datatype/xsd/SimpleTimeZone.java
new file mode 100644
index 0000000..28dd8bd
--- /dev/null
+++ b/datatypes/src/main/java/org/apache/axiom/datatype/xsd/SimpleTimeZone.java
@@ -0,0 +1,95 @@
+/*
+ * 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.axiom.datatype.xsd;
+
+import java.util.Date;
+import java.util.TimeZone;
+
+final class SimpleTimeZone extends TimeZone {
+    private static final long serialVersionUID = 1L;
+
+    private static final SimpleTimeZone[] instances;
+    
+    static {
+        instances = new SimpleTimeZone[57];
+        for (int i=0; i<instances.length; i++) {
+            instances[i] = new SimpleTimeZone(30*(-28 + i));
+        }
+    }
+    
+    private final int delta;
+    
+    SimpleTimeZone(int delta) {
+        this.delta = delta;
+        if (delta == 0) {
+            super.setID("GMT");
+        } else {
+            StringBuilder buffer = new StringBuilder("GMT");
+            buffer.append(delta < 0 ? '-' : '+');
+            delta = Math.abs(delta);
+            append2Digits(buffer, delta/60);
+            buffer.append(':');
+            append2Digits(buffer, delta % 60);
+            super.setID(buffer.toString());
+        }
+    }
+
+    private static void append2Digits(StringBuilder buffer, int value) {
+        buffer.append((char)('0' + value/10));
+        buffer.append((char)('0' + value%10));
+    }
+    
+    static SimpleTimeZone getInstance(int delta) {
+        return delta % 30 == 0 ? instances[delta/30 + 28] : new SimpleTimeZone(delta);
+    }
+    
+    @Override
+    public int getOffset(int era, int year, int month, int day, int dayOfWeek, int milliseconds) {
+        return getRawOffset();
+    }
+
+    @Override
+    public void setRawOffset(int offsetMillis) {
+        if (getRawOffset() != offsetMillis) {
+            throw new UnsupportedOperationException("Immutable time zone object");
+        }
+    }
+
+    @Override
+    public int getRawOffset() {
+        return delta * 60000;
+    }
+
+    @Override
+    public boolean useDaylightTime() {
+        return false;
+    }
+
+    @Override
+    public boolean inDaylightTime(Date date) {
+        return false;
+    }
+
+    @Override
+    public void setID(String ID) {
+        if (!getID().equals(ID)) {
+            throw new UnsupportedOperationException("Immutable time zone object");
+        }
+    }
+}
diff --git a/testing/soap-testsuite/src/main/java/org/apache/axiom/ts/soap/TextTransformer.java b/datatypes/src/main/java/org/apache/axiom/datatype/xsd/Temporal.java
similarity index 51%
copy from testing/soap-testsuite/src/main/java/org/apache/axiom/ts/soap/TextTransformer.java
copy to datatypes/src/main/java/org/apache/axiom/datatype/xsd/Temporal.java
index 900ce36..0d808f6 100644
--- a/testing/soap-testsuite/src/main/java/org/apache/axiom/ts/soap/TextTransformer.java
+++ b/datatypes/src/main/java/org/apache/axiom/datatype/xsd/Temporal.java
@@ -16,8 +16,28 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.axiom.ts.soap;
+package org.apache.axiom.datatype.xsd;
 
-interface TextTransformer {
-    String transform(String in);
+import java.util.GregorianCalendar;
+import java.util.TimeZone;
+
+public interface Temporal {
+    /**
+     * 
+     * @param defaultTimeZone
+     *            the time zone to use if this temporal object has no time zone; may be
+     *            <code>null</code>
+     * @return
+     * @throws NoTimeZoneException
+     *             if this temporal object doesn't have a time zone and no default time zone was
+     *             specified
+     */
+    GregorianCalendar getCalendar(TimeZone defaultTimeZone);
+    
+    /**
+     * Determine if this temporal object has a time zone.
+     * 
+     * @return <code>true</code> if the object has a time zone, <code>false</code> otherwise
+     */
+    boolean hasTimeZone();
 }
diff --git a/datatypes/src/main/java/org/apache/axiom/datatype/xsd/TemporalImpl.java b/datatypes/src/main/java/org/apache/axiom/datatype/xsd/TemporalImpl.java
new file mode 100644
index 0000000..5e381c2
--- /dev/null
+++ b/datatypes/src/main/java/org/apache/axiom/datatype/xsd/TemporalImpl.java
@@ -0,0 +1,68 @@
+/*
+ * 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.axiom.datatype.xsd;
+
+import java.util.GregorianCalendar;
+import java.util.TimeZone;
+
+abstract class TemporalImpl implements Temporal {
+    abstract boolean hasDatePart();
+    abstract boolean hasTimePart();
+    abstract boolean isBC();
+    abstract String getAeon();
+    abstract int getYear();
+    abstract int getMonth();
+    abstract int getDay();
+    abstract int getHour();
+    abstract int getMinute();
+    abstract int getSecond();
+    abstract int getNanoSecond();
+    abstract SimpleTimeZone getTimeZone();
+    abstract String getNanoSecondFraction();
+    
+    public final GregorianCalendar getCalendar(TimeZone defaultTimeZone) {
+        // TODO: check aeon
+        TimeZone timeZone = getTimeZone();
+        if (timeZone == null) {
+            if (defaultTimeZone == null) {
+                throw new NoTimeZoneException();
+            }
+            timeZone = defaultTimeZone;
+        }
+        GregorianCalendar calendar = new GregorianCalendar(timeZone);
+        if (hasDatePart()) {
+            // TODO: BC
+            // TODO: throw exception if aeon is not null
+            calendar.set(GregorianCalendar.YEAR, getYear());
+            calendar.set(GregorianCalendar.MONTH, getMonth()-1);
+            calendar.set(GregorianCalendar.DAY_OF_MONTH, getDay());
+        }
+        if (hasTimePart()) {
+            calendar.set(GregorianCalendar.HOUR_OF_DAY, getHour());
+            calendar.set(GregorianCalendar.MINUTE, getMinute());
+            calendar.set(GregorianCalendar.SECOND, getSecond());
+            calendar.set(GregorianCalendar.MILLISECOND, getNanoSecond()/1000000);
+        }
+        return calendar;
+    }
+    
+    public boolean hasTimeZone() {
+        return getTimeZone() != null;
+    }
+}
diff --git a/datatypes/src/main/java/org/apache/axiom/datatype/xsd/TemporalType.java b/datatypes/src/main/java/org/apache/axiom/datatype/xsd/TemporalType.java
new file mode 100644
index 0000000..342a449
--- /dev/null
+++ b/datatypes/src/main/java/org/apache/axiom/datatype/xsd/TemporalType.java
@@ -0,0 +1,245 @@
+/*
+ * 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.axiom.datatype.xsd;
+
+import java.text.ParseException;
+
+import org.apache.axiom.datatype.UnexpectedCharacterException;
+import org.apache.axiom.datatype.UnexpectedEndOfStringException;
+
+abstract class TemporalType<T> extends AbstractWhitespaceCollapsingInvariantType<T> {
+    abstract boolean hasDatePart();
+    abstract boolean hasTimePart();
+    abstract T createInstance(boolean bc, String aeon, int year, int month, int day, int hour,
+            int minute, int second, int nanoSecond, String nanoSecondFraction,
+            SimpleTimeZone timeZone);
+    
+    @Override
+    protected final T parse(String literal, int begin, int end) throws ParseException {
+        int index = begin;
+        boolean bc;
+        String aeon;
+        int year;
+        int month;
+        int day;
+        if (hasDatePart()) {
+            if (literal.charAt(0) == '-') {
+                bc = true;
+                index++;
+            } else {
+                bc = false;
+            }
+            {
+                int digits = countDigits(literal, index, "-", false);
+                if (digits < 4) {
+                    throw new UnexpectedCharacterException(literal, index+digits);
+                }
+                if (digits > 4 && literal.charAt(index) == '0') {
+                    throw new UnexpectedCharacterException(literal, index);
+                }
+                if (digits > 9) {
+                    aeon = literal.substring(index, index+digits-9);
+                    index += digits-9;
+                    digits = 9;
+                } else {
+                    aeon = null;
+                }
+                year = parseDigitsUnchecked(literal, index, digits);
+                if (year == 0) {
+                    throw new ParseException("Year can't be zero", index);
+                }
+                index += digits + 1;
+            }
+            month = parseDigitsChecked(literal, index, 2);
+            index += 2;
+            if (index == end) {
+                throw new UnexpectedEndOfStringException(literal);
+            }
+            if (literal.charAt(index) != '-') {
+                throw new UnexpectedCharacterException(literal, index);
+            }
+            index++;
+            day = parseDigitsChecked(literal, index, 2);
+            index += 2;
+        } else {
+            bc = false;
+            aeon = null;
+            year = 0;
+            month = 0;
+            day = 0;
+        }
+        if (hasDatePart() && hasTimePart()) {
+            if (index == end) {
+                throw new UnexpectedEndOfStringException(literal);
+            }
+            if (literal.charAt(index) != 'T') {
+                throw new UnexpectedCharacterException(literal, index);
+            }
+            index++;
+        }
+        int hour;
+        int minute;
+        int second;
+        int nanoSecond;
+        String nanoSecondFraction;
+        if (hasTimePart()) {
+            hour = parseDigitsChecked(literal, index, 2);
+            index += 2;
+            if (index == end) {
+                throw new UnexpectedEndOfStringException(literal);
+            }
+            if (literal.charAt(index) != ':') {
+                throw new UnexpectedCharacterException(literal, index);
+            }
+            index++;
+            minute = parseDigitsChecked(literal, index, 2);
+            index += 2;
+            if (index == end) {
+                throw new UnexpectedEndOfStringException(literal);
+            }
+            if (literal.charAt(index) != ':') {
+                throw new UnexpectedCharacterException(literal, index);
+            }
+            index++;
+            second = parseDigitsChecked(literal, index, 2);
+            index += 2;
+            if (index < end && literal.charAt(index) == '.') {
+                index++;
+                if (index == end) {
+                    throw new UnexpectedEndOfStringException(literal);
+                }
+                int digits = countDigits(literal, index, "Z+-", true);
+                if (digits == 0) {
+                    if (index == end) {
+                        throw new UnexpectedEndOfStringException(literal);
+                    } else {
+                        throw new UnexpectedCharacterException(literal, index);
+                    }
+                }
+                // TODO: we should remove trailing zeros
+                nanoSecond = parseDigitsUnchecked(literal, index, Math.min(digits, 9));
+                if (digits > 9) {
+                    nanoSecondFraction = literal.substring(index+9, index+digits-9);
+                } else {
+                    for (int i = digits; i < 9; i++) {
+                        nanoSecond *= 10;
+                    }
+                    nanoSecondFraction = null;
+                }
+                index += digits;
+            } else {
+                nanoSecond = 0;
+                nanoSecondFraction = null;
+            }
+        } else {
+            hour = 0;
+            minute = 0;
+            second = 0;
+            nanoSecond = 0;
+            nanoSecondFraction = null;
+        }
+        SimpleTimeZone timeZone;
+        if (index == end) {
+            timeZone = null;
+        } else {
+            int delta;
+            char c = literal.charAt(index);
+            index++;
+            if (c == 'Z') {
+                delta = 0;
+            } else {
+                boolean negative = c == '-';
+                int deltaHours = parseDigitsChecked(literal, index, 2);
+                index += 2;
+                if (index == end) {
+                    throw new UnexpectedEndOfStringException(literal);
+                }
+                if (literal.charAt(index) != ':') {
+                    throw new UnexpectedCharacterException(literal, index);
+                }
+                index++;
+                int deltaMinutes = parseDigitsChecked(literal, index, 2);
+                index += 2;
+                delta = 60*deltaHours + deltaMinutes;
+                if (negative) {
+                    delta = -delta;
+                }
+            }
+            timeZone = SimpleTimeZone.getInstance(delta);
+        }
+        if (index != end) {
+            throw new UnexpectedCharacterException(literal, index);
+        }
+        return createInstance(bc, aeon, year, month, day, hour, minute, second, nanoSecond,
+                nanoSecondFraction, timeZone);
+    }
+    
+    private static int countDigits(String literal, int index, String stopChars, boolean allowEndOfString) throws ParseException {
+        final int len = literal.length();
+        int count = 0;
+        while (true) {
+            if (index == len) {
+                if (allowEndOfString) {
+                    return count;
+                } else {
+                    throw new UnexpectedEndOfStringException(literal);
+                }
+            }
+            char c = literal.charAt(index);
+            if ('0' <= c && c <= '9') {
+                index++;
+                count++;
+            } else if (stopChars.indexOf(c) != -1) {
+                return count;
+            } else {
+                throw new UnexpectedCharacterException(literal, index);
+            }
+        }
+    }
+    
+    private static int parseDigitsUnchecked(String literal, int index, int count) {
+        int value = 0;
+        for (; count > 0; count--) {
+            value = 10*value + literal.charAt(index++) - '0';
+        }
+        return value;
+    }
+    
+    private static int parseDigitsChecked(String literal, int index, int count) throws ParseException {
+        final int len = literal.length();
+        int value = 0;
+        for (; count > 0; count--) {
+            if (index == len) {
+                throw new UnexpectedEndOfStringException(literal);
+            }
+            char c = literal.charAt(index);
+            if ('0' <= c && c <= '9') {
+                value = 10*value + c - '0';
+            } else {
+                throw new UnexpectedCharacterException(literal, index);
+            }
+            index++;
+        }
+        return value;
+    }
+    
+    public final String format(T value) {
+        return value.toString();
+    }
+}
diff --git a/testing/soap-testsuite/src/main/java/org/apache/axiom/ts/soap/TextTransformer.java b/datatypes/src/main/java/org/apache/axiom/datatype/xsd/Util.java
similarity index 80%
copy from testing/soap-testsuite/src/main/java/org/apache/axiom/ts/soap/TextTransformer.java
copy to datatypes/src/main/java/org/apache/axiom/datatype/xsd/Util.java
index 900ce36..b244db7 100644
--- a/testing/soap-testsuite/src/main/java/org/apache/axiom/ts/soap/TextTransformer.java
+++ b/datatypes/src/main/java/org/apache/axiom/datatype/xsd/Util.java
@@ -16,8 +16,12 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.axiom.ts.soap;
+package org.apache.axiom.datatype.xsd;
 
-interface TextTransformer {
-    String transform(String in);
+final class Util {
+    private Util() {}
+    
+    static boolean isWhitespace(char c) {
+        return c == ' ' || c == '\r' || c == '\n' || c == '\t';
+    }
 }
diff --git a/testing/soap-testsuite/src/main/java/org/apache/axiom/ts/soap/TextTransformer.java b/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSDate.java
similarity index 87%
copy from testing/soap-testsuite/src/main/java/org/apache/axiom/ts/soap/TextTransformer.java
copy to datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSDate.java
index 900ce36..45bef69 100644
--- a/testing/soap-testsuite/src/main/java/org/apache/axiom/ts/soap/TextTransformer.java
+++ b/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSDate.java
@@ -16,8 +16,8 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.axiom.ts.soap;
+package org.apache.axiom.datatype.xsd;
 
-interface TextTransformer {
-    String transform(String in);
+public interface XSDate extends Temporal {
+    XSDateTime getDayStart();
 }
diff --git a/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSDateImpl.java b/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSDateImpl.java
new file mode 100644
index 0000000..4eb748a
--- /dev/null
+++ b/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSDateImpl.java
@@ -0,0 +1,106 @@
+/*
+ * 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.axiom.datatype.xsd;
+
+final class XSDateImpl extends TemporalImpl implements XSDate {
+    private final boolean bc;
+    private final String aeon;
+    private final int year;
+    private final int month;
+    private final int day;
+    private final SimpleTimeZone timeZone;
+    
+    XSDateImpl(boolean bc, String aeon, int year, int month, int day, SimpleTimeZone timeZone) {
+        this.bc = bc;
+        this.aeon = aeon;
+        this.year = year;
+        this.month = month;
+        this.day = day;
+        this.timeZone = timeZone;
+    }
+
+    @Override
+    boolean hasDatePart() {
+        return true;
+    }
+
+    @Override
+    boolean hasTimePart() {
+        return false;
+    }
+
+    @Override
+    boolean isBC() {
+        return bc;
+    }
+
+    @Override
+    String getAeon() {
+        return aeon;
+    }
+
+    @Override
+    int getYear() {
+        return year;
+    }
+
+    @Override
+    int getMonth() {
+        return month;
+    }
+
+    @Override
+    int getDay() {
+        return day;
+    }
+
+    @Override
+    int getHour() {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    int getMinute() {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    int getSecond() {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    int getNanoSecond() {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    String getNanoSecondFraction() {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    SimpleTimeZone getTimeZone() {
+        return timeZone;
+    }
+
+    public XSDateTime getDayStart() {
+        return new XSDateTimeImpl(bc, aeon, year, month, day, 0, 0, 0, 0, null, timeZone);
+    }
+}
diff --git a/testing/soap-testsuite/src/main/java/org/apache/axiom/ts/soap/TextTransformer.java b/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSDateTime.java
similarity index 56%
copy from testing/soap-testsuite/src/main/java/org/apache/axiom/ts/soap/TextTransformer.java
copy to datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSDateTime.java
index 900ce36..dbf45db 100644
--- a/testing/soap-testsuite/src/main/java/org/apache/axiom/ts/soap/TextTransformer.java
+++ b/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSDateTime.java
@@ -16,8 +16,23 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.axiom.ts.soap;
+package org.apache.axiom.datatype.xsd;
 
-interface TextTransformer {
-    String transform(String in);
+import java.util.Date;
+import java.util.TimeZone;
+
+public interface XSDateTime extends Temporal {
+    XSDate getDate();
+    XSTime getTime();
+    
+    /**
+     * Convert this date/time to a {@link Date} object.
+     * 
+     * @param defaultTimeZone
+     *            the time zone to use if this date/time has no time zone; may be <code>null</code>
+     * @return the {@link Date} object
+     * @throws NoTimeZoneException
+     *             if this date/time doesn't have a time zone and no default time zone was specified
+     */
+    Date getDate(TimeZone defaultTimeZone);
 }
diff --git a/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSDateTimeImpl.java b/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSDateTimeImpl.java
new file mode 100644
index 0000000..6d33144
--- /dev/null
+++ b/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSDateTimeImpl.java
@@ -0,0 +1,129 @@
+/*
+ * 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.axiom.datatype.xsd;
+
+import java.util.Date;
+import java.util.TimeZone;
+
+final class XSDateTimeImpl extends TemporalImpl implements XSDateTime {
+    private final boolean bc;
+    private final String aeon;
+    private final int year;
+    private final int month;
+    private final int day;
+    private final int hour;
+    private final int minute;
+    private final int second;
+    private final int nanoSecond;
+    private final String nanoSecondFraction;
+    private final SimpleTimeZone timeZone;
+    
+    XSDateTimeImpl(boolean bc, String aeon, int year, int month, int day, int hour, int minute,
+            int second, int nanoSecond, String nanoSecondFraction, SimpleTimeZone timeZone) {
+        this.bc = bc;
+        this.aeon = aeon;
+        this.year = year;
+        this.month = month;
+        this.day = day;
+        this.hour = hour;
+        this.minute = minute;
+        this.second = second;
+        this.nanoSecond = nanoSecond;
+        this.nanoSecondFraction = nanoSecondFraction;
+        this.timeZone = timeZone;
+    }
+    
+    @Override
+    boolean hasDatePart() {
+        return true;
+    }
+
+    @Override
+    boolean hasTimePart() {
+        return true;
+    }
+
+    @Override
+    boolean isBC() {
+        return bc;
+    }
+
+    @Override
+    String getAeon() {
+        return aeon;
+    }
+
+    @Override
+    int getYear() {
+        return year;
+    }
+
+    @Override
+    int getMonth() {
+        return month;
+    }
+
+    @Override
+    int getDay() {
+        return day;
+    }
+
+    @Override
+    int getHour() {
+        return hour;
+    }
+
+    @Override
+    int getMinute() {
+        return minute;
+    }
+
+    @Override
+    int getSecond() {
+        return second;
+    }
+
+    @Override
+    int getNanoSecond() {
+        return nanoSecond;
+    }
+
+    @Override
+    String getNanoSecondFraction() {
+        return nanoSecondFraction;
+    }
+
+    @Override
+    SimpleTimeZone getTimeZone() {
+        return timeZone;
+    }
+
+    public XSDate getDate() {
+        return new XSDateImpl(bc, aeon, year, month, day, timeZone);
+    }
+
+    public XSTime getTime() {
+        return new XSTimeImpl(hour, minute, second, nanoSecond, nanoSecondFraction, timeZone);
+    }
+
+    public Date getDate(TimeZone defaultTimeZone) {
+        // TODO: fast path for dates in the 20th and 21st century
+        return getCalendar(defaultTimeZone).getTime();
+    }
+}
diff --git a/testing/soap-testsuite/src/main/java/org/apache/axiom/ts/soap/TextTransformer.java b/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSDateTimeType.java
similarity index 79%
copy from testing/soap-testsuite/src/main/java/org/apache/axiom/ts/soap/TextTransformer.java
copy to datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSDateTimeType.java
index 900ce36..5b3cbb4 100644
--- a/testing/soap-testsuite/src/main/java/org/apache/axiom/ts/soap/TextTransformer.java
+++ b/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSDateTimeType.java
@@ -16,8 +16,10 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.axiom.ts.soap;
+package org.apache.axiom.datatype.xsd;
 
-interface TextTransformer {
-    String transform(String in);
+import org.apache.axiom.datatype.InvariantType;
+
+public interface XSDateTimeType extends InvariantType<XSDateTime> {
+    XSDateTimeType INSTANCE = new XSDateTimeTypeImpl();
 }
diff --git a/testing/soap-testsuite/src/main/java/org/apache/axiom/ts/soap/TextTransformer.java b/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSDateTimeTypeImpl.java
similarity index 55%
copy from testing/soap-testsuite/src/main/java/org/apache/axiom/ts/soap/TextTransformer.java
copy to datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSDateTimeTypeImpl.java
index 900ce36..8d19cda 100644
--- a/testing/soap-testsuite/src/main/java/org/apache/axiom/ts/soap/TextTransformer.java
+++ b/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSDateTimeTypeImpl.java
@@ -16,8 +16,24 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.axiom.ts.soap;
+package org.apache.axiom.datatype.xsd;
 
-interface TextTransformer {
-    String transform(String in);
+final class XSDateTimeTypeImpl extends TemporalType<XSDateTime> implements XSDateTimeType {
+    @Override
+    boolean hasDatePart() {
+        return true;
+    }
+
+    @Override
+    boolean hasTimePart() {
+        return true;
+    }
+
+    @Override
+    XSDateTime createInstance(boolean bc, String aeon, int year, int month, int day, int hour,
+            int minute, int second, int nanoSecond, String nanoSecondFraction,
+            SimpleTimeZone timeZone) {
+        return new XSDateTimeImpl(bc, aeon, year, month, day, hour, minute, second, nanoSecond,
+                nanoSecondFraction, timeZone);
+    }
 }
diff --git a/testing/soap-testsuite/src/main/java/org/apache/axiom/ts/soap/TextTransformer.java b/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSDateType.java
similarity index 84%
copy from testing/soap-testsuite/src/main/java/org/apache/axiom/ts/soap/TextTransformer.java
copy to datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSDateType.java
index 900ce36..e982540 100644
--- a/testing/soap-testsuite/src/main/java/org/apache/axiom/ts/soap/TextTransformer.java
+++ b/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSDateType.java
@@ -16,8 +16,10 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.axiom.ts.soap;
+package org.apache.axiom.datatype.xsd;
+
+import org.apache.axiom.datatype.InvariantType;
+
+public interface XSDateType extends InvariantType<XSDate> {
 
-interface TextTransformer {
-    String transform(String in);
 }
diff --git a/testing/soap-testsuite/src/main/java/org/apache/axiom/ts/soap/TextTransformer.java b/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSDateTypeImpl.java
similarity index 59%
copy from testing/soap-testsuite/src/main/java/org/apache/axiom/ts/soap/TextTransformer.java
copy to datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSDateTypeImpl.java
index 900ce36..901a798 100644
--- a/testing/soap-testsuite/src/main/java/org/apache/axiom/ts/soap/TextTransformer.java
+++ b/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSDateTypeImpl.java
@@ -16,8 +16,23 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.axiom.ts.soap;
+package org.apache.axiom.datatype.xsd;
 
-interface TextTransformer {
-    String transform(String in);
+final class XSDateTypeImpl extends TemporalType<XSDate> implements XSDateType {
+    @Override
+    boolean hasDatePart() {
+        return true;
+    }
+
+    @Override
+    boolean hasTimePart() {
+        return false;
+    }
+
+    @Override
+    XSDate createInstance(boolean bc, String aeon, int year, int month, int day, int hour,
+            int minute, int second, int nanoSecond, String nanoSecondFraction,
+            SimpleTimeZone timeZone) {
+        return new XSDateImpl(bc, aeon, year, month, day, timeZone);
+    }
 }
diff --git a/testing/soap-testsuite/src/main/java/org/apache/axiom/ts/soap/TextTransformer.java b/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSQNameType.java
similarity index 78%
copy from testing/soap-testsuite/src/main/java/org/apache/axiom/ts/soap/TextTransformer.java
copy to datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSQNameType.java
index 900ce36..c8497ac 100644
--- a/testing/soap-testsuite/src/main/java/org/apache/axiom/ts/soap/TextTransformer.java
+++ b/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSQNameType.java
@@ -16,8 +16,12 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.axiom.ts.soap;
+package org.apache.axiom.datatype.xsd;
 
-interface TextTransformer {
-    String transform(String in);
+import javax.xml.namespace.QName;
+
+import org.apache.axiom.datatype.Type;
+
+public interface XSQNameType extends Type<QName> {
+    XSQNameType INSTANCE = new XSQNameTypeImpl();
 }
diff --git a/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSQNameTypeImpl.java b/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSQNameTypeImpl.java
new file mode 100644
index 0000000..509dcca
--- /dev/null
+++ b/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSQNameTypeImpl.java
@@ -0,0 +1,97 @@
+/*
+ * 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.axiom.datatype.xsd;
+
+import java.text.ParseException;
+
+import javax.xml.namespace.QName;
+
+import org.apache.axiom.datatype.ContextAccessor;
+import org.apache.axiom.datatype.UnexpectedCharacterException;
+import org.apache.axiom.datatype.UnexpectedEndOfStringException;
+
+final class XSQNameTypeImpl implements XSQNameType {
+    public <S,O> QName parse(String literal, ContextAccessor<S,O> contextAccessor, S contextObject, O options)
+            throws ParseException {
+        int len = literal.length();
+        int start = -1;
+        int end = -1;
+        int colonIndex = -1;
+        for (int index = 0; index<len; index++) {
+            char c = literal.charAt(index);
+            if (Util.isWhitespace(c)) {
+                if (start != -1 && end == -1) {
+                    end = index;
+                }
+            } else {
+                if (start == -1) {
+                    start = index;
+                } else if (end != -1) {
+                    throw new UnexpectedCharacterException(literal, index);
+                }
+                // TODO: we should check that the literal is a valid NCName
+                if (literal.charAt(index) == ':') {
+                    if (colonIndex != -1) {
+                        throw new UnexpectedCharacterException(literal, index);
+                    }
+                    colonIndex = index;
+                }
+            }
+        }
+        if (start == -1) {
+            throw new UnexpectedEndOfStringException(literal);
+        }
+        if (end == -1) {
+            end = len;
+        }
+        String prefix;
+        String localPart;
+        if (colonIndex == -1) {
+            prefix = "";
+            localPart = literal.toString();
+        } else {
+            prefix = literal.substring(start, colonIndex);
+            localPart = literal.substring(colonIndex+1, end);
+        }
+        String namespaceURI = contextAccessor.lookupNamespaceURI(contextObject, options, prefix);
+        if (namespaceURI == null) {
+            throw new ParseException("Unbound namespace prefix \"" + prefix + "\"", 0);
+        }
+        return new QName(namespaceURI, localPart, prefix);
+    }
+
+    public <S,O> String format(QName value, ContextAccessor<S,O> contextAccessor, S contextObject, O options) {
+        String prefix = value.getPrefix();
+        String namespaceURI = value.getNamespaceURI();
+        if (!namespaceURI.equals(contextAccessor.lookupNamespaceURI(contextObject, options, prefix))) {
+            String existingPrefix = contextAccessor.lookupPrefix(contextObject, options, namespaceURI);
+            if (existingPrefix != null) {
+                prefix = existingPrefix;
+            } else {
+                // TODO
+                throw new RuntimeException();
+            }
+        }
+        if (prefix.length() == 0) {
+            return value.getLocalPart();
+        } else {
+            return prefix + ":" + value.getLocalPart();
+        }
+    }
+}
diff --git a/testing/soap-testsuite/src/main/java/org/apache/axiom/ts/soap/TextTransformer.java b/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSStringType.java
similarity index 79%
copy from testing/soap-testsuite/src/main/java/org/apache/axiom/ts/soap/TextTransformer.java
copy to datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSStringType.java
index 900ce36..068656e 100644
--- a/testing/soap-testsuite/src/main/java/org/apache/axiom/ts/soap/TextTransformer.java
+++ b/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSStringType.java
@@ -16,8 +16,10 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.axiom.ts.soap;
+package org.apache.axiom.datatype.xsd;
 
-interface TextTransformer {
-    String transform(String in);
+import org.apache.axiom.datatype.InvariantType;
+
+public interface XSStringType extends InvariantType<String> {
+    XSStringType INSTANCE = new XSStringTypeImpl();
 }
diff --git a/testing/soap-testsuite/src/main/java/org/apache/axiom/ts/soap/TextTransformer.java b/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSStringTypeImpl.java
similarity index 67%
copy from testing/soap-testsuite/src/main/java/org/apache/axiom/ts/soap/TextTransformer.java
copy to datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSStringTypeImpl.java
index 900ce36..7c08cc6 100644
--- a/testing/soap-testsuite/src/main/java/org/apache/axiom/ts/soap/TextTransformer.java
+++ b/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSStringTypeImpl.java
@@ -16,8 +16,18 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.axiom.ts.soap;
+package org.apache.axiom.datatype.xsd;
 
-interface TextTransformer {
-    String transform(String in);
+import java.text.ParseException;
+
+import org.apache.axiom.datatype.AbstractInvariantType;
+
+final class XSStringTypeImpl extends AbstractInvariantType<String> implements XSStringType {
+    public String parse(String literal) throws ParseException {
+        return literal;
+    }
+
+    public String format(String value) {
+        return value;
+    }
 }
diff --git a/testing/soap-testsuite/src/main/java/org/apache/axiom/ts/soap/TextTransformer.java b/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSTime.java
similarity index 89%
copy from testing/soap-testsuite/src/main/java/org/apache/axiom/ts/soap/TextTransformer.java
copy to datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSTime.java
index 900ce36..dda1343 100644
--- a/testing/soap-testsuite/src/main/java/org/apache/axiom/ts/soap/TextTransformer.java
+++ b/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSTime.java
@@ -16,8 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.axiom.ts.soap;
+package org.apache.axiom.datatype.xsd;
 
-interface TextTransformer {
-    String transform(String in);
+public interface XSTime extends Temporal {
 }
diff --git a/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSTimeImpl.java b/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSTimeImpl.java
new file mode 100644
index 0000000..5b2e347
--- /dev/null
+++ b/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSTimeImpl.java
@@ -0,0 +1,103 @@
+/*
+ * 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.axiom.datatype.xsd;
+
+final class XSTimeImpl extends TemporalImpl implements XSTime {
+    private final int hour;
+    private final int minute;
+    private final int second;
+    private final int nanoSecond;
+    private final String nanoSecondFraction;
+    private final SimpleTimeZone timeZone;
+    
+    XSTimeImpl(int hour, int minute, int second, int nanoSecond, String nanoSecondFraction,
+            SimpleTimeZone timeZone) {
+        this.hour = hour;
+        this.minute = minute;
+        this.second = second;
+        this.nanoSecond = nanoSecond;
+        this.nanoSecondFraction = nanoSecondFraction;
+        this.timeZone = timeZone;
+    }
+
+    @Override
+    boolean hasDatePart() {
+        return false;
+    }
+
+    @Override
+    boolean hasTimePart() {
+        return true;
+    }
+
+    @Override
+    boolean isBC() {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    String getAeon() {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    int getYear() {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    int getMonth() {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    int getDay() {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    int getHour() {
+        return hour;
+    }
+
+    @Override
+    int getMinute() {
+        return minute;
+    }
+
+    @Override
+    int getSecond() {
+        return second;
+    }
+
+    @Override
+    int getNanoSecond() {
+        return nanoSecond;
+    }
+
+    @Override
+    String getNanoSecondFraction() {
+        return nanoSecondFraction;
+    }
+
+    @Override
+    SimpleTimeZone getTimeZone() {
+        return timeZone;
+    }
+}
diff --git a/testing/soap-testsuite/src/main/java/org/apache/axiom/ts/soap/TextTransformer.java b/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSTimeType.java
similarity index 84%
copy from testing/soap-testsuite/src/main/java/org/apache/axiom/ts/soap/TextTransformer.java
copy to datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSTimeType.java
index 900ce36..1d9c8ac 100644
--- a/testing/soap-testsuite/src/main/java/org/apache/axiom/ts/soap/TextTransformer.java
+++ b/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSTimeType.java
@@ -16,8 +16,10 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.axiom.ts.soap;
+package org.apache.axiom.datatype.xsd;
+
+import org.apache.axiom.datatype.InvariantType;
+
+public interface XSTimeType extends InvariantType<XSTime> {
 
-interface TextTransformer {
-    String transform(String in);
 }
diff --git a/testing/soap-testsuite/src/main/java/org/apache/axiom/ts/soap/TextTransformer.java b/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSTimeTypeImpl.java
similarity index 57%
rename from testing/soap-testsuite/src/main/java/org/apache/axiom/ts/soap/TextTransformer.java
rename to datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSTimeTypeImpl.java
index 900ce36..039945d 100644
--- a/testing/soap-testsuite/src/main/java/org/apache/axiom/ts/soap/TextTransformer.java
+++ b/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSTimeTypeImpl.java
@@ -16,8 +16,23 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.axiom.ts.soap;
+package org.apache.axiom.datatype.xsd;
 
-interface TextTransformer {
-    String transform(String in);
+final class XSTimeTypeImpl extends TemporalType<XSTime> implements XSTimeType {
+    @Override
+    boolean hasDatePart() {
+        return false;
+    }
+
+    @Override
+    boolean hasTimePart() {
+        return true;
+    }
+
+    @Override
+    XSTime createInstance(boolean bc, String aeon, int year, int month, int day, int hour,
+            int minute, int second, int nanoSecond, String nanoSecondFraction,
+            SimpleTimeZone timeZone) {
+        return new XSTimeImpl(hour, minute, second, nanoSecond, nanoSecondFraction, timeZone);
+    }
 }
diff --git a/datatypes/src/test/java/org/apache/axiom/datatype/DOMHelperTest.java b/datatypes/src/test/java/org/apache/axiom/datatype/DOMHelperTest.java
new file mode 100644
index 0000000..97e3fab
--- /dev/null
+++ b/datatypes/src/test/java/org/apache/axiom/datatype/DOMHelperTest.java
@@ -0,0 +1,42 @@
+/*
+ * 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.axiom.datatype;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import javax.xml.namespace.QName;
+import javax.xml.parsers.DocumentBuilderFactory;
+
+import org.apache.axiom.datatype.xsd.XSQNameType;
+import org.junit.Test;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+public class DOMHelperTest {
+    @Test
+    public void testGetQNameFromElement() throws Exception {
+        Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
+        Element element = document.createElementNS("urn:test", "p:elem");
+        element.setTextContent("p:value");
+        QName qname = DOMHelper.getValue(element, XSQNameType.INSTANCE);
+        assertThat(qname.getNamespaceURI()).isEqualTo("urn:test");
+        assertThat(qname.getLocalPart()).isEqualTo("value");
+        assertThat(qname.getPrefix()).isEqualTo("p");
+    }
+}
diff --git a/datatypes/src/test/java/org/apache/axiom/datatype/xsd/XSDateTimeTypeTest.java b/datatypes/src/test/java/org/apache/axiom/datatype/xsd/XSDateTimeTypeTest.java
new file mode 100644
index 0000000..eb81dad
--- /dev/null
+++ b/datatypes/src/test/java/org/apache/axiom/datatype/xsd/XSDateTimeTypeTest.java
@@ -0,0 +1,53 @@
+/*
+ * 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.axiom.datatype.xsd;
+
+import static com.google.common.truth.Truth.assertThat;
+import static org.junit.Assert.fail;
+
+import java.util.Date;
+
+import org.apache.axiom.datatype.UnexpectedEndOfStringException;
+import org.junit.Test;
+
+public class XSDateTimeTypeTest {
+    @Test
+    public void testParse() throws Exception {
+        XSDateTime dateTime = XSDateTimeType.INSTANCE.parse("2003-12-13T18:30:02Z");
+        assertThat(dateTime.getDate(null)).isEqualTo(new Date(1071340202000L));
+    }
+    
+    @Test
+    public void testParseTruncated() throws Exception {
+        String literal = "2002-10-10T12:00:00-05:00";
+        for (int i=0; i<literal.length()-1; i++) {
+            if (i == 19) {
+                // This would give a valid literal without time zone
+                continue;
+            }
+            String truncatedLiteral = literal.substring(0, i);
+            try {
+                XSDateTimeType.INSTANCE.parse(truncatedLiteral);
+                fail("Expected UnexpectedEndOfStringException for literal \"" + truncatedLiteral + "\"");
+            } catch (UnexpectedEndOfStringException ex) {
+                // Expected
+            }
+        }
+    }
+}
diff --git a/implementations/pom.xml b/implementations/pom.xml
index 7c6572d..24a48e6 100644
--- a/implementations/pom.xml
+++ b/implementations/pom.xml
@@ -88,6 +88,7 @@
                     <artifactSet>
                         <includes>
                             <include>${project.groupId}:*-aspects</include>
+                            <include>${project.groupId}:datatypes</include>
                             <include>org.aspectj:aspectjrt</include>
                         </includes>
                     </artifactSet>
diff --git a/pom.xml b/pom.xml
index a145f0a..529056a 100644
--- a/pom.xml
+++ b/pom.xml
@@ -223,6 +223,7 @@
         <module>testing</module>
         <module>aspects</module>
         <module>implementations</module>
+        <module>datatypes</module>
     </modules>
 
     <scm>
diff --git a/testing/soap-testsuite/pom.xml b/testing/soap-testsuite/pom.xml
index 1d299b4..658022a 100644
--- a/testing/soap-testsuite/pom.xml
+++ b/testing/soap-testsuite/pom.xml
@@ -45,6 +45,11 @@
             <version>${project.version}</version>
         </dependency>
         <dependency>
+            <groupId>${project.groupId}</groupId>
+            <artifactId>datatypes</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
             <groupId>commons-io</groupId>
             <artifactId>commons-io</artifactId>
         </dependency>
diff --git a/testing/soap-testsuite/src/main/java/org/apache/axiom/ts/soap/ConvertedSOAPSampleContent.java b/testing/soap-testsuite/src/main/java/org/apache/axiom/ts/soap/ConvertedSOAPSampleContent.java
index 983487d..36063c9 100644
--- a/testing/soap-testsuite/src/main/java/org/apache/axiom/ts/soap/ConvertedSOAPSampleContent.java
+++ b/testing/soap-testsuite/src/main/java/org/apache/axiom/ts/soap/ConvertedSOAPSampleContent.java
@@ -20,6 +20,7 @@ package org.apache.axiom.ts.soap;
 
 import java.io.InputStream;
 import java.io.OutputStream;
+import java.text.ParseException;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -30,6 +31,8 @@ import javax.xml.transform.TransformerFactory;
 import javax.xml.transform.dom.DOMSource;
 import javax.xml.transform.stream.StreamResult;
 
+import org.apache.axiom.datatype.DOMHelper;
+import org.apache.axiom.datatype.xsd.XSQNameType;
 import org.apache.axiom.testing.multiton.Multiton;
 import org.apache.axiom.ts.xml.ComputedMessageContent;
 import org.w3c.dom.Attr;
@@ -40,15 +43,15 @@ import org.w3c.dom.Node;
 import org.w3c.dom.NodeList;
 
 final class ConvertedSOAPSampleContent extends ComputedMessageContent {
-    private static Map<String,String> faultCodeMap = new HashMap<String,String>();
+    private static Map<QName,QName> faultCodeMap = new HashMap<>();
     
     static {
         faultCodeMap.put(
-                SOAPSpec.SOAP12.getSenderFaultCode().getLocalPart(),
-                SOAPSpec.SOAP11.getSenderFaultCode().getLocalPart());
+                SOAPSpec.SOAP12.getSenderFaultCode(),
+                SOAPSpec.SOAP11.getSenderFaultCode());
         faultCodeMap.put(
-                SOAPSpec.SOAP12.getReceiverFaultCode().getLocalPart(),
-                SOAPSpec.SOAP11.getReceiverFaultCode().getLocalPart());
+                SOAPSpec.SOAP12.getReceiverFaultCode(),
+                SOAPSpec.SOAP11.getReceiverFaultCode());
     }
     
     private final SOAPSample soap12Message;
@@ -112,25 +115,17 @@ final class ConvertedSOAPSampleContent extends ComputedMessageContent {
                 child = nextChild;
             }
         } else if (type == SOAPFaultChild.CODE) {
-            final Element value = getChild(element, SOAPFaultChild.VALUE);
-            element.setTextContent(transform(value.getTextContent(), new TextTransformer() {
-                @Override
-                public String transform(String in) {
-                    int idx = in.indexOf(':');
-                    if (idx == -1) {
-                        return in;
-                    }
-                    String prefix = in.substring(0, idx);
-                    if (!SOAPSpec.SOAP12.getEnvelopeNamespaceURI().equals(value.lookupNamespaceURI(prefix))) {
-                        return in;
-                    }
-                    String newCode = faultCodeMap.get(in.substring(idx+1));
-                    if (newCode == null) {
-                        return in;
-                    }
-                    return prefix + ":" + newCode;
-                }
-            }));
+            Element value = getChild(element, SOAPFaultChild.VALUE);
+            String[] whitespace = getSurroundingWhitespace(value.getTextContent());
+            QName qname;
+            try {
+                qname = DOMHelper.getValue(value, XSQNameType.INSTANCE);
+            } catch (ParseException ex) {
+                throw new Error(ex);
+            }
+            QName newQName = faultCodeMap.get(qname);
+            DOMHelper.setValue(element, XSQNameType.INSTANCE, newQName == null ? qname : newQName);
+            element.setTextContent(reapplyWhitespace(element.getTextContent(), whitespace));
         } else if (type == SOAPFaultChild.REASON) {
             Element text = getChild(element, SOAPFaultChild.TEXT);
             element.setTextContent(text.getTextContent());
@@ -210,19 +205,19 @@ final class ConvertedSOAPSampleContent extends ComputedMessageContent {
         return " \r\n\t".indexOf(c) != -1;
     }
     
-    private static String transform(String text, TextTransformer transformer) {
+    private static String[] getSurroundingWhitespace(String text) {
         int start = 0;
         while (isWhitespace(text.charAt(start))) {
-            if (++start == text.length()) {
-                return text;
-            }
+            start++;
         }
         int end = text.length();
         while (isWhitespace(text.charAt(end-1))) {
             end--;
         }
-        return text.substring(0, start)
-                + transformer.transform(text.substring(start, end))
-                + text.substring(end);
+        return new String[] { text.substring(0, start), text.substring(end) };
+    }
+    
+    private static String reapplyWhitespace(String text, String[] surroundingWhitespace) {
+        return surroundingWhitespace[0] + text + surroundingWhitespace[1];
     }
 }


[ws-axiom] 13/25: Update version.

Posted by dk...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

dkulp pushed a commit to branch datatypes
in repository https://gitbox.apache.org/repos/asf/ws-axiom.git

commit 226091fcb44d6931c86e0d73611da2be51627aaf
Author: Andreas Veithen <ve...@apache.org>
AuthorDate: Sun Nov 22 21:26:26 2015 +0000

    Update version.
---
 datatypes/pom.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/datatypes/pom.xml b/datatypes/pom.xml
index 9111070..d794f62 100644
--- a/datatypes/pom.xml
+++ b/datatypes/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.ws.commons.axiom</groupId>
         <artifactId>axiom</artifactId>
-        <version>1.2.16-SNAPSHOT</version>
+        <version>1.2.17-SNAPSHOT</version>
     </parent>
 
     <artifactId>datatypes</artifactId>


[ws-axiom] 17/25: Correctly support xs:QName values with prefixes xml and xmlns.

Posted by dk...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

dkulp pushed a commit to branch datatypes
in repository https://gitbox.apache.org/repos/asf/ws-axiom.git

commit 843e7c5c6909d3a3b694c1a0e1f2c8e37c2c7636
Author: Andreas Veithen <ve...@apache.org>
AuthorDate: Wed Dec 2 23:39:16 2015 +0000

    Correctly support xs:QName values with prefixes xml and xmlns.
---
 .../apache/axiom/datatype/xsd/XSQNameTypeImpl.java | 14 ++++++++++---
 .../axiom/datatype/helper/dom/DOMHelperTest.java   | 23 ++++++++++++++++++++++
 2 files changed, 34 insertions(+), 3 deletions(-)

diff --git a/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSQNameTypeImpl.java b/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSQNameTypeImpl.java
index 3da9d38..a192956 100644
--- a/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSQNameTypeImpl.java
+++ b/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSQNameTypeImpl.java
@@ -20,6 +20,7 @@ package org.apache.axiom.datatype.xsd;
 
 import java.text.ParseException;
 
+import javax.xml.XMLConstants;
 import javax.xml.namespace.QName;
 
 import org.apache.axiom.datatype.ContextAccessor;
@@ -50,9 +51,16 @@ final class XSQNameTypeImpl implements XSQNameType {
             prefix = literal.substring(start, colonIndex);
             localPart = literal.substring(colonIndex+1, end);
         }
-        String namespaceURI = contextAccessor.lookupNamespaceURI(contextObject, options, prefix);
-        if (namespaceURI == null) {
-            throw new ParseException("Unbound namespace prefix \"" + prefix + "\"", 0);
+        String namespaceURI;
+        if (prefix.equals(XMLConstants.XML_NS_PREFIX)) {
+            namespaceURI = XMLConstants.XML_NS_URI;
+        } else if (prefix.equals(XMLConstants.XMLNS_ATTRIBUTE)) {
+            namespaceURI = XMLConstants.XMLNS_ATTRIBUTE_NS_URI;
+        } else {
+            namespaceURI = contextAccessor.lookupNamespaceURI(contextObject, options, prefix);
+            if (namespaceURI == null) {
+                throw new ParseException("Unbound namespace prefix \"" + prefix + "\"", 0);
+            }
         }
         return new QName(namespaceURI, localPart, prefix);
     }
diff --git a/datatypes/src/test/java/org/apache/axiom/datatype/helper/dom/DOMHelperTest.java b/datatypes/src/test/java/org/apache/axiom/datatype/helper/dom/DOMHelperTest.java
index 00e994d..61311e7 100644
--- a/datatypes/src/test/java/org/apache/axiom/datatype/helper/dom/DOMHelperTest.java
+++ b/datatypes/src/test/java/org/apache/axiom/datatype/helper/dom/DOMHelperTest.java
@@ -22,6 +22,7 @@ import static com.google.common.truth.Truth.assertThat;
 
 import java.text.ParseException;
 
+import javax.xml.XMLConstants;
 import javax.xml.namespace.QName;
 import javax.xml.parsers.DocumentBuilderFactory;
 
@@ -64,4 +65,26 @@ public class DOMHelperTest {
         assertThat(qname.getLocalPart()).isEqualTo("value");
         assertThat(qname.getPrefix()).isEmpty();
     }
+    
+    @Test
+    public void testGetQNameFromElementXmlPrefix() throws Exception {
+        Document document = newDocument();
+        Element element = document.createElementNS(null, "test");
+        element.setTextContent("xml:value");
+        QName qname = DOMHelper.getValue(element, XSQNameType.INSTANCE);
+        assertThat(qname.getNamespaceURI()).isEqualTo(XMLConstants.XML_NS_URI);
+        assertThat(qname.getLocalPart()).isEqualTo("value");
+        assertThat(qname.getPrefix()).isEqualTo(XMLConstants.XML_NS_PREFIX);
+    }
+    
+    @Test
+    public void testGetQNameFromElementXmlnsPrefix() throws Exception {
+        Document document = newDocument();
+        Element element = document.createElementNS(null, "test");
+        element.setTextContent("xmlns:value");
+        QName qname = DOMHelper.getValue(element, XSQNameType.INSTANCE);
+        assertThat(qname.getNamespaceURI()).isEqualTo(XMLConstants.XMLNS_ATTRIBUTE_NS_URI);
+        assertThat(qname.getLocalPart()).isEqualTo("value");
+        assertThat(qname.getPrefix()).isEqualTo(XMLConstants.XMLNS_ATTRIBUTE);
+    }
 }


[ws-axiom] 21/25: Use the datatypes library to manipulate SOAP fault codes.

Posted by dk...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

dkulp pushed a commit to branch datatypes
in repository https://gitbox.apache.org/repos/asf/ws-axiom.git

commit 2ddaa5645c5e77f5f0191cb2af3fec2b991165a9
Author: Andreas Veithen <ve...@apache.org>
AuthorDate: Sat Dec 5 11:00:36 2015 +0000

    Use the datatypes library to manipulate SOAP fault codes.
---
 .../java/org/apache/axiom/core/ContextAccessorImpl.java    |  5 +++--
 .../main/java/org/apache/axiom/core/CoreElementSupport.aj  |  3 +--
 .../axiom/soap/impl/common/AxiomSOAP11FaultCodeSupport.aj  | 13 +++++++++++--
 .../soap/impl/common/AxiomSOAP12FaultClassifierSupport.aj  | 14 ++++++++++++--
 4 files changed, 27 insertions(+), 8 deletions(-)

diff --git a/aspects/core-aspects/src/main/java/org/apache/axiom/core/ContextAccessorImpl.java b/aspects/core-aspects/src/main/java/org/apache/axiom/core/ContextAccessorImpl.java
index 32e9353..9a06b1b 100644
--- a/aspects/core-aspects/src/main/java/org/apache/axiom/core/ContextAccessorImpl.java
+++ b/aspects/core-aspects/src/main/java/org/apache/axiom/core/ContextAccessorImpl.java
@@ -34,7 +34,8 @@ final class ContextAccessorImpl implements ContextAccessor<CoreElement,Semantics
     }
 
     public void declareNamespace(CoreElement element, Semantics semantics, String prefix, String namespaceURI) {
-        // TODO
-        throw new UnsupportedOperationException();
+        CoreNamespaceDeclaration decl = element.coreCreateNode(CoreNamespaceDeclaration.class);
+        decl.coreSetDeclaredNamespace(prefix, namespaceURI);
+        element.coreAppendAttribute(decl);
     }
 }
diff --git a/aspects/core-aspects/src/main/java/org/apache/axiom/core/CoreElementSupport.aj b/aspects/core-aspects/src/main/java/org/apache/axiom/core/CoreElementSupport.aj
index e3e7f32..ed517f8 100644
--- a/aspects/core-aspects/src/main/java/org/apache/axiom/core/CoreElementSupport.aj
+++ b/aspects/core-aspects/src/main/java/org/apache/axiom/core/CoreElementSupport.aj
@@ -234,7 +234,6 @@ public aspect CoreElementSupport {
     }
     
     public final <T> void CoreElement.coreSetValue(Type<T> type, T value, Semantics semantics) {
-        // TODO: actually set value
-        type.format(value, ContextAccessorImpl.INSTANCE, this, semantics);
+        coreSetCharacterData(type.format(value, ContextAccessorImpl.INSTANCE, this, semantics), semantics);
     }
 }
diff --git a/aspects/om-aspects/src/main/java/org/apache/axiom/soap/impl/common/AxiomSOAP11FaultCodeSupport.aj b/aspects/om-aspects/src/main/java/org/apache/axiom/soap/impl/common/AxiomSOAP11FaultCodeSupport.aj
index bf03ff4..e1f6d48 100644
--- a/aspects/om-aspects/src/main/java/org/apache/axiom/soap/impl/common/AxiomSOAP11FaultCodeSupport.aj
+++ b/aspects/om-aspects/src/main/java/org/apache/axiom/soap/impl/common/AxiomSOAP11FaultCodeSupport.aj
@@ -18,11 +18,16 @@
  */
 package org.apache.axiom.soap.impl.common;
 
+import java.text.ParseException;
+
 import javax.xml.namespace.QName;
 
 import org.apache.axiom.core.CoreNode;
+import org.apache.axiom.datatype.xsd.XSQNameType;
+import org.apache.axiom.om.impl.common.AxiomSemantics;
 import org.apache.axiom.soap.SOAPFaultSubCode;
 import org.apache.axiom.soap.SOAPFaultValue;
+import org.apache.axiom.soap.SOAPProcessingException;
 import org.apache.axiom.soap.impl.intf.AxiomSOAP11FaultCode;
 
 public aspect AxiomSOAP11FaultCodeSupport {
@@ -47,10 +52,14 @@ public aspect AxiomSOAP11FaultCodeSupport {
     }
 
     public final QName AxiomSOAP11FaultCode.getValueAsQName() {
-        return getTextAsQName();
+        try {
+            return coreGetValue(XSQNameType.INSTANCE, AxiomSemantics.INSTANCE);
+        } catch (ParseException ex) {
+            throw new SOAPProcessingException("Invalid fault code", ex);
+        }
     }
 
     public final void AxiomSOAP11FaultCode.setValue(QName value) {
-        setText(value);
+        coreSetValue(XSQNameType.INSTANCE, value, AxiomSemantics.INSTANCE);
     }
 }
diff --git a/aspects/om-aspects/src/main/java/org/apache/axiom/soap/impl/common/AxiomSOAP12FaultClassifierSupport.aj b/aspects/om-aspects/src/main/java/org/apache/axiom/soap/impl/common/AxiomSOAP12FaultClassifierSupport.aj
index 3d12435..538a8a3 100644
--- a/aspects/om-aspects/src/main/java/org/apache/axiom/soap/impl/common/AxiomSOAP12FaultClassifierSupport.aj
+++ b/aspects/om-aspects/src/main/java/org/apache/axiom/soap/impl/common/AxiomSOAP12FaultClassifierSupport.aj
@@ -18,12 +18,18 @@
  */
 package org.apache.axiom.soap.impl.common;
 
+import java.text.ParseException;
+
 import javax.xml.namespace.QName;
 
+import org.apache.axiom.datatype.xsd.XSQNameType;
+import org.apache.axiom.om.impl.common.AxiomSemantics;
 import org.apache.axiom.soap.SOAP12Constants;
 import org.apache.axiom.soap.SOAPFaultSubCode;
 import org.apache.axiom.soap.SOAPFaultValue;
+import org.apache.axiom.soap.SOAPProcessingException;
 import org.apache.axiom.soap.impl.intf.AxiomSOAP12FaultClassifier;
+import org.apache.axiom.soap.impl.intf.AxiomSOAP12FaultValue;
 
 public aspect AxiomSOAP12FaultClassifierSupport {
     private static final Class<?>[] sequence = { SOAPFaultValue.class, SOAPFaultSubCode.class };
@@ -46,7 +52,11 @@ public aspect AxiomSOAP12FaultClassifierSupport {
 
     public final QName AxiomSOAP12FaultClassifier.getValueAsQName() {
         SOAPFaultValue value = getValue();
-        return value == null ? null : value.getTextAsQName();
+        try {
+            return value == null ? null : ((AxiomSOAP12FaultValue)value).coreGetValue(XSQNameType.INSTANCE, AxiomSemantics.INSTANCE);
+        } catch (ParseException ex) {
+            throw new SOAPProcessingException("Invalid fault code", ex);
+        }
     }
     
     public final void AxiomSOAP12FaultClassifier.setValue(QName value) {
@@ -54,6 +64,6 @@ public aspect AxiomSOAP12FaultClassifierSupport {
         if (valueElement == null) {
             valueElement = ((SOAP12Factory)getOMFactory()).internalCreateSOAPFaultValue(this, null);
         }
-        valueElement.setText(value);
+        ((AxiomSOAP12FaultValue)valueElement).coreSetValue(XSQNameType.INSTANCE, value, AxiomSemantics.INSTANCE);
     }
 }


[ws-axiom] 03/25: Simplify the handling of XSD datatypes with whiteSpace=collapse.

Posted by dk...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

dkulp pushed a commit to branch datatypes
in repository https://gitbox.apache.org/repos/asf/ws-axiom.git

commit f61b55e0547d130ddff09eeb16248be648e06364
Author: Andreas Veithen <ve...@apache.org>
AuthorDate: Mon Nov 16 23:47:53 2015 +0000

    Simplify the handling of XSD datatypes with whiteSpace=collapse.
---
 .../java/org/apache/axiom/datatype/TypeHelper.java | 88 ++++++++++++++++++++++
 .../AbstractWhitespaceCollapsingInvariantType.java | 46 -----------
 .../apache/axiom/datatype/xsd/TemporalType.java    | 10 ++-
 .../java/org/apache/axiom/datatype/xsd/Util.java   | 27 -------
 .../apache/axiom/datatype/xsd/XSQNameTypeImpl.java | 35 ++-------
 5 files changed, 102 insertions(+), 104 deletions(-)

diff --git a/datatypes/src/main/java/org/apache/axiom/datatype/TypeHelper.java b/datatypes/src/main/java/org/apache/axiom/datatype/TypeHelper.java
new file mode 100644
index 0000000..34b7d99
--- /dev/null
+++ b/datatypes/src/main/java/org/apache/axiom/datatype/TypeHelper.java
@@ -0,0 +1,88 @@
+/*
+ * 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.axiom.datatype;
+
+/**
+ * Contains utility methods for usage by {@link Type} implementations.
+ */
+public final class TypeHelper {
+    private TypeHelper() {}
+    
+    /**
+     * Determine if the given character is whitespace according to the XML specification.
+     * 
+     * @param c
+     *            the character to examine
+     * @return {@code true} if the character is whitespace, {@code false} otherwise
+     */
+    public static boolean isWhitespace(char c) {
+        return c == ' ' || c == '\r' || c == '\n' || c == '\t';
+    }
+    
+    /**
+     * Determine the index of the first non whitespace character in the given literal. This method
+     * is intended for use in implementations of XSD datatypes for which the {@code whiteSpace}
+     * facet is {@code collapse}.
+     * 
+     * @param literal
+     *            the literal
+     * @return the index of the first non whitespace character
+     * @throws UnexpectedEndOfStringException
+     *             if the literal is empty or contains only whitespace characters
+     */
+    public static int getStartIndex(String literal) throws UnexpectedEndOfStringException {
+        final int len = literal.length();
+        if (len == 0) {
+            throw new UnexpectedEndOfStringException(literal);
+        }
+        int start = 0;
+        while (TypeHelper.isWhitespace(literal.charAt(start))) {
+            if (++start == len) {
+                throw new UnexpectedEndOfStringException(literal);
+            }
+        }
+        return start;
+    }
+    
+    /**
+     * Determine the index following the last non whitespace character in the given literal. This
+     * method is intended for use in conjunction with {@link #getStartIndex(String)}.
+     * 
+     * @param literal
+     *            the literal
+     * @return the index following the last non whitespace character
+     * @throws UnexpectedEndOfStringException
+     *             if the literal is empty or contains only whitespace characters (Note that this
+     *             means that the order in which {@link #getStartIndex(String)} and
+     *             {@link #getEndIndex(String)} are called is not important)
+     */
+    public static int getEndIndex(String literal) throws UnexpectedEndOfStringException {
+        final int len = literal.length();
+        if (len == 0) {
+            throw new UnexpectedEndOfStringException(literal);
+        }
+        int end = len;
+        while (TypeHelper.isWhitespace(literal.charAt(end-1))) {
+            if (--end == 0) {
+                throw new UnexpectedEndOfStringException(literal);
+            }
+        }
+        return end;
+    }
+}
diff --git a/datatypes/src/main/java/org/apache/axiom/datatype/xsd/AbstractWhitespaceCollapsingInvariantType.java b/datatypes/src/main/java/org/apache/axiom/datatype/xsd/AbstractWhitespaceCollapsingInvariantType.java
deleted file mode 100644
index 03cd2d8..0000000
--- a/datatypes/src/main/java/org/apache/axiom/datatype/xsd/AbstractWhitespaceCollapsingInvariantType.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * 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.axiom.datatype.xsd;
-
-import java.text.ParseException;
-
-import org.apache.axiom.datatype.AbstractInvariantType;
-import org.apache.axiom.datatype.UnexpectedEndOfStringException;
-
-abstract class AbstractWhitespaceCollapsingInvariantType<T> extends AbstractInvariantType<T> {
-    public final T parse(String literal) throws ParseException {
-        final int len = literal.length();
-        if (len == 0) {
-            throw new UnexpectedEndOfStringException(literal);
-        }
-        int begin = 0;
-        while (Util.isWhitespace(literal.charAt(begin))) {
-            if (++begin == len) {
-                throw new UnexpectedEndOfStringException(literal);
-            }
-        }
-        int end = len;
-        while (Util.isWhitespace(literal.charAt(end-1))) {
-            end--;
-        }
-        return parse(literal, begin, end);
-    }
-    
-    protected abstract T parse(String literal, int begin, int end) throws ParseException;
-}
diff --git a/datatypes/src/main/java/org/apache/axiom/datatype/xsd/TemporalType.java b/datatypes/src/main/java/org/apache/axiom/datatype/xsd/TemporalType.java
index 342a449..cbb25ae 100644
--- a/datatypes/src/main/java/org/apache/axiom/datatype/xsd/TemporalType.java
+++ b/datatypes/src/main/java/org/apache/axiom/datatype/xsd/TemporalType.java
@@ -20,19 +20,21 @@ package org.apache.axiom.datatype.xsd;
 
 import java.text.ParseException;
 
+import org.apache.axiom.datatype.AbstractInvariantType;
+import org.apache.axiom.datatype.TypeHelper;
 import org.apache.axiom.datatype.UnexpectedCharacterException;
 import org.apache.axiom.datatype.UnexpectedEndOfStringException;
 
-abstract class TemporalType<T> extends AbstractWhitespaceCollapsingInvariantType<T> {
+abstract class TemporalType<T> extends AbstractInvariantType<T> {
     abstract boolean hasDatePart();
     abstract boolean hasTimePart();
     abstract T createInstance(boolean bc, String aeon, int year, int month, int day, int hour,
             int minute, int second, int nanoSecond, String nanoSecondFraction,
             SimpleTimeZone timeZone);
     
-    @Override
-    protected final T parse(String literal, int begin, int end) throws ParseException {
-        int index = begin;
+    public final T parse(String literal) throws ParseException {
+        final int end = TypeHelper.getEndIndex(literal);
+        int index = TypeHelper.getStartIndex(literal);
         boolean bc;
         String aeon;
         int year;
diff --git a/datatypes/src/main/java/org/apache/axiom/datatype/xsd/Util.java b/datatypes/src/main/java/org/apache/axiom/datatype/xsd/Util.java
deleted file mode 100644
index b244db7..0000000
--- a/datatypes/src/main/java/org/apache/axiom/datatype/xsd/Util.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * 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.axiom.datatype.xsd;
-
-final class Util {
-    private Util() {}
-    
-    static boolean isWhitespace(char c) {
-        return c == ' ' || c == '\r' || c == '\n' || c == '\t';
-    }
-}
diff --git a/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSQNameTypeImpl.java b/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSQNameTypeImpl.java
index 509dcca..3da9d38 100644
--- a/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSQNameTypeImpl.java
+++ b/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSQNameTypeImpl.java
@@ -23,43 +23,24 @@ import java.text.ParseException;
 import javax.xml.namespace.QName;
 
 import org.apache.axiom.datatype.ContextAccessor;
+import org.apache.axiom.datatype.TypeHelper;
 import org.apache.axiom.datatype.UnexpectedCharacterException;
-import org.apache.axiom.datatype.UnexpectedEndOfStringException;
 
 final class XSQNameTypeImpl implements XSQNameType {
     public <S,O> QName parse(String literal, ContextAccessor<S,O> contextAccessor, S contextObject, O options)
             throws ParseException {
-        int len = literal.length();
-        int start = -1;
-        int end = -1;
+        final int start = TypeHelper.getStartIndex(literal);
+        final int end = TypeHelper.getEndIndex(literal);
         int colonIndex = -1;
-        for (int index = 0; index<len; index++) {
-            char c = literal.charAt(index);
-            if (Util.isWhitespace(c)) {
-                if (start != -1 && end == -1) {
-                    end = index;
-                }
-            } else {
-                if (start == -1) {
-                    start = index;
-                } else if (end != -1) {
+        for (int index = start; index<end; index++) {
+            // TODO: we should check that the literal is a valid NCName
+            if (literal.charAt(index) == ':') {
+                if (colonIndex != -1) {
                     throw new UnexpectedCharacterException(literal, index);
                 }
-                // TODO: we should check that the literal is a valid NCName
-                if (literal.charAt(index) == ':') {
-                    if (colonIndex != -1) {
-                        throw new UnexpectedCharacterException(literal, index);
-                    }
-                    colonIndex = index;
-                }
+                colonIndex = index;
             }
         }
-        if (start == -1) {
-            throw new UnexpectedEndOfStringException(literal);
-        }
-        if (end == -1) {
-            end = len;
-        }
         String prefix;
         String localPart;
         if (colonIndex == -1) {


[ws-axiom] 24/25: Fix type parameter bound.

Posted by dk...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

dkulp pushed a commit to branch datatypes
in repository https://gitbox.apache.org/repos/asf/ws-axiom.git

commit 8ccc9bbb5c826bfc4f224033279344a09920e2e2
Author: Andreas Veithen <ve...@apache.org>
AuthorDate: Sun Dec 6 01:03:16 2015 +0000

    Fix type parameter bound.
---
 datatypes/src/main/java/org/apache/axiom/datatype/xsd/TemporalType.java | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/datatypes/src/main/java/org/apache/axiom/datatype/xsd/TemporalType.java b/datatypes/src/main/java/org/apache/axiom/datatype/xsd/TemporalType.java
index 5ac445b..d690d7b 100644
--- a/datatypes/src/main/java/org/apache/axiom/datatype/xsd/TemporalType.java
+++ b/datatypes/src/main/java/org/apache/axiom/datatype/xsd/TemporalType.java
@@ -25,7 +25,7 @@ import org.apache.axiom.datatype.TypeHelper;
 import org.apache.axiom.datatype.UnexpectedCharacterException;
 import org.apache.axiom.datatype.UnexpectedEndOfStringException;
 
-public abstract class TemporalType<T> extends InvariantType<T> {
+public abstract class TemporalType<T extends Temporal> extends InvariantType<T> {
     abstract boolean hasDatePart();
     abstract boolean hasTimePart();
     abstract T createInstance(boolean bc, String aeon, int year, int month, int day, int hour,


[ws-axiom] 18/25: Merge latest changes from trunk.

Posted by dk...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

dkulp pushed a commit to branch datatypes
in repository https://gitbox.apache.org/repos/asf/ws-axiom.git

commit 8c0abe646991e3653f556c14475cd773d409b79e
Merge: 843e7c5 1f5af20
Author: Andreas Veithen <ve...@apache.org>
AuthorDate: Sat Dec 5 00:26:08 2015 +0000

    Merge latest changes from trunk.

 pom.xml                                            | 72 +++++++++++++++++++---
 systests/integration-tests/pom.xml                 |  2 +-
 .../org/apache/axiom/om/SAXResultXMLBeansTest.java |  3 -
 systests/jboss-tests/pom.xml                       | 37 +++++++++--
 systests/pom.xml                                   | 12 ++++
 systests/wss4j-tests/pom.xml                       | 42 +++++++++++++
 testing/dom-testsuite/pom.xml                      | 28 +++++++++
 .../apache/axiom/ts/dom/DOMTestSuiteBuilder.java   |  2 +
 .../TestLookupNamespaceURIDefaultBindings.java     | 47 ++++++++++++++
 .../element/TestLookupPrefixDefaultBindings.java   | 47 ++++++++++++++
 testing/xml-truth/src/site/markdown/index.md.vm    |  6 +-
 .../org/apache/axiom/truth/xml/XMLSubjectTest.java |  2 +
 12 files changed, 280 insertions(+), 20 deletions(-)



[ws-axiom] 23/25: Simplify class hierarchy.

Posted by dk...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

dkulp pushed a commit to branch datatypes
in repository https://gitbox.apache.org/repos/asf/ws-axiom.git

commit f4bf05788080d4a77f126599d1f52e0057d576ae
Author: Andreas Veithen <ve...@apache.org>
AuthorDate: Sun Dec 6 01:00:02 2015 +0000

    Simplify class hierarchy.
---
 .../axiom/soap/impl/intf/SOAP11BooleanType.java    |   4 +-
 .../axiom/datatype/AbstractInvariantType.java      |  31 -----
 .../org/apache/axiom/datatype/InvariantType.java   |  14 ++-
 .../org/apache/axiom/datatype/xsd/Temporal.java    |  48 +++++++-
 .../apache/axiom/datatype/xsd/TemporalImpl.java    |  68 -----------
 .../apache/axiom/datatype/xsd/TemporalType.java    |   4 +-
 .../apache/axiom/datatype/xsd/XSBooleanType.java   |  45 ++++++-
 .../axiom/datatype/xsd/XSBooleanTypeImpl.java      |  62 ----------
 .../java/org/apache/axiom/datatype/xsd/XSDate.java |  87 +++++++++++++-
 .../org/apache/axiom/datatype/xsd/XSDateImpl.java  | 106 -----------------
 .../org/apache/axiom/datatype/xsd/XSDateTime.java  | 108 ++++++++++++++++-
 .../apache/axiom/datatype/xsd/XSDateTimeImpl.java  | 129 ---------------------
 .../apache/axiom/datatype/xsd/XSDateTimeType.java  |  24 +++-
 .../axiom/datatype/xsd/XSDateTimeTypeImpl.java     |  39 -------
 .../org/apache/axiom/datatype/xsd/XSDateType.java  |  21 +++-
 .../apache/axiom/datatype/xsd/XSDateTypeImpl.java  |  38 ------
 .../org/apache/axiom/datatype/xsd/XSQNameType.java |  75 +++++++++++-
 .../apache/axiom/datatype/xsd/XSQNameTypeImpl.java |  93 ---------------
 .../apache/axiom/datatype/xsd/XSStringType.java    |  16 ++-
 .../axiom/datatype/xsd/XSStringTypeImpl.java       |  33 ------
 .../java/org/apache/axiom/datatype/xsd/XSTime.java |  83 ++++++++++++-
 .../org/apache/axiom/datatype/xsd/XSTimeImpl.java  | 103 ----------------
 .../org/apache/axiom/datatype/xsd/XSTimeType.java  |  21 +++-
 .../apache/axiom/datatype/xsd/XSTimeTypeImpl.java  |  38 ------
 24 files changed, 519 insertions(+), 771 deletions(-)

diff --git a/aspects/om-aspects/src/main/java/org/apache/axiom/soap/impl/intf/SOAP11BooleanType.java b/aspects/om-aspects/src/main/java/org/apache/axiom/soap/impl/intf/SOAP11BooleanType.java
index c2b113f..8b87134 100644
--- a/aspects/om-aspects/src/main/java/org/apache/axiom/soap/impl/intf/SOAP11BooleanType.java
+++ b/aspects/om-aspects/src/main/java/org/apache/axiom/soap/impl/intf/SOAP11BooleanType.java
@@ -20,10 +20,10 @@ package org.apache.axiom.soap.impl.intf;
 
 import java.text.ParseException;
 
-import org.apache.axiom.datatype.AbstractInvariantType;
+import org.apache.axiom.datatype.InvariantType;
 import org.apache.axiom.datatype.TypeHelper;
 
-final class SOAP11BooleanType extends AbstractInvariantType<Boolean> {
+final class SOAP11BooleanType extends InvariantType<Boolean> {
     static final SOAP11BooleanType INSTANCE = new SOAP11BooleanType();
     
     private SOAP11BooleanType() {}
diff --git a/datatypes/src/main/java/org/apache/axiom/datatype/AbstractInvariantType.java b/datatypes/src/main/java/org/apache/axiom/datatype/AbstractInvariantType.java
deleted file mode 100644
index 30a4a97..0000000
--- a/datatypes/src/main/java/org/apache/axiom/datatype/AbstractInvariantType.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * 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.axiom.datatype;
-
-import java.text.ParseException;
-
-public abstract class AbstractInvariantType<T> implements InvariantType<T> {
-    public final <S,O> T parse(String literal, ContextAccessor<S,O> contextAccessor, S contextObject, O options) throws ParseException {
-        return parse(literal);
-    }
-
-    public final <S,O> String format(T value, ContextAccessor<S,O> contextAccessor, S contextObject, O options) {
-        return format(value);
-    }
-}
diff --git a/datatypes/src/main/java/org/apache/axiom/datatype/InvariantType.java b/datatypes/src/main/java/org/apache/axiom/datatype/InvariantType.java
index 88faefe..62414d3 100644
--- a/datatypes/src/main/java/org/apache/axiom/datatype/InvariantType.java
+++ b/datatypes/src/main/java/org/apache/axiom/datatype/InvariantType.java
@@ -20,7 +20,15 @@ package org.apache.axiom.datatype;
 
 import java.text.ParseException;
 
-public interface InvariantType<T> extends Type<T> {
-    T parse(String literal) throws ParseException;
-    String format(T value);
+public abstract class InvariantType<T> implements Type<T> {
+    public final <S,O> T parse(String literal, ContextAccessor<S,O> contextAccessor, S contextObject, O options) throws ParseException {
+        return parse(literal);
+    }
+
+    public final <S,O> String format(T value, ContextAccessor<S,O> contextAccessor, S contextObject, O options) {
+        return format(value);
+    }
+
+    public abstract T parse(String literal) throws ParseException;
+    public abstract String format(T value);
 }
diff --git a/datatypes/src/main/java/org/apache/axiom/datatype/xsd/Temporal.java b/datatypes/src/main/java/org/apache/axiom/datatype/xsd/Temporal.java
index c971da9..ce6850d 100644
--- a/datatypes/src/main/java/org/apache/axiom/datatype/xsd/Temporal.java
+++ b/datatypes/src/main/java/org/apache/axiom/datatype/xsd/Temporal.java
@@ -22,10 +22,24 @@ import java.util.GregorianCalendar;
 import java.util.TimeZone;
 
 /**
- * A temporal value. This is the base interface for {@link XSDate}, {@link XSTime} and
+ * A temporal value. This is the base class for {@link XSDate}, {@link XSTime} and
  * {@link XSDateTime}.
  */
-public interface Temporal {
+public abstract class Temporal {
+    abstract boolean hasDatePart();
+    abstract boolean hasTimePart();
+    abstract boolean isBC();
+    abstract String getAeon();
+    abstract int getYear();
+    abstract int getMonth();
+    abstract int getDay();
+    abstract int getHour();
+    abstract int getMinute();
+    abstract int getSecond();
+    abstract int getNanoSecond();
+    abstract SimpleTimeZone getTimeZone();
+    abstract String getNanoSecondFraction();
+    
     /**
      * Convert this value to a calendar. For {@link XSDate} and {@link XSTime}, only the
      * corresponding fields are filled in and all other fields are left unspecified.
@@ -38,12 +52,38 @@ public interface Temporal {
      *             if this temporal object doesn't have a time zone and no default time zone was
      *             specified
      */
-    GregorianCalendar getCalendar(TimeZone defaultTimeZone);
+    public final GregorianCalendar getCalendar(TimeZone defaultTimeZone) {
+        // TODO: check aeon
+        TimeZone timeZone = getTimeZone();
+        if (timeZone == null) {
+            if (defaultTimeZone == null) {
+                throw new NoTimeZoneException();
+            }
+            timeZone = defaultTimeZone;
+        }
+        GregorianCalendar calendar = new GregorianCalendar(timeZone);
+        if (hasDatePart()) {
+            // TODO: BC
+            // TODO: throw exception if aeon is not null
+            calendar.set(GregorianCalendar.YEAR, getYear());
+            calendar.set(GregorianCalendar.MONTH, getMonth()-1);
+            calendar.set(GregorianCalendar.DAY_OF_MONTH, getDay());
+        }
+        if (hasTimePart()) {
+            calendar.set(GregorianCalendar.HOUR_OF_DAY, getHour());
+            calendar.set(GregorianCalendar.MINUTE, getMinute());
+            calendar.set(GregorianCalendar.SECOND, getSecond());
+            calendar.set(GregorianCalendar.MILLISECOND, getNanoSecond()/1000000);
+        }
+        return calendar;
+    }
     
     /**
      * Determine if this temporal value has a time zone.
      * 
      * @return <code>true</code> if the object has a time zone, <code>false</code> otherwise
      */
-    boolean hasTimeZone();
+    public final boolean hasTimeZone() {
+        return getTimeZone() != null;
+    }
 }
diff --git a/datatypes/src/main/java/org/apache/axiom/datatype/xsd/TemporalImpl.java b/datatypes/src/main/java/org/apache/axiom/datatype/xsd/TemporalImpl.java
deleted file mode 100644
index 5e381c2..0000000
--- a/datatypes/src/main/java/org/apache/axiom/datatype/xsd/TemporalImpl.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * 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.axiom.datatype.xsd;
-
-import java.util.GregorianCalendar;
-import java.util.TimeZone;
-
-abstract class TemporalImpl implements Temporal {
-    abstract boolean hasDatePart();
-    abstract boolean hasTimePart();
-    abstract boolean isBC();
-    abstract String getAeon();
-    abstract int getYear();
-    abstract int getMonth();
-    abstract int getDay();
-    abstract int getHour();
-    abstract int getMinute();
-    abstract int getSecond();
-    abstract int getNanoSecond();
-    abstract SimpleTimeZone getTimeZone();
-    abstract String getNanoSecondFraction();
-    
-    public final GregorianCalendar getCalendar(TimeZone defaultTimeZone) {
-        // TODO: check aeon
-        TimeZone timeZone = getTimeZone();
-        if (timeZone == null) {
-            if (defaultTimeZone == null) {
-                throw new NoTimeZoneException();
-            }
-            timeZone = defaultTimeZone;
-        }
-        GregorianCalendar calendar = new GregorianCalendar(timeZone);
-        if (hasDatePart()) {
-            // TODO: BC
-            // TODO: throw exception if aeon is not null
-            calendar.set(GregorianCalendar.YEAR, getYear());
-            calendar.set(GregorianCalendar.MONTH, getMonth()-1);
-            calendar.set(GregorianCalendar.DAY_OF_MONTH, getDay());
-        }
-        if (hasTimePart()) {
-            calendar.set(GregorianCalendar.HOUR_OF_DAY, getHour());
-            calendar.set(GregorianCalendar.MINUTE, getMinute());
-            calendar.set(GregorianCalendar.SECOND, getSecond());
-            calendar.set(GregorianCalendar.MILLISECOND, getNanoSecond()/1000000);
-        }
-        return calendar;
-    }
-    
-    public boolean hasTimeZone() {
-        return getTimeZone() != null;
-    }
-}
diff --git a/datatypes/src/main/java/org/apache/axiom/datatype/xsd/TemporalType.java b/datatypes/src/main/java/org/apache/axiom/datatype/xsd/TemporalType.java
index cbb25ae..5ac445b 100644
--- a/datatypes/src/main/java/org/apache/axiom/datatype/xsd/TemporalType.java
+++ b/datatypes/src/main/java/org/apache/axiom/datatype/xsd/TemporalType.java
@@ -20,12 +20,12 @@ package org.apache.axiom.datatype.xsd;
 
 import java.text.ParseException;
 
-import org.apache.axiom.datatype.AbstractInvariantType;
+import org.apache.axiom.datatype.InvariantType;
 import org.apache.axiom.datatype.TypeHelper;
 import org.apache.axiom.datatype.UnexpectedCharacterException;
 import org.apache.axiom.datatype.UnexpectedEndOfStringException;
 
-abstract class TemporalType<T> extends AbstractInvariantType<T> {
+public abstract class TemporalType<T> extends InvariantType<T> {
     abstract boolean hasDatePart();
     abstract boolean hasTimePart();
     abstract T createInstance(boolean bc, String aeon, int year, int month, int day, int hour,
diff --git a/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSBooleanType.java b/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSBooleanType.java
index df66daf..3e945d4 100644
--- a/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSBooleanType.java
+++ b/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSBooleanType.java
@@ -18,8 +18,49 @@
  */
 package org.apache.axiom.datatype.xsd;
 
+import java.text.ParseException;
+
 import org.apache.axiom.datatype.InvariantType;
+import org.apache.axiom.datatype.TypeHelper;
+
+public final class XSBooleanType extends InvariantType<Boolean> {
+    public static final XSBooleanType INSTANCE = new XSBooleanType();
+
+    private XSBooleanType() {}
+    
+    private static boolean equals(String s1, int start, String s2) {
+        for (int i=0, len=s2.length(); i<len; i++) {
+            if (s1.charAt(start+i) != s2.charAt(i)) {
+                return false;
+            }
+        }
+        return true;
+    }
+    
+    public Boolean parse(String literal) throws ParseException {
+        int start = TypeHelper.getStartIndex(literal);
+        int end = TypeHelper.getEndIndex(literal);
+        switch (end-start) {
+            case 1:
+                switch (literal.charAt(start)) {
+                    case '0': return Boolean.FALSE;
+                    case '1': return Boolean.TRUE;
+                }
+                break;
+            case 4:
+                if (equals(literal, start, "true")) {
+                    return Boolean.TRUE;
+                }
+                break;
+            case 5:
+                if (equals(literal, start, "false")) {
+                    return Boolean.FALSE;
+                }
+        }
+        throw new ParseException("Unexpected boolean literal", start);
+    }
 
-public interface XSBooleanType extends InvariantType<Boolean> {
-    XSBooleanType INSTANCE = new XSBooleanTypeImpl();
+    public String format(Boolean value) {
+        return value.toString();
+    }
 }
diff --git a/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSBooleanTypeImpl.java b/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSBooleanTypeImpl.java
deleted file mode 100644
index 8912274..0000000
--- a/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSBooleanTypeImpl.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * 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.axiom.datatype.xsd;
-
-import java.text.ParseException;
-
-import org.apache.axiom.datatype.AbstractInvariantType;
-import org.apache.axiom.datatype.TypeHelper;
-
-final class XSBooleanTypeImpl extends AbstractInvariantType<Boolean> implements XSBooleanType {
-    private static boolean equals(String s1, int start, String s2) {
-        for (int i=0, len=s2.length(); i<len; i++) {
-            if (s1.charAt(start+i) != s2.charAt(i)) {
-                return false;
-            }
-        }
-        return true;
-    }
-    
-    public Boolean parse(String literal) throws ParseException {
-        int start = TypeHelper.getStartIndex(literal);
-        int end = TypeHelper.getEndIndex(literal);
-        switch (end-start) {
-            case 1:
-                switch (literal.charAt(start)) {
-                    case '0': return Boolean.FALSE;
-                    case '1': return Boolean.TRUE;
-                }
-                break;
-            case 4:
-                if (equals(literal, start, "true")) {
-                    return Boolean.TRUE;
-                }
-                break;
-            case 5:
-                if (equals(literal, start, "false")) {
-                    return Boolean.FALSE;
-                }
-        }
-        throw new ParseException("Unexpected boolean literal", start);
-    }
-
-    public String format(Boolean value) {
-        return value.toString();
-    }
-}
diff --git a/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSDate.java b/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSDate.java
index 45bef69..dce1fc9 100644
--- a/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSDate.java
+++ b/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSDate.java
@@ -18,6 +18,89 @@
  */
 package org.apache.axiom.datatype.xsd;
 
-public interface XSDate extends Temporal {
-    XSDateTime getDayStart();
+public final class XSDate extends Temporal {
+    private final boolean bc;
+    private final String aeon;
+    private final int year;
+    private final int month;
+    private final int day;
+    private final SimpleTimeZone timeZone;
+    
+    XSDate(boolean bc, String aeon, int year, int month, int day, SimpleTimeZone timeZone) {
+        this.bc = bc;
+        this.aeon = aeon;
+        this.year = year;
+        this.month = month;
+        this.day = day;
+        this.timeZone = timeZone;
+    }
+
+    @Override
+    boolean hasDatePart() {
+        return true;
+    }
+
+    @Override
+    boolean hasTimePart() {
+        return false;
+    }
+
+    @Override
+    boolean isBC() {
+        return bc;
+    }
+
+    @Override
+    String getAeon() {
+        return aeon;
+    }
+
+    @Override
+    int getYear() {
+        return year;
+    }
+
+    @Override
+    int getMonth() {
+        return month;
+    }
+
+    @Override
+    int getDay() {
+        return day;
+    }
+
+    @Override
+    int getHour() {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    int getMinute() {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    int getSecond() {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    int getNanoSecond() {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    String getNanoSecondFraction() {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    SimpleTimeZone getTimeZone() {
+        return timeZone;
+    }
+
+    public XSDateTime getDayStart() {
+        return new XSDateTime(bc, aeon, year, month, day, 0, 0, 0, 0, null, timeZone);
+    }
 }
diff --git a/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSDateImpl.java b/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSDateImpl.java
deleted file mode 100644
index 4eb748a..0000000
--- a/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSDateImpl.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * 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.axiom.datatype.xsd;
-
-final class XSDateImpl extends TemporalImpl implements XSDate {
-    private final boolean bc;
-    private final String aeon;
-    private final int year;
-    private final int month;
-    private final int day;
-    private final SimpleTimeZone timeZone;
-    
-    XSDateImpl(boolean bc, String aeon, int year, int month, int day, SimpleTimeZone timeZone) {
-        this.bc = bc;
-        this.aeon = aeon;
-        this.year = year;
-        this.month = month;
-        this.day = day;
-        this.timeZone = timeZone;
-    }
-
-    @Override
-    boolean hasDatePart() {
-        return true;
-    }
-
-    @Override
-    boolean hasTimePart() {
-        return false;
-    }
-
-    @Override
-    boolean isBC() {
-        return bc;
-    }
-
-    @Override
-    String getAeon() {
-        return aeon;
-    }
-
-    @Override
-    int getYear() {
-        return year;
-    }
-
-    @Override
-    int getMonth() {
-        return month;
-    }
-
-    @Override
-    int getDay() {
-        return day;
-    }
-
-    @Override
-    int getHour() {
-        throw new UnsupportedOperationException();
-    }
-
-    @Override
-    int getMinute() {
-        throw new UnsupportedOperationException();
-    }
-
-    @Override
-    int getSecond() {
-        throw new UnsupportedOperationException();
-    }
-
-    @Override
-    int getNanoSecond() {
-        throw new UnsupportedOperationException();
-    }
-
-    @Override
-    String getNanoSecondFraction() {
-        throw new UnsupportedOperationException();
-    }
-
-    @Override
-    SimpleTimeZone getTimeZone() {
-        return timeZone;
-    }
-
-    public XSDateTime getDayStart() {
-        return new XSDateTimeImpl(bc, aeon, year, month, day, 0, 0, 0, 0, null, timeZone);
-    }
-}
diff --git a/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSDateTime.java b/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSDateTime.java
index dbf45db..3986a75 100644
--- a/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSDateTime.java
+++ b/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSDateTime.java
@@ -21,10 +21,107 @@ package org.apache.axiom.datatype.xsd;
 import java.util.Date;
 import java.util.TimeZone;
 
-public interface XSDateTime extends Temporal {
-    XSDate getDate();
-    XSTime getTime();
+public final class XSDateTime extends Temporal {
+    private final boolean bc;
+    private final String aeon;
+    private final int year;
+    private final int month;
+    private final int day;
+    private final int hour;
+    private final int minute;
+    private final int second;
+    private final int nanoSecond;
+    private final String nanoSecondFraction;
+    private final SimpleTimeZone timeZone;
     
+    XSDateTime(boolean bc, String aeon, int year, int month, int day, int hour, int minute,
+            int second, int nanoSecond, String nanoSecondFraction, SimpleTimeZone timeZone) {
+        this.bc = bc;
+        this.aeon = aeon;
+        this.year = year;
+        this.month = month;
+        this.day = day;
+        this.hour = hour;
+        this.minute = minute;
+        this.second = second;
+        this.nanoSecond = nanoSecond;
+        this.nanoSecondFraction = nanoSecondFraction;
+        this.timeZone = timeZone;
+    }
+    
+    @Override
+    boolean hasDatePart() {
+        return true;
+    }
+
+    @Override
+    boolean hasTimePart() {
+        return true;
+    }
+
+    @Override
+    boolean isBC() {
+        return bc;
+    }
+
+    @Override
+    String getAeon() {
+        return aeon;
+    }
+
+    @Override
+    int getYear() {
+        return year;
+    }
+
+    @Override
+    int getMonth() {
+        return month;
+    }
+
+    @Override
+    int getDay() {
+        return day;
+    }
+
+    @Override
+    int getHour() {
+        return hour;
+    }
+
+    @Override
+    int getMinute() {
+        return minute;
+    }
+
+    @Override
+    int getSecond() {
+        return second;
+    }
+
+    @Override
+    int getNanoSecond() {
+        return nanoSecond;
+    }
+
+    @Override
+    String getNanoSecondFraction() {
+        return nanoSecondFraction;
+    }
+
+    @Override
+    SimpleTimeZone getTimeZone() {
+        return timeZone;
+    }
+
+    public XSDate getDate() {
+        return new XSDate(bc, aeon, year, month, day, timeZone);
+    }
+
+    public XSTime getTime() {
+        return new XSTime(hour, minute, second, nanoSecond, nanoSecondFraction, timeZone);
+    }
+
     /**
      * Convert this date/time to a {@link Date} object.
      * 
@@ -34,5 +131,8 @@ public interface XSDateTime extends Temporal {
      * @throws NoTimeZoneException
      *             if this date/time doesn't have a time zone and no default time zone was specified
      */
-    Date getDate(TimeZone defaultTimeZone);
+    public Date getDate(TimeZone defaultTimeZone) {
+        // TODO: fast path for dates in the 20th and 21st century
+        return getCalendar(defaultTimeZone).getTime();
+    }
 }
diff --git a/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSDateTimeImpl.java b/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSDateTimeImpl.java
deleted file mode 100644
index 6d33144..0000000
--- a/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSDateTimeImpl.java
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- * 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.axiom.datatype.xsd;
-
-import java.util.Date;
-import java.util.TimeZone;
-
-final class XSDateTimeImpl extends TemporalImpl implements XSDateTime {
-    private final boolean bc;
-    private final String aeon;
-    private final int year;
-    private final int month;
-    private final int day;
-    private final int hour;
-    private final int minute;
-    private final int second;
-    private final int nanoSecond;
-    private final String nanoSecondFraction;
-    private final SimpleTimeZone timeZone;
-    
-    XSDateTimeImpl(boolean bc, String aeon, int year, int month, int day, int hour, int minute,
-            int second, int nanoSecond, String nanoSecondFraction, SimpleTimeZone timeZone) {
-        this.bc = bc;
-        this.aeon = aeon;
-        this.year = year;
-        this.month = month;
-        this.day = day;
-        this.hour = hour;
-        this.minute = minute;
-        this.second = second;
-        this.nanoSecond = nanoSecond;
-        this.nanoSecondFraction = nanoSecondFraction;
-        this.timeZone = timeZone;
-    }
-    
-    @Override
-    boolean hasDatePart() {
-        return true;
-    }
-
-    @Override
-    boolean hasTimePart() {
-        return true;
-    }
-
-    @Override
-    boolean isBC() {
-        return bc;
-    }
-
-    @Override
-    String getAeon() {
-        return aeon;
-    }
-
-    @Override
-    int getYear() {
-        return year;
-    }
-
-    @Override
-    int getMonth() {
-        return month;
-    }
-
-    @Override
-    int getDay() {
-        return day;
-    }
-
-    @Override
-    int getHour() {
-        return hour;
-    }
-
-    @Override
-    int getMinute() {
-        return minute;
-    }
-
-    @Override
-    int getSecond() {
-        return second;
-    }
-
-    @Override
-    int getNanoSecond() {
-        return nanoSecond;
-    }
-
-    @Override
-    String getNanoSecondFraction() {
-        return nanoSecondFraction;
-    }
-
-    @Override
-    SimpleTimeZone getTimeZone() {
-        return timeZone;
-    }
-
-    public XSDate getDate() {
-        return new XSDateImpl(bc, aeon, year, month, day, timeZone);
-    }
-
-    public XSTime getTime() {
-        return new XSTimeImpl(hour, minute, second, nanoSecond, nanoSecondFraction, timeZone);
-    }
-
-    public Date getDate(TimeZone defaultTimeZone) {
-        // TODO: fast path for dates in the 20th and 21st century
-        return getCalendar(defaultTimeZone).getTime();
-    }
-}
diff --git a/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSDateTimeType.java b/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSDateTimeType.java
index 5b3cbb4..63c044b 100644
--- a/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSDateTimeType.java
+++ b/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSDateTimeType.java
@@ -18,8 +18,26 @@
  */
 package org.apache.axiom.datatype.xsd;
 
-import org.apache.axiom.datatype.InvariantType;
+public final class XSDateTimeType extends TemporalType<XSDateTime> {
+    public static final XSDateTimeType INSTANCE = new XSDateTimeType();
 
-public interface XSDateTimeType extends InvariantType<XSDateTime> {
-    XSDateTimeType INSTANCE = new XSDateTimeTypeImpl();
+    private XSDateTimeType() {}
+    
+    @Override
+    boolean hasDatePart() {
+        return true;
+    }
+
+    @Override
+    boolean hasTimePart() {
+        return true;
+    }
+
+    @Override
+    XSDateTime createInstance(boolean bc, String aeon, int year, int month, int day, int hour,
+            int minute, int second, int nanoSecond, String nanoSecondFraction,
+            SimpleTimeZone timeZone) {
+        return new XSDateTime(bc, aeon, year, month, day, hour, minute, second, nanoSecond,
+                nanoSecondFraction, timeZone);
+    }
 }
diff --git a/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSDateTimeTypeImpl.java b/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSDateTimeTypeImpl.java
deleted file mode 100644
index 8d19cda..0000000
--- a/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSDateTimeTypeImpl.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * 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.axiom.datatype.xsd;
-
-final class XSDateTimeTypeImpl extends TemporalType<XSDateTime> implements XSDateTimeType {
-    @Override
-    boolean hasDatePart() {
-        return true;
-    }
-
-    @Override
-    boolean hasTimePart() {
-        return true;
-    }
-
-    @Override
-    XSDateTime createInstance(boolean bc, String aeon, int year, int month, int day, int hour,
-            int minute, int second, int nanoSecond, String nanoSecondFraction,
-            SimpleTimeZone timeZone) {
-        return new XSDateTimeImpl(bc, aeon, year, month, day, hour, minute, second, nanoSecond,
-                nanoSecondFraction, timeZone);
-    }
-}
diff --git a/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSDateType.java b/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSDateType.java
index e982540..39412b0 100644
--- a/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSDateType.java
+++ b/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSDateType.java
@@ -18,8 +18,25 @@
  */
 package org.apache.axiom.datatype.xsd;
 
-import org.apache.axiom.datatype.InvariantType;
+public final class XSDateType extends TemporalType<XSDate> {
+    public static final XSDateType INSTANCE = new XSDateType();
+    
+    private XSDateType() {}
+    
+    @Override
+    boolean hasDatePart() {
+        return true;
+    }
 
-public interface XSDateType extends InvariantType<XSDate> {
+    @Override
+    boolean hasTimePart() {
+        return false;
+    }
 
+    @Override
+    XSDate createInstance(boolean bc, String aeon, int year, int month, int day, int hour,
+            int minute, int second, int nanoSecond, String nanoSecondFraction,
+            SimpleTimeZone timeZone) {
+        return new XSDate(bc, aeon, year, month, day, timeZone);
+    }
 }
diff --git a/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSDateTypeImpl.java b/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSDateTypeImpl.java
deleted file mode 100644
index 901a798..0000000
--- a/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSDateTypeImpl.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * 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.axiom.datatype.xsd;
-
-final class XSDateTypeImpl extends TemporalType<XSDate> implements XSDateType {
-    @Override
-    boolean hasDatePart() {
-        return true;
-    }
-
-    @Override
-    boolean hasTimePart() {
-        return false;
-    }
-
-    @Override
-    XSDate createInstance(boolean bc, String aeon, int year, int month, int day, int hour,
-            int minute, int second, int nanoSecond, String nanoSecondFraction,
-            SimpleTimeZone timeZone) {
-        return new XSDateImpl(bc, aeon, year, month, day, timeZone);
-    }
-}
diff --git a/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSQNameType.java b/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSQNameType.java
index c8497ac..e50a918 100644
--- a/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSQNameType.java
+++ b/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSQNameType.java
@@ -18,10 +18,81 @@
  */
 package org.apache.axiom.datatype.xsd;
 
+import java.text.ParseException;
+
+import javax.xml.XMLConstants;
 import javax.xml.namespace.QName;
 
+import org.apache.axiom.datatype.ContextAccessor;
 import org.apache.axiom.datatype.Type;
+import org.apache.axiom.datatype.TypeHelper;
+import org.apache.axiom.datatype.UnexpectedCharacterException;
+import org.apache.axiom.util.xml.NSUtils;
+
+public final class XSQNameType implements Type<QName> {
+    public static final XSQNameType INSTANCE = new XSQNameType();
+
+    private XSQNameType() {}
+
+    public <S,O> QName parse(String literal, ContextAccessor<S,O> contextAccessor, S contextObject, O options)
+            throws ParseException {
+        final int start = TypeHelper.getStartIndex(literal);
+        final int end = TypeHelper.getEndIndex(literal);
+        int colonIndex = -1;
+        for (int index = start; index<end; index++) {
+            // TODO: we should check that the literal is a valid NCName
+            if (literal.charAt(index) == ':') {
+                if (colonIndex != -1) {
+                    throw new UnexpectedCharacterException(literal, index);
+                }
+                colonIndex = index;
+            }
+        }
+        String prefix;
+        String localPart;
+        if (colonIndex == -1) {
+            prefix = "";
+            localPart = literal.toString();
+        } else {
+            prefix = literal.substring(start, colonIndex);
+            localPart = literal.substring(colonIndex+1, end);
+        }
+        String namespaceURI;
+        if (prefix.equals(XMLConstants.XML_NS_PREFIX)) {
+            namespaceURI = XMLConstants.XML_NS_URI;
+        } else if (prefix.equals(XMLConstants.XMLNS_ATTRIBUTE)) {
+            namespaceURI = XMLConstants.XMLNS_ATTRIBUTE_NS_URI;
+        } else {
+            namespaceURI = contextAccessor.lookupNamespaceURI(contextObject, options, prefix);
+            if (namespaceURI == null) {
+                throw new ParseException("Unbound namespace prefix \"" + prefix + "\"", 0);
+            }
+        }
+        return new QName(namespaceURI, localPart, prefix);
+    }
 
-public interface XSQNameType extends Type<QName> {
-    XSQNameType INSTANCE = new XSQNameTypeImpl();
+    public <S,O> String format(QName value, ContextAccessor<S,O> contextAccessor, S contextObject, O options) {
+        String prefix = value.getPrefix();
+        String namespaceURI = value.getNamespaceURI();
+        if (!namespaceURI.equals(contextAccessor.lookupNamespaceURI(contextObject, options, prefix))) {
+            if (namespaceURI.length() == 0) {
+                contextAccessor.declareNamespace(contextObject, options, "", "");
+            } else {
+                if (prefix.length() == 0) {
+                    prefix = contextAccessor.lookupPrefix(contextObject, options, namespaceURI);
+                    if (prefix == null) {
+                        prefix = NSUtils.generatePrefix(namespaceURI);
+                        contextAccessor.declareNamespace(contextObject, options, prefix, namespaceURI);;
+                    }
+                } else {
+                    contextAccessor.declareNamespace(contextObject, options, prefix, namespaceURI);;
+                }
+            }
+        }
+        if (prefix.length() == 0) {
+            return value.getLocalPart();
+        } else {
+            return prefix + ":" + value.getLocalPart();
+        }
+    }
 }
diff --git a/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSQNameTypeImpl.java b/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSQNameTypeImpl.java
deleted file mode 100644
index e896f97..0000000
--- a/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSQNameTypeImpl.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * 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.axiom.datatype.xsd;
-
-import java.text.ParseException;
-
-import javax.xml.XMLConstants;
-import javax.xml.namespace.QName;
-
-import org.apache.axiom.datatype.ContextAccessor;
-import org.apache.axiom.datatype.TypeHelper;
-import org.apache.axiom.datatype.UnexpectedCharacterException;
-import org.apache.axiom.util.xml.NSUtils;
-
-final class XSQNameTypeImpl implements XSQNameType {
-    public <S,O> QName parse(String literal, ContextAccessor<S,O> contextAccessor, S contextObject, O options)
-            throws ParseException {
-        final int start = TypeHelper.getStartIndex(literal);
-        final int end = TypeHelper.getEndIndex(literal);
-        int colonIndex = -1;
-        for (int index = start; index<end; index++) {
-            // TODO: we should check that the literal is a valid NCName
-            if (literal.charAt(index) == ':') {
-                if (colonIndex != -1) {
-                    throw new UnexpectedCharacterException(literal, index);
-                }
-                colonIndex = index;
-            }
-        }
-        String prefix;
-        String localPart;
-        if (colonIndex == -1) {
-            prefix = "";
-            localPart = literal.toString();
-        } else {
-            prefix = literal.substring(start, colonIndex);
-            localPart = literal.substring(colonIndex+1, end);
-        }
-        String namespaceURI;
-        if (prefix.equals(XMLConstants.XML_NS_PREFIX)) {
-            namespaceURI = XMLConstants.XML_NS_URI;
-        } else if (prefix.equals(XMLConstants.XMLNS_ATTRIBUTE)) {
-            namespaceURI = XMLConstants.XMLNS_ATTRIBUTE_NS_URI;
-        } else {
-            namespaceURI = contextAccessor.lookupNamespaceURI(contextObject, options, prefix);
-            if (namespaceURI == null) {
-                throw new ParseException("Unbound namespace prefix \"" + prefix + "\"", 0);
-            }
-        }
-        return new QName(namespaceURI, localPart, prefix);
-    }
-
-    public <S,O> String format(QName value, ContextAccessor<S,O> contextAccessor, S contextObject, O options) {
-        String prefix = value.getPrefix();
-        String namespaceURI = value.getNamespaceURI();
-        if (!namespaceURI.equals(contextAccessor.lookupNamespaceURI(contextObject, options, prefix))) {
-            if (namespaceURI.length() == 0) {
-                contextAccessor.declareNamespace(contextObject, options, "", "");
-            } else {
-                if (prefix.length() == 0) {
-                    prefix = contextAccessor.lookupPrefix(contextObject, options, namespaceURI);
-                    if (prefix == null) {
-                        prefix = NSUtils.generatePrefix(namespaceURI);
-                        contextAccessor.declareNamespace(contextObject, options, prefix, namespaceURI);;
-                    }
-                } else {
-                    contextAccessor.declareNamespace(contextObject, options, prefix, namespaceURI);;
-                }
-            }
-        }
-        if (prefix.length() == 0) {
-            return value.getLocalPart();
-        } else {
-            return prefix + ":" + value.getLocalPart();
-        }
-    }
-}
diff --git a/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSStringType.java b/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSStringType.java
index 068656e..1ec759d 100644
--- a/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSStringType.java
+++ b/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSStringType.java
@@ -18,8 +18,20 @@
  */
 package org.apache.axiom.datatype.xsd;
 
+import java.text.ParseException;
+
 import org.apache.axiom.datatype.InvariantType;
 
-public interface XSStringType extends InvariantType<String> {
-    XSStringType INSTANCE = new XSStringTypeImpl();
+public final class XSStringType extends InvariantType<String> {
+    public static final XSStringType INSTANCE = new XSStringType();
+
+    private XSStringType() {}
+    
+    public String parse(String literal) throws ParseException {
+        return literal;
+    }
+
+    public String format(String value) {
+        return value;
+    }
 }
diff --git a/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSStringTypeImpl.java b/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSStringTypeImpl.java
deleted file mode 100644
index 7c08cc6..0000000
--- a/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSStringTypeImpl.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * 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.axiom.datatype.xsd;
-
-import java.text.ParseException;
-
-import org.apache.axiom.datatype.AbstractInvariantType;
-
-final class XSStringTypeImpl extends AbstractInvariantType<String> implements XSStringType {
-    public String parse(String literal) throws ParseException {
-        return literal;
-    }
-
-    public String format(String value) {
-        return value;
-    }
-}
diff --git a/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSTime.java b/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSTime.java
index dda1343..76cf708 100644
--- a/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSTime.java
+++ b/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSTime.java
@@ -18,5 +18,86 @@
  */
 package org.apache.axiom.datatype.xsd;
 
-public interface XSTime extends Temporal {
+public final class XSTime extends Temporal {
+    private final int hour;
+    private final int minute;
+    private final int second;
+    private final int nanoSecond;
+    private final String nanoSecondFraction;
+    private final SimpleTimeZone timeZone;
+    
+    XSTime(int hour, int minute, int second, int nanoSecond, String nanoSecondFraction,
+            SimpleTimeZone timeZone) {
+        this.hour = hour;
+        this.minute = minute;
+        this.second = second;
+        this.nanoSecond = nanoSecond;
+        this.nanoSecondFraction = nanoSecondFraction;
+        this.timeZone = timeZone;
+    }
+
+    @Override
+    boolean hasDatePart() {
+        return false;
+    }
+
+    @Override
+    boolean hasTimePart() {
+        return true;
+    }
+
+    @Override
+    boolean isBC() {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    String getAeon() {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    int getYear() {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    int getMonth() {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    int getDay() {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    int getHour() {
+        return hour;
+    }
+
+    @Override
+    int getMinute() {
+        return minute;
+    }
+
+    @Override
+    int getSecond() {
+        return second;
+    }
+
+    @Override
+    int getNanoSecond() {
+        return nanoSecond;
+    }
+
+    @Override
+    String getNanoSecondFraction() {
+        return nanoSecondFraction;
+    }
+
+    @Override
+    SimpleTimeZone getTimeZone() {
+        return timeZone;
+    }
 }
diff --git a/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSTimeImpl.java b/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSTimeImpl.java
deleted file mode 100644
index 5b2e347..0000000
--- a/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSTimeImpl.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * 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.axiom.datatype.xsd;
-
-final class XSTimeImpl extends TemporalImpl implements XSTime {
-    private final int hour;
-    private final int minute;
-    private final int second;
-    private final int nanoSecond;
-    private final String nanoSecondFraction;
-    private final SimpleTimeZone timeZone;
-    
-    XSTimeImpl(int hour, int minute, int second, int nanoSecond, String nanoSecondFraction,
-            SimpleTimeZone timeZone) {
-        this.hour = hour;
-        this.minute = minute;
-        this.second = second;
-        this.nanoSecond = nanoSecond;
-        this.nanoSecondFraction = nanoSecondFraction;
-        this.timeZone = timeZone;
-    }
-
-    @Override
-    boolean hasDatePart() {
-        return false;
-    }
-
-    @Override
-    boolean hasTimePart() {
-        return true;
-    }
-
-    @Override
-    boolean isBC() {
-        throw new UnsupportedOperationException();
-    }
-
-    @Override
-    String getAeon() {
-        throw new UnsupportedOperationException();
-    }
-
-    @Override
-    int getYear() {
-        throw new UnsupportedOperationException();
-    }
-
-    @Override
-    int getMonth() {
-        throw new UnsupportedOperationException();
-    }
-
-    @Override
-    int getDay() {
-        throw new UnsupportedOperationException();
-    }
-
-    @Override
-    int getHour() {
-        return hour;
-    }
-
-    @Override
-    int getMinute() {
-        return minute;
-    }
-
-    @Override
-    int getSecond() {
-        return second;
-    }
-
-    @Override
-    int getNanoSecond() {
-        return nanoSecond;
-    }
-
-    @Override
-    String getNanoSecondFraction() {
-        return nanoSecondFraction;
-    }
-
-    @Override
-    SimpleTimeZone getTimeZone() {
-        return timeZone;
-    }
-}
diff --git a/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSTimeType.java b/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSTimeType.java
index 1d9c8ac..86ad9ca 100644
--- a/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSTimeType.java
+++ b/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSTimeType.java
@@ -18,8 +18,25 @@
  */
 package org.apache.axiom.datatype.xsd;
 
-import org.apache.axiom.datatype.InvariantType;
+public final class XSTimeType extends TemporalType<XSTime> {
+    public static final XSTimeType INSTANCE = new XSTimeType();
+    
+    private XSTimeType() {}
+    
+    @Override
+    boolean hasDatePart() {
+        return false;
+    }
 
-public interface XSTimeType extends InvariantType<XSTime> {
+    @Override
+    boolean hasTimePart() {
+        return true;
+    }
 
+    @Override
+    XSTime createInstance(boolean bc, String aeon, int year, int month, int day, int hour,
+            int minute, int second, int nanoSecond, String nanoSecondFraction,
+            SimpleTimeZone timeZone) {
+        return new XSTime(hour, minute, second, nanoSecond, nanoSecondFraction, timeZone);
+    }
 }
diff --git a/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSTimeTypeImpl.java b/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSTimeTypeImpl.java
deleted file mode 100644
index 039945d..0000000
--- a/datatypes/src/main/java/org/apache/axiom/datatype/xsd/XSTimeTypeImpl.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * 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.axiom.datatype.xsd;
-
-final class XSTimeTypeImpl extends TemporalType<XSTime> implements XSTimeType {
-    @Override
-    boolean hasDatePart() {
-        return false;
-    }
-
-    @Override
-    boolean hasTimePart() {
-        return true;
-    }
-
-    @Override
-    XSTime createInstance(boolean bc, String aeon, int year, int month, int day, int hour,
-            int minute, int second, int nanoSecond, String nanoSecondFraction,
-            SimpleTimeZone timeZone) {
-        return new XSTimeImpl(hour, minute, second, nanoSecond, nanoSecondFraction, timeZone);
-    }
-}


[ws-axiom] 19/25: Build test cases for XSQNameType that don't depend on DOMHelper.

Posted by dk...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

dkulp pushed a commit to branch datatypes
in repository https://gitbox.apache.org/repos/asf/ws-axiom.git

commit c05cc4ad3628402e77385836226bf8ce1b66bed8
Author: Andreas Veithen <ve...@apache.org>
AuthorDate: Sat Dec 5 00:46:34 2015 +0000

    Build test cases for XSQNameType that don't depend on DOMHelper.
---
 .../axiom/datatype/helper/dom/DOMHelperTest.java   | 33 -----------
 .../axiom/datatype/xsd/MapContextAccessor.java     | 42 ++++++++++++++
 .../apache/axiom/datatype/xsd/XSQNameTypeTest.java | 64 ++++++++++++++++++++++
 3 files changed, 106 insertions(+), 33 deletions(-)

diff --git a/datatypes/src/test/java/org/apache/axiom/datatype/helper/dom/DOMHelperTest.java b/datatypes/src/test/java/org/apache/axiom/datatype/helper/dom/DOMHelperTest.java
index 61311e7..ac9455c 100644
--- a/datatypes/src/test/java/org/apache/axiom/datatype/helper/dom/DOMHelperTest.java
+++ b/datatypes/src/test/java/org/apache/axiom/datatype/helper/dom/DOMHelperTest.java
@@ -20,9 +20,6 @@ package org.apache.axiom.datatype.helper.dom;
 
 import static com.google.common.truth.Truth.assertThat;
 
-import java.text.ParseException;
-
-import javax.xml.XMLConstants;
 import javax.xml.namespace.QName;
 import javax.xml.parsers.DocumentBuilderFactory;
 
@@ -47,14 +44,6 @@ public class DOMHelperTest {
         assertThat(qname.getPrefix()).isEqualTo("p");
     }
     
-    @Test(expected=ParseException.class)
-    public void testGetQNameFromElementUnboundPrefix() throws Exception {
-        Document document = newDocument();
-        Element element = document.createElementNS(null, "test");
-        element.setTextContent("ns:test");
-        DOMHelper.getValue(element, XSQNameType.INSTANCE);
-    }
-    
     @Test
     public void testGetQNameFromElementNoDefaultNamespace() throws Exception {
         Document document = newDocument();
@@ -65,26 +54,4 @@ public class DOMHelperTest {
         assertThat(qname.getLocalPart()).isEqualTo("value");
         assertThat(qname.getPrefix()).isEmpty();
     }
-    
-    @Test
-    public void testGetQNameFromElementXmlPrefix() throws Exception {
-        Document document = newDocument();
-        Element element = document.createElementNS(null, "test");
-        element.setTextContent("xml:value");
-        QName qname = DOMHelper.getValue(element, XSQNameType.INSTANCE);
-        assertThat(qname.getNamespaceURI()).isEqualTo(XMLConstants.XML_NS_URI);
-        assertThat(qname.getLocalPart()).isEqualTo("value");
-        assertThat(qname.getPrefix()).isEqualTo(XMLConstants.XML_NS_PREFIX);
-    }
-    
-    @Test
-    public void testGetQNameFromElementXmlnsPrefix() throws Exception {
-        Document document = newDocument();
-        Element element = document.createElementNS(null, "test");
-        element.setTextContent("xmlns:value");
-        QName qname = DOMHelper.getValue(element, XSQNameType.INSTANCE);
-        assertThat(qname.getNamespaceURI()).isEqualTo(XMLConstants.XMLNS_ATTRIBUTE_NS_URI);
-        assertThat(qname.getLocalPart()).isEqualTo("value");
-        assertThat(qname.getPrefix()).isEqualTo(XMLConstants.XMLNS_ATTRIBUTE);
-    }
 }
diff --git a/datatypes/src/test/java/org/apache/axiom/datatype/xsd/MapContextAccessor.java b/datatypes/src/test/java/org/apache/axiom/datatype/xsd/MapContextAccessor.java
new file mode 100644
index 0000000..a8c55bc
--- /dev/null
+++ b/datatypes/src/test/java/org/apache/axiom/datatype/xsd/MapContextAccessor.java
@@ -0,0 +1,42 @@
+/*
+ * 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.axiom.datatype.xsd;
+
+import java.util.Map;
+
+import org.apache.axiom.datatype.ContextAccessor;
+
+public final class MapContextAccessor implements ContextAccessor<Map<String,String>,Void> {
+    public static final MapContextAccessor INSTANCE = new MapContextAccessor();
+    
+    private MapContextAccessor() {}
+
+    public String lookupNamespaceURI(Map<String,String> context, Void options, String prefix) {
+        String namespaceURI = context.get(prefix);
+        if (namespaceURI == null && prefix.isEmpty()) {
+            namespaceURI = "";
+        }
+        return namespaceURI;
+    }
+
+    public String lookupPrefix(Map<String,String> context, Void options, String namespaceURI) {
+        // TODO
+        throw new UnsupportedOperationException();
+    }
+}
diff --git a/datatypes/src/test/java/org/apache/axiom/datatype/xsd/XSQNameTypeTest.java b/datatypes/src/test/java/org/apache/axiom/datatype/xsd/XSQNameTypeTest.java
new file mode 100644
index 0000000..eb0ae7c
--- /dev/null
+++ b/datatypes/src/test/java/org/apache/axiom/datatype/xsd/XSQNameTypeTest.java
@@ -0,0 +1,64 @@
+/*
+ * 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.axiom.datatype.xsd;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import java.text.ParseException;
+import java.util.Collections;
+
+import javax.xml.XMLConstants;
+import javax.xml.namespace.QName;
+
+import org.junit.Test;
+
+public class XSQNameTypeTest {
+    @Test
+    public void testBoundPrefix() throws ParseException {
+        QName qname = XSQNameType.INSTANCE.parse("p:test", MapContextAccessor.INSTANCE,
+                Collections.singletonMap("p", "urn:test"), null);
+        assertThat(qname.getNamespaceURI()).isEqualTo("urn:test");
+        assertThat(qname.getLocalPart()).isEqualTo("test");
+        assertThat(qname.getPrefix()).isEqualTo("p");
+    }
+    
+    @Test(expected=ParseException.class)
+    public void testUnboundPrefix() throws ParseException {
+        XSQNameType.INSTANCE.parse("ns:test", MapContextAccessor.INSTANCE,
+                Collections.<String,String>emptyMap(), null);
+    }
+    
+    @Test
+    public void testXmlPrefix() throws ParseException {
+        QName qname = XSQNameType.INSTANCE.parse("xml:value", MapContextAccessor.INSTANCE,
+                Collections.<String,String>emptyMap(), null);
+        assertThat(qname.getNamespaceURI()).isEqualTo(XMLConstants.XML_NS_URI);
+        assertThat(qname.getLocalPart()).isEqualTo("value");
+        assertThat(qname.getPrefix()).isEqualTo(XMLConstants.XML_NS_PREFIX);
+    }
+    
+    @Test
+    public void testXmlnsPrefix() throws ParseException {
+        QName qname = XSQNameType.INSTANCE.parse("xmlns:value", MapContextAccessor.INSTANCE,
+                Collections.<String,String>emptyMap(), null);
+        assertThat(qname.getNamespaceURI()).isEqualTo(XMLConstants.XMLNS_ATTRIBUTE_NS_URI);
+        assertThat(qname.getLocalPart()).isEqualTo("value");
+        assertThat(qname.getPrefix()).isEqualTo(XMLConstants.XMLNS_ATTRIBUTE);
+    }
+}


[ws-axiom] 11/25: Move API specific helpers to distinct packages for improved OSGi integration.

Posted by dk...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

dkulp pushed a commit to branch datatypes
in repository https://gitbox.apache.org/repos/asf/ws-axiom.git

commit 016632fe89d5166003a27118f013514b4313aa68
Author: Andreas Veithen <ve...@apache.org>
AuthorDate: Sun Nov 22 16:19:36 2015 +0000

    Move API specific helpers to distinct packages for improved OSGi integration.
---
 .../org/apache/axiom/datatype/{ => helper/dom}/DOMContextAccessor.java | 3 ++-
 .../java/org/apache/axiom/datatype/{ => helper/dom}/DOMHelper.java     | 3 ++-
 .../java/org/apache/axiom/datatype/{ => helper/dom}/DOMHelperTest.java | 2 +-
 3 files changed, 5 insertions(+), 3 deletions(-)

diff --git a/datatypes/src/main/java/org/apache/axiom/datatype/DOMContextAccessor.java b/datatypes/src/main/java/org/apache/axiom/datatype/helper/dom/DOMContextAccessor.java
similarity index 93%
rename from datatypes/src/main/java/org/apache/axiom/datatype/DOMContextAccessor.java
rename to datatypes/src/main/java/org/apache/axiom/datatype/helper/dom/DOMContextAccessor.java
index fc3ed9f..6ce6156 100644
--- a/datatypes/src/main/java/org/apache/axiom/datatype/DOMContextAccessor.java
+++ b/datatypes/src/main/java/org/apache/axiom/datatype/helper/dom/DOMContextAccessor.java
@@ -16,8 +16,9 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.axiom.datatype;
+package org.apache.axiom.datatype.helper.dom;
 
+import org.apache.axiom.datatype.ContextAccessor;
 import org.w3c.dom.Element;
 
 final class DOMContextAccessor implements ContextAccessor<Element,Void> {
diff --git a/datatypes/src/main/java/org/apache/axiom/datatype/DOMHelper.java b/datatypes/src/main/java/org/apache/axiom/datatype/helper/dom/DOMHelper.java
similarity index 94%
rename from datatypes/src/main/java/org/apache/axiom/datatype/DOMHelper.java
rename to datatypes/src/main/java/org/apache/axiom/datatype/helper/dom/DOMHelper.java
index 46f13cc..81b2457 100644
--- a/datatypes/src/main/java/org/apache/axiom/datatype/DOMHelper.java
+++ b/datatypes/src/main/java/org/apache/axiom/datatype/helper/dom/DOMHelper.java
@@ -16,10 +16,11 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.axiom.datatype;
+package org.apache.axiom.datatype.helper.dom;
 
 import java.text.ParseException;
 
+import org.apache.axiom.datatype.Type;
 import org.w3c.dom.Element;
 
 public final class DOMHelper {
diff --git a/datatypes/src/test/java/org/apache/axiom/datatype/DOMHelperTest.java b/datatypes/src/test/java/org/apache/axiom/datatype/helper/dom/DOMHelperTest.java
similarity index 97%
rename from datatypes/src/test/java/org/apache/axiom/datatype/DOMHelperTest.java
rename to datatypes/src/test/java/org/apache/axiom/datatype/helper/dom/DOMHelperTest.java
index 97e3fab..75f1f7e 100644
--- a/datatypes/src/test/java/org/apache/axiom/datatype/DOMHelperTest.java
+++ b/datatypes/src/test/java/org/apache/axiom/datatype/helper/dom/DOMHelperTest.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.axiom.datatype;
+package org.apache.axiom.datatype.helper.dom;
 
 import static com.google.common.truth.Truth.assertThat;
 


[ws-axiom] 12/25: Merge latest changes from trunk.

Posted by dk...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

dkulp pushed a commit to branch datatypes
in repository https://gitbox.apache.org/repos/asf/ws-axiom.git

commit 1cb5c08c6201fe5b8a4cc23eaa365b55492218a5
Merge: 016632f 9f85ee3
Author: Andreas Veithen <ve...@apache.org>
AuthorDate: Sun Nov 22 21:15:31 2015 +0000

    Merge latest changes from trunk.

 apidocs/pom.xml                                    |  2 +-
 aspects/core-aspects/pom.xml                       |  2 +-
 aspects/dom-aspects/pom.xml                        |  7 ++-
 .../src/main/java/org/apache/axiom/dom/NSUtil.java | 19 +-----
 aspects/fom-aspects/pom.xml                        |  2 +-
 aspects/om-aspects/pom.xml                         |  2 +-
 aspects/pom.xml                                    |  2 +-
 aspects/shared-aspects/pom.xml                     |  2 +-
 axiom-all/pom.xml                                  |  2 +-
 axiom-api/pom.xml                                  |  2 +-
 .../apache/axiom/om/impl/builder/StAXBuilder.java  |  4 --
 axiom-c14n/pom.xml                                 |  2 +-
 axiom-compat/pom.xml                               |  2 +-
 axiom-jaxb/pom.xml                                 |  2 +-
 buildutils/jar-resource-bundle/pom.xml             |  2 +-
 buildutils/pom.xml                                 |  2 +-
 buildutils/shade-axiom-xml/pom.xml                 |  2 +-
 buildutils/shade-osgi/pom.xml                      |  2 +-
 code-coverage/pom.xml                              | 21 ++++++-
 {testing/multiton => components}/pom.xml           | 21 +++----
 {testing/multiton => components/xml-utils}/pom.xml | 27 +++++----
 .../java/org/apache/axiom/util/xml/XMLChar.java    | 70 ++++++++++++++++++++++
 devguide/pom.xml                                   |  2 +-
 distribution/pom.xml                               |  2 +-
 implementations/axiom-dom/pom.xml                  |  2 +-
 implementations/axiom-impl/pom.xml                 |  2 +-
 implementations/fom-impl/pom.xml                   |  2 +-
 implementations/pom.xml                            |  3 +-
 pom.xml                                            |  5 +-
 samples/pom.xml                                    |  2 +-
 src/site/markdown/release-notes/1.2.17.md          |  2 +
 src/site/site.xml                                  |  1 +
 systests/cross-om-tests/pom.xml                    |  2 +-
 systests/eclipse-tests/pom.xml                     |  2 +-
 systests/integration-tests/pom.xml                 |  2 +-
 systests/jboss-tests/pom.xml                       |  2 +-
 systests/old-tests/pom.xml                         |  2 +-
 systests/osgi-tests/pom.xml                        |  2 +-
 systests/pom.xml                                   |  2 +-
 systests/spring-ws-tests/pom.xml                   |  2 +-
 systests/wss4j-tests/pom.xml                       |  2 +-
 testing/axiom-testsuite/pom.xml                    |  2 +-
 testing/axiom-truth/pom.xml                        |  2 +-
 testing/dom-testsuite/pom.xml                      |  2 +-
 testing/fom-testsuite/pom.xml                      |  2 +-
 testing/jaxen-testsuite/pom.xml                    |  2 +-
 testing/multiton/pom.xml                           |  2 +-
 testing/pom.xml                                    |  2 +-
 testing/saaj-testsuite/pom.xml                     |  2 +-
 testing/soap-testsuite/pom.xml                     |  7 ++-
 .../axiom/ts/soap/ConvertedSOAPSampleContent.java  |  6 +-
 testing/spring-ws-testsuite/pom.xml                |  2 +-
 testing/testutils/pom.xml                          |  2 +-
 testing/xml-testsuite/pom.xml                      |  2 +-
 testing/xml-truth/pom.xml                          |  2 +-
 .../org/apache/axiom/truth/xml/XMLSubjectTest.java | 17 ++++++
 userguide/pom.xml                                  |  2 +-
 57 files changed, 197 insertions(+), 99 deletions(-)

diff --cc implementations/pom.xml
index 24a48e6,a6d5180..1ce22de
--- a/implementations/pom.xml
+++ b/implementations/pom.xml
@@@ -88,7 -88,7 +88,8 @@@
                      <artifactSet>
                          <includes>
                              <include>${project.groupId}:*-aspects</include>
+                             <include>${project.groupId}:xml-utils</include>
 +                            <include>${project.groupId}:datatypes</include>
                              <include>org.aspectj:aspectjrt</include>
                          </includes>
                      </artifactSet>
diff --cc pom.xml
index 529056a,ba13fe7..f4a8c6d
--- a/pom.xml
+++ b/pom.xml
@@@ -223,7 -223,7 +223,8 @@@
          <module>testing</module>
          <module>aspects</module>
          <module>implementations</module>
+         <module>components</module>
 +        <module>datatypes</module>
      </modules>
  
      <scm>
diff --cc testing/soap-testsuite/pom.xml
index 658022a,80e24b3..f0d0ad5
--- a/testing/soap-testsuite/pom.xml
+++ b/testing/soap-testsuite/pom.xml
@@@ -46,10 -46,10 +46,15 @@@
          </dependency>
          <dependency>
              <groupId>${project.groupId}</groupId>
+             <artifactId>xml-utils</artifactId>
+             <version>${project.version}</version>
+         </dependency>
+         <dependency>
++            <groupId>${project.groupId}</groupId>
 +            <artifactId>datatypes</artifactId>
 +            <version>${project.version}</version>
 +        </dependency>
 +        <dependency>
              <groupId>commons-io</groupId>
              <artifactId>commons-io</artifactId>
          </dependency>
diff --cc testing/soap-testsuite/src/main/java/org/apache/axiom/ts/soap/ConvertedSOAPSampleContent.java
index 8c46e85,299a5ce..da6bffc
--- a/testing/soap-testsuite/src/main/java/org/apache/axiom/ts/soap/ConvertedSOAPSampleContent.java
+++ b/testing/soap-testsuite/src/main/java/org/apache/axiom/ts/soap/ConvertedSOAPSampleContent.java
@@@ -18,9 -18,10 +18,11 @@@
   */
  package org.apache.axiom.ts.soap;
  
+ import static org.apache.axiom.util.xml.XMLChar.isWhitespace;
+ 
  import java.io.InputStream;
  import java.io.OutputStream;
 +import java.text.ParseException;
  import java.util.HashMap;
  import java.util.Map;
  
@@@ -201,14 -208,12 +203,10 @@@ final class ConvertedSOAPSampleContent 
          return null;
      }
      
-     private static boolean isWhitespace(char c) {
-         return " \r\n\t".indexOf(c) != -1;
-     }
-     
 -    private static String transform(String text, TextTransformer transformer) {
 +    private static String[] getSurroundingWhitespace(String text) {
          int start = 0;
          while (isWhitespace(text.charAt(start))) {
 -            if (++start == text.length()) {
 -                return text;
 -            }
 +            start++;
          }
          int end = text.length();
          while (isWhitespace(text.charAt(end-1))) {


[ws-axiom] 15/25: Merge latest changes from trunk.

Posted by dk...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

dkulp pushed a commit to branch datatypes
in repository https://gitbox.apache.org/repos/asf/ws-axiom.git

commit 786cd7e01fc8a62f70f621c4b01ab69d8e8748b4
Merge: 23df3a6 e17e765
Author: Andreas Veithen <ve...@apache.org>
AuthorDate: Tue Nov 24 23:42:12 2015 +0000

    Merge latest changes from trunk.

 aspects/om-aspects/pom.xml                         |   5 +
 .../axiom/om/impl/common/AxiomElementSupport.aj    |  14 +-
 .../org/apache/axiom/om/impl/common/NSUtil.java    |   5 +-
 .../om/impl/common/factory/OMFactoryImpl.java      |   7 +-
 .../common/AxiomSOAP12FaultClassifierSupport.aj    |  20 +++
 .../axiom/om/impl/util/OMSerializerUtil.java       |   1 +
 components/xml-utils/pom.xml                       |   8 +
 .../java/org/apache/axiom/util/xml/NSUtils.java    |  66 ++++++++
 .../org/apache/axiom/util/xml/NSUtilsTest.java     |  53 ++++++
 .../org/apache/axiom/util/xml/namespaces.txt       | 177 +++++++++++++++++++++
 devguide/src/docbkx/devguide.xml                   |  22 +--
 etc/axiom.rdf                                      |   1 +
 .../soap/impl/dom/soap12/SOAP12FaultCodeImpl.java  |  31 ----
 .../impl/dom/soap12/SOAP12FaultSubCodeImpl.java    |  40 -----
 .../soap/impl/llom/soap12/SOAP12FaultCodeImpl.java |  28 ----
 .../impl/llom/soap12/SOAP12FaultSubCodeImpl.java   |  39 -----
 16 files changed, 352 insertions(+), 165 deletions(-)


[ws-axiom] 16/25: Increase test coverage and add Javadoc.

Posted by dk...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

dkulp pushed a commit to branch datatypes
in repository https://gitbox.apache.org/repos/asf/ws-axiom.git

commit 9dbd4c2d0970baa7d399114f7c6c6c823cf81481
Author: Andreas Veithen <ve...@apache.org>
AuthorDate: Wed Dec 2 19:50:57 2015 +0000

    Increase test coverage and add Javadoc.
---
 .../org/apache/axiom/datatype/ContextAccessor.java | 18 +++++++++++++++
 .../axiom/datatype/helper/dom/DOMHelperTest.java   | 27 +++++++++++++++++++++-
 2 files changed, 44 insertions(+), 1 deletion(-)

diff --git a/datatypes/src/main/java/org/apache/axiom/datatype/ContextAccessor.java b/datatypes/src/main/java/org/apache/axiom/datatype/ContextAccessor.java
index a384eb0..4abd1fc 100644
--- a/datatypes/src/main/java/org/apache/axiom/datatype/ContextAccessor.java
+++ b/datatypes/src/main/java/org/apache/axiom/datatype/ContextAccessor.java
@@ -19,6 +19,24 @@
 package org.apache.axiom.datatype;
 
 public interface ContextAccessor<T,O> {
+    /**
+     * Look up the namespace URI associated to the given prefix.
+     * 
+     * @param contextObject
+     *            The context object passed to
+     *            {@link Type#parse(String, ContextAccessor, Object, Object)} or
+     *            {@link Type#format(Object, ContextAccessor, Object, Object)}.
+     * @param options
+     *            The options passed to {@link Type#parse(String, ContextAccessor, Object, Object)}
+     *            or {@link Type#format(Object, ContextAccessor, Object, Object)}.
+     * @param prefix
+     *            The prefix to look for. If this parameter is the empty string, then the URI of the
+     *            default namespace will be returned.
+     * @return the namespace URI or <code>null</code> if the prefix is not bound; if the prefix is
+     *         the empty string and no default namespace declaration exists, then an empty string is
+     *         returned
+     */
     String lookupNamespaceURI(T contextObject, O options, String prefix);
+    
     String lookupPrefix(T contextObject, O options, String namespaceURI);
 }
diff --git a/datatypes/src/test/java/org/apache/axiom/datatype/helper/dom/DOMHelperTest.java b/datatypes/src/test/java/org/apache/axiom/datatype/helper/dom/DOMHelperTest.java
index 75f1f7e..00e994d 100644
--- a/datatypes/src/test/java/org/apache/axiom/datatype/helper/dom/DOMHelperTest.java
+++ b/datatypes/src/test/java/org/apache/axiom/datatype/helper/dom/DOMHelperTest.java
@@ -20,6 +20,8 @@ package org.apache.axiom.datatype.helper.dom;
 
 import static com.google.common.truth.Truth.assertThat;
 
+import java.text.ParseException;
+
 import javax.xml.namespace.QName;
 import javax.xml.parsers.DocumentBuilderFactory;
 
@@ -29,9 +31,13 @@ import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 
 public class DOMHelperTest {
+    private static Document newDocument() throws Exception {
+        return DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
+    }
+    
     @Test
     public void testGetQNameFromElement() throws Exception {
-        Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
+        Document document = newDocument();
         Element element = document.createElementNS("urn:test", "p:elem");
         element.setTextContent("p:value");
         QName qname = DOMHelper.getValue(element, XSQNameType.INSTANCE);
@@ -39,4 +45,23 @@ public class DOMHelperTest {
         assertThat(qname.getLocalPart()).isEqualTo("value");
         assertThat(qname.getPrefix()).isEqualTo("p");
     }
+    
+    @Test(expected=ParseException.class)
+    public void testGetQNameFromElementUnboundPrefix() throws Exception {
+        Document document = newDocument();
+        Element element = document.createElementNS(null, "test");
+        element.setTextContent("ns:test");
+        DOMHelper.getValue(element, XSQNameType.INSTANCE);
+    }
+    
+    @Test
+    public void testGetQNameFromElementNoDefaultNamespace() throws Exception {
+        Document document = newDocument();
+        Element element = document.createElementNS("urn:test", "p:test");
+        element.setTextContent("value");
+        QName qname = DOMHelper.getValue(element, XSQNameType.INSTANCE);
+        assertThat(qname.getNamespaceURI()).isEmpty();
+        assertThat(qname.getLocalPart()).isEqualTo("value");
+        assertThat(qname.getPrefix()).isEmpty();
+    }
 }


[ws-axiom] 10/25: Move API specific helpers to distinct packages for improved OSGi integration.

Posted by dk...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

dkulp pushed a commit to branch datatypes
in repository https://gitbox.apache.org/repos/asf/ws-axiom.git

commit 96c42579abf8efa16e56fef645fd919d60e3feae
Author: Andreas Veithen <ve...@apache.org>
AuthorDate: Sun Nov 22 16:19:13 2015 +0000

    Move API specific helpers to distinct packages for improved OSGi integration.
---
 .../main/java/org/apache/axiom/ts/soap/ConvertedSOAPSampleContent.java  | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/testing/soap-testsuite/src/main/java/org/apache/axiom/ts/soap/ConvertedSOAPSampleContent.java b/testing/soap-testsuite/src/main/java/org/apache/axiom/ts/soap/ConvertedSOAPSampleContent.java
index 36063c9..8c46e85 100644
--- a/testing/soap-testsuite/src/main/java/org/apache/axiom/ts/soap/ConvertedSOAPSampleContent.java
+++ b/testing/soap-testsuite/src/main/java/org/apache/axiom/ts/soap/ConvertedSOAPSampleContent.java
@@ -31,7 +31,7 @@ import javax.xml.transform.TransformerFactory;
 import javax.xml.transform.dom.DOMSource;
 import javax.xml.transform.stream.StreamResult;
 
-import org.apache.axiom.datatype.DOMHelper;
+import org.apache.axiom.datatype.helper.dom.DOMHelper;
 import org.apache.axiom.datatype.xsd.XSQNameType;
 import org.apache.axiom.testing.multiton.Multiton;
 import org.apache.axiom.ts.xml.ComputedMessageContent;