/*
* GeoTools - The Open Source Java GIS Toolkit
* http://geotools.org
*
* (C) 2004-2008, Open Source Geospatial Foundation (OSGeo)
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*/
package org.geotools.data.wms.test;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.PrintStream;
import java.net.URL;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.Random;
import javax.imageio.ImageIO;
import junit.framework.TestCase;
import org.geotools.data.ows.CRSEnvelope;
import org.geotools.data.ows.Layer;
import org.geotools.data.ows.WMSCapabilities;
import org.geotools.data.wms.WebMapServer;
import org.geotools.data.wms.request.GetMapRequest;
import org.geotools.data.wms.response.GetMapResponse;
import org.geotools.ows.ServiceException;
import org.xml.sax.SAXException;
public class ServersTest extends TestCase {
public void testServers() throws Exception{
List servers = new ArrayList();
/*
File serverFile = TestData.file(this, "servers.txt");
BufferedReader br = new BufferedReader(new FileReader(serverFile));
String line = null;
while ((line = br.readLine()) != null) {
try {
servers.add(new URL(line));
} catch (MalformedURLException e) {
}
}
*/
//servers.add(new URL("http://office.refractions.net/~chodgson/googlemaps/googlewms.php?request=getcapabilities"));
// URL[] servers = new URL[50];
// servers[0] = new URL("http://wms.jpl.nasa.gov/wms.cgi?VERSION=1.1.1&SERVICE=WMS&REQUEST=GetCapabilities");
// servers[1] = new URL("http://demo.cubewerx.com/demo/cubeserv/cubeserv.cgi?CONFIG=main&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetCapabilities");
// servers[2] = new URL("http://www2.dmsolutions.ca/cgi-bin/mswms_gmap?VERSION=1.1.0&REQUEST=GetCapabilities");
// This returning Gzip content
// servers[3] = new URL("http://wms.cits.rncan.gc.ca/cgi-bin/cubeserv.cgi?VERSION=1.1.0&REQUEST=GetCapabilities");
// servers[4] = new URL("http://terraservice.net/ogccapabilities.ashx?version=1.1.1&request=GetCapabilties");
// servers[5] = new URL("http://www2.demis.nl/mapserver/Request.asp?VERSION=1.3.0&SERVICE=WMS&REQUEST=GetCapabilities");
//THIS ONE OFFLINE
// servers[6] = new URL("http://datamil.udel.edu/servlet/com.esri.wms.Esrimap?servicename=DE_census2k_sf1&VERSION=1.0.0&request=capabilities");
// servers[7] = new URL("http://www.lifemapper.org/Services/WMS/?Service=WMS&VERSION=1.1.1&request=getcapabilities");
// this server returns OGC for 1.3.0
// servers[8] = new URL("http://globe.digitalearth.gov/viz-bin/wmt.cgi?VERSION=1.1.0&Request=GetCapabilities");
// servers[9] = new URL("http://www.geographynetwork.ca/wmsconnector/com.esri.wsit.WMSServlet/Geobase_NRN_NewfoundlandAndLabrador_I_Detail?request=GetCapabilities");
// servers[10] = new URL("http://gisdata.usgs.net/servlet/com.esri.wms.Esrimap?REQUEST=GetCapabilities&VERSION=1.3.0&SERVICE=WMS");
// servers[11] = new URL("http://www.refractions.net:8080/geoserver/wms/?SERVICE=WMS&REQUEST=GetCapabilities&VERSION=1.3.0"); //$NON-NLS-1$
//1.0.0 freezes.
// servers[12] = new URL("http://mapserv2.esrin.esa.it/cubestor/cubeserv/cubeserv.cgi?VERSION=1.1.1&REQUEST=GetCapabilities&SERVICE=WMS");
// servers[13] = new URL("http://mesonet.agron.iastate.edu/wms/comprad.php?request=getcapabilities");
// servers[14] = new URL("http://redspider.us/ionicweb/wfs/METRODC?request=getcapabilities&service=WMS&version=1.1.1");
// servers[15] = new URL("http://webservices.ionicsoft.com/ionicweb/wfs/BOSTON_ORA?service=WMS&request=GetCapabilities&vesrion=1.1.1");
// servers[16] = new URL("http://oceanesip.jpl.nasa.gov/de.xml");
// servers[17] = new URL("http://libcwms.gov.bc.ca/wmsconnector/com.esri.wsit.WMSServlet/ogc_layer_service?REQUEST=capabilities");
// servers[18] = new URL("http://www.geographynetwork.com/servlet/com.esri.wms.Esrimap?ServiceName=GFW_Forest&VERSION=1.0.0&request=capabilities");
// servers[19] = new URL("http://atlas.gc.ca/cgi-bin/atlaswms_en?VERSION=1.1.0&request=GetCapabilities");
//OFFLINE servers[20] = new URL("http://office.refractions.net:4001/cgi-bin/mapserv?map=/opt/dra2/orthophotos/tiles.map&request=getcapabilities");
// servers[21] = new URL("http://mesonet.agron.iastate.edu/wms/comprad.php?request=getcapabilities");
// servers[22] = new URL("http://wms.larioja.org/request.asp?request=getcapabilities");
// servers[23] = new URL("http://atlas.walis.wa.gov.au/servlet/com.esri.wms.Esrimap?VERSION=1.1.0&Request=getcapabilities");
// servers[24] = new URL("http://iceds.ge.ucl.ac.uk/cgi-bin/wms?map=wms.map&SERVICE=WMS&REQUEST=GetCapabilities");
// servers[25] = new URL("http://test.landmap.ac.uk/ecwp/ecw_wms.dll?request=GetCapabilities&service=wms");
// servers[26] = new URL("http://emandev.cciw.ca/cgi-bin/mapserver/mapserv.exe?REQUEST=GetCapabilities&MAP=C:/Inetpub/wwwroot/emanco/cgi-bin/mapserver/naturewatch.map&VERSION=1.1.1&SERVICE=WMS");
int total = 0;
int passedCount = 0;
for (int i = 0; i < servers.size(); i++) {
URL server = (URL) servers.get(i);
total++;
Random random = new Random();
String dir = "tests";
String filename = URLEncoder.encode(server.getHost()+random.nextInt(10000),"UTF-8");
// File file = new File("C:\\"+dir+"\\"+filename+".txt");
// file.createNewFile();
// PrintStream out = new PrintStream(new FileOutputStream(file));
PrintStream out = System.out;
boolean passed = serverTest(out, server);
out.flush();
out.close();
if (passed) {
//System.out.println(server.toExternalForm() + " passed.");
passedCount++;
// file.delete();
} else {
//System.out.println(server.toExternalForm() + " failed.");
}
// WebMapServer wms = new WebMapServer(servers[i]);
// assertNotNull("Missing Capabilities",wms.getCapabilities());
// WMSCapabilities capabilities = wms.getCapabilities();
// assertNotNull(capabilities.getRequest());
}
// System.out.println("Total tested: "+total);
// System.out.println("Total passed: "+passedCount);
}
public boolean serverTest(PrintStream out, URL url) {
WebMapServer wms = null;
boolean passed = true;
out.println("Beginning tests for server:");
out.println(url);
out.print("Parsing Capabilities...");
try {
wms = new WebMapServer(url);
out.println("passed.");
} catch (ServiceException e) {
out.println("failed.");
passed = false;
while (e != null) {
if (e.getLocator() != null && e.getLocator().length() != 0) {
out.println("ServiceException at "+e.getLocator()+": "+e.getMessage()+"("+e.getCode()+")");
}
out.println("ServiceException: "+e.getMessage()+"("+e.getCode()+")");
e = e.getNext();
}
return passed;
} catch (IOException e) {
out.println("failed.");
passed = false;
out.println("IOException: "+e.getMessage());
e.printStackTrace(out);
return passed;
} catch (SAXException e) {
out.println("failed.");
passed = false;
out.println("SAXException: "+e.getMessage());
e.printStackTrace(out);
return passed;
}
WMSCapabilities caps = wms.getCapabilities();
assertNotNull(caps);
out.println("Validating layer LatLonBoundingBoxes...");
Iterator iter = caps.getLayerList().iterator();
while (iter.hasNext()) {
Layer layer = (Layer) iter.next();
if (layer.getLatLonBoundingBox() == null) {
if (layer.getName() != null) {
out.println("WARNING: Layer '"+layer.getName()+"' contains no LatLonBoundingBox.");
passed = false;
}
}
}
Layer layer = null;
out.print("Looking for a named layer...");
iter = caps.getLayerList().iterator();
while (iter.hasNext()) {
Layer tempLayer = (Layer) iter.next();
if (tempLayer.getName() != null) {
layer = tempLayer;
out.println("found one. Using layer '"+layer.getName()+"'");
break;
}
}
String format = null;
if (layer == null) {
out.println("server contains no named layers. Cannot perform GetMap requests on it");
passed = false;
} else {
out.print("Checking for GetMap operation...");
if (caps.getRequest().getGetMap() == null) {
out.println("NOT FOUND. Will attempt a request using 'image/gif' anyway.");
passed = false;
format = "image/gif";
} else {
out.println("found.");
out.print("Searching for a suitable format...");
List formats = caps.getRequest().getGetMap().getFormats();
if (formats.contains("image/png")) {
format = "image/png";
out.println("using 'image/png'.");
}
if (format == null && formats.contains("image/gif")) {
format = "image/gif";
out.println("using 'image/gif'.");
}
if (format == null && formats.contains("image/jpeg")) {
format = "image/jpeg";
out.println("using 'image/jpeg'.");
}
if (format == null) {
format = (String) formats.get(0);
out.println("server does not support GIF, PNG or JPEG. Using '"+format+"'");
passed = false;
}
}
}
out.print("Performing GetMap operation...");
GetMapRequest request = wms.createGetMapRequest();
request.addLayer(layer);
CRSEnvelope bbox = layer.getLatLonBoundingBox();
request.setBBox(bbox);
request.setFormat(format);
request.setSRS("EPSG:4326");
request.setDimensions("100","100");
try {
GetMapResponse response = wms.issueRequest(request);
out.println("received a response.");
out.print("Checking returned format...");
if (response.getContentType().indexOf(format) == -1) {
out.println("server returned bad format. Expected "+format+", got "+response.getContentType()+".");
passed = false;
} else {
out.println("passed.");
}
out.print("Checking dimensions...");
BufferedImage image = ImageIO.read(response.getInputStream());
if (image == null) {
out.println("returned a bad image. ContentType is "+response.getContentType());
passed = false;
} else if (image.getWidth() != 100 || image.getHeight() != 100) {
out.println("server returned bad dimensions. Expect 100, 100. Returned "+image.getWidth()+","+image.getHeight());
passed = false;
} else {
out.println("passed.");
}
} catch (ServiceException e) {
out.println("failed.");
passed = false;
while (e != null) {
if (e.getLocator() != null && e.getLocator().length() != 0) {
out.println("ServiceException at "+e.getLocator()+": "+e.getMessage()+"("+e.getCode()+")");
}
out.println("ServiceException: "+e.getMessage()+"("+e.getCode()+")");
e = e.getNext();
}
} catch (IOException e) {
out.println("failed.");
passed = false;
out.println("IOException: "+e.getMessage());
e.printStackTrace(out);
} catch (SAXException e) {
out.println("failed.");
passed = false;
out.println("SAXException: "+e.getMessage());
e.printStackTrace(out);
} finally {
out.println(request.getFinalURL());
}
// if (caps.getRequest().getGetFeatureInfo() != null) {
// out.println("");
// out.println("Server supports GetFeatureInfo requests. Beginning tests.");
//
// Layer qLayer = null;
// out.print("Locating a queryable layer...");
// Set qLayers = WMSUtils.getQueryableLayers(caps);
// if (qLayers != null && qLayers.size() != 0) {
// qLayer = (Layer) qLayers.iterator().next();
// out.println("found layer '"+qLayer.getName()+"'.");
// } else {
// out.println("NOT FOUND");
// passed = false;
// }
//
// if (qLayer != null) {
// GetFeatureInfoRequest gfiRequest = wms.createGetFeatureInfoRequest(request);
// gfiRequest.addQueryLayer(qLayer);
// gfiRequest.setFeatureCount(5);
// gfiRequest.setQueryPoint(50,50);
//
// String gfiFormat = caps.getRequest().getGetFeatureInfo().getFormatStrings()[0];
// out.println("Using "+gfiFormat+" as format during GetFeatureInfo request.");
//
// gfiRequest.setInfoFormat(gfiFormat);
//
// try {
// out.print("Performing GetFeatureInfo request...");
// GetFeatureInfoResponse response = wms.issueRequest(gfiRequest);
// out.println("response received.");
//
// out.print("Checking returned format...");
// if (response.getContentType().indexOf(gfiFormat) == -1) {
// out.println("server returned bad format. Expected "+gfiFormat+", got "+response.getContentType()+".");
// passed = false;
// } else {
// out.println("passed.");
// }
// } catch (ServiceException e) {
// out.println("failed.");
// passed = false;
// while (e != null) {
// if (e.getLocator() != null && e.getLocator().length() != 0) {
// out.println("ServiceException at "+e.getLocator()+": "+e.getMessage()+"("+e.getCode()+")");
// }
// out.println("ServiceException: "+e.getMessage()+"("+e.getCode()+")");
// e = e.getNext();
// }
// } catch (IOException e) {
// out.println("failed.");
// passed = false;
// out.println("IOException: "+e.getMessage());
// e.printStackTrace(out);
// } catch (SAXException e) {
// out.println("failed.");
// passed = false;
// out.println("SAXException: "+e.getMessage());
// e.printStackTrace(out);
// } finally {
// out.println(gfiRequest.getFinalURL());
// }
// }
// }
return passed;
}
}