package com.vividsolutions.jump.workbench.ui.plugin.datastore; import com.vividsolutions.jts.geom.GeometryFactory; import com.vividsolutions.jts.geom.Geometry; import com.vividsolutions.jump.I18N; import com.vividsolutions.jump.datastore.AdhocQuery; import com.vividsolutions.jump.feature.FeatureDataset; import com.vividsolutions.jump.io.FeatureInputStream; import com.vividsolutions.jump.task.TaskMonitor; import com.vividsolutions.jump.util.LangUtil; import com.vividsolutions.jump.workbench.datastore.ConnectionManager; import com.vividsolutions.jump.workbench.model.Layer; import com.vividsolutions.jump.workbench.model.Layerable; import com.vividsolutions.jump.workbench.plugin.PlugInContext; import com.vividsolutions.jump.workbench.ui.MenuNames; /** * This PlugIn runs a SQL query against a datastore and creates a Layer * from the result. */ public class RunDatastoreQueryPlugIn extends AbstractAddDatastoreLayerPlugIn { protected ConnectionPanel createPanel( PlugInContext context ) { return new RunDatastoreQueryPanel( context.getWorkbenchContext() ); } public void initialize(final PlugInContext context) throws Exception { super.initialize(context); context.getFeatureInstaller() .addMainMenuItem(new String[]{MenuNames.FILE},this,3); } protected Layerable createLayerable( ConnectionPanel panel, TaskMonitor monitor, PlugInContext context ) throws Exception { return createLayer( ( RunDatastoreQueryPanel ) panel, monitor, context ); } public String getName(){ return I18N.get("jump.workbench.ui.plugin.datastore.RunDatastoreQueryPlugIn.Run-Datastore-Query"); } private Layer createLayer( final RunDatastoreQueryPanel panel, TaskMonitor monitor, final PlugInContext context ) throws Exception { panel.saveQuery(); monitor.allowCancellationRequests(); monitor.report( I18N.get("jump.workbench.ui.plugin.datastore.AddDatastoreLayerPlugIn.Creating-layer") ); //int maxFeatures = ((Integer)LangUtil.ifNull( panel.getMaxFeatures(), // new Integer(Integer.MAX_VALUE))).intValue(); // added by Michael Michaud on 2009-11-22 to use aliases representing // view rectangle or selection in a query String driver = panel.getConnectionDescriptor().getDataStoreDriverClassName(); String query = panel.getQuery(); if (driver.contains("Postgis") && query.matches("(?s).*\\$\\{[^\\{\\}]*\\}.*")) { query = expandQuery(query, context); } // end FeatureInputStream featureInputStream = ConnectionManager.instance(context.getWorkbenchContext()) .getOpenConnection(panel.getConnectionDescriptor()) .execute(new AdhocQuery(query)); try { FeatureDataset featureDataset = new FeatureDataset( featureInputStream.getFeatureSchema()); int i = 0; while (featureInputStream.hasNext() && !monitor.isCancelRequested()) { featureDataset.add(featureInputStream.next()); monitor.report( ++i, -1, I18N.get("jump.workbench.ui.plugin.datastore.RunDatastoreQueryPlugIn.features")); } String name = panel.getLayerName(); Layer layer = new Layer(name, context.getLayerManager().generateLayerFillColor(), featureDataset, context.getLayerManager()); layer.setDataSourceQuery(new com.vividsolutions.jump.io.datasource.DataSourceQuery( new DataStoreQueryDataSource(name, panel.getQuery(), panel.getConnectionDescriptor(), context.getWorkbenchContext()), panel.getQuery(), name)); return layer; } finally { // This code had been added as an attempt to cancel a long running query // but it has a side effect on the connection which is closed // This peace of code is removed until a better solution is found //if (featureInputStream instanceof com.vividsolutions.jump.datastore.postgis.PostgisFeatureInputStream) { // java.sql.Statement stmt = // ((com.vividsolutions.jump.datastore.postgis.PostgisFeatureInputStream)featureInputStream).getStatement(); // if (stmt != null) stmt.cancel(); //} featureInputStream.close(); } } private String expandQuery(String query, PlugInContext context) { GeometryFactory gf = new GeometryFactory(); Geometry viewG = gf.toGeometry(context.getLayerViewPanel().getViewport().getEnvelopeInModelCoordinates()); Geometry fenceG = context.getLayerViewPanel().getFence(); if (viewG != null) { query = query.replaceAll("\\$\\{view\\}", "\\${view:-1}"); query = query.replaceAll("\\$\\{view(?::(-?[0-9]+))\\}", "ST_GeomFromText('" + viewG.toText() + "',$1)"); } if (fenceG != null) { query = query.replaceAll("\\$\\{fence\\}", "\\${fence:-1}"); query = query.replaceAll("\\$\\{fence(?::(-?[0-9]+))\\}", "ST_GeomFromText('" + fenceG.toText() + "',$1)"); } return query; } }