static WFSStrategy determineCorrectStrategy(URL getCapabilitiesRequest, Document capabilitiesDoc, String override) {
WFSStrategy strategy = null;
// override
if( override != null ){
if( override.equalsIgnoreCase("geoserver")){
strategy = new GeoServerStrategy();
}
else if( override.equalsIgnoreCase("mapserver")){
strategy = new MapServerStrategy();
}
else if( override.equalsIgnoreCase("arcgis")){
strategy = new ArcGISServerStrategy();
}
else if( override.equalsIgnoreCase("cubewerx")){
strategy = new CubeWerxStrategy();
}
else if( override.equalsIgnoreCase("ionic")){
strategy = new IonicStrategy();
}
else {
logger.warning("Could not handle wfs strategy override "+override+" proceeding with autodetection");
}
}
// auto detection
if( strategy == null ){
// look in comments for indication of CubeWerx server
NodeList childNodes = capabilitiesDoc.getChildNodes();
for (int i = 0; i < childNodes.getLength(); i++) {
Node child = childNodes.item(i);
if (child.getNodeType() == Node.COMMENT_NODE) {
String nodeValue = child.getNodeValue();
nodeValue = nodeValue.toLowerCase();
if (nodeValue.contains("cubewerx")) {
strategy = new CubeWerxStrategy();
break;
}
}
}
}
if (strategy == null) {
// Ionic declares its own namespace so that's our hook
Element root = capabilitiesDoc.getDocumentElement();
String ionicNs = root.getAttribute("xmlns:ionic");
if (ionicNs != null) {
if (ionicNs.equals("http://www.ionicsoft.com/versions/4")) {
strategy = new IonicStrategy();
} else if (ionicNs.startsWith("http://www.ionicsoft.com/versions")) {
logger
.warning("Found a Ionic server but the version may not match the strategy "
+ "we have (v.4). Ionic namespace url: " + ionicNs);
strategy = new IonicStrategy();
}
}
}
if (strategy == null) {
// guess server implementation from capabilities URI
String uri = getCapabilitiesRequest.toExternalForm();
if (uri.contains("geoserver")) {
strategy = new GeoServerStrategy();
}else if (uri.contains("/ArcGIS/services/")){
strategy = new ArcGISServerStrategy();
}
}