private void dataStoreChangeInternal(final TransactionEvent event) { final Object source = event.getSource(); if (!(source instanceof InsertElementType || source instanceof UpdateElementType || source instanceof DeleteElementType)) { return; } final EObject originatingTransactionRequest = (EObject) source; checkNotNull(originatingTransactionRequest, "No original transaction request exists"); final TransactionEventType type = event.getType(); if (TransactionEventType.POST_INSERT.equals(type)) { // no need to compute the bounds, they're the same than for PRE_INSERT return; } final QName featureTypeName = event.getLayerName(); final Set<String> affectedTileLayers = gwc.getTileLayersByFeatureType( featureTypeName.getNamespaceURI(), featureTypeName.getLocalPart()); if (affectedTileLayers.isEmpty()) { // event didn't touch a cached layer return; } final SimpleFeatureCollection affectedFeatures = event.getAffectedFeatures(); final ReferencedEnvelope affectedBounds = affectedFeatures.getBounds(); final TransactionType transaction = event.getRequest(); for (String tileLayerName : affectedTileLayers) { addLayerDirtyRegion(transaction, tileLayerName, affectedBounds); } }
/** * Collects the per TileLayer affected bounds * * @see org.geoserver.wfs.TransactionListener#dataStoreChange(org.geoserver.wfs.TransactionEvent) */ public void dataStoreChange(final TransactionEvent event) throws WFSException { log.info("DataStoreChange: " + event.getLayerName() + " " + event.getType()); try { dataStoreChangeInternal(event); } catch (RuntimeException e) { // Do never make the transaction fail due to a GWC error. Yell on the logs though log.log(Level.WARNING, "Error pre computing the transaction's affected area", e); } }
public void testDataStoreChangeOfNoInterest() { TransactionEvent event = mock(TransactionEvent.class); when(event.getSource()).thenReturn(new Object()); listener.dataStoreChange(event); verify(event, times(1)).getLayerName(); verify(event, times(1)).getType(); verify(event, times(1)).getSource(); verifyNoMoreInteractions(event, mediator); }
@Override public void dataStoreChange(TransactionEvent event) throws WFSException { TransactionEventType eventType = event.getType(); Integer affectedFeatures = event.getAffectedFeatures().size(); FeatureType featureType = event.getAffectedFeatures().getSchema(); ReferencedEnvelope featureBound = event.getAffectedFeatures().getBounds(); FeatureTypeInfo fti = this.catalog.getFeatureTypeByName(featureType.getName()); CatalogInfo info = ModificationProxy.unwrap(fti);
public void dataStoreChange(TransactionEvent event) throws WFSException { events.add(event); features.addAll(DataUtilities.list(event.getAffectedFeatures())); } }
new TransactionEvent( TransactionEventType.PRE_INSERT, request, elementName, collection); event.setSource(Insert.WFS11.unadapt(insert)); store.getFeatures(filterFactory.id(new HashSet<FeatureId>(fids))); event = new TransactionEvent( TransactionEventType.POST_INSERT, request,
public void testDataStoreChangeDoesNotPropagateExceptions() { TransactionEvent event = mock(TransactionEvent.class); when(event.getSource()).thenThrow(new RuntimeException("fake")); try { listener.dataStoreChange(event); } catch (RuntimeException e) { fail("Exception should have been eaten to prevent the transaction from failing due to a gwc integration error"); } }
listener.dataStoreChange(new TransactionEvent(TransactionEventType.PRE_UPDATE, layerName, vstore.getFeatures(updatedFilter))); listener.dataStoreChange(new TransactionEvent(TransactionEventType.PRE_DELETE, layerName, vstore.getFeatures(deletedFilter))); listener.dataStoreChange(new TransactionEvent(TransactionEventType.POST_INSERT, layerName, vstore.getFeatures(insertedFilter))); listener.dataStoreChange(new TransactionEvent(TransactionEventType.POST_UPDATE, layerName, vstore.getFeatures(updatedFilter)));
public void testDataStoreChangePostInsert() { InsertElementType insert = mock(InsertElementType.class); TransactionEvent event = mock(TransactionEvent.class); QName layerName = new QName("testType"); when(event.getLayerName()).thenReturn(layerName); when(event.getSource()).thenReturn(insert); when(event.getType()).thenReturn(TransactionEventType.POST_INSERT); listener.dataStoreChange(event); // no need to do anything at post insert, bounds computed at pre_insert verifyNoMoreInteractions(mediator); }
/** * Collects the per TileLayer affected bounds * * @see * org.geoserver.wfs.TransactionListener#dataStoreChange(org.geoserver.wfs.TransactionEvent) */ public void dataStoreChange(final TransactionEvent event) throws WFSException { log.info("DataStoreChange: " + event.getLayerName() + " " + event.getType()); try { dataStoreChangeInternal(event); } catch (RuntimeException e) { // Do never make the transaction fail due to a GWC error. Yell on the logs though log.log(Level.WARNING, "Error pre computing the transaction's affected area", e); } }
new TransactionEvent( TransactionEventType.PRE_UPDATE, request, elementName, features); event.setSource(Update.WFS11.unadapt(update)); new TransactionEvent( TransactionEventType.POST_UPDATE, request,
new TransactionEvent( TransactionEventType.PRE_INSERT, TransactionRequest.adapt(t), inserted); TransactionEvent e2 = new TransactionEvent( TransactionEventType.PRE_UPDATE, TransactionRequest.adapt(t), updated); TransactionEvent e3 = new TransactionEvent( TransactionEventType.PRE_DELETE, TransactionRequest.adapt(t),
private void dataStoreChangeInternal(final TransactionEvent event) { final Object source = event.getSource(); if (!(source instanceof InsertElementType || source instanceof UpdateElementType || source instanceof DeleteElementType)) { return; } final EObject originatingTransactionRequest = (EObject) source; checkNotNull(originatingTransactionRequest, "No original transaction request exists"); final TransactionEventType type = event.getType(); if (TransactionEventType.POST_INSERT.equals(type)) { // no need to compute the bounds, they're the same than for PRE_INSERT return; } final QName featureTypeName = event.getLayerName(); final Set<String> affectedTileLayers = gwc.getTileLayersByFeatureType( featureTypeName.getNamespaceURI(), featureTypeName.getLocalPart()); if (affectedTileLayers.isEmpty()) { // event didn't touch a cached layer return; } final SimpleFeatureCollection affectedFeatures = event.getAffectedFeatures(); final ReferencedEnvelope affectedBounds = affectedFeatures.getBounds(); final TransactionType transaction = event.getRequest(); TransactionRequest request = TransactionRequest.adapt(transaction); for (String tileLayerName : affectedTileLayers) { addLayerDirtyRegion(request, tileLayerName, affectedBounds); } }
public void testDataStoreChangeDoesNotAffectTileLayer() { InsertElementType insert = mock(InsertElementType.class); TransactionEvent event = mock(TransactionEvent.class); QName layerName = new QName("testType"); when(event.getLayerName()).thenReturn(layerName); when(event.getSource()).thenReturn(insert); when(event.getType()).thenReturn(TransactionEventType.PRE_INSERT); when( mediator.getTileLayersByFeatureType(eq(layerName.getNamespaceURI()), eq(layerName.getLocalPart()))).thenReturn(Collections.EMPTY_SET); listener.dataStoreChange(event); // nothing else to do verify(mediator, times(1)).getTileLayersByFeatureType(eq(layerName.getNamespaceURI()), eq(layerName.getLocalPart())); verifyNoMoreInteractions(mediator); }
new TransactionEvent( TransactionEventType.PRE_DELETE, request, elementName, store.getFeatures(filter)); event.setSource(Delete.WFS11.unadapt((Delete) delete)); listener.dataStoreChange(event);
when(event.getRequest()).thenReturn(transaction); when(event.getLayerName()).thenReturn(layerName); when(event.getSource()).thenReturn(insert); when(event.getType()).thenReturn(TransactionEventType.PRE_INSERT); when(event.getAffectedFeatures()).thenReturn(affectedFeatures);
@Test public void testDelete() throws Exception { // perform a delete String delete = "<wfs:Transaction service=\"WFS\" version=\"1.0.0\" " + "xmlns:cgf=\"http://www.opengis.net/cite/geometry\" " + "xmlns:ogc=\"http://www.opengis.net/ogc\" " + "xmlns:wfs=\"http://www.opengis.net/wfs\"> " + "<wfs:Delete typeName=\"cgf:Points\"> " + "<ogc:Filter> " + "<ogc:PropertyIsEqualTo> " + "<ogc:PropertyName>cgf:id</ogc:PropertyName> " + "<ogc:Literal>t0000</ogc:Literal> " + "</ogc:PropertyIsEqualTo> " + "</ogc:Filter> " + "</wfs:Delete> " + "</wfs:Transaction>"; postAsDOM("wfs", delete); assertEquals(1, listener.events.size()); TransactionEvent event = (TransactionEvent) listener.events.get(0); assertTrue(event.getSource() instanceof DeleteElementType); assertEquals(TransactionEventType.PRE_DELETE, event.getType()); assertEquals(CiteTestData.POINTS, event.getLayerName()); assertEquals(1, listener.features.size()); Feature deleted = (Feature) listener.features.get(0); assertEquals("t0000", deleted.getProperty("id").getValue()); }
assertEquals(2, listener.events.size()); TransactionEvent firstEvent = (TransactionEvent) listener.events.get(0); assertTrue(firstEvent.getSource() instanceof UpdateElementType); assertEquals(TransactionEventType.PRE_UPDATE, firstEvent.getType()); assertEquals(CiteTestData.POLYGONS, firstEvent.getLayerName()); Feature updatedBefore = (Feature) listener.features.get(0); assertEquals("t0002", updatedBefore.getProperty("id").getValue()); assertTrue(secondEvent.getSource() instanceof UpdateElementType); assertEquals(TransactionEventType.POST_UPDATE, secondEvent.getType()); assertEquals(CiteTestData.POLYGONS, secondEvent.getLayerName()); Feature updatedAfter = (Feature) listener.features.get(1); assertEquals("t0003", updatedAfter.getProperty("id").getValue());
assertTrue(firstEvent.getSource() instanceof InsertElementType); assertEquals(TransactionEventType.PRE_INSERT, firstEvent.getType()); assertEquals(CiteTestData.LINES, firstEvent.getLayerName()); assertTrue(secondEvent.getSource() instanceof InsertElementType); assertEquals(TransactionEventType.POST_INSERT, secondEvent.getType()); Feature inserted = (Feature) listener.features.get(1); assertEquals(fid, inserted.getIdentifier().getID());