package org.geoserver.catalog.impl; import java.util.List; import org.geoserver.catalog.CascadeRemovalReporter; import org.geoserver.catalog.Catalog; import org.geoserver.catalog.CatalogBuilder; import org.geoserver.catalog.FeatureTypeInfo; import org.geoserver.catalog.LayerGroupInfo; import org.geoserver.catalog.LayerInfo; import org.geoserver.catalog.ResourceInfo; import org.geoserver.catalog.StoreInfo; import org.geoserver.catalog.StyleInfo; import org.geoserver.catalog.WorkspaceInfo; import org.geoserver.catalog.CascadeRemovalReporter.ModificationType; import org.geoserver.data.test.MockData; import org.geoserver.test.GeoServerTestSupport; import org.geotools.geometry.jts.ReferencedEnvelope; import org.geotools.referencing.crs.DefaultGeographicCRS; public class CascadeRemovalReporterTest extends GeoServerTestSupport { static final String LAKES_GROUP = "lakesGroup"; CascadeRemovalReporter visitor; Catalog catalog; @Override protected void setUpInternal() throws Exception { super.setUpInternal(); catalog = getCatalog(); visitor = new CascadeRemovalReporter(catalog); // setup a group, see GEOS-3040 Catalog catalog = getCatalog(); String lakes = MockData.LAKES.getLocalPart(); String forests = MockData.FORESTS.getLocalPart(); String bridges = MockData.BRIDGES.getLocalPart(); setNativeBox(catalog, lakes); setNativeBox(catalog, forests); setNativeBox(catalog, bridges); LayerGroupInfo lg = catalog.getFactory().createLayerGroup(); lg.setName(LAKES_GROUP); lg.getLayers().add(catalog.getLayerByName(lakes)); lg.getStyles().add(catalog.getStyleByName(lakes)); lg.getLayers().add(catalog.getLayerByName(forests)); lg.getStyles().add(catalog.getStyleByName(forests)); lg.getLayers().add(catalog.getLayerByName(bridges)); lg.getStyles().add(catalog.getStyleByName(bridges)); CatalogBuilder builder = new CatalogBuilder(catalog); builder.calculateLayerGroupBounds(lg); catalog.add(lg); } public void setNativeBox(Catalog catalog, String name) throws Exception { FeatureTypeInfo fti = catalog.getFeatureTypeByName(name); fti.setNativeBoundingBox(fti.getFeatureSource(null, null).getBounds()); fti.setLatLonBoundingBox(new ReferencedEnvelope(fti.getNativeBoundingBox(), DefaultGeographicCRS.WGS84)); catalog.save(fti); } public void testCascadeLayer() { String name = getLayerId(MockData.LAKES); LayerInfo layer = catalog.getLayerByName(name); assertNotNull(layer); layer.accept(visitor); // we expect a layer, a resource and a group assertEquals(3, visitor.getObjects(null).size()); // check the layer and resource have been marked to delete (and assertEquals(catalog.getLayerByName(name), visitor.getObjects(LayerInfo.class, ModificationType.DELETE).get(0)); assertEquals(catalog.getResourceByName(name, ResourceInfo.class), visitor.getObjects(ResourceInfo.class, ModificationType.DELETE).get(0)); // the group has been marked to update? (we need to compare by id as the // objects won't compare properly by equality) LayerGroupInfo group = catalog.getLayerGroupByName(LAKES_GROUP); assertEquals(group.getId(), visitor.getObjects(LayerGroupInfo.class, ModificationType.GROUP_CHANGED).get(0).getId()); } public void testCascadeStore() { String citeStore = MockData.CITE_PREFIX; StoreInfo store = catalog.getStoreByName(citeStore, StoreInfo.class); String buildings = getLayerId(MockData.BUILDINGS); String lakes = getLayerId(MockData.LAKES); LayerInfo bl = catalog.getLayerByName(buildings); ResourceInfo br = catalog.getResourceByName(buildings, ResourceInfo.class); LayerInfo ll = catalog.getLayerByName(lakes); ResourceInfo lr = catalog.getResourceByName(lakes, ResourceInfo.class); store.accept(visitor); assertEquals(store, visitor.getObjects(StoreInfo.class, ModificationType.DELETE).get(0)); List<LayerInfo> layers = visitor.getObjects(LayerInfo.class, ModificationType.DELETE); assertTrue(layers.contains(bl)); assertTrue(layers.contains(ll)); List<ResourceInfo> resources = visitor.getObjects(ResourceInfo.class, ModificationType.DELETE); assertTrue(resources.contains(br)); assertTrue(resources.contains(lr)); } public void testCascadeWorkspace() { WorkspaceInfo ws = catalog.getWorkspaceByName(MockData.CITE_PREFIX); assertNotNull(ws); List<StoreInfo> stores = getCatalog().getStoresByWorkspace(ws, StoreInfo.class); ws.accept(visitor); assertTrue(stores.containsAll(visitor.getObjects(StoreInfo.class, ModificationType.DELETE))); } public void testCascadeStyle() { String styleName = MockData.LAKES.getLocalPart(); String layerName = getLayerId(MockData.LAKES); StyleInfo style = catalog.getStyleByName(styleName); assertNotNull(style); // add the lakes style to builds as an alternate style LayerInfo buildings = catalog.getLayerByName(getLayerId(MockData.BUILDINGS)); buildings.getStyles().add(style); catalog.save(buildings); buildings = catalog.getLayerByName(getLayerId(MockData.BUILDINGS)); assertTrue(buildings.getStyles().contains(style)); style.accept(visitor); // test style reset assertEquals(style.getId(), visitor.getObjects(StyleInfo.class, ModificationType.DELETE).get(0).getId()); String lakesId = catalog.getLayerByName(layerName).getId(); assertEquals(lakesId, visitor.getObjects(LayerInfo.class, ModificationType.STYLE_RESET).get(0).getId()); // test style removal String buildingsId = catalog.getLayerByName(getLayerId(MockData.BUILDINGS)).getId(); assertEquals(buildingsId, visitor.getObjects(LayerInfo.class, ModificationType.EXTRA_STYLE_REMOVED).get(0).getId()); } }