/** * */ package org.gcube.spatial.data.geoutility; import java.util.HashMap; import java.util.List; import org.apache.log4j.Logger; import org.gcube.spatial.data.geoutility.bean.NcWmsLayerMetadata; import org.gcube.spatial.data.geoutility.bean.WmsParameters; import org.gcube.spatial.data.geoutility.wms.NcWmsGetMetadata; import org.gcube.spatial.data.geoutility.wms.NcWmsGetMetadataRequest; import org.gcube.spatial.data.geoutility.wms.WmsGetStyles; import org.gcube.spatial.data.geoutility.wms.WmsUrlValidator; /** * The Class GeoGetStyles. * * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it * Jan 22, 2016 * * return list of styles from a OGC compliant WMS/ncWMS map service like Geoserver, Thredds, Mapsever. */ public class GeoGetStyles { public static Logger logger = Logger.getLogger(GeoGetStyles.class); public static final String COLORSCALERANGE = "COLORSCALERANGE"; public static final String COLORSCALERANGE_DEFAULT_VALUE = "auto"; boolean isNcWms = false; private String wmsRequest; private HashMap mapWmsNotStandard; private WmsUrlValidator validator; /** * Instantiates a new geo get styles. * * @param wmsRequest the wms request * @throws Exception */ public GeoGetStyles(String wmsRequest) throws Exception{ this.wmsRequest = wmsRequest; this.validator = new WmsUrlValidator(wmsRequest); validator.parseWmsRequest(true, false); } /** * Gets the styles. * * @return the styles */ public List getStyles(){ String uriWMSService = validator.getBaseWmsServiceUrl(); String layerName = validator.getValueOfParsedWMSParameter(WmsParameters.LAYERS); String versionWms = validator.getValueOfParsedWMSParameter(WmsParameters.VERSION); String crs = validator.getValueOfParsedWMSParameter(WmsParameters.CRS); System.out.println(validator.getParameterValues().toString()); try { if(validator.getMapWmsNotStandardParams()!=null){ mapWmsNotStandard = new HashMap(validator.getMapWmsNotStandardParams().size()); mapWmsNotStandard.putAll(validator.getMapWmsNotStandardParams()); if(mapWmsNotStandard.containsKey(NcWmsGetMetadataRequest.COLORSCALERANGE) || mapWmsNotStandard.containsKey(NcWmsGetMetadataRequest.COLORSCALERANGE.toLowerCase())){ logger.debug("Ovveriding "+NcWmsGetMetadataRequest.COLORSCALERANGE +"?"); String value = mapWmsNotStandard.get(NcWmsGetMetadataRequest.COLORSCALERANGE); if(value.compareToIgnoreCase(NcWmsGetMetadataRequest.COLORSCALERANGE_DEFAULT_VALUE)==0){ //COLORSCALERANGE == 'auto'? logger.trace(NcWmsGetMetadataRequest.COLORSCALERANGE +" found like 'auto'.."); String[] minmax = NcWmsGetMetadataRequest.getColorScaleRange(uriWMSService, versionWms, validator.getValueOfParsedWMSParameter(WmsParameters.BBOX), layerName, crs, validator.getValueOfParsedWMSParameter(WmsParameters.WIDTH), validator.getValueOfParsedWMSParameter(WmsParameters.HEIGHT)); if(minmax!=null && minmax.length==2 && minmax[0]!=null && minmax[1]!=null){ String valueMinMax = minmax[0]+","+minmax[1]; mapWmsNotStandard.put(NcWmsGetMetadataRequest.COLORSCALERANGE, valueMinMax); logger.debug("Overrided "+NcWmsGetMetadataRequest.COLORSCALERANGE +" min,max value: "+valueMinMax); } }else{ logger.debug(NcWmsGetMetadataRequest.COLORSCALERANGE +" is not \'auto', skipping override"); } }else{ //NcWmsGetColorScaleRange.COLORSCALERANGE not found logger.debug(NcWmsGetMetadataRequest.COLORSCALERANGE +" not found"); String[] minmax = NcWmsGetMetadataRequest.getColorScaleRange(uriWMSService, versionWms, validator.getValueOfParsedWMSParameter(WmsParameters.BBOX), layerName, crs, validator.getValueOfParsedWMSParameter(WmsParameters.WIDTH), validator.getValueOfParsedWMSParameter(WmsParameters.HEIGHT)); if(minmax!=null && minmax.length==2 && minmax[0]!=null && minmax[1]!=null){ logger.debug(NcWmsGetMetadataRequest.GET_METADATA +" works, adding "+NcWmsGetMetadataRequest.COLORSCALERANGE + " with minmax"); String valueMinMax = minmax[0]+","+minmax[1]; mapWmsNotStandard.put(NcWmsGetMetadataRequest.COLORSCALERANGE, valueMinMax); logger.debug("Added "+NcWmsGetMetadataRequest.COLORSCALERANGE +" min,max value: "+valueMinMax); }else{ logger.debug(NcWmsGetMetadataRequest.GET_METADATA +" failed, skip "+NcWmsGetMetadataRequest.COLORSCALERANGE +" management, is not raster?"); } } } }catch (Exception e) { logger.error("Exception during ncWMS get style: "+e); } logger.trace("versionWms found: "+versionWms); logger.trace("crs found: "+crs); String stylesRead = validator.getValueOfParsedWMSParameter(WmsParameters.STYLES); logger.trace("styles found: "+stylesRead); List styles; //VALIDATION STYLES if(stylesRead==null || stylesRead.isEmpty()){ logger.trace("styles is empty - validator styles "+stylesRead); WmsGetStyles wmsGetStyles = new WmsGetStyles(); styles = wmsGetStyles.getStylesFromWms(uriWMSService, layerName); if(wmsGetStyles.getResponseCode()==200){ logger.debug("wms GetStyles found: "+styles); }else{ logger.debug("Tentative to get styles from NcWmsGetMetadata..."); isNcWms = true; try{ NcWmsLayerMetadata ncMetadata = NcWmsGetMetadata.getMetadata(uriWMSService, layerName); if(ncMetadata!=null && ncMetadata.getResponseCode()==200){ if(ncMetadata.getSupportedStyles().size()>0){ styles.add(ncMetadata.getSupportedStyles().get(0)+"/"+ncMetadata.getDefaultPalette()); //DEFAULT STYLE logger.debug("added ncWms default style: "+ncMetadata.getSupportedStyles().get(0)+"/"+ncMetadata.getDefaultPalette()); for (String s : ncMetadata.getSupportedStyles()) { for (String p : ncMetadata.getPalettes()) { String as = s+"/"+p; if(!styles.contains(as)){ styles.add(as); logger.trace("added ncWms style: "+as); } } } } } }catch(Exception e){ logger.error(e); styles = validator.getStylesAsList(); } } }else{ styles = validator.getStylesAsList(); } return styles; } /** * Checks if is nc wms. * * @return the isNcWms */ public boolean isNcWms() { return isNcWms; } /** * Gets the wms request. * * @return the wmsRequest */ public String getWmsRequest() { return wmsRequest; } /** * Gets the map wms not standard. * * @return the mapWmsNotStandard */ public HashMap getMapWmsNotStandard() { return mapWmsNotStandard; } /** * Gets the validator. * * @return the validator */ public WmsUrlValidator getValidator() { return validator; } /* (non-Javadoc) * @see java.lang.Object#toString() */ @Override public String toString() { StringBuilder builder = new StringBuilder(); builder.append("GetStylesUtils [isNcWms="); builder.append(isNcWms); builder.append(", wmsRequest="); builder.append(wmsRequest); builder.append(", mapWmsNotStandard="); builder.append(mapWmsNotStandard); builder.append(", validator="); builder.append(validator); builder.append("]"); return builder.toString(); } }