001: package com.vividsolutions.jump.workbench.ui.plugin.datastore;
002:
003: import java.util.ArrayList;
004: import java.util.Collection;
005:
006: import com.vividsolutions.jump.datastore.FilterQuery;
007: import com.vividsolutions.jump.feature.FeatureCollection;
008: import com.vividsolutions.jump.io.datasource.Connection;
009: import com.vividsolutions.jump.io.datasource.DataSource;
010: import com.vividsolutions.jump.task.TaskMonitor;
011: import com.vividsolutions.jump.util.CollectionUtil;
012: import com.vividsolutions.jump.util.LangUtil;
013: import com.vividsolutions.jump.workbench.WorkbenchContext;
014: import com.vividsolutions.jump.workbench.datastore.ConnectionDescriptor;
015: import com.vividsolutions.jump.workbench.datastore.ConnectionManager;
016: import com.vividsolutions.jump.workbench.model.cache.CachingFeatureCollection;
017: import com.vividsolutions.jump.workbench.model.cache.DynamicFeatureCollection;
018: import com.vividsolutions.jump.workbench.ui.plugin.WorkbenchContextReference;
019:
020: /**
021: * Adapts the DataStore API to the DataSource API.
022: */
023: public class DataStoreDataSource extends DataSource implements
024: WorkbenchContextReference {
025:
026: public static final String DATASET_NAME_KEY = "Dataset Name";
027:
028: public static final String GEOMETRY_ATTRIBUTE_NAME_KEY = "Geometry Attribute Name";
029:
030: public static final String WHERE_CLAUSE_KEY = "Where Clause";
031:
032: public static final String CACHING_KEY = "Caching";
033:
034: public static final String CONNECTION_DESCRIPTOR_KEY = "Connection Descriptor";
035:
036: private WorkbenchContext context;
037:
038: public DataStoreDataSource() {
039: // Called by Java2XML [Jon Aquino 2005-03-16]
040: }
041:
042: public DataStoreDataSource(String datasetName,
043: String geometryAttributeName, String whereClause,
044: ConnectionDescriptor connectionDescriptor, boolean caching,
045: WorkbenchContext context) {
046: setProperties(CollectionUtil.createMap(new Object[] {
047: DATASET_NAME_KEY, datasetName,
048: GEOMETRY_ATTRIBUTE_NAME_KEY, geometryAttributeName,
049: WHERE_CLAUSE_KEY, whereClause,
050: CONNECTION_DESCRIPTOR_KEY, connectionDescriptor,
051: CACHING_KEY, Boolean.valueOf(caching) }));
052: setWorkbenchContext(context);
053: }
054:
055: public boolean isWritable() {
056: return false;
057: }
058:
059: public Connection getConnection() {
060: return new Connection() {
061: public FeatureCollection executeQuery(String query,
062: Collection exceptions, TaskMonitor monitor) {
063: try {
064: return createFeatureCollection();
065: } catch (Exception e) {
066: exceptions.add(e);
067: return null;
068: }
069: }
070:
071: public FeatureCollection executeQuery(String query,
072: TaskMonitor monitor) throws Exception {
073: Collection exceptions = new ArrayList();
074: FeatureCollection featureCollection = executeQuery(
075: query, exceptions, monitor);
076: if (!exceptions.isEmpty()) {
077: throw (Exception) exceptions.iterator().next();
078: }
079: return featureCollection;
080: }
081:
082: public void executeUpdate(String query,
083: FeatureCollection featureCollection,
084: TaskMonitor monitor) throws Exception {
085: throw new UnsupportedOperationException();
086: }
087:
088: public void close() {
089: // Do nothing, because DataStore connections are always
090: // open (managed by the ConnectionManager). [Jon Aquino
091: // 2005-03-16]
092: }
093: };
094: }
095:
096: private FeatureCollection createFeatureCollection() {
097: FilterQuery query = new FilterQuery();
098: query.setDatasetName((String) getProperties().get(
099: DATASET_NAME_KEY));
100: query.setGeometryAttributeName((String) getProperties().get(
101: GEOMETRY_ATTRIBUTE_NAME_KEY));
102: if (((String) getProperties().get(WHERE_CLAUSE_KEY)).length() > 0) {
103: query.setCondition((String) getProperties().get(
104: WHERE_CLAUSE_KEY));
105: }
106: return new CachingFeatureCollection(
107: new DynamicFeatureCollection(
108: (ConnectionDescriptor) getProperties().get(
109: CONNECTION_DESCRIPTOR_KEY),
110: ConnectionManager.instance(context), query))
111: .setCachingByEnvelope(((Boolean) LangUtil.ifNull(
112: getProperties().get(CACHING_KEY), Boolean.TRUE))
113: .booleanValue());
114: }
115:
116: public void setWorkbenchContext(WorkbenchContext context) {
117: this .context = context;
118: try {
119: // This method is called by OpenProjectPlugIn in the
120: // GUI thread, so now is a good time to prompt for
121: // a password if necessary. [Jon Aquino 2005-03-16]
122: new PasswordPrompter().getOpenConnection(ConnectionManager
123: .instance(context),
124: (ConnectionDescriptor) getProperties().get(
125: CONNECTION_DESCRIPTOR_KEY), context
126: .getWorkbench().getFrame());
127: } catch (Exception e) {
128: throw new RuntimeException(e);
129: }
130: }
131:
132: }
|