/* * Copyright (c) 2016 Fraunhofer IGD * * All rights reserved. This program and the accompanying materials are made * available under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation, either version 3 of the License, * or (at your option) any later version. * * You should have received a copy of the GNU Lesser General Public License * along with this distribution. If not, see <http://www.gnu.org/licenses/>. * * Contributors: * Fraunhofer IGD <http://www.igd.fraunhofer.de/> */ package de.fhg.igd.mapviewer.server.file; import java.lang.reflect.Constructor; import java.util.Properties; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.jdesktop.swingx.mapviewer.PixelConverter; import org.jdesktop.swingx.mapviewer.TileProvider; /** * Factory for {@link PixelConverter} that can be configured with a * {@link Properties} object * * @author <a href="mailto:simon.templer@igd.fhg.de">Simon Templer</a> * * @version $Id$ */ public abstract class PropertiesConverterFactory { private static final Log log = LogFactory.getLog(PropertiesConverterFactory.class); /** converter class property name */ public static final String PROP_CONVERTER_CLASS = "converterClass"; //$NON-NLS-1$ /** * Creates a {@link PixelConverter} for the given {@link TileProvider} from * the given properties * * @param properties the properties that specify the {@link PixelConverter} * @param tileProvider the {@link TileProvider} for to be associated with * the {@link PixelConverter} * * @return a {@link PixelConverter} or null if the properties didn't specify * a valid converter */ @SuppressWarnings("unchecked") public static PixelConverter createConverter(Properties properties, TileProvider tileProvider) { String className = properties.getProperty(PROP_CONVERTER_CLASS); if (className == null) { log.error("Didn't find " + PROP_CONVERTER_CLASS + " property"); //$NON-NLS-1$ //$NON-NLS-2$ return null; } else { Class<?> converterClass; try { converterClass = Class.forName(className); Constructor<? extends PixelConverter> constructor; // try Properties/TileProvider constructor try { constructor = (Constructor<? extends PixelConverter>) converterClass .getConstructor(Properties.class, TileProvider.class); log.info( "Found converter constructor with Properties and TileProvider arguments"); //$NON-NLS-1$ return constructor.newInstance(properties, tileProvider); } catch (Throwable e) { // ignoring } // try TileProvider/Properties constructor try { constructor = (Constructor<? extends PixelConverter>) converterClass .getConstructor(TileProvider.class, Properties.class); log.info( "Found converter constructor with TileProvider and Properties arguments"); //$NON-NLS-1$ return constructor.newInstance(tileProvider, properties); } catch (Throwable e) { // ignoring } // try Properties constructor try { constructor = (Constructor<? extends PixelConverter>) converterClass .getConstructor(Properties.class); log.info("Found converter constructor with Properties argument"); //$NON-NLS-1$ return constructor.newInstance(properties); } catch (Throwable e) { // ignoring } // try TileProvider constructor try { constructor = (Constructor<? extends PixelConverter>) converterClass .getConstructor(TileProvider.class); log.info("Found converter constructor with TileProvider argument"); //$NON-NLS-1$ return constructor.newInstance(tileProvider); } catch (Throwable e) { // ignoring } // try Default constructor try { constructor = (Constructor<? extends PixelConverter>) converterClass .getConstructor(); log.info("Found converter default constructor"); //$NON-NLS-1$ return constructor.newInstance(); } catch (Throwable e) { // ignoring } log.warn("Found no supported constructor: " + className); //$NON-NLS-1$ } catch (ClassNotFoundException e) { log.error("Converter class not found", e); //$NON-NLS-1$ } } return null; } }