blob: 09e799c9296aae0c529faff20c33f33814fae0c4 [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.storage;
import java.util.Locale;
import java.util.Collection;
import org.apache.sis.storage.DataStores;
import org.apache.sis.storage.DataStoreProvider;
import org.apache.sis.util.Exceptions;
import org.apache.sis.util.resources.Vocabulary;
import org.apache.sis.util.collection.BackingStoreException;
// Branch-dependent imports
import org.opengis.util.InternationalString;
import org.opengis.metadata.citation.Citation;
/**
* Capabilities of a class annotated by {@link StoreMetadata}.
*
* <p>This is not a committed API since the way to represent data store capabilities is likely to change.</p>
*
* @author Martin Desruisseaux (Geomatys)
* @version 0.8
* @since 0.8
* @module
*/
public enum Capability {
/**
* The annotated implementation can read data.
*/
READ(Vocabulary.Keys.Read),
/**
* The annotated implementation can write data.
*/
WRITE(Vocabulary.Keys.Write);
/**
* The {@link Vocabulary} key to use for fetching a localized name.
*/
private final short resourceKey;
/**
* Creates a new capability item.
*/
private Capability(final short key) {
resourceKey = key;
}
/**
* Lists the capabilities of all data stores together with their name.
* The returned array is twice the amount of providers, with the capabilities
* at even indices and the format name at odd indices.
*
* <p>This method is for internal usage by {@link org.apache.sis.setup.About}
* only and may change without notice in any future Apache SIS version.</p>
*
* @param locale the locale of the strings to return. Can not be null.
* @param resources the {@code Vocabulary.getResources(locale)} value.
* @return localized string representations of the capabilities of all data store providers.
*/
public static String[] providers(final Locale locale, final Vocabulary resources) {
final Collection<DataStoreProvider> providers = DataStores.providers();
final int count = providers.size();
final String[] list = new String[count * 2];
int i = 0;
for (final DataStoreProvider provider : providers) {
/*
* Build a slash-separated list of capabilities. Example: "Read / write".
*/
final StoreMetadata metadata = provider.getClass().getAnnotation(StoreMetadata.class);
String capabilities = null;
if (metadata != null) {
for (final Capability c : metadata.capabilities()) {
final String e = resources.getString(c.resourceKey);
capabilities = (capabilities == null) ? e : resources.getString(
Vocabulary.Keys.SlashSeparatedList_2, capabilities, e.toLowerCase(locale));
}
}
if (capabilities == null) {
capabilities = resources.getString(Vocabulary.Keys.Unknown);
}
/*
* Get a title for the format, followed by the short name between parenthesis
* if it does not repeat the main title.
*/
String title, complement;
try {
title = title(provider.getFormat().getFormatSpecificationCitation()).toString(locale);
complement = provider.getShortName();
} catch (BackingStoreException e) {
title = provider.getShortName();
complement = Exceptions.getLocalizedMessage(Exceptions.unwrap(e), locale);
}
if (complement != null && !complement.equals(title)) {
title = resources.getString(Vocabulary.Keys.Parenthesis_2, title, complement);
}
list[i++] = capabilities;
list[i++] = title;
}
return list;
}
/**
* Returns the title or alternate title of the given citation, or "untitled" if none.
*/
private static InternationalString title(final Citation specification) {
final InternationalString title = specification.getTitle();
if (title != null) return title;
for (final InternationalString t : specification.getAlternateTitles()) {
if (t != null) return t;
}
return Vocabulary.formatInternational(Vocabulary.Keys.Untitled);
}
}