[Geoserver-devel] [jira] Created: (GEOS-4608) Dynamic symbolizers not evaluated in KML output for relative path ExternalGraphics

Dynamic symbolizers not evaluated in KML output for relative path ExternalGraphics
----------------------------------------------------------------------------------

                 Key: GEOS-4608
                 URL: http://jira.codehaus.org/browse/GEOS-4608
             Project: GeoServer
          Issue Type: Bug
          Components: Google Earth KML Output
    Affects Versions: 2.1.0
            Reporter: Christopher S. Dillard
            Assignee: Andrea Aime
         Attachments: bad_eval.sld

An SLD with an ExternalGraphic that has a relative filename containing a ${...} expression does not get evaluated. This is related in spirit to prior bug GEOS-2670, but I think it's a different problem.

A minimalist SLD demonstrating the problem is attached. Use it with any point features. It requires that you have a "foo/bar.png" image in your GeoServer's styles directory. (My real-world SLD uses a custom-written function evaluated on various feature properties to determine which image to display for each feature.) The KML that results from the attached SLD has the following in it:

<IconStyle>
  <colorMode>normal</colorMode>
  <Icon>
    <href>http://localhost:8080/geoserver-2.1.0/styles/foo/${‘bar’}.png&lt;/href&gt;
  </Icon>
</IconStyle>

This SLD works great outputting images in the WMS, just not KML. (I'm not familiar enough with the WMS rendering code to figure out what's different.)

I stepped through the debugger, and here's what I observed:

If the SLD's ExternalGraphic has a relative path (e.g. xlink:href="somedir/somefile.png") then it apparently gets converted to an absolute "file:" URL. So in KMLMapTransformer.java's encodePointStyle method, you get into the "if" branch that deals with "file:" URLs. At line 703 of KMLMapTransformer.java the bad thing happens: ResponseUtils.buildURL is invoked, which URL-encodes the "{" and "}" characters. So when evaluateDynamicSymbolizer is called, it can't find any "${...}" strings (since they now look like "$%7B...%7D"). And in fact, an exception gets dumped to the console complaining about the bare "$".

You can work around this behavior by changing the SLD to use absolute URLs instead. This makes the KMLMapTransformer.java "if" block that encodes the URL get skipped. Then KML works, but the WMS stops rendering the icons. (I suppose I could have one style and/or layer for each: KML and images. But that seems unsatisfactory.)

--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://jira.codehaus.org/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira