blob: c79f6b304b614761552bda931a1869a26d9f8701 [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.xml.bind.gco;
import java.util.Locale;
import jakarta.xml.bind.annotation.adapters.XmlAdapter;
import org.opengis.util.InternationalString;
import org.apache.sis.xml.bind.Context;
import org.apache.sis.xml.bind.FilterByVersion;
/**
* JAXB adapter for XML {@code <GO_CharacterString>} element mapped to {@link String}.
* This adapter is similar to {@link InternationalStringAdapter}, except that the {@code unmarshal}
* method needs to localize {@link InternationalString} instances for the locale specified in the
* current marshaller context.
*
* @author Cédric Briançon (Geomatys)
* @author Martin Desruisseaux (Geomatys)
*/
public class StringAdapter extends XmlAdapter<GO_CharacterString, String> {
/**
* Empty constructor for JAXB or subclasses.
*/
public StringAdapter() {
}
/**
* Returns a string representation of the given character sequence. If the given
* sequence is an instance of {@link InternationalString}, then the locale from
* the current unmashalling context is used in order to get a string.
* If the context is {@code null} or does not specify any locale, then the choice
* of locale is left to the {@link InternationalString#toString()} implementation.
*
* @param text the {@code CharSequence} to convert to a {@code String}, or {@code null}.
* @return the localized representation of the given text, or {@code null} if the text was null.
*
* @see org.apache.sis.xml.XML#LOCALE
*/
public static String toString(final CharSequence text) {
if (text == null) {
return null;
}
if (text instanceof InternationalString) {
final Context context = Context.current();
if (context != null) {
final Locale locale = context.getLocale();
if (locale != null) {
/*
* While Apache SIS accepts null locale, foreigner
* implementations are not guaranteed to support null.
*/
return ((InternationalString) text).toString(locale);
}
}
}
return text.toString();
}
/**
* Returns the string representation of the given {@code GO_CharacterString} for the current locale.
* The locale is determined by the {@link org.apache.sis.xml.XML#LOCALE} property given to the marshaller.
*
* @param value the wrapper for the value, or {@code null}.
* @return the string representation of the given text, or {@code null}.
*/
static String toString(final GO_CharacterString value) {
return (value != null) ? toString(value.toCharSequence()) : null;
}
/**
* Converts a string read from a XML stream to the object containing the value.
* JAXB calls automatically this method at unmarshalling time. If the character
* sequence is an instance of {@link InternationalString}, then the locale from
* the current unmashalling context is used in order to get a string.
*
* @param value the wrapper for the value, or {@code null}.
* @return the unwrapped {@link String} value, or {@code null}.
*/
@Override
public String unmarshal(final GO_CharacterString value) {
return toString(value);
}
/**
* Converts a {@linkplain String string} to the object to be marshalled in a XML file or stream.
* JAXB calls automatically this method at marshalling time.
*
* @param value the string value, or {@code null}.
* @return the wrapper for the given string, or {@code null}.
*/
@Override
public GO_CharacterString marshal(final String value) {
return CharSequenceAdapter.wrap(Context.current(), value, value);
}
/**
* Wraps the value only if marshalling ISO 19115-3 element.
* Otherwise (i.e. if marshalling a legacy ISO 19139:2007 document), omit the element.
*/
public static final class Since2014 extends StringAdapter {
/** Empty constructor used only by JAXB. */
public Since2014() {
}
/**
* Wraps the given value in an ISO 19115-3 element, unless we are marshalling an older document.
*
* @return a non-null value only if marshalling ISO 19115-3 or newer.
*/
@Override public GO_CharacterString marshal(final String value) {
return FilterByVersion.CURRENT_METADATA.accept() ? super.marshal(value) : null;
}
}
}