blob: d25347d47040798b89c20e8fc0e557a912967960 [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.metadata;
import java.text.Format;
import java.util.Locale;
import java.util.TimeZone;
import javax.sql.DataSource;
import java.sql.SQLException;
import java.util.function.Supplier;
import org.opengis.util.CodeList;
import org.opengis.metadata.citation.Citation;
import org.apache.sis.internal.util.MetadataServices;
import org.apache.sis.internal.metadata.sql.Initializer;
import org.apache.sis.internal.system.Loggers;
import org.apache.sis.internal.jaxb.Context;
import org.apache.sis.util.logging.Logging;
import org.apache.sis.util.iso.Types;
import org.apache.sis.util.Exceptions;
import org.apache.sis.util.Classes;
import org.apache.sis.util.resources.Errors;
/**
* Implements the metadata services needed by the {@code "sis-utility"} module.
*
* @author Martin Desruisseaux (Geomatys)
* @version 1.0
* @since 0.6
* @module
*/
public final class ServicesForUtility extends MetadataServices {
/**
* Creates a new instance. This constructor is invoked by reflection only.
*/
public ServicesForUtility() {
}
/**
* {@code true} if this thread is in the process of reading a XML document with JAXB.
*
* @return if XML unmarshalling is in progress in current thread.
*/
@Override
public boolean isUnmarshalling() {
final Context context = Context.current();
return (context != null) && !Context.isFlagSet(context, Context.MARSHALLING);
}
/**
* Returns the title of the given enumeration or code list value.
*
* @param code the code for which to get the title.
* @param locale desired locale for the title.
* @return the title.
*
* @see org.apache.sis.util.iso.Types#getCodeTitle(CodeList)
*/
@Override
public String getCodeTitle(final CodeList<?> code, final Locale locale) {
return Types.getCodeTitle(code).toString(locale);
}
/**
* Infers an identifier from the given citation, or returns {@code null} if no identifier has been found.
* This method returns a non-null value only if the identifier is a valid Unicode identifier.
*
* @param citation the citation for which to get the identifier, or {@code null}.
* @return a non-empty identifier without leading or trailing whitespaces, or {@code null}.
*/
@Override
public String getUnicodeIdentifier(final Citation citation) {
return Identifiers.getIdentifier(citation, true);
}
/**
* Returns information about the Apache SIS configuration.
* See super-class for a list of keys.
*
* @param key a key identifying the information to return.
* @param locale language to use if possible.
* @return the information, or {@code null} if none.
*/
@Override
public String getInformation(final String key, final Locale locale) {
switch (key) {
case "DataSource": {
Object server = null, database = null;
try {
final DataSource ds = Initializer.getDataSource();
if (ds != null) {
final Class<?> type = ds.getClass();
database = type.getMethod("getDatabaseName", (Class[]) null).invoke(ds, (Object[]) null);
server = type.getMethod("getServerName", (Class[]) null).invoke(ds, (Object[]) null);
}
} catch (NoSuchMethodException e) {
Logging.recoverableException(Logging.getLogger(Loggers.SYSTEM),
MetadataServices.class, "getInformation", e);
} catch (Exception e) {
// Leave the message unchanged if it contains at least 2 words.
String message = Exceptions.getLocalizedMessage(e, locale);
if (message == null || message.indexOf(' ') < 0) {
message = Classes.getShortClassName(e) + ": " + message;
}
return message;
}
if (database != null) {
if (server != null) {
database = "//" + server + '/' + database;
}
return database.toString();
}
return null;
}
// More cases may be added in future SIS versions.
}
return ReferencingServices.getInstance().getInformation(key, locale);
}
/**
* Creates a format for {@link org.opengis.geometry.DirectPosition} instances.
*
* @param locale the locale for the new {@code Format}, or {@code null} for {@code Locale.ROOT}.
* @param timezone the timezone, or {@code null} for UTC.
* @return a {@link org.apache.sis.geometry.CoordinateFormat}.
*
* @since 0.8
*/
@Override
public Format createCoordinateFormat(final Locale locale, final TimeZone timezone) {
return ReferencingServices.getInstance().createCoordinateFormat(locale, timezone);
}
/**
* Returns the data source for the SIS-wide "SpatialMetadata" database.
*/
@Override
public DataSource getDataSource() throws SQLException {
try {
return Initializer.getDataSource();
} catch (SQLException e) {
throw e;
} catch (Exception e) {
throw new SQLException(Errors.format(Errors.Keys.CanNotConnectTo_1, Initializer.DATABASE), e);
}
}
/**
* Specifies the data source to use if there is no JNDI environment or if no data source is binded
* to {@code jdbc/SpatialMetadata}.
*/
@Override
public void setDataSource(final Supplier<DataSource> ds) {
if (!Initializer.setDefault(ds)) {
throw new IllegalStateException(Resources.format(Resources.Keys.ConnectionAlreadyInitialized_1, Initializer.DATABASE));
}
}
}