001: /*
002: * GeoTools - OpenSource mapping toolkit
003: * http://geotools.org
004: * (C) 2005-2006, Geotools Project Management Committee (PMC)
005: *
006: * This library is free software; you can redistribute it and/or
007: * modify it under the terms of the GNU Lesser General Public
008: * License as published by the Free Software Foundation; either
009: * version 2.1 of the License, or (at your option) any later version.
010: *
011: * This library is distributed in the hope that it will be useful,
012: * but WITHOUT ANY WARRANTY; without even the implied warranty of
013: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
014: * Lesser General Public License for more details.
015: */
016: package org.geotools.coverage;
017:
018: // J2SE dependencies
019: import java.util.Arrays;
020: import java.util.Set;
021:
022: // Geotools dependencies
023: import org.geotools.factory.Hints;
024: import org.geotools.factory.FactoryCreator;
025: import org.geotools.factory.FactoryRegistry;
026: import org.geotools.factory.FactoryRegistryException;
027: import org.geotools.coverage.grid.GridCoverageFactory;
028: import org.geotools.resources.LazySet;
029:
030: /**
031: * Defines static methods used to access the application's default
032: * {@linkplain GridCoverageFactory factory} implementation.
033: *
034: * @since 2.1
035: * @source $URL: http://svn.geotools.org/geotools/tags/2.4.1/modules/library/coverage/src/main/java/org/geotools/coverage/FactoryFinder.java $
036: * @version $Id: FactoryFinder.java 22110 2006-10-13 18:28:21Z desruisseaux $
037: * @author Martin Desruisseaux
038: */
039: public final class FactoryFinder {
040: /**
041: * The service registry for this manager.
042: * Will be initialized only when first needed.
043: */
044: private static FactoryRegistry registry;
045:
046: /**
047: * Do not allows any instantiation of this class.
048: */
049: private FactoryFinder() {
050: // singleton
051: }
052:
053: /**
054: * Returns the service registry. The registry will be created the first
055: * time this method is invoked.
056: */
057: private static FactoryRegistry getServiceRegistry() {
058: assert Thread.holdsLock(FactoryFinder.class);
059: if (registry == null) {
060: registry = new FactoryCreator(Arrays
061: .asList(new Class[] { GridCoverageFactory.class }));
062: }
063: return registry;
064: }
065:
066: /**
067: * Returns the first implementation of {@link GridCoverageFactory} matching the specified hints.
068: * If no implementation matches, a new one is created if possible or an exception is thrown
069: * otherwise.
070: *
071: * @param hints An optional map of hints, or {@code null} if none.
072: * @return The first grid coverage factory that matches the supplied hints.
073: * @throws FactoryRegistryException if no implementation was found or can be created for the
074: * {@link GridCoverageFactory} interface.
075: *
076: * @see Hints#DEFAULT_COORDINATE_REFERENCE_SYSTEM
077: * @see Hints#TILE_ENCODING
078: */
079: public static synchronized GridCoverageFactory getGridCoverageFactory(
080: final Hints hints) throws FactoryRegistryException {
081: return (GridCoverageFactory) getServiceRegistry()
082: .getServiceProvider(GridCoverageFactory.class, null,
083: hints, null);
084: }
085:
086: /**
087: * Returns a set of all available implementations for the {@link GridCoverageFactory} interface.
088: *
089: * @return Set of available grid coverage factory implementations.
090: *
091: * @deprecated Use {@link #getGridCoverageFactories(Hints)} instead.
092: */
093: public static synchronized Set getGridCoverageFactories() {
094: return new LazySet(getServiceRegistry().getServiceProviders(
095: GridCoverageFactory.class));
096: }
097:
098: /**
099: * Returns a set of all available implementations for the {@link GridCoverageFactory} interface.
100: *
101: * @param hints An optional map of hints, or {@code null} if none.
102: * @return Set of available grid coverage factory implementations.
103: *
104: * @since 2.4
105: */
106: public static synchronized Set getGridCoverageFactories(
107: final Hints hints) {
108: return new LazySet(getServiceRegistry().getServiceProviders(
109: GridCoverageFactory.class, null, hints));
110: }
111:
112: /**
113: * Scans for factory plug-ins on the application class path. This method is
114: * needed because the application class path can theoretically change, or
115: * additional plug-ins may become available. Rather than re-scanning the
116: * classpath on every invocation of the API, the class path is scanned
117: * automatically only on the first invocation. Clients can call this
118: * method to prompt a re-scan. Thus this method need only be invoked by
119: * sophisticated applications which dynamically make new plug-ins
120: * available at runtime.
121: */
122: public static synchronized void scanForPlugins() {
123: if (registry != null) {
124: registry.scanForPlugins();
125: }
126: }
127: }
|