sis-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From desruisse...@apache.org
Subject svn commit: r1416126 - in /sis/branches/JDK7/sis-utility/src/main/java/org/apache/sis/xml: NilObjectHandler.java ObjectResolver.java
Date Sun, 02 Dec 2012 07:26:51 GMT
Author: desruisseaux
Date: Sun Dec  2 07:26:51 2012
New Revision: 1416126

URL: http://svn.apache.org/viewvc?rev=1416126&view=rev
Log:
Ported ObjectResolver for resolving uuidref and idref.

Added:
    sis/branches/JDK7/sis-utility/src/main/java/org/apache/sis/xml/ObjectResolver.java   (with
props)
Modified:
    sis/branches/JDK7/sis-utility/src/main/java/org/apache/sis/xml/NilObjectHandler.java

Modified: sis/branches/JDK7/sis-utility/src/main/java/org/apache/sis/xml/NilObjectHandler.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK7/sis-utility/src/main/java/org/apache/sis/xml/NilObjectHandler.java?rev=1416126&r1=1416125&r2=1416126&view=diff
==============================================================================
--- sis/branches/JDK7/sis-utility/src/main/java/org/apache/sis/xml/NilObjectHandler.java (original)
+++ sis/branches/JDK7/sis-utility/src/main/java/org/apache/sis/xml/NilObjectHandler.java Sun
Dec  2 07:26:51 2012
@@ -17,7 +17,7 @@
 package org.apache.sis.xml;
 
 import java.util.Map;
-import java.util.Arrays;
+import java.util.List;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.lang.reflect.Proxy;
@@ -65,7 +65,13 @@ final class NilObjectHandler implements 
      * or modify identifiers.
      */
     NilObjectHandler(final Identifier[] identifiers) {
-        attribute = IdentifierMapAdapter.create(new ArrayList<>(Arrays.asList(identifiers)));
+        final List<Identifier> asList = new ArrayList<>(identifiers.length);
+        for (final Identifier identifier : identifiers) {
+            if (identifier != null) {
+                asList.add(identifier);
+            }
+        }
+        attribute = IdentifierMapAdapter.create(asList);
     }
 
     /**

Added: sis/branches/JDK7/sis-utility/src/main/java/org/apache/sis/xml/ObjectResolver.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK7/sis-utility/src/main/java/org/apache/sis/xml/ObjectResolver.java?rev=1416126&view=auto
==============================================================================
--- sis/branches/JDK7/sis-utility/src/main/java/org/apache/sis/xml/ObjectResolver.java (added)
+++ sis/branches/JDK7/sis-utility/src/main/java/org/apache/sis/xml/ObjectResolver.java Sun
Dec  2 07:26:51 2012
@@ -0,0 +1,171 @@
+/*
+ * 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.sis.xml;
+
+import java.util.UUID;
+import java.lang.reflect.Proxy;
+import org.opengis.metadata.Identifier;
+import org.apache.sis.util.resources.Errors;
+import org.apache.sis.util.LenientComparable;
+import org.apache.sis.internal.jaxb.UUIDs;
+
+import static org.apache.sis.util.ArgumentChecks.*;
+
+
+/**
+ * Controls the (un)marshaller behavior regarding the {@code xlink} or {@code uuidref} attributes.
+ * At marshalling time, this class controls whether the marshaller is allowed to write a
reference
+ * to an existing instance instead than writing the full object definition.
+ * At unmarshalling time, this class replaces (if possible) a reference by the full object
definition.
+ *
+ * <p>Subclasses can override the methods defined in this class in order to search
in their
+ * own catalog. See the {@link XML#LINKER} javadoc for an example of registering a custom
+ * {@code ObjectResolver} to a unmarshaller.</p>
+ *
+ * @author  Martin Desruisseaux (Geomatys)
+ * @since   0.3 (derived from geotk-3.18)
+ * @version 0.3
+ * @module
+ */
+public class ObjectResolver {
+    /**
+     * The default and thread-safe instance. This instance is used at unmarshalling time
+     * when no {@code ObjectResolver} was explicitly set by the {@link XML#LINKER} property.
+     */
+    public static final ObjectResolver DEFAULT = new ObjectResolver();
+
+    /**
+     * Creates a default {@code ObjectResolver}. This constructor is for subclasses only.
+     */
+    protected ObjectResolver() {
+    }
+
+    /**
+     * Returns an empty object of the given type having the given identifiers.
+     * The object returned by the default implementation has the following properties:
+     *
+     * <ul>
+     *   <li>Implements the given {@code type} interface.</li>
+     *   <li>Implements the {@link IdentifiedObject} interface.</li>
+     *   <li>{@link IdentifiedObject#getIdentifiers()} will return the given identifiers.</li>
+     *   <li>{@link IdentifiedObject#getIdentifierMap()} will return a {@link java.util.Map}
+     *       view over the given identifiers.</li>
+     *   <li>All other methods except the ones inherited from the {@link Object} class
will return
+     *       an empty collection, an empty array, {@code null}, {@link Double#NaN NaN}, 0
or
+     *       {@code false}, depending on the method return type.</li>
+     * </ul>
+     *
+     * @param  <T>     The compile-time type of the {@code type} argument.
+     * @param  context Context (GML version, locale, <i>etc.</i>) of the (un)marshalling
process.
+     * @param  type    The type of object to be unmarshalled as an <strong>interface</strong>.
+     *                 This is usually a <a href="http://www.geoapi.org">GeoAPI</a>
interface.
+     * @param  identifiers An arbitrary amount of identifiers. For each identifier, the
+     *         {@linkplain Identifier#getAuthority() authority} is typically (but not
+     *         necessarily) one of the constants defined in {@link IdentifierSpace}.
+     * @return An object of the given type for the given identifiers, or {@code null} if
none.
+     */
+    @SuppressWarnings("unchecked")
+    public <T> T newIdentifiedObject(final MarshalContext context, final Class<T>
type, final Identifier... identifiers) {
+        if (NilObjectHandler.isIgnoredInterface(type)) {
+            throw new IllegalArgumentException(Errors.format(Errors.Keys.IllegalArgumentValue_2,
"type", type));
+        }
+        return (T) Proxy.newProxyInstance(ObjectResolver.class.getClassLoader(),
+                new Class<?>[] {type, IdentifiedObject.class, NilObject.class, LenientComparable.class},
+                new NilObjectHandler(identifiers));
+    }
+
+    /**
+     * Returns an object of the given type for the given {@code uuid} attribute, or {@code
null}
+     * if none. The default implementation looks in an internal map for previously unmarshalled
+     * object having the given UUID. If no existing instance is found, then this method returns
+     * {@code null}.
+     *
+     * @param  <T>     The compile-time type of the {@code type} argument.
+     * @param  context Context (GML version, locale, <i>etc.</i>) of the (un)marshalling
process.
+     * @param  type    The type of object to be unmarshalled as an <strong>interface</strong>.
+     *                 This is usually a <a href="http://www.geoapi.org">GeoAPI</a>
interface.
+     * @param  uuid The {@code uuid} attributes.
+     * @return An object of the given type for the given {@code uuid} attribute, or {@code
null} if none.
+     */
+    @SuppressWarnings("unchecked")
+    public <T> T resolve(final MarshalContext context, final Class<T> type, final
UUID uuid) {
+        ensureNonNull("type", type);
+        ensureNonNull("uuid", uuid);
+        final Object object = UUIDs.lookup(uuid);
+        return type.isInstance(object) ? (T) object : null;
+    }
+
+    /**
+     * Returns an object of the given type for the given {@code xlink} attribute, or {@code
null}
+     * if none. The default implementation returns {@code null} in all cases.
+     *
+     * @param  <T>     The compile-time type of the {@code type} argument.
+     * @param  context Context (GML version, locale, <i>etc.</i>) of the (un)marshalling
process.
+     * @param  type    The type of object to be unmarshalled as an <strong>interface</strong>.
+     *                 This is usually a <a href="http://www.geoapi.org">GeoAPI</a>
interface.
+     * @param  link The {@code xlink} attributes.
+     * @return An object of the given type for the given {@code xlink} attribute, or {@code
null} if none.
+     */
+    public <T> T resolve(final MarshalContext context, final Class<T> type, final
XLink link) {
+        ensureNonNull("type",  type);
+        ensureNonNull("xlink", link);
+        return null;
+    }
+
+    /**
+     * Returns an object of the given type for the given {@code nilReason} attributes. The
default
+     * implementation returns an immutable object which implement the {@link NilObject} interface
+     * and the given {@code type}. The {@link NilObject#getNilReason()} method will return
the
+     * given reason, and all other methods (except the ones inherited from the {@link Object}
+     * class) will return {@code null} or an empty collection as appropriate.
+     *
+     * @param  <T>     The compile-time type of the {@code type} argument.
+     * @param  context Context (GML version, locale, <i>etc.</i>) of the (un)marshalling
process.
+     * @param  type    The type of object to be unmarshalled as an <strong>interface</strong>.
+     *                 This is usually a <a href="http://www.geoapi.org">GeoAPI</a>
interface.
+     * @param  nilReason The {@code nilReason} attribute.
+     * @return An object of the given type for the given {@code nilReason} attribute, or
{@code null} if none.
+     */
+    @SuppressWarnings("unchecked")
+    public <T> T resolve(final MarshalContext context, final Class<T> type, final
NilReason nilReason) {
+        ensureNonNull("type", type);
+        ensureNonNull("nilReason", nilReason);
+        return nilReason.createNilObject(type);
+    }
+
+    /**
+     * Returns {@code true} if the marshaller can use a reference to the given metadata
+     * instead than writing the full element. This method is invoked when a metadata to
+     * be marshalled has a UUID identifier. Because those metadata may be defined externally,
+     * SIS can not know if the metadata shall be fully marshalled or not.
+     * Such information needs to be provided by the application.
+     *
+     * <p>The default implementation conservatively returns {@code false} in every
cases.</p>
+     *
+     * @param  <T>     The compile-time type of the {@code type} argument.
+     * @param  context Context (GML version, locale, <i>etc.</i>) of the (un)marshalling
process.
+     * @param  type    The type of object to be marshalled as an <strong>interface</strong>.
+     *                 This is usually a <a href="http://www.geoapi.org">GeoAPI</a>
interface.
+     * @param  object  The object to be marshalled.
+     * @param  uuid    The unique identifier of the object to be marshalled.
+     * @return {@code true} if the marshaller can use the {@code uuidref} attribute
+     *         instead than marshalling the given metadata.
+     */
+    public <T> boolean canUseReference(final MarshalContext context, final Class<T>
type, final T object, final UUID uuid) {
+        return false;
+    }
+}

Propchange: sis/branches/JDK7/sis-utility/src/main/java/org/apache/sis/xml/ObjectResolver.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: sis/branches/JDK7/sis-utility/src/main/java/org/apache/sis/xml/ObjectResolver.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain



Mime
View raw message