Revision: 4678 http://sourceforge.net/p/jump-pilot/code/4678 Author: edso Date: 2015-12-26 22:12:58 +0000 (Sat, 26 Dec 2015) Log Message: ----------- - renamed some classes from *DataStore* to *DS* if others in the same package already used the same naming scheme - adding H2 file db utilizes a filechooser now - streamlined AbstractSpatialDatabasesDataStoreDriver.createJdbcConnection() for file and database datastores - introduced AbstractSpatialDatabasesDSExtension collecting the basic routines used by all spatial database extensions - postgis is now installed via PostgisDSExtension registered in default-plugins.xml - removed obsolete JUMPConfiguration.configureDatastores() method
Modified Paths: -------------- core/trunk/ChangeLog core/trunk/scripts/default-plugins.xml core/trunk/src/com/vividsolutions/jump/datastore/DataStoreDriver.java core/trunk/src/com/vividsolutions/jump/datastore/h2/H2DataStoreDriver.java core/trunk/src/com/vividsolutions/jump/datastore/h2/H2DataStoreExtension.java core/trunk/src/com/vividsolutions/jump/datastore/h2/H2ServerDataStoreDriver.java core/trunk/src/com/vividsolutions/jump/datastore/mariadb/MariadbDataStoreDriver.java core/trunk/src/com/vividsolutions/jump/datastore/mariadb/MariadbDataStoreExtension.java core/trunk/src/com/vividsolutions/jump/datastore/mariadb/MysqlDataStoreExtension.java core/trunk/src/com/vividsolutions/jump/datastore/oracle/OracleDataStoreDriver.java core/trunk/src/com/vividsolutions/jump/datastore/oracle/OracleDataStoreExtension.java core/trunk/src/com/vividsolutions/jump/datastore/spatialite/SpatialiteDataStoreDriver.java core/trunk/src/com/vividsolutions/jump/datastore/spatialite/SpatialiteDataStoreExtension.java core/trunk/src/com/vividsolutions/jump/workbench/JUMPConfiguration.java core/trunk/src/org/openjump/core/ui/plugin/datastore/WritableDataStoreDataSource.java core/trunk/src/org/openjump/core/ui/plugin/datastore/postgis/SaveToPostGISDataSource.java core/trunk/src/org/openjump/core/ui/plugin/datastore/postgis2/PostGISDataStoreDataSource.java Added Paths: ----------- core/trunk/src/com/vividsolutions/jump/datastore/postgis/PostgisDSDriver.java core/trunk/src/com/vividsolutions/jump/datastore/postgis/PostgisDSExtension.java core/trunk/src/com/vividsolutions/jump/datastore/spatialdatabases/AbstractSpatialDatabasesDSDriver.java core/trunk/src/com/vividsolutions/jump/datastore/spatialdatabases/AbstractSpatialDatabasesDSExtension.java Removed Paths: ------------- core/trunk/src/com/vividsolutions/jump/datastore/postgis/PostgisDataStoreDriver.java core/trunk/src/com/vividsolutions/jump/datastore/spatialdatabases/AbstractSpatialDatabasesDataStoreDriver.java Modified: core/trunk/ChangeLog =================================================================== --- core/trunk/ChangeLog 2015-12-26 22:05:59 UTC (rev 4677) +++ core/trunk/ChangeLog 2015-12-26 22:12:58 UTC (rev 4678) @@ -3,19 +3,25 @@ # 2. make sure that lines break at 80 chars for constricted display situations #<-------------------------------- 80 chars ----------------------------------># +2015-12-26 ede + * renamed some classes from *DataStore* to *DS* if others in the same package + already used the same naming scheme + * adding H2 file db utilizes a filechooser now + * streamlined AbstractSpatialDatabasesDataStoreDriver.createJdbcConnection() + for file and database datastores + * introduced AbstractSpatialDatabasesDSExtension collecting the basic routines + used by all spatial database extensions + * postgis is now installed via PostgisDSExtension registered in + default-plugins.xml + * removed obsolete empty JUMPConfiguration.configureDatastores() method + 2015-12-24 bertazza * Fixed broken 4666 commit * Info feature tool: fixed issue related to dirty url - -2015-12-24 bertazza - * Removed IOExpcetion throw from TaskFrame - -2015-12-24 bertazza + * Removed IOException throw from TaskFrame method * Info feature tool for WMS: info shown only for visible layers, added &FEATURE_COUNT=10 parameter, and changed method to retrieve url as suggested by Jukka (should now support basic authentication). - -2015-12-24 bertazza * Fixed broken 4663 commit 2015-12-23 bertazza Modified: core/trunk/scripts/default-plugins.xml =================================================================== --- core/trunk/scripts/default-plugins.xml 2015-12-26 22:05:59 UTC (rev 4677) +++ core/trunk/scripts/default-plugins.xml 2015-12-26 22:12:58 UTC (rev 4678) @@ -22,10 +22,10 @@ <!-- shows selection summary in status bar time field --> org.openjump.core.ui.plugin.view.ShowFullPathPlugIn </plug-in> + <!--add Spatial databases datastore extensions--> <extension> com.vividsolutions.jump.datastore.oracle.OracleDataStoreExtension </extension> - <!--adds other Spatial databases extensions--> <extension> com.vividsolutions.jump.datastore.mariadb.MariadbDataStoreExtension </extension> @@ -38,6 +38,9 @@ <extension> com.vividsolutions.jump.datastore.h2.H2DataStoreExtension </extension> + <extension> + com.vividsolutions.jump.datastore.postgis.PostgisDSExtension + </extension> <plug-in> org.openjump.core.ui.plugin.datastore.postgis.SaveToPostGISPlugIn </plug-in> Modified: core/trunk/src/com/vividsolutions/jump/datastore/DataStoreDriver.java =================================================================== --- core/trunk/src/com/vividsolutions/jump/datastore/DataStoreDriver.java 2015-12-26 22:05:59 UTC (rev 4677) +++ core/trunk/src/com/vividsolutions/jump/datastore/DataStoreDriver.java 2015-12-26 22:12:58 UTC (rev 4678) @@ -1,5 +1,7 @@ package com.vividsolutions.jump.datastore; +import java.sql.Driver; + import com.vividsolutions.jump.parameter.ParameterList; import com.vividsolutions.jump.parameter.ParameterListSchema; @@ -12,6 +14,12 @@ String getName(); + String getVersion(); + + Driver getJdbcDriver(); + + String getJdbcDriverVersion(); + ParameterListSchema getParameterListSchema(); DataStoreConnection createConnection(ParameterList params) throws Exception; Modified: core/trunk/src/com/vividsolutions/jump/datastore/h2/H2DataStoreDriver.java =================================================================== --- core/trunk/src/com/vividsolutions/jump/datastore/h2/H2DataStoreDriver.java 2015-12-26 22:05:59 UTC (rev 4677) +++ core/trunk/src/com/vividsolutions/jump/datastore/h2/H2DataStoreDriver.java 2015-12-26 22:12:58 UTC (rev 4678) @@ -1,22 +1,19 @@ package com.vividsolutions.jump.datastore.h2; +import java.io.File; import java.sql.Connection; -import java.sql.Driver; -import java.sql.DriverManager; import com.vividsolutions.jump.datastore.DataStoreConnection; -import com.vividsolutions.jump.datastore.jdbc.DelegatingDriver; -import com.vividsolutions.jump.datastore.spatialdatabases.AbstractSpatialDatabasesDataStoreDriver; +import com.vividsolutions.jump.datastore.spatialdatabases.AbstractSpatialDatabasesDSDriver; import com.vividsolutions.jump.parameter.ParameterList; import com.vividsolutions.jump.parameter.ParameterListSchema; -import com.vividsolutions.jump.workbench.JUMPWorkbench; /** * A driver for supplying * {@link com.vividsolutions.jump.datastore.spatialdatabases.SpatialDatabasesDSConnection} * s */ -public class H2DataStoreDriver extends AbstractSpatialDatabasesDataStoreDriver { +public class H2DataStoreDriver extends AbstractSpatialDatabasesDSDriver { public final static String JDBC_CLASS = "org.h2.Driver"; @@ -26,13 +23,13 @@ this.urlPrefix = "jdbc:h2:"; paramNames = new String[]{ - PARAM_Instance, + PARAM_DB_File, PARAM_User, PARAM_Password }; paramClasses = new Class[]{ + File.class, String.class, - String.class, String.class }; schema = new ParameterListSchema(paramNames, paramClasses); @@ -48,60 +45,21 @@ @Override public DataStoreConnection createConnection(ParameterList params) throws Exception { - Connection conn = createJdbcConnection(params); + Connection conn = super.createJdbcConnection(params); return new H2DSConnection(conn); } - protected Connection createJdbcConnection(ParameterList params) throws Exception { - String database = params.getParameterString(PARAM_Instance); - String user = params.getParameterString(PARAM_User); - String password = params.getParameterString(PARAM_Password); + @Override + protected String createJdbcUrl(ParameterList params) { + // PARAM_DB_File is a fileChooser: the default mechanism used will store a + // DefaultAwtShell on OSX. Do not cast to this internal type but gets its + // toString() method + // returning the choosen filename. + String database = params.getParameter(PARAM_DB_File).toString(); + // remove possibly existing file extension + database = database.replaceAll("(?i)\\.\\w+\\.db$", ""); + // only open already existing database files, _don't_ create + return getUrlPrefix() + database + ";IFEXISTS=TRUE;"; + } - String url = String.valueOf(new StringBuffer(urlPrefix).append(database)); - - // only register once per driver - if (!this.registered) { - // we always use the plugin classloader to find jdbc jars - // under lib/ext/<subfolder>/ - ClassLoader cl = JUMPWorkbench.getInstance().getPlugInManager() - .getClassLoader(); - Driver driver = (Driver) Class.forName(this.getJdbcClass(), true, cl) - .newInstance(); - // DriverManager insists on jdbc drivers loaded with the default - // classloader, so we wrap our foreign one into a simple wrapper - // see - // https://stackoverflow.com/questions/288828/how-to-use-a-jdbc-driver-from-an-arbitrary-location - DriverManager.registerDriver(new DelegatingDriver(driver)); - this.registered = true; - } - - // some helpful debugging output - // DriverManager.setLogWriter(new PrintWriter(System.out)); - // Enumeration<Driver> ds = DriverManager.getDrivers(); - // while (ds.hasMoreElements()) { - // Driver d = ds.nextElement(); - // System.out.println(d); - // System.out.println(url); - // System.out.println(d.acceptsURL(url)); - // } - - // workaround a bug in DriverManager.getConnection() when used like this: - // Connection conn = DriverManager.getConnection(url, user, password); - // getConnection() blindly connects to each driver and memorizes only - // the _first_ Exception that occurs. this includes "invalid database address" - // errors, which is stupid as connect would have only to ask the driver - // if it supports the given url scheme. funny enough getDriver() does, so - // we add a bit of code and get the connection ourself w/ the proper driver. - Driver d = DriverManager.getDriver(url); - java.util.Properties info = new java.util.Properties(); - if (user != null) { - info.put("user", user); - } - if (password != null) { - info.put("password", password); - } - Connection conn = d.connect(url, info); - - return conn; - } } Modified: core/trunk/src/com/vividsolutions/jump/datastore/h2/H2DataStoreExtension.java =================================================================== --- core/trunk/src/com/vividsolutions/jump/datastore/h2/H2DataStoreExtension.java 2015-12-26 22:05:59 UTC (rev 4677) +++ core/trunk/src/com/vividsolutions/jump/datastore/h2/H2DataStoreExtension.java 2015-12-26 22:12:58 UTC (rev 4678) @@ -1,59 +1,30 @@ package com.vividsolutions.jump.datastore.h2; -import com.vividsolutions.jump.datastore.DataStoreDriver; -import com.vividsolutions.jump.workbench.WorkbenchContext; -import com.vividsolutions.jump.workbench.plugin.Extension; -import com.vividsolutions.jump.workbench.plugin.PlugInContext; +import java.util.Collections; +import java.util.HashMap; -import java.sql.Driver; -import java.sql.DriverManager; +import com.vividsolutions.jump.datastore.spatialdatabases.AbstractSpatialDatabasesDSExtension; -import static com.vividsolutions.jump.datastore.h2.H2DataStoreDriver.JDBC_CLASS; - /** * Extension for H2GIS Support */ -public class H2DataStoreExtension extends Extension { - private static boolean disabled = false; +public class H2DataStoreExtension extends AbstractSpatialDatabasesDSExtension { - public String getName() { - return "H2GIS Datastore Extension"; - } + /** + * customize the abstract implementation + */ + public H2DataStoreExtension() { + super( + new Class[] { H2DataStoreDriver.class, H2ServerDataStoreDriver.class }, + Collections.unmodifiableMap(new HashMap<String, String>() { + { + put(H2DataStoreDriver.JDBC_CLASS, "h2-<version>.jar"); + } + })); + } - public String getVersion() { - return "0.1 (2015-12-20)"; - } + public String getName() { + return "H2GIS Datastore Extension"; + } - public String getMessage() { - return disabled ? "Disabled: Missing h2-<version>.jar in classpath" - : ""; - } - - public void configure(PlugInContext context) throws Exception { - WorkbenchContext wbc = context.getWorkbenchContext(); - - // registers the H2DataStore driver to the system: - try { - ClassLoader pluginLoader = wbc.getWorkbench().getPlugInManager() - .getClassLoader(); - // check for h2-<version>.jar - DriverManager.registerDriver( - (Driver) Class.forName(JDBC_CLASS, true, pluginLoader).newInstance()); - - // register the datastore - wbc.getRegistry().createEntry(DataStoreDriver.REGISTRY_CLASSIFICATION, - new H2DataStoreDriver()); - - wbc.getRegistry().createEntry(DataStoreDriver.REGISTRY_CLASSIFICATION, - new H2ServerDataStoreDriver()); - } catch (Exception e) { - disabled = true; - wbc.getWorkbench() - .getFrame() - .log( - "H2GIS Data Store disabled:\n\t" + e.toString() - + "\n\tH2 JDBC Driver (h2-<version>.jar) must exist in the classpath !", this.getClass()); - } - } - } \ No newline at end of file Modified: core/trunk/src/com/vividsolutions/jump/datastore/h2/H2ServerDataStoreDriver.java =================================================================== --- core/trunk/src/com/vividsolutions/jump/datastore/h2/H2ServerDataStoreDriver.java 2015-12-26 22:05:59 UTC (rev 4677) +++ core/trunk/src/com/vividsolutions/jump/datastore/h2/H2ServerDataStoreDriver.java 2015-12-26 22:12:58 UTC (rev 4678) @@ -3,7 +3,7 @@ import java.sql.Connection; import com.vividsolutions.jump.datastore.DataStoreConnection; -import com.vividsolutions.jump.datastore.spatialdatabases.AbstractSpatialDatabasesDataStoreDriver; +import com.vividsolutions.jump.datastore.spatialdatabases.AbstractSpatialDatabasesDSDriver; import com.vividsolutions.jump.parameter.ParameterList; /** @@ -12,7 +12,7 @@ * s */ public class H2ServerDataStoreDriver extends - AbstractSpatialDatabasesDataStoreDriver { + AbstractSpatialDatabasesDSDriver { public final static String JDBC_CLASS = "org.h2.Driver"; Modified: core/trunk/src/com/vividsolutions/jump/datastore/mariadb/MariadbDataStoreDriver.java =================================================================== --- core/trunk/src/com/vividsolutions/jump/datastore/mariadb/MariadbDataStoreDriver.java 2015-12-26 22:05:59 UTC (rev 4677) +++ core/trunk/src/com/vividsolutions/jump/datastore/mariadb/MariadbDataStoreDriver.java 2015-12-26 22:12:58 UTC (rev 4678) @@ -3,14 +3,14 @@ import java.sql.Connection; import com.vividsolutions.jump.datastore.DataStoreConnection; -import com.vividsolutions.jump.datastore.spatialdatabases.AbstractSpatialDatabasesDataStoreDriver; +import com.vividsolutions.jump.datastore.spatialdatabases.AbstractSpatialDatabasesDSDriver; import com.vividsolutions.jump.parameter.ParameterList; /** * A driver for supplying {@link SpatialDatabaseDSConnection}s */ public class MariadbDataStoreDriver - extends AbstractSpatialDatabasesDataStoreDriver { + extends AbstractSpatialDatabasesDSDriver { // TODO: uniformize public final static String JDBC_CLASS = "org.mariadb.jdbc.Driver"; Modified: core/trunk/src/com/vividsolutions/jump/datastore/mariadb/MariadbDataStoreExtension.java =================================================================== --- core/trunk/src/com/vividsolutions/jump/datastore/mariadb/MariadbDataStoreExtension.java 2015-12-26 22:05:59 UTC (rev 4677) +++ core/trunk/src/com/vividsolutions/jump/datastore/mariadb/MariadbDataStoreExtension.java 2015-12-26 22:12:58 UTC (rev 4678) @@ -1,55 +1,33 @@ package com.vividsolutions.jump.datastore.mariadb; -import static com.vividsolutions.jump.datastore.mariadb.MariadbDataStoreDriver.JDBC_CLASS; +import java.util.Collections; +import java.util.HashMap; -import com.vividsolutions.jump.datastore.DataStoreDriver; -import com.vividsolutions.jump.workbench.WorkbenchContext; -import com.vividsolutions.jump.workbench.plugin.Extension; -import com.vividsolutions.jump.workbench.plugin.PlugInContext; +import com.vividsolutions.jump.datastore.spatialdatabases.AbstractSpatialDatabasesDSExtension; /** - * - * @author nicolas ribot + * a database datastore extension for accessing MariaDB and MySQL w/ the MariaDB + * JDBC driver */ -public class MariadbDataStoreExtension extends Extension { - private static boolean disabled = false; +public class MariadbDataStoreExtension extends + AbstractSpatialDatabasesDSExtension { + /** + * customize the abstract implementation + */ + public MariadbDataStoreExtension() { + super(new Class[] { MariadbDataStoreDriver.class, + MysqlMariadbDataStoreDriver.class }, Collections + .unmodifiableMap(new HashMap<String, String>() { + { + put(MariadbDataStoreDriver.JDBC_CLASS, + "mariadb-java-client-<version>.jar"); + } + })); + } + public String getName() { return "MariaDB/MySQL Spatial Datastore Extension"; } - public String getVersion() { - return "0.3 (2015-12-04)"; - } - - public String getMessage() { - return disabled ? "Disabled: Missing mariadb-java-client-<version>.jar in classpath" - : ""; - } - - public void configure(PlugInContext context) throws Exception { - WorkbenchContext wbc = context.getWorkbenchContext(); - - // registers the MariaDBDataStore driver to the system: - try { - ClassLoader pluginLoader = wbc.getWorkbench().getPlugInManager() - .getClassLoader(); - // check for jar - Class.forName(JDBC_CLASS, false, pluginLoader); - - // register the datastore - wbc.getRegistry().createEntry(DataStoreDriver.REGISTRY_CLASSIFICATION, - new MariadbDataStoreDriver()); - wbc.getRegistry().createEntry(DataStoreDriver.REGISTRY_CLASSIFICATION, - new MysqlMariadbDataStoreDriver()); - - } catch (Exception e) { - disabled = true; - wbc.getWorkbench() - .getFrame() - .log( - getName() +" " + getMessage() +"\n\t" + e.toString(), this.getClass()); - } - } - } Modified: core/trunk/src/com/vividsolutions/jump/datastore/mariadb/MysqlDataStoreExtension.java =================================================================== --- core/trunk/src/com/vividsolutions/jump/datastore/mariadb/MysqlDataStoreExtension.java 2015-12-26 22:05:59 UTC (rev 4677) +++ core/trunk/src/com/vividsolutions/jump/datastore/mariadb/MysqlDataStoreExtension.java 2015-12-26 22:12:58 UTC (rev 4678) @@ -1,52 +1,31 @@ package com.vividsolutions.jump.datastore.mariadb; -import static com.vividsolutions.jump.datastore.mariadb.MysqlDataStoreDriver.JDBC_CLASS; +import java.util.Collections; +import java.util.HashMap; -import com.vividsolutions.jump.datastore.DataStoreDriver; -import com.vividsolutions.jump.workbench.WorkbenchContext; -import com.vividsolutions.jump.workbench.plugin.PlugInContext; +import com.vividsolutions.jump.datastore.spatialdatabases.AbstractSpatialDatabasesDSExtension; /** - * - * @author nicolas ribot + * installs the MySQL database datastore driver if available */ -public class MysqlDataStoreExtension extends MariadbDataStoreExtension { - private static boolean disabled = false; +public class MysqlDataStoreExtension extends + AbstractSpatialDatabasesDSExtension { + /** + * customize the abstract implementation + */ + public MysqlDataStoreExtension() { + super(MysqlDataStoreDriver.class, Collections + .unmodifiableMap(new HashMap<String, String>() { + { + put(MysqlDataStoreDriver.JDBC_CLASS, + "mysql-connector-java-<version>.jar"); + } + })); + } + public String getName() { return "MySQL Spatial Datastore Extension"; } - public String getVersion() { - return super.getVersion(); - } - - public String getMessage() { - return disabled ? "Disabled: Missing mysql-connector-java-<version>.jar in classpath" - : ""; - } - - public void configure(PlugInContext context) throws Exception { - WorkbenchContext wbc = context.getWorkbenchContext(); - - // registers the MariaDBDataStore driver to the system: - try { - ClassLoader pluginLoader = wbc.getWorkbench().getPlugInManager() - .getClassLoader(); - // check for jar - Class.forName(JDBC_CLASS, false, pluginLoader); - - // register the datastore - wbc.getRegistry().createEntry(DataStoreDriver.REGISTRY_CLASSIFICATION, - new MysqlDataStoreDriver()); - - } catch (Exception e) { - disabled = true; - wbc.getWorkbench() - .getFrame() - .log( - getName() +" " + getMessage() +"\n\t" + e.toString(), this.getClass()); - } - } - } Modified: core/trunk/src/com/vividsolutions/jump/datastore/oracle/OracleDataStoreDriver.java =================================================================== --- core/trunk/src/com/vividsolutions/jump/datastore/oracle/OracleDataStoreDriver.java 2015-12-26 22:05:59 UTC (rev 4677) +++ core/trunk/src/com/vividsolutions/jump/datastore/oracle/OracleDataStoreDriver.java 2015-12-26 22:12:58 UTC (rev 4678) @@ -3,14 +3,14 @@ import java.sql.Connection; import com.vividsolutions.jump.datastore.DataStoreConnection; -import com.vividsolutions.jump.datastore.spatialdatabases.AbstractSpatialDatabasesDataStoreDriver; +import com.vividsolutions.jump.datastore.spatialdatabases.AbstractSpatialDatabasesDSDriver; import com.vividsolutions.jump.parameter.ParameterList; /** * A driver for supplying {@link SpatialDatabaseDSConnection}s */ public class OracleDataStoreDriver - extends AbstractSpatialDatabasesDataStoreDriver { + extends AbstractSpatialDatabasesDSDriver { // TODO: uniformize public final static String JDBC_CLASS = "oracle.jdbc.driver.OracleDriver"; public static final String GT_SDO_CLASS_NAME = "org.geotools.data.oracle.sdo.SDO"; Modified: core/trunk/src/com/vividsolutions/jump/datastore/oracle/OracleDataStoreExtension.java =================================================================== --- core/trunk/src/com/vividsolutions/jump/datastore/oracle/OracleDataStoreExtension.java 2015-12-26 22:05:59 UTC (rev 4677) +++ core/trunk/src/com/vividsolutions/jump/datastore/oracle/OracleDataStoreExtension.java 2015-12-26 22:12:58 UTC (rev 4678) @@ -1,59 +1,25 @@ package com.vividsolutions.jump.datastore.oracle; -import com.vividsolutions.jump.datastore.DataStoreDriver; -import static com.vividsolutions.jump.datastore.oracle.OracleDataStoreDriver.JDBC_CLASS; -import static com.vividsolutions.jump.datastore.oracle.OracleDataStoreDriver.GT_SDO_CLASS_NAME; +import java.util.Collections; +import java.util.HashMap; -import com.vividsolutions.jump.workbench.WorkbenchContext; -import com.vividsolutions.jump.workbench.plugin.Extension; -import com.vividsolutions.jump.workbench.plugin.PlugInContext; -import java.sql.Driver; -import java.sql.DriverManager; +import com.vividsolutions.jump.datastore.spatialdatabases.AbstractSpatialDatabasesDSExtension; -/** - * - * @author nicolas ribot - */ -public class OracleDataStoreExtension extends Extension { - private static boolean disabled = false; +public class OracleDataStoreExtension extends AbstractSpatialDatabasesDSExtension { + /** + * customize the abstract implementation + */ + public OracleDataStoreExtension() { + super(OracleDataStoreDriver.class, Collections.unmodifiableMap( + new HashMap<String, String>() {{ + put(OracleDataStoreDriver.JDBC_CLASS,"ojdbc6.jar"); + put(OracleDataStoreDriver.GT_SDO_CLASS_NAME, "gt2-oracle-spatial-2.x.jar"); + }}) ); + } + public String getName() { return "Oracle Spatial Datastore Extension"; } - public String getVersion() { - return "0.3 (2015-12-04)"; - } - - public String getMessage() { - return disabled ? "Disabled: Missing either ojdbc6.jar or gt2-oracle-spatial-2.x.jar in classpath" - : ""; - } - - public void configure(PlugInContext context) throws Exception { - WorkbenchContext wbc = context.getWorkbenchContext(); - - // registers the OracleDataStore driver to the system: - try { - ClassLoader pluginLoader = wbc.getWorkbench().getPlugInManager() - .getClassLoader(); - // check for ojdbc6.jar - Class.forName(JDBC_CLASS, false, pluginLoader); - - // check for gt2-oracle-spatial-2.x.jar - Class.forName(GT_SDO_CLASS_NAME, true, pluginLoader) - .newInstance(); - // register the datastore - wbc.getRegistry().createEntry(DataStoreDriver.REGISTRY_CLASSIFICATION, - new OracleDataStoreDriver()); - } catch (Exception e) { - disabled = true; - wbc.getWorkbench() - .getFrame() - .log( - "Oracle Spatial Data Store disabled:\n\t" + e.toString() - + "\n\tOracle JDBC Driver and gt2-oracle-spatial-2.x.jar must exist in the classpath !", this.getClass()); - } - } - } Copied: core/trunk/src/com/vividsolutions/jump/datastore/postgis/PostgisDSDriver.java (from rev 4667, core/trunk/src/com/vividsolutions/jump/datastore/postgis/PostgisDataStoreDriver.java) =================================================================== --- core/trunk/src/com/vividsolutions/jump/datastore/postgis/PostgisDSDriver.java (rev 0) +++ core/trunk/src/com/vividsolutions/jump/datastore/postgis/PostgisDSDriver.java 2015-12-26 22:12:58 UTC (rev 4678) @@ -0,0 +1,35 @@ +package com.vividsolutions.jump.datastore.postgis; + +import java.sql.Connection; + +import com.vividsolutions.jump.datastore.DataStoreConnection; +import com.vividsolutions.jump.datastore.spatialdatabases.AbstractSpatialDatabasesDSDriver; +import com.vividsolutions.jump.parameter.ParameterList; + +/** + * A driver for supplying {@link SpatialDatabaseDSConnection}s + */ +public class PostgisDSDriver + extends AbstractSpatialDatabasesDSDriver { + + public final static String JDBC_CLASS = "org.postgresql.Driver"; + + public PostgisDSDriver() { + this.driverName = "PostGIS"; + this.jdbcClass = JDBC_CLASS; + this.urlPrefix = "jdbc:postgresql://"; + } + + /** + * returns the right type of DataStoreConnection + * @param params + * @return + * @throws Exception + */ + @Override + public DataStoreConnection createConnection(ParameterList params) + throws Exception { + Connection conn = super.createJdbcConnection(params); + return new PostgisDSConnection(conn); + } +} Added: core/trunk/src/com/vividsolutions/jump/datastore/postgis/PostgisDSExtension.java =================================================================== --- core/trunk/src/com/vividsolutions/jump/datastore/postgis/PostgisDSExtension.java (rev 0) +++ core/trunk/src/com/vividsolutions/jump/datastore/postgis/PostgisDSExtension.java 2015-12-26 22:12:58 UTC (rev 4678) @@ -0,0 +1,29 @@ +package com.vividsolutions.jump.datastore.postgis; + +import java.util.Collections; +import java.util.HashMap; + +import com.vividsolutions.jump.datastore.spatialdatabases.AbstractSpatialDatabasesDSExtension; + +/** + * installs spatialite datastore into OJ + */ +public class PostgisDSExtension extends AbstractSpatialDatabasesDSExtension { + + /** + * customize the abstract implementation + */ + public PostgisDSExtension() { + super(PostgisDSDriver.class, Collections + .unmodifiableMap(new HashMap<String, String>() { + { + put(PostgisDSDriver.JDBC_CLASS, "postgresql-<version>.jdbc4.jar"); + } + })); + } + + public String getName() { + return "Postgis Datastore Extension"; + } + +} Property changes on: core/trunk/src/com/vividsolutions/jump/datastore/postgis/PostgisDSExtension.java ___________________________________________________________________ Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Deleted: core/trunk/src/com/vividsolutions/jump/datastore/postgis/PostgisDataStoreDriver.java =================================================================== --- core/trunk/src/com/vividsolutions/jump/datastore/postgis/PostgisDataStoreDriver.java 2015-12-26 22:05:59 UTC (rev 4677) +++ core/trunk/src/com/vividsolutions/jump/datastore/postgis/PostgisDataStoreDriver.java 2015-12-26 22:12:58 UTC (rev 4678) @@ -1,35 +0,0 @@ -package com.vividsolutions.jump.datastore.postgis; - -import java.sql.Connection; - -import com.vividsolutions.jump.datastore.DataStoreConnection; -import com.vividsolutions.jump.datastore.spatialdatabases.AbstractSpatialDatabasesDataStoreDriver; -import com.vividsolutions.jump.parameter.ParameterList; - -/** - * A driver for supplying {@link SpatialDatabaseDSConnection}s - */ -public class PostgisDataStoreDriver - extends AbstractSpatialDatabasesDataStoreDriver { - - public final static String JDBC_CLASS = "org.postgresql.Driver"; - - public PostgisDataStoreDriver() { - this.driverName = "PostGIS"; - this.jdbcClass = "org.postgresql.Driver"; - this.urlPrefix = "jdbc:postgresql://"; - } - - /** - * returns the right type of DataStoreConnection - * @param params - * @return - * @throws Exception - */ - @Override - public DataStoreConnection createConnection(ParameterList params) - throws Exception { - Connection conn = super.createJdbcConnection(params); - return new PostgisDSConnection(conn); - } -} Copied: core/trunk/src/com/vividsolutions/jump/datastore/spatialdatabases/AbstractSpatialDatabasesDSDriver.java (from rev 4667, core/trunk/src/com/vividsolutions/jump/datastore/spatialdatabases/AbstractSpatialDatabasesDataStoreDriver.java) =================================================================== --- core/trunk/src/com/vividsolutions/jump/datastore/spatialdatabases/AbstractSpatialDatabasesDSDriver.java (rev 0) +++ core/trunk/src/com/vividsolutions/jump/datastore/spatialdatabases/AbstractSpatialDatabasesDSDriver.java 2015-12-26 22:12:58 UTC (rev 4678) @@ -0,0 +1,254 @@ +package com.vividsolutions.jump.datastore.spatialdatabases; + +import java.sql.Connection; +import java.sql.Driver; +import java.sql.DriverManager; +import java.sql.SQLException; +import java.util.Properties; + +import com.vividsolutions.jump.JUMPException; +import com.vividsolutions.jump.datastore.DataStoreConnection; +import com.vividsolutions.jump.datastore.DataStoreDriver; +import com.vividsolutions.jump.datastore.jdbc.DelegatingDriver; +import com.vividsolutions.jump.parameter.ParameterList; +import com.vividsolutions.jump.parameter.ParameterListSchema; +import com.vividsolutions.jump.workbench.JUMPWorkbench; + +/** + * A driver for supplying {@link SpatialDatabaseDSConnection}s + */ +public abstract class AbstractSpatialDatabasesDSDriver implements + DataStoreDriver { + + public static final String PARAM_Server = "Server"; + public static final String PARAM_Port = "Port"; + public static final String PARAM_Instance = "Database"; + public static final String PARAM_User = "User"; + public static final String PARAM_Password = "Password"; + // For file based databases eg. Spatialite + public static final String PARAM_DB_File = "DB file"; + + protected String driverName = null; + protected String jdbcClass = null; + protected Driver jdbcDriver = null; + protected String urlPrefix = null; + + protected String[] paramNames = null; + protected Class[] paramClasses = null; + protected ParameterListSchema schema = null; + + public AbstractSpatialDatabasesDSDriver() { + // Nicolas Ribot: + // paramNames are no more static now they can be overloaded by child classes + // @link SpatialiteDataStoreDriver for instance + paramNames = new String[] { PARAM_Server, PARAM_Port, PARAM_Instance, + PARAM_User, PARAM_Password }; + // Nicolas Ribot: passed protected and not final to allow + // spatialiteDataStoreDriver to overload it + paramClasses = new Class[] { String.class, Integer.class, String.class, + String.class, String.class }; + // Nicolas Ribot: passed protected and not final to allow + // spatialiteDataStoreDriver to overload it + schema = new ParameterListSchema(paramNames, paramClasses); + } + + public Driver getJdbcDriver() { + if (jdbcDriver == null) + try { + initializeJdbcDriver(); + } catch (Exception e) { + // eat it + } + return jdbcDriver; + } + + public String getJdbcDriverVersion() { + if (jdbcDriver == null) + try { + initializeJdbcDriver(); + } catch (Exception e) { + return ""; + } + return jdbcDriver.getMajorVersion() + "." + jdbcDriver.getMinorVersion(); + } + + public String getJdbcClass() { + return jdbcClass; + } + + public String getUrlPrefix() { + return urlPrefix; + } + + public String[] getParamNames() { + return paramNames; + } + + public Class[] getParamClasses() { + return paramClasses; + } + + public ParameterListSchema getSchema() { + return schema; + } + + @Override + public String getName() { + return driverName; + } + + @Override + public String getVersion() { + return getJdbcClass() + " v" + getJdbcDriverVersion(); + } + + @Override + public ParameterListSchema getParameterListSchema() { + return schema; + } + + protected void initializeJdbcDriver() throws SQLException, + InstantiationException, IllegalAccessException, ClassNotFoundException { + // we always use the plugin classloader to find jdbc jars + // under lib/ext/<subfolder>/ + ClassLoader cl = JUMPWorkbench.getInstance().getPlugInManager() + .getClassLoader(); + jdbcDriver = (Driver) Class.forName(this.getJdbcClass(), true, cl) + .newInstance(); + // DriverManager insists on jdbc drivers loaded with the default + // classloader, so we wrap our foreign one into a simple wrapper + // see + // https://stackoverflow.com/questions/288828/how-to-use-a-jdbc-driver-from-an-arbitrary-location + DriverManager.registerDriver(new DelegatingDriver(jdbcDriver)); + } + + /** + * overwrite this method if you have some fancy url scheme and + * createJdbcConnection() will use that instead of the default implementation + * + * @param params + * @return + */ + protected String createJdbcUrl(ParameterList params) { + String url; + if (params.containsParameter(PARAM_DB_File)) { + String database = params.getParameter(PARAM_DB_File).toString(); + url = String.valueOf(new StringBuffer(getUrlPrefix()).append(database)); + } else { + String host = params.getParameterString(PARAM_Server); + int port = params.getParameterInt(PARAM_Port); + String database = params.getParameterString(PARAM_Instance); + url = String.valueOf(new StringBuffer(getUrlPrefix()).append(host) + .append(":").append(port).append("/").append(database)); + } + + return url; + } + + /** + * convenience wrapper for the + * {@link #createJdbcConnection(ParameterList, Properties)} below + * + * @param params + * @return + * @throws Exception + */ + protected Connection createJdbcConnection(ParameterList params) + throws Exception { + return createJdbcConnection(params, null); + } + + /** + * use this method in your implementation to create the actual JDBC connection + */ + protected Connection createJdbcConnection(ParameterList params, + Properties connProps) throws Exception { + + String url = createJdbcUrl(params); + + // only register once per driver + if (jdbcDriver == null) + initializeJdbcDriver(); + + // some helpful debugging output + // DriverManager.setLogWriter(new java.io.PrintWriter(System.out)); + // java.util.Enumeration<Driver> ds = DriverManager.getDrivers(); + // while (ds.hasMoreElements()) { + // Driver d = ds.nextElement(); + // System.out.println(d.toString()); + // System.out.println(url); + // System.out.println(d.acceptsURL(url)); + // } + + // mmichaud 2013-08-27 workaround for ticket #330 + String savePreferIPv4Stack = System.getProperty("java.net.preferIPv4Stack"); + String savePreferIPv6Addresses = System + .getProperty("java.net.preferIPv6Addresses"); + System.setProperty("java.net.preferIPv4Stack", "true"); + System.setProperty("java.net.preferIPv6Addresses", "false"); + + // workaround a bug in DriverManager.getConnection() when used like this: + // Connection conn = DriverManager.getConnection(url, user, password); + // getConnection() blindly connects to each driver and memorizes only + // the _first_ Exception that occurs. this includes + // "invalid database address" + // errors, which is stupid as connect would have only to ask the driver + // if it supports the given url scheme. funny enough getDriver() does, so + // we add a bit of code and get the connection ourself w/ the proper driver. + // finally, as mysql & mariadb both support 'jdbc:mysql' we iterate through + // all registered drivers now and find exactly the instance of our + // JDBC_CLASS + Driver driver = null; + java.util.Enumeration<Driver> drivers = DriverManager.getDrivers(); + while (drivers.hasMoreElements()) { + Driver d = drivers.nextElement(); + if (d instanceof DelegatingDriver) + d = ((DelegatingDriver) d).getDriver(); + // look for exactly _our_ driver + if (d.getClass().getName().equals(getJdbcClass())) { + driver = d; + break; + } + } + // something went wrong + if (driver == null) + throw new JUMPException(getJdbcClass() + + " is not registered with driver manager."); + + String user = params.getParameterString(PARAM_User); + String password = params.getParameterString(PARAM_Password); + Properties info = connProps != null ? new Properties(connProps) + : new Properties(); + if (user != null) { + info.put("user", user); + } + if (password != null) { + info.put("password", password); + } + Connection conn = driver.connect(url, info); + + if (savePreferIPv4Stack == null) { + System.getProperties().remove("java.net.preferIPv4Stack"); + } else { + System.setProperty("java.net.preferIPv4Stack", savePreferIPv4Stack); + } + if (savePreferIPv6Addresses == null) { + System.getProperties().remove("java.net.preferIPv6Addresses"); + } else { + System.setProperty("java.net.preferIPv6Addresses", + savePreferIPv6Addresses); + } + + return conn; + } + + @Override + public abstract DataStoreConnection createConnection(ParameterList params) + throws Exception; + + @Override + public boolean isAdHocQuerySupported() { + return true; + } + +} Added: core/trunk/src/com/vividsolutions/jump/datastore/spatialdatabases/AbstractSpatialDatabasesDSExtension.java =================================================================== --- core/trunk/src/com/vividsolutions/jump/datastore/spatialdatabases/AbstractSpatialDatabasesDSExtension.java (rev 0) +++ core/trunk/src/com/vividsolutions/jump/datastore/spatialdatabases/AbstractSpatialDatabasesDSExtension.java 2015-12-26 22:12:58 UTC (rev 4678) @@ -0,0 +1,166 @@ +package com.vividsolutions.jump.datastore.spatialdatabases; + +import java.util.Map; + +import com.vividsolutions.jump.I18N; +import com.vividsolutions.jump.datastore.DataStoreDriver; +import com.vividsolutions.jump.workbench.JUMPWorkbench; +import com.vividsolutions.jump.workbench.WorkbenchContext; +import com.vividsolutions.jump.workbench.plugin.Extension; +import com.vividsolutions.jump.workbench.plugin.PlugInContext; + +/** + * basic implementation for db datastore extensions + */ +abstract public class AbstractSpatialDatabasesDSExtension extends Extension { + + protected String errorMessage = null; + protected DataStoreDriver driver = null; + + protected Class[] dsDriverClasses = null; + // a map w/ entries like "oracle.jdbc.driver.OracleDriver"->"ojdb6.jar" + protected Map<String, String> classNameToJarName = null; + + /** + * private, use {@link #AbstractSpatialDatabasesDSExtension(Class, Map)} + * instead + */ + private AbstractSpatialDatabasesDSExtension() { + } + + /** + * instantiate a new extension capable of registering a database datastore + * driver + * + * @param dsDriverClass + * - the class implementing {@link DataStoreDriver} + * @param classesToJar + * - a map with class name entries mapping to jar file names eg. + * "oracle.jdbc.driver.OracleDriver"->"ojdb6.jar" + */ + public AbstractSpatialDatabasesDSExtension(Class[] dsDriverClasses, + Map<String, String> classesToJar) { + super(); + if (classesToJar == null + || checkArray(dsDriverClasses, DataStoreDriver.class)) + throw new IllegalArgumentException(); + this.dsDriverClasses = dsDriverClasses; + this.classNameToJarName = classesToJar; + } + + /** + * convenience method for + * {@link #AbstractSpatialDatabasesDSExtension(Class[], Map)} + * + * @param dsDriverClass + * @param classesToJar + */ + public AbstractSpatialDatabasesDSExtension(Class dsDriverClass, + Map<String, String> classesToJar) { + this(new Class[] { dsDriverClass }, classesToJar); + } + + private boolean checkArray(Class[] classes, Class derivedFrom) { + if (!(dsDriverClasses instanceof Class[])) + return false; + + for (Class clazz : classes) { + if (!clazz.isAssignableFrom(derivedFrom)) + return false; + } + return true; + } + + /** + * implement to assign a readable name to the datastore driver extension + * + * @Override + */ + abstract public String getName(); + + /** + * the default version is 'svn revision (build date)' + */ + public String getVersion() { + return "rev." + I18N.get("JUMPWorkbench.version.revision") + "(" + + I18N.get("JUMPWorkbench.version.buildDate") + ")"; + } + + /** + * override to check dependencies on your own + * + * @return "" on success, "errormessage" on failure + */ + protected String isAvailable() { + // only run this test once + if (errorMessage != null) + return errorMessage; + + ClassLoader pluginLoader = JUMPWorkbench.getInstance().getPlugInManager() + .getClassLoader(); + String msg = ""; + for (Map.Entry<String, String> entry : classNameToJarName.entrySet()) { + String clazz = entry.getKey(); + String jar = entry.getValue(); + // check for jar + try { + Class.forName(clazz, false, pluginLoader); + } catch (ClassNotFoundException e) { + msg = msg.isEmpty() ? jar : msg + ", " + jar; + } + } + if (!msg.isEmpty()) + msg = I18N.getMessage(getClass().getName() + + ".missing-dependency-jars {0}", msg); + + return errorMessage = msg; + } + + /** + * by default show error messages or loaded JDBC driver versions + */ + public String getMessage() { + String msg = isAvailable(); + if (!msg.isEmpty()) + return msg; + + if (driver != null) + return driver.getVersion(); + + return ""; + } + + /** + * installs the database datastore driver defined as first parameter in + * {@link #AbstractSpatialDatabasesDSExtension(Class, Map)} if + * {@link #isAvailable()} returns an empty String + */ + public void configure(PlugInContext context) throws Exception { + WorkbenchContext wbc = context.getWorkbenchContext(); + + // conditionally register the DataStore drivers to the system: + if (isAvailable().isEmpty()) { + for (Class dsDriverClass : dsDriverClasses) { + DataStoreDriver dsDriver = (DataStoreDriver) dsDriverClass + .newInstance(); + + // cache the first driver for version output above + // all others are presumably aliases for different protocols + if (driver == null) + driver = dsDriver; + + // register the datastore + wbc.getRegistry().createEntry(DataStoreDriver.REGISTRY_CLASSIFICATION, + dsDriver); + } + } else { + wbc.getWorkbench() + .getFrame() + .log( + I18N.getMessage(getClass().getName() + + ".datastore-{0}-disabled:-{1}", getName(), isAvailable()), + this.getClass()); + } + } + +} Property changes on: core/trunk/src/com/vividsolutions/jump/datastore/spatialdatabases/AbstractSpatialDatabasesDSExtension.java ___________________________________________________________________ Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Deleted: core/trunk/src/com/vividsolutions/jump/datastore/spatialdatabases/AbstractSpatialDatabasesDataStoreDriver.java =================================================================== --- core/trunk/src/com/vividsolutions/jump/datastore/spatialdatabases/AbstractSpatialDatabasesDataStoreDriver.java 2015-12-26 22:05:59 UTC (rev 4677) +++ core/trunk/src/com/vividsolutions/jump/datastore/spatialdatabases/AbstractSpatialDatabasesDataStoreDriver.java 2015-12-26 22:12:58 UTC (rev 4678) @@ -1,199 +0,0 @@ -package com.vividsolutions.jump.datastore.spatialdatabases; - -import java.sql.Connection; -import java.sql.Driver; -import java.sql.DriverManager; - -import com.vividsolutions.jump.JUMPException; -import com.vividsolutions.jump.datastore.DataStoreConnection; -import com.vividsolutions.jump.datastore.DataStoreDriver; -import com.vividsolutions.jump.datastore.jdbc.DelegatingDriver; -import com.vividsolutions.jump.parameter.ParameterList; -import com.vividsolutions.jump.parameter.ParameterListSchema; -import com.vividsolutions.jump.workbench.JUMPWorkbench; - -/** - * A driver for supplying {@link SpatialDatabaseDSConnection}s - */ -public abstract class AbstractSpatialDatabasesDataStoreDriver - implements DataStoreDriver { - - /** TODO: I18N */ - public static final String PARAM_Server = "Server"; - public static final String PARAM_Port = "Port"; - public static final String PARAM_Instance = "Database"; - public static final String PARAM_User = "User"; - public static final String PARAM_Password = "Password"; - // For Spatialite - public static final String PARAM_DB_File = "DB file"; - - protected String driverName = null; - protected String jdbcClass = null; - protected String urlPrefix = null; - - protected String[] paramNames = null; - protected Class[] paramClasses = null; - protected ParameterListSchema schema = null; - - protected boolean registered = false; - - public AbstractSpatialDatabasesDataStoreDriver() { - // Nicolas Ribot: - //paramNames are no more static now they can be overloaded by child classes @link SpatialiteDataStoreDriver for instance - paramNames = new String[]{ - PARAM_Server, - PARAM_Port, - PARAM_Instance, - PARAM_User, - PARAM_Password - }; - // Nicolas Ribot: passed protected and not final to allow spatialiteDataStoreDriver to overload it - paramClasses = new Class[]{ - String.class, - Integer.class, - String.class, - String.class, - String.class - }; - // Nicolas Ribot: passed protected and not final to allow spatialiteDataStoreDriver to overload it - schema = new ParameterListSchema(paramNames, paramClasses); - } - - public String getDriverName() { - return driverName; - } - - public String getJdbcClass() { - return jdbcClass; - } - - public String getUrlPrefix() { - return urlPrefix; - } - - public String[] getParamNames() { - return paramNames; - } - - public Class[] getParamClasses() { - return paramClasses; - } - - public ParameterListSchema getSchema() { - return schema; - } - - @Override - public String getName() { - return driverName; - } - - @Override - public ParameterListSchema getParameterListSchema() { - return schema; - } - - /** - * use this method in your implementation to create the actual JDBC connection - */ - protected Connection createJdbcConnection(ParameterList params) - throws Exception { - String host = params.getParameterString(PARAM_Server); - int port = params.getParameterInt(PARAM_Port); - String database = params.getParameterString(PARAM_Instance); - String user = params.getParameterString(PARAM_User); - String password = params.getParameterString(PARAM_Password); - - String url - = String.valueOf(new StringBuffer(getUrlPrefix()).append(host).append(":").append(port).append("/").append(database)); - - // only register once per driver - if (!this.registered) { - // we always use the plugin classloader to find jdbc jars - // under lib/ext/<subfolder>/ - ClassLoader cl = JUMPWorkbench.getInstance().getPlugInManager() - .getClassLoader(); - Driver driver = (Driver) Class.forName(this.getJdbcClass(), true, cl) - .newInstance(); - // DriverManager insists on jdbc drivers loaded with the default - // classloader, so we wrap our foreign one into a simple wrapper - // see - // https://stackoverflow.com/questions/288828/how-to-use-a-jdbc-driver-from-an-arbitrary-location - DriverManager.registerDriver(new DelegatingDriver(driver)); - this.registered = true; - } - - // some helpful debugging output -// DriverManager.setLogWriter(new java.io.PrintWriter(System.out)); -// java.util.Enumeration<Driver> ds = DriverManager.getDrivers(); -// while (ds.hasMoreElements()) { -// Driver d = ds.nextElement(); -// System.out.println(d.toString()); -// System.out.println(url); -// System.out.println(d.acceptsURL(url)); -// } - - // mmichaud 2013-08-27 workaround for ticket #330 - String savePreferIPv4Stack = System.getProperty("java.net.preferIPv4Stack"); - String savePreferIPv6Addresses = System.getProperty("java.net.preferIPv6Addresses"); - System.setProperty("java.net.preferIPv4Stack", "true"); - System.setProperty("java.net.preferIPv6Addresses", "false"); - - // workaround a bug in DriverManager.getConnection() when used like this: - // Connection conn = DriverManager.getConnection(url, user, password); - // getConnection() blindly connects to each driver and memorizes only - // the _first_ Exception that occurs. this includes "invalid database address" - // errors, which is stupid as connect would have only to ask the driver - // if it supports the given url scheme. funny enough getDriver() does, so - // we add a bit of code and get the connection ourself w/ the proper driver. - // finally, as mysql & mariadb both support 'jdbc:mysql' we iterate through - // all registered drivers now and find exactly the instance of our JDBC_CLASS - Driver driver = null; - java.util.Enumeration<Driver> drivers = DriverManager.getDrivers(); - while (drivers.hasMoreElements()) { - Driver d = drivers.nextElement(); - if (d instanceof DelegatingDriver) - d = ((DelegatingDriver) d).getDriver(); - // look for exactly _our_ driver - if (d.getClass().getName().equals(getJdbcClass())) { - driver = d; - break; - } - } - // something went wrong - if (driver == null) - throw new JUMPException(getJdbcClass()+" is not registered with driver manager."); - - java.util.Properties info = new java.util.Properties(); - if (user != null) { - info.put("user", user); - } - if (password != null) { - info.put("password", password); - } - Connection conn = driver.connect(url, info); - - if (savePreferIPv4Stack == null) { - System.getProperties().remove("java.net.preferIPv4Stack"); - } else { - System.setProperty("java.net.preferIPv4Stack", savePreferIPv4Stack); - } - if (savePreferIPv6Addresses == null) { - System.getProperties().remove("java.net.preferIPv6Addresses"); - } else { - System.setProperty("java.net.preferIPv6Addresses", savePreferIPv6Addresses); - } - - return conn; - } - - @Override - public abstract DataStoreConnection createConnection(ParameterList params) - throws Exception; - - @Override - public boolean isAdHocQuerySupported() { - return true; - } - -} Modified: core/trunk/src/com/vividsolutions/jump/datastore/spatialite/SpatialiteDataStoreDriver.java =================================================================== --- core/trunk/src/com/vividsolutions/jump/datastore/spatialite/SpatialiteDataStoreDriver.java 2015-12-26 22:05:59 UTC (rev 4677) +++ core/trunk/src/com/vividsolutions/jump/datastore/spatialite/SpatialiteDataStoreDriver.java 2015-12-26 22:12:58 UTC (rev 4678) @@ -3,13 +3,10 @@ import java.io.File; import java.lang.reflect.Method; import java.sql.Connection; -import java.sql.Driver; -import java.sql.DriverManager; import java.util.Properties; import com.vividsolutions.jump.datastore.DataStoreConnection; -import com.vividsolutions.jump.datastore.jdbc.DelegatingDriver; -import com.vividsolutions.jump.datastore.spatialdatabases.AbstractSpatialDatabasesDataStoreDriver; +import com.vividsolutions.jump.datastore.spatialdatabases.AbstractSpatialDatabasesDSDriver; import com.vividsolutions.jump.parameter.ParameterList; import com.vividsolutions.jump.parameter.ParameterListSchema; import com.vividsolutions.jump.workbench.JUMPWorkbench; @@ -19,15 +16,14 @@ /** * A driver for supplying {@link SpatialDatabaseDSConnection}s */ -public class SpatialiteDataStoreDriver extends AbstractSpatialDatabasesDataStoreDriver { +public class SpatialiteDataStoreDriver extends AbstractSpatialDatabasesDSDriver { public final static String JDBC_CLASS = "org.sqlite.JDBC"; - private static boolean initialized = false; + private String spatialiteVersion = "not connected"; public SpatialiteDataStoreDriver() { this.driverName = "Spatialite"; this.jdbcClass = JDBC_CLASS; - // TODO: prompt for filename this.urlPrefix = "jdbc:sqlite:"; // Panel parameters: adds a file chooser for db name @@ -37,6 +33,13 @@ } /** + * additionally report spatialite version if connection exists + */ + public String getVersion() { + return super.getVersion() + " (Spatialite " + spatialiteVersion + ")"; + } + + /** * returns a spatialite JDBC connection with spatialite extension loaded if * possible if not, a property will tell so * @@ -63,25 +66,9 @@ + " does not exist. cannot create connection"); } - String url = String.valueOf(new StringBuffer(urlPrefix).append(database)); - ClassLoader cl = JUMPWorkbench.getInstance().getPlugInManager() .getClassLoader(); - // we register only once - if (!initialized) { - Driver driver = (Driver) cl.loadClass(this.getJdbcClass()).newInstance(); - // DriverManager insists on jdbc drivers loaded with the default - // classloader, so we wrap our foreign one into a simple wrapper - // see https://stackoverflow.com/questions/288828/how-to-use-a-jdbc-driver-from-an-arbitrary-location - DriverManager.registerDriver(new DelegatingDriver(driver)); - initialized = true; -// Enumeration<Driver> ds = DriverManager.getDrivers(); -// while (ds.hasMoreElements()) { -// System.out.println(ds.nextElement()); -// } - } - // mandatory to enable loading extensions Class configClazz = cl.loadClass("org.sqlite.SQLiteConfig"); Method enableMethod = configClazz.getMethod("enableLoadExtension", @@ -97,9 +84,18 @@ Method getPropsMethod = configClazz.getMethod("toProperties"); Properties props = (Properties) getPropsMethod.invoke(config); - Connection conn = DriverManager.getConnection(url, props); - return new SpatialiteDSConnection(conn); + Connection conn = super.createJdbcConnection(params, props); + SpatialiteDSConnection dsConn = new SpatialiteDSConnection(conn); + + // memorize spatialite version for displaying later + this.spatialiteVersion = ((SpatialiteDSMetadata) dsConn.getMetadata()) + .getSpatialiteVersion(); + // report if spatialite could not be loaded + if (this.spatialiteVersion.isEmpty()) + this.spatialiteVersion = "missing"; + + return dsConn; } - + } Modified: core/trunk/src/com/vividsolutions/jump/datastore/spatialite/SpatialiteDataStoreExtension.java =================================================================== --- core/trunk/src/com/vividsolutions/jump/datastore/spatialite/SpatialiteDataStoreExtension.java 2015-12-26 22:05:59 UTC (rev 4677) +++ core/trunk/src/com/vividsolutions/jump/datastore/spatialite/SpatialiteDataStoreExtension.java 2015-12-26 22:12:58 UTC (rev 4678) @@ -1,55 +1,31 @@ package com.vividsolutions.jump.datastore.spatialite; -import com.vividsolutions.jump.datastore.DataStoreDriver; -import static com.vividsolutions.jump.datastore.spatialite.SpatialiteDataStoreDriver.JDBC_CLASS; +import java.util.Collections; +import java.util.HashMap; -import com.vividsolutions.jump.workbench.WorkbenchContext; -import com.vividsolutions.jump.workbench.plugin.Extension; -import com.vividsolutions.jump.workbench.plugin.PlugInContext; -import java.sql.Driver; -import java.sql.DriverManager; +import com.vividsolutions.jump.datastore.spatialdatabases.AbstractSpatialDatabasesDSExtension; /** - * - * @author nicolas ribot + * installs spatialite datastore into OJ */ -public class SpatialiteDataStoreExtension extends Extension { - private static boolean disabled = false; +public class SpatialiteDataStoreExtension extends + AbstractSpatialDatabasesDSExtension { - public String getName() { - return "Spatialite Spatial Datastore Extension"; + /** + * customize the abstract implementation + */ + public SpatialiteDataStoreExtension() { + super(SpatialiteDataStoreDriver.class, Collections + .unmodifiableMap(new HashMap<String, String>() { + { + put(SpatialiteDataStoreDriver.JDBC_CLASS, + "sqlite-jdbc-<version>.jar"); + } + })); } - public String getVersion() { - return "0.3 (2015-12-04)"; + public String getName() { + return "Spatialite Datastore Extension"; } - public String getMessage() { - return disabled ? "Disabled: Missing sqlite-jdbc-<version>.jar in classpath" - : ""; - } - // TODO: refactor in a base class. - public void configure(PlugInContext context) throws Exception { - WorkbenchContext wbc = context.getWorkbenchContext(); - - // registers the MariaDBDataStore driver to the system: - try { - ClassLoader pluginLoader = wbc.getWorkbench().getPlugInManager() - .getClassLoader(); - // check for sqlite jar - Class.forName(JDBC_CLASS, false, pluginLoader); - - // register the datastore - wbc.getRegistry().createEntry(DataStoreDriver.REGISTRY_CLASSIFICATION, - new SpatialiteDataStoreDriver()); - } catch (Exception e) { - disabled = true; - wbc.getWorkbench() - .getFrame() - .log( - "Sqlite/Spatialite Spatial Data Store disabled:\n\t" + e.toString() - + "\n\tSqlite JDBC Driver (sqlite-jdbc-<version>.jar) must exist in the classpath !", this.getClass()); - } - } - } Modified: core/trunk/src/com/vividsolutions/jump/workbench/JUMPConfiguration.java =================================================================== --- core/trunk/src/com/vividsolutions/jump/workbench/JUMPConfiguration.java 2015-12-26 22:05:59 UTC (rev 4677) +++ core/trunk/src/com/vividsolutions/jump/workbench/JUMPConfiguration.java 2015-12-26 22:12:58 UTC (rev 4678) @@ -36,7 +36,6 @@ import java.awt.event.ComponentEvent; import java.lang.reflect.Field; -import javax.swing.JFrame; import javax.swing.JPopupMenu; import javax.swing.JToggleButton; @@ -67,14 +66,6 @@ import com.vividsolutions.jts.util.Assert; import com.vividsolutions.jump.I18N; -import com.vividsolutions.jump.datastore.DataStoreDriver; -import com.vividsolutions.jump.datastore.DataStoreException; -import com.vividsolutions.jump.datastore.postgis.PostgisDataStoreDriver; -//import com.vividsolutions.jump.workbench.datasource.AbstractSaveDatasetAsPlugIn; -//import com.vividsolutions.jump.workbench.datasource.InstallStandardDataSourceQueryChoosersPlugIn; -//import com.vividsolutions.jump.workbench.datasource.LoadDatasetPlugIn; -//import com.vividsolutions.jump.workbench.datasource.SaveDatasetAsPlugIn; -import com.vividsolutions.jump.workbench.datastore.ConnectionManager; import com.vividsolutions.jump.workbench.model.Layer; import com.vividsolutions.jump.workbench.model.WMSLayer; import com.vividsolutions.jump.workbench.plugin.AbstractPlugIn; @@ -83,7 +74,6 @@ import com.vividsolutions.jump.workbench.plugin.MultiEnableCheck; import com.vividsolutions.jump.workbench.plugin.PlugIn; import com.vividsolutions.jump.workbench.plugin.PlugInContext; -import com.vividsolutions.jump.workbench.ui.ApplicationExitHandler; //import com.vividsolutions.jump.workbench.ui.AttributeTab; //import com.vividsolutions.jump.workbench.ui.GUIUtil; import com.vividsolutions.jump.workbench.ui.LayerViewPanel; @@ -182,9 +172,11 @@ //import com.vividsolutions.jump.workbench.ui.zoom.ZoomToLayerPlugIn; import com.vividsolutions.jump.workbench.ui.zoom.ZoomToSelectedItemsPlugIn; import com.vividsolutions.jump.workbench.ui.zoom.ZoomTool; +//import com.vividsolutions.jump.workbench.datasource.AbstractSaveDatasetAsPlugIn; +//import com.vividsolutions.jump.workbench.datasource.InstallStandardDataSourceQueryChoosersPlugIn; +//import com.vividsolutions.jump.workbench.datasource.LoadDatasetPlugIn; +//import com.vividsolutions.jump.workbench.datasource.SaveDatasetAsPlugIn; -import de.latlon.deejump.plugin.style.DeeChangeStylesPlugIn; - /** * Initializes the Workbench with various menus and cursor tools. Accesses the * Workbench structure through a WorkbenchContext. @@ -379,7 +371,6 @@ public void setup(WorkbenchContext workbenchContext) throws Exception { configureStyles(workbenchContext); - configureDatastores(workbenchContext); workbenchContext.getWorkbench().getBlackboard() .put(SnapToVerticesPolicy.ENABLED_KEY, true); @@ -1064,40 +1055,6 @@ // featureInstaller.addMenuSeparator(MENU_LAYER); // =================== } - public void configureDatastores(final WorkbenchContext context) - throws Exception { - - context.getRegistry().createEntry(DataStoreDriver.REGISTRY_CLASSIFICATION, - new PostgisDataStoreDriver()); - - // Nicolas Ribot, 01 fev 2015: tries to add oracle DataStore support - // add the driver only if oracle driver class if found - /* - try { - Driver driver = (Driver) Class.forName(JDBC_CLASS).newInstance(); - context.getRegistry().createEntry(DataStoreDriver.REGISTRY_CLASSIFICATION, - new OracleDataStoreDriver()); - } catch (Exception e) { - // TODO: replace by log ? - System.out.println("oracle driver not found: " + e.toString() + ". dataStore NOT added"); - } - */ -// // update exit handler -// final ApplicationExitHandler oldApplicationExitHandler = context -// .getWorkbench().getFrame().getApplicationExitHandler(); -// context.getWorkbench().getFrame() -// .setApplicationExitHandler(new ApplicationExitHandler() { -// public void exitApplication(JFrame mainFrame) { -// try { -// ConnectionManager.instance(context).closeConnections(); -// } catch (DataStoreException e) { -// throw new RuntimeException(e); -// } -// oldApplicationExitHandler.exitApplication(mainFrame); -// } -// }); - } - private void configureStyles(WorkbenchContext workbenchContext) { WorkbenchFrame frame = workbenchContext.getWorkbench().getFrame(); frame.addChoosableStyleClass(VertexXYLineSegmentStyle.VertexXY.class); Modified: core/trunk/src/org/openjump/core/ui/plugin/datastore/WritableDataStoreDataSource.java =================================================================== --- core/trunk/src/org/openjump/core/ui/plugin/datastore/WritableDataStoreDataSource.java 2015-12-26 22:05:59 UTC (rev 4677) +++ core/trunk/src/org/openjump/core/ui/plugin/datastore/WritableDataStoreDataSource.java 2015-12-26 22:12:58 UTC (rev 4678) @@ -1,41 +1,47 @@ package org.openjump.core.ui.plugin.datastore; +import static org.openjump.core.ui.plugin.datastore.postgis.PostGISQueryUtil.compose; +import static org.openjump.core.ui.plugin.datastore.postgis.PostGISQueryUtil.getGeometryDimension; + +import java.sql.DatabaseMetaData; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.sql.Timestamp; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Date; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.TreeMap; + +import javax.swing.JOptionPane; + +import org.apache.log4j.Logger; +import org.openjump.core.ui.plugin.datastore.postgis.PostGISConnectionUtil; +import org.openjump.core.ui.plugin.datastore.postgis.PostGISQueryUtil; +import org.openjump.core.ui.plugin.datastore.transaction.DataStoreTransactionManager; +import org.openjump.core.ui.plugin.datastore.transaction.Evolution; +import org.openjump.core.ui.plugin.datastore.transaction.EvolutionOperationException; + import com.vividsolutions.jts.geom.Geometry; import com.vividsolutions.jts.geom.GeometryFactory; import com.vividsolutions.jump.I18N; -import com.vividsolutions.jump.datastore.AdhocQuery; -import com.vividsolutions.jump.datastore.DataStoreConnection; -import com.vividsolutions.jump.datastore.DataStoreDriver; import com.vividsolutions.jump.datastore.postgis.PostgisDSConnection; -import com.vividsolutions.jump.datastore.postgis.PostgisDataStoreDriver; -import com.vividsolutions.jump.feature.*; -import com.vividsolutions.jump.io.FeatureInputStream; +import com.vividsolutions.jump.datastore.postgis.PostgisDSDriver; +import com.vividsolutions.jump.feature.AttributeType; +import com.vividsolutions.jump.feature.Feature; +import com.vividsolutions.jump.feature.FeatureCollection; +import com.vividsolutions.jump.feature.FeatureSchema; import com.vividsolutions.jump.io.datasource.Connection; -import com.vividsolutions.jump.io.datasource.DataSourceQuery; -import com.vividsolutions.jump.parameter.ParameterList; -import com.vividsolutions.jump.parameter.ParameterListSchema; import com.vividsolutions.jump.task.TaskMonitor; import com.vividsolutions.jump.util.CollectionUtil; import com.vividsolutions.jump.workbench.JUMPWorkbench; -import com.vividsolutions.jump.workbench.WorkbenchContext; import com.vividsolutions.jump.workbench.datastore.ConnectionDescriptor; -import com.vividsolutions.jump.workbench.datastore.ConnectionManager; import com.vividsolutions.jump.workbench.model.Layer; import com.vividsolutions.jump.workbench.ui.plugin.datastore.DataStoreDataSource; -import org.apache.log4j.Logger; -import org.openjump.core.ui.plugin.datastore.postgis.PostGISConnectionUtil; -import org.openjump.core.ui.plugin.datastore.postgis.PostGISQueryUtil; -import org.openjump.core.ui.plugin.datastore.transaction.DataStoreTransactionManager; -import org.openjump.core.ui.plugin.datastore.transaction.Evolution; -import org.openjump.core.ui.plugin.datastore.transaction.EvolutionOperationException; -import javax.swing.*; -import java.sql.*; -import java.util.*; -import java.util.Date; - -import static org.openjump.core.ui.plugin.datastore.postgis.PostGISQueryUtil.*; - /** * Extension of DataBaseDataSource adding write capabilities. */ @@ -191,7 +197,7 @@ (Integer)getProperties().get(GEOM_DIM_KEY); PostgisDSConnection pgConnection = - (PostgisDSConnection)new PostgisDataStoreDriver() + (PostgisDSConnection)new PostgisDSDriver() .createConnection(connectionDescriptor.getParameterList()); java.sql.Connection conn = pgConnection.getJdbcConnection(); try { Modified: core/trunk/src/org/openjump/core/ui/plugin/datastore/postgis/SaveToPostGISDataSource.java =================================================================== --- core/trunk/src/org/openjump/core/ui/plugin/datastore/postgis/SaveToPostGISDataSource.java 2015-12-26 22:05:59 UTC (rev 4677) +++ core/trunk/src/org/openjump/core/ui/plugin/datastore/postgis/SaveToPostGISDataSource.java 2015-12-26 22:12:58 UTC (rev 4678) @@ -3,7 +3,7 @@ import com.vividsolutions.jts.geom.Geometry; import com.vividsolutions.jump.I18N; import com.vividsolutions.jump.datastore.postgis.PostgisDSConnection; -import com.vividsolutions.jump.datastore.postgis.PostgisDataStoreDriver; +import com.vividsolutions.jump.datastore.postgis.PostgisDSDriver; import com.vividsolutions.jump.feature.AttributeType; import com.vividsolutions.jump.feature.Feature; import com.vividsolutions.jump.feature.FeatureCollection; @@ -149,7 +149,7 @@ int dim = getGeometryDimension(featureCollection, 3); PostgisDSConnection pgConnection = - (PostgisDSConnection)new PostgisDataStoreDriver() + (PostgisDSConnection)new PostgisDSDriver() .createConnection(connectionDescriptor.getParameterList()); java.sql.Connection conn = pgConnection.getJdbcConnection(); PostGISConnectionUtil connUtil = new PostGISConnectionUtil(conn); Modified: core/trunk/src/org/openjump/core/ui/plugin/datastore/postgis2/PostGISDataStoreDataSource.java =================================================================== --- core/trunk/src/org/openjump/core/ui/plugin/datastore/postgis2/PostGISDataStoreDataSource.java 2015-12-26 22:05:59 UTC (rev 4677) +++ core/trunk/src/org/openjump/core/ui/plugin/datastore/postgis2/PostGISDataStoreDataSource.java 2015-12-26 22:12:58 UTC (rev 4678) @@ -4,7 +4,7 @@ import com.vividsolutions.jump.datastore.AdhocQuery; import com.vividsolutions.jump.datastore.postgis.PostgisDSConnection; import com.vividsolutions.jump.datastore.postgis.PostgisDSMetadata; -import com.vividsolutions.jump.datastore.postgis.PostgisDataStoreDriver; +import com.vividsolutions.jump.datastore.postgis.PostgisDSDriver; import com.vividsolutions.jump.feature.Feature; import com.vividsolutions.jump.feature.FeatureCollection; import com.vividsolutions.jump.feature.FeatureDataset; @@ -66,7 +66,7 @@ (ConnectionDescriptor)getProperties().get(CONNECTION_DESCRIPTOR_KEY); PostgisDSConnection pgConnection = - (PostgisDSConnection)new PostgisDataStoreDriver() + (PostgisDSConnection)new PostgisDSDriver() .createConnection(connectionDescriptor.getParameterList()); boolean hasPK = getProperties().get(EXTERNAL_PK_KEY) != null; ------------------------------------------------------------------------------ _______________________________________________ Jump-pilot-devel mailing list Jump-pilot-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/jump-pilot-devel