/* * GeoTools - The Open Source Java GIS Toolkit * http://geotools.org * * (C) 2005-2008, Open Source Geospatial Foundation (OSGeo) * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; * version 2.1 of the License. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. */ package org.geotools.parameter; import java.util.Locale; import java.util.ResourceBundle; import java.util.MissingResourceException; import java.io.Serializable; import javax.media.jai.OperationDescriptor; import org.geotools.util.Utilities; import org.geotools.util.AbstractInternationalString; /** * A localized string for a JAI's operation parameter. * This is used by {@link ImagingParameterDescriptors}. * * @since 2.2 * @source $URL$ * @version $Id$ * @author Martin Desruisseaux (IRD) */ final class ImagingParameterDescription extends AbstractInternationalString implements Serializable { /** * Serial number for interoperability with different versions. */ private static final long serialVersionUID = -325584046563057577L; /** * Shared keys for arguments. Will be completed only as needed. */ private static final String[] argumentKeys = new String[12]; /** * The operation to fetch localized resource from. */ private final OperationDescriptor operation; /** * The key for the resource to fetch. */ private final String key; /** * Prefix to removes from the value associated to the {@code key}, or {@code null} if none. * This is usually the vendor key. */ private final String prefixKey; /** * Creates a new international string from the specified operation and argument number. * * @param operation The operation to fetch localized resource from. * @param arg The argument number. */ public ImagingParameterDescription(final OperationDescriptor operation, final int arg) { this.operation = operation; this.prefixKey = null; if (arg < argumentKeys.length) { String candidate = argumentKeys[arg]; if (candidate != null) { key = candidate; return; } } key = "arg" + arg + "Desc"; if (arg < argumentKeys.length) { argumentKeys[arg] = key; } } /** * Creates a new international string from the specified operation and key. * * @param operation The operation to fetch localized resource from. * @param key The key for the resource to fetch. */ public ImagingParameterDescription(final OperationDescriptor operation, final String key, final String prefixKey) { this.operation = operation; this.key = key; this.prefixKey = prefixKey; } /** * Tests if the resource exists. */ public boolean exists() { try { // AbstractInternationalString.toString() never returns null. return toString().length() != 0; } catch (MissingResourceException exception) { return false; } } /** * Returns a string in the specified locale. * * @param locale The locale to look for, or {@code null} for the default locale. * @return The string in the specified locale, or in a default locale. * @throws MissingResourceException is the key given to the constructor is invalid. */ public String toString(Locale locale) throws MissingResourceException { if (locale == null) { locale = Locale.getDefault(); } final ResourceBundle resources = operation.getResourceBundle(locale); String name = resources.getString(key); if (prefixKey != null) { name = trimPrefix(name, resources.getString(prefixKey)); } return name; } /** * If the specified name starts with the specified prefix, removes the prefix from * the name. This is used for removing the "org.geotools" part in operation name * like "org.geotools.NodataFilter" for example. */ static String trimPrefix(String name, String prefix) { name = name.trim(); if (prefix != null) { prefix = prefix.trim(); final int offset = prefix.length(); if (offset != 0) { if (name.startsWith(prefix)) { final int length = name.length(); if (offset<length && name.charAt(offset)=='.') { name = name.substring(offset + 1); } } } } return name; } /** * Compares this international string with the specified object for equality. */ @Override public boolean equals(final Object object) { if (object!=null && object.getClass().equals(getClass())) { final ImagingParameterDescription that = (ImagingParameterDescription) object; return Utilities.equals(this.key, that.key) && Utilities.equals(this.prefixKey, that.prefixKey) && Utilities.equals(this.operation, that.operation); } return false; } /** * Returns a hash code value for this international text. */ @Override public int hashCode() { return (int)serialVersionUID ^ key.hashCode() ^ operation.hashCode(); } }