2016-01-22 15:19:10 +01:00
package org.gcube.spatial.data.geoutility.wms ;
import java.util.ArrayList ;
2019-10-24 17:22:32 +02:00
import java.util.Arrays ;
2016-01-22 15:19:10 +01:00
import java.util.HashMap ;
import java.util.List ;
import java.util.Map ;
import java.util.TreeMap ;
import org.gcube.spatial.data.geoutility.bean.WmsParameters ;
2016-04-28 11:31:09 +02:00
import org.slf4j.Logger ;
import org.slf4j.LoggerFactory ;
2016-01-22 15:19:10 +01:00
/ * *
* The Class WmsUrlValidator .
*
* @author Francesco Mangiacrapa francesco . mangiacrapa @isti.cnr.it
2016-01-26 14:18:03 +01:00
* Jan 25 , 2016
2016-01-22 15:19:10 +01:00
* /
public class WmsUrlValidator {
2016-01-26 14:18:03 +01:00
private HashMap < String , String > mapWmsParameters = new HashMap < String , String > ( ) ;
2016-01-22 15:19:10 +01:00
private String wmsRequest ;
private String baseWmsServiceUrl ;
private String wmsParameters ;
2016-01-26 14:18:03 +01:00
private String wmsNoStandardParameters = " " ;
2016-01-25 12:59:53 +01:00
private Map < String , String > mapWmsNoStandardParams ;
2016-04-28 11:31:09 +02:00
public static Logger logger = LoggerFactory . getLogger ( WmsUrlValidator . class ) ;
2016-01-22 15:19:10 +01:00
/ * *
* Instantiates a new wms url validator .
*
* @param wmsRequest the wms request
* /
public WmsUrlValidator ( String wmsRequest ) {
this . wmsRequest = wmsRequest ;
2019-10-24 17:22:32 +02:00
logger . debug ( " The wms request is: " + wmsRequest ) ;
2016-01-22 15:19:10 +01:00
int indexStart = wmsRequest . indexOf ( " ? " ) ;
if ( indexStart = = - 1 ) {
this . baseWmsServiceUrl = wmsRequest ;
this . wmsParameters = null ;
} else {
this . baseWmsServiceUrl = wmsRequest . substring ( 0 , indexStart ) ;
this . baseWmsServiceUrl . trim ( ) ;
this . wmsParameters = wmsRequest . substring ( indexStart + 1 , this . wmsRequest . length ( ) ) ;
this . wmsParameters . trim ( ) ;
}
}
/ * *
* Parses the wms request .
*
* @param returnEmptyParameter the return empty parameter
* @param fillEmptyParameterAsDefaultValue the fill empty parameter as default
2016-01-26 14:18:03 +01:00
* @return the wms request uri builded
* @throws Exception the exception
2016-01-22 15:19:10 +01:00
* /
public String parseWmsRequest ( boolean returnEmptyParameter , boolean fillEmptyParameterAsDefaultValue ) throws Exception {
if ( wmsParameters = = null | | wmsParameters . isEmpty ( ) ) {
String msg = " IT IS NOT POSSIBLE TO PARSE WMS URL, 'WMS PARAMETERS' not found! " ;
// logger.trace(msg);
throw new Exception ( msg ) ;
}
for ( WmsParameters wmsParam : WmsParameters . values ( ) ) {
if ( wmsParam . equals ( WmsParameters . BBOX ) ) {
String value = validateValueOfParameter ( WmsParameters . BBOX , wmsParameters , fillEmptyParameterAsDefaultValue ) ;
2016-01-26 14:18:03 +01:00
mapWmsParameters . put ( wmsParam . getParameter ( ) , value ) ;
2016-01-22 15:19:10 +01:00
}
if ( wmsParam . equals ( WmsParameters . FORMAT ) ) {
String value = validateValueOfParameter ( WmsParameters . FORMAT , wmsParameters , fillEmptyParameterAsDefaultValue ) ;
2016-01-26 14:18:03 +01:00
mapWmsParameters . put ( wmsParam . getParameter ( ) , value ) ;
2016-01-22 15:19:10 +01:00
}
if ( wmsParam . equals ( WmsParameters . HEIGHT ) ) {
String value = validateValueOfParameter ( WmsParameters . HEIGHT , wmsParameters , fillEmptyParameterAsDefaultValue ) ;
2016-01-26 14:18:03 +01:00
mapWmsParameters . put ( wmsParam . getParameter ( ) , value ) ;
2016-01-22 15:19:10 +01:00
}
if ( wmsParam . equals ( WmsParameters . CRS ) ) {
String crs = validateValueOfParameter ( WmsParameters . CRS , wmsParameters , fillEmptyParameterAsDefaultValue ) ;
2016-01-26 14:18:03 +01:00
mapWmsParameters . put ( wmsParam . getParameter ( ) , crs ) ;
2016-01-22 15:19:10 +01:00
}
if ( wmsParam . equals ( WmsParameters . WIDTH ) ) {
String value = validateValueOfParameter ( WmsParameters . WIDTH , wmsParameters , fillEmptyParameterAsDefaultValue ) ;
2016-01-26 14:18:03 +01:00
mapWmsParameters . put ( wmsParam . getParameter ( ) , value ) ;
2016-01-22 15:19:10 +01:00
}
if ( wmsParam . equals ( WmsParameters . REQUEST ) ) {
String value = validateValueOfParameter ( WmsParameters . REQUEST , wmsParameters , fillEmptyParameterAsDefaultValue ) ;
2016-01-26 14:18:03 +01:00
mapWmsParameters . put ( wmsParam . getParameter ( ) , value ) ;
2016-01-22 15:19:10 +01:00
}
if ( wmsParam . equals ( WmsParameters . SERVICE ) ) {
String value = validateValueOfParameter ( WmsParameters . SERVICE , wmsParameters , fillEmptyParameterAsDefaultValue ) ;
2016-01-26 14:18:03 +01:00
mapWmsParameters . put ( wmsParam . getParameter ( ) , value ) ;
2016-01-22 15:19:10 +01:00
}
if ( wmsParam . equals ( WmsParameters . SRS ) ) {
String value = validateValueOfParameter ( WmsParameters . SRS , wmsParameters , fillEmptyParameterAsDefaultValue ) ;
2016-01-26 14:18:03 +01:00
mapWmsParameters . put ( wmsParam . getParameter ( ) , value ) ;
2016-01-22 15:19:10 +01:00
}
if ( wmsParam . equals ( WmsParameters . STYLES ) ) {
String styles = validateValueOfParameter ( WmsParameters . STYLES , wmsParameters , fillEmptyParameterAsDefaultValue ) ;
2016-01-26 14:18:03 +01:00
mapWmsParameters . put ( wmsParam . getParameter ( ) , styles ) ;
2016-01-22 15:19:10 +01:00
}
if ( wmsParam . equals ( WmsParameters . VERSION ) ) {
String version = validateValueOfParameter ( WmsParameters . VERSION , wmsParameters , fillEmptyParameterAsDefaultValue ) ;
2016-01-26 14:18:03 +01:00
mapWmsParameters . put ( wmsParam . getParameter ( ) , version ) ;
2016-01-22 15:19:10 +01:00
}
if ( wmsParam . equals ( WmsParameters . LAYERS ) ) {
String layers = validateValueOfParameter ( WmsParameters . LAYERS , wmsParameters , fillEmptyParameterAsDefaultValue ) ;
2016-01-26 14:18:03 +01:00
mapWmsParameters . put ( wmsParam . getParameter ( ) , layers ) ;
2016-01-22 15:19:10 +01:00
}
}
String parsedWmsRequest = baseWmsServiceUrl + " ? " ;
String [ ] params = wmsParameters . split ( " & " ) ;
//CREATING MAP TO RETURN WMS PARAMETERS NOT STANDARD
2016-01-25 12:59:53 +01:00
mapWmsNoStandardParams = new TreeMap < String , String > ( String . CASE_INSENSITIVE_ORDER ) ;
2016-01-22 15:19:10 +01:00
2019-10-24 17:22:32 +02:00
if ( params . length > 0 ) {
logger . debug ( " Params are: " + Arrays . asList ( params ) ) ;
for ( String param : params ) {
if ( param ! = null & & ! param . isEmpty ( ) ) {
int ei = param . indexOf ( " = " ) ;
String key = param . substring ( 0 , ei ) ;
String value = param . substring ( ei + 1 , param . length ( ) ) ;
mapWmsNoStandardParams . put ( key , value ) ;
}
}
2016-01-22 15:19:10 +01:00
}
//CREATE WMS REQUEST
2016-01-26 14:18:03 +01:00
for ( String key : mapWmsParameters . keySet ( ) ) {
2016-01-22 15:19:10 +01:00
2016-01-26 14:18:03 +01:00
String value = mapWmsParameters . get ( key ) ;
2016-01-25 12:59:53 +01:00
if ( returnEmptyParameter | | ! ( value = = null ) & & ! value . isEmpty ( ) ) {
2016-01-22 15:19:10 +01:00
parsedWmsRequest + = key + " = " + value ;
parsedWmsRequest + = " & " ;
}
2016-01-25 12:59:53 +01:00
/ * if ( ! returnEmptyParameter & & ( value = = null | | value . isEmpty ( ) ) ) {
} else {
fullWmsRequest + = key + " = " + value ;
fullWmsRequest + = " & " ;
} * /
2016-01-26 14:18:03 +01:00
String exist = mapWmsParameters . get ( key ) ;
2016-01-25 12:59:53 +01:00
if ( exist ! = null )
mapWmsNoStandardParams . remove ( key ) ; //REMOVE WMS STANDARD PARAMETER FROM MAP
2016-01-22 15:19:10 +01:00
}
2016-01-25 12:59:53 +01:00
for ( String key : mapWmsNoStandardParams . keySet ( ) ) {
2016-01-26 14:18:03 +01:00
wmsNoStandardParameters + = key + " = " + mapWmsNoStandardParams . get ( key ) + " & " ;
2016-01-22 15:19:10 +01:00
}
2016-01-26 14:18:03 +01:00
if ( wmsNoStandardParameters . length ( ) > 0 )
wmsNoStandardParameters = wmsNoStandardParameters . substring ( 0 , wmsNoStandardParameters . length ( ) - 1 ) ; //REMOVE LAST &
2016-01-22 15:19:10 +01:00
2016-01-26 14:18:03 +01:00
logger . trace ( " wmsNotStandardParameters: " + wmsNoStandardParameters ) ;
2016-01-22 15:19:10 +01:00
String fullWmsUrlBuilded ;
2016-01-26 14:18:03 +01:00
if ( ! wmsNoStandardParameters . isEmpty ( ) ) {
fullWmsUrlBuilded = parsedWmsRequest + wmsNoStandardParameters ; //remove last &
logger . trace ( " full wms url builded + wms no standard parameters: " + fullWmsUrlBuilded ) ;
2016-01-22 15:19:10 +01:00
} else {
fullWmsUrlBuilded = parsedWmsRequest . substring ( 0 , parsedWmsRequest . length ( ) - 1 ) ; //remove last &
2016-04-28 11:31:09 +02:00
logger . trace ( " WmsUrlValidator parseWmsRequest returning, full wms url builded: " + fullWmsUrlBuilded ) ;
2016-01-22 15:19:10 +01:00
}
return fullWmsUrlBuilded ;
}
2016-01-26 14:18:03 +01:00
2016-01-22 15:19:10 +01:00
/ * *
2016-01-26 14:18:03 +01:00
* Gets the map wms parameters .
*
* @return the map wms parameters
2016-01-22 15:19:10 +01:00
* /
2016-01-26 14:18:03 +01:00
public HashMap < String , String > getMapWmsParameters ( ) {
2016-01-22 16:54:09 +01:00
2016-01-26 14:18:03 +01:00
return mapWmsParameters ;
2016-01-22 15:19:10 +01:00
}
/ * *
2016-01-26 14:18:03 +01:00
* Gets the wms request .
*
2016-01-22 15:19:10 +01:00
* @return the wmsRequest
* /
public String getWmsRequest ( ) {
return wmsRequest ;
}
/ * *
2016-01-26 14:18:03 +01:00
* Gets the base wms service url .
*
2016-01-22 15:19:10 +01:00
* @return the baseWmsServiceUrl
* /
public String getBaseWmsServiceUrl ( ) {
return baseWmsServiceUrl ;
}
/ * *
2016-01-26 14:18:03 +01:00
* Gets the wms no standard parameters .
2016-01-22 15:19:10 +01:00
*
2016-01-26 14:18:03 +01:00
* @return the wms no standard parameters like a query string ( param1 = value1 & param2 = value2 & . . . )
2016-01-22 15:19:10 +01:00
* /
2016-01-26 14:18:03 +01:00
public String getWmsNoStandardParameters ( ) {
return wmsNoStandardParameters ;
2016-01-22 15:19:10 +01:00
}
/ * *
* Gets the value of parsed wms parameter .
*
* @param parameter the parameter
* @return the value of parsed wms parameter parsed from wms request .
* /
public String getValueOfParsedWMSParameter ( WmsParameters parameter ) {
2016-01-26 14:18:03 +01:00
return mapWmsParameters . get ( parameter . getParameter ( ) ) ;
2016-01-22 15:19:10 +01:00
}
/ * *
* Validate value of parameter .
*
* @param wmsParam the wms param
2016-04-28 11:31:09 +02:00
* @param queryStringParameters the value of parameter
2016-01-22 15:19:10 +01:00
* @param fillEmptyParameterAsDefaultValue the fill empty parameter as default value
* @return the string
* /
2016-04-28 11:31:09 +02:00
public static String validateValueOfParameter ( WmsParameters wmsParam , String queryStringParameters , boolean fillEmptyParameterAsDefaultValue ) {
2016-01-22 15:19:10 +01:00
try {
2016-04-28 11:31:09 +02:00
logger . trace ( " validateValueOfParameter wmsParam " + wmsParam + " with queryStringParameters " + queryStringParameters ) ;
String value = getValueOfParameter ( wmsParam , queryStringParameters ) ;
logger . trace ( " validateValueOfParameter wmsParam " + wmsParam + " value " + value ) ;
2016-01-22 15:19:10 +01:00
if ( fillEmptyParameterAsDefaultValue & & ( value = = null | | value . isEmpty ( ) ) ) {
2016-01-26 14:18:03 +01:00
logger . trace ( " setting empty value for parameter: " + wmsParam . getParameter ( ) + " , as default value: " + wmsParam . getValue ( ) ) ;
2016-01-22 15:19:10 +01:00
value = wmsParam . getValue ( ) ;
}
return value ;
} catch ( Exception e ) {
//silent
return null ;
}
}
/ * *
* Gets the value of parameter .
*
* @param wmsParam the wms param
* @param wmsRequestParamaters the url wms parameters
* @return the value of parameter or null if parameter not exists
* /
public static String getValueOfParameter ( WmsParameters wmsParam , String wmsRequestParamaters ) {
// logger.trace("finding: "+wmsParam +" into "+url);
2016-04-28 11:31:09 +02:00
int index = wmsRequestParamaters . toLowerCase ( ) . indexOf ( wmsParam . getParameter ( ) . toLowerCase ( ) + " = " ) ; //ADDING CHAR "=" IN TAIL TO BE SECURE IT IS A PARAMETER
2016-01-22 15:19:10 +01:00
// logger.trace("start index of "+wmsParam+ " is: "+index);
String value = " " ;
if ( index > - 1 ) {
int start = index + wmsParam . getParameter ( ) . length ( ) + 1 ; //add +1 for char '='
String sub = wmsRequestParamaters . substring ( start , wmsRequestParamaters . length ( ) ) ;
int indexOfSeparator = sub . indexOf ( " & " ) ;
int end = indexOfSeparator ! = - 1 ? indexOfSeparator : sub . length ( ) ;
value = sub . substring ( 0 , end ) ;
} else
return null ;
// logger.trace("return value: "+value);
return value ;
}
/ * *
* Sets the value of parameter .
*
* @param wmsParam the wms param
* @param wmsRequestParameters the wms url parameters
* @param newValue the new value
* @param addIfNotExists add the parameter if not exists
* @return the string
* /
public static String setValueOfParameter ( WmsParameters wmsParam , String wmsRequestParameters , String newValue , boolean addIfNotExists ) {
String toLowerWmsUrlParameters = wmsRequestParameters . toLowerCase ( ) ;
String toLowerWmsParam = wmsParam . getParameter ( ) . toLowerCase ( ) ;
2016-04-28 11:31:09 +02:00
int index = toLowerWmsUrlParameters . indexOf ( toLowerWmsParam + " = " ) ; //END WITH CHAR "=" TO BE SECURE IT IS A PARAMETER
2016-01-22 15:19:10 +01:00
// logger.trace("start index of "+wmsParam+ " is: "+index);
if ( index > - 1 ) {
int indexStartValue = index + toLowerWmsParam . length ( ) + 1 ; //add +1 for char '='
int indexOfSeparator = toLowerWmsUrlParameters . indexOf ( " & " , indexStartValue ) ; //GET THE FIRST "&" STARTING FROM INDEX VALUE
// logger.trace("indexOfSeparator index of "+wmsParam+ " is: "+indexOfSeparator);
int indexEndValue = indexOfSeparator ! = - 1 ? indexOfSeparator : toLowerWmsUrlParameters . length ( ) ;
// logger.trace("end: "+indexEndValue);
return wmsRequestParameters . substring ( 0 , indexStartValue ) + newValue + wmsRequestParameters . substring ( indexEndValue , wmsRequestParameters . length ( ) ) ;
} else if ( addIfNotExists ) {
wmsRequestParameters + = " & " + wmsParam . getParameter ( ) + " = " + newValue ;
}
// logger.trace("return value: "+value);
return wmsRequestParameters ;
}
/ * *
* Gets the styles as list .
*
* @return the styles as list
* /
public List < String > getStylesAsList ( ) {
List < String > listStyles = new ArrayList < String > ( ) ;
String styles = getValueOfParsedWMSParameter ( WmsParameters . STYLES ) ;
if ( styles ! = null & & ! styles . isEmpty ( ) ) {
String [ ] arrayStyle = styles . split ( " , " ) ;
for ( String style : arrayStyle ) {
if ( style ! = null & & ! style . isEmpty ( ) )
listStyles . add ( style ) ;
}
}
return listStyles ;
}
/ * *
2016-01-25 12:59:53 +01:00
* Gets the map wms no standard params .
2016-01-22 15:19:10 +01:00
*
2016-01-25 12:59:53 +01:00
* @return an empty map if WMS no standard parameters don ' t exist
2016-01-22 15:19:10 +01:00
* /
2016-01-25 12:59:53 +01:00
public Map < String , String > getMapWmsNoStandardParams ( ) {
return mapWmsNoStandardParams = = null ? new HashMap < String , String > ( 1 ) : mapWmsNoStandardParams ;
2016-01-22 15:19:10 +01:00
}
2016-01-22 16:54:09 +01:00
/ * ( non - Javadoc )
* @see java . lang . Object # toString ( )
* /
@Override
public String toString ( ) {
StringBuilder builder = new StringBuilder ( ) ;
2016-01-26 14:18:03 +01:00
builder . append ( " WmsUrlValidator [mapWmsParameters= " ) ;
builder . append ( mapWmsParameters ) ;
2016-01-22 16:54:09 +01:00
builder . append ( " , wmsRequest= " ) ;
builder . append ( wmsRequest ) ;
builder . append ( " , baseWmsServiceUrl= " ) ;
builder . append ( baseWmsServiceUrl ) ;
builder . append ( " , wmsParameters= " ) ;
builder . append ( wmsParameters ) ;
builder . append ( " , wmsNotStandardParameters= " ) ;
2016-01-26 14:18:03 +01:00
builder . append ( wmsNoStandardParameters ) ;
2016-01-25 12:59:53 +01:00
builder . append ( " , mapWmsNoStandardParams= " ) ;
builder . append ( mapWmsNoStandardParams ) ;
2016-01-22 16:54:09 +01:00
builder . append ( " ] " ) ;
return builder . toString ( ) ;
}
2016-01-22 15:19:10 +01:00
/ * *
* The main method .
*
* @param args the arguments
* /
2016-01-26 14:18:03 +01:00
public static void main ( String [ ] args ) {
2016-01-22 15:19:10 +01:00
// String baseGeoserverUrl = "http://repoigg.services.iit.cnr.it:8080/geoserver/IGG/ows";
// String baseGeoserverUrl = "http://www.fao.org/figis/geoserver/species";
// String fullPath = "http://www.fao.org/figis/geoserver/species?SERVICE=WMS&BBOX=-176.0,-90.0,180.0,90&styles=Species_prob, puppa&layers=layerName&FORMAT=image/gif";
// String fullPath = "http://repoigg.services.iit.cnr.it:8080/geoserver/IGG/ows?service=wms&version=1.1.0&request=GetMap&layers==IGG:area_temp_1000&width=676&height=330&srs=EPSG:4326&crs=EPSG:4326&format=application/openlayers&bbox=-85.5,-180.0,90.0,180.0";
// String baseGeoserverUrl = "http://thredds-d-d4s.d4science.org/thredds/wms/public/netcdf/test20.nc";
// String fullPath = "http://thredds-d-d4s.d4science.org/thredds/wms/public/netcdf/test20.nc?service=wms&version=1.3.0&request=GetMap&layers=analyzed_field&bbox=-85.0,-180.0,85.0,180.0&styles=&width=640&height=480&srs=EPSG:4326&CRS=EPSG:4326&format=image/png&COLORSCALERANGE=auto";
// WmsUrlValidator validator = new WmsUrlValidator(baseGeoserverUrl, fullPath , "", false);
// logger.trace("base wms service url: "+validator.getBaseWmsServiceUrl());
// logger.trace("layer name: "+validator.getLayerName());
// logger.trace("full wms url: "+validator.getFullWmsUrlRequest(false, true));
// logger.trace("style: "+validator.getStyles());
// logger.trace("not standard parameter: "+validator.getWmsNotStandardParameters());
// String[] arrayStyle = validator.getStyles().split(",");
//
// if(arrayStyle!=null && arrayStyle.length>0){
//
// for (String style : arrayStyle) {
// if(style!=null && !style.isEmpty())
//
// System.out.println("Style: "+style.trim());
// }
// }
//
2016-04-28 11:31:09 +02:00
// String fullPath = "http://www.fao.org/figis/geoserver/species/ows?CRS=EPSG:4326&BBOX=-180,-90,180,90&VERSION=1.1.0&FORMAT=image/png&SERVICE=WMS&HEIGHT=230&LAYERS=&REQUEST=GetMap&STYLES=&SRS=EPSG:4326&WIDTH=676";
// fullPath = WmsUrlValidator.setValueOfParameter(WmsParameters.LAYERS, fullPath, "123", true);
// System.out.println(fullPath);
String wmsRequest = " http://geoserver-dev.d4science-ii.research-infrastructures.eu/geoserver/wms?CRS=EPSG:4326&BBOX=-85.5,-180.0,90.0,180.0&VERSION=1.1.0&FORMAT=application/openlayers&SERVICE=wms&HEIGHT=330&LAYERS=aquamaps:lsoleasolea20130716162322254cest&REQUEST=GetMap&STYLES=Species_prob&SRS=EPSG:4326&WIDTH=676 " ;
// String wmsRequest = "http://thredds-d-d4s.d4science.org/thredds/wms/public/netcdf/test20.nc?service=wms&version=1.3.0&request=GetMap&layers=analyzed_field&styles=&width=640&height=480&srs=EPSG:4326&CRS=EPSG:4326&format=image/png&COLORSCALERANGE=auto&bbox=-85.0,-180.0,85.0,180.0";
WmsUrlValidator wms ;
try {
wms = new WmsUrlValidator ( wmsRequest ) ;
System . out . println ( " Returned wms: " + wms . toString ( ) ) ;
}
catch ( Exception e ) {
// TODO Auto-generated catch block
e . printStackTrace ( ) ;
}
2016-01-22 15:19:10 +01:00
//
2016-01-26 14:18:03 +01:00
}
2016-01-22 15:19:10 +01:00
}