/* Copyright (c) 2001 - 2007 TOPP - www.openplans.org. All rights reserved.
* This code is licensed under the GPL 2.0 license, availible at the root
* application directory.
*/
package org.geoserver.test;
import java.io.IOException;
import java.io.Serializable;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.geotools.data.DataStore;
import org.geotools.data.Query;
import org.geotools.data.FeatureSource;
import org.geotools.data.ows.Layer;
import org.geotools.data.wfs.WFSDataStoreFactory;
import org.geotools.data.wms.WebMapServer;
import org.geotools.factory.CommonFactoryFinder;
import org.geotools.feature.FeatureCollection;
import org.opengis.filter.FilterFactory;
/**
* Utility class used to check wheter REMOTE_OWS_XXX related tests can be run against the demo server or not
* or not.
* @author Andrea Aime - TOPP
* @author Ben Caradoc-Davies, CSIRO Exploration and Mining
*/
public class RemoteOWSTestSupport {
// support for remote OWS layers
public static final String TOPP_STATES = "topp:states";
public static final String WFS_SERVER_URL = "http://demo.opengeo.org/geoserver/wfs?";
public static final String WMS_SERVER_URL = "http://demo.opengeo.org/geoserver/wms?";
static Boolean remoteWMSStatesAvailable;
static Boolean remoteWFSStatesAvailable;
public static boolean isRemoteWFSStatesAvailable(Logger logger) {
if(remoteWFSStatesAvailable == null) {
// let's see if the remote ows tests are enabled to start with
String value = System.getProperty("remoteOwsTests");
if(value == null || !"TRUE".equalsIgnoreCase(value)) {
logger.log(Level.WARNING, "Skipping remote WFS test because they were not enabled via -DremoteOwsTests=true");
remoteWFSStatesAvailable = Boolean.FALSE;
} else {
// let's check if the remote WFS tests are runnable
try {
WFSDataStoreFactory factory = new WFSDataStoreFactory();
Map<String, Serializable> params = new HashMap(factory.getImplementationHints());
URL url = new URL(WFS_SERVER_URL + "service=WFS&request=GetCapabilities");
params.put(WFSDataStoreFactory.URL.key, url);
params.put(WFSDataStoreFactory.TRY_GZIP.key, Boolean.TRUE);
//give it five seconds to respond...
params.put(WFSDataStoreFactory.TIMEOUT.key, Integer.valueOf(5000));
DataStore remoteStore = factory.createDataStore(params);
FeatureSource fs = remoteStore.getFeatureSource(TOPP_STATES);
remoteWFSStatesAvailable = Boolean.TRUE;
// check a basic response can be answered correctly
Query dq = new Query(TOPP_STATES);
FilterFactory ff = CommonFactoryFinder.getFilterFactory(null);
dq.setFilter(ff.greater(ff.property("PERSONS"), ff.literal(20000000)));
FeatureCollection fc = fs.getFeatures(dq);
if(fc.size() != 1) {
logger.log(Level.WARNING, "Remote database status invalid, there should be one and only one " +
"feature with more than 20M persons in topp:states");
remoteWFSStatesAvailable = Boolean.FALSE;
}
logger.log(Level.WARNING, "Remote WFS tests are enabled, remote server appears to be up");
} catch(IOException e) {
logger.log(Level.WARNING, "Skipping remote wms test, either demo " +
"is down or the topp:states layer is not there", e);
remoteWFSStatesAvailable = Boolean.FALSE;
}
}
}
return remoteWFSStatesAvailable.booleanValue();
}
public static boolean isRemoteWMSStatesAvailable(Logger logger) {
if(remoteWMSStatesAvailable == null) {
// let's see if the remote ows tests are enabled to start with
String value = System.getProperty("remoteOwsTests");
if(value == null || !"TRUE".equalsIgnoreCase(value)) {
logger.log(Level.WARNING, "Skipping remote OWS test because they were not enabled via -DremoteOwsTests=true");
remoteWMSStatesAvailable = Boolean.FALSE;
} else {
// let's check if the remote WFS tests are runnable
try {
remoteWMSStatesAvailable = Boolean.FALSE;
WebMapServer server = new WebMapServer(new URL(WMS_SERVER_URL + "service=WMS&request=GetCapabilities"), 5000);
for(Layer l : server.getCapabilities().getLayerList()) {
if("topp:states".equals(l.getName())) {
remoteWMSStatesAvailable = Boolean.TRUE;
break;
}
}
} catch(Exception e) {
logger.log(Level.WARNING, "Skipping remote WMS test, either demo " +
"is down or the topp:states layer is not there", e);
remoteWMSStatesAvailable = Boolean.FALSE;
}
}
}
return remoteWMSStatesAvailable.booleanValue();
}
}