/* * GeoTools - The Open Source Java GIS Toolkit * http://geotools.org * * (C) 2004-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.data.vpf; import java.io.File; import java.io.IOException; import java.util.logging.Logger; import java.util.Collections; import java.util.Map; import java.net.URL; import java.net.URI; import org.geotools.data.DataStore; import org.geotools.data.DataStoreFactorySpi; import org.geotools.data.vpf.ifc.FileConstants; import org.geotools.feature.SchemaException; /** * Class VPFDataSourceFactory.java is responsible for constructing appropriate * VPFDataStore (actually VPFLibrary) objects. * VPFDataStoreFactory * - factory for VPFLibrary * - factory for VPFCoverage * - factory for VPFFeatureClass * - implements FeatureType by delegation to contained DefaultFeatureType * - contains VPFFiles * - retrieves VPFColumns from VPFFiles for use in constructing DefaultFeatureType * - contains joins (column pairs) * - factory for VPFFeatureType * - implements FeatureType by delegation to contained VPFFeatureClass * * VPFFile * - contains VPFInputStream * - factory for VPFColumn * - implements AttributeType by delegation to contained DefaultFeatureType * <p> * Created: Fri Mar 28 15:54:32 2003 * </p> * * @author <a href="mailto:kobit@users.sourceforge.net">Artur Hefczyc</a> * @author <a href="mailto:knuterik@onemap.org">Knut-Erik Johnsen</a>, Project OneMap * @author Chris Holmes, Fulbright * * * @source $URL$ * @version 2.1.0 */ public class VPFDataStoreFactory implements DataStoreFactorySpi { /** The logger for the vpf module. */ protected static final Logger LOGGER = org.geotools.util.logging.Logging.getLogger( "org.geotools.data.vpf"); /** * Default Constructor * */ public VPFDataStoreFactory() { } /* * (non-Javadoc) * @see org.geotools.data.DataStoreFactorySpi#getDisplayName() */ public String getDisplayName() { return "Vector Product Format Library"; } /* * (non-Javadoc) * @see org.geotools.data.DataStoreFactorySpi#getDescription() */ public String getDescription() { return "Vector Product Format Library data store implementation."; } /* * (non-Javadoc) * @see org.geotools.data.DataStoreFactorySpi#canProcess(java.util.Map) */ public boolean canProcess(Map params ) { boolean result = false; try { File file = getLhtFile(params); //if getLhtFile didn't throw an exception then we're good. result = true; } catch (IOException exc) { //catch io exception, false will return } return result; } /* * (non-Javadoc) * @see org.geotools.data.DataStoreFactorySpi#createDataStore(java.util.Map) */ public DataStore createDataStore(Map params) throws IOException { return create(params); } /** * Creates a data store. * @param params A <code>Map</code> of parameters which must be verified and * @throws IOException */ private DataStore create(Map params) throws IOException { DataStore result = null; File file = getLhtFile(params); //CH I'd like to check existence here, so that geoserver can get //a better error message, but I've spent way too long on this, so //I'm giving up for now. Ideally canProcess just figures out if //the params are valid, and doesn't throw the not existing error, but //since we need a directory, not the actual file, it's hard to check //for anything. if (!file.exists() || !file.canRead()) { throw new IOException( "File either doesn't exist or is unreadable : " + file); } URI namespace = (URI) NAMESPACEP.lookUp(params); //null if not exist LOGGER.finer("creating new vpf datastore with params: " + params); try { result = new VPFLibrary( file, namespace ); } catch (SchemaException exc) { throw new IOException("There was a problem making one of " + "the feature classes as a FeatureType."); } return result; } /* * private method to get the lht file from the map of params, to avoid * code duplication in canProcess and create, since they both need the * file - canProcess just returns true if it's there, and eats the * exception, create makes the store. */ private File getLhtFile(Map params) throws IOException { URL url = (URL) DIR.lookUp(params); File file = null; if (url.getProtocol().equals("file")){ if(url.getHost()!=null && !url.getHost().equals("")) { //win file = new File(url.getHost()+":"+url.getFile()); }else { //linux file = new File(url.getFile()); } File lhtFile; if (file.isDirectory()) { lhtFile = new File(file, FileConstants.LIBRARY_HEADER_TABLE); } else { lhtFile = file; if (!lhtFile.getName().equalsIgnoreCase(FileConstants.LIBRARY_HEADER_TABLE)) { throw new IOException("File: " + file + "is not a lht file"); } } } else { throw new IOException("only file protocol supported"); } return file; } /* * * (non-Javadoc) * @see org.geotools.data.DataStoreFactorySpi#createNewDataStore(java.util.Map) */ public DataStore createNewDataStore(Map params) throws java.io.IOException { return create(params); } /** * A parameter which is the directory containing the LHT file */ public static final Param DIR = new Param( "url", URL.class, "Directory containing lht file", true ); public static final Param NAMESPACEP = new Param("namespace", URI.class, "uri to a the namespace",false); //not required /* * (non-Javadoc) * @see org.geotools.data.DataStoreFactorySpi#getParametersInfo() */ public Param[] getParametersInfo() { return new Param[] { DIR, }; } /* * (non-Javadoc) * @see org.geotools.data.DataStoreFactorySpi#isAvailable() */ public boolean isAvailable() { return true; } /** * Returns the implementation hints. The default implementation returns en empty map. */ public Map getImplementationHints() { return Collections.EMPTY_MAP; } }