/* (c) 2014 Open Source Geospatial Foundation - all rights reserved
* (c) 2001 - 2013 OpenPlans
* This code is licensed under the GPL 2.0 license, available at the root
* application directory.
*/
package org.geoserver.catalog.impl;
import static org.junit.Assert.*;
import java.util.ArrayList;
import java.util.List;
import org.geoserver.catalog.CascadeRemovalReporter;
import org.geoserver.catalog.CascadeRemovalReporter.ModificationType;
import org.geoserver.catalog.Catalog;
import org.geoserver.catalog.DataStoreInfo;
import org.geoserver.catalog.FeatureTypeInfo;
import org.geoserver.catalog.LayerGroupInfo;
import org.geoserver.catalog.LayerInfo;
import org.geoserver.catalog.PublishedInfo;
import org.geoserver.catalog.ResourceInfo;
import org.geoserver.catalog.StoreInfo;
import org.geoserver.catalog.StyleInfo;
import org.geoserver.catalog.WorkspaceInfo;
import org.geoserver.data.test.MockData;
import org.geotools.geometry.jts.ReferencedEnvelope;
import org.geotools.referencing.crs.DefaultGeographicCRS;
import org.junit.Test;
public class CascadeRemovalReporterTest extends CascadeVisitorAbstractTest {
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);
}
@Test
public void testCascadeLayer() {
Catalog catalog = getCatalog();
CascadeRemovalReporter visitor = new CascadeRemovalReporter(catalog);
String name = getLayerId(MockData.LAKES);
LayerInfo layer = catalog.getLayerByName(name);
assertNotNull(layer);
visitor.visit(layer);
//layer.accept(visitor);
// we expect a layer, a resource and two groups
assertEquals(4, 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 groups have been marked to update?
assertTrue(visitor.getObjects(LayerGroupInfo.class, ModificationType.GROUP_CHANGED).contains(catalog.getLayerGroupByName(LAKES_GROUP)));
assertTrue(visitor.getObjects(LayerGroupInfo.class, ModificationType.GROUP_CHANGED).contains(catalog.getLayerGroupByName(NEST_GROUP)));
}
@Test
public void testCascadeStore() {
Catalog catalog = getCatalog();
CascadeRemovalReporter visitor = new CascadeRemovalReporter(catalog);
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);
visitor.visit((DataStoreInfo)store);
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));
}
@Test
public void testCascadeWorkspace() {
Catalog catalog = getCatalog();
CascadeRemovalReporter visitor = new CascadeRemovalReporter(catalog);
WorkspaceInfo ws = catalog.getWorkspaceByName(MockData.CITE_PREFIX);
assertNotNull(ws);
List<StoreInfo> stores = getCatalog().getStoresByWorkspace(ws, StoreInfo.class);
List<StyleInfo> styles = getCatalog().getStylesByWorkspace(ws);
List<LayerGroupInfo> layerGroups = getCatalog().getLayerGroupsByWorkspace(ws);
List<LayerGroupInfo> changedLayerGroups = new ArrayList<LayerGroupInfo>();
// Added another check for Layergroups which are not in the ws but contain
// Layers belonging to this ws
List<LayerGroupInfo> totalLayerGroups = getCatalog().getLayerGroups();
for(LayerGroupInfo info : totalLayerGroups){
List<PublishedInfo> layers = info.getLayers();
int size = countStores(info, stores);
if(size == layers.size()){
if(!layerGroups.contains(info)){
layerGroups.add(info);
}
}else{
changedLayerGroups.add(info);
}
}
ws.accept(visitor);
assertTrue(stores.containsAll(visitor.getObjects(StoreInfo.class, ModificationType.DELETE)));
assertTrue(styles.containsAll(visitor.getObjects(StyleInfo.class, ModificationType.DELETE)));
assertTrue(layerGroups.containsAll(visitor.getObjects(LayerGroupInfo.class,
ModificationType.DELETE)));
assertTrue(changedLayerGroups.containsAll(visitor.getObjects(LayerGroupInfo.class,
ModificationType.GROUP_CHANGED)));
}
private int countStores(LayerGroupInfo lg, List<StoreInfo> stores) {
List<PublishedInfo> layers = lg.getLayers();
int size = 0;
for(PublishedInfo l : layers){
if (l instanceof LayerInfo) {
if(stores.contains(((LayerInfo)l).getResource().getStore())){
size++;
}
} else if (l instanceof LayerGroupInfo) {
if (countStores((LayerGroupInfo) l, stores) == ((LayerGroupInfo) l).getLayers().size()) {
size++;
}
}
}
return size;
}
@Test
public void testCascadeStyle() {
Catalog catalog = getCatalog();
CascadeRemovalReporter visitor = new CascadeRemovalReporter(catalog);
StyleInfo style = catalog.getStyleByName(MockData.LAKES.getLocalPart());
LayerInfo buildings = catalog.getLayerByName(getLayerId(MockData.BUILDINGS));
LayerInfo lakes = catalog.getLayerByName(getLayerId(MockData.LAKES));
visitor.visit(style);
// test style reset
assertEquals(style, visitor.getObjects(StyleInfo.class, ModificationType.DELETE).get(0));
assertEquals(lakes, visitor.getObjects(LayerInfo.class, ModificationType.STYLE_RESET).get(0));
assertEquals(buildings, visitor.getObjects(LayerInfo.class, ModificationType.EXTRA_STYLE_REMOVED).get(0));
}
}