Revision: 4663 http://sourceforge.net/p/jump-pilot/code/4663 Author: bertazza Date: 2015-12-23 16:26:41 +0000 (Wed, 23 Dec 2015) Log Message: ----------- Info feature tool: added a pane to show WMS info.
Modified Paths: -------------- core/trunk/ChangeLog core/trunk/src/com/vividsolutions/jump/workbench/ui/InfoFrame.java core/trunk/src/com/vividsolutions/jump/workbench/ui/PrimaryInfoFrame.java core/trunk/src/com/vividsolutions/jump/workbench/ui/TaskFrame.java core/trunk/src/com/vividsolutions/jump/workbench/ui/cursortool/FeatureInfoTool.java core/trunk/src/com/vividsolutions/wms/AbstractParser.java core/trunk/src/com/vividsolutions/wms/Capabilities.java core/trunk/src/com/vividsolutions/wms/MapLayer.java core/trunk/src/com/vividsolutions/wms/ParserWMS1_0.java core/trunk/src/com/vividsolutions/wms/ParserWMS1_1.java core/trunk/src/com/vividsolutions/wms/ParserWMS1_3.java core/trunk/src/com/vividsolutions/wms/WMService.java core/trunk/src/org/openjump/core/ui/plugin/queries/QueryDialog.java Added Paths: ----------- core/trunk/src/com/vividsolutions/jump/workbench/ui/cursortool/clean.xsl core/trunk/src/com/vividsolutions/wms/MapStyle.java Modified: core/trunk/ChangeLog =================================================================== --- core/trunk/ChangeLog 2015-12-23 15:39:50 UTC (rev 4662) +++ core/trunk/ChangeLog 2015-12-23 16:26:41 UTC (rev 4663) @@ -3,6 +3,8 @@ # 2. make sure that lines break at 80 chars for constricted display situations #<-------------------------------- 80 chars ----------------------------------># +2015-12-23 bertazza + * Info feature tool: added a pane to show WMS info. <----------------------------------------------- Changes.txt updated 'til here 2015-12-21 bertazza Modified: core/trunk/src/com/vividsolutions/jump/workbench/ui/InfoFrame.java =================================================================== --- core/trunk/src/com/vividsolutions/jump/workbench/ui/InfoFrame.java 2015-12-23 15:39:50 UTC (rev 4662) +++ core/trunk/src/com/vividsolutions/jump/workbench/ui/InfoFrame.java 2015-12-23 16:26:41 UTC (rev 4663) @@ -61,6 +61,8 @@ import com.vividsolutions.jump.workbench.ui.images.IconLoader; import com.vividsolutions.jump.workbench.ui.plugin.PersistentBlackboardPlugIn; import com.vividsolutions.jump.workbench.ui.plugin.ViewAttributesPlugIn; +import java.io.IOException; +import javax.swing.JEditorPane; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.table.DefaultTableModel; @@ -99,16 +101,18 @@ private GeometryInfoTab geometryInfoTab; private JTabbedPane tabbedPane = new JTabbedPane(); private RasterInfoTab rasterInfoTab; + private WMSInfoTab wmsInfoTab; private WorkbenchFrame workbenchFrame; private static ImageIcon ICON = IconLoader.icon("information_16x16.png"); public InfoFrame( WorkbenchContext workbenchContext, LayerManagerProxy layerManagerProxy, - final TaskFrame taskFrame) { + final TaskFrame taskFrame) throws IOException { blackboard = PersistentBlackboardPlugIn.get(workbenchContext); geometryInfoTab = new GeometryInfoTab(model, workbenchContext); rasterInfoTab = new RasterInfoTab(null, null); + wmsInfoTab = new WMSInfoTab(); //Keep my own copy of LayerManager, because it will be nulled in TaskFrame //when TaskFrame closes (it may in fact already be closed, which is why //a LayerManagerProxy must be passed in too). But I have to @@ -150,6 +154,7 @@ tabbedPane.addTab("", IconLoader.icon("Table.gif"), attributeTab, TABLE_VIEW); tabbedPane.addTab("", IconLoader.icon("Paper.gif"), geometryInfoTab, HTML_VIEW); tabbedPane.addTab("R", null, rasterInfoTab, "Raster"); + tabbedPane.addTab("WMS", null, wmsInfoTab, "WMS"); updateTitle(taskFrame.getTask().getName()); taskFrame.getTask().add(new Task.NameListener() { public void taskNameChanged(String name) { @@ -274,6 +279,10 @@ rasterInfoTab.setRasterValues(layerNames, cellValues); } + public void setWmsInfo(String string) { + wmsInfoTab.setWmsInfoText(string); + } + @Override public JFrame getFrame() { // our frame has to be all proxies InfoFrame is @@ -361,5 +370,32 @@ } } + + protected class WMSInfoTab extends JPanel { + + private final JEditorPane jEditorPane; + + public WMSInfoTab() throws IOException { + + setLayout(new BorderLayout()); + + jEditorPane = new JEditorPane(); + jEditorPane.setEditable(false); + JScrollPane jScrollPane = new JScrollPane( + jEditorPane, + JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, + JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); + + this.add(jScrollPane); + + } + + public void setWmsInfoText(String wmsInfo) { + + jEditorPane.setText(wmsInfo); + + } + + } } Modified: core/trunk/src/com/vividsolutions/jump/workbench/ui/PrimaryInfoFrame.java =================================================================== --- core/trunk/src/com/vividsolutions/jump/workbench/ui/PrimaryInfoFrame.java 2015-12-23 15:39:50 UTC (rev 4662) +++ core/trunk/src/com/vividsolutions/jump/workbench/ui/PrimaryInfoFrame.java 2015-12-23 16:26:41 UTC (rev 4663) @@ -34,6 +34,7 @@ import com.vividsolutions.jump.workbench.WorkbenchContext; import com.vividsolutions.jump.workbench.model.LayerManagerProxy; +import java.io.IOException; /** @@ -44,7 +45,7 @@ * positions InfoFrames differently depending on whether or not they are primary. */ public class PrimaryInfoFrame extends InfoFrame { - public PrimaryInfoFrame(WorkbenchContext workbenchContext, LayerManagerProxy layerManagerProxy, TaskFrame taskFrame) { + public PrimaryInfoFrame(WorkbenchContext workbenchContext, LayerManagerProxy layerManagerProxy, TaskFrame taskFrame) throws IOException { super(workbenchContext, layerManagerProxy, taskFrame); } } Modified: core/trunk/src/com/vividsolutions/jump/workbench/ui/TaskFrame.java =================================================================== --- core/trunk/src/com/vividsolutions/jump/workbench/ui/TaskFrame.java 2015-12-23 15:39:50 UTC (rev 4662) +++ core/trunk/src/com/vividsolutions/jump/workbench/ui/TaskFrame.java 2015-12-23 16:26:41 UTC (rev 4663) @@ -53,6 +53,7 @@ import com.vividsolutions.jump.workbench.ui.renderer.Renderer; import com.vividsolutions.jump.workbench.ui.zoom.ZoomBar; +import java.io.IOException; public class TaskFrame extends JInternalFrame implements TaskFrameProxy, CloneableInternalFrame, LayerViewPanelProxy, LayerNamePanelProxy, @@ -223,7 +224,7 @@ return task.getLayerManager(); } - public InfoFrame getInfoFrame() { + public InfoFrame getInfoFrame() throws IOException { if (infoFrame == null || infoFrame.isClosed()) { infoFrame = new PrimaryInfoFrame(workbenchContext, this, this); } Modified: core/trunk/src/com/vividsolutions/jump/workbench/ui/cursortool/FeatureInfoTool.java =================================================================== --- core/trunk/src/com/vividsolutions/jump/workbench/ui/cursortool/FeatureInfoTool.java 2015-12-23 15:39:50 UTC (rev 4662) +++ core/trunk/src/com/vividsolutions/jump/workbench/ui/cursortool/FeatureInfoTool.java 2015-12-23 16:26:41 UTC (rev 4663) @@ -34,6 +34,7 @@ package com.vividsolutions.jump.workbench.ui.cursortool; import com.vividsolutions.jts.geom.Coordinate; +import com.vividsolutions.jts.geom.Envelope; import java.awt.Color; import java.awt.Cursor; import java.awt.Image; @@ -49,9 +50,27 @@ import com.vividsolutions.jump.workbench.model.FenceLayerFinder; import com.vividsolutions.jump.workbench.model.Layer; import com.vividsolutions.jump.workbench.model.Layerable; +import com.vividsolutions.jump.workbench.model.WMSLayer; import com.vividsolutions.jump.workbench.ui.InfoFrame; import com.vividsolutions.jump.workbench.ui.images.IconLoader; +import com.vividsolutions.wms.WMService; +import java.awt.geom.Point2D; +import java.io.File; +import java.io.FileOutputStream; +import java.io.FileReader; +import java.io.IOException; +import java.net.HttpURLConnection; +import java.net.URL; +import java.net.URLEncoder; import java.util.List; +import javax.swing.JDialog; +import javax.swing.JEditorPane; +import javax.swing.JScrollPane; +import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.stream.StreamResult; +import javax.xml.transform.stream.StreamSource; +import org.apache.commons.io.IOUtils; import org.openjump.core.rasterimage.RasterImageLayer; import org.openjump.core.rasterimage.RasterImageLayer.RasterDataNotFoundException; @@ -90,8 +109,79 @@ infoFrame.getModel().add(layer, features); } + Coordinate coord = getPanel().getViewport().toModelCoordinate(getViewSource()); + + // WMS + List<Layerable> wmsLay_l = getWorkbench().getContext().getLayerManager().getLayerables(WMSLayer.class); + String response = ""; + for(Layerable lay : wmsLay_l) { + WMSLayer wmsLayer = (WMSLayer) lay; + + String featInfoUrl = wmsLayer.getService().getCapabilities().getFeatureInfoURL(); + String names = getWmsLayeNames(wmsLayer); + + Point2D point = getPanel().getViewport().toViewPoint(coord); + Envelope bbox = getPanel().getViewport().getEnvelopeInModelCoordinates(); + + if (featInfoUrl.contains("?")) { + featInfoUrl += "&"; + } else { + featInfoUrl += "?"; + } + String version = wmsLayer.getWmsVersion(); + if (WMService.WMS_1_0_0.equals(version)) { + featInfoUrl += "REQUEST=feature_info&WMTVER=1.0.0"; + } else if (WMService.WMS_1_1_0.equals(version) || + WMService.WMS_1_1_1.equals(version) || + WMService.WMS_1_3_0.equals(version)) { + featInfoUrl += "REQUEST=GetFeatureInfo&SERVICE=WMS&VERSION=" + version; + } + + featInfoUrl += "&QUERY_LAYERS=" + names + "&LAYERS=" + names; + if (WMService.WMS_1_3_0.equals(version)) { + featInfoUrl += "&CRS=" + wmsLayer.getSRS() + + "&I=" + (int) point.getX() + + "&J=" + (int) point.getY(); + } else { + featInfoUrl += "&SRS=" + wmsLayer.getSRS() + + "&X=" + (int) point.getX() + + "&Y=" + (int) point.getY(); + } + + featInfoUrl += "&WIDTH=" + getPanel().getWidth() + + "&HEIGHT=" + getPanel().getHeight() + + "&BBOX=" + bbox.getMinX() + "," + bbox.getMinY() + "," + bbox.getMaxX() + "," + bbox.getMaxY() + + "&STYLES=" + + "&FORMAT=" + wmsLayer.getFormat(); + + if (!WMService.WMS_1_0_0.equals(version)) { + try { + featInfoUrl += "&INFO_FORMAT=" + wmsLayer.getService().getCapabilities().getInfoFormat(); + } catch (IOException e) { + featInfoUrl += "&INFO_FORMAT=text/plain"; + } + } + + URL url = stripXhtmlTags(featInfoUrl); + + String newLine = System.getProperty("line.separator"); + response = response.concat("+ ").concat(wmsLayer.getName()).concat(newLine); + + String wmsResponse; + try { + wmsResponse = IOUtils.toString(url.openStream()); + wmsResponse = cleanWmsResponse(wmsResponse); + } catch(Exception ex) { + wmsResponse = ex.toString(); + wmsResponse = wmsResponse.concat(newLine); + } + response = response.concat(wmsResponse); + response = response.concat(newLine); + + }; + infoFrame.setWmsInfo(response); + // Raster data - Coordinate coord = getPanel().getViewport().toModelCoordinate(getViewSource()); List<Layerable> layerables_l = getWorkbench().getContext().getLayerManager().getLayerables(RasterImageLayer.class); String[] layerNames = new String[layerables_l.size()]; @@ -122,15 +212,78 @@ } catch(RasterDataNotFoundException ex) { cellValues[l] = "???"; } - - - } } } - infoFrame.setRasterValues(layerNames, cellValues); - + infoFrame.setRasterValues(layerNames, cellValues); infoFrame.surface(); } + + private String getWmsLayeNames(WMSLayer selLayer) { + int i; + String names = ""; + List<String> layerNames = selLayer.getLayerNames(); + for (i=0; i< layerNames.size(); ++i) { + String name = (String) layerNames.get(i); + try { + name = URLEncoder.encode(name, "UTF-8"); + } catch (Exception ignored) { + } + names += name; + if (i < layerNames.size() - 1) { + names += ","; + } + } + + return names; + } + + private URL stripXhtmlTags(String serverURL) throws Exception { + + File tmpFile = File.createTempFile("wms", "q"); + FileOutputStream cleanHtml = new FileOutputStream(tmpFile); + boolean resOk = true; + //String xsl = (String)getClass().getResource("clean.xsl").getContent(); + //System.out.println("Ecco l'xsl: "+xsl); + Transformer pulizia = TransformerFactory.newInstance().newTransformer( + new StreamSource(getClass().getResourceAsStream("clean.xsl"))); + try { + pulizia.transform(new StreamSource(serverURL), + new StreamResult(cleanHtml)); + } catch (Exception te) { + //System.out.println("XSLT Error: "+te.getMessage()); + resOk = false; + } finally { + cleanHtml.close(); + } + // [DR] gestione file vuoti + if (!resOk || !(new FileReader(tmpFile).ready())) { + /* + FileWriter noResponse = new FileWriter(tmpFile); + noResponse.write("<html><body><h2>Risultati interrogazione</h2>"+ + "Il server non ha restituito alcun risultato.</body></html>"); + noResponse.close(); + */ + //gestione risposte non html (testuali) + return new URL(serverURL); + } + return tmpFile.toURI().toURL(); + } + + private String cleanWmsResponse(String inputWms) { + + String pattern = "GetFeatureInfo results:"; + int index = inputWms.indexOf(pattern); + if(index != -1) { + int endIndex = index + pattern.length(); + inputWms = inputWms.substring(endIndex); + if(inputWms.startsWith("\n\n")) { + inputWms = inputWms.replaceFirst("\n\n", ""); + } + } + + return inputWms; + } + } Added: core/trunk/src/com/vividsolutions/jump/workbench/ui/cursortool/clean.xsl =================================================================== --- core/trunk/src/com/vividsolutions/jump/workbench/ui/cursortool/clean.xsl (rev 0) +++ core/trunk/src/com/vividsolutions/jump/workbench/ui/cursortool/clean.xsl 2015-12-23 16:26:41 UTC (rev 4663) @@ -0,0 +1,39 @@ +<?xml version="1.0" encoding="UTF-8"?> +<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" + xmlns:xhtml="http://www.w3.org/1999/xhtml" + version="1.0"> + + <xsl:output method="html" version="3.2" /> + + <xsl:strip-space elements="*" /> + + <xsl:template match="/"> + <xsl:if test="not(html)"> + <html> + <head> + </head> + <body> + <xsl:apply-templates /> + </body> + </html> + </xsl:if> + </xsl:template> + + <xsl:template match="*"> + <xsl:choose> + <xsl:when test="local-name()='img'" /> + <xsl:otherwise> + <xsl:element name="{local-name()}"> + <xsl:apply-templates select="@*|node()"/> + </xsl:element> + </xsl:otherwise> + </xsl:choose> + </xsl:template> + + <xsl:template match="@*"> + <xsl:attribute name="{local-name()}"> + <xsl:value-of select="."/> + </xsl:attribute> + </xsl:template> + +</xsl:stylesheet> \ No newline at end of file Modified: core/trunk/src/com/vividsolutions/wms/AbstractParser.java =================================================================== --- core/trunk/src/com/vividsolutions/wms/AbstractParser.java 2015-12-23 15:39:50 UTC (rev 4662) +++ core/trunk/src/com/vividsolutions/wms/AbstractParser.java 2015-12-23 16:26:41 UTC (rev 4663) @@ -39,7 +39,6 @@ import java.io.IOException; import java.io.InputStream; -import java.io.InputStreamReader; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; @@ -48,7 +47,6 @@ import org.apache.xerces.parsers.DOMParser; import org.w3c.dom.CharacterData; import org.w3c.dom.Document; -import org.w3c.dom.Element; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import org.w3c.dom.NodeList; @@ -155,9 +153,31 @@ } } } + return formatList; } + protected LinkedList<String> getInfoFormats(Document doc) { + + // get the supported infoFormats + final Node formatNode = XMLTools.simpleXPath(doc, getRootPath() + "/Capability/Request/GetMap"); + NodeList nl = formatNode.getChildNodes(); + + final Node infoFormatNode = XMLTools.simpleXPath(doc, "WMT_MS_Capabilities/Capability/Request/GetFeatureInfo"); + LinkedList<String> infoFormatList = new LinkedList<String>(); + if (infoFormatNode != null) { + nl = infoFormatNode.getChildNodes(); + for (int i = 0; i < nl.getLength(); i++) { + Node n = nl.item(i); + if (n.getNodeType() == Node.ELEMENT_NODE && "Format".equals(n.getNodeName())) { + infoFormatList.add(n.getFirstChild().getNodeValue()); + } + } + } + + return infoFormatList; + + } /** * Traverses the DOM tree underneath the specified Node and generates @@ -174,6 +194,7 @@ LinkedList<MapLayer> subLayers = new LinkedList<MapLayer>(); BoundingBox geographicBBox = null; ArrayList<BoundingBox> boundingBoxList = new ArrayList<BoundingBox> ( ); + List<MapStyle> styles = new ArrayList<MapStyle>(); NodeList nl = layerNode.getChildNodes(); @@ -199,6 +220,44 @@ boundingBoxList.add ( new BoundingBox("Geographics", geographicBBox.getEnvelope()) ); } else if( n.getNodeName().equals( "Layer" ) ) { subLayers.add( wmsLayerFromNode( n ) ); + } else if (n.getNodeName().equals("Style")) { //$NON-NLS-1$ + String styleName = ""; //$NON-NLS-1$ + String titleName = ""; //$NON-NLS-1$ + String legendFormat = ""; //$NON-NLS-1$ + String url = ""; //$NON-NLS-1$ + int h=0,w=0; + NodeList nodeStyle = n.getChildNodes(); + for( int k = 0; k < nodeStyle.getLength(); k++ ) { + Node n1 = nodeStyle.item(k); + if (n1.getNodeName().equals("Name")) { //$NON-NLS-1$ + styleName = ((CharacterData) n1.getFirstChild()).getData(); + } else if (n1.getNodeName().equals("Title") & n1.hasChildNodes()) { //$NON-NLS-1$ + titleName = ((CharacterData) n1.getFirstChild()).getData(); + } else if (n1.getNodeName().equals("LegendURL")) { //$NON-NLS-1$ + try { + h=Integer.parseInt(n1.getAttributes().getNamedItem("height").getNodeValue()); + w=Integer.parseInt(n1.getAttributes().getNamedItem("width").getNodeValue()); + } + catch (Exception e) { + e.printStackTrace(); + throw new Exception(e.toString()); + } + NodeList nodelegend = n1.getChildNodes(); + for( int k1 = 0; k1 < nodelegend.getLength(); k1++ ) { + Node n2 = nodelegend.item(k1); + if (n2.getNodeName().equals("Format")) { //$NON-NLS-1$ + legendFormat = + ((CharacterData) n2.getFirstChild()).getData(); + } else if (n2.getNodeName().equals("OnlineResource")) { //$NON-NLS-1$ + url = + n2.getAttributes() + .getNamedItem("xlink:href").getNodeValue(); //$NON-NLS-1$ + } + } + + } + } + styles.add(new MapStyle(styleName, titleName, url, legendFormat,w,h)); } } } catch( Exception e ) { @@ -208,7 +267,7 @@ } // call the new constructor with boundingBoxList in MapLayer [uwe dalluege] - return new MapLayer(name, title, srsList, subLayers, geographicBBox, boundingBoxList); + return new MapLayer(name, title, srsList, subLayers, geographicBBox, boundingBoxList, styles); } protected void addSRSNode(Node n, List<String> srsList) throws Exception { Modified: core/trunk/src/com/vividsolutions/wms/Capabilities.java =================================================================== --- core/trunk/src/com/vividsolutions/wms/Capabilities.java 2015-12-23 15:39:50 UTC (rev 4662) +++ core/trunk/src/com/vividsolutions/wms/Capabilities.java 2015-12-23 16:26:41 UTC (rev 4663) @@ -51,8 +51,9 @@ private String title; private ArrayList mapFormats; private WMService service; - private String getMapURL, getFeatureInfoURL; - + private String getMapURL, featureInfoURL; + private ArrayList infoFormats; + /** * Creates a new WMS Capabilities object. Should generally only be used by the Parser. * @param service the WMService to which these Capabilites belong @@ -60,19 +61,22 @@ * @param topLayer the top MapLayer of the entire layer tree * @param mapFormats the Collection of supported formats */ - public Capabilities(WMService service, String title, MapLayer topLayer, Collection mapFormats) { + public Capabilities(WMService service, String title, MapLayer topLayer, + Collection mapFormats, Collection infoFormats) { this.service = service; this.title = title; this.topLayer = topLayer; this.mapFormats = new ArrayList( mapFormats ); + this.infoFormats = new ArrayList(infoFormats); this.getMapURL = service.getServerUrl(); - this.getFeatureInfoURL = service.getServerUrl(); + this.featureInfoURL = service.getServerUrl(); } - public Capabilities(WMService service, String title, MapLayer topLayer, Collection mapFormats, String getMapURL, String getFeatureInfoURL) { - this(service, title, topLayer, mapFormats); + public Capabilities(WMService service, String title, MapLayer topLayer, + Collection mapFormats, Collection infoFormats, String getMapURL, String featureInfoURL) { + this(service, title, topLayer, mapFormats, infoFormats); this.getMapURL = getMapURL; - this.getFeatureInfoURL = getFeatureInfoURL; + this.featureInfoURL = featureInfoURL; } /** @@ -121,8 +125,8 @@ return getMapURL; } - public String getGetFeatureInfoURL() { - return getFeatureInfoURL; + public String getFeatureInfoURL() { + return featureInfoURL; } public void setGetMapURL(String url) { @@ -142,5 +146,16 @@ } return formats; } + + public String getInfoFormat() { + String format = "text/plain"; + if (!infoFormats.contains(format)) { + Iterator it = infoFormats.iterator(); + if (it.hasNext()) { + format = (String) it.next(); + } + } + return format; + } } Modified: core/trunk/src/com/vividsolutions/wms/MapLayer.java =================================================================== --- core/trunk/src/com/vividsolutions/wms/MapLayer.java 2015-12-23 15:39:50 UTC (rev 4662) +++ core/trunk/src/com/vividsolutions/wms/MapLayer.java 2015-12-23 16:26:41 UTC (rev 4663) @@ -63,10 +63,13 @@ // user modifiable members private boolean enabled = false; + private List<MapStyle> styles; + /** * Creates a new instance of MapLayer */ - public MapLayer(String name, String title, Collection srsList, Collection subLayers, BoundingBox bbox) { + public MapLayer(String name, String title, Collection srsList, + Collection subLayers, BoundingBox bbox, List<MapStyle> styles) { this.parent = null; this.name = name; this.title = title; @@ -77,15 +80,17 @@ (it.next()).parent = this; } this.bbox = bbox; + setStyles(styles); } /** * Creates a new instance of MapLayer with boundingBoxList [uwe dalluege] */ - public MapLayer ( String name, String title, Collection srsList, Collection subLayers, - BoundingBox bbox, ArrayList<BoundingBox> boundingBoxList ) { - this ( name, title, srsList, subLayers, bbox ); - this.boundingBoxList = boundingBoxList; + public MapLayer + ( String name, String title, Collection srsList, Collection subLayers, + BoundingBox bbox, ArrayList boundingBoxList,List<MapStyle> styles ) { + this ( name, title, srsList, subLayers, bbox,styles ); + this.boundingBoxList = boundingBoxList; } @@ -297,8 +302,62 @@ if (parent != null) fullSRSList.addAll(parent.getFullSRSList()); return fullSRSList; } + + /** + * Sets the selected WMS layer style + * + * @param selectedStyle + */ + public void setSelectedStyle( MapStyle selectedStyle ) { + for( Iterator<MapStyle> iter = styles.iterator(); iter.hasNext(); ) { + MapStyle element = iter.next(); + element.setSelected(false, false); + } + selectedStyle.setSelected(true, false); + } + + /** + * Gets the WMS layer style by name + * + * @param styleName + * @return + */ + public MapStyle getStyle( String styleName ) { + for( Iterator<MapStyle> iter = styles.iterator(); iter.hasNext(); ) { + MapStyle element = iter.next(); + if (element.getName().equals(styleName)) + return element; + } + return null; + } + + public List<MapStyle> getStyles() { + return styles; + } + /** + * @param sublayer + */ + public void setSublayer(ArrayList sublayer) { + this.subLayers = sublayer; + } + /** + * @param newStyles + */ + public void setStyles( List<MapStyle> newStyles ) { + this.styles = newStyles; + for( Iterator<MapStyle> iter = styles.iterator(); iter.hasNext(); ) { + MapStyle element = iter.next(); + element.setLayer(this); + } + + if (!styles.isEmpty()) { + styles.get(0).setSelected(true, true); + } + } + + /** * Returns a somewhat nicely-formatted string representing all of the details of * this layer and its sub-layers (recursively). * @return a somewhat nicely-formatted string representing all of the details of Added: core/trunk/src/com/vividsolutions/wms/MapStyle.java =================================================================== --- core/trunk/src/com/vividsolutions/wms/MapStyle.java (rev 0) +++ core/trunk/src/com/vividsolutions/wms/MapStyle.java 2015-12-23 16:26:41 UTC (rev 4663) @@ -0,0 +1,239 @@ +package com.vividsolutions.wms; + +import java.awt.image.BufferedImage; +import java.io.IOException; +import java.net.MalformedURLException; +import java.net.URL; +import java.util.Iterator; + +import javax.imageio.ImageIO; +import javax.swing.Icon; +import javax.swing.ImageIcon; + +import org.apache.log4j.Logger; + +/* + * Estilo asociado a una capa. Se caracteriza por tener asociado un + * nombre, un estilo y una leyenda + * @author Marco Antonio Fuentelsaz P?rez + * + */ +public class MapStyle { + + /** Log */ + private final static Logger LOGGER = Logger.getLogger(MapStyle.class); + + /** Nombre asociado al estilo */ + private String name; + + /** Titulo asociado al estilo */ + private String title; + + /** URL asociado a la leyenda */ + private String urlLegend; + + /** Formato asociado a la leyenda */ + private String formatLegend; + + /** */ + private boolean selected; + + /** Legend icon */ + private Icon legendIcon; + + /** */ + private MapLayer layer; + + /** Flag to indicate if the legend icon have been loaded or not */ + private boolean loadedIcon; + + private int width; + private int height; + + /** + * @param name + * @param title + * @param urlLegend + * @param formatLegend + */ + public MapStyle( String name, String title, String urlLegend, String formatLegend ) { + this.name = name; + this.title = title; + setUrlLegend(urlLegend); + this.formatLegend = formatLegend; + this.selected = false; + } + + public MapStyle( String name, String title, String urlLegend, String formatLegend, int w, int h ) { + this.name = name; + this.title = title; + setUrlLegend(urlLegend); + this.formatLegend = formatLegend; + this.selected = false; + this.width = w; + this.height = h; + } + + /** + * @return + */ + public int getWidth() { + return width; + } + /** + * @return + */ + public int getHeight() { + return height; + } + + /** + * @return + */ + public String getName() { + return name; + } + + /** + * @param name + */ + public void setName( String name ) { + this.name = name; + } + + /** + * @return + */ + public String getTitle() { + return title; + } + + /** + * @param title + */ + public void setTitle( String title ) { + this.title = title; + } + + /** + * @return + */ + public String getUrlLegend() { + return urlLegend; + } + + /** + * @param newURLLegend + */ + public void setUrlLegend( String newURLLegend ) { + this.urlLegend = newURLLegend; + } + + /** + * @return + */ + public String getFormatLegend() { + return formatLegend; + } + + /** + * @param formatLegend + */ + public void setFormatLegend( String formatLegend ) { + this.formatLegend = formatLegend; + } + + @Override + public String toString() { + return name; + } + + /** + * Load the legend icon at first request, not before + * + * @return + */ + public Icon getLegendIcon() { + if (!loadedIcon) { + loadIconFromLegendURL(); + } + return legendIcon; + } + + /** + * Loads the WMS style legend icon on request + */ + private void loadIconFromLegendURL() { + URL selectedUrl = null; + try { + selectedUrl = new URL(urlLegend); + } catch (MalformedURLException e) { + LOGGER.error(e.getMessage()); + } + + if (selectedUrl != null) { + BufferedImage image; + try { + image = ImageIO.read(selectedUrl); + legendIcon = new ImageIcon(image); + loadedIcon = true; + } catch (IOException e) { + LOGGER.error(e.getMessage()); + } + + } else { + loadedIcon = false; + } + } + + /** + * @return + */ + public boolean isSelected() { + return selected; + } + + /** + * @param selected + * @param check + */ + public void setSelected( boolean selected, boolean check ) { + if (check) { + if (this.selected && !selected && layer.getStyles().size() == 1) + return; + if (this.selected && !selected) { + for( Iterator<MapStyle> iter = layer.getStyles().iterator(); iter.hasNext(); ) { + MapStyle element = iter.next(); + if (!element.equals(this)) + element.setSelected(true, false); + + } + } + } + + this.selected = selected; + } + + /** + * + */ + public void fireStyleChanged() { + layer.setSelectedStyle(this); + } + + @Override + public boolean equals( Object other ) { + if (other == this) + return true; + if (!(other instanceof MapStyle)) + return false; + return getName().equals(((MapStyle) other).getName()); + } + + /** + * @param layer + */ + public void setLayer( MapLayer layer ) { + this.layer = layer; + } +} Modified: core/trunk/src/com/vividsolutions/wms/ParserWMS1_0.java =================================================================== --- core/trunk/src/com/vividsolutions/wms/ParserWMS1_0.java 2015-12-23 15:39:50 UTC (rev 4662) +++ core/trunk/src/com/vividsolutions/wms/ParserWMS1_0.java 2015-12-23 16:26:41 UTC (rev 4663) @@ -78,11 +78,13 @@ } + @Override protected Capabilities parseCapabilities(WMService service, Document doc) throws IOException { String title = getTitle(doc); MapLayer topLayer = wmsLayerFromNode(XMLTools.simpleXPath(doc, "WMT_MS_Capabilities/Capability/Layer")); LinkedList<String> formatList = getFormatList(doc); - return new Capabilities(service, title, topLayer, formatList); + + return new Capabilities(service, title, topLayer, formatList, getInfoFormats(doc)); } @@ -90,4 +92,5 @@ return "SRS"; } + } Modified: core/trunk/src/com/vividsolutions/wms/ParserWMS1_1.java =================================================================== --- core/trunk/src/com/vividsolutions/wms/ParserWMS1_1.java 2015-12-23 15:39:50 UTC (rev 4662) +++ core/trunk/src/com/vividsolutions/wms/ParserWMS1_1.java 2015-12-23 16:26:41 UTC (rev 4663) @@ -84,8 +84,8 @@ MapLayer topLayer = wmsLayerFromNode(XMLTools.simpleXPath(doc, "WMT_MS_Capabilities/Capability/Layer")); LinkedList<String> formatList = getFormatList(doc); String getMapURL = getMapURL(doc); - String getFeatureInfoURL = getFeatureInfoURL(doc); - return new Capabilities(service, title, topLayer, formatList, getMapURL, getFeatureInfoURL ); + String featureInfoURL = getFeatureInfoURL(doc); + return new Capabilities(service, title, topLayer, formatList, getInfoFormats(doc), getMapURL, featureInfoURL ); } Modified: core/trunk/src/com/vividsolutions/wms/ParserWMS1_3.java =================================================================== --- core/trunk/src/com/vividsolutions/wms/ParserWMS1_3.java 2015-12-23 15:39:50 UTC (rev 4662) +++ core/trunk/src/com/vividsolutions/wms/ParserWMS1_3.java 2015-12-23 16:26:41 UTC (rev 4663) @@ -85,7 +85,7 @@ LinkedList<String> formatList = getFormatList(doc); String getMapURL = getMapURL(doc); String getFeatureInfoURL = getFeatureInfoURL(doc); - return new Capabilities(service, title, topLayer, formatList, getMapURL, getFeatureInfoURL ); + return new Capabilities(service, title, topLayer, formatList, getInfoFormats(doc), getMapURL, getFeatureInfoURL ); } Modified: core/trunk/src/com/vividsolutions/wms/WMService.java =================================================================== --- core/trunk/src/com/vividsolutions/wms/WMService.java 2015-12-23 15:39:50 UTC (rev 4662) +++ core/trunk/src/com/vividsolutions/wms/WMService.java 2015-12-23 16:26:41 UTC (rev 4663) @@ -215,16 +215,16 @@ * @return a MapRequest object which can be used to retrieve a map image * from this service */ - public MapRequest createMapRequest() { - // [UT] 04.02.2005 changed - MapRequest mr = new MapRequest( this ); - mr.setVersion( this.wmsVersion ); - return mr; - } - - public String getVersion(){ - return wmsVersion; - } + public MapRequest createMapRequest() { + // [UT] 04.02.2005 changed + MapRequest mr = new MapRequest( this ); + mr.setVersion( this.wmsVersion ); + return mr; + } + + public String getVersion(){ + return wmsVersion; + } // // The WMService appends other parameters to the end of the URL @@ -232,7 +232,7 @@ public static String legalize(String url) { String fixedURL = url.trim(); - if (fixedURL.indexOf("?") == -1) { + if (!fixedURL.contains("?")) { fixedURL = fixedURL + "?"; } else { if (fixedURL.endsWith("?")) { Modified: core/trunk/src/org/openjump/core/ui/plugin/queries/QueryDialog.java =================================================================== --- core/trunk/src/org/openjump/core/ui/plugin/queries/QueryDialog.java 2015-12-23 15:39:50 UTC (rev 4662) +++ core/trunk/src/org/openjump/core/ui/plugin/queries/QueryDialog.java 2015-12-23 16:26:41 UTC (rev 4663) @@ -22,6 +22,8 @@ import java.text.SimpleDateFormat; import java.util.*; import java.util.List; +import java.util.logging.Level; +import java.util.logging.Logger; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -901,9 +903,13 @@ // initialization for infoframe InfoFrame info = null; if(display.getState()) { - info = new InfoFrame(context.getWorkbenchContext(), - (LayerManagerProxy)context, - (TaskFrame)context.getWorkbenchFrame().getActiveInternalFrame()); + try { + info = new InfoFrame(context.getWorkbenchContext(), + (LayerManagerProxy)context, + (TaskFrame)context.getWorkbenchFrame().getActiveInternalFrame()); + } catch (IOException ex) { + ex.printStackTrace(); + } } // Loop on the requested layers ------------------------------------------------------------------------------ _______________________________________________ Jump-pilot-devel mailing list Jump-pilot-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/jump-pilot-devel