From: <svn...@os...> - 2012-03-08 10:17:15
|
Author: mbedward Date: 2012-03-08 02:17:06 -0800 (Thu, 08 Mar 2012) New Revision: 38615 Added: trunk/modules/unsupported/swing/src/test/java/org/geotools/swing/tool/InfoToolHelperLookupTest.java Modified: trunk/modules/unsupported/swing/src/main/java/org/geotools/swing/tool/InfoToolHelperLookup.java Log: GEOT-4062: Using ServiceLoader in InfoToolHelperLookup. Added tests. Modified: trunk/modules/unsupported/swing/src/main/java/org/geotools/swing/tool/InfoToolHelperLookup.java =================================================================== --- trunk/modules/unsupported/swing/src/main/java/org/geotools/swing/tool/InfoToolHelperLookup.java 2012-03-07 10:48:07 UTC (rev 38614) +++ trunk/modules/unsupported/swing/src/main/java/org/geotools/swing/tool/InfoToolHelperLookup.java 2012-03-08 10:17:06 UTC (rev 38615) @@ -17,14 +17,10 @@ package org.geotools.swing.tool; -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.lang.ref.WeakReference; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; -import java.util.logging.Level; +import java.util.ServiceLoader; import java.util.logging.Logger; import org.geotools.map.Layer; @@ -40,19 +36,17 @@ class InfoToolHelperLookup { private static final Logger LOGGER = Logger.getLogger("org.geotools.swing"); - private static final String SPI_NAME = - "META-INF/services/org.geotools.swing.tool.InfoToolHelper"; - - private static WeakReference<List<Class>> cache; + private static List<InfoToolHelper> cachedInstances; public static InfoToolHelper getHelper(Layer layer) { - List<Class> helperClasses = InfoToolHelperLookup.getProviders(); - for (Class c : helperClasses) { + loadProviders(); + + for (InfoToolHelper helper : cachedInstances) { try { - InfoToolHelper helper = (InfoToolHelper) c.newInstance(); if (helper.isSupportedLayer(layer)) { - return helper; + return helper.getClass().newInstance(); } + } catch (Exception ex) { throw new RuntimeException(ex); } @@ -62,78 +56,22 @@ } /** - * Gets classes that implement the InfoToolHelper SPI. - * - * @return list of implementing classes + * Caches available classes which implement the InfoToolHelper SPI. */ - private static List<Class> getProviders() { + private static void loadProviders() { List<Class> providers = null; - if (cache != null) { - providers = cache.get(); - } - - if (providers == null) { - providers = getProvidersFromSpiFile(); - cache = new WeakReference<List<Class>>(providers); - } - - return providers; - } - - /** - * Read class names from a registry file and return the list of - * implementing classes. - * - * @param SPI_NAME a fully qualified interface name - * - * @return list of implementing classes - */ - private static List<Class> getProvidersFromSpiFile() { - List<Class> providers = new ArrayList<Class>(); - - ClassLoader cl = InfoToolHelperLookup.class.getClassLoader(); - if (cl != null) { - InputStream str = cl.getResourceAsStream(SPI_NAME); - if (str != null) { - BufferedReader reader = new BufferedReader(new InputStreamReader(str)); - String line = null; - - try { - while ((line = reader.readLine()) != null) { - String text = line.trim(); - if (text.length() > 0 && !text.startsWith("#")) { - try { - providers.add(Class.forName(text)); - } catch (ClassNotFoundException ex) { - LOGGER.log(Level.WARNING, "Class not found: {0}", text); - } - } - } - } catch (IOException ex) { - LOGGER.log(Level.SEVERE, "Problem reading services file: {0}", SPI_NAME); - - } finally { - try { - str.close(); - } catch (Throwable e) { - // ignore - } - - try { - if (reader != null) { - reader.close(); - } - } catch (Throwable e) { - // ignore - } - } - - } else { - LOGGER.log(Level.SEVERE, "Could not find {0}", SPI_NAME); + if (cachedInstances == null) { + cachedInstances = new ArrayList<InfoToolHelper>(); + + ServiceLoader<InfoToolHelper> loader = + ServiceLoader.load(InfoToolHelper.class); + + Iterator<InfoToolHelper> iter = loader.iterator(); + while (iter.hasNext()) { + cachedInstances.add(iter.next()); } } - - return providers; } + } Added: trunk/modules/unsupported/swing/src/test/java/org/geotools/swing/tool/InfoToolHelperLookupTest.java =================================================================== --- trunk/modules/unsupported/swing/src/test/java/org/geotools/swing/tool/InfoToolHelperLookupTest.java (rev 0) +++ trunk/modules/unsupported/swing/src/test/java/org/geotools/swing/tool/InfoToolHelperLookupTest.java 2012-03-08 10:17:06 UTC (rev 38615) @@ -0,0 +1,65 @@ +/* + * GeoTools - The Open Source Java GIS Toolkit + * http://geotools.org + * + * (C) 2012, 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.swing.tool; + +import org.geotools.coverage.CoverageFactoryFinder; +import org.geotools.coverage.grid.GridCoverage2D; +import org.geotools.coverage.grid.GridCoverageFactory; +import org.geotools.geometry.jts.ReferencedEnvelope; +import org.geotools.map.GridCoverageLayer; +import org.geotools.map.Layer; +import org.geotools.swing.testutils.TestDataUtils; + +import static org.junit.Assert.*; +import org.junit.Test; + +/** + * Tests for the info tool helper lookup. + * + * @author Michael Bedward + * @since 8.0 + * @source $URL: $ + * @version $Id: $ + */ +public class InfoToolHelperLookupTest { + + @Test + public void featureLayerHelper() throws Exception { + Layer layer = TestDataUtils.getPolygonLayer(); + InfoToolHelper helper = InfoToolHelperLookup.getHelper(layer); + assertNotNull(helper); + assertEquals(FeatureLayerHelper.class, helper.getClass()); + } + + @Test + public void gridCoverageLayerHelper() throws Exception { + float[][] data = { + {1, 2, 3, 4}, + {5, 6, 7, 8} + }; + + ReferencedEnvelope env = new ReferencedEnvelope(0, 4, 0, 2, null); + GridCoverageFactory gcf = CoverageFactoryFinder.getGridCoverageFactory(null); + GridCoverage2D cov = gcf.create("coverage", data, env); + Layer layer = new GridCoverageLayer(cov, null); + + InfoToolHelper helper = InfoToolHelperLookup.getHelper(layer); + assertNotNull(helper); + assertEquals(GridCoverageLayerHelper.class, helper.getClass()); + } +} |