/* (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.easymock.EasyMock.createNiceMock;
import static org.easymock.EasyMock.expect;
import static org.easymock.EasyMock.replay;
import static org.junit.Assert.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import org.geoserver.catalog.Catalog;
import org.geoserver.catalog.FeatureTypeInfo;
import org.geoserver.catalog.LayerGroupInfo;
import org.geoserver.catalog.LayerInfo;
import org.geoserver.catalog.NamespaceInfo;
import org.geoserver.catalog.ResourceInfo;
import org.geoserver.catalog.StyleInfo;
import org.geoserver.catalog.WorkspaceInfo;
import org.geoserver.catalog.util.CloseableIteratorAdapter;
import org.geoserver.config.GeoServer;
import org.geoserver.config.SettingsInfo;
import org.geoserver.ows.LocalWorkspace;
import org.geotools.feature.NameImpl;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.opengis.filter.Filter;
import org.opengis.filter.sort.SortBy;
public class LocalWorkspaceCatalogTest {
LocalWorkspaceCatalog catalog;
@Before
public void setUp() throws Exception {
WorkspaceInfo ws1 = createNiceMock(WorkspaceInfo.class);
expect(ws1.getName()).andReturn("ws1").anyTimes();
replay(ws1);
NamespaceInfo ns1 = createNiceMock(NamespaceInfo.class);
expect(ns1.getPrefix()).andReturn("ws1").anyTimes();
expect(ns1.getURI()).andReturn("ws1").anyTimes();
replay(ns1);
WorkspaceInfo ws2 = createNiceMock(WorkspaceInfo.class);
expect(ws2.getName()).andReturn("ws2").anyTimes();
replay(ws2);
NamespaceInfo ns2 = createNiceMock(NamespaceInfo.class);
expect(ns2.getPrefix()).andReturn("ws2").anyTimes();
expect(ns2.getURI()).andReturn("ws2").anyTimes();
replay(ns2);
StyleInfo s1 = createNiceMock(StyleInfo.class);
expect(s1.getName()).andReturn("s1").anyTimes();
expect(s1.getWorkspace()).andReturn(ws1).anyTimes();
replay(s1);
StyleInfo s2 = createNiceMock(StyleInfo.class);
expect(s2.getName()).andReturn("s2").anyTimes();
expect(s2.getWorkspace()).andReturn(ws2).anyTimes();
replay(s2);
LayerGroupInfo lg1 = createNiceMock(LayerGroupInfo.class);
expect(lg1.getName()).andReturn("lg1").anyTimes();
expect(lg1.getWorkspace()).andReturn(ws1).anyTimes();
replay(lg1);
LayerGroupInfo lg2 = createNiceMock(LayerGroupInfo.class);
expect(lg2.getName()).andReturn("lg2").anyTimes();
expect(lg2.getWorkspace()).andReturn(ws2).anyTimes();
replay(lg2);
FeatureTypeInfo ft1 = createNiceMock(FeatureTypeInfo.class);
expect(ft1.getName()).andReturn("l1").anyTimes();
expect(ft1.getNamespace()).andReturn(ns1).anyTimes();
replay(ft1);
LayerInfo l1 = createNiceMock(LayerInfo.class);
expect(l1.getName()).andReturn("ws1:l1").anyTimes();
expect(l1.getResource()).andReturn(ft1).anyTimes();
replay(l1);
FeatureTypeInfo ft2 = createNiceMock(FeatureTypeInfo.class);
expect(ft2.getName()).andReturn("l2").anyTimes();
expect(ft2.getNamespace()).andReturn(ns2).anyTimes();
replay(ft2);
LayerInfo l2 = createNiceMock(LayerInfo.class);
expect(l2.getName()).andReturn("ws2:l2").anyTimes();
expect(l2.getResource()).andReturn(ft2).anyTimes();
replay(l2);
// set up layer name collisions: lc
// use same name, but different featuretypeinfo objects
// pointing to different workspaces
LayerInfo lc1 = createNiceMock(LayerInfo.class);
expect(lc1.getName()).andReturn("ws1:lc").anyTimes();
expect(lc1.getResource()).andReturn(ft1).anyTimes();
replay(lc1);
LayerInfo lc2 = createNiceMock(LayerInfo.class);
expect(lc2.getName()).andReturn("ws2:lc").anyTimes();
expect(lc2.getResource()).andReturn(ft2).anyTimes();
replay(lc2);
Catalog cat = createNiceMock(Catalog.class);
expect(cat.getWorkspaces()).andReturn(Arrays.asList(ws1,ws2)).anyTimes();
expect(cat.getWorkspaceByName("ws1")).andReturn(ws1).anyTimes();
expect(cat.getWorkspaceByName("ws2")).andReturn(ws2).anyTimes();
expect(cat.getNamespaceByPrefix("ws1")).andReturn(ns1).anyTimes();
expect(cat.getNamespaceByPrefix("ws2")).andReturn(ns2).anyTimes();
expect(cat.getStyleByName("ws1", "s1")).andReturn(s1).anyTimes();
expect(cat.getStyleByName(ws1, "s1")).andReturn(s1).anyTimes();
expect(cat.getStyleByName("s1")).andReturn(null).anyTimes();
expect(cat.getStyleByName("ws2", "s2")).andReturn(s1).anyTimes();
expect(cat.getStyleByName(ws2, "s2")).andReturn(s1).anyTimes();
expect(cat.getStyleByName("s2")).andReturn(null).anyTimes();
expect(cat.getLayerGroupByName("ws1", "lg1")).andReturn(lg1).anyTimes();
expect(cat.getLayerGroupByName(ws1, "lg1")).andReturn(lg1).anyTimes();
expect(cat.getLayerGroupByName("lg1")).andReturn(null).anyTimes();
expect(cat.getLayerGroupByName("ws2", "lg2")).andReturn(lg2).anyTimes();
expect(cat.getLayerGroupByName(ws2, "lg2")).andReturn(lg2).anyTimes();
expect(cat.getLayerGroupByName("lg2")).andReturn(null).anyTimes();
//expect(cat.getLayerByName("ws1", "l1")).andReturn(l1).anyTimes();
//expect(cat.getLayerByName(ws1, "l1")).andReturn(l1).anyTimes();
expect(cat.getLayerByName(new NameImpl("ws1", "l1"))).andReturn(l1).anyTimes();
expect(cat.getLayerByName("l1")).andReturn(null).anyTimes();
//expect(cat.getLayerByName("ws2", "l2")).andReturn(l2).anyTimes();
//expect(cat.getLayerByName(ws2, "l2")).andReturn(l2).anyTimes();
expect(cat.getLayerByName(new NameImpl("ws2", "l2"))).andReturn(l2).anyTimes();
expect(cat.getLayerByName("l2")).andReturn(null).anyTimes();
// with namespace prefixes, return the appropriate layer info
expect(cat.getLayerByName(new NameImpl("ws1", "lc"))).andReturn(lc1).anyTimes();
expect(cat.getLayerByName(new NameImpl("ws2", "lc"))).andReturn(lc2).anyTimes();
// return back the first one without a namespace prefix
expect(cat.getLayerByName("lc")).andReturn(lc1).anyTimes();
List<LayerInfo> layers = new ArrayList<LayerInfo>(2);
layers.add(l1);
layers.add(l2);
layers.add(lc1);
layers.add(lc2);
expect(cat.getLayers()).andReturn(layers).anyTimes();
expect(cat.list(LayerInfo.class, Filter.INCLUDE,
(Integer) null, (Integer) null, (SortBy) null))
.andReturn(new CloseableIteratorAdapter<LayerInfo>(layers.iterator())).anyTimes();
replay(cat);
catalog = new LocalWorkspaceCatalog(cat);
}
@After
public void tearDown() {
LocalWorkspace.remove();
}
@Test
public void testGetStyleByName() throws Exception {
assertNull(catalog.getStyleByName("s1"));
assertNull(catalog.getStyleByName("s2"));
WorkspaceInfo ws1 = catalog.getWorkspaceByName("ws1");
WorkspaceInfo ws2 = catalog.getWorkspaceByName("ws2");
LocalWorkspace.set(ws1);
assertNotNull(catalog.getStyleByName("s1"));
assertNull(catalog.getStyleByName("s2"));
LocalWorkspace.remove();
assertNull(catalog.getStyleByName("s1"));
assertNull(catalog.getStyleByName("s2"));
LocalWorkspace.set(ws2);
assertNull(catalog.getStyleByName("s1"));
assertNotNull(catalog.getStyleByName("s2"));
LocalWorkspace.remove();
assertNull(catalog.getStyleByName("s1"));
assertNull(catalog.getStyleByName("s2"));
}
@Test
public void testGetLayerGroupByName() throws Exception {
assertNull(catalog.getLayerGroupByName("lg1"));
assertNull(catalog.getLayerGroupByName("lg2"));
WorkspaceInfo ws1 = catalog.getWorkspaceByName("ws1");
WorkspaceInfo ws2 = catalog.getWorkspaceByName("ws2");
LocalWorkspace.set(ws1);
assertNotNull(catalog.getLayerGroupByName("lg1"));
assertNull(catalog.getLayerGroupByName("lg2"));
LocalWorkspace.remove();
assertNull(catalog.getLayerGroupByName("lg1"));
assertNull(catalog.getLayerGroupByName("lg2"));
LocalWorkspace.set(ws2);
assertNull(catalog.getLayerGroupByName("lg1"));
assertNotNull(catalog.getLayerGroupByName("lg2"));
LocalWorkspace.remove();
assertNull(catalog.getLayerGroupByName("lg1"));
assertNull(catalog.getLayerGroupByName("lg2"));
}
@Test
public void testGetLayerByName() throws Exception {
assertNull(catalog.getLayerByName("l1"));
assertNull(catalog.getLayerByName("l2"));
WorkspaceInfo ws1 = catalog.getWorkspaceByName("ws1");
WorkspaceInfo ws2 = catalog.getWorkspaceByName("ws2");
LocalWorkspace.set(ws1);
assertNotNull(catalog.getLayerByName("l1"));
assertNull(catalog.getLayerByName("l2"));
LocalWorkspace.remove();
LocalWorkspace.set(ws2);
assertNull(catalog.getLayerByName("l1"));
assertNotNull(catalog.getLayerByName("l2"));
LocalWorkspace.remove();
assertNull(catalog.getLayerByName("l1"));
assertNull(catalog.getLayerByName("l2"));
}
@Test
public void testGetLayersWithSameName() throws Exception {
LayerInfo layerInfo1 = catalog.getLayerByName(new NameImpl("ws1", "lc"));
ResourceInfo resource1 = layerInfo1.getResource();
NamespaceInfo namespace1 = resource1.getNamespace();
String nsPrefix1 = namespace1.getPrefix();
LayerInfo layerInfo2 = catalog.getLayerByName(new NameImpl("ws2", "lc"));
ResourceInfo resource2 = layerInfo2.getResource();
NamespaceInfo namespace2 = resource2.getNamespace();
String nsPrefix2 = namespace2.getPrefix();
assertEquals("Invalid namespace prefix", "ws1", nsPrefix1);
assertEquals("Invalid namespace prefix", "ws2", nsPrefix2);
}
/**
* The setting says to not include the prefix. This is default behaviour
*/
@Test
public void testGetNonPrefixedLayerNames() {
boolean includePrefix = false;
boolean setLocalWorkspace = true;
boolean createGeoServer = true;
assertPrefixInclusion(includePrefix, setLocalWorkspace, createGeoServer);
}
/**
* No geoserver instance has been set. This means there is no access to geoserver.
* this should not happen but we want to protect against this consideration. In this case
* we have a local workspace set and we will use the default behaviour (no prefix)
*/
@Test
public void testGetNoGeoserverPrefixedLayerNameBehaviour() {
boolean includePrefix = false;
boolean setLocalWorkspace = true;
boolean createGeoServer = false;
assertPrefixInclusion(includePrefix, setLocalWorkspace, createGeoServer);
}
/**
* No local workspace is set this means the prefix should be included since the global capabilities
* is probably being created.
*
* The No Geoserver part is just to verify there are no nullpointer exceptions because of a coding error
*/
@Test
public void testGetNoGeoserverLocalWorkspacePrefixedLayerNameBehaviour() {
boolean includePrefix = true;
boolean setLocalWorkspace = false;
boolean createGeoServer = false;
assertPrefixInclusion(includePrefix, setLocalWorkspace, createGeoServer);
}
/**
* No localworkspace so prefix should be included since the global capabilities
* is probably being created.
*/
@Test
public void testGetNoLocalWorkspacePrefixedLayerNameBehaviour() {
boolean includePrefix = true;
boolean setLocalWorkspace = false;
boolean createGeoServer = true;
assertPrefixInclusion(includePrefix, setLocalWorkspace, createGeoServer);
}
/**
* The setting is set to include the prefixes.
*/
@Test
public void testGetPrefixedLayerNames() {
boolean includePrefix = true;
boolean setLocalWorkspace = true;
boolean createGeoServer = true;
assertPrefixInclusion(includePrefix, setLocalWorkspace, createGeoServer);
}
private void assertPrefixInclusion(boolean includePrefix,
boolean setLocalWorkspace, boolean createGeoServer) {
if (createGeoServer ) {
SettingsInfo settings = createNiceMock(SettingsInfo.class);
expect(settings.isLocalWorkspaceIncludesPrefix()).andReturn(includePrefix)
.anyTimes();
replay(settings);
GeoServer geoServer = createNiceMock(GeoServer.class);
expect(geoServer.getSettings()).andReturn(settings).anyTimes();
replay(geoServer);
catalog.setGeoServer(geoServer);
}
if (setLocalWorkspace) {
WorkspaceInfo workspaceByName = catalog.getWorkspaceByName("ws1");
LocalWorkspace.set(workspaceByName);
}
checkLayerNamePrefixInclusion(includePrefix, catalog.getLayers().iterator());
checkLayerNamePrefixInclusion(includePrefix, catalog.list(LayerInfo.class, Filter.INCLUDE));
}
private void checkLayerNamePrefixInclusion(boolean includePrefix,
Iterator<LayerInfo> layers) {
while(layers.hasNext()) {
LayerInfo layerInfo = layers.next();
String message;
if(includePrefix) {
message = layerInfo.getName() + " should contain a : because the prefix should have been kept";
} else {
message = layerInfo.getName() + " should contain not a : because the prefix should have been removed";
}
assertEquals(message, includePrefix, layerInfo.getName().contains(":"));
}
}
}