/** * If transaction's succeeded then truncate the affected layers at the transaction affected * bounds * * @see org.geoserver.wfs.TransactionPlugin#afterTransaction */ public void afterTransaction(final TransactionType request, TransactionResponseType result, boolean committed) { if (!committed) { return; } try { afterTransactionInternal(request, committed); } catch (RuntimeException e) { // Do never make the transaction fail due to a GWC error. Yell on the logs though log.log(Level.WARNING, "Error trying to truncate the transaction affected area", e); } }
/** * 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); } }
private void afterTransactionInternal(final TransactionType transaction, boolean committed) { final Map<String, List<ReferencedEnvelope>> byLayerDirtyRegions = getByLayerDirtyRegions(transaction); if (byLayerDirtyRegions.isEmpty()) { return; } for (String tileLayerName : byLayerDirtyRegions.keySet()) { List<ReferencedEnvelope> dirtyList = byLayerDirtyRegions.get(tileLayerName); ReferencedEnvelope dirtyRegion; try { dirtyRegion = merge(tileLayerName, dirtyList); } catch (Exception e) { log.log(Level.WARNING, e.getMessage(), e); continue; } if (dirtyRegion == null) { continue; } try { gwc.truncate(tileLayerName, dirtyRegion); } catch (GeoWebCacheException e) { log.warning("Error truncating tile layer " + tileLayerName + " for transaction affected bounds " + dirtyRegion); } } }
private void addLayerDirtyRegion(final TransactionType transaction, final String tileLayerName, final ReferencedEnvelope affectedBounds) { Map<String, List<ReferencedEnvelope>> byLayerDirtyRegions = getByLayerDirtyRegions(transaction); List<ReferencedEnvelope> layerDirtyRegion = byLayerDirtyRegions.get(tileLayerName); if (layerDirtyRegion == null) { layerDirtyRegion = new ArrayList<ReferencedEnvelope>(2); byLayerDirtyRegions.put(tileLayerName, layerDirtyRegion); } layerDirtyRegion.add(affectedBounds); } }
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); } }
public void testNoInteractionsInUnusedMethods() { TransactionType request = mock(TransactionType.class); TransactionType returned = listener.beforeTransaction(request); assertSame(request, returned); verifyNoMoreInteractions(request, mediator); listener.beforeCommit(request); verifyNoMoreInteractions(request, mediator); }
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); }
public void testAfterTransactionUncommitted() { TransactionType request = mock(TransactionType.class); TransactionResponseType result = mock(TransactionResponseType.class); boolean committed = false; listener.afterTransaction(request, result, committed); verifyNoMoreInteractions(request, result, mediator); }
protected void setUp() throws Exception { mediator = mock(GWC.class); listener = new GWCTransactionListener(mediator); }
private void addLayerDirtyRegion( final TransactionRequest transaction, final String tileLayerName, final ReferencedEnvelope affectedBounds) { Map<String, List<ReferencedEnvelope>> byLayerDirtyRegions = getByLayerDirtyRegions(transaction); List<ReferencedEnvelope> layerDirtyRegion = byLayerDirtyRegions.get(tileLayerName); if (layerDirtyRegion == null) { layerDirtyRegion = new ArrayList<ReferencedEnvelope>(2); byLayerDirtyRegions.put(tileLayerName, layerDirtyRegion); } layerDirtyRegion.add(affectedBounds); } }
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 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); }
public void testAfterTransaction() throws Exception { Map<Object, Object> extendedProperties = new HashMap<Object, Object>(); ReferencedEnvelope affectedBounds1 = new ReferencedEnvelope(-180, 0, 0, 90, WGS84); ReferencedEnvelope affectedBounds2 = new ReferencedEnvelope(0, 180, 0, 90, WGS84); issueInsert(extendedProperties, affectedBounds1); issueInsert(extendedProperties, affectedBounds2); TransactionType request = mock(TransactionType.class); TransactionResponseType result = mock(TransactionResponseType.class); when(request.getExtendedProperties()).thenReturn(extendedProperties); when(mediator.getDeclaredCrs(anyString())).thenReturn(WGS84); listener.afterTransaction(request, result, true); ReferencedEnvelope expectedEnv = new ReferencedEnvelope(affectedBounds1); expectedEnv.expandToInclude(affectedBounds2); verify(mediator, times(1)).truncate(eq("theLayer"), eq(expectedEnv)); verify(mediator, times(1)).truncate(eq("theGroup"), eq(expectedEnv)); }
private void afterTransactionInternal(final TransactionRequest transaction, boolean committed) { final Map<String, List<ReferencedEnvelope>> byLayerDirtyRegions = getByLayerDirtyRegions(transaction); if (byLayerDirtyRegions.isEmpty()) { return; } for (String tileLayerName : byLayerDirtyRegions.keySet()) { List<ReferencedEnvelope> dirtyList = byLayerDirtyRegions.get(tileLayerName); ReferencedEnvelope dirtyRegion; try { dirtyRegion = merge(tileLayerName, dirtyList); } catch (Exception e) { log.log(Level.WARNING, e.getMessage(), e); continue; } if (dirtyRegion == null) { continue; } try { gwc.truncate(tileLayerName, dirtyRegion); } catch (GeoWebCacheException e) { log.warning( "Error truncating tile layer " + tileLayerName + " for transaction affected bounds " + dirtyRegion); } } }
/** * 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); } }
/** * If transaction's succeeded then truncate the affected layers at the transaction affected * bounds * * @see org.geoserver.wfs.TransactionPlugin#afterTransaction */ public void afterTransaction( final TransactionRequest request, TransactionResponse result, boolean committed) { if (!committed) { return; } try { afterTransactionInternal(request, committed); } catch (RuntimeException e) { // Do never make the transaction fail due to a GWC error. Yell on the logs though log.log(Level.WARNING, "Error trying to truncate the transaction affected area", e); } }
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"); } }
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); }
when(event.getAffectedFeatures()).thenReturn(affectedFeatures); listener.dataStoreChange(event);