Fixes #162: Improved style in workspace support for GeoTiffs and Shapefiles

This commit is contained in:
Mauro Bartolomeoli 2016-02-24 10:06:29 +01:00
parent bde93118d2
commit 28a72e2691
6 changed files with 133 additions and 8 deletions

View File

@ -1152,13 +1152,24 @@ public class GeoServerRESTPublisher {
}
// config layer props (style, ...)
final GSLayerEncoder layerEncoder = new GSLayerEncoder();
if (defaultStyle != null && !defaultStyle.isEmpty())
layerEncoder.setDefaultStyle(defaultStyle);
final GSLayerEncoder layerEncoder = configureDefaultStyle(defaultStyle);
return configureLayer(workspace, datasetName, layerEncoder);
}
private GSLayerEncoder configureDefaultStyle(String defaultStyle) {
final GSLayerEncoder layerEncoder = new GSLayerEncoder();
if (defaultStyle != null && !defaultStyle.isEmpty()) {
if(defaultStyle.indexOf(":") != -1) {
String[] wsAndName = defaultStyle.split(":");
layerEncoder.setDefaultStyle(wsAndName[0], wsAndName[1]);
} else {
layerEncoder.setDefaultStyle(defaultStyle);
}
}
return layerEncoder;
}
/**
* Publish a shapefile.
*
@ -1621,8 +1632,7 @@ public class GeoServerRESTPublisher {
}
// config layer props (style, ...)
final GSLayerEncoder layerEncoder = new GSLayerEncoder();
layerEncoder.setDefaultStyle(defaultStyle);
final GSLayerEncoder layerEncoder = configureDefaultStyle(defaultStyle);
return configureLayer(workspace, coverageName, layerEncoder);
}

View File

@ -75,8 +75,10 @@ public class GSLayerEncoder extends PropertyXMLEncoder {
public final static String STYLES = "styles";
public final static String AUTHORITY_URLS="authorityURLs";
public final static String IDENTIFIERS="identifiers";
public final static String DEFAULT_STYLE = "defaultStyle";
final private Element stylesEncoder = new Element(STYLES);
final private Element defaultStyleEncoder = new Element(DEFAULT_STYLE);
final private Element authorityURLListEncoder = new Element(AUTHORITY_URLS);
final private Element identifierListEncoder = new Element(IDENTIFIERS);
@ -165,6 +167,20 @@ public class GSLayerEncoder extends PropertyXMLEncoder {
add("defaultStyle", defaultStyle);
}
/**
* @see {@link GSLayerEncoder#setDefaultStyle(String)}
* @param defaultStyle
*/
protected void addDefaultStyle(String workspace, String defaultStyle) {
addContent(defaultStyleEncoder);
Element el = new Element("name");
el.setText(defaultStyle);
defaultStyleEncoder.addContent(el);
el = new Element("workspace");
el.setText(workspace);
defaultStyleEncoder.addContent(el);
}
/**
* @param defaultStyle The style that will be applied if no style is specified.
* @throws IllegalArgumentException if defaultStyle is null or empty
@ -175,6 +191,15 @@ public class GSLayerEncoder extends PropertyXMLEncoder {
set("defaultStyle", defaultStyle);
}
/**
* @see {@link GSLayerEncoder#setDefaultStyle(String)}
* @param defaultStyle
*/
public void setDefaultStyle(String workspace, String defaultStyle) {
remove("defaultStyle");
addDefaultStyle(workspace, defaultStyle);
}
/**
* Add a style
*

View File

@ -528,7 +528,7 @@ public class GeoServerRESTStyleManager extends GeoServerRESTAbstractManager {
*/
public boolean publishStyleInWorkspace(final String workspace, String sldBody) {
try {
return publishStyleInWorkspace(workspace, sldBody);
return publishStyleInWorkspace(workspace, sldBody, null);
} catch (IllegalArgumentException e) {
if (LOGGER.isErrorEnabled()) {
LOGGER.error(e.getLocalizedMessage(), e);

View File

@ -111,4 +111,12 @@ public class GSLayerEncoderTest {
Assert.assertEquals("authority1", el.getChild("authority").getValue());
Assert.assertEquals("identifier1", el.getChild("identifier").getValue());
}
@Test
public void testDefaultStyleWithWorkspace(){
layerEncoder.setDefaultStyle("ws", "style");
Element el = (Element) layerEncoder.getRoot().getChild("defaultStyle");
Assert.assertEquals("style", el.getChild("name").getValue());
Assert.assertEquals("ws", el.getChild("workspace").getValue());
}
}

View File

@ -25,9 +25,14 @@
package it.geosolutions.geoserver.rest.publisher;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import it.geosolutions.geoserver.rest.GeoServerRESTPublisher.StoreType;
import it.geosolutions.geoserver.rest.GeoserverRESTTest;
import it.geosolutions.geoserver.rest.decoder.RESTCoverageStore;
import it.geosolutions.geoserver.rest.decoder.RESTLayer;
import it.geosolutions.geoserver.rest.encoder.GSResourceEncoder.ProjectionPolicy;
import java.io.File;
@ -35,7 +40,6 @@ import java.io.FileNotFoundException;
import java.io.IOException;
import org.junit.Test;
import static org.junit.Assert.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.io.ClassPathResource;
@ -125,6 +129,38 @@ public class GeoserverRESTGeoTiffTest extends GeoserverRESTTest {
assertFalse(reader.existsCoveragestore(DEFAULT_WS, storeName));
}
@Test
public void testGeoTiffWithStyleInWorkspace() throws IOException {
if (!enabled()) return;
deleteAll();
File geotiff = new ClassPathResource("testdata/resttestdem.tif").getFile();
assertTrue(reader.getWorkspaces().isEmpty());
assertTrue(publisher.createWorkspace(DEFAULT_WS));
File sldFile = new ClassPathResource("testdata/raster.sld").getFile();
// insert style
assertTrue(publisher.publishStyleInWorkspace(DEFAULT_WS, sldFile, "mystyle"));
assertTrue(reader.existsStyle(DEFAULT_WS, "mystyle"));
// known state?
assertFalse("Cleanup failed", existsLayer(layerName));
// test insert
boolean pub = publisher.publishGeoTIFF(DEFAULT_WS, storeName, storeName,
geotiff, "EPSG:4326", ProjectionPolicy.FORCE_DECLARED, DEFAULT_WS + ":" + "mystyle", null);
assertNotNull("publish() failed", pub);
// Test exists
assertTrue(reader.existsCoveragestore(DEFAULT_WS, storeName));
assertTrue(reader.existsCoverage(DEFAULT_WS, storeName, storeName));
RESTLayer layer = reader.getLayer(DEFAULT_WS, storeName);
assertEquals("mystyle", layer.getDefaultStyle());
assertEquals(DEFAULT_WS, layer.getDefaultStyleWorkspace());
}
@Test
public void testReloadCoverageStore() throws FileNotFoundException, IOException {

View File

@ -241,6 +241,52 @@ public class GeoserverRESTShapeTest extends GeoserverRESTTest {
assertFalse(reader.existsStyle(styleName));
}
@Test
public void testPublishDeleteStyledInWorkspaceShapeZip() throws FileNotFoundException, IOException {
if (!enabled()) {
return;
}
deleteAllWorkspacesRecursively();
// Assume.assumeTrue(enabled);
assertTrue(publisher.createWorkspace(DEFAULT_WS));
String ns = "geosolutions";
String storeName = "resttestshp";
String layerName = "cities";
final String styleName = "restteststyle";
File zipFile = new ClassPathResource("testdata/resttestshp.zip").getFile();
publisher.removeDatastore(DEFAULT_WS, storeName,true);
publisher.removeStyleInWorkspace(DEFAULT_WS, styleName);
File sldFile = new ClassPathResource("testdata/restteststyle.sld").getFile();
// insert style
boolean sldpublished = publisher.publishStyleInWorkspace(DEFAULT_WS, sldFile); // Will take the name from sld contents
assertTrue("style publish() failed", sldpublished);
assertTrue(reader.existsStyle(DEFAULT_WS, styleName));
// test insert
boolean published = publisher.publishShp(ns, storeName, layerName, zipFile, "EPSG:4326", DEFAULT_WS + ":" + styleName);
assertTrue("publish() failed", published);
assertTrue(existsLayer(layerName));
RESTLayer layer = reader.getLayer(layerName);
// RESTLayer layerDecoder = new RESTLayer(layer);
LOGGER.info("Layer style is " + layer.getDefaultStyle());
assertEquals("Style not assigned properly", styleName, layer.getDefaultStyle());
assertEquals("Style not assigned properly", DEFAULT_WS, layer.getDefaultStyleWorkspace());
// remove also datastore
boolean dsRemoved = publisher.removeDatastore(ns, storeName,true);
assertTrue("removeDatastore() failed", dsRemoved);
//test delete style
boolean oksld = publisher.removeStyleInWorkspace(DEFAULT_WS, styleName);
assertTrue("Unpublish() failed", oksld);
assertFalse(reader.existsStyle(styleName));
}
@Test
public void testPublishDeleteShapeZipWithParams() throws FileNotFoundException, IOException {
if (!enabled()) {