/* (c) 2014 - 2016 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.hamcrest.Matchers.containsInAnyOrder;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertThat;
import java.util.ArrayList;
import java.util.List;
import org.geoserver.catalog.Catalog;
import org.geoserver.catalog.CatalogFactory;
import org.geoserver.catalog.DataStoreInfo;
import org.geoserver.catalog.FeatureTypeInfo;
import org.geoserver.catalog.LayerGroupInfo;
import org.geoserver.catalog.LayerGroupInfo.Mode;
import org.geoserver.catalog.LayerInfo;
import org.geoserver.catalog.WorkspaceInfo;
import org.geoserver.config.GeoServer;
import org.geoserver.config.SettingsInfo;
import org.geoserver.data.test.SystemTestData;
import org.geoserver.ows.Dispatcher;
import org.geoserver.ows.LocalPublished;
import org.geoserver.ows.LocalWorkspace;
import org.geoserver.ows.Request;
import org.geoserver.test.GeoServerSystemTestSupport;
import org.junit.Before;
import org.junit.Test;
public class LocalWorkspaceLayersTest extends GeoServerSystemTestSupport {
static final String GLOBAL_GROUP = "globalGroup";
static final String GLOBAL_GROUP2 = "globalGroup2";
static final String NESTED_GROUP = "nestedGroup";
static final String LOCAL_GROUP = "localGroup";
Catalog catalog;
@Before
public void setUpInternal() {
catalog = getCatalog();
LocalPublished.remove();
LocalWorkspace.remove();
Dispatcher.REQUEST.remove();
cleanupGroupByName(GLOBAL_GROUP);
cleanupGroupByName(GLOBAL_GROUP2);
cleanupGroupByName(NESTED_GROUP);
cleanupGroupByName(LOCAL_GROUP);
}
private void cleanupGroupByName(String name) {
for (LayerGroupInfo lg : new ArrayList<>(catalog.getLayerGroups())) {
if(lg.getName().equals(name)) {
catalog.remove(lg);
}
}
}
@Test
public void testGroupLayerInWorkspace() {
System.out.println(catalog.getLayerGroups());
WorkspaceInfo workspace = catalog.getWorkspaceByName("sf");
WorkspaceInfo workspace2 = catalog.getWorkspaceByName("cite");
CatalogFactory factory = catalog.getFactory();
LayerGroupInfo globalGroup = factory.createLayerGroup();
globalGroup.setName("globalGroup");
globalGroup.setWorkspace(workspace2);
globalGroup.getLayers().add(catalog.getLayerByName("Lakes"));
catalog.add(globalGroup);
LayerGroupInfo localGroup = factory.createLayerGroup();
localGroup.setName("localGroup");
localGroup.setWorkspace(workspace);
localGroup.getLayers().add(catalog.getLayerByName("GenericEntity"));
catalog.add(localGroup);
String localName = localGroup.prefixedName();
assertEquals("sf:localGroup", localName);
assertEquals(2, catalog.getLayerGroups().size());
LocalWorkspace.set(workspace2);
assertNull(catalog.getLayerGroupByName("localGroup"));
LocalWorkspace.remove();
LocalWorkspace.set(workspace);
assertNotNull(catalog.getLayerGroupByName("localGroup"));
assertEquals(1, catalog.getLayerGroups().size());
assertEquals("localGroup", catalog.getLayerGroupByName("localGroup").prefixedName());
GeoServer gs = getGeoServer();
SettingsInfo settings = gs.getFactory().createSettings();
settings.setLocalWorkspaceIncludesPrefix(true);
settings.setWorkspace(workspace);
gs.add(settings);
assertEquals("sf:localGroup", catalog.getLayerGroupByName("localGroup").prefixedName());
assertEquals("sf:localGroup", catalog.getLayerGroups().get(0).prefixedName());
gs.remove(settings);
LocalWorkspace.remove();
}
@Test
public void testLayersInLocalWorkspace() {
WorkspaceInfo sf = catalog.getWorkspaceByName("sf");
WorkspaceInfo cite = catalog.getWorkspaceByName("cite");
CatalogFactory factory = catalog.getFactory();
DataStoreInfo citeStore = factory.createDataStore();
citeStore.setEnabled(true);
citeStore.setName("globalStore");
citeStore.setWorkspace(cite);
catalog.add(citeStore);
FeatureTypeInfo citeFeatureType = factory.createFeatureType();
citeFeatureType.setName("citeLayer");
citeFeatureType.setStore(citeStore);
citeFeatureType.setNamespace(catalog.getNamespaceByPrefix("cite"));
catalog.add(citeFeatureType);
LayerInfo citeLayer = factory.createLayer();
citeLayer.setResource(citeFeatureType);
citeLayer.setEnabled(true);
//citeLayer.setName("citeLayer");
catalog.add(citeLayer);
assertNotNull(catalog.getLayerByName("citeLayer"));
assertEquals("cite:citeLayer", catalog.getLayerByName("citeLayer").prefixedName());
DataStoreInfo sfStore = factory.createDataStore();
sfStore.setEnabled(true);
sfStore.setName("localStore");
sfStore.setWorkspace(sf);
catalog.add(sfStore);
FeatureTypeInfo sfFeatureType = factory.createFeatureType();
sfFeatureType.setName("sfLayer");
sfFeatureType.setStore(sfStore);
sfFeatureType.setNamespace(catalog.getNamespaceByPrefix("sf"));
catalog.add(sfFeatureType);
LayerInfo sfLayer = factory.createLayer();
sfLayer.setResource(sfFeatureType);
sfLayer.setEnabled(true);
//sfLayer.setName("sfLayer");
catalog.add(sfLayer);
assertNotNull(catalog.getLayerByName("citeLayer"));
assertNotNull(catalog.getLayerByName("sfLayer"));
LocalWorkspace.set(sf);
assertNull(catalog.getLayerByName("citeLayer"));
assertNotNull(catalog.getLayerByName("sfLayer"));
assertEquals("sfLayer", catalog.getLayerByName("sfLayer").prefixedName());
LocalWorkspace.remove();
LocalWorkspace.set(cite);
assertNull(catalog.getLayerByName("sfLayer"));
assertNotNull(catalog.getLayerByName("citeLayer"));
assertEquals("citeLayer", catalog.getLayerByName("citeLayer").prefixedName());
LocalWorkspace.remove();
}
@Test
public void testGlobalGroupSpecificRequest() {
CatalogFactory factory = catalog.getFactory();
LayerGroupInfo globalGroup = factory.createLayerGroup();
globalGroup.setName(GLOBAL_GROUP);
globalGroup.getLayers().add(getBuildingsLayer());
globalGroup.getLayers().add(getAggregateGeoFeatureLayer());
catalog.add(globalGroup);
LayerGroupInfo globalGroup2 = factory.createLayerGroup();
globalGroup2.setName(GLOBAL_GROUP2);
globalGroup2.getLayers().add(getBridgesLayer());
catalog.add(globalGroup2);
LocalPublished.set(catalog.getLayerGroupByName(GLOBAL_GROUP));
// some direct access tests, generic request
assertNull(catalog.getLayerByName(getLayerId(SystemTestData.BASIC_POLYGONS)));
assertNull(getBridgesLayer());
assertNull(catalog.getLayerGroupByName(GLOBAL_GROUP2));
assertNotNull(getBuildingsLayer());
assertNotNull(getAggregateGeoFeatureLayer());
assertNotNull(catalog.getLayerGroupByName(GLOBAL_GROUP));
List<LayerInfo> layers = catalog.getLayers();
assertEquals(2, layers.size());
assertThat(layers, containsInAnyOrder(getBuildingsLayer(), getAggregateGeoFeatureLayer()));
// now simulate WMS getCaps, the layers should not appear in the caps document
Request request = new Request();
request.setService("WMS");
request.setRequest("GetCapabilities");
Dispatcher.REQUEST.set(request);
assertNull(catalog.getLayerByName(getLayerId(SystemTestData.BASIC_POLYGONS)));
assertNull(getBridgesLayer());
assertNull(catalog.getLayerGroupByName(GLOBAL_GROUP2));
assertNull(getBuildingsLayer());
assertNull(getAggregateGeoFeatureLayer());
assertNotNull(catalog.getLayerGroupByName(GLOBAL_GROUP));
assertEquals(0, catalog.getLayers().size());
LocalPublished.remove();
}
@Test
public void testNestedGroupSpecificRequest() {
CatalogFactory factory = catalog.getFactory();
LayerGroupInfo nestedGroup = factory.createLayerGroup();
nestedGroup.setName(NESTED_GROUP);
nestedGroup.getLayers().add(getBridgesLayer());
catalog.add(nestedGroup);
LayerGroupInfo globalGroup = factory.createLayerGroup();
globalGroup.setName(GLOBAL_GROUP);
globalGroup.getLayers().add(getBuildingsLayer());
globalGroup.getLayers().add(getAggregateGeoFeatureLayer());
globalGroup.getLayers().add(nestedGroup);
catalog.add(globalGroup);
LocalPublished.set(catalog.getLayerGroupByName(GLOBAL_GROUP));
// some direct access tests, generic request, everything nested
assertNull(catalog.getLayerByName(getLayerId(SystemTestData.BASIC_POLYGONS)));
assertNotNull(getBridgesLayer());
assertNotNull(getBuildingsLayer());
assertNotNull(getAggregateGeoFeatureLayer());
assertNotNull(catalog.getLayerGroupByName(NESTED_GROUP));
assertNotNull(catalog.getLayerGroupByName(GLOBAL_GROUP));
assertThat(catalog.getLayers(), containsInAnyOrder(getBuildingsLayer(), getAggregateGeoFeatureLayer(), getBridgesLayer()));
// now simulate WMS getCaps, the layers should not appear in the caps document
Request request = new Request();
request.setService("WMS");
request.setRequest("GetCapabilities");
Dispatcher.REQUEST.set(request);
assertNull(catalog.getLayerByName(getLayerId(SystemTestData.BASIC_POLYGONS)));
assertNull(getBridgesLayer());
assertNull(catalog.getLayerGroupByName(NESTED_GROUP));
assertNull(getBuildingsLayer());
assertNull(getAggregateGeoFeatureLayer());
assertNotNull(catalog.getLayerGroupByName(GLOBAL_GROUP));
assertEquals(0, catalog.getLayers().size());
// and then change the mode of the group to tree mode, contents will show up in caps too
globalGroup = catalog.getLayerGroupByName(GLOBAL_GROUP);
globalGroup.setMode(Mode.NAMED);
catalog.save(globalGroup);
assertNull(catalog.getLayerByName(getLayerId(SystemTestData.BASIC_POLYGONS)));
assertNotNull(getBridgesLayer());
assertNotNull(catalog.getLayerGroupByName(NESTED_GROUP));
assertNotNull(getBuildingsLayer());
assertNotNull(getAggregateGeoFeatureLayer());
assertNotNull(catalog.getLayerGroupByName(GLOBAL_GROUP));
assertThat(catalog.getLayers(), containsInAnyOrder(getBuildingsLayer(), getAggregateGeoFeatureLayer(), getBridgesLayer()));
LocalPublished.remove();
}
@Test
public void testWorkspaceGroupSpecificRequest() {
CatalogFactory factory = catalog.getFactory();
WorkspaceInfo citeWs = catalog.getWorkspaceByName("cite");
LayerGroupInfo localGroup = factory.createLayerGroup();
localGroup.setName(LOCAL_GROUP);
localGroup.setWorkspace(citeWs);
localGroup.getLayers().add(getBuildingsLayer());
localGroup.getLayers().add(getBridgesLayer());
catalog.add(localGroup);
LayerGroupInfo globalGroup = factory.createLayerGroup();
globalGroup.setName(GLOBAL_GROUP);
globalGroup.getLayers().add(getAggregateGeoFeatureLayer());
catalog.add(globalGroup);
LocalWorkspace.set(citeWs);
LocalPublished.set(catalog.getLayerGroupByName(LOCAL_GROUP));
// some direct access tests, generic request
assertNull(catalog.getLayerByName(getLayerId(SystemTestData.BASIC_POLYGONS)));
assertNull(getAggregateGeoFeatureLayer());
assertNull(catalog.getLayerGroupByName(GLOBAL_GROUP));
assertNotNull(getBridgesLayer());
assertNotNull(getBuildingsLayer());
List<LayerInfo> layers = catalog.getLayers();
assertEquals(2, layers.size());
assertThat(layers, containsInAnyOrder(getBuildingsLayer(), getBridgesLayer()));
// now simulate WMS getCaps, the layers should not appear in the caps document
Request request = new Request();
request.setService("WMS");
request.setRequest("GetCapabilities");
Dispatcher.REQUEST.set(request);
assertNull(catalog.getLayerByName(getLayerId(SystemTestData.BASIC_POLYGONS)));
assertNull(getBridgesLayer());
assertNull(catalog.getLayerGroupByName(GLOBAL_GROUP));
assertNull(getBuildingsLayer());
assertNull(getAggregateGeoFeatureLayer());
assertEquals(0, catalog.getLayers().size());
LocalPublished.remove();
LocalWorkspace.remove();
}
private LayerInfo getBridgesLayer() {
return catalog.getLayerByName(getLayerId(SystemTestData.BRIDGES));
}
private LayerInfo getAggregateGeoFeatureLayer() {
return catalog.getLayerByName(getLayerId(SystemTestData.AGGREGATEGEOFEATURE));
}
private LayerInfo getBuildingsLayer() {
return catalog.getLayerByName(getLayerId(SystemTestData.BUILDINGS));
}
}