blob: 7047471438f571bc975c1ed8ded4e5e3804b126f [file] [log] [blame]
/*
* 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.internal.jaxb.gml;
import javax.xml.bind.annotation.XmlID;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlTransient;
import org.apache.sis.xml.Namespaces;
import org.apache.sis.xml.IdentifierMap;
import org.apache.sis.xml.IdentifierSpace;
import org.apache.sis.xml.IdentifiedObject;
/**
* Base class for GML objects that are wrappers around a GeoAPI implementation.
* Every GML object to be marshalled have an ID attribute, which is mandatory.
* If no ID is explicitly set, a default one will be created from the wrapped object.
*
* <div class="note"><b>Note:</b>
* This class is somewhat temporary. It assigns the ID to the <em>wrapped</em> object.
* In a future SIS version, we should assign the ID to the object itself.</div>
*
* @author Guilhem Legal (Geomatys)
* @author Martin Desruisseaux (Geomatys)
* @version 0.4
* @since 0.3
* @module
*/
@XmlTransient
public abstract class GMLAdapter {
/**
* The period identifier, or {@code null} if undefined.
* This element is part of GML 3.1.1 specification.
*
* <h4>Difference between {@code gco:uuid} and {@code gml:id}</h4>
* <ul>
* <li>{@code id} is a standard <strong>GML</strong> attribute available on every
* object-with-identity. It has type={@code "xs:ID"} - i.e. it is a fragment
* identifier, unique within document scope only, for internal cross-references.
* It is not useful by itself as a persistent unique identifier.</li>
* <li>{@code uuid} is an optional attribute available on every object-with-identity,
* provided in the <strong>GMD</strong> schemas that implement ISO 19115 in XML.
* May be used as a persistent unique identifier, but only available within GMD
* context.</li>
* </ul>
*
* @see <a href="https://www.seegrid.csiro.au/wiki/bin/view/AppSchemas/GmlIdentifiers">GML identifiers</a>
* @see org.apache.sis.internal.jaxb.gco.PropertyType#getUUIDREF()
*/
@XmlID
@XmlAttribute(namespace = Namespaces.GML, required = true)
private String id;
/**
* Creates a new GML object with no ID.
* This constructor is typically invoked at unmarshalling time.
* The {@link #id} value will then be set by JAXB.
*
* @see #copyIdTo(Object)
*/
protected GMLAdapter() {
}
/**
* Creates a new GML object wrapping the given GeoAPI implementation.
* The ID will be determined from the given object.
*
* <p>This constructor is typically invoked at marshalling time. The {@link #id}
* value set by this constructor will be used by JAXB for producing the XML.</p>
*
* @param wrapped an instance of a GeoAPI interface to be wrapped.
*/
protected GMLAdapter(final Object wrapped) {
if (wrapped instanceof IdentifiedObject) {
final IdentifierMap map = ((IdentifiedObject) wrapped).getIdentifierMap();
if (map != null) { // Should not be null, but let be safe.
id = map.get(IdentifierSpace.ID);
}
}
}
/**
* Assigns the {@link #id} value (if non-null) to the given object. This method
* is typically invoked at unmarshalling time in order to assign the ID of this
* temporary wrapper to the "real" GeoAPI implementation instance.
*
* @param wrapped the GeoAPI implementation for which to assign the ID.
*/
public final void copyIdTo(final Object wrapped) {
if (id != null && wrapped instanceof IdentifiedObject) {
final IdentifierMap map = ((IdentifiedObject) wrapped).getIdentifierMap();
if (map != null) { // Should not be null, but let be safe.
map.put(IdentifierSpace.ID, id);
}
}
}
}