Project

General

Profile

« Previous | Next » 

Revision 3200

Added by Jing Tao over 17 years ago

Change the shape file store object to be static and make them synchronized in order to be thread safe.

View differences:

src/edu/ucsb/nceas/metacat/spatial/SpatialDataset.java
53 53
 */
54 54
public class SpatialDataset {
55 55

  
56
  SpatialFeatureSchema featureSchema = new SpatialFeatureSchema();
57

  
56
  private static SpatialFeatureSchema featureSchema = new SpatialFeatureSchema();
57
  private static ShapefileDataStore polygonStore = null;
58
  private static ShapefileDataStore pointStore = null;
59
  private static FeatureStore featureStore = null;
60
 
61
  
58 62
  //public String polygonShpUri = MetaCatUtil.getOption("certPath") + "data/metacat_shps/data_bounds.shp";
59 63
  //public String pointShpUri = MetaCatUtil.getOption("certPath")+ "data/metacat_shps/data_points.shp";
60 64

  
......
67 71
  /**
68 72
   *  empty constructor for SpatialDataset
69 73
   */
70
  public SpatialDataset() {
74
  public SpatialDataset() throws IOException {
75
	  
76
	  polygonStore = new ShapefileDataStore( (new File( featureSchema.polygonShpUri)).toURL() );
77
	  pointStore = new ShapefileDataStore( (new File( featureSchema.pointShpUri)).toURL() );
71 78
    
72 79
  }
73 80

  
......
114 121
        filter.addRightValue(filterFactory.createLiteralExpression(docid));
115 122
    } catch (IllegalFilterException e) {
116 123
        e.printStackTrace();
124
        throw new IOException(e.getMessage());
117 125
    }
118 126

  
119
    // Begin new transaction
120
    Transaction t = new DefaultTransaction("handle");
121
    t.putProperty( "updating spatial cache", new Integer(7) );
122
    String lockId = "SpatialDataset.delete";
127
    if( geomType.equals("polygon") ) {
128
    	deleteFromDataStore(polygonStore, filter, docid);
129
     }else if( geomType.equals("point") ) {
130
    	 deleteFromDataStore(pointStore, filter, docid);    
131
     }
132
     else
133
     {
134
    	 throw new IOException("Unkown Geo Type "+geomType);
135
     }
136

  
123 137
    
124
    try {
125
        
126
        boolean validGeomType = false;
127 138

  
128
        if( geomType.equals("polygon") ) {
129
            dStore = new ShapefileDataStore( (new File( featureSchema.polygonShpUri )).toURL() );
130
            fStore = (FeatureStore) dStore.getFeatureSource(dStore.getTypeNames()[0]);
131
            validGeomType = true;
132
        } else if( geomType.equals("point") ) {
133
            dStore = new ShapefileDataStore( (new File( featureSchema.pointShpUri )).toURL() );
134
            fStore = (FeatureStore) dStore.getFeatureSource(dStore.getTypeNames()[0]);
135
            validGeomType = true;
136
        }
137

  
138
        // Initiate the transaction
139
        fStore.setTransaction( t );
140
        t.addAuthorization( lockId );
141
        
142
        if( validGeomType == true) {
143
            // Remove old feature
144
            fStore.removeFeatures( filter );
145

  
146
            // Commit changes to shapefile
147
            t.commit();
148
            log.info(" Delete docid " + docid + " from spatial cache");
149
        }
150

  
151
    } catch (MalformedURLException e) {
152
        e.printStackTrace();
153
        t.rollback(); // cancel opperations
154
    } catch (IOException e) {
155
        e.printStackTrace();
156
        t.rollback(); // cancel opperations
157
    } finally {
158
        // Close out the transaction
159
        t.close();
160
    }
161

  
162 139
  }
140
  
141
  /*
142
   * Delete a feature from given spatail data store
143
   */
144
  private void deleteFromDataStore(ShapefileDataStore dStore, CompareFilter filter, String docid) 
145
                                     throws IOException
146
  {
147
	  if (dStore != null && filter != null)
148
	  {
149
		  synchronized(dStore)
150
		  {
151
			  // Begin new transaction
152
			    Transaction t = new DefaultTransaction("handle");
153
			    t.putProperty( "updating spatial cache", new Integer(7) );
154
			    String lockId = "SpatialDataset.delete";
155
			    FeatureStore fStore = (FeatureStore) dStore.getFeatureSource(dStore.getTypeNames()[0]);
156
			    try {
157
			        
158
			    	if (fStore != null)
159
			    	{
160
				        // Initiate the transaction
161
				        fStore.setTransaction( t );
162
				        t.addAuthorization( lockId );
163
				        
164
				        // Remove old feature
165
				        fStore.removeFeatures( filter );
166
		
167
				        // Commit changes to shapefile
168
				        t.commit();
169
				        log.info(" Delete docid " + docid + " from spatial cache");
170
			    	}
171
			    	else
172
			    	{
173
			    		log.error("Feature store is null");
174
			    	}
175
			       
176
	
177
			    } catch (MalformedURLException e) {
178
			        e.printStackTrace();
179
			        t.rollback(); // cancel opperations
180
			    } catch (IOException e) {
181
			        e.printStackTrace();
182
			        t.rollback(); // cancel opperations
183
			    } finally {
184
			        // Close out the transaction
185
			        t.close();
186
			    }
187
		  }
188
	  }
189
	  else if (dStore == null)
190
	  {
191
		  log.error("Shape file store is null");
192
	  }
193
  }
194
  
195
  
163 196

  
164 197
  /**
165 198
   * Either inserts or updates the spatial cache with the new
......
189 222
        filter.addRightValue(filterFactory.createLiteralExpression(docid));
190 223
    } catch (IllegalFilterException e) {
191 224
        e.printStackTrace();
225
        throw new IOException(e.getMessage());
192 226
    }
193 227

  
194
    // Begin new transaction
195
    Transaction t = new DefaultTransaction("handle");
196
    t.putProperty( "updating spatial cache", new Integer(7) );
197
    String lockId = "SpatialDataset.insertOrUpdate";
228
    if( geomType.equals("polygon") ) {
229
            
230
        insertOrUpdateDataStore(polygonStore,filter, feature, fColl, docid);
231
    } else if( geomType.equals("point") ) {
232
    	insertOrUpdateDataStore(pointStore,filter, feature, fColl, docid);
233
    }else{
234
   	    throw new IOException("Unkown Geo Type "+geomType);
235
    }
198 236
    
199
    try {
200
        
201
        boolean validGeomType = false;
202 237

  
203
        if( geomType.equals("polygon") ) {
204
            dStore = new ShapefileDataStore( (new File( featureSchema.polygonShpUri )).toURL() );
205
            fStore = (FeatureStore) dStore.getFeatureSource(dStore.getTypeNames()[0]);
206
            validGeomType = true;
207
        } else if( geomType.equals("point") ) {
208
            dStore = new ShapefileDataStore( (new File( featureSchema.pointShpUri )).toURL() );
209
            fStore = (FeatureStore) dStore.getFeatureSource(dStore.getTypeNames()[0]);
210
            validGeomType = true;
211
        }
238
       
212 239

  
213
        // Initiate the transaction
214
        fStore.setTransaction( t );
215
        t.addAuthorization( lockId );
216
        
217
        if( feature != null && validGeomType == true) {
218
            // Remove old feature
219
            fStore.removeFeatures( filter );
220 240

  
221
            // Create new feature collection then add it to feature Store
222
            fColl.add( feature );
223
            fStore.addFeatures(fColl);
241
  }
242
  
243
  /*
244
   * Insert or update new feature in shape file
245
   */
246
  private void insertOrUpdateDataStore(ShapefileDataStore dStore, CompareFilter filter, Feature feature, 
247
		                                FeatureCollection fColl, String docid) throws IOException
248
  {
249
	  if (dStore != null && filter != null && feature != null && fColl != null)
250
	  {
251
		  synchronized(dStore)
252
		  {
253
//			 Begin new transaction
254
			    Transaction t = new DefaultTransaction("handle");
255
			    t.putProperty( "updating spatial cache", new Integer(7) );
256
			    String lockId = "SpatialDataset.insertOrUpdate";
257
			    
258
			    try {
259
			    	FeatureStore fStore = (FeatureStore) dStore.getFeatureSource(dStore.getTypeNames()[0]);
260
			        if( fStore != null) {
261
			        	// Initiate the transaction
262
				        fStore.setTransaction( t );
263
				        t.addAuthorization( lockId );
264
			            // Remove old feature
265
			            fStore.removeFeatures( filter );
224 266

  
225
            // Commit changes to shapefile
226
            t.commit();
227
            log.info(" Insert or Update docid " + docid + " from spatial cache");
228
        }
267
			            // Create new feature collection then add it to feature Store
268
			            fColl.add( feature );
269
			            fStore.addFeatures(fColl);
229 270

  
271
			            // Commit changes to shapefile
272
			            t.commit();
273
			            log.info(" Insert or Update docid " + docid + " from spatial cache");
274
			        }
275
			        else
276
			    	{
277
			    		log.error("Feature store is null");
278
			    	}
230 279

  
231
    } catch (MalformedURLException e) {
232
        e.printStackTrace();
233
        t.rollback(); // cancel opperations
234
    } catch (IOException e) {
235
        e.printStackTrace();
236
        t.rollback(); // cancel opperations
237
    } finally {
238
        // Close out the transaction
239
        t.close();
240
    }
241 280

  
281
			    } catch (MalformedURLException e) {
282
			        e.printStackTrace();
283
			        t.rollback(); // cancel opperations
284
			    } catch (IOException e) {
285
			        e.printStackTrace();
286
			        t.rollback(); // cancel opperations
287
			    } finally {
288
			        // Close out the transaction
289
			        t.close();
290
			    }
242 291

  
292
		  }
293
	  }
294
	  else if (dStore == null)
295
	  {
296
		  log.error("Shape file store is null");
297
	  }
243 298
  }
244 299

  
245 300
  /**
......
248 303
  public void save() {
249 304
         // Save Polygons 
250 305
         try {
251
             URL anURL = (new File( featureSchema.polygonShpUri )).toURL();
252
             ShapefileDataStore polygonDatastore = new ShapefileDataStore(anURL);
253
             FeatureType polygonType = featureSchema.getPolygonFeatureType();
254
             polygonDatastore.createSchema( polygonType );
255
             FeatureStore polygonFeatureStore = (FeatureStore) polygonDatastore.getFeatureSource( polygonType.getTypeName() );
256
             polygonFeatureStore.addFeatures( polygonCollection );
257
             log.info(" ---- Polygons saved to " + featureSchema.polygonShpUri );
306
             //URL anURL = (new File( featureSchema.polygonShpUri )).toURL();
307
             //ShapefileDataStore polygonDatastore = new ShapefileDataStore(anURL);
308
        	 if (polygonStore != null)
309
        	 {	 
310
        		 
311
	        	 synchronized(polygonStore)
312
	        	 {
313
		             FeatureType polygonType = featureSchema.getPolygonFeatureType();
314
		             polygonStore.createSchema( polygonType );
315
		             FeatureStore polygonFeatureStore = (FeatureStore) polygonStore.getFeatureSource( polygonType.getTypeName() );
316
		             polygonFeatureStore.addFeatures( polygonCollection );
317
		             log.info(" ---- Polygons saved to " + featureSchema.polygonShpUri );
318
	        	 }
319
        	 }
320
        	 else
321
        	 {
322
        		log.error("Couldn't find the polygon shape file store"); 
323
        	 }
258 324
         } catch(java.net.MalformedURLException e) {
259 325
             log.error("Malformed URL Exception : "+e);
260 326
         } catch(java.io.IOException e) {
......
264 330

  
265 331
         // Save Points
266 332
         try {
267
             URL anURL = (new File( featureSchema.pointShpUri )).toURL();
268
             ShapefileDataStore pointDatastore = new ShapefileDataStore(anURL);
269
             FeatureType pointsType = featureSchema.getPointFeatureType();
270
             pointDatastore.createSchema( pointsType );
271
             FeatureStore pointFeatureStore = (FeatureStore) pointDatastore.getFeatureSource( pointsType.getTypeName() );
272
             pointFeatureStore.addFeatures( pointCollection );
273
             log.info(" ---- Polygons saved to " + featureSchema.pointShpUri );
333
             //URL anURL = (new File( featureSchema.pointShpUri )).toURL();
334
             //ShapefileDataStore pointDatastore = new ShapefileDataStore(anURL);
335
        	 if (pointStore != null)
336
        	 {
337
	        	 synchronized(pointStore)
338
	        	 {
339
		             FeatureType pointsType = featureSchema.getPointFeatureType();
340
		             pointStore.createSchema( pointsType );
341
		             FeatureStore pointFeatureStore = (FeatureStore) pointStore.getFeatureSource( pointsType.getTypeName() );
342
		             pointFeatureStore.addFeatures( pointCollection );
343
		             log.info(" ---- Polygons saved to " + featureSchema.pointShpUri );
344
	        	 }
345
        	 }
346
        	 else
347
        	 {
348
        		 log.error("Couldn't find the shape point file store");
349
        	 }
274 350
         } catch(java.net.MalformedURLException e) {
275 351
             log.error("Malformed URL Exception : "+e);
276 352
         } catch(java.io.IOException e) {
277 353
             log.error("IO Exception : "+e);
278 354
         }
279 355
  }
356
  
357
 
280 358

  
281 359
}

Also available in: Unified diff