/* (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.config;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.apache.commons.io.FileUtils;
import org.geoserver.catalog.NamespaceInfo;
import org.geoserver.catalog.WorkspaceInfo;
import org.geoserver.config.impl.GeoServerImpl;
import org.geoserver.config.util.XStreamServiceLoader;
import org.geoserver.data.test.SystemTestData;
import org.geoserver.platform.GeoServerResourceLoader;
import org.geoserver.test.GeoServerSystemTestSupport;
import org.geoserver.test.SystemTest;
import org.geotools.util.logging.Logging;
import org.junit.Before;
import org.junit.Test;
import org.junit.experimental.categories.Category;
@Category(SystemTest.class)
public class ServicePersisterTest extends GeoServerSystemTestSupport {
GeoServer geoServer;
@Override
protected void onSetUp(SystemTestData testData) throws Exception {
GeoServer geoServer = getGeoServer();
geoServer.addListener(new ServicePersister(
(List) Arrays.asList(new ServiceLoader(getResourceLoader())), geoServer));
}
@Override
protected void setUpSpring(List<String> springContextLocations) {
super.setUpSpring(springContextLocations);
springContextLocations
.add("classpath*:/org/geoserver/config/ServicePersisterTest-applicationContext.xml");
}
@Before
public void init() {
geoServer = getGeoServer();
}
@Before
public void removeFooService() throws IOException {
GeoServer geoServer = getGeoServer();
WorkspaceInfo ws = getCatalog().getDefaultWorkspace();
ServiceInfo s = geoServer.getServiceByName(ws, "foo", ServiceInfo.class);
if (s != null) {
geoServer.remove(s);
}
File serviceFile = getDataDirectory().findFile("service.xml");
if (serviceFile != null) {
serviceFile.delete();
}
}
@Test
public void testAddWorkspaceLocalService() throws Exception {
File dataDirRoot = getTestData().getDataDirectoryRoot();
WorkspaceInfo ws = getCatalog().getDefaultWorkspace();
ServiceInfo s = geoServer.getFactory().createService();
s.setName("foo");
s.setWorkspace(ws);
File f = new File(dataDirRoot, "workspaces"+"/"+ws.getName()+"/service.xml");
assertFalse(f.exists());
geoServer.add(s);
assertTrue(f.exists());
}
@Test
public void testRemoveWorkspaceLocalService() throws Exception {
testAddWorkspaceLocalService();
File dataDirRoot = getTestData().getDataDirectoryRoot();
WorkspaceInfo ws = getCatalog().getDefaultWorkspace();
File f = new File(dataDirRoot, "workspaces"+"/"+ws.getName()+"/service.xml");
assertTrue(f.exists());
Logger logger = Logging.getLogger(GeoServerImpl.class);
Level level = logger.getLevel();
try {
logger.setLevel(Level.OFF);
ServiceInfo s = geoServer.getServiceByName(ws, "foo", ServiceInfo.class);
geoServer.remove(s);
assertFalse(f.exists());
}
finally {
logger.setLevel(level);
}
}
@Test
public void testReloadWithLocalServices() throws Exception {
// setup a non default workspace
WorkspaceInfo ws = getCatalog().getFactory().createWorkspace();
ws.setName("nonDefault");
NamespaceInfo ni = getCatalog().getFactory().createNamespace();
ni.setPrefix("nonDefault");
ni.setURI("http://www.geoserver.org/nonDefault");
getCatalog().add(ws);
getCatalog().add(ni);
// create a ws specific setting
SettingsInfo s = geoServer.getFactory().createSettings();
s.setWorkspace(ws);
geoServer.add(s);
getGeoServer().reload();
}
@Test
public void testLoadGibberish() throws Exception {
// we should get a log message, but the startup should continue
File service = new File(getDataDirectory().getResourceLoader().getBaseDirectory(),
"service.xml");
FileUtils.writeStringToFile(service, "duDaDa");
getGeoServer().reload();
assertEquals(0, geoServer.getServices().size());
}
public static class ServiceLoader extends XStreamServiceLoader {
public ServiceLoader(GeoServerResourceLoader resourceLoader) {
super(resourceLoader, "service");
}
@Override
public Class getServiceClass() {
return ServiceInfo.class;
}
@Override
protected ServiceInfo createServiceFromScratch(GeoServer gs) {
return null;
}
}
}