Fixes #162: Improved style in workspace support for GeoTiffs and Shapefiles
This commit is contained in:
parent
bde93118d2
commit
28a72e2691
@ -1152,13 +1152,24 @@ public class GeoServerRESTPublisher {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// config layer props (style, ...)
|
// config layer props (style, ...)
|
||||||
final GSLayerEncoder layerEncoder = new GSLayerEncoder();
|
final GSLayerEncoder layerEncoder = configureDefaultStyle(defaultStyle);
|
||||||
if (defaultStyle != null && !defaultStyle.isEmpty())
|
|
||||||
layerEncoder.setDefaultStyle(defaultStyle);
|
|
||||||
|
|
||||||
return configureLayer(workspace, datasetName, layerEncoder);
|
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.
|
* Publish a shapefile.
|
||||||
*
|
*
|
||||||
@ -1621,8 +1632,7 @@ public class GeoServerRESTPublisher {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// config layer props (style, ...)
|
// config layer props (style, ...)
|
||||||
final GSLayerEncoder layerEncoder = new GSLayerEncoder();
|
final GSLayerEncoder layerEncoder = configureDefaultStyle(defaultStyle);
|
||||||
layerEncoder.setDefaultStyle(defaultStyle);
|
|
||||||
|
|
||||||
return configureLayer(workspace, coverageName, layerEncoder);
|
return configureLayer(workspace, coverageName, layerEncoder);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -74,9 +74,11 @@ public class GSLayerEncoder extends PropertyXMLEncoder {
|
|||||||
|
|
||||||
public final static String STYLES = "styles";
|
public final static String STYLES = "styles";
|
||||||
public final static String AUTHORITY_URLS="authorityURLs";
|
public final static String AUTHORITY_URLS="authorityURLs";
|
||||||
public final static String IDENTIFIERS="identifiers";
|
public final static String IDENTIFIERS="identifiers";
|
||||||
|
public final static String DEFAULT_STYLE = "defaultStyle";
|
||||||
|
|
||||||
final private Element stylesEncoder = new Element(STYLES);
|
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 authorityURLListEncoder = new Element(AUTHORITY_URLS);
|
||||||
final private Element identifierListEncoder = new Element(IDENTIFIERS);
|
final private Element identifierListEncoder = new Element(IDENTIFIERS);
|
||||||
|
|
||||||
@ -164,6 +166,20 @@ public class GSLayerEncoder extends PropertyXMLEncoder {
|
|||||||
protected void addDefaultStyle(String defaultStyle) {
|
protected void addDefaultStyle(String defaultStyle) {
|
||||||
add("defaultStyle", defaultStyle);
|
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.
|
* @param defaultStyle The style that will be applied if no style is specified.
|
||||||
@ -175,6 +191,15 @@ public class GSLayerEncoder extends PropertyXMLEncoder {
|
|||||||
set("defaultStyle", defaultStyle);
|
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
|
* Add a style
|
||||||
*
|
*
|
||||||
|
|||||||
@ -528,7 +528,7 @@ public class GeoServerRESTStyleManager extends GeoServerRESTAbstractManager {
|
|||||||
*/
|
*/
|
||||||
public boolean publishStyleInWorkspace(final String workspace, String sldBody) {
|
public boolean publishStyleInWorkspace(final String workspace, String sldBody) {
|
||||||
try {
|
try {
|
||||||
return publishStyleInWorkspace(workspace, sldBody);
|
return publishStyleInWorkspace(workspace, sldBody, null);
|
||||||
} catch (IllegalArgumentException e) {
|
} catch (IllegalArgumentException e) {
|
||||||
if (LOGGER.isErrorEnabled()) {
|
if (LOGGER.isErrorEnabled()) {
|
||||||
LOGGER.error(e.getLocalizedMessage(), e);
|
LOGGER.error(e.getLocalizedMessage(), e);
|
||||||
|
|||||||
@ -111,4 +111,12 @@ public class GSLayerEncoderTest {
|
|||||||
Assert.assertEquals("authority1", el.getChild("authority").getValue());
|
Assert.assertEquals("authority1", el.getChild("authority").getValue());
|
||||||
Assert.assertEquals("identifier1", el.getChild("identifier").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());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -25,9 +25,14 @@
|
|||||||
|
|
||||||
package it.geosolutions.geoserver.rest.publisher;
|
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.GeoServerRESTPublisher.StoreType;
|
||||||
import it.geosolutions.geoserver.rest.GeoserverRESTTest;
|
import it.geosolutions.geoserver.rest.GeoserverRESTTest;
|
||||||
import it.geosolutions.geoserver.rest.decoder.RESTCoverageStore;
|
import it.geosolutions.geoserver.rest.decoder.RESTCoverageStore;
|
||||||
|
import it.geosolutions.geoserver.rest.decoder.RESTLayer;
|
||||||
import it.geosolutions.geoserver.rest.encoder.GSResourceEncoder.ProjectionPolicy;
|
import it.geosolutions.geoserver.rest.encoder.GSResourceEncoder.ProjectionPolicy;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
@ -35,7 +40,6 @@ import java.io.FileNotFoundException;
|
|||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import static org.junit.Assert.*;
|
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
import org.springframework.core.io.ClassPathResource;
|
import org.springframework.core.io.ClassPathResource;
|
||||||
@ -125,6 +129,38 @@ public class GeoserverRESTGeoTiffTest extends GeoserverRESTTest {
|
|||||||
assertFalse(reader.existsCoveragestore(DEFAULT_WS, storeName));
|
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
|
@Test
|
||||||
public void testReloadCoverageStore() throws FileNotFoundException, IOException {
|
public void testReloadCoverageStore() throws FileNotFoundException, IOException {
|
||||||
|
|||||||
@ -240,6 +240,52 @@ public class GeoserverRESTShapeTest extends GeoserverRESTTest {
|
|||||||
assertTrue("Unpublish() failed", oksld);
|
assertTrue("Unpublish() failed", oksld);
|
||||||
assertFalse(reader.existsStyle(styleName));
|
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
|
@Test
|
||||||
public void testPublishDeleteShapeZipWithParams() throws FileNotFoundException, IOException {
|
public void testPublishDeleteShapeZipWithParams() throws FileNotFoundException, IOException {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user