sis-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From desruisse...@apache.org
Subject svn commit: r1497454 - in /sis/trunk: ./ core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/distribution/ core/sis-metadata/src/test/java/org/apache/sis/internal/jaxb/gml/ core/sis-utility/src/main/java/org/apache/sis/internal/jaxb/ core/sis-u...
Date Thu, 27 Jun 2013 17:12:11 GMT
Author: desruisseaux
Date: Thu Jun 27 17:12:10 2013
New Revision: 1497454

URL: http://svn.apache.org/r1497454
Log:
Merge from the JDK6 branch.

Added:
    sis/trunk/core/sis-utility/src/main/java/org/apache/sis/internal/jaxb/gco/GO_LocalName.java
      - copied unchanged from r1497450, sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/internal/jaxb/gco/GO_LocalName.java
    sis/trunk/core/sis-utility/src/main/java/org/apache/sis/internal/jaxb/gco/NameAdapter.java
      - copied unchanged from r1497450, sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/internal/jaxb/gco/NameAdapter.java
    sis/trunk/core/sis-utility/src/main/java/org/apache/sis/setup/package-info.java
      - copied unchanged from r1497450, sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/setup/package-info.java
    sis/trunk/core/sis-utility/src/main/java/org/apache/sis/xml/PooledTemplate.java
      - copied unchanged from r1497450, sis/branches/JDK6/core/sis-utility/src/main/java/org/apache/sis/xml/PooledTemplate.java
    sis/trunk/core/sis-utility/src/test/java/org/apache/sis/test/mock/
      - copied from r1497450, sis/branches/JDK6/core/sis-utility/src/test/java/org/apache/sis/test/mock/
    sis/trunk/core/sis-utility/src/test/java/org/apache/sis/util/iso/NameMarshallingTest.java
      - copied unchanged from r1497450, sis/branches/JDK6/core/sis-utility/src/test/java/org/apache/sis/util/iso/NameMarshallingTest.java
Removed:
    sis/trunk/core/sis-utility/src/main/java/org/apache/sis/internal/jaxb/gco/LocalNameAdapter.java
    sis/trunk/core/sis-utility/src/main/java/org/apache/sis/internal/jaxb/gco/ScopedNameAdapter.java
    sis/trunk/core/sis-utility/src/test/java/org/apache/sis/internal/test/XMLTransformationTest.java
    sis/trunk/core/sis-utility/src/test/java/org/apache/sis/test/XMLTransformation.java
    sis/trunk/core/sis-utility/src/test/java/org/apache/sis/xml/ReferenceResolverMock.java
Modified:
    sis/trunk/   (props changed)
    sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/distribution/package-info.java
    sis/trunk/core/sis-metadata/src/test/java/org/apache/sis/internal/jaxb/gml/TimePeriodTest.java
    sis/trunk/core/sis-utility/src/main/java/org/apache/sis/internal/jaxb/XmlUtilities.java
    sis/trunk/core/sis-utility/src/main/java/org/apache/sis/internal/jaxb/gco/GO_GenericName.java
    sis/trunk/core/sis-utility/src/main/java/org/apache/sis/internal/system/DefaultFactories.java
    sis/trunk/core/sis-utility/src/main/java/org/apache/sis/setup/About.java
    sis/trunk/core/sis-utility/src/main/java/org/apache/sis/util/iso/AbstractName.java
    sis/trunk/core/sis-utility/src/main/java/org/apache/sis/util/iso/DefaultLocalName.java
    sis/trunk/core/sis-utility/src/main/java/org/apache/sis/util/iso/DefaultMemberName.java
    sis/trunk/core/sis-utility/src/main/java/org/apache/sis/util/iso/DefaultScopedName.java
    sis/trunk/core/sis-utility/src/main/java/org/apache/sis/util/iso/package-info.java
    sis/trunk/core/sis-utility/src/main/java/org/apache/sis/xml/MarshallerPool.java
    sis/trunk/core/sis-utility/src/main/java/org/apache/sis/xml/Pooled.java
    sis/trunk/core/sis-utility/src/main/java/org/apache/sis/xml/PooledMarshaller.java
    sis/trunk/core/sis-utility/src/main/java/org/apache/sis/xml/PooledUnmarshaller.java
    sis/trunk/core/sis-utility/src/test/java/org/apache/sis/internal/jaxb/gco/PropertyTypeTest.java
    sis/trunk/core/sis-utility/src/test/java/org/apache/sis/test/XMLComparator.java
    sis/trunk/core/sis-utility/src/test/java/org/apache/sis/test/XMLTestCase.java
    sis/trunk/core/sis-utility/src/test/java/org/apache/sis/test/suite/UtilityTestSuite.java

Propchange: sis/trunk/
------------------------------------------------------------------------------
  Merged /sis/branches/JDK7:r1496965-1497446
  Merged /sis/branches/JDK6:r1496972-1497450

Modified: sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/distribution/package-info.java
URL: http://svn.apache.org/viewvc/sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/distribution/package-info.java?rev=1497454&r1=1497453&r2=1497454&view=diff
==============================================================================
--- sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/distribution/package-info.java [UTF-8] (original)
+++ sis/trunk/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/distribution/package-info.java [UTF-8] Thu Jun 27 17:12:10 2013
@@ -92,8 +92,8 @@
 
     // Java types, primitive types and basic OGC types handling
     @XmlJavaTypeAdapter(UnitAdapter.class),
-    @XmlJavaTypeAdapter(LocalNameAdapter.class),
     @XmlJavaTypeAdapter(InternationalStringAdapter.class),
+    @XmlJavaTypeAdapter(GO_LocalName.class),
     @XmlJavaTypeAdapter(GO_DateTime.class),
     @XmlJavaTypeAdapter(GO_Decimal.class), @XmlJavaTypeAdapter(type=double.class, value=GO_Decimal.class),
     @XmlJavaTypeAdapter(GO_Integer.class), @XmlJavaTypeAdapter(type=int.class,    value=GO_Integer.class)

Modified: sis/trunk/core/sis-metadata/src/test/java/org/apache/sis/internal/jaxb/gml/TimePeriodTest.java
URL: http://svn.apache.org/viewvc/sis/trunk/core/sis-metadata/src/test/java/org/apache/sis/internal/jaxb/gml/TimePeriodTest.java?rev=1497454&r1=1497453&r2=1497454&view=diff
==============================================================================
--- sis/trunk/core/sis-metadata/src/test/java/org/apache/sis/internal/jaxb/gml/TimePeriodTest.java [UTF-8] (original)
+++ sis/trunk/core/sis-metadata/src/test/java/org/apache/sis/internal/jaxb/gml/TimePeriodTest.java [UTF-8] Thu Jun 27 17:12:10 2013
@@ -16,6 +16,8 @@
  */
 package org.apache.sis.internal.jaxb.gml;
 
+import java.util.Map;
+import java.util.HashMap;
 import java.util.Locale;
 import java.io.StringReader;
 import java.io.StringWriter;
@@ -24,8 +26,9 @@ import javax.xml.bind.Unmarshaller;
 import javax.xml.bind.JAXBContext;
 import javax.xml.bind.JAXBException;
 import javax.xml.datatype.DatatypeConfigurationException;
+import org.apache.sis.xml.XML;
+import org.apache.sis.xml.MarshallerPool;
 import org.apache.sis.internal.jaxb.XmlUtilities;
-import org.apache.sis.test.XMLTransformation;
 import org.apache.sis.test.XMLTestCase;
 import org.junit.BeforeClass;
 import org.junit.AfterClass;
@@ -47,47 +50,55 @@ import static org.apache.sis.test.TestUt
  */
 public final strictfp class TimePeriodTest extends XMLTestCase {
     /**
-     * The XML marshaller.
+     * A poll of configured {@link Marshaller} and {@link Unmarshaller}, created when first needed.
      */
-    private static Marshaller marshaller;
+    private static MarshallerPool pool;
 
     /**
-     * The XML unmarshaller.
+     * A buffer where to marshal.
      */
-    private static Unmarshaller unmarshaller;
+    private final StringWriter buffer = new StringWriter();
 
     /**
-     * A buffer where to marshal.
+     * Set the marshalling context to a fixed locale and timezone before to create the
+     * JAXB wrappers for temporal objects. Callers shall invoke {@link #clearContext()}
+     * after this method.
      */
-    private final StringWriter buffer = new StringWriter();
+    private void createContext() {
+        createContext(true, Locale.FRANCE, "CET");
+    }
 
     /**
-     * Creates the XML marshaller to be shared by all test methods.
+     * Creates the XML (un)marshaller pool to be shared by all test methods.
+     * The (un)marshallers locale and timezone will be set to fixed values.
      *
-     * @throws JAXBException If an error occurred while creating the marshaller.
+     * @throws JAXBException If an error occurred while creating the pool.
      */
     @BeforeClass
     public static void createMarshallers() throws JAXBException {
-        final JAXBContext context = JAXBContext.newInstance(TimeInstant.class, TimePeriod.class);
-        marshaller   = context.createMarshaller();
-        unmarshaller = context.createUnmarshaller();
+        final Map<String,Object> properties = new HashMap<String,Object>(4);
+        assertNull(properties.put(XML.LOCALE, Locale.FRANCE));
+        assertNull(properties.put(XML.TIMEZONE, "CET"));
+        pool = new MarshallerPool(JAXBContext.newInstance(TimeInstant.class, TimePeriod.class), properties);
     }
 
     /**
-     * Allows the garbage collector to collect the marshaller and unmarshallers.
+     * Invoked by JUnit after the execution of every tests in order to dispose
+     * the {@link MarshallerPool} instance used internally by this class.
      */
     @AfterClass
-    public static void disposeMarshallers() {
-        marshaller   = null;
-        unmarshaller = null;
+    public static void disposeMarshallerPool() {
+        pool = null;
     }
 
     /**
      * Creates a new time instant for the given date.
      */
-    private static TimeInstant createTimeInstant(final String date) throws DatatypeConfigurationException {
+    private TimeInstant createTimeInstant(final String date) throws DatatypeConfigurationException {
         final TimeInstant instant = new TimeInstant();
-        instant.timePosition = XmlUtilities.toXML(null, date(date));
+        createContext();
+        instant.timePosition = XmlUtilities.toXML(context, date(date));
+        clearContext();
         return instant;
     }
 
@@ -99,18 +110,22 @@ public final strictfp class TimePeriodTe
      */
     @Test
     public void testTimeInstant() throws JAXBException, DatatypeConfigurationException {
-        createContext(false, Locale.FRANCE, "CET");
-        String expected =
-            "<gml:TimeInstant>\n" +
-            "  <gml:timePosition>1992-01-01T01:00:00.000+01:00</gml:timePosition>\n" +
-            "</gml:TimeInstant>\n";
+        final Marshaller   marshaller   = pool.acquireMarshaller();
+        final Unmarshaller unmarshaller = pool.acquireUnmarshaller();
+
         final TimeInstant instant = createTimeInstant("1992-01-01 00:00:00");
         marshaller.marshal(instant, buffer);
         final String actual = buffer.toString();
-        expected = XMLTransformation.GML.optionallyRemovePrefix(expected, actual);
-        assertXmlEquals(expected, actual, "xmlns:*", "xsi:schemaLocation");
+        assertXmlEquals(
+                "<gml:TimeInstant>\n" +
+                "  <gml:timePosition>1992-01-01T01:00:00.000+01:00</gml:timePosition>\n" +
+                "</gml:TimeInstant>\n", actual, "xmlns:*", "xsi:schemaLocation");
+
         final TimeInstant test = (TimeInstant) unmarshaller.unmarshal(new StringReader(actual));
         assertEquals("1992-01-01 00:00:00", format(XmlUtilities.toDate(test.timePosition)));
+
+        pool.recycle(marshaller);
+        pool.recycle(unmarshaller);
     }
 
     /**
@@ -121,9 +136,11 @@ public final strictfp class TimePeriodTe
      */
     @Test
     public void testPeriodGML2() throws JAXBException {
-        createContext(false, Locale.FRANCE, "CET");
-        testPeriod(new TimePeriodBound.GML2(new DummyInstant(date("1992-01-01 00:00:00"))),
-                   new TimePeriodBound.GML2(new DummyInstant(date("2007-12-31 00:00:00"))),
+        createContext();
+        final TimePeriodBound begin = new TimePeriodBound.GML2(new DummyInstant(date("1992-01-01 00:00:00")));
+        final TimePeriodBound end   = new TimePeriodBound.GML2(new DummyInstant(date("2007-12-31 00:00:00")));
+        clearContext();
+        testPeriod(begin, end,
             "<gml:TimePeriod>\n" +
             "  <gml:begin>\n" +
             "    <gml:TimeInstant>\n" +
@@ -146,21 +163,23 @@ public final strictfp class TimePeriodTe
      * @param expected The expected string.
      */
     private void testPeriod(final TimePeriodBound begin, final TimePeriodBound end,
-            String expected, final boolean verifyValues) throws JAXBException
+            final String expected, final boolean verifyValues) throws JAXBException
     {
-        createContext(false, Locale.FRANCE, "CET");
+        final Marshaller   marshaller   = pool.acquireMarshaller();
+        final Unmarshaller unmarshaller = pool.acquireUnmarshaller();
         final TimePeriod period = new TimePeriod();
         period.begin = begin;
         period.end   = end;
         marshaller.marshal(period, buffer);
         final String actual = buffer.toString();
-        expected = XMLTransformation.GML.optionallyRemovePrefix(expected, actual);
         assertXmlEquals(expected, actual, "xmlns:*", "xsi:schemaLocation");
         final TimePeriod test = (TimePeriod) unmarshaller.unmarshal(new StringReader(actual));
         if (verifyValues) {
             assertEquals("1992-01-01 00:00:00", format(XmlUtilities.toDate(test.begin.calendar())));
             assertEquals("2007-12-31 00:00:00", format(XmlUtilities.toDate(test.end  .calendar())));
         }
+        pool.recycle(marshaller);
+        pool.recycle(unmarshaller);
     }
 
     /**
@@ -171,9 +190,11 @@ public final strictfp class TimePeriodTe
      */
     @Test
     public void testPeriodGML3() throws JAXBException {
-        createContext(false, Locale.FRANCE, "CET");
-        testPeriod(new TimePeriodBound.GML3(new DummyInstant(date("1992-01-01 00:00:00")), "before"),
-                   new TimePeriodBound.GML3(new DummyInstant(date("2007-12-31 00:00:00")), "after"),
+        createContext();
+        final TimePeriodBound begin = new TimePeriodBound.GML3(new DummyInstant(date("1992-01-01 00:00:00")), "before");
+        final TimePeriodBound end   = new TimePeriodBound.GML3(new DummyInstant(date("2007-12-31 00:00:00")), "after");
+        clearContext();
+        testPeriod(begin, end,
             "<gml:TimePeriod>\n" +
             "  <gml:beginPosition>1992-01-01T01:00:00+01:00</gml:beginPosition>\n" +
             "  <gml:endPosition>2007-12-31T01:00:00+01:00</gml:endPosition>\n" +
@@ -188,9 +209,11 @@ public final strictfp class TimePeriodTe
      */
     @Test
     public void testSimplifiedPeriodGML3() throws JAXBException {
-        createContext(false, Locale.FRANCE, "CET");
-        testPeriod(new TimePeriodBound.GML3(new DummyInstant(date("1992-01-01 23:00:00")), "before"),
-                   new TimePeriodBound.GML3(new DummyInstant(date("2007-12-30 23:00:00")), "after"),
+        createContext();
+        final TimePeriodBound begin = new TimePeriodBound.GML3(new DummyInstant(date("1992-01-01 23:00:00")), "before");
+        final TimePeriodBound end   = new TimePeriodBound.GML3(new DummyInstant(date("2007-12-30 23:00:00")), "after");
+        clearContext();
+        testPeriod(begin, end,
             "<gml:TimePeriod>\n" +
             "  <gml:beginPosition>1992-01-02</gml:beginPosition>\n" +
             "  <gml:endPosition>2007-12-31</gml:endPosition>\n" +
@@ -205,9 +228,11 @@ public final strictfp class TimePeriodTe
      */
     @Test
     public void testBeforePeriodGML3() throws JAXBException {
-        createContext(false, Locale.FRANCE, "CET");
-        testPeriod(new TimePeriodBound.GML3(null, "before"),
-                   new TimePeriodBound.GML3(new DummyInstant(date("2007-12-30 23:00:00")), "after"),
+        createContext();
+        final TimePeriodBound begin = new TimePeriodBound.GML3(null, "before");
+        final TimePeriodBound end   = new TimePeriodBound.GML3(new DummyInstant(date("2007-12-30 23:00:00")), "after");
+        clearContext();
+        testPeriod(begin, end,
             "<gml:TimePeriod>\n" +
             "  <gml:beginPosition indeterminatePosition=\"before\"/>\n" +
             "  <gml:endPosition>2007-12-31</gml:endPosition>\n" +
@@ -222,9 +247,11 @@ public final strictfp class TimePeriodTe
      */
     @Test
     public void testAfterPeriodGML3() throws JAXBException {
-        createContext(false, Locale.FRANCE, "CET");
-        testPeriod(new TimePeriodBound.GML3(new DummyInstant(date("1992-01-01 23:00:00")), "before"),
-                   new TimePeriodBound.GML3(null, "after"),
+        createContext();
+        final TimePeriodBound begin = new TimePeriodBound.GML3(new DummyInstant(date("1992-01-01 23:00:00")), "before");
+        final TimePeriodBound end   = new TimePeriodBound.GML3(null, "after");
+        clearContext();
+        testPeriod(begin, end,
             "<gml:TimePeriod>\n" +
             "  <gml:beginPosition>1992-01-02</gml:beginPosition>\n" +
             "  <gml:endPosition indeterminatePosition=\"after\"/>\n" +

Modified: sis/trunk/core/sis-utility/src/main/java/org/apache/sis/internal/jaxb/XmlUtilities.java
URL: http://svn.apache.org/viewvc/sis/trunk/core/sis-utility/src/main/java/org/apache/sis/internal/jaxb/XmlUtilities.java?rev=1497454&r1=1497453&r2=1497454&view=diff
==============================================================================
--- sis/trunk/core/sis-utility/src/main/java/org/apache/sis/internal/jaxb/XmlUtilities.java [UTF-8] (original)
+++ sis/trunk/core/sis-utility/src/main/java/org/apache/sis/internal/jaxb/XmlUtilities.java [UTF-8] Thu Jun 27 17:12:10 2013
@@ -141,7 +141,7 @@ public final class XmlUtilities extends 
      */
     public static XMLGregorianCalendar toXML(final Context context, final Date date) throws DatatypeConfigurationException {
         if (date != null) {
-            final GregorianCalendar calendar = createGregorianCalendar();
+            final GregorianCalendar calendar = createGregorianCalendar(context);
             calendar.setTime(date);
             return getDatatypeFactory().newXMLGregorianCalendar(calendar);
         }
@@ -155,11 +155,10 @@ public final class XmlUtilities extends 
      *
      * @return A Gregorian calendar initialized with the current timezone and locale.
      */
-    private static GregorianCalendar createGregorianCalendar() {
-        final Context current = Context.current();
-        if (current != null) {
-            final Locale locale = current.getLocale();
-            final TimeZone timezone = current.getTimeZone();
+    private static GregorianCalendar createGregorianCalendar(final Context context) {
+        if (context != null) {
+            final Locale locale = context.getLocale();
+            final TimeZone timezone = context.getTimeZone();
             /*
              * Use the appropriate contructor rather than setting ourself the null values to
              * the default locale or timezone, because the JDK constructors perform a better

Modified: sis/trunk/core/sis-utility/src/main/java/org/apache/sis/internal/jaxb/gco/GO_GenericName.java
URL: http://svn.apache.org/viewvc/sis/trunk/core/sis-utility/src/main/java/org/apache/sis/internal/jaxb/gco/GO_GenericName.java?rev=1497454&r1=1497453&r2=1497454&view=diff
==============================================================================
--- sis/trunk/core/sis-utility/src/main/java/org/apache/sis/internal/jaxb/gco/GO_GenericName.java [UTF-8] (original)
+++ sis/trunk/core/sis-utility/src/main/java/org/apache/sis/internal/jaxb/gco/GO_GenericName.java [UTF-8] Thu Jun 27 17:12:10 2013
@@ -16,19 +16,8 @@
  */
 package org.apache.sis.internal.jaxb.gco;
 
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.adapters.XmlAdapter;
-
-import org.opengis.util.TypeName;
-import org.opengis.util.LocalName;
-import org.opengis.util.MemberName;
 import org.opengis.util.GenericName;
-
 import org.apache.sis.util.iso.AbstractName;
-import org.apache.sis.util.iso.DefaultTypeName;
-import org.apache.sis.util.iso.DefaultMemberName;
-import org.apache.sis.util.iso.DefaultScopedName;
-import org.apache.sis.util.resources.Errors;
 
 
 /**
@@ -50,12 +39,7 @@ import org.apache.sis.util.resources.Err
  * @version 0.3
  * @module
  */
-public final class GO_GenericName extends XmlAdapter<GO_GenericName, GenericName> {
-    /**
-     * The generic name to be marshalled.
-     */
-    private AbstractName name;
-
+public final class GO_GenericName extends NameAdapter<GO_GenericName, GenericName> {
     /**
      * Empty constructor for JAXB only.
      */
@@ -65,128 +49,8 @@ public final class GO_GenericName extend
     /**
      * Wraps a name at marshalling-time.
      */
-    private GO_GenericName(final AbstractName name) {
-        this.name = name;
-    }
-
-    /**
-     * Ensures that the {@linkplain #name} is not already defined.
-     *
-     * @throws IllegalStateException If a name is already defined.
-     */
-    private void ensureUndefined() throws IllegalStateException {
-        if (name != null) {
-            throw new IllegalStateException(Errors.format(Errors.Keys.ValueAlreadyDefined_1, "name"));
-        }
-    }
-
-    /**
-     * Returns the {@code LocalName} generated from the metadata value.
-     * The local name is returned only if it is not a {@link TypeName} or a {@link MemberName}
-     * (otherwise, the corresponding {@code getXXX()} method needs to be invoked instead.
-     *
-     * @return The current local name, or {@code null} if none.
-     *
-     * @see #getTypeName()
-     * @see #getMemberName()
-     */
-    @XmlElement(name = "LocalName")
-    public String getLocalName() {
-        final Object name = this.name;
-        return (name instanceof LocalName) && !(name instanceof TypeName)
-                && !(name instanceof MemberName) ? name.toString() : null;
-    }
-
-    /**
-     * Sets the value for the {@code LocalName}.
-     * This method is called at unmarshalling-time by JAXB.
-     *
-     * @param  name The new name.
-     * @throws IllegalStateException If a name is already defined.
-     */
-    public void setLocalName(final String name) throws IllegalStateException {
-        ensureUndefined();
-        if (name == null) {
-            this.name = null;
-        } else {
-            /*
-             * Following cast should be safe because the getNameFactory() method asked specifically
-             * for a DefaultNameFactory instance, which is known to create AbstractName instances.
-             */
-            this.name = (AbstractName) LocalNameAdapter.getNameFactory().createLocalName(null, name);
-        }
-    }
-
-    /**
-     * Returns the {@code ScopedName} generated from the metadata value.
-     * This method is called at marshalling-time by JAXB.
-     *
-     * @return The current name, or {@code null} if none.
-     */
-    @XmlElement(name = "ScopedName")
-    public DefaultScopedName getScopedName() {
-        final Object name = this.name;
-        return (name instanceof DefaultScopedName) ? (DefaultScopedName) name : null;
-    }
-
-    /**
-     * Sets the value for the {@code ScopedName}.
-     * This method is called at unmarshalling-time by JAXB.
-     *
-     * @param  name The new name.
-     * @throws IllegalStateException If a name is already defined.
-     */
-    public void setScopedName(final DefaultScopedName name) throws IllegalStateException {
-        ensureUndefined();
-        this.name = name;
-    }
-
-    /**
-     * Returns the {@code TypeName} generated from the metadata value.
-     * This method is called at marshalling-time by JAXB.
-     *
-     * @return The current name, or {@code null} if none.
-     */
-    @XmlElement(name = "TypeName")
-    public DefaultTypeName getTypeName() {
-        final Object name = this.name;
-        return (name instanceof DefaultTypeName) ? (DefaultTypeName) name : null;
-    }
-
-    /**
-     * Sets the value for the {@code TypeName}.
-     * This method is called at unmarshalling-time by JAXB.
-     *
-     * @param  name The new name.
-     * @throws IllegalStateException If a name is already defined.
-     */
-    public void setTypeName(final DefaultTypeName name) throws IllegalStateException {
-        ensureUndefined();
-        this.name = name;
-    }
-
-    /**
-     * Returns the {@code MemberName} generated from the metadata value.
-     * This method is called at marshalling-time by JAXB.
-     *
-     * @return The current name, or {@code null} if none.
-     */
-    @XmlElement(name = "MemberName")
-    public DefaultMemberName getMemberName() {
-        final Object name = this.name;
-        return (name instanceof MemberName) ? (DefaultMemberName) name : null;
-    }
-
-    /**
-     * Sets the value for the {@code MemberName}.
-     * This method is called at unmarshalling-time by JAXB.
-     *
-     * @param  name The new name.
-     * @throws IllegalStateException If a name is already defined.
-     */
-    public void setMemberName(final DefaultMemberName name) throws IllegalStateException {
-        ensureUndefined();
-        this.name = name;
+    private GO_GenericName(final AbstractName value) {
+        name = value;
     }
 
     /**
@@ -198,20 +62,7 @@ public final class GO_GenericName extend
      */
     @Override
     public GO_GenericName marshal(final GenericName value) {
-        if (value == null) {
-            return null;
-        }
-        final AbstractName name;
-        if (value instanceof AbstractName) {
-            name = (AbstractName) value;
-        } else {
-            /*
-             * Following cast should be safe because the getNameFactory() method asked specifically
-             * for a DefaultNameFactory instance, which is known to create AbstractName instances.
-             */
-            name = (AbstractName) ScopedNameAdapter.wrap(value, LocalNameAdapter.getNameFactory());
-        }
-        return new GO_GenericName(name);
+        return (value != null) ? new GO_GenericName(AbstractName.castOrCopy(value)) : null;
     }
 
     /**

Modified: sis/trunk/core/sis-utility/src/main/java/org/apache/sis/internal/system/DefaultFactories.java
URL: http://svn.apache.org/viewvc/sis/trunk/core/sis-utility/src/main/java/org/apache/sis/internal/system/DefaultFactories.java?rev=1497454&r1=1497453&r2=1497454&view=diff
==============================================================================
--- sis/trunk/core/sis-utility/src/main/java/org/apache/sis/internal/system/DefaultFactories.java [UTF-8] (original)
+++ sis/trunk/core/sis-utility/src/main/java/org/apache/sis/internal/system/DefaultFactories.java [UTF-8] Thu Jun 27 17:12:10 2013
@@ -34,9 +34,18 @@ import org.apache.sis.util.iso.DefaultNa
  */
 public final class DefaultFactories extends SystemListener {
     /**
-     * The factory to use for creating names.
+     * A name factory which is guaranteed to be an instance of SIS {@link DefaultNameFactory}.
+     * We use this factory when we need to ensure that the created names are instances of the
+     * SIS {@link org.apache.sis.util.iso.AbstractName} implementation.
      */
-    public static final DefaultNameFactory NAMES = new DefaultNameFactory();
+    public static final DefaultNameFactory SIS_NAMES = new DefaultNameFactory();
+
+    /**
+     * The factory to use for creating names, not necessarily SIS instances.
+     * This is fixed to {@link #SIS_NAMES} for now, but will probably be fetched in a more
+     * dynamic way later.
+     */
+    public static final DefaultNameFactory NAMES = SIS_NAMES;
 
     /**
      * Cache of factories which are found by {@code META-INF/services}.

Modified: sis/trunk/core/sis-utility/src/main/java/org/apache/sis/setup/About.java
URL: http://svn.apache.org/viewvc/sis/trunk/core/sis-utility/src/main/java/org/apache/sis/setup/About.java?rev=1497454&r1=1497453&r2=1497454&view=diff
==============================================================================
--- sis/trunk/core/sis-utility/src/main/java/org/apache/sis/setup/About.java [UTF-8] (original)
+++ sis/trunk/core/sis-utility/src/main/java/org/apache/sis/setup/About.java [UTF-8] Thu Jun 27 17:12:10 2013
@@ -402,7 +402,7 @@ pathTree:   for (int j=0; ; j++) {
                         directory.setValue(NAME, parenthesis(resources.getString(homeKey)));
                     }
                     CharSequence title = entry.getValue();
-                    if (title == null) {
+                    if (title == null || title.length() == 0) {
                         title = parenthesis(resources.getString(entry.getKey().isDirectory() ?
                                 Vocabulary.Keys.Directory : Vocabulary.Keys.Untitled).toLowerCase(locale));
                     }
@@ -488,6 +488,11 @@ pathTree:   for (int j=0; ; j++) {
                             if (title == null) {
                                 title = concatenate(attributes.getValue(Attributes.Name.SPECIFICATION_TITLE),
                                         attributes.getValue(Attributes.Name.SPECIFICATION_VERSION), false);
+                                if (title == null) {
+                                    // We really need a non-null value in order to protect this code
+                                    // against infinite recursivity.
+                                    title = "";
+                                }
                             }
                             entry.setValue(title);
                             files = classpath(attributes.getValue(Attributes.Name.CLASS_PATH),
@@ -511,7 +516,7 @@ pathTree:   for (int j=0; ; j++) {
     }
 
     /**
-     * Puts the given file in the given map. IF a value was already associated to the given file,
+     * Puts the given file in the given map. If a value was already associated to the given file,
      * then that value is preserved.
      *
      * @param  files The map in which to add the file, or {@code null} if not yet created.
@@ -596,9 +601,10 @@ pathTree:   for (int j=0; ; j++) {
      * Concatenates the given strings in the format "main (complement)".
      * Any of the given strings can be null.
      *
-     * @param main        The main string to show first.
-     * @param complement  The string to show after the main one.
-     * @param parenthesis {@code true} for writing the complement between parenthesis.
+     * @param  main        The main string to show first, or {@code null}.
+     * @param  complement  The string to show after the main one, or {@code null}.
+     * @param  parenthesis {@code true} for writing the complement between parenthesis, or {@code null}.
+     * @return The concatenated string, or {@code null} if all components are null.
      */
     private static CharSequence concatenate(final CharSequence main, final CharSequence complement, final boolean parenthesis) {
         if (main != null && main.length() != 0) {

Modified: sis/trunk/core/sis-utility/src/main/java/org/apache/sis/util/iso/AbstractName.java
URL: http://svn.apache.org/viewvc/sis/trunk/core/sis-utility/src/main/java/org/apache/sis/util/iso/AbstractName.java?rev=1497454&r1=1497453&r2=1497454&view=diff
==============================================================================
--- sis/trunk/core/sis-utility/src/main/java/org/apache/sis/util/iso/AbstractName.java [UTF-8] (original)
+++ sis/trunk/core/sis-utility/src/main/java/org/apache/sis/util/iso/AbstractName.java [UTF-8] Thu Jun 27 17:12:10 2013
@@ -19,6 +19,7 @@ package org.apache.sis.util.iso;
 import java.util.List;
 import java.util.Locale;
 import java.util.Iterator;
+import java.util.ConcurrentModificationException;
 import java.io.Serializable;
 import javax.xml.bind.annotation.XmlType;
 import org.opengis.util.NameSpace;
@@ -26,6 +27,7 @@ import org.opengis.util.LocalName;
 import org.opengis.util.ScopedName;
 import org.opengis.util.GenericName;
 import org.opengis.util.InternationalString;
+import org.apache.sis.internal.system.DefaultFactories;
 import org.apache.sis.util.resources.Errors;
 import org.apache.sis.util.Immutable;
 
@@ -89,6 +91,51 @@ public abstract class AbstractName imple
     }
 
     /**
+     * Returns a SIS name implementation with the values of the given arbitrary implementation.
+     * This method performs the first applicable actions in the following choices:
+     *
+     * <ul>
+     *   <li>If the given object is {@code null}, then this method returns {@code null}.</li>
+     *   <li>Otherwise if the given object is already an instance of {@code AbstractName},
+     *       then it is returned unchanged.</li>
+     *   <li>Otherwise if the given object is an instance of {@link LocalName}, then this
+     *       method delegates to {@link DefaultLocalName#castOrCopy(LocalName)}.</li>
+     *   <li>Otherwise a new instance of an {@code AbstractName} subclass is created using the
+     *       {@link DefaultNameFactory#createGenericName(NameSpace, CharSequence[])} method.</li>
+     * </ul>
+     *
+     * @param  object The object to get as a SIS implementation, or {@code null} if none.
+     * @return A SIS implementation containing the values of the given object (may be the
+     *         given object itself), or {@code null} if the argument was null.
+     */
+    public static AbstractName castOrCopy(final GenericName object) {
+        if (object == null || object instanceof AbstractName) {
+            return (AbstractName) object;
+        }
+        if (object instanceof LocalName) {
+            return DefaultLocalName.castOrCopy((LocalName) object);
+        }
+        /*
+         * Recreates a new name for the given name in order to get
+         * a SIS implementation from an arbitrary implementation.
+         */
+        final List<? extends LocalName> parsedNames = object.getParsedNames();
+        final CharSequence[] names = new CharSequence[parsedNames.size()];
+        int i=0;
+        for (final LocalName component : parsedNames) {
+            names[i++] = component.toInternationalString();
+        }
+        if (i != names.length) {
+            throw new ConcurrentModificationException(Errors.format(Errors.Keys.UnexpectedChange_1, "parsedNames"));
+        }
+        /*
+         * Following cast should be safe because the SIS_NAMES factory is fixed to a
+         * DefaultNameFactory instance, which is known to create AbstractName instances.
+         */
+        return (AbstractName) DefaultFactories.SIS_NAMES.createGenericName(object.scope(), names);
+    }
+
+    /**
      * Returns the scope (name space) in which this name is local. For example if a
      * {@linkplain #toFullyQualifiedName() fully qualified name} is {@code "org.opengis.util.Record"}
      * and if this instance is the {@code "util.Record"} part, then its scope is
@@ -98,6 +145,8 @@ public abstract class AbstractName imple
      * no scope. If this method is invoked on such name, then the SIS implementation returns a
      * global scope instance (i.e. an instance for which {@link DefaultNameSpace#isGlobal()}
      * returns {@code true}) which is unique and named {@code "global"}.</p>
+     *
+     * @return The scope of this name.
      */
     @Override
     public abstract NameSpace scope();
@@ -105,6 +154,8 @@ public abstract class AbstractName imple
     /**
      * Indicates the number of levels specified by this name. The default implementation returns
      * the size of the list returned by the {@link #getParsedNames()} method.
+     *
+     * @return The depth of this name.
      */
     @Override
     public int depth() {
@@ -124,6 +175,9 @@ public abstract class AbstractName imple
      * Returns the sequence of {@linkplain DefaultLocalName local names} making this generic name.
      * The length of this sequence is the {@linkplain #depth() depth}. It does not include the
      * {@linkplain #scope() scope}.
+     *
+     * @return The local names making this generic name, without the {@linkplain #scope() scope}.
+     *         Shall never be {@code null} neither empty.
      */
     @Override
     public abstract List<? extends LocalName> getParsedNames();
@@ -132,9 +186,10 @@ public abstract class AbstractName imple
      * Returns the first element in the sequence of {@linkplain #getParsedNames() parsed names}.
      * For any {@code LocalName}, this is always {@code this}.
      *
-     * <p><b>Example</b>:
-     * If {@code this} name is {@code "org.opengis.util.Record"} (no matter its
-     * {@linkplain #scope() scope}), then this method returns {@code "org"}.</p>
+     * {@example If <code>this</code> name is <code>"org.opengis.util.Record"</code>
+     *           (no matter its scope, then this method returns <code>"org"</code>.}
+     *
+     * @return The first element in the list of {@linkplain #getParsedNames() parsed names}.
      */
     @Override
     public LocalName head() {
@@ -145,9 +200,10 @@ public abstract class AbstractName imple
      * Returns the last element in the sequence of {@linkplain #getParsedNames() parsed names}.
      * For any {@code LocalName}, this is always {@code this}.
      *
-     * <p><b>Example</b>:
-     * If {@code this} name is {@code "org.opengis.util.Record"} (no matter its
-     * {@linkplain #scope() scope}), then this method returns {@code "Record"}.</p>
+     * {@example If <code>this</code> name is <code>"org.opengis.util.Record"</code>
+     *           (no matter its scope, then this method returns <code>"Record"</code>.}
+     *
+     * @return The last element in the list of {@linkplain #getParsedNames() parsed names}.
      */
     @Override
     public LocalName tip() {
@@ -159,6 +215,8 @@ public abstract class AbstractName imple
      * Returns a view of this name as a fully-qualified name. The {@linkplain #scope() scope}
      * of a fully qualified name is {@linkplain DefaultNameSpace#isGlobal() global}.
      * If the scope of this name is already global, then this method returns {@code this}.
+     *
+     * @return The fully-qualified name (never {@code null}).
      */
     @Override
     public synchronized GenericName toFullyQualifiedName() {
@@ -181,6 +239,9 @@ public abstract class AbstractName imple
      * {@code this} name is {@code "util.Record"} and the given {@code scope} argument is
      * {@code "org.opengis"}, then {@code this.push(scope)} shall return
      * {@code "org.opengis.util.Record"}.
+     *
+     * @param  scope The name to use as prefix.
+     * @return A concatenation of the given scope with this name.
      */
     @Override
     public ScopedName push(final GenericName scope) {
@@ -219,6 +280,8 @@ public abstract class AbstractName imple
      *   <li><code>{@linkplain #tip()}.toString()</code> is guaranteed to not contain
      *       any scope.</li>
      * </ul>
+     *
+     * @return A local-independent string representation of this name.
      */
     @Override
     public synchronized String toString() {
@@ -246,6 +309,8 @@ public abstract class AbstractName imple
      * has been localized in the {@linkplain InternationalString#toString(Locale) specified locale}.
      * If no international string is available, then this method returns an implementation mapping
      * to {@link #toString()} for all locales.
+     *
+     * @return A localizable string representation of this name.
      */
     @Override
     public synchronized InternationalString toInternationalString() {
@@ -282,7 +347,7 @@ public abstract class AbstractName imple
          * @param asString The string representation of the enclosing abstract name.
          * @param parsedNames The value returned by {@link AbstractName#getParsedNames()}.
          */
-        public International(final String asString, final List<? extends LocalName> parsedNames) {
+        International(final String asString, final List<? extends LocalName> parsedNames) {
             super(asString);
             this.parsedNames = parsedNames;
         }
@@ -318,6 +383,14 @@ public abstract class AbstractName imple
             }
             return false;
         }
+
+        /**
+         * Returns a hash code value for this international text.
+         */
+        @Override
+        public int hashCode() {
+            return parsedNames.hashCode() ^ (int) serialVersionUID;
+        }
     }
 
     /**

Modified: sis/trunk/core/sis-utility/src/main/java/org/apache/sis/util/iso/DefaultLocalName.java
URL: http://svn.apache.org/viewvc/sis/trunk/core/sis-utility/src/main/java/org/apache/sis/util/iso/DefaultLocalName.java?rev=1497454&r1=1497453&r2=1497454&view=diff
==============================================================================
--- sis/trunk/core/sis-utility/src/main/java/org/apache/sis/util/iso/DefaultLocalName.java [UTF-8] (original)
+++ sis/trunk/core/sis-utility/src/main/java/org/apache/sis/util/iso/DefaultLocalName.java [UTF-8] Thu Jun 27 17:12:10 2013
@@ -25,11 +25,14 @@ import javax.xml.bind.annotation.XmlRoot
 import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
 import org.opengis.util.NameSpace;
 import org.opengis.util.LocalName;
+import org.opengis.util.TypeName;
+import org.opengis.util.MemberName;
 import org.opengis.util.GenericName;
 import org.opengis.util.InternationalString;
 import org.apache.sis.xml.Namespaces;
 import org.apache.sis.util.Immutable;
 import org.apache.sis.util.ArgumentChecks;
+import org.apache.sis.internal.system.DefaultFactories;
 import org.apache.sis.internal.jaxb.gco.CharSequenceAdapter;
 
 // Related to JDK7
@@ -72,6 +75,12 @@ public class DefaultLocalName extends Ab
 
     /**
      * The name, either as a {@link String} or an {@link InternationalString}.
+     *
+     * {@section Note on JAXB annotation}
+     * The {@link XmlElement} annotation applied here is appropriate for subclasses only ({@link DefaultTypeName}
+     * and {@link DefaultMemberName}). It is <strong>not</strong> appropriate when (un)marshalling directly this
+     * {@code DefaultLocalName} class. In this later case, we will rather rely on the {@link String} conversion
+     * performed by {@link org.apache.sis.internal.jaxb.gco.GO_GenericName}.
      */
     @XmlJavaTypeAdapter(CharSequenceAdapter.class)
     @XmlElement(name = "aName", namespace = Namespaces.GCO)
@@ -132,6 +141,45 @@ public class DefaultLocalName extends Ab
     }
 
     /**
+     * Returns a SIS local name implementation with the values of the given arbitrary implementation.
+     * This method performs the first applicable actions in the following choices:
+     *
+     * <ul>
+     *   <li>If the given object is {@code null}, then this method returns {@code null}.</li>
+     *   <li>Otherwise if the given object is already an instance of {@code DefaultLocalName},
+     *       then it is returned unchanged.</li>
+     *   <li>Otherwise a new {@code DefaultLocalName} instance is created using the
+     *       {@link DefaultNameFactory#createLocalName(NameSpace, CharSequence)} method,
+     *       or the {@code createTypeName} or {@code createMemberName} variants if the
+     *       given object implements the corresponding interface.</li>
+     * </ul>
+     *
+     * @param  object The object to get as a SIS implementation, or {@code null} if none.
+     * @return A SIS implementation containing the values of the given object (may be the
+     *         given object itself), or {@code null} if the argument was null.
+     */
+    public static DefaultLocalName castOrCopy(final LocalName object) {
+        if (object == null || object instanceof DefaultLocalName) {
+            return (DefaultLocalName) object;
+        }
+        final NameSpace scope = object.scope();
+        final InternationalString name = object.toInternationalString();
+        final LocalName result;
+        if (object instanceof MemberName) {
+            result = DefaultFactories.SIS_NAMES.createMemberName(scope, name, ((MemberName) object).getAttributeType());
+        } else if (object instanceof TypeName) {
+            result = DefaultFactories.SIS_NAMES.createTypeName(scope, name);
+        } else {
+            result = DefaultFactories.SIS_NAMES.createLocalName(scope, name);
+        }
+        /*
+         * Following cast should be safe because the SIS_NAMES factory is fixed to a
+         * DefaultNameFactory instance, which is known to create AbstractName instances.
+         */
+        return (DefaultLocalName) result;
+    }
+
+    /**
      * Returns the scope (name space) in which this name is local. This method returns a
      * non-null value in all cases, even when the scope given to the constructor was null.
      */

Modified: sis/trunk/core/sis-utility/src/main/java/org/apache/sis/util/iso/DefaultMemberName.java
URL: http://svn.apache.org/viewvc/sis/trunk/core/sis-utility/src/main/java/org/apache/sis/util/iso/DefaultMemberName.java?rev=1497454&r1=1497453&r2=1497454&view=diff
==============================================================================
--- sis/trunk/core/sis-utility/src/main/java/org/apache/sis/util/iso/DefaultMemberName.java [UTF-8] (original)
+++ sis/trunk/core/sis-utility/src/main/java/org/apache/sis/util/iso/DefaultMemberName.java [UTF-8] Thu Jun 27 17:12:10 2013
@@ -76,6 +76,8 @@ public class DefaultMemberName extends D
 
     /**
      * Returns the type of the data associated with the record member.
+     *
+     * @return The type of the data associated with the record member.
      */
     @Override
     public TypeName getAttributeType() {

Modified: sis/trunk/core/sis-utility/src/main/java/org/apache/sis/util/iso/DefaultScopedName.java
URL: http://svn.apache.org/viewvc/sis/trunk/core/sis-utility/src/main/java/org/apache/sis/util/iso/DefaultScopedName.java?rev=1497454&r1=1497453&r2=1497454&view=diff
==============================================================================
--- sis/trunk/core/sis-utility/src/main/java/org/apache/sis/util/iso/DefaultScopedName.java [UTF-8] (original)
+++ sis/trunk/core/sis-utility/src/main/java/org/apache/sis/util/iso/DefaultScopedName.java [UTF-8] Thu Jun 27 17:12:10 2013
@@ -19,7 +19,6 @@ package org.apache.sis.util.iso;
 import java.util.List;
 import java.util.Iterator;
 import java.util.ConcurrentModificationException;
-import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlRootElement;
 import org.opengis.util.NameSpace;
 import org.opengis.util.LocalName;
@@ -32,7 +31,6 @@ import org.apache.sis.util.resources.Err
 import org.apache.sis.internal.util.UnmodifiableArrayList;
 
 
-
 /**
  * A composite of a {@linkplain DefaultNameSpace name space} (as a {@linkplain DefaultLocalName local name})
  * and a {@linkplain AbstractName generic name} valid in that name space.
@@ -247,8 +245,10 @@ public class DefaultScopedName extends A
     }
 
     /**
-     * Returns every elements of the {@linkplain #getParsedNames() parsed names list}
+     * Returns every elements in the sequence of {@linkplain #getParsedNames() parsed names}
      * except for the {@linkplain #head() head}.
+     *
+     * @return All elements except the first one in the in the list of {@linkplain #getParsedNames() parsed names}.
      */
     @Override
     public synchronized GenericName tail() {
@@ -265,8 +265,10 @@ public class DefaultScopedName extends A
     }
 
     /**
-     * Returns every element of the {@linkplain #getParsedNames() parsed names list}
+     * Returns every element in the sequence of {@linkplain #getParsedNames() parsed names}
      * except for the {@linkplain #tip() tip}.
+     *
+     * @return All elements except the last one in the in the list of {@linkplain #getParsedNames() parsed names}.
      */
     @Override
     public synchronized GenericName path() {
@@ -286,7 +288,6 @@ public class DefaultScopedName extends A
      * Returns the sequence of local name for this generic name.
      */
     @Override
-    @XmlElement(name = "parsedName", required = true)
     public List<? extends LocalName> getParsedNames() {
         return parsedNames;
     }

Modified: sis/trunk/core/sis-utility/src/main/java/org/apache/sis/util/iso/package-info.java
URL: http://svn.apache.org/viewvc/sis/trunk/core/sis-utility/src/main/java/org/apache/sis/util/iso/package-info.java?rev=1497454&r1=1497453&r2=1497454&view=diff
==============================================================================
--- sis/trunk/core/sis-utility/src/main/java/org/apache/sis/util/iso/package-info.java [UTF-8] (original)
+++ sis/trunk/core/sis-utility/src/main/java/org/apache/sis/util/iso/package-info.java [UTF-8] Thu Jun 27 17:12:10 2013
@@ -132,9 +132,7 @@
 })
 @XmlAccessorType(XmlAccessType.NONE)
 @XmlJavaTypeAdapters({
-    @XmlJavaTypeAdapter(GO_GenericName.class),
-    @XmlJavaTypeAdapter(LocalNameAdapter.class),
-    @XmlJavaTypeAdapter(ScopedNameAdapter.class)
+    @XmlJavaTypeAdapter(GO_GenericName.class)
 })
 package org.apache.sis.util.iso;
 

Modified: sis/trunk/core/sis-utility/src/main/java/org/apache/sis/xml/MarshallerPool.java
URL: http://svn.apache.org/viewvc/sis/trunk/core/sis-utility/src/main/java/org/apache/sis/xml/MarshallerPool.java?rev=1497454&r1=1497453&r2=1497454&view=diff
==============================================================================
--- sis/trunk/core/sis-utility/src/main/java/org/apache/sis/xml/MarshallerPool.java [UTF-8] (original)
+++ sis/trunk/core/sis-utility/src/main/java/org/apache/sis/xml/MarshallerPool.java [UTF-8] Thu Jun 27 17:12:10 2013
@@ -60,6 +60,11 @@ import org.apache.sis.util.ArgumentCheck
 @ThreadSafe
 public class MarshallerPool {
     /**
+     * The indentation string, fixed to 2 spaces instead of 4 because ISO/OGC XML are very verbose.
+     */
+    private static final String INDENTATION = "  ";
+
+    /**
      * Amount of nanoseconds to wait before to remove unused (un)marshallers.
      * This is a very approximative value: actual timeout will not be shorter,
      * but may be twice longer.
@@ -89,6 +94,11 @@ public class MarshallerPool {
     private final Object mapper;
 
     /**
+     * The {@link PooledTemplate} to use for initializing recycled (un)marshaller.
+     */
+    private final PooledTemplate template;
+
+    /**
      * The pool of marshaller. This pool is initially empty and will be filled with elements as needed.
      * Marshallers (if any) shall be fetched using the {@link Deque#poll()} method and, after use,
      * given back to the pool using the {@link Deque#push(Object)} method.
@@ -124,42 +134,39 @@ public class MarshallerPool {
 
     /**
      * Creates a new factory using the SIS default {@code JAXBContext} instance.
-     * The keys in the {@code properties} map can be one or many of following constants:
-     *
-     * <ul>
-     *   <li>{@link XML#DEFAULT_NAMESPACE} for specifying the default namespace of the XML document to write.</li>
-     * </ul>
+     * The {@code properties} map is optional. If non-null, then the keys can be {@link XML} constants or the
+     * names of any other properties recognized by <em>both</em> {@code Marshaller} and {@code Unmarshaller}
+     * implementations.
+     *
+     * <p><b>Tip:</b> if the properties for the {@code Marshaller} differ from the properties
+     * for the {@code Unmarshaller}, then consider overriding the {@link #createMarshaller()}
+     * or {@link #createUnmarshaller()} methods instead.</p>
      *
-     * @param  properties    The set of properties to be given to the pool, or {@code null} if none.
+     * @param  properties The set of properties to be given to the (un)marshaller, or {@code null} if none.
      * @throws JAXBException If the JAXB context can not be created.
      */
-    public MarshallerPool(final Map<String,String> properties) throws JAXBException {
+    public MarshallerPool(final Map<String,?> properties) throws JAXBException {
         this(TypeRegistration.getSharedContext(), properties);
     }
 
     /**
      * Creates a new factory using the given JAXB context.
-     * The keys in the {@code properties} map can be one or many of following constants:
-     *
-     * <ul>
-     *   <li>{@link XML#DEFAULT_NAMESPACE} for specifying the default namespace of the XML document to write.</li>
-     * </ul>
+     * The {@code properties} map is optional. If non-null, then the keys can be {@link XML} constants or the
+     * names of any other properties recognized by <em>both</em> {@code Marshaller} and {@code Unmarshaller}
+     * implementations.
+     *
+     * <p><b>Tip:</b> if the properties for the {@code Marshaller} differ from the properties
+     * for the {@code Unmarshaller}, then consider overriding the {@link #createMarshaller()}
+     * or {@link #createUnmarshaller()} methods instead.</p>
      *
-     * @param  context       The JAXB context.
-     * @param  properties    The set of properties to be given to the pool, or {@code null} if none.
+     * @param  context The JAXB context.
+     * @param  properties The set of properties to be given to the (un)marshaller, or {@code null} if none.
      * @throws JAXBException If the marshaller pool can not be created.
      */
     @SuppressWarnings({"unchecked", "rawtypes"}) // Generic array creation
-    public MarshallerPool(final JAXBContext context, final Map<String,String> properties) throws JAXBException {
+    public MarshallerPool(final JAXBContext context, final Map<String,?> properties) throws JAXBException {
         ArgumentChecks.ensureNonNull("context", context);
         this.context = context;
-        String rootNamespace = "";
-        if (properties != null) {
-            rootNamespace = properties.get(XML.DEFAULT_NAMESPACE);
-            if (rootNamespace == null) {
-                rootNamespace = "";
-            }
-        }
         /*
          * Detects if we are using the endorsed JAXB implementation (i.e. the one provided in
          * separated JAR files) or the one bundled in JDK 6. We use the JAXB context package
@@ -180,6 +187,12 @@ public class MarshallerPool {
             implementation = OTHER;
         }
         /*
+         * Prepares a copy of the property map (if any), then removes the
+         * properties which are handled especially by this constructor.
+         */
+        template = new PooledTemplate(properties, implementation == INTERNAL);
+        final Object rootNamespace = template.remove(XML.DEFAULT_NAMESPACE, "");
+        /*
          * Instantiates the OGCNamespacePrefixMapper appropriate for the implementation
          * we just detected. Note that we may get NoClassDefFoundError instead than the
          * usual ClassNotFoundException if the class was found but its parent class has
@@ -202,14 +215,14 @@ public class MarshallerPool {
      * This method:
      *
      * <ul>
-     *   <li>{@link Pooled#reset() Resets} the (un)marshaller to its initial state.</li>
+     *   <li>{@link Pooled#reset(Pooled) Resets} the (un)marshaller to its initial state.</li>
      *   <li>{@linkplain Deque#push(Object) Pushes} the (un)marshaller in the given queue.</li>
      *   <li>Registers a delayed task for disposing expired (un)marshallers after the timeout.</li>
      * </ul>
      */
     private <T> void recycle(final Deque<T> queue, final T marshaller) {
         try {
-            ((Pooled) marshaller).reset();
+            ((Pooled) marshaller).reset(template);
         } catch (JAXBException exception) {
             // Not expected to happen because we are supposed
             // to reset the properties to their initial values.
@@ -307,7 +320,7 @@ public class MarshallerPool {
     public Marshaller acquireMarshaller() throws JAXBException {
         Marshaller marshaller = marshallers.poll();
         if (marshaller == null) {
-            marshaller = new PooledMarshaller(createMarshaller(), implementation == INTERNAL);
+            marshaller = new PooledMarshaller(createMarshaller(), template);
         }
         return marshaller;
     }
@@ -333,7 +346,7 @@ public class MarshallerPool {
     public Unmarshaller acquireUnmarshaller() throws JAXBException {
         Unmarshaller unmarshaller = unmarshallers.poll();
         if (unmarshaller == null) {
-            unmarshaller = new PooledUnmarshaller(createUnmarshaller(), implementation == INTERNAL);
+            unmarshaller = new PooledUnmarshaller(createUnmarshaller(), template);
         }
         return unmarshaller;
     }
@@ -401,10 +414,12 @@ public class MarshallerPool {
         switch (implementation) {
             case INTERNAL: {
                 marshaller.setProperty("com.sun.xml.internal.bind.namespacePrefixMapper", mapper);
+                marshaller.setProperty("com.sun.xml.internal.bind.indentString", INDENTATION);
                 break;
             }
             case ENDORSED: {
                 marshaller.setProperty("com.sun.xml.bind.namespacePrefixMapper", mapper);
+                marshaller.setProperty("com.sun.xml.bind.indentString", INDENTATION);
                 break;
             }
             // Do nothing for the OTHER case.

Modified: sis/trunk/core/sis-utility/src/main/java/org/apache/sis/xml/Pooled.java
URL: http://svn.apache.org/viewvc/sis/trunk/core/sis-utility/src/main/java/org/apache/sis/xml/Pooled.java?rev=1497454&r1=1497453&r2=1497454&view=diff
==============================================================================
--- sis/trunk/core/sis-utility/src/main/java/org/apache/sis/xml/Pooled.java [UTF-8] (original)
+++ sis/trunk/core/sis-utility/src/main/java/org/apache/sis/xml/Pooled.java [UTF-8] Thu Jun 27 17:12:10 2013
@@ -28,6 +28,7 @@ import javax.xml.bind.JAXBException;
 import javax.xml.bind.PropertyException;
 import javax.xml.bind.ValidationEventHandler;
 import javax.xml.bind.annotation.adapters.XmlAdapter;
+import org.apache.sis.util.Locales;
 import org.apache.sis.util.Version;
 import org.apache.sis.util.ArraysExt;
 import org.apache.sis.util.CharSequences;
@@ -85,8 +86,10 @@ abstract class Pooled {
      *   <li>For each entry having a key of type {@link String}, the value is the argument
      *       to be given to the {@code marshaller.setProperty(key, value)} method.</li>
      * </ul>
+     *
+     * This map is never {@code null}.
      */
-    private final Map<Object,Object> initialProperties;
+    final Map<Object,Object> initialProperties;
 
     /**
      * Bit masks for various boolean attributes. This include whatever the language codes
@@ -138,14 +141,14 @@ abstract class Pooled {
     private WarningListener<?> warningListener;
 
     /**
-     * The {@link System#nanoTime()} value of the last call to {@link #reset()}.
+     * The {@link System#nanoTime()} value of the last call to {@link #reset(Pooled)}.
      * This is used for disposing (un)marshallers that have not been used for a while,
      * since {@code reset()} is invoked just before to push a (un)marshaller in the pool.
      */
     volatile long resetTime;
 
     /**
-     * Default constructor.
+     * Creates a {@link PooledTemplate}.
      *
      * @param internal {@code true} if the JAXB implementation is the one bundled in JDK 6,
      *        or {@code false} if this is the external implementation provided as a JAR file
@@ -154,7 +157,32 @@ abstract class Pooled {
     Pooled(final boolean internal) {
         this.internal = internal;
         initialProperties = new LinkedHashMap<Object,Object>();
-        bitMasks = initialBitMasks();
+    }
+
+    /**
+     * Creates a {@link PooledMarshaller} or {@link PooledUnmarshaller}. The {@link #initialize(Pooled)}
+     * method must be invoked after this constructor for completing the initialization.
+     *
+     * @param template The {@link PooledTemplate} from which to get the initial values.
+     */
+    Pooled(final Pooled template) {
+        initialProperties = new LinkedHashMap<Object,Object>();
+        internal = template.internal;
+    }
+
+    /**
+     * Completes the creation of a {@link PooledMarshaller} or {@link PooledUnmarshaller}.
+     * This method is not invoked in the {@link #Pooled(Pooled)} constructor in order to
+     * give to subclasses a chance to complete their construction first.
+     *
+     * @param  template The {@link PooledTemplate} from which to get the initial values.
+     * @throws JAXBException If an error occurred while setting a property.
+     */
+    final void initialize(final Pooled template) throws JAXBException {
+        reset(template); // Set the SIS properties first. JAXB properties are set below.
+        for (final Map.Entry<Object,Object> entry : template.initialProperties.entrySet()) {
+            setStandardProperty((String) entry.getKey(), entry.getValue());
+        }
     }
 
     /**
@@ -170,27 +198,28 @@ abstract class Pooled {
      * This method is invoked by {@link MarshallerPool} just before to push a
      * (un)marshaller in the pool after its usage.
      *
+     * @param  template The {@link PooledTemplate} from which to get the initial values.
      * @throws JAXBException If an error occurred while restoring a property.
      */
-    public final void reset() throws JAXBException {
+    public final void reset(final Pooled template) throws JAXBException {
         for (final Map.Entry<Object,Object> entry : initialProperties.entrySet()) {
             reset(entry.getKey(), entry.getValue());
         }
         initialProperties.clear();
         bitMasks        = initialBitMasks();
-        locale          = null;
-        timezone        = null;
-        schemas         = null;
-        gmlVersion      = null;
-        resolver        = null;
-        converter       = null;
-        warningListener = null;
+        locale          = template.locale;
+        timezone        = template.timezone;
+        schemas         = template.schemas;
+        gmlVersion      = template.gmlVersion;
+        resolver        = template.resolver;
+        converter       = template.converter;
+        warningListener = template.warningListener;
         resetTime       = System.nanoTime();
     }
 
     /**
      * Resets the given marshaller property to its initial state. This method is invoked
-     * automatically by the {@link #reset()} method. The key is either a {@link String}
+     * automatically by the {@link #reset(Pooled)} method. The key is either a {@link String}
      * or a {@link Class}. If this is a string, then the value shall be given to the
      * {@code setProperty(key, value)} method. Otherwise the value shall be given to
      * {@code setFoo(value)} method where {@code "Foo"} is determined from the key.
@@ -211,8 +240,8 @@ abstract class Pooled {
 
     /**
      * Saves the current value of a property. This method is invoked before a value is
-     * modified for the first time, in order to allow {@link #reset()} to restore the
-     * (un)marshaller to its initial state.
+     * modified for the first time, in order to allow {@link #reset(Pooled)} to restore
+     * the (un)marshaller to its initial state.
      *
      * @param type  The property to save.
      * @param value The current value of the property.
@@ -250,11 +279,11 @@ abstract class Pooled {
         try {
             /* switch (name) */ {
                 if (name.equals(XML.LOCALE)) {
-                    locale = (Locale) value;
+                    locale = (value instanceof CharSequence) ? Locales.parse(value.toString()) : (Locale) value;
                     return;
                 }
                 else if (name.equals(XML.TIMEZONE)) {
-                    timezone = (TimeZone) value;
+                    timezone = (value instanceof CharSequence) ? TimeZone.getTimeZone(value.toString()) : (TimeZone) value;
                     return;
                 }
                 else if (name.equals(XML.SCHEMAS)) {
@@ -308,10 +337,14 @@ abstract class Pooled {
                     return;
                 }
             }
-        } catch (ClassCastException e) {
+        } catch (RuntimeException e) { // (ClassCastException | IllegalArgumentException) on the JDK7 branch.
             throw new PropertyException(Errors.format(
                     Errors.Keys.IllegalPropertyClass_2, name, value.getClass()), e);
         }
+        /*
+         * If we reach this point, the given name is not a SIS property. Try to handle
+         * it as a (un)marshaller-specific property, after saving the previous value.
+         */
         name = convertPropertyKey(name);
         if (!initialProperties.containsKey(name)) {
             if (initialProperties.put(name, getStandardProperty(name)) != null) {

Modified: sis/trunk/core/sis-utility/src/main/java/org/apache/sis/xml/PooledMarshaller.java
URL: http://svn.apache.org/viewvc/sis/trunk/core/sis-utility/src/main/java/org/apache/sis/xml/PooledMarshaller.java?rev=1497454&r1=1497453&r2=1497454&view=diff
==============================================================================
--- sis/trunk/core/sis-utility/src/main/java/org/apache/sis/xml/PooledMarshaller.java [UTF-8] (original)
+++ sis/trunk/core/sis-utility/src/main/java/org/apache/sis/xml/PooledMarshaller.java [UTF-8] Thu Jun 27 17:12:10 2013
@@ -60,20 +60,21 @@ final class PooledMarshaller extends Poo
 
     /**
      * Creates a pooled marshaller wrapping the given one.
+     * Callers shall invoke {@link #reset(Pooled)} after construction for completing the initialization.
      *
-     * @param marshaller The marshaller to use for the actual work.
-     * @param internal {@code true} if the JAXB implementation is the one bundled in JDK 6,
-     *        or {@code false} if this is the external implementation provided as a JAR file
-     *        in the endorsed directory.
+     * @param  marshaller The marshaller to use for the actual work.
+     * @param  template The {@link PooledTemplate} from which to get the initial values.
+     * @throws JAXBException If an error occurred while setting a property.
      */
-    PooledMarshaller(final Marshaller marshaller, final boolean internal) {
-        super(internal);
+    PooledMarshaller(final Marshaller marshaller, final Pooled template) throws JAXBException {
+        super(template);
         this.marshaller = marshaller;
+        initialize(template);
     }
 
     /**
      * Resets the given marshaller property to its initial state.
-     * This method is invoked automatically by {@link #reset()}.
+     * This method is invoked automatically by {@link #reset(Pooled)}.
      *
      * @param  key   The property to reset.
      * @param  value The saved initial value to give to the property.
@@ -238,7 +239,7 @@ final class PooledMarshaller extends Poo
 
     /**
      * Delegates to the wrapped marshaller. The initial state will be saved
-     * if it was not already done, for future restoration by {@link #reset()}.
+     * if it was not already done, for future restoration by {@link #reset(Pooled)}.
      */
     @Override
     @SuppressWarnings("rawtypes")
@@ -258,7 +259,7 @@ final class PooledMarshaller extends Poo
 
     /**
      * Delegates to the wrapped marshaller. The initial state will be saved
-     * if it was not already done, for future restoration by {@link #reset()}.
+     * if it was not already done, for future restoration by {@link #reset(Pooled)}.
      */
     @Override
     public void setSchema(final Schema schema) {
@@ -276,7 +277,7 @@ final class PooledMarshaller extends Poo
 
     /**
      * Delegates to the wrapped marshaller. The initial state will be saved
-     * if it was not already done, for future restoration by {@link #reset()}.
+     * if it was not already done, for future restoration by {@link #reset(Pooled)}.
      */
     @Override
     public void setEventHandler(final ValidationEventHandler handler) throws JAXBException {
@@ -294,7 +295,7 @@ final class PooledMarshaller extends Poo
 
     /**
      * Delegates to the wrapped marshaller. The initial state will be saved
-     * if it was not already done, for future restoration by {@link #reset()}.
+     * if it was not already done, for future restoration by {@link #reset(Pooled)}.
      */
     @Override
     public void setAttachmentMarshaller(final AttachmentMarshaller am) {
@@ -314,7 +315,7 @@ final class PooledMarshaller extends Poo
 
     /**
      * Delegates to the wrapped marshaller. The initial state will be saved
-     * if it was not already done, for future restoration by {@link #reset()}.
+     * if it was not already done, for future restoration by {@link #reset(Pooled)}.
      */
     @Override
     public void setListener(final Listener listener) {

Modified: sis/trunk/core/sis-utility/src/main/java/org/apache/sis/xml/PooledUnmarshaller.java
URL: http://svn.apache.org/viewvc/sis/trunk/core/sis-utility/src/main/java/org/apache/sis/xml/PooledUnmarshaller.java?rev=1497454&r1=1497453&r2=1497454&view=diff
==============================================================================
--- sis/trunk/core/sis-utility/src/main/java/org/apache/sis/xml/PooledUnmarshaller.java [UTF-8] (original)
+++ sis/trunk/core/sis-utility/src/main/java/org/apache/sis/xml/PooledUnmarshaller.java [UTF-8] Thu Jun 27 17:12:10 2013
@@ -63,20 +63,21 @@ final class PooledUnmarshaller extends P
 
     /**
      * Creates a pooled unmarshaller wrapping the given one.
+     * Callers shall invoke {@link #reset(Pooled)} after construction for completing the initialization.
      *
-     * @param unmarshaller The unmarshaller to use for the actual work.
-     * @param internal {@code true} if the JAXB implementation is the one bundled in JDK 6,
-     *        or {@code false} if this is the external implementation provided as a JAR file
-     *        in the endorsed directory.
+     * @param  unmarshaller The unmarshaller to use for the actual work.
+     * @param  template The {@link PooledTemplate} from which to get the initial values.
+     * @throws JAXBException If an error occurred while setting a property.
      */
-    PooledUnmarshaller(final Unmarshaller unmarshaller, final boolean internal) {
-        super(internal);
+    PooledUnmarshaller(final Unmarshaller unmarshaller, final Pooled template) throws JAXBException {
+        super(template);
         this.unmarshaller = unmarshaller;
+        initialize(template);
     }
 
     /**
      * Resets the given unmarshaller property to its initial state.
-     * This method is invoked automatically by {@link #reset()}.
+     * This method is invoked automatically by {@link #reset(Pooled)}.
      *
      * @param  key   The property to reset.
      * @param  value The saved initial value to give to the property.
@@ -299,7 +300,7 @@ final class PooledUnmarshaller extends P
 
     /**
      * Delegates to the wrapped unmarshaller. The initial state will be saved
-     * if it was not already done, for future restoration by {@link #reset()}.
+     * if it was not already done, for future restoration by {@link #reset(Pooled)}.
      */
     @Override
     @SuppressWarnings("rawtypes")
@@ -319,7 +320,7 @@ final class PooledUnmarshaller extends P
 
     /**
      * Delegates to the wrapped unmarshaller. The initial state will be saved
-     * if it was not already done, for future restoration by {@link #reset()}.
+     * if it was not already done, for future restoration by {@link #reset(Pooled)}.
      *
      * @deprecated Replaced by {@link #setSchema(javax.xml.validation.Schema)} in JAXB 2.0.
      */
@@ -345,7 +346,7 @@ final class PooledUnmarshaller extends P
 
     /**
      * Delegates to the wrapped unmarshaller. The initial state will be saved
-     * if it was not already done, for future restoration by {@link #reset()}.
+     * if it was not already done, for future restoration by {@link #reset(Pooled)}.
      */
     @Override
     public void setSchema(final Schema schema) {
@@ -363,7 +364,7 @@ final class PooledUnmarshaller extends P
 
     /**
      * Delegates to the wrapped unmarshaller. The initial state will be saved
-     * if it was not already done, for future restoration by {@link #reset()}.
+     * if it was not already done, for future restoration by {@link #reset(Pooled)}.
      */
     @Override
     public void setEventHandler(final ValidationEventHandler handler) throws JAXBException {
@@ -381,7 +382,7 @@ final class PooledUnmarshaller extends P
 
     /**
      * Delegates to the wrapped unmarshaller. The initial state will be saved
-     * if it was not already done, for future restoration by {@link #reset()}.
+     * if it was not already done, for future restoration by {@link #reset(Pooled)}.
      */
     @Override
     public void setAttachmentUnmarshaller(final AttachmentUnmarshaller au) {
@@ -401,7 +402,7 @@ final class PooledUnmarshaller extends P
 
     /**
      * Delegates to the wrapped marshaller. The initial state will be saved
-     * if it was not already done, for future restoration by {@link #reset()}.
+     * if it was not already done, for future restoration by {@link #reset(Pooled)}.
      */
     @Override
     public void setListener(final Listener listener) {

Modified: sis/trunk/core/sis-utility/src/test/java/org/apache/sis/internal/jaxb/gco/PropertyTypeTest.java
URL: http://svn.apache.org/viewvc/sis/trunk/core/sis-utility/src/test/java/org/apache/sis/internal/jaxb/gco/PropertyTypeTest.java?rev=1497454&r1=1497453&r2=1497454&view=diff
==============================================================================
--- sis/trunk/core/sis-utility/src/test/java/org/apache/sis/internal/jaxb/gco/PropertyTypeTest.java [UTF-8] (original)
+++ sis/trunk/core/sis-utility/src/test/java/org/apache/sis/internal/jaxb/gco/PropertyTypeTest.java [UTF-8] Thu Jun 27 17:12:10 2013
@@ -20,7 +20,7 @@ import java.util.UUID;
 import org.apache.sis.util.iso.SimpleInternationalString;
 import org.apache.sis.xml.XLink;
 import org.apache.sis.xml.IdentifierSpace;
-import org.apache.sis.xml.ReferenceResolverMock;
+import org.apache.sis.test.mock.ReferenceResolverMock;
 import org.apache.sis.test.DependsOn;
 import org.apache.sis.test.XMLTestCase;
 import org.junit.Test;

Modified: sis/trunk/core/sis-utility/src/test/java/org/apache/sis/test/XMLComparator.java
URL: http://svn.apache.org/viewvc/sis/trunk/core/sis-utility/src/test/java/org/apache/sis/test/XMLComparator.java?rev=1497454&r1=1497453&r2=1497454&view=diff
==============================================================================
--- sis/trunk/core/sis-utility/src/test/java/org/apache/sis/test/XMLComparator.java [UTF-8] (original)
+++ sis/trunk/core/sis-utility/src/test/java/org/apache/sis/test/XMLComparator.java [UTF-8] Thu Jun 27 17:12:10 2013
@@ -75,7 +75,6 @@ import org.apache.sis.internal.jdk7.JDK7
  * @module
  *
  * @see XMLTestCase
- * @see XMLTransformation
  * @see Assert#assertXmlEquals(Object, Object, String[])
  */
 public strictfp class XMLComparator {

Modified: sis/trunk/core/sis-utility/src/test/java/org/apache/sis/test/XMLTestCase.java
URL: http://svn.apache.org/viewvc/sis/trunk/core/sis-utility/src/test/java/org/apache/sis/test/XMLTestCase.java?rev=1497454&r1=1497453&r2=1497454&view=diff
==============================================================================
--- sis/trunk/core/sis-utility/src/test/java/org/apache/sis/test/XMLTestCase.java [UTF-8] (original)
+++ sis/trunk/core/sis-utility/src/test/java/org/apache/sis/test/XMLTestCase.java [UTF-8] Thu Jun 27 17:12:10 2013
@@ -39,7 +39,6 @@ import static org.junit.Assert.*;
  * @module
  *
  * @see XMLComparator
- * @see XMLTransformation
  */
 public abstract strictfp class XMLTestCase extends TestCase {
     /**

Modified: sis/trunk/core/sis-utility/src/test/java/org/apache/sis/test/suite/UtilityTestSuite.java
URL: http://svn.apache.org/viewvc/sis/trunk/core/sis-utility/src/test/java/org/apache/sis/test/suite/UtilityTestSuite.java?rev=1497454&r1=1497453&r2=1497454&view=diff
==============================================================================
--- sis/trunk/core/sis-utility/src/test/java/org/apache/sis/test/suite/UtilityTestSuite.java [UTF-8] (original)
+++ sis/trunk/core/sis-utility/src/test/java/org/apache/sis/test/suite/UtilityTestSuite.java [UTF-8] Thu Jun 27 17:12:10 2013
@@ -118,7 +118,8 @@ import org.junit.BeforeClass;
     org.apache.sis.internal.jaxb.IdentifierMapWithSpecialCasesTest.class,
     org.apache.sis.internal.jaxb.gco.StringAdapterTest.class,
     org.apache.sis.internal.jaxb.gco.MeasureTest.class,
-    org.apache.sis.internal.jaxb.gco.PropertyTypeTest.class
+    org.apache.sis.internal.jaxb.gco.PropertyTypeTest.class,
+    org.apache.sis.util.iso.NameMarshallingTest.class
 })
 public final strictfp class UtilityTestSuite extends TestSuite {
     /**



Mime
View raw message