From 1c60c1d94a5ab14d2da25a38d93d13f1c0879abf Mon Sep 17 00:00:00 2001 From: rotz_he Date: Fri, 31 Jan 2014 12:04:45 +0100 Subject: [PATCH 1/4] added possiblity to alter the Coverage Band Details of layers & WCS EO tag --- .../geoserver/rest/decoder/RESTResource.java | 50 ++- .../rest/encoder/GSResourceEncoder.java | 55 ++- .../GSCoverageDimensionEncoder.java | 394 ++++++++++++++++++ .../decoder/ResourceDecoderTest.java | 17 +- .../GSCoverageDimensionEncoderTest.java | 70 ++++ .../encoder/feature/GSFeatureEncoderTest.java | 23 + .../resources/testdata/coverageExample.xml | 243 ++++++----- 7 files changed, 736 insertions(+), 116 deletions(-) create mode 100644 src/main/java/it/geosolutions/geoserver/rest/encoder/dimensions/GSCoverageDimensionEncoder.java create mode 100644 src/test/java/it/geosolutions/geoserver/rest/encoder/dimensions/GSCoverageDimensionEncoderTest.java diff --git a/src/main/java/it/geosolutions/geoserver/rest/decoder/RESTResource.java b/src/main/java/it/geosolutions/geoserver/rest/decoder/RESTResource.java index 26f8b56..96a2b68 100644 --- a/src/main/java/it/geosolutions/geoserver/rest/decoder/RESTResource.java +++ b/src/main/java/it/geosolutions/geoserver/rest/decoder/RESTResource.java @@ -26,13 +26,13 @@ package it.geosolutions.geoserver.rest.decoder; import it.geosolutions.geoserver.rest.decoder.utils.JDOMBuilder; +import it.geosolutions.geoserver.rest.encoder.dimensions.GSCoverageDimensionEncoder; import it.geosolutions.geoserver.rest.encoder.feature.FeatureTypeAttribute; import it.geosolutions.geoserver.rest.encoder.feature.GSAttributeEncoder; import it.geosolutions.geoserver.rest.encoder.metadatalink.GSMetadataLinkInfoEncoder; import it.geosolutions.geoserver.rest.encoder.metadatalink.ResourceMetadataLinkInfo; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; import java.util.Map; @@ -182,5 +182,51 @@ public class RESTResource { } return metaLinksList; } + + /** + * Decodes the list of GSCoverageDimensionEncoder from the GeoServer Resource + * + * @author Henry Rotzoll + * + * @return the list of GSCoverageDimensionEncoder + */ + public List getEncodedDimensionsInfoList() + { + List dimensionList = null; + final Element dimensionsRoot = rootElem.getChild("dimensions"); + + if(dimensionsRoot!=null) + { + final List dimensions = dimensionsRoot.getChildren(); + if (dimensions != null) + { + dimensionList = new ArrayList(dimensions.size()); + for (Element coverageDimension : dimensions) + { + final String name = coverageDimension.getChildText("name"); + final String description = coverageDimension.getChildText("description"); + String rangeMin = null; + String rangeMax = null; + final Element rangeElement = coverageDimension.getChild("range"); + if(rangeElement != null) + { + rangeMin = rangeElement.getChildText("min"); + rangeMax = rangeElement.getChildText("max"); + } + final String unit = coverageDimension.getChildText("unit"); + String dimensionTypeName = null; + final Element dimensionTypeElement = coverageDimension.getChild("dimensionType"); + if(dimensionTypeElement != null) + { + dimensionTypeName = dimensionTypeElement.getChildText("name"); + } + final GSCoverageDimensionEncoder coverageDimensionEncoder = new GSCoverageDimensionEncoder(name, description, rangeMin, rangeMax, unit, dimensionTypeName); + dimensionList.add(coverageDimensionEncoder); + } -} + } + } + + return dimensionList; + } +} \ No newline at end of file diff --git a/src/main/java/it/geosolutions/geoserver/rest/encoder/GSResourceEncoder.java b/src/main/java/it/geosolutions/geoserver/rest/encoder/GSResourceEncoder.java index 2511216..e36309b 100644 --- a/src/main/java/it/geosolutions/geoserver/rest/encoder/GSResourceEncoder.java +++ b/src/main/java/it/geosolutions/geoserver/rest/encoder/GSResourceEncoder.java @@ -26,6 +26,7 @@ package it.geosolutions.geoserver.rest.encoder; import it.geosolutions.geoserver.rest.encoder.coverage.GSCoverageEncoder; +import it.geosolutions.geoserver.rest.encoder.dimensions.GSCoverageDimensionEncoder; import it.geosolutions.geoserver.rest.encoder.feature.GSFeatureTypeEncoder; import it.geosolutions.geoserver.rest.encoder.metadata.GSDimensionInfoEncoder; import it.geosolutions.geoserver.rest.encoder.metadata.GSFeatureDimensionInfoEncoder; @@ -57,10 +58,12 @@ public abstract class GSResourceEncoder public final static String METADATA="metadata"; public final static String KEYWORDS="keywords"; public final static String METADATALINKS="metadataLinks"; + public final static String DIMENSIONS="dimensions"; final private GSMetadataEncoder metadata = new GSMetadataEncoder(); final private Element keywordsListEncoder = new Element(KEYWORDS); final private Element metadataLinksListEncoder = new Element(METADATALINKS); + final private Element dimensionsEncoder = new Element(DIMENSIONS); private class GSMetadataEncoder extends NestedElementEncoder{ public GSMetadataEncoder() { @@ -69,7 +72,7 @@ public abstract class GSResourceEncoder } /** - * @param rootName + * @param rootName * Actually 'feature' or 'coverage' * @see GSFeatureTypeEncoder * @see GSCoverageEncoder @@ -131,6 +134,10 @@ public abstract class GSResourceEncoder public void setMetadataDimension(String key, GSDimensionInfoEncoder dimensionInfo) { setMetadataDimension(key, dimensionInfo, false); + } + + public void setMetadataString(String key, String value) { + metadata.set(key, value); } /** @@ -227,6 +234,52 @@ public abstract class GSResourceEncoder : true; } + /** + * Adds a CoverageDimensionInfo to the GeoServer Resource + * + * @param coverageDimensionInfo + * + * @author Henry Rotzoll + */ + public void addCoverageDimensionInfo (GSCoverageDimensionEncoder coverageDimensionInfo) { + if(ElementUtils.contains(getRoot(), DIMENSIONS) == null)addContent(dimensionsEncoder); + dimensionsEncoder.addContent(coverageDimensionInfo.getRoot()); + } + + /** + * Adds quickly a CoverageDimensionInfo to the GeoServer Resource + * + * @author Henry Rotzoll + * + * @param name + * @param description + * @param rangeMin + * @param rangeMax + * @param unit + * @param dimensionType + */ + public void addCoverageDimensionInfo(String name, String description, String rangeMin, String rangeMax, String unit, String dimensionType) { + final GSCoverageDimensionEncoder coverageDimensionEncoder = new GSCoverageDimensionEncoder( + name, description, rangeMin, rangeMax, unit, dimensionType); + addCoverageDimensionInfo(coverageDimensionEncoder); + } + + /** + * Deletes a CoverageDimensionInfo from the list using the CoverageDimension Name + * (CoverageDimensionInfo content) + * + * @author Henry Rotzoll + * + * @param coverageDimensionName + * @return true if something is removed, false otherwise + */ + public boolean delCoverageDimensionInfo(final String coverageDimensionName) { + return (dimensionsEncoder + .removeContent(GSCoverageDimensionEncoder + .getFilterByContent(coverageDimensionName))).size() == 0 ? false + : true; + } + /** * Reprojection policy for a published layer. One of: diff --git a/src/main/java/it/geosolutions/geoserver/rest/encoder/dimensions/GSCoverageDimensionEncoder.java b/src/main/java/it/geosolutions/geoserver/rest/encoder/dimensions/GSCoverageDimensionEncoder.java new file mode 100644 index 0000000..5adbbf8 --- /dev/null +++ b/src/main/java/it/geosolutions/geoserver/rest/encoder/dimensions/GSCoverageDimensionEncoder.java @@ -0,0 +1,394 @@ +/* + * GeoServer-Manager - Simple Manager Library for GeoServer + * + * Copyright (C) 2007,2011 GeoSolutions S.A.S. + * http://www.geo-solutions.it + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +package it.geosolutions.geoserver.rest.encoder.dimensions; + +import it.geosolutions.geoserver.rest.encoder.utils.ElementUtils; +import it.geosolutions.geoserver.rest.encoder.utils.XmlElement; + +import org.jdom.Element; +import org.jdom.filter.Filter; + +/** + * GSCoverageDimension - encodes a CoverageDimension for a given GeoServer Resource + * (feature type /coverage), as follows: + *
+ * {@code
+ * final GSCoverageDimensionEncoder gsCoverageDimensionEncoder = new GSCoverageDimensionEncoder("GRAY_INDEX", "GridSampleDimension[-2.147483648E9,-2.147483648E9]", String.valueOf(Integer.MIN_VALUE), String.valueOf(Integer.MAX_VALUE), "dobson units³", "REAL_32BITS");
+ *  coverageEncoder.addCoverageDimensionInfo(gsCoverageDimensionEncoder);
+ * }
+ * 
+ * For this example, the XML output is: + *
+ * {@code
+ *
+ *	GRAY_INDEX
+ *	GridSampleDimension[-2.147483648E9,2.147483648E9]
+ *	
+ *		-2.147483648E9
+ *		2.147483647E9
+ *	
+ *	dobson units³
+ *	
+ * 		REAL_32BITS
+ * 	
+ *
+ * }
+ * 
+ * + * @author Henry Rotzoll (henry.rotzoll@dlr.de) + * + */ +public class GSCoverageDimensionEncoder extends XmlElement { + + /** A class to filter the GSCoverageDimension by content + * + * + */ + private static class filterByContent implements Filter { + + final private String key; + + public filterByContent(String content) { + this.key = content; + } + + private static final long serialVersionUID = 1L; + + public boolean matches(Object obj) { + Element el = ((Element) obj) + .getChild("name"); + if (el != null && el.getTextTrim().equals(key)) { + return true; + } + return false; + } + } + + /** + * Get a Filter using the GSCoverageDimensionEncoder content (GSCoverageDimensionEncoder name) + * + * @param content + * @return the filter + */ + public static Filter getFilterByContent(String content) { + return new filterByContent(content); + } + + /** + * Constructs a new GSCoverageDimensionEncoder + * + */ + public GSCoverageDimensionEncoder() { + super("coverageDimension"); + } + + /** + * Constructs quickly a GSCoverageDimensionEncoder info + * + * @param name + * @param description + * @param rangeMin + * @param rangeMax + * @param unit + * @param dimensionTypeName + */ + public GSCoverageDimensionEncoder(String name, String description, String rangeMin, String rangeMax, String unit, String dimensionTypeName) { + super("coverageDimension"); + this.setup(name, description, rangeMin, rangeMax, unit, dimensionTypeName); + } + + /** + * Set-up quickly a GSCoverageDimensionEncoder info + * + * @param name + * @param description + * @param rangeMin + * @param rangeMax + * @param unit + * @param dimensionTypeName + */ + protected void setup(String name, String description, String rangeMin, String rangeMax, String unit, String dimensionTypeName) + { + //name + setName(name); + + //description + setDescription(description); + + //range + setRange(rangeMin, rangeMax); + + //unit + setUnit(unit); + + //dimension Type + setDimensionType(dimensionTypeName); + } + + + /** + * Get the value of the GSCoverageDimensionEncoder member + * + * @param memberName + * @return the value of the GSCoverageDimensionEncoder member + */ + protected String getMember(String memberName) { + Element el = this.getRoot().getChild(memberName.toString()); + if (el != null) + return el.getTextTrim(); + else + return null; + } + + /** + * Deletes a GSCoverageDimensionEncoder member + * + * @param memberName + * @return true if the GSCoverageDimensionEncoder member is removed + */ + protected boolean delMemberIfExists(String memberName) { + if(ElementUtils.contains(getRoot(), memberName) != null) + { + return ElementUtils.remove(this.getRoot(), this.getRoot().getChild(memberName.toString())); + } + + return false; + } + + /** + * Set a GSCoverageDimensionEncoder member + * + * @param memberName + * @param memberValue + */ + protected void setMember(String memberName, String memberValue) { + if(memberName != null && !memberName.isEmpty() && memberValue != null && !memberValue.isEmpty()) + { + delMemberIfExists(memberName); //delete the element if it already exists + addMember(memberName.toString(), memberValue); + } + } + + /** + * adds a GSCoverageDimensionEncoder member + * + * @param memberName + * @param memberValue + */ + protected void addMember(String memberName, String memberValue) { + if(memberName != null && !memberName.isEmpty() && memberValue != null && ! memberValue.isEmpty()) + { + set(memberName.toString(), memberValue); + } + } + + /** + * Set the name + * + * @param name + */ + public void setName(String name){ + setMember("name", name); + } + + /** + * Deletes the name + * + * @param name + * @return true if removed + */ + public boolean delName(){ + return this.delMemberIfExists("name"); + } + + /** + * Get the description + * + * @return description + */ + public String getName(){ + return this.getMember("name"); + } + + /** + * Set the description + * + * @param description + */ + public void setDescription(String description){ + setMember("description", description); + } + + /** + * Deletes the description + * + * @param description + * @return true if removed + */ + public boolean delDescription(){ + return this.delMemberIfExists("description"); + } + + /** + * Get the description + * + * @return description + */ + public String getDescription(){ + return this.getMember("description"); + } + + /** + * Set the range + * + * @param range + */ + public void setRange(String rangeMin, String rangeMax){ + if(rangeMin != null && !rangeMin.isEmpty() && rangeMax != null && !rangeMax.isEmpty()) + { + remove("range"); + + final Element rangeElement = new Element("range"); + final Element rangeMinElement = new Element("min"); + rangeMinElement.setText(rangeMin); + final Element rangeMaxElement = new Element("max"); + rangeMaxElement.setText(rangeMax); + rangeElement.addContent(rangeMinElement); + rangeElement.addContent(rangeMaxElement); + addContent(rangeElement); + } + } + + /** + * Deletes the range + * + * @param range + * @return true if removed + */ + public boolean delRange(){ + return this.delMemberIfExists("range"); + } + + /** + * Get the range min + * + * @return range min + */ + public String getRangeMin(){ + final Element range = this.getRoot().getChild("range"); + if(range != null) + { + return range.getChildText("min"); + } + + return null; + } + + /** + * Get the range max + * + * @return range max + */ + public String getRangeMax(){ + final Element range = this.getRoot().getChild("range"); + if(range != null) + { + return range.getChildText("max"); + } + + return null; + } + + /** + * Set the unit + * + * @param unit + */ + public void setUnit(String unit){ + setMember("unit", unit); + } + + /** + * Deletes the type + * + * @param type + * @return true if removed + */ + public boolean delUnit(){ + return this.delMemberIfExists("unit"); + } + + /** + * Get the unit + * + * @return unit + */ + public String getUnit(){ + return this.getMember("unit"); + } + + /** + * Set the dimensionType + * + * @param dimensionType + */ + public void setDimensionType(String dimensionTypeName){ + if(dimensionTypeName != null && !dimensionTypeName.isEmpty()) + { + remove("dimensionType"); + + final Element dimensionTypeElement = new Element("dimensionType"); + final Element dimensionNameElement = new Element("name"); + dimensionNameElement.setText(dimensionTypeName); + dimensionTypeElement.addContent(dimensionNameElement); + addContent(dimensionTypeElement); + } + } + + /** + * Deletes the dimensionType + * + * @param dimensionType + * @return true if removed + */ + public boolean delDimensionType(){ + return this.delMemberIfExists("dimensionType"); + } + + /** + * Get the dimensionType name + * + * @return dimensionType name + */ + public String getDimensionTypeName(){ + final Element dimensionType = this.getRoot().getChild("dimensionType"); + if(dimensionType != null) + { + return dimensionType.getChildText("name"); + } + + return null; + } +} \ No newline at end of file diff --git a/src/test/java/it/geosolutions/geoserver/decoder/ResourceDecoderTest.java b/src/test/java/it/geosolutions/geoserver/decoder/ResourceDecoderTest.java index c06325e..d06ca93 100644 --- a/src/test/java/it/geosolutions/geoserver/decoder/ResourceDecoderTest.java +++ b/src/test/java/it/geosolutions/geoserver/decoder/ResourceDecoderTest.java @@ -1,7 +1,7 @@ package it.geosolutions.geoserver.decoder; import it.geosolutions.geoserver.rest.decoder.RESTCoverage; -import it.geosolutions.geoserver.rest.encoder.feature.GSAttributeEncoder; +import it.geosolutions.geoserver.rest.encoder.dimensions.GSCoverageDimensionEncoder; import it.geosolutions.geoserver.rest.encoder.metadatalink.GSMetadataLinkInfoEncoder; import java.io.File; @@ -18,6 +18,7 @@ import org.springframework.core.io.ClassPathResource; * ResourceDecoderTest * * @author eblondel + * @author Henry Rotzoll (henry.rotzoll@dlr.de) * */ public class ResourceDecoderTest { @@ -111,5 +112,19 @@ public class ResourceDecoderTest { } + @Test + public void testCoverageDimension() throws IOException{ + + List list = coverage.getEncodedDimensionsInfoList(); + + GSCoverageDimensionEncoder coverageDimension1 = list.get(0); + Assert.assertEquals("GRAY_INDEX", coverageDimension1.getName()); + Assert.assertEquals("GridSampleDimension[-Infinity,Infinity]", coverageDimension1.getDescription()); + Assert.assertEquals("-inf", coverageDimension1.getRangeMin()); + Assert.assertEquals("inf", coverageDimension1.getRangeMax()); + Assert.assertEquals("dobson units³", coverageDimension1.getUnit()); + Assert.assertEquals("REAL_32BITS", coverageDimension1.getDimensionTypeName()); + } + } diff --git a/src/test/java/it/geosolutions/geoserver/rest/encoder/dimensions/GSCoverageDimensionEncoderTest.java b/src/test/java/it/geosolutions/geoserver/rest/encoder/dimensions/GSCoverageDimensionEncoderTest.java new file mode 100644 index 0000000..1b90f8e --- /dev/null +++ b/src/test/java/it/geosolutions/geoserver/rest/encoder/dimensions/GSCoverageDimensionEncoderTest.java @@ -0,0 +1,70 @@ +/* + * Copyright (C) 2007 - 2011 GeoSolutions S.A.S. + * http://www.geo-solutions.it + * + * GPLv3 + Classpath exception + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package it.geosolutions.geoserver.rest.encoder.dimensions; + +import junit.framework.Assert; + +import org.junit.Test; + +/** +* +* @author Henry Rotzoll (henry.rotzoll@dlr.de) +* +*/ +public class GSCoverageDimensionEncoderTest { + + @Test + public void coverageDimensionTest(){ + GSCoverageDimensionEncoder encoder = new GSCoverageDimensionEncoder("GRAY_INDEX", "GridSampleDimension[-Infinity,Infinity]", "-inf", "inf", "dobson units³", "REAL_32BITS"); + + Assert.assertEquals("GRAY_INDEX", encoder.getName()); + Assert.assertEquals("GridSampleDimension[-Infinity,Infinity]", encoder.getDescription()); + Assert.assertEquals("-inf", encoder.getRangeMin()); + Assert.assertEquals("inf", encoder.getRangeMax()); + Assert.assertEquals("dobson units³", encoder.getUnit()); + Assert.assertEquals("REAL_32BITS", encoder.getDimensionTypeName()); + + Assert.assertTrue(encoder.delName()); + Assert.assertTrue(encoder.delDescription()); + Assert.assertTrue(encoder.delRange()); + Assert.assertTrue(encoder.delUnit()); + Assert.assertTrue(encoder.delDimensionType()); + + Assert.assertNull( encoder.getName()); + Assert.assertNull(encoder.getDescription()); + Assert.assertNull(encoder.getRangeMin()); + Assert.assertNull(encoder.getRangeMax()); + Assert.assertNull(encoder.getUnit()); + Assert.assertNull(encoder.getDimensionTypeName()); + + encoder.setName("GRAY_INDEX"); + encoder.setDescription("GridSampleDimension[-Infinity,Infinity]"); + encoder.setRange("-inf", "inf"); + encoder.setUnit("dobson units³"); + encoder.setDimensionType("REAL_32BITS"); + + Assert.assertEquals("GRAY_INDEX", encoder.getName()); + Assert.assertEquals("GridSampleDimension[-Infinity,Infinity]", encoder.getDescription()); + Assert.assertEquals("-inf", encoder.getRangeMin()); + Assert.assertEquals("inf", encoder.getRangeMax()); + Assert.assertEquals("dobson units³", encoder.getUnit()); + Assert.assertEquals("REAL_32BITS", encoder.getDimensionTypeName()); + } +} \ No newline at end of file diff --git a/src/test/java/it/geosolutions/geoserver/rest/encoder/feature/GSFeatureEncoderTest.java b/src/test/java/it/geosolutions/geoserver/rest/encoder/feature/GSFeatureEncoderTest.java index e5f730b..3465ab4 100644 --- a/src/test/java/it/geosolutions/geoserver/rest/encoder/feature/GSFeatureEncoderTest.java +++ b/src/test/java/it/geosolutions/geoserver/rest/encoder/feature/GSFeatureEncoderTest.java @@ -28,6 +28,7 @@ import it.geosolutions.geoserver.rest.encoder.GSLayerEncoder; import it.geosolutions.geoserver.rest.encoder.GSLayerEncoder21; import it.geosolutions.geoserver.rest.encoder.GSResourceEncoder; import it.geosolutions.geoserver.rest.encoder.authorityurl.GSAuthorityURLInfoEncoder; +import it.geosolutions.geoserver.rest.encoder.dimensions.GSCoverageDimensionEncoder; import it.geosolutions.geoserver.rest.encoder.identifier.GSIdentifierInfoEncoder; import it.geosolutions.geoserver.rest.encoder.metadata.GSDimensionInfoEncoder; import it.geosolutions.geoserver.rest.encoder.metadata.GSDimensionInfoEncoder.Presentation; @@ -60,6 +61,7 @@ import org.springframework.core.io.ClassPathResource; * @author Carlo Cancellieri - carlo.cancellieri@geo-solutions.it * @author Emmanuel Blondel - emmanuel.blondel1@gmail.com | * emmanuel.blondel@fao.org + * @author Henry Rotzoll (henry.rotzoll@dlr.de) */ public class GSFeatureEncoderTest extends GeoserverRESTTest { protected final static Logger LOGGER = LoggerFactory.getLogger(GSFeatureEncoderTest.class); @@ -91,6 +93,9 @@ public class GSFeatureEncoderTest extends GeoserverRESTTest { "http://www.organization.org/metadata1"); fte.addMetadataLinkInfo(metadatalink); + GSCoverageDimensionEncoder gsCoverageDimensionEncoder = new GSCoverageDimensionEncoder("GRAY_INDEX", "GridSampleDimension[-Infinity,Infinity]", "-inf", "inf", "dobson units³", "REAL_32BITS"); + fte.addCoverageDimensionInfo(gsCoverageDimensionEncoder); + GSLayerEncoder layerEncoder = null; if (!GSVersionDecoder.VERSION.getVersion(VERSION).equals( GSVersionDecoder.VERSION.UNRECOGNIZED)) { @@ -147,6 +152,24 @@ public class GSFeatureEncoderTest extends GeoserverRESTTest { layerEncoder)); } + + @Test + public void testCoverageDimension() throws IOException { + GSFeatureTypeEncoder fte = new GSFeatureTypeEncoder(); + fte.setNativeName("testlayer"); + fte.setName("testlayer" + "_NEW"); + fte.setTitle("title"); + fte.setNativeCRS("EPSG:4326"); + fte.setDescription("desc"); + fte.setEnabled(true); + + assertFalse(fte.toString().contains("GRAY_INDEXGridSampleDimension[-Infinity,Infinity]-infinfdobson units³REAL_32BITS")); + + GSCoverageDimensionEncoder gsCoverageDimensionEncoder = new GSCoverageDimensionEncoder("GRAY_INDEX", "GridSampleDimension[-Infinity,Infinity]", "-inf", "inf", "dobson units³", "REAL_32BITS"); + fte.addCoverageDimensionInfo(gsCoverageDimensionEncoder); + LOGGER.debug("fte.toString() :" + fte.toString()); + assertTrue(fte.toString().contains("GRAY_INDEXGridSampleDimension[-Infinity,Infinity]-infinfdobson units³REAL_32BITS")); + } @Test diff --git a/src/test/resources/testdata/coverageExample.xml b/src/test/resources/testdata/coverageExample.xml index a049536..ca83250 100644 --- a/src/test/resources/testdata/coverageExample.xml +++ b/src/test/resources/testdata/coverageExample.xml @@ -1,115 +1,134 @@ - granuleTestMosaic - granuleTestMosaic - this is an abstract - - topp - - - granuleTestMosaic - - keyword1 - keyword2 - keyword3 - - - - text/xml - ISO19115:2003 - http://www.organization.org/metadata1 - - - text/html - ISO19115:2003 - http://www.organization.org/metadata2 - - - GEOGCS["WGS 84", - DATUM["World Geodetic System 1984", - SPHEROID["WGS 84", 6378137.0, 298.257223563, AUTHORITY["EPSG","7030"]], - AUTHORITY["EPSG","6326"]], - PRIMEM["Greenwich", 0.0, AUTHORITY["EPSG","8901"]], - UNIT["degree", 0.017453292519943295], - AXIS["Geodetic longitude", EAST], - AXIS["Geodetic latitude", NORTH], - AUTHORITY["EPSG","4326"]] - EPSG:4326 - - -180.0 - 180.0 - -90.0 - 90.0 - EPSG:4326 - - - -180.0 - 180.0 - -90.0 - 90.0 - EPSG:4326 - - NONE - true - true - - - - true - LIST - - - - - true - DISCRETE_INTERVAL - 2 - - - - - granuleTestMosaic - - - - - 0 0 - 540 270 - - - 0.6666666666666666 - -0.6666666666666666 - 0.0 - 0.0 - -179.66666666666666 - 89.66666666666667 - - EPSG:4326 - - - - AllowMultithreading - false - - - MaxAllowedTiles - 2147483647 - - - InputTransparentColor - - - - SUGGESTED_TILE_SIZE - 256,256 - - - USE_JAI_IMAGEREAD - false - - - BackgroundValues - -1.0 - - + granuleTestMosaic + granuleTestMosaic + this is an abstract + + topp + + + granuleTestMosaic + + keyword1 + keyword2 + keyword3 + + + + text/xml + ISO19115:2003 + http://www.organization.org/metadata1 + + + text/html + ISO19115:2003 + http://www.organization.org/metadata2 + + + GEOGCS["WGS 84", + DATUM["World Geodetic System 1984", + SPHEROID["WGS 84", 6378137.0, 298.257223563, + AUTHORITY["EPSG","7030"]], + AUTHORITY["EPSG","6326"]], + PRIMEM["Greenwich", 0.0, + AUTHORITY["EPSG","8901"]], + UNIT["degree", 0.017453292519943295], + AXIS["Geodetic longitude", EAST], + AXIS["Geodetic latitude", NORTH], + AUTHORITY["EPSG","4326"]] + EPSG:4326 + + -180.0 + 180.0 + -90.0 + 90.0 + EPSG:4326 + + + -180.0 + 180.0 + -90.0 + 90.0 + EPSG:4326 + + NONE + true + true + + + + true + LIST + + + + + true + DISCRETE_INTERVAL + 2 + + + + + granuleTestMosaic + + + + + 0 0 + 540 270 + + + 0.6666666666666666 + -0.6666666666666666 + 0.0 + 0.0 + -179.66666666666666 + 89.66666666666667 + + EPSG:4326 + + + + GRAY_INDEX + GridSampleDimension[-Infinity,Infinity] + + -inf + inf + + dobson units³ + + REAL_32BITS + + + + + + AllowMultithreading + false + + + MaxAllowedTiles + 2147483647 + + + InputTransparentColor + + + + SUGGESTED_TILE_SIZE + 256,256 + + + USE_JAI_IMAGEREAD + false + + + BackgroundValues + -1.0 + + \ No newline at end of file From 0f833b2664c928c1f47ad97c74eaa0ef669a0882 Mon Sep 17 00:00:00 2001 From: carlo cancellieri Date: Tue, 4 Feb 2014 19:02:23 +0100 Subject: [PATCH 2/4] fix GSCoverageEncoder. fix integration some test. TODO run integration tests. --- .../geoserver/rest/decoder/RESTResource.java | 180 +++-- .../rest/encoder/GSResourceEncoder.java | 657 ++++++++--------- .../encoder/coverage/GSCoverageEncoder.java | 72 +- .../GSCoverageDimensionEncoder.java | 677 +++++++++--------- .../decoder/ResourceDecoderTest.java | 185 +++-- .../coverage/GSCoverageEncoderTest.java | 9 + .../GSCoverageDimensionEncoderTest.java | 89 +-- .../encoder/feature/GSFeatureEncoderTest.java | 223 +++--- .../GeoserverRESTImageMosaicTest.java | 30 +- .../resources/testdata/coverageExample.xml | 10 +- 10 files changed, 1067 insertions(+), 1065 deletions(-) diff --git a/src/main/java/it/geosolutions/geoserver/rest/decoder/RESTResource.java b/src/main/java/it/geosolutions/geoserver/rest/decoder/RESTResource.java index 96a2b68..9840c17 100644 --- a/src/main/java/it/geosolutions/geoserver/rest/decoder/RESTResource.java +++ b/src/main/java/it/geosolutions/geoserver/rest/decoder/RESTResource.java @@ -43,8 +43,9 @@ import org.jdom.Namespace; * Parse a resource (FeatureType or Coverage) returned as XML REST objects. * * @author etj - * @author Emmanuel Blondel - emmanuel.blondel1@gmail.com | - * emmanuel.blondel@fao.org + * @author Emmanuel Blondel - emmanuel.blondel1@gmail.com | emmanuel.blondel@fao.org + * @author Henry Rotzoll + * */ public class RESTResource { protected final Element rootElem; @@ -74,23 +75,22 @@ public class RESTResource { return rootElem.getChildText("abstract"); } - public List getKeywords(){ - List kwdsList = null; - - final Element keywordsRoot = rootElem.getChild("keywords"); - if(keywordsRoot != null){ - final List keywords = keywordsRoot.getChildren(); - if(keywords != null){ - kwdsList = new ArrayList(keywords.size()); - for(Element keyword : keywords){ - kwdsList.add(keyword.getValue()); - } - } - } - return kwdsList; + public List getKeywords() { + List kwdsList = null; + + final Element keywordsRoot = rootElem.getChild("keywords"); + if (keywordsRoot != null) { + final List keywords = keywordsRoot.getChildren(); + if (keywords != null) { + kwdsList = new ArrayList(keywords.size()); + for (Element keyword : keywords) { + kwdsList.add(keyword.getValue()); + } + } + } + return kwdsList; } - - + public String getNameSpace() { return rootElem.getChild("namespace").getChildText("name"); } @@ -154,79 +154,77 @@ public class RESTResource { throw new UnsupportedOperationException("This method is specific for RESTFeatureType"); } - /** - * Decodes the list of MetadataLinkInfo from the GeoServer Resource - * - * @author Emmanuel Blondel - * - * @return the list of GSMetadataLinkEncoder - */ - public List getEncodedMetadataLinkInfoList() { - List metaLinksList = null; + /** + * Decodes the list of MetadataLinkInfo from the GeoServer Resource + * + * @since gs-2.4.x + * + * @return the list of GSMetadataLinkEncoder + */ + public List getEncodedMetadataLinkInfoList() { + List metaLinksList = null; - final Element metaLinksRoot = rootElem.getChild("metadataLinks"); - if(metaLinksRoot!=null){ - final List metaLinks = metaLinksRoot.getChildren(); - if (metaLinks != null) { - metaLinksList = new ArrayList( - metaLinks.size()); - for (Element metaLink : metaLinks) { - final GSMetadataLinkInfoEncoder metaLinkEnc = new GSMetadataLinkInfoEncoder(); - metaLinkEnc.setType(metaLink.getChildText(ResourceMetadataLinkInfo.type.name())); - metaLinkEnc.setMetadataType(metaLink.getChildText(ResourceMetadataLinkInfo.metadataType.name())); - metaLinkEnc.setContent(metaLink.getChildText(ResourceMetadataLinkInfo.content.name())); - metaLinksList.add(metaLinkEnc); - } - - } - } - return metaLinksList; - } - - /** - * Decodes the list of GSCoverageDimensionEncoder from the GeoServer Resource - * - * @author Henry Rotzoll - * - * @return the list of GSCoverageDimensionEncoder - */ - public List getEncodedDimensionsInfoList() - { - List dimensionList = null; - final Element dimensionsRoot = rootElem.getChild("dimensions"); - - if(dimensionsRoot!=null) - { - final List dimensions = dimensionsRoot.getChildren(); - if (dimensions != null) - { - dimensionList = new ArrayList(dimensions.size()); - for (Element coverageDimension : dimensions) - { - final String name = coverageDimension.getChildText("name"); - final String description = coverageDimension.getChildText("description"); - String rangeMin = null; - String rangeMax = null; - final Element rangeElement = coverageDimension.getChild("range"); - if(rangeElement != null) - { - rangeMin = rangeElement.getChildText("min"); - rangeMax = rangeElement.getChildText("max"); - } - final String unit = coverageDimension.getChildText("unit"); - String dimensionTypeName = null; - final Element dimensionTypeElement = coverageDimension.getChild("dimensionType"); - if(dimensionTypeElement != null) - { - dimensionTypeName = dimensionTypeElement.getChildText("name"); - } - final GSCoverageDimensionEncoder coverageDimensionEncoder = new GSCoverageDimensionEncoder(name, description, rangeMin, rangeMax, unit, dimensionTypeName); - dimensionList.add(coverageDimensionEncoder); - } - - } + final Element metaLinksRoot = rootElem.getChild("metadataLinks"); + if (metaLinksRoot != null) { + final List metaLinks = metaLinksRoot.getChildren(); + if (metaLinks != null) { + metaLinksList = new ArrayList(metaLinks.size()); + for (Element metaLink : metaLinks) { + final GSMetadataLinkInfoEncoder metaLinkEnc = new GSMetadataLinkInfoEncoder(); + metaLinkEnc + .setType(metaLink.getChildText(ResourceMetadataLinkInfo.type.name())); + metaLinkEnc.setMetadataType(metaLink + .getChildText(ResourceMetadataLinkInfo.metadataType.name())); + metaLinkEnc.setContent(metaLink.getChildText(ResourceMetadataLinkInfo.content + .name())); + metaLinksList.add(metaLinkEnc); + } + + } } - - return dimensionList; - } + return metaLinksList; + } + + /** + * Decodes the list of GSCoverageDimensionEncoder from the GeoServer Resource + * + * @since gs-2.4.x + * + * @return the list of GSCoverageDimensionEncoder + */ + public List getEncodedDimensionsInfoList() { + List dimensionList = null; + final Element dimensionsRoot = rootElem.getChild("dimensions"); + + if (dimensionsRoot != null) { + final List dimensions = dimensionsRoot.getChildren(); + if (dimensions != null) { + dimensionList = new ArrayList(dimensions.size()); + for (Element coverageDimension : dimensions) { + final String name = coverageDimension.getChildText("name"); + final String description = coverageDimension.getChildText("description"); + String rangeMin = null; + String rangeMax = null; + final Element rangeElement = coverageDimension.getChild("range"); + if (rangeElement != null) { + rangeMin = rangeElement.getChildText("min"); + rangeMax = rangeElement.getChildText("max"); + } + final String unit = coverageDimension.getChildText("unit"); + String dimensionTypeName = null; + final Element dimensionTypeElement = coverageDimension + .getChild("dimensionType"); + if (dimensionTypeElement != null) { + dimensionTypeName = dimensionTypeElement.getChildText("name"); + } + final GSCoverageDimensionEncoder coverageDimensionEncoder = new GSCoverageDimensionEncoder( + name, description, rangeMin, rangeMax, unit, dimensionTypeName); + dimensionList.add(coverageDimensionEncoder); + } + + } + } + + return dimensionList; + } } \ No newline at end of file diff --git a/src/main/java/it/geosolutions/geoserver/rest/encoder/GSResourceEncoder.java b/src/main/java/it/geosolutions/geoserver/rest/encoder/GSResourceEncoder.java index e36309b..7208762 100644 --- a/src/main/java/it/geosolutions/geoserver/rest/encoder/GSResourceEncoder.java +++ b/src/main/java/it/geosolutions/geoserver/rest/encoder/GSResourceEncoder.java @@ -26,7 +26,6 @@ package it.geosolutions.geoserver.rest.encoder; import it.geosolutions.geoserver.rest.encoder.coverage.GSCoverageEncoder; -import it.geosolutions.geoserver.rest.encoder.dimensions.GSCoverageDimensionEncoder; import it.geosolutions.geoserver.rest.encoder.feature.GSFeatureTypeEncoder; import it.geosolutions.geoserver.rest.encoder.metadata.GSDimensionInfoEncoder; import it.geosolutions.geoserver.rest.encoder.metadata.GSFeatureDimensionInfoEncoder; @@ -48,57 +47,58 @@ import org.jdom.filter.Filter; * * @author ETj (etj at geo-solutions.it) * @author Carlo Cancellieri - carlo.cancellieri@geo-solutions.it - * @author Emmanuel Blondel - emmanuel.blondel1@gmail.com | - * emmanuel.blondel@fao.org + * @author Emmanuel Blondel - emmanuel.blondel1@gmail.com | emmanuel.blondel@fao.org + * @author Henry Rotzoll */ -public abstract class GSResourceEncoder - extends PropertyXMLEncoder { - public final static String NAME = "name"; - public final static String NATIVENAME = "nativeName"; - public final static String METADATA="metadata"; - public final static String KEYWORDS="keywords"; - public final static String METADATALINKS="metadataLinks"; - public final static String DIMENSIONS="dimensions"; +public abstract class GSResourceEncoder extends PropertyXMLEncoder { + public final static String NAME = "name"; - final private GSMetadataEncoder metadata = new GSMetadataEncoder(); - final private Element keywordsListEncoder = new Element(KEYWORDS); - final private Element metadataLinksListEncoder = new Element(METADATALINKS); - final private Element dimensionsEncoder = new Element(DIMENSIONS); - - private class GSMetadataEncoder extends NestedElementEncoder{ - public GSMetadataEncoder() { - super(METADATA); - } - } + public final static String NATIVENAME = "nativeName"; - /** - * @param rootName - * Actually 'feature' or 'coverage' - * @see GSFeatureTypeEncoder - * @see GSCoverageEncoder - */ - protected GSResourceEncoder(final String rootName) { - super(rootName); - add("enabled", "true"); + public final static String METADATA = "metadata"; - // Link members to the parent - addContent(metadata.getRoot()); - addContent(keywordsListEncoder); - addContent(metadataLinksListEncoder); - } + public final static String KEYWORDS = "keywords"; - public void setEnabled(boolean enabled) { - set("enabled", (enabled) ? "true" : "false"); - } + public final static String METADATALINKS = "metadataLinks"; - - /** - * @param key - * @param dimensionInfo - */ - protected void addMetadata(String key, XmlElement dimensionInfo) { - metadata.add(key, dimensionInfo.getRoot()); - } + final private GSMetadataEncoder metadata = new GSMetadataEncoder(); + + final private Element keywordsListEncoder = new Element(KEYWORDS); + + final private Element metadataLinksListEncoder = new Element(METADATALINKS); + + private class GSMetadataEncoder extends NestedElementEncoder { + public GSMetadataEncoder() { + super(METADATA); + } + } + + /** + * @param rootName Actually 'feature' or 'coverage' + * @see GSFeatureTypeEncoder + * @see GSCoverageEncoder + */ + protected GSResourceEncoder(final String rootName) { + super(rootName); + add("enabled", "true"); + + // Link members to the parent + addContent(metadata.getRoot()); + addContent(keywordsListEncoder); + addContent(metadataLinksListEncoder); + } + + public void setEnabled(boolean enabled) { + set("enabled", (enabled) ? "true" : "false"); + } + + /** + * @param key + * @param dimensionInfo + */ + protected void addMetadata(String key, XmlElement dimensionInfo) { + metadata.add(key, dimensionInfo.getRoot()); + } /** * @deprecated Use {@link #setMetadataDimension(String, GSDimensionInfoEncoder)} this method will be set as protected for internal use only @@ -108,7 +108,7 @@ public abstract class GSResourceEncoder public void setMetadata(String key, XmlElement dimensionInfo) { metadata.set(key, dimensionInfo.getRoot()); } - + /** * @param key * @param dimensionInfo @@ -116,7 +116,7 @@ public abstract class GSResourceEncoder protected void addMetadataDimension(String key, GSDimensionInfoEncoder dimensionInfo) { addMetadataDimension(key, dimensionInfo, false); } - + /** * Add the metadata for a custom dimension. * @@ -124,21 +124,22 @@ public abstract class GSResourceEncoder * @param dimensionInfo {@link GSDimensionInfoEncoder} with additional information about the dimension * @param custom is the dimension custom or not? */ - protected void addMetadataDimension(String key, GSDimensionInfoEncoder dimensionInfo, boolean custom) { - if(custom){ - metadata.set("custom_dimension_"+key.toUpperCase(), dimensionInfo.getRoot()); - }else{ + protected void addMetadataDimension(String key, GSDimensionInfoEncoder dimensionInfo, + boolean custom) { + if (custom) { + metadata.set("custom_dimension_" + key.toUpperCase(), dimensionInfo.getRoot()); + } else { metadata.add(key, dimensionInfo.getRoot()); } } public void setMetadataDimension(String key, GSDimensionInfoEncoder dimensionInfo) { - setMetadataDimension(key, dimensionInfo, false); + setMetadataDimension(key, dimensionInfo, false); } public void setMetadataString(String key, String value) { - metadata.set(key, value); - } + metadata.set(key, value); + } /** * Set the metadata for a custom dimension. @@ -147,140 +148,85 @@ public abstract class GSResourceEncoder * @param dimensionInfo {@link GSDimensionInfoEncoder} with additional information about the dimension * @param custom is the dimension custom or not? */ - public void setMetadataDimension(String key, GSDimensionInfoEncoder dimensionInfo, boolean custom) { - if(custom){ - metadata.set("custom_dimension_"+key.toUpperCase(), dimensionInfo.getRoot()); - }else{ + public void setMetadataDimension(String key, GSDimensionInfoEncoder dimensionInfo, + boolean custom) { + if (custom) { + metadata.set("custom_dimension_" + key.toUpperCase(), dimensionInfo.getRoot()); + } else { metadata.set(key, dimensionInfo.getRoot()); } - } - /** - * @param key - * the name of the metadata to add (f.e.: elevation, time) - * @return true if something is removed, false otherwise - */ - public boolean delMetadata(String key) { - return metadata.remove(key); - } + } + /** + * @param key the name of the metadata to add (f.e.: elevation, time) + * @return true if something is removed, false otherwise + */ + public boolean delMetadata(String key) { + return metadata.remove(key); + } - public void addKeyword(String keyword) { - final Element el = new Element("string"); - el.setText(keyword); - keywordsListEncoder.addContent(el); - } + public void addKeyword(String keyword) { + final Element el = new Element("string"); + el.setText(keyword); + keywordsListEncoder.addContent(el); + } - /** - * delete a keyword from the list - * - * @param keyword - * @return true if something is removed, false otherwise - */ - public boolean delKeyword(final String keyword) { - final Element el = new Element("string"); - el.setText(keyword); - return (keywordsListEncoder.removeContent(new Filter() { - private static final long serialVersionUID = 1L; + /** + * delete a keyword from the list + * + * @param keyword + * @return true if something is removed, false otherwise + */ + public boolean delKeyword(final String keyword) { + final Element el = new Element("string"); + el.setText(keyword); + return (keywordsListEncoder.removeContent(new Filter() { + private static final long serialVersionUID = 1L; - public boolean matches(Object obj) { - if (((Element) obj).getText().equals(keyword)) { - return true; - } - return false; - } - })).size() == 0 ? false : true; - } + public boolean matches(Object obj) { + if (((Element) obj).getText().equals(keyword)) { + return true; + } + return false; + } + })).size() == 0 ? false : true; + } - /** - * Adds a MetadataLinkInfo to the GeoServer Resource - * - * @param MetadataLink - * - * @author Emmanuel Blondel - */ - public void addMetadataLinkInfo(GSMetadataLinkInfoEncoder metadataLinkInfo) { - metadataLinksListEncoder.addContent(metadataLinkInfo.getRoot()); - } + /** + * Adds a MetadataLinkInfo to the GeoServer Resource + * + * @param MetadataLink + * + */ + public void addMetadataLinkInfo(GSMetadataLinkInfoEncoder metadataLinkInfo) { + metadataLinksListEncoder.addContent(metadataLinkInfo.getRoot()); + } - /** - * Adds quickly a MetadataLinkInfo to the GeoServer Resource - * - * @author Emmanuel Blondel - * - * @param type - * @param metadataType - * @param content - */ - public void addMetadataLinkInfo(String type, String metadataType, - String content) { - final GSMetadataLinkInfoEncoder mde = new GSMetadataLinkInfoEncoder( - type, metadataType, content); - metadataLinksListEncoder.addContent(mde.getRoot()); - } + /** + * Adds quickly a MetadataLinkInfo to the GeoServer Resource + * + * + * @param type + * @param metadataType + * @param content + */ + public void addMetadataLinkInfo(String type, String metadataType, String content) { + final GSMetadataLinkInfoEncoder mde = new GSMetadataLinkInfoEncoder(type, metadataType, + content); + metadataLinksListEncoder.addContent(mde.getRoot()); + } - /** - * Deletes a metadataLinkInfo from the list using the metadataURL - * (MetadataLinkInfo content) - * - * @author Emmanuel Blondel - * - * @param metadataURL - * @return true if something is removed, false otherwise - */ - public boolean delMetadataLinkInfo(final String metadataURL) { - return (metadataLinksListEncoder - .removeContent(GSMetadataLinkInfoEncoder - .getFilterByContent(metadataURL))).size() == 0 ? false - : true; - } - - /** - * Adds a CoverageDimensionInfo to the GeoServer Resource - * - * @param coverageDimensionInfo - * - * @author Henry Rotzoll - */ - public void addCoverageDimensionInfo (GSCoverageDimensionEncoder coverageDimensionInfo) { - if(ElementUtils.contains(getRoot(), DIMENSIONS) == null)addContent(dimensionsEncoder); - dimensionsEncoder.addContent(coverageDimensionInfo.getRoot()); - } + /** + * Deletes a metadataLinkInfo from the list using the metadataURL (MetadataLinkInfo content) + * + * @param metadataURL + * @return true if something is removed, false otherwise + */ + public boolean delMetadataLinkInfo(final String metadataURL) { + return (metadataLinksListEncoder.removeContent(GSMetadataLinkInfoEncoder + .getFilterByContent(metadataURL))).size() == 0 ? false : true; + } - /** - * Adds quickly a CoverageDimensionInfo to the GeoServer Resource - * - * @author Henry Rotzoll - * - * @param name - * @param description - * @param rangeMin - * @param rangeMax - * @param unit - * @param dimensionType - */ - public void addCoverageDimensionInfo(String name, String description, String rangeMin, String rangeMax, String unit, String dimensionType) { - final GSCoverageDimensionEncoder coverageDimensionEncoder = new GSCoverageDimensionEncoder( - name, description, rangeMin, rangeMax, unit, dimensionType); - addCoverageDimensionInfo(coverageDimensionEncoder); - } - - /** - * Deletes a CoverageDimensionInfo from the list using the CoverageDimension Name - * (CoverageDimensionInfo content) - * - * @author Henry Rotzoll - * - * @param coverageDimensionName - * @return true if something is removed, false otherwise - */ - public boolean delCoverageDimensionInfo(final String coverageDimensionName) { - return (dimensionsEncoder - .removeContent(GSCoverageDimensionEncoder - .getFilterByContent(coverageDimensionName))).size() == 0 ? false - : true; - } - - /** * Reprojection policy for a published layer. One of: *
    @@ -289,95 +235,90 @@ public abstract class GSResourceEncoder *
  • {@link #NONE} No reprojection (use native CRS) *
*/ - public enum ProjectionPolicy { + public enum ProjectionPolicy { /** Reproject from native to declared CRS */ REPROJECT_TO_DECLARED, /** Use the declared CRS (ignore native) */ FORCE_DECLARED, /** Keep native */ NONE - } + } - private final static String PROJECTIONPOLICY = "projectionPolicy"; + private final static String PROJECTIONPOLICY = "projectionPolicy"; - /** - * NONE, REPROJECT_TO_DECLARED, FORCE_DECLARED - * - */ - protected void addProjectionPolicy(ProjectionPolicy policy) { - add(PROJECTIONPOLICY, policy.toString()); - } + /** + * NONE, REPROJECT_TO_DECLARED, FORCE_DECLARED + * + */ + protected void addProjectionPolicy(ProjectionPolicy policy) { + add(PROJECTIONPOLICY, policy.toString()); + } - /** - * NONE, REPROJECT_TO_DECLARED, FORCE_DECLARED - */ - public void setProjectionPolicy(ProjectionPolicy policy) { - set(PROJECTIONPOLICY, policy.toString()); - } + /** + * NONE, REPROJECT_TO_DECLARED, FORCE_DECLARED + */ + public void setProjectionPolicy(ProjectionPolicy policy) { + set(PROJECTIONPOLICY, policy.toString()); + } - /** - * Add the 'name' node with a text value from 'name' - * - * @note REQUIRED to configure a resource - */ - protected void addName(final String name) { - add(NAME, name); - } + /** + * Add the 'name' node with a text value from 'name' + * + * @note REQUIRED to configure a resource + */ + protected void addName(final String name) { + add(NAME, name); + } - /** - * Set or modify the 'name' node with a text value from 'name' - * - * @note REQUIRED to configure a resource - */ - public void setName(final String name) { - set(NAME, name); - } + /** + * Set or modify the 'name' node with a text value from 'name' + * + * @note REQUIRED to configure a resource + */ + public void setName(final String name) { + set(NAME, name); + } - public String getName() { - final Element nameNode = ElementUtils.contains(getRoot(), NAME, 1); - if (nameNode != null) - return nameNode.getText(); - else - return null; - } - - - /** - * Add the 'nativename' node with a text value from 'name' - * - * - */ - protected void addNativeName(final String nativename) { - add(NATIVENAME, nativename); - } + public String getName() { + final Element nameNode = ElementUtils.contains(getRoot(), NAME, 1); + if (nameNode != null) + return nameNode.getText(); + else + return null; + } - - /** - * Set or modify the 'nativename' node with a text value from 'name' - * - * @note if not specified, the nativeName will be set with the value of the - * 'name' node. - * - */ - public void setNativeName(final String nativename) { - set(NATIVENAME, nativename); - } + /** + * Add the 'nativename' node with a text value from 'name' + * + * + */ + protected void addNativeName(final String nativename) { + add(NATIVENAME, nativename); + } + + /** + * Set or modify the 'nativename' node with a text value from 'name' + * + * @note if not specified, the nativeName will be set with the value of the 'name' node. + * + */ + public void setNativeName(final String nativename) { + set(NATIVENAME, nativename); + } + + /** + * Get the nativeName + * + * @return + */ + public String getNativeName() { + final Element nameNode = ElementUtils.contains(getRoot(), NATIVENAME, 1); + if (nameNode != null) + return nameNode.getText(); + else + return null; + } - - /** - * Get the nativeName - * - * @return - */ - public String getNativeName() { - final Element nameNode = ElementUtils.contains(getRoot(), NATIVENAME, 1); - if (nameNode != null) - return nameNode.getText(); - else - return null; - } - - private final static String DESCRIPTION = "description"; /** @@ -394,8 +335,9 @@ public abstract class GSResourceEncoder public void setDescription(final String description) { set(DESCRIPTION, description); } - + private final static String ABSTRACT = "abstract"; + /** * Add the 'abstract' node with a text value from 'abstract' * @@ -403,6 +345,7 @@ public abstract class GSResourceEncoder protected void addAbstract(final String _abstract) { add(ABSTRACT, _abstract); } + /** * Set or modify the 'abstract' node with a text value from 'abstract' */ @@ -410,116 +353,124 @@ public abstract class GSResourceEncoder set(ABSTRACT, _abstract); } - private final static String TITLE = "title"; + private final static String TITLE = "title"; - /** - * Add the 'title' node with a text value from 'title' - * - */ - protected void addTitle(final String title) { - add(TITLE, title); - } + /** + * Add the 'title' node with a text value from 'title' + * + */ + protected void addTitle(final String title) { + add(TITLE, title); + } - /** - * Set or modify the 'title' node with a text value from 'title' - */ - public void setTitle(final String title) { - set(TITLE, title); - } + /** + * Set or modify the 'title' node with a text value from 'title' + */ + public void setTitle(final String title) { + set(TITLE, title); + } - private final static String SRS = "srs"; + private final static String SRS = "srs"; - /** - * Add the 'SRS' node with a text value from 'srs' - */ - protected void addSRS(final String srs) { - add(SRS, srs); - } + /** + * Add the 'SRS' node with a text value from 'srs' + */ + protected void addSRS(final String srs) { + add(SRS, srs); + } - /** - * Set or modify the 'SRS' node with a text value from 'srs' - */ - public void setSRS(final String srs) { - set(SRS, srs); - } - - private final static String NATIVECRS = "nativeCRS"; + /** + * Set or modify the 'SRS' node with a text value from 'srs' + */ + public void setSRS(final String srs) { + set(SRS, srs); + } - /** - * Add the 'nativeCRS' node with a text value from 'nativeCRS' - */ - protected void addNativeCRS(final String nativeCRS) { - add(NATIVECRS, nativeCRS); - } + private final static String NATIVECRS = "nativeCRS"; - /** - * Set or modify the 'nativeCRS' node with a text value from 'nativeCRS' - */ - public void setNativeCRS(final String nativeCRS) { - set(NATIVECRS, nativeCRS); - } + /** + * Add the 'nativeCRS' node with a text value from 'nativeCRS' + */ + protected void addNativeCRS(final String nativeCRS) { + add(NATIVECRS, nativeCRS); + } - private final static String LATLONBBMINX = "latLonBoundingBox/minx"; - private final static String LATLONBBMAXX = "latLonBoundingBox/maxx"; - private final static String LATLONBBMINY = "latLonBoundingBox/miny"; - private final static String LATLONBBMAXY = "latLonBoundingBox/maxy"; - private final static String LATLONBBCRS = "latLonBoundingBox/crs"; + /** + * Set or modify the 'nativeCRS' node with a text value from 'nativeCRS' + */ + public void setNativeCRS(final String nativeCRS) { + set(NATIVECRS, nativeCRS); + } - /** - * - * @param minx - * @param maxy - * @param maxx - * @param miny - * @param crs - */ - protected void addLatLonBoundingBox(double minx, double miny, double maxx, - double maxy, final String crs) { - add(LATLONBBMINX, String.valueOf(minx)); - add(LATLONBBMINY, String.valueOf(miny)); - add(LATLONBBMAXY, String.valueOf(maxy)); - add(LATLONBBMAXX, String.valueOf(maxx)); - add(LATLONBBCRS, crs); - } + private final static String LATLONBBMINX = "latLonBoundingBox/minx"; - public void setLatLonBoundingBox(double minx, double miny, double maxx, - double maxy, final String crs) { - set(LATLONBBMINX, String.valueOf(minx)); - set(LATLONBBMAXY, String.valueOf(maxy)); - set(LATLONBBMAXX, String.valueOf(maxx)); - set(LATLONBBMINY, String.valueOf(miny)); - set(LATLONBBCRS, crs); - } + private final static String LATLONBBMAXX = "latLonBoundingBox/maxx"; - private final static String NATIVEBBMINX = "nativeBoundingBox/minx"; - private final static String NATIVEBBMAXX = "nativeBoundingBox/maxx"; - private final static String NATIVEBBMINY = "nativeBoundingBox/miny"; - private final static String NATIVEBBMAXY = "nativeBoundingBox/maxy"; - private final static String NATIVEBBCRS = "nativeBoundingBox/crs"; + private final static String LATLONBBMINY = "latLonBoundingBox/miny"; - /** - * @param minx - * @param maxy - * @param maxx - * @param miny - * @param crs - */ - protected void addNativeBoundingBox(double minx, double miny, double maxx, - double maxy, final String crs) { - add(NATIVEBBMINX, String.valueOf(minx)); - add(NATIVEBBMAXY, String.valueOf(maxy)); - add(NATIVEBBMAXX, String.valueOf(maxx)); - add(NATIVEBBMINY, String.valueOf(miny)); - add(NATIVEBBCRS, crs); - } + private final static String LATLONBBMAXY = "latLonBoundingBox/maxy"; - public void setNativeBoundingBox(double minx, double miny, double maxx, - double maxy, final String crs) { - set(NATIVEBBMINX, String.valueOf(minx)); - set(NATIVEBBMAXY, String.valueOf(maxy)); - set(NATIVEBBMAXX, String.valueOf(maxx)); - set(NATIVEBBMINY, String.valueOf(miny)); - set(NATIVEBBCRS, crs); - } + private final static String LATLONBBCRS = "latLonBoundingBox/crs"; + + /** + * + * @param minx + * @param maxy + * @param maxx + * @param miny + * @param crs + */ + protected void addLatLonBoundingBox(double minx, double miny, double maxx, double maxy, + final String crs) { + add(LATLONBBMINX, String.valueOf(minx)); + add(LATLONBBMINY, String.valueOf(miny)); + add(LATLONBBMAXY, String.valueOf(maxy)); + add(LATLONBBMAXX, String.valueOf(maxx)); + add(LATLONBBCRS, crs); + } + + public void setLatLonBoundingBox(double minx, double miny, double maxx, double maxy, + final String crs) { + set(LATLONBBMINX, String.valueOf(minx)); + set(LATLONBBMAXY, String.valueOf(maxy)); + set(LATLONBBMAXX, String.valueOf(maxx)); + set(LATLONBBMINY, String.valueOf(miny)); + set(LATLONBBCRS, crs); + } + + private final static String NATIVEBBMINX = "nativeBoundingBox/minx"; + + private final static String NATIVEBBMAXX = "nativeBoundingBox/maxx"; + + private final static String NATIVEBBMINY = "nativeBoundingBox/miny"; + + private final static String NATIVEBBMAXY = "nativeBoundingBox/maxy"; + + private final static String NATIVEBBCRS = "nativeBoundingBox/crs"; + + /** + * @param minx + * @param maxy + * @param maxx + * @param miny + * @param crs + */ + protected void addNativeBoundingBox(double minx, double miny, double maxx, double maxy, + final String crs) { + add(NATIVEBBMINX, String.valueOf(minx)); + add(NATIVEBBMAXY, String.valueOf(maxy)); + add(NATIVEBBMAXX, String.valueOf(maxx)); + add(NATIVEBBMINY, String.valueOf(miny)); + add(NATIVEBBCRS, crs); + } + + public void setNativeBoundingBox(double minx, double miny, double maxx, double maxy, + final String crs) { + set(NATIVEBBMINX, String.valueOf(minx)); + set(NATIVEBBMAXY, String.valueOf(maxy)); + set(NATIVEBBMAXX, String.valueOf(maxx)); + set(NATIVEBBMINY, String.valueOf(miny)); + set(NATIVEBBCRS, crs); + } } diff --git a/src/main/java/it/geosolutions/geoserver/rest/encoder/coverage/GSCoverageEncoder.java b/src/main/java/it/geosolutions/geoserver/rest/encoder/coverage/GSCoverageEncoder.java index f08c13a..d549005 100644 --- a/src/main/java/it/geosolutions/geoserver/rest/encoder/coverage/GSCoverageEncoder.java +++ b/src/main/java/it/geosolutions/geoserver/rest/encoder/coverage/GSCoverageEncoder.java @@ -25,38 +25,86 @@ package it.geosolutions.geoserver.rest.encoder.coverage; -import it.geosolutions.geoserver.rest.encoder.GSResourceEncoder; -import it.geosolutions.geoserver.rest.encoder.metadata.GSDimensionInfoEncoder; +import org.jdom.Element; +import it.geosolutions.geoserver.rest.encoder.GSResourceEncoder; +import it.geosolutions.geoserver.rest.encoder.dimensions.GSCoverageDimensionEncoder; +import it.geosolutions.geoserver.rest.encoder.metadata.GSDimensionInfoEncoder; +import it.geosolutions.geoserver.rest.encoder.utils.ElementUtils; /** - * Creates an XML + * Creates an XML * * @author ETj (etj at geo-solutions.it) * @author Carlo Cancellieri - carlo.cancellieri@geo-solutions.it * */ public class GSCoverageEncoder extends GSResourceEncoder { + + public final static String DIMENSIONS = "dimensions"; - public GSCoverageEncoder() { + final private Element dimensionsEncoder = new Element(DIMENSIONS); + + public GSCoverageEncoder() { super("coverage"); - } - + addContent(dimensionsEncoder); + } + /** * @param key * @param dimensionInfo * @deprecated Use {@link GSResourceEncoder#addMetadataDimension(String, GSDimensionInfoEncoder)} this method will be removed soon */ - protected void addMetadata(String key, GSDimensionInfoEncoder dimensionInfo) { - super.addMetadata(key, dimensionInfo); - } + protected void addMetadata(String key, GSDimensionInfoEncoder dimensionInfo) { + super.addMetadata(key, dimensionInfo); + } /** * @deprecated Use {@link GSResourceEncoder#setMetadataDimension(String, GSDimensionInfoEncoder)} this method will be removed soon * @param key * @param dimensionInfo */ - public void setMetadata(String key, GSDimensionInfoEncoder dimensionInfo) { - super.setMetadata(key, dimensionInfo); - } + public void setMetadata(String key, GSDimensionInfoEncoder dimensionInfo) { + super.setMetadata(key, dimensionInfo); + } + + /** + * Adds a CoverageDimensionInfo to the GeoServer Resource + * + * @param coverageDimensionInfo + * + */ + public void addCoverageDimensionInfo(GSCoverageDimensionEncoder coverageDimensionInfo) { + if (ElementUtils.contains(getRoot(), DIMENSIONS) == null) + addContent(dimensionsEncoder); + dimensionsEncoder.addContent(coverageDimensionInfo.getRoot()); + } + + /** + * Adds quickly a CoverageDimensionInfo to the GeoServer Resource + * + * @param name + * @param description + * @param rangeMin + * @param rangeMax + * @param unit + * @param dimensionType + */ + public void addCoverageDimensionInfo(String name, String description, String rangeMin, + String rangeMax, String unit, String dimensionType) { + final GSCoverageDimensionEncoder coverageDimensionEncoder = new GSCoverageDimensionEncoder( + name, description, rangeMin, rangeMax, unit, dimensionType); + addCoverageDimensionInfo(coverageDimensionEncoder); + } + + /** + * Deletes a CoverageDimensionInfo from the list using the CoverageDimension Name (CoverageDimensionInfo content) + * + * @param coverageDimensionName + * @return true if something is removed, false otherwise + */ + public boolean delCoverageDimensionInfo(final String coverageDimensionName) { + return (dimensionsEncoder.removeContent(GSCoverageDimensionEncoder + .getFilterByContent(coverageDimensionName))).size() == 0 ? false : true; + } } diff --git a/src/main/java/it/geosolutions/geoserver/rest/encoder/dimensions/GSCoverageDimensionEncoder.java b/src/main/java/it/geosolutions/geoserver/rest/encoder/dimensions/GSCoverageDimensionEncoder.java index 5adbbf8..4f69fee 100644 --- a/src/main/java/it/geosolutions/geoserver/rest/encoder/dimensions/GSCoverageDimensionEncoder.java +++ b/src/main/java/it/geosolutions/geoserver/rest/encoder/dimensions/GSCoverageDimensionEncoder.java @@ -31,30 +31,34 @@ import org.jdom.Element; import org.jdom.filter.Filter; /** - * GSCoverageDimension - encodes a CoverageDimension for a given GeoServer Resource - * (feature type /coverage), as follows: + * GSCoverageDimension - encodes a CoverageDimension for a given GeoServer Resource (feature type /coverage), as follows: + * *
  * {@code
- * final GSCoverageDimensionEncoder gsCoverageDimensionEncoder = new GSCoverageDimensionEncoder("GRAY_INDEX", "GridSampleDimension[-2.147483648E9,-2.147483648E9]", String.valueOf(Integer.MIN_VALUE), String.valueOf(Integer.MAX_VALUE), "dobson units³", "REAL_32BITS");
+ * final GSCoverageDimensionEncoder gsCoverageDimensionEncoder = 
+ *      new GSCoverageDimensionEncoder("GRAY_INDEX", "GridSampleDimension[-2.147483648E9,-2.147483648E9]", 
+ *      String.valueOf(Integer.MIN_VALUE), String.valueOf(Integer.MAX_VALUE), "dobson units³", "REAL_32BITS");
  *  coverageEncoder.addCoverageDimensionInfo(gsCoverageDimensionEncoder);
  * }
  * 
+ * * For this example, the XML output is: + * *
- * {@code
- *
- *	GRAY_INDEX
- *	GridSampleDimension[-2.147483648E9,2.147483648E9]
- *	
- *		-2.147483648E9
- *		2.147483647E9
- *	
- *	dobson units³
- *	
- * 		REAL_32BITS
- * 	
- *
- * }
+ *  {@code
+ * 
+ * 	GRAY_INDEX
+ * 	GridSampleDimension[-2.147483648E9,2.147483648E9]
+ * 	
+ * 		-2.147483648E9
+ * 		2.147483647E9
+ * 	
+ * 	dobson units³
+ * 	
+ *  		REAL_32BITS
+ *  	
+ * 
+ *  }
  * 
* * @author Henry Rotzoll (henry.rotzoll@dlr.de) @@ -62,333 +66,328 @@ import org.jdom.filter.Filter; */ public class GSCoverageDimensionEncoder extends XmlElement { - /** A class to filter the GSCoverageDimension by content - * - * - */ - private static class filterByContent implements Filter { + /** + * A class to filter the GSCoverageDimension by content + * + * + */ + private static class filterByContent implements Filter { - final private String key; + final private String key; - public filterByContent(String content) { - this.key = content; - } + public filterByContent(String content) { + this.key = content; + } - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 1L; - public boolean matches(Object obj) { - Element el = ((Element) obj) - .getChild("name"); - if (el != null && el.getTextTrim().equals(key)) { - return true; - } - return false; - } - } + public boolean matches(Object obj) { + Element el = ((Element) obj).getChild("name"); + if (el != null && el.getTextTrim().equals(key)) { + return true; + } + return false; + } + } - /** - * Get a Filter using the GSCoverageDimensionEncoder content (GSCoverageDimensionEncoder name) - * - * @param content - * @return the filter - */ - public static Filter getFilterByContent(String content) { - return new filterByContent(content); - } + /** + * Get a Filter using the GSCoverageDimensionEncoder content (GSCoverageDimensionEncoder name) + * + * @param content + * @return the filter + */ + public static Filter getFilterByContent(String content) { + return new filterByContent(content); + } - /** - * Constructs a new GSCoverageDimensionEncoder - * - */ - public GSCoverageDimensionEncoder() { - super("coverageDimension"); - } + /** + * Constructs a new GSCoverageDimensionEncoder + * + */ + public GSCoverageDimensionEncoder() { + super("coverageDimension"); + } - /** - * Constructs quickly a GSCoverageDimensionEncoder info - * - * @param name - * @param description - * @param rangeMin - * @param rangeMax - * @param unit - * @param dimensionTypeName - */ - public GSCoverageDimensionEncoder(String name, String description, String rangeMin, String rangeMax, String unit, String dimensionTypeName) { - super("coverageDimension"); - this.setup(name, description, rangeMin, rangeMax, unit, dimensionTypeName); - } - - /** - * Set-up quickly a GSCoverageDimensionEncoder info - * - * @param name - * @param description - * @param rangeMin - * @param rangeMax - * @param unit - * @param dimensionTypeName - */ - protected void setup(String name, String description, String rangeMin, String rangeMax, String unit, String dimensionTypeName) - { - //name - setName(name); - - //description - setDescription(description); - - //range - setRange(rangeMin, rangeMax); - - //unit - setUnit(unit); - - //dimension Type - setDimensionType(dimensionTypeName); - } - - - /** - * Get the value of the GSCoverageDimensionEncoder member - * - * @param memberName - * @return the value of the GSCoverageDimensionEncoder member - */ - protected String getMember(String memberName) { - Element el = this.getRoot().getChild(memberName.toString()); - if (el != null) - return el.getTextTrim(); - else - return null; - } - - /** - * Deletes a GSCoverageDimensionEncoder member - * - * @param memberName - * @return true if the GSCoverageDimensionEncoder member is removed - */ - protected boolean delMemberIfExists(String memberName) { - if(ElementUtils.contains(getRoot(), memberName) != null) - { - return ElementUtils.remove(this.getRoot(), this.getRoot().getChild(memberName.toString())); - } - - return false; - } - - /** - * Set a GSCoverageDimensionEncoder member - * - * @param memberName - * @param memberValue - */ - protected void setMember(String memberName, String memberValue) { - if(memberName != null && !memberName.isEmpty() && memberValue != null && !memberValue.isEmpty()) - { - delMemberIfExists(memberName); //delete the element if it already exists - addMember(memberName.toString(), memberValue); - } - } - - /** - * adds a GSCoverageDimensionEncoder member - * - * @param memberName - * @param memberValue - */ - protected void addMember(String memberName, String memberValue) { - if(memberName != null && !memberName.isEmpty() && memberValue != null && ! memberValue.isEmpty()) - { - set(memberName.toString(), memberValue); - } - } - - /** - * Set the name - * - * @param name - */ - public void setName(String name){ - setMember("name", name); - } - - /** - * Deletes the name - * - * @param name - * @return true if removed - */ - public boolean delName(){ - return this.delMemberIfExists("name"); - } - - /** - * Get the description - * - * @return description - */ - public String getName(){ - return this.getMember("name"); - } - - /** - * Set the description - * - * @param description - */ - public void setDescription(String description){ - setMember("description", description); - } - - /** - * Deletes the description - * - * @param description - * @return true if removed - */ - public boolean delDescription(){ - return this.delMemberIfExists("description"); - } - - /** - * Get the description - * - * @return description - */ - public String getDescription(){ - return this.getMember("description"); - } - - /** - * Set the range - * - * @param range - */ - public void setRange(String rangeMin, String rangeMax){ - if(rangeMin != null && !rangeMin.isEmpty() && rangeMax != null && !rangeMax.isEmpty()) - { - remove("range"); - - final Element rangeElement = new Element("range"); - final Element rangeMinElement = new Element("min"); - rangeMinElement.setText(rangeMin); - final Element rangeMaxElement = new Element("max"); - rangeMaxElement.setText(rangeMax); - rangeElement.addContent(rangeMinElement); - rangeElement.addContent(rangeMaxElement); - addContent(rangeElement); - } - } - - /** - * Deletes the range - * - * @param range - * @return true if removed - */ - public boolean delRange(){ - return this.delMemberIfExists("range"); - } - - /** - * Get the range min - * - * @return range min - */ - public String getRangeMin(){ - final Element range = this.getRoot().getChild("range"); - if(range != null) - { - return range.getChildText("min"); - } - - return null; - } - - /** - * Get the range max - * - * @return range max - */ - public String getRangeMax(){ - final Element range = this.getRoot().getChild("range"); - if(range != null) - { - return range.getChildText("max"); - } - - return null; - } - - /** - * Set the unit - * - * @param unit - */ - public void setUnit(String unit){ - setMember("unit", unit); - } - - /** - * Deletes the type - * - * @param type - * @return true if removed - */ - public boolean delUnit(){ - return this.delMemberIfExists("unit"); - } - - /** - * Get the unit - * - * @return unit - */ - public String getUnit(){ - return this.getMember("unit"); - } - - /** - * Set the dimensionType - * - * @param dimensionType - */ - public void setDimensionType(String dimensionTypeName){ - if(dimensionTypeName != null && !dimensionTypeName.isEmpty()) - { - remove("dimensionType"); - - final Element dimensionTypeElement = new Element("dimensionType"); - final Element dimensionNameElement = new Element("name"); - dimensionNameElement.setText(dimensionTypeName); - dimensionTypeElement.addContent(dimensionNameElement); - addContent(dimensionTypeElement); - } - } - - /** - * Deletes the dimensionType - * - * @param dimensionType - * @return true if removed - */ - public boolean delDimensionType(){ - return this.delMemberIfExists("dimensionType"); - } - - /** - * Get the dimensionType name - * - * @return dimensionType name - */ - public String getDimensionTypeName(){ - final Element dimensionType = this.getRoot().getChild("dimensionType"); - if(dimensionType != null) - { - return dimensionType.getChildText("name"); - } - - return null; - } + /** + * Constructs quickly a GSCoverageDimensionEncoder info + * + * @param name + * @param description + * @param rangeMin + * @param rangeMax + * @param unit + * @param dimensionTypeName + */ + public GSCoverageDimensionEncoder(String name, String description, String rangeMin, + String rangeMax, String unit, String dimensionTypeName) { + super("coverageDimension"); + this.setup(name, description, rangeMin, rangeMax, unit, dimensionTypeName); + } + + /** + * Set-up quickly a GSCoverageDimensionEncoder info + * + * @param name + * @param description + * @param rangeMin + * @param rangeMax + * @param unit + * @param dimensionTypeName + */ + protected void setup(String name, String description, String rangeMin, String rangeMax, + String unit, String dimensionTypeName) { + // name + setName(name); + + // description + setDescription(description); + + // range + setRange(rangeMin, rangeMax); + + // unit + setUnit(unit); + + // dimension Type + setDimensionType(dimensionTypeName); + } + + /** + * Get the value of the GSCoverageDimensionEncoder member + * + * @param memberName + * @return the value of the GSCoverageDimensionEncoder member + */ + protected String getMember(String memberName) { + Element el = this.getRoot().getChild(memberName.toString()); + if (el != null) + return el.getTextTrim(); + else + return null; + } + + /** + * Deletes a GSCoverageDimensionEncoder member + * + * @param memberName + * @return true if the GSCoverageDimensionEncoder member is removed + */ + protected boolean delMemberIfExists(String memberName) { + if (ElementUtils.contains(getRoot(), memberName) != null) { + return ElementUtils.remove(this.getRoot(), + this.getRoot().getChild(memberName.toString())); + } + + return false; + } + + /** + * Set a GSCoverageDimensionEncoder member + * + * @param memberName + * @param memberValue + */ + protected void setMember(String memberName, String memberValue) { + if (memberName != null && !memberName.isEmpty() && memberValue != null + && !memberValue.isEmpty()) { + delMemberIfExists(memberName); // delete the element if it already exists + addMember(memberName.toString(), memberValue); + } + } + + /** + * adds a GSCoverageDimensionEncoder member + * + * @param memberName + * @param memberValue + */ + protected void addMember(String memberName, String memberValue) { + if (memberName != null && !memberName.isEmpty() && memberValue != null + && !memberValue.isEmpty()) { + set(memberName.toString(), memberValue); + } + } + + /** + * Set the name + * + * @param name + */ + public void setName(String name) { + setMember("name", name); + } + + /** + * Deletes the name + * + * @param name + * @return true if removed + */ + public boolean delName() { + return this.delMemberIfExists("name"); + } + + /** + * Get the description + * + * @return description + */ + public String getName() { + return this.getMember("name"); + } + + /** + * Set the description + * + * @param description + */ + public void setDescription(String description) { + setMember("description", description); + } + + /** + * Deletes the description + * + * @param description + * @return true if removed + */ + public boolean delDescription() { + return this.delMemberIfExists("description"); + } + + /** + * Get the description + * + * @return description + */ + public String getDescription() { + return this.getMember("description"); + } + + /** + * Set the range + * + * @param range + */ + public void setRange(String rangeMin, String rangeMax) { + if (rangeMin != null && !rangeMin.isEmpty() && rangeMax != null && !rangeMax.isEmpty()) { + remove("range"); + + final Element rangeElement = new Element("range"); + final Element rangeMinElement = new Element("min"); + rangeMinElement.setText(rangeMin); + final Element rangeMaxElement = new Element("max"); + rangeMaxElement.setText(rangeMax); + rangeElement.addContent(rangeMinElement); + rangeElement.addContent(rangeMaxElement); + addContent(rangeElement); + } + } + + /** + * Deletes the range + * + * @param range + * @return true if removed + */ + public boolean delRange() { + return this.delMemberIfExists("range"); + } + + /** + * Get the range min + * + * @return range min + */ + public String getRangeMin() { + final Element range = this.getRoot().getChild("range"); + if (range != null) { + return range.getChildText("min"); + } + + return null; + } + + /** + * Get the range max + * + * @return range max + */ + public String getRangeMax() { + final Element range = this.getRoot().getChild("range"); + if (range != null) { + return range.getChildText("max"); + } + + return null; + } + + /** + * Set the unit + * + * @param unit + */ + public void setUnit(String unit) { + setMember("unit", unit); + } + + /** + * Deletes the type + * + * @param type + * @return true if removed + */ + public boolean delUnit() { + return this.delMemberIfExists("unit"); + } + + /** + * Get the unit + * + * @return unit + */ + public String getUnit() { + return this.getMember("unit"); + } + + /** + * Set the dimensionType + * + * @param dimensionType + */ + public void setDimensionType(String dimensionTypeName) { + if (dimensionTypeName != null && !dimensionTypeName.isEmpty()) { + remove("dimensionType"); + + final Element dimensionTypeElement = new Element("dimensionType"); + final Element dimensionNameElement = new Element("name"); + dimensionNameElement.setText(dimensionTypeName); + dimensionTypeElement.addContent(dimensionNameElement); + addContent(dimensionTypeElement); + } + } + + /** + * Deletes the dimensionType + * + * @param dimensionType + * @return true if removed + */ + public boolean delDimensionType() { + return this.delMemberIfExists("dimensionType"); + } + + /** + * Get the dimensionType name + * + * @return dimensionType name + */ + public String getDimensionTypeName() { + final Element dimensionType = this.getRoot().getChild("dimensionType"); + if (dimensionType != null) { + return dimensionType.getChildText("name"); + } + + return null; + } } \ No newline at end of file diff --git a/src/test/java/it/geosolutions/geoserver/decoder/ResourceDecoderTest.java b/src/test/java/it/geosolutions/geoserver/decoder/ResourceDecoderTest.java index d06ca93..84f4be2 100644 --- a/src/test/java/it/geosolutions/geoserver/decoder/ResourceDecoderTest.java +++ b/src/test/java/it/geosolutions/geoserver/decoder/ResourceDecoderTest.java @@ -19,112 +19,111 @@ import org.springframework.core.io.ClassPathResource; * * @author eblondel * @author Henry Rotzoll (henry.rotzoll@dlr.de) - * + * */ public class ResourceDecoderTest { - - - RESTCoverage coverage; - - @Before - public void setup() throws IOException{ - File coverageFile = new ClassPathResource("testdata/coverageExample.xml").getFile(); - String coverageString = FileUtils.readFileToString(coverageFile); - coverage = RESTCoverage.build(coverageString); - } - - @Test - public void testName(){ - Assert.assertEquals(coverage.getName(),"granuleTestMosaic"); - } - - @Test - public void testNativeName(){ - Assert.assertEquals(coverage.getNativeName(), "granuleTestMosaic"); - } - - @Test - public void testTitle(){ - Assert.assertEquals(coverage.getNativeName(), "granuleTestMosaic"); - } - - @Test - public void testAbstract(){ - Assert.assertEquals(coverage.getAbstract(), "this is an abstract"); - } - - @Test - public void testKeywords(){ - List keywords = coverage.getKeywords(); - Assert.assertEquals(keywords.get(0), "keyword1"); - Assert.assertEquals(keywords.get(1), "keyword2"); - Assert.assertEquals(keywords.get(2), "keyword3"); - } - - @Test - public void testNameSpace(){ - Assert.assertEquals(coverage.getNameSpace(),"topp"); - } - - @Test - public void testStoreName(){ - Assert.assertEquals(coverage.getStoreName(), "granuleTestMosaic"); - } - - @Test - public void testStoreType(){ - Assert.assertEquals(coverage.getStoreType(), "coverageStore"); - } - - @Test - public void testStoreUrl(){ - Assert.assertEquals(coverage.getStoreUrl(), "http://localhost:8080/geoserver/rest/workspaces/topp/coveragestores/granuleTestMosaic.xml"); - } - - @Test - public void testCRS(){ - Assert.assertEquals(coverage.getCRS(), "EPSG:4326"); - } - - @Test - public void testBoundingBox(){ - Assert.assertEquals(coverage.getMinX(), -180.0, 0); - Assert.assertEquals(coverage.getMaxX(), 180.0, 0); - Assert.assertEquals(coverage.getMinY(), -90, 0); - Assert.assertEquals(coverage.getMaxY(), 90, 0); - } - - - @Test - public void testMetadataLinkInfo() throws IOException{ - + + RESTCoverage coverage; + + @Before + public void setup() throws IOException { + File coverageFile = new ClassPathResource("testdata/coverageExample.xml").getFile(); + String coverageString = FileUtils.readFileToString(coverageFile); + coverage = RESTCoverage.build(coverageString); + } + + @Test + public void testName() { + Assert.assertEquals(coverage.getName(), "granuleTestMosaic"); + } + + @Test + public void testNativeName() { + Assert.assertEquals(coverage.getNativeName(), "granuleTestMosaic"); + } + + @Test + public void testTitle() { + Assert.assertEquals(coverage.getNativeName(), "granuleTestMosaic"); + } + + @Test + public void testAbstract() { + Assert.assertEquals(coverage.getAbstract(), "this is an abstract"); + } + + @Test + public void testKeywords() { + List keywords = coverage.getKeywords(); + Assert.assertEquals(keywords.get(0), "keyword1"); + Assert.assertEquals(keywords.get(1), "keyword2"); + Assert.assertEquals(keywords.get(2), "keyword3"); + } + + @Test + public void testNameSpace() { + Assert.assertEquals(coverage.getNameSpace(), "topp"); + } + + @Test + public void testStoreName() { + Assert.assertEquals(coverage.getStoreName(), "granuleTestMosaic"); + } + + @Test + public void testStoreType() { + Assert.assertEquals(coverage.getStoreType(), "coverageStore"); + } + + @Test + public void testStoreUrl() { + Assert.assertEquals(coverage.getStoreUrl(), + "http://localhost:8080/geoserver/rest/workspaces/topp/coveragestores/granuleTestMosaic.xml"); + } + + @Test + public void testCRS() { + Assert.assertEquals(coverage.getCRS(), "EPSG:4326"); + } + + @Test + public void testBoundingBox() { + Assert.assertEquals(coverage.getMinX(), -180.0, 0); + Assert.assertEquals(coverage.getMaxX(), 180.0, 0); + Assert.assertEquals(coverage.getMinY(), -90, 0); + Assert.assertEquals(coverage.getMaxY(), 90, 0); + } + + @Test + public void testMetadataLinkInfo() throws IOException { + List list = coverage.getEncodedMetadataLinkInfoList(); - + GSMetadataLinkInfoEncoder metadataLinkInfo1 = list.get(0); Assert.assertEquals("text/xml", metadataLinkInfo1.getType()); Assert.assertEquals("ISO19115:2003", metadataLinkInfo1.getMetadataType()); Assert.assertEquals("http://www.organization.org/metadata1", metadataLinkInfo1.getContent()); - + GSMetadataLinkInfoEncoder metadataLinkInfo2 = list.get(1); - Assert.assertEquals("text/html",metadataLinkInfo2.getType()); - Assert.assertEquals("ISO19115:2003",metadataLinkInfo2.getMetadataType()); - Assert.assertEquals("http://www.organization.org/metadata2",metadataLinkInfo2.getContent()); - - } - - @Test - public void testCoverageDimension() throws IOException{ - + Assert.assertEquals("text/html", metadataLinkInfo2.getType()); + Assert.assertEquals("ISO19115:2003", metadataLinkInfo2.getMetadataType()); + Assert.assertEquals("http://www.organization.org/metadata2", metadataLinkInfo2.getContent()); + + } + + @Test + public void testCoverageDimension() throws IOException { + List list = coverage.getEncodedDimensionsInfoList(); - + GSCoverageDimensionEncoder coverageDimension1 = list.get(0); Assert.assertEquals("GRAY_INDEX", coverageDimension1.getName()); - Assert.assertEquals("GridSampleDimension[-Infinity,Infinity]", coverageDimension1.getDescription()); + Assert.assertEquals("GridSampleDimension[-Infinity,Infinity]", + coverageDimension1.getDescription()); Assert.assertEquals("-inf", coverageDimension1.getRangeMin()); Assert.assertEquals("inf", coverageDimension1.getRangeMax()); Assert.assertEquals("dobson units³", coverageDimension1.getUnit()); Assert.assertEquals("REAL_32BITS", coverageDimension1.getDimensionTypeName()); - } - - + } + } diff --git a/src/test/java/it/geosolutions/geoserver/rest/encoder/coverage/GSCoverageEncoderTest.java b/src/test/java/it/geosolutions/geoserver/rest/encoder/coverage/GSCoverageEncoderTest.java index 2803ca4..0c82101 100644 --- a/src/test/java/it/geosolutions/geoserver/rest/encoder/coverage/GSCoverageEncoderTest.java +++ b/src/test/java/it/geosolutions/geoserver/rest/encoder/coverage/GSCoverageEncoderTest.java @@ -21,6 +21,7 @@ package it.geosolutions.geoserver.rest.encoder.coverage; import it.geosolutions.geoserver.rest.encoder.GSResourceEncoder; import it.geosolutions.geoserver.rest.encoder.GSResourceEncoder.ProjectionPolicy; +import it.geosolutions.geoserver.rest.encoder.dimensions.GSCoverageDimensionEncoder; import it.geosolutions.geoserver.rest.encoder.metadata.GSDimensionInfoEncoder; import it.geosolutions.geoserver.rest.encoder.metadata.GSDimensionInfoEncoder.Presentation; import it.geosolutions.geoserver.rest.encoder.utils.ElementUtils; @@ -105,6 +106,8 @@ public class GSCoverageEncoderTest extends TestCase { encoder.addKeyword("..."); encoder.addKeyword("KEYWORD_N"); + + // Old style dimensions (into metadata) final GSDimensionInfoEncoder timeDimension=new GSDimensionInfoEncoder(true); timeDimension.setPresentation(Presentation.CONTINUOUS_INTERVAL); encoder.setMetadata("time", timeDimension); @@ -119,6 +122,12 @@ public class GSCoverageEncoderTest extends TestCase { final GSDimensionInfoEncoder elevationDimension=new GSDimensionInfoEncoder(true); elevationDimension.setPresentation(Presentation.LIST); encoder.setMetadata("elevation", elevationDimension); + + // New style dimensions (since gs-2.4.x) + GSCoverageDimensionEncoder gsCoverageDimensionEncoder = new GSCoverageDimensionEncoder( + "GRAY_INDEX", "GridSampleDimension[-Infinity,Infinity]", "-inf", "inf", + "dobson units³", "REAL_32BITS"); + encoder.addCoverageDimensionInfo(gsCoverageDimensionEncoder); if (LOGGER.isInfoEnabled()) LOGGER.info(encoder.toString()); diff --git a/src/test/java/it/geosolutions/geoserver/rest/encoder/dimensions/GSCoverageDimensionEncoderTest.java b/src/test/java/it/geosolutions/geoserver/rest/encoder/dimensions/GSCoverageDimensionEncoderTest.java index 1b90f8e..d6350a1 100644 --- a/src/test/java/it/geosolutions/geoserver/rest/encoder/dimensions/GSCoverageDimensionEncoderTest.java +++ b/src/test/java/it/geosolutions/geoserver/rest/encoder/dimensions/GSCoverageDimensionEncoderTest.java @@ -19,52 +19,61 @@ */ package it.geosolutions.geoserver.rest.encoder.dimensions; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import it.geosolutions.geoserver.rest.encoder.feature.GSFeatureTypeEncoder; + +import java.io.IOException; + import junit.framework.Assert; import org.junit.Test; /** -* -* @author Henry Rotzoll (henry.rotzoll@dlr.de) -* -*/ + * + * @author Henry Rotzoll (henry.rotzoll@dlr.de) + * + */ public class GSCoverageDimensionEncoderTest { - @Test - public void coverageDimensionTest(){ - GSCoverageDimensionEncoder encoder = new GSCoverageDimensionEncoder("GRAY_INDEX", "GridSampleDimension[-Infinity,Infinity]", "-inf", "inf", "dobson units³", "REAL_32BITS"); + @Test + public void coverageDimensionTest() { + GSCoverageDimensionEncoder encoder = new GSCoverageDimensionEncoder("GRAY_INDEX", + "GridSampleDimension[-Infinity,Infinity]", "-inf", "inf", "dobson units³", + "REAL_32BITS"); - Assert.assertEquals("GRAY_INDEX", encoder.getName()); - Assert.assertEquals("GridSampleDimension[-Infinity,Infinity]", encoder.getDescription()); - Assert.assertEquals("-inf", encoder.getRangeMin()); - Assert.assertEquals("inf", encoder.getRangeMax()); - Assert.assertEquals("dobson units³", encoder.getUnit()); - Assert.assertEquals("REAL_32BITS", encoder.getDimensionTypeName()); - - Assert.assertTrue(encoder.delName()); - Assert.assertTrue(encoder.delDescription()); - Assert.assertTrue(encoder.delRange()); - Assert.assertTrue(encoder.delUnit()); - Assert.assertTrue(encoder.delDimensionType()); - - Assert.assertNull( encoder.getName()); - Assert.assertNull(encoder.getDescription()); - Assert.assertNull(encoder.getRangeMin()); - Assert.assertNull(encoder.getRangeMax()); - Assert.assertNull(encoder.getUnit()); - Assert.assertNull(encoder.getDimensionTypeName()); - - encoder.setName("GRAY_INDEX"); - encoder.setDescription("GridSampleDimension[-Infinity,Infinity]"); - encoder.setRange("-inf", "inf"); - encoder.setUnit("dobson units³"); - encoder.setDimensionType("REAL_32BITS"); - - Assert.assertEquals("GRAY_INDEX", encoder.getName()); - Assert.assertEquals("GridSampleDimension[-Infinity,Infinity]", encoder.getDescription()); - Assert.assertEquals("-inf", encoder.getRangeMin()); - Assert.assertEquals("inf", encoder.getRangeMax()); - Assert.assertEquals("dobson units³", encoder.getUnit()); - Assert.assertEquals("REAL_32BITS", encoder.getDimensionTypeName()); - } + Assert.assertEquals("GRAY_INDEX", encoder.getName()); + Assert.assertEquals("GridSampleDimension[-Infinity,Infinity]", encoder.getDescription()); + Assert.assertEquals("-inf", encoder.getRangeMin()); + Assert.assertEquals("inf", encoder.getRangeMax()); + Assert.assertEquals("dobson units³", encoder.getUnit()); + Assert.assertEquals("REAL_32BITS", encoder.getDimensionTypeName()); + + Assert.assertTrue(encoder.delName()); + Assert.assertTrue(encoder.delDescription()); + Assert.assertTrue(encoder.delRange()); + Assert.assertTrue(encoder.delUnit()); + Assert.assertTrue(encoder.delDimensionType()); + + Assert.assertNull(encoder.getName()); + Assert.assertNull(encoder.getDescription()); + Assert.assertNull(encoder.getRangeMin()); + Assert.assertNull(encoder.getRangeMax()); + Assert.assertNull(encoder.getUnit()); + Assert.assertNull(encoder.getDimensionTypeName()); + + encoder.setName("GRAY_INDEX"); + encoder.setDescription("GridSampleDimension[-Infinity,Infinity]"); + encoder.setRange("-inf", "inf"); + encoder.setUnit("dobson units³"); + encoder.setDimensionType("REAL_32BITS"); + + Assert.assertEquals("GRAY_INDEX", encoder.getName()); + Assert.assertEquals("GridSampleDimension[-Infinity,Infinity]", encoder.getDescription()); + Assert.assertEquals("-inf", encoder.getRangeMin()); + Assert.assertEquals("inf", encoder.getRangeMax()); + Assert.assertEquals("dobson units³", encoder.getUnit()); + Assert.assertEquals("REAL_32BITS", encoder.getDimensionTypeName()); + } + } \ No newline at end of file diff --git a/src/test/java/it/geosolutions/geoserver/rest/encoder/feature/GSFeatureEncoderTest.java b/src/test/java/it/geosolutions/geoserver/rest/encoder/feature/GSFeatureEncoderTest.java index 3465ab4..691b60b 100644 --- a/src/test/java/it/geosolutions/geoserver/rest/encoder/feature/GSFeatureEncoderTest.java +++ b/src/test/java/it/geosolutions/geoserver/rest/encoder/feature/GSFeatureEncoderTest.java @@ -53,15 +53,12 @@ import org.springframework.core.io.ClassPathResource; /** * - * Note on adding multiple available styles to the GSLayerEncoder: - to run the - * testIntegration(), 2 clones of the "point" style, named "point2" and "point3" - * have to be created. + * Note on adding multiple available styles to the GSLayerEncoder: - to run the testIntegration(), 2 clones of the "point" style, named "point2" and + * "point3" have to be created. * * @author ETj (etj at geo-solutions.it) * @author Carlo Cancellieri - carlo.cancellieri@geo-solutions.it - * @author Emmanuel Blondel - emmanuel.blondel1@gmail.com | - * emmanuel.blondel@fao.org - * @author Henry Rotzoll (henry.rotzoll@dlr.de) + * @author Emmanuel Blondel - emmanuel.blondel1@gmail.com | emmanuel.blondel@fao.org */ public class GSFeatureEncoderTest extends GeoserverRESTTest { protected final static Logger LOGGER = LoggerFactory.getLogger(GSFeatureEncoderTest.class); @@ -87,91 +84,67 @@ public class GSFeatureEncoderTest extends GeoserverRESTTest { fte.setDescription("desc"); fte.setEnabled(true); - //metadataLink - GSMetadataLinkInfoEncoder metadatalink = new GSMetadataLinkInfoEncoder( - "text/xml", "ISO19115:2003", - "http://www.organization.org/metadata1"); + // metadataLink + GSMetadataLinkInfoEncoder metadatalink = new GSMetadataLinkInfoEncoder("text/xml", + "ISO19115:2003", "http://www.organization.org/metadata1"); fte.addMetadataLinkInfo(metadatalink); - - GSCoverageDimensionEncoder gsCoverageDimensionEncoder = new GSCoverageDimensionEncoder("GRAY_INDEX", "GridSampleDimension[-Infinity,Infinity]", "-inf", "inf", "dobson units³", "REAL_32BITS"); - fte.addCoverageDimensionInfo(gsCoverageDimensionEncoder); - - GSLayerEncoder layerEncoder = null; - if (!GSVersionDecoder.VERSION.getVersion(VERSION).equals( - GSVersionDecoder.VERSION.UNRECOGNIZED)) { - layerEncoder = new GSLayerEncoder(); - } else if (GSVersionDecoder.VERSION.getVersion(VERSION).equals( - GSVersionDecoder.VERSION.UNRECOGNIZED)) { - layerEncoder = new GSLayerEncoder21(); - } - layerEncoder.setEnabled(true); - layerEncoder.setQueryable(true); - layerEncoder.setAdvertised(true); - layerEncoder.setDefaultStyle("point"); - layerEncoder.addStyle("point2"); - layerEncoder.addStyle("point3"); + GSLayerEncoder layerEncoder = null; + if (!GSVersionDecoder.VERSION.getVersion(VERSION).equals( + GSVersionDecoder.VERSION.UNRECOGNIZED)) { + layerEncoder = new GSLayerEncoder(); + } else if (GSVersionDecoder.VERSION.getVersion(VERSION).equals( + GSVersionDecoder.VERSION.UNRECOGNIZED)) { + layerEncoder = new GSLayerEncoder21(); + } + layerEncoder.setEnabled(true); + layerEncoder.setQueryable(true); + layerEncoder.setAdvertised(true); - // authorityURL - GSAuthorityURLInfoEncoder authorityURL = new GSAuthorityURLInfoEncoder( - "authority1", "http://www.authority1.org"); - layerEncoder.addAuthorityURL(authorityURL); + layerEncoder.setDefaultStyle("point"); + layerEncoder.addStyle("point2"); + layerEncoder.addStyle("point3"); - // identifier - GSIdentifierInfoEncoder identifier1 = new GSIdentifierInfoEncoder( - "authority1", "identifier1"); - GSIdentifierInfoEncoder identifier2 = new GSIdentifierInfoEncoder( - "authority1", "another_identifier"); - layerEncoder.addIdentifier(identifier1); - layerEncoder.addIdentifier(identifier2); + // authorityURL + GSAuthorityURLInfoEncoder authorityURL = new GSAuthorityURLInfoEncoder("authority1", + "http://www.authority1.org"); + layerEncoder.addAuthorityURL(authorityURL); - publisher.createWorkspace(DEFAULT_WS); + // identifier + GSIdentifierInfoEncoder identifier1 = new GSIdentifierInfoEncoder("authority1", + "identifier1"); + GSIdentifierInfoEncoder identifier2 = new GSIdentifierInfoEncoder("authority1", + "another_identifier"); + layerEncoder.addIdentifier(identifier1); + layerEncoder.addIdentifier(identifier2); - File zipFile = new ClassPathResource("testdata/resttestshp.zip") - .getFile(); + publisher.createWorkspace(DEFAULT_WS); - // test insert - boolean published = publisher.publishShp(DEFAULT_WS, storeName, - layerName, zipFile); - assertTrue("publish() failed", published); - assertTrue(existsLayer(layerName)); + File zipFile = new ClassPathResource("testdata/resttestshp.zip").getFile(); - publisher.publishStyle(new File(new ClassPathResource("testdata") - .getFile(), "default_point.sld")); + // test insert + boolean published = publisher.publishShp(DEFAULT_WS, storeName, layerName, zipFile); + assertTrue("publish() failed", published); + assertTrue(existsLayer(layerName)); - // optionally select the attributes to publish - RESTLayer layer = reader.getLayer(layerName); - RESTResource resource = reader.getResource(layer); - List attrs = resource.getEncodedAttributeList(); - assertNotNull(attrs); - for (GSAttributeEncoder enc : attrs) { - fte.setAttribute(enc); - } + publisher.publishStyle(new File(new ClassPathResource("testdata").getFile(), + "default_point.sld")); - assertTrue(publisher.publishDBLayer(DEFAULT_WS, storeName, fte, - layerEncoder)); + // optionally select the attributes to publish + RESTLayer layer = reader.getLayer(layerName); + RESTResource resource = reader.getResource(layer); + List attrs = resource.getEncodedAttributeList(); + assertNotNull(attrs); + for (GSAttributeEncoder enc : attrs) { + fte.setAttribute(enc); + } + + assertTrue(publisher.publishDBLayer(DEFAULT_WS, storeName, fte, layerEncoder)); - } - - @Test - public void testCoverageDimension() throws IOException { - GSFeatureTypeEncoder fte = new GSFeatureTypeEncoder(); - fte.setNativeName("testlayer"); - fte.setName("testlayer" + "_NEW"); - fte.setTitle("title"); - fte.setNativeCRS("EPSG:4326"); - fte.setDescription("desc"); - fte.setEnabled(true); - - assertFalse(fte.toString().contains("GRAY_INDEXGridSampleDimension[-Infinity,Infinity]-infinfdobson units³REAL_32BITS")); - - GSCoverageDimensionEncoder gsCoverageDimensionEncoder = new GSCoverageDimensionEncoder("GRAY_INDEX", "GridSampleDimension[-Infinity,Infinity]", "-inf", "inf", "dobson units³", "REAL_32BITS"); - fte.addCoverageDimensionInfo(gsCoverageDimensionEncoder); - LOGGER.debug("fte.toString() :" + fte.toString()); - assertTrue(fte.toString().contains("GRAY_INDEXGridSampleDimension[-Infinity,Infinity]-infinfdobson units³REAL_32BITS")); } + @Test public void testFeatureTypeEncoder() { @@ -180,9 +153,9 @@ public class GSFeatureEncoderTest extends GeoserverRESTTest { encoder.addKeyword("KEYWORD_2"); encoder.addKeyword("..."); encoder.addKeyword("KEYWORD_N"); - + encoder.setName("Layername"); - + encoder.setTitle("title"); encoder.addKeyword("TODO"); encoder.setNativeCRS("EPSG:4326"); @@ -195,24 +168,24 @@ public class GSFeatureEncoderTest extends GeoserverRESTTest { attribute.setAttribute(FeatureTypeAttribute.maxOccurs, "1"); attribute.setAttribute(FeatureTypeAttribute.minOccurs, "0"); attribute.setAttribute(FeatureTypeAttribute.nillable, "true"); - + encoder.setAttribute(attribute); - + encoder.delAttribute("NAME"); - + attribute.setAttribute(FeatureTypeAttribute.name, "NEW_NAME"); - + encoder.setAttribute(attribute); - + // TODO encoder.getAttribute("NAME"); - + GSFeatureDimensionInfoEncoder dim2 = new GSFeatureDimensionInfoEncoder("ELE"); - + encoder.setMetadataDimension("elevation", dim2); dim2.setPresentation(Presentation.DISCRETE_INTERVAL, BigDecimal.valueOf(10)); Element el = ElementUtils.contains(encoder.getRoot(), GSDimensionInfoEncoder.PRESENTATION); assertNotNull(el); - + LOGGER.info("contains_key:" + el.toString()); dim2.setPresentation(Presentation.DISCRETE_INTERVAL, BigDecimal.valueOf(12)); @@ -221,7 +194,7 @@ public class GSFeatureEncoderTest extends GeoserverRESTTest { assertEquals("12", el.getText()); dim2.setPresentation(Presentation.CONTINUOUS_INTERVAL); - + encoder.setMetadataDimension("time", new GSFeatureDimensionInfoEncoder("time")); el = ElementUtils.contains(encoder.getRoot(), GSDimensionInfoEncoder.PRESENTATION); assertNotNull(el); @@ -240,11 +213,11 @@ public class GSFeatureEncoderTest extends GeoserverRESTTest { assertNull(el); if (el == null) LOGGER.info("REMOVED"); - + if (LOGGER.isInfoEnabled()) LOGGER.info(encoder.toString()); - assertEquals(encoder.getName(),"Layername"); + assertEquals(encoder.getName(), "Layername"); } @Test @@ -258,14 +231,16 @@ public class GSFeatureEncoderTest extends GeoserverRESTTest { assertTrue(encoder.delKeyword("KEYWORD_2")); assertFalse(encoder.delKeyword("KEYWORD_M")); - //metadataLinkInfo - encoder.addMetadataLinkInfo("text/xml", "ISO19115:2003","http://www.organization.org/metadata1"); - encoder.addMetadataLinkInfo("text/html", "ISO19115:2003","http://www.organization.org/metadata2"); - + // metadataLinkInfo + encoder.addMetadataLinkInfo("text/xml", "ISO19115:2003", + "http://www.organization.org/metadata1"); + encoder.addMetadataLinkInfo("text/html", "ISO19115:2003", + "http://www.organization.org/metadata2"); + assertTrue(encoder.delMetadataLinkInfo("http://www.organization.org/metadata2")); assertFalse(encoder.delMetadataLinkInfo("http://www.organization.org/metadata3")); - - //dimensions + + // dimensions final GSFeatureDimensionInfoEncoder elevationDimension = new GSFeatureDimensionInfoEncoder( "elevation_field"); @@ -275,8 +250,7 @@ public class GSFeatureEncoderTest extends GeoserverRESTTest { final String metadata = "elevation"; encoder.setMetadataDimension(metadata, elevationDimension); - elevationDimension.setPresentation(Presentation.DISCRETE_INTERVAL, - BigDecimal.valueOf(10)); + elevationDimension.setPresentation(Presentation.DISCRETE_INTERVAL, BigDecimal.valueOf(10)); if (LOGGER.isInfoEnabled()) LOGGER.info(encoder.toString()); @@ -293,28 +267,25 @@ public class GSFeatureEncoderTest extends GeoserverRESTTest { LOGGER.info("REMOVED"); } - + /** * Test method for virtual table encoding / SQL view layer integration * - * Settings information for integration tests - * - test is based on the data used in http://docs.geoserver.org/latest/en/user/data/database/sqlview.html#parameterizing-sql-views - * (states shapefile - available in testdata/states.zip) - * - create a postgis db - * - import the states shapefile (using shp2pgsql or Postgis shapefile uploader) - * - In Geoserver, create a postgis datastore for this DB, with the name "statesdb" + * Settings information for integration tests - test is based on the data used in + * http://docs.geoserver.org/latest/en/user/data/database/sqlview.html#parameterizing-sql-views (states shapefile - available in + * testdata/states.zip) - create a postgis db - import the states shapefile (using shp2pgsql or Postgis shapefile uploader) - In Geoserver, create + * a postgis datastore for this DB, with the name "statesdb" * */ @Test - public void testSQLViewIntegration(){ - - if (!enabled()) + public void testSQLViewIntegration() { + + if (!enabled()) return; deleteAll(); GeoServerRESTPublisher publisher = new GeoServerRESTPublisher(RESTURL, RESTUSER, RESTPW); - - - String storeName = "statesdb"; //name of the datastore setup for tests + + String storeName = "statesdb"; // name of the datastore setup for tests String layerName = "my_sqlviewlayer"; String nativeName = "popstates"; @@ -322,51 +293,51 @@ public class GSFeatureEncoderTest extends GeoserverRESTTest { fte.setName(layerName); fte.setNativeName(nativeName); fte.setTitle("title"); - + fte.addKeyword("keyword1"); fte.addKeyword("keyword2"); fte.setNativeCRS("EPSG:4326"); fte.setDescription("desc"); fte.setEnabled(true); - //virtual table - //------------- + // virtual table + // ------------- // Set-up the vtGeom final VTGeometryEncoder vtGeom = new VTGeometryEncoder("the_geom", "Point", "4326"); - + // Set-up 2 virtual table parameters final VTParameterEncoder vtParam1 = new VTParameterEncoder("high", "100000000", "^[\\d]+$"); final VTParameterEncoder vtParam2 = new VTParameterEncoder("low", "0", "^[\\d]+$"); - + // sql String sql = "select gid, state_name, the_geom from pgstates where persons between %low% and %high% and state_abbr = '%state%'"; - - //set-up the virtual table + + // set-up the virtual table final GSVirtualTableEncoder vte = new GSVirtualTableEncoder(); vte.setName(nativeName); vte.setSql(sql); vte.addVirtualTableGeometry(vtGeom); vte.addVirtualTableParameter(vtParam1); vte.addVirtualTableParameter(vtParam2); - fte.setMetadataVirtualTable(vte); //Set the virtual table - - //modif the vte + fte.setMetadataVirtualTable(vte); // Set the virtual table + + // modif the vte vte.delVirtualTableGeometry("the_geom"); vte.addVirtualTableGeometry("the_geom", "MultiPolygon", "4326"); - + final VTParameterEncoder vtParam3 = new VTParameterEncoder("state", "FL", "^[\\w\\d\\s]+$"); vte.addVirtualTableParameter(vtParam3); vte.addKeyColumn("gid"); - - //Layer encoder - //------------- + + // Layer encoder + // ------------- GSLayerEncoder layerEncoder = new GSLayerEncoder(); layerEncoder.setEnabled(true); layerEncoder.setQueryable(true); layerEncoder.setDefaultStyle("polygon"); // test insert - //------------ + // ------------ publisher.createWorkspace(DEFAULT_WS); boolean published = publisher.publishDBLayer(DEFAULT_WS, storeName, fte, layerEncoder); assertTrue("Publication unsuccessful", published); diff --git a/src/test/java/it/geosolutions/geoserver/rest/publisher/GeoserverRESTImageMosaicTest.java b/src/test/java/it/geosolutions/geoserver/rest/publisher/GeoserverRESTImageMosaicTest.java index 491cfff..45a2baa 100644 --- a/src/test/java/it/geosolutions/geoserver/rest/publisher/GeoserverRESTImageMosaicTest.java +++ b/src/test/java/it/geosolutions/geoserver/rest/publisher/GeoserverRESTImageMosaicTest.java @@ -29,9 +29,11 @@ package it.geosolutions.geoserver.rest.publisher; import it.geosolutions.geoserver.rest.GeoServerRESTPublisher.ParameterConfigure; import it.geosolutions.geoserver.rest.GeoserverRESTTest; import it.geosolutions.geoserver.rest.decoder.RESTCoverageStore; +import it.geosolutions.geoserver.rest.decoder.about.GSVersionDecoder; import it.geosolutions.geoserver.rest.encoder.GSLayerEncoder; import it.geosolutions.geoserver.rest.encoder.GSResourceEncoder.ProjectionPolicy; import it.geosolutions.geoserver.rest.encoder.coverage.GSImageMosaicEncoder; +import it.geosolutions.geoserver.rest.encoder.dimensions.GSCoverageDimensionEncoder; import it.geosolutions.geoserver.rest.encoder.metadata.GSDimensionInfoEncoder; import it.geosolutions.geoserver.rest.encoder.metadata.GSDimensionInfoEncoder.Presentation; @@ -42,6 +44,7 @@ import java.io.IOException; import org.apache.commons.httpclient.NameValuePair; import org.junit.Test; import static org.junit.Assert.*; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.core.io.ClassPathResource; @@ -105,13 +108,26 @@ public class GeoserverRESTImageMosaicTest extends GeoserverRESTTest { coverageEncoder.setSRS("EPSG:4326"); coverageEncoder.setSUGGESTED_TILE_SIZE("256,256"); coverageEncoder.setUSE_JAI_IMAGEREAD(true); - // activate time - final GSDimensionInfoEncoder time=new GSDimensionInfoEncoder(true); - time.setPresentation(Presentation.LIST); - // set time metadata - coverageEncoder.setMetadata("time", time); - // not active elevation - coverageEncoder.setMetadata("elevation", new GSDimensionInfoEncoder()); + + GSVersionDecoder v=reader.getGeoserverVersion(); + if (v.getVersion().equals(GSVersionDecoder.VERSION.getVersion(GSVersionDecoder.VERSION.v24.toString()))){ + // New style dimensions (since gs-2.4.x) + GSCoverageDimensionEncoder gsCoverageDimensionEncoder = new GSCoverageDimensionEncoder( + "GRAY_INDEX", "GridSampleDimension[-Infinity,Infinity]", "-inf", "inf", + "dobson units³", "REAL_32BITS"); + coverageEncoder.addCoverageDimensionInfo(gsCoverageDimensionEncoder); + } else { + // Old stile setting code + // activate time + final GSDimensionInfoEncoder time=new GSDimensionInfoEncoder(true); + time.setPresentation(Presentation.LIST); + // set time metadata + coverageEncoder.setMetadata("time", time); + // not active elevation + coverageEncoder.setMetadata("elevation", new GSDimensionInfoEncoder()); + } + + assertTrue(publisher.createWorkspace(wsName)); diff --git a/src/test/resources/testdata/coverageExample.xml b/src/test/resources/testdata/coverageExample.xml index ca83250..5a24090 100644 --- a/src/test/resources/testdata/coverageExample.xml +++ b/src/test/resources/testdata/coverageExample.xml @@ -1,4 +1,3 @@ - granuleTestMosaic granuleTestMosaic @@ -27,15 +26,18 @@ GEOGCS["WGS 84", - DATUM["World Geodetic System 1984", - SPHEROID["WGS 84", 6378137.0, 298.257223563, + DATUM["World Geodetic + System 1984", + SPHEROID["WGS 84", 6378137.0, + 298.257223563, AUTHORITY["EPSG","7030"]], AUTHORITY["EPSG","6326"]], PRIMEM["Greenwich", 0.0, AUTHORITY["EPSG","8901"]], UNIT["degree", 0.017453292519943295], AXIS["Geodetic longitude", EAST], - AXIS["Geodetic latitude", NORTH], + AXIS["Geodetic + latitude", NORTH], AUTHORITY["EPSG","4326"]] EPSG:4326 From 5accaa01ed17fea8b6f0cc442bb7c99a5d4a4656 Mon Sep 17 00:00:00 2001 From: carlo cancellieri Date: Fri, 7 Feb 2014 14:24:14 +0100 Subject: [PATCH 3/4] improve versions checking and junit related tests. improve keywords and add lang and vocabulary support. improve junit tests. --- .../rest/decoder/about/GSVersionDecoder.java | 11 ++- .../rest/encoder/GSLayerEncoder.java | 30 +++++++- .../rest/encoder/GSLayerEncoder21.java | 2 + .../rest/encoder/GSResourceEncoder.java | 68 +++++++++++++++++-- .../encoder/coverage/GSCoverageEncoder.java | 1 - .../geoserver/decoder/VersionDecoderTest.java | 4 +- .../geoserver/rest/GeoserverRESTTest.java | 11 +-- .../encoder/feature/GSFeatureEncoderTest.java | 14 ++-- .../GeoserverRESTImageMosaicTest.java | 2 +- 9 files changed, 121 insertions(+), 22 deletions(-) diff --git a/src/main/java/it/geosolutions/geoserver/rest/decoder/about/GSVersionDecoder.java b/src/main/java/it/geosolutions/geoserver/rest/decoder/about/GSVersionDecoder.java index ba0c866..410f56e 100644 --- a/src/main/java/it/geosolutions/geoserver/rest/decoder/about/GSVersionDecoder.java +++ b/src/main/java/it/geosolutions/geoserver/rest/decoder/about/GSVersionDecoder.java @@ -132,13 +132,22 @@ public class GSVersionDecoder extends XmlElement { Element e = ElementUtils.contains(geoserver.version, GSAboutResource.VERSION); return VERSION.getVersion(e.getTextTrim()); } + + /** + * @see {@link Enum#compareTo(Enum)} + * @param v + * @return + */ + public int compareTo(VERSION v) { + return getVersion().compareTo(v); + } public static GSVersionDecoder build(String response) { return new GSVersionDecoder(response); } public enum VERSION { - v22(22), v23(23), v24(24), v25(25), ABOVE(9999), UNRECOGNIZED(-1); + UNRECOGNIZED(-1), v22(22), v23(23), v24(24), v25(25), ABOVE(9999); final private int version; diff --git a/src/main/java/it/geosolutions/geoserver/rest/encoder/GSLayerEncoder.java b/src/main/java/it/geosolutions/geoserver/rest/encoder/GSLayerEncoder.java index f78ccac..b75b438 100644 --- a/src/main/java/it/geosolutions/geoserver/rest/encoder/GSLayerEncoder.java +++ b/src/main/java/it/geosolutions/geoserver/rest/encoder/GSLayerEncoder.java @@ -41,6 +41,34 @@ import org.jdom.filter.Filter; * * The layer encoder is enabled by default * + * {@code + * + * {LAYERNAME} + * RASTER + * + * {STYLE_NAME} + * + * + * + * {RESOURCE_NAME} + * + * + * + * test + * http://www.fao.org/fileadmin/templates/faoweb/images/FAO-logo.png + * http://www.fao.org/fileadmin/templates/faoweb/images/FAO-logo.png + * 412 + * 77 + * image/png + * + * ... + * + * + * } + * + * + * @since gs-2.2.x */ public class GSLayerEncoder extends PropertyXMLEncoder { @@ -50,7 +78,7 @@ public class GSLayerEncoder extends PropertyXMLEncoder { final private Element stylesEncoder = new Element(STYLES); final private Element authorityURLListEncoder = new Element(AUTHORITY_URLS); - final private Element identifierListEncoder = new Element(IDENTIFIERS); + final private Element identifierListEncoder = new Element(IDENTIFIERS); public GSLayerEncoder() { super("layer"); diff --git a/src/main/java/it/geosolutions/geoserver/rest/encoder/GSLayerEncoder21.java b/src/main/java/it/geosolutions/geoserver/rest/encoder/GSLayerEncoder21.java index c9e0267..5c72ff9 100644 --- a/src/main/java/it/geosolutions/geoserver/rest/encoder/GSLayerEncoder21.java +++ b/src/main/java/it/geosolutions/geoserver/rest/encoder/GSLayerEncoder21.java @@ -45,6 +45,8 @@ import it.geosolutions.geoserver.rest.encoder.utils.XmlElement; * * The layer encoder is enabled by default * + * @since gs-2.1.x + * */ public class GSLayerEncoder21 extends GSLayerEncoder { diff --git a/src/main/java/it/geosolutions/geoserver/rest/encoder/GSResourceEncoder.java b/src/main/java/it/geosolutions/geoserver/rest/encoder/GSResourceEncoder.java index 7208762..963e2d2 100644 --- a/src/main/java/it/geosolutions/geoserver/rest/encoder/GSResourceEncoder.java +++ b/src/main/java/it/geosolutions/geoserver/rest/encoder/GSResourceEncoder.java @@ -166,9 +166,25 @@ public abstract class GSResourceEncoder extends PropertyXMLEncoder { } public void addKeyword(String keyword) { - final Element el = new Element("string"); - el.setText(keyword); - keywordsListEncoder.addContent(el); + checkKeyword(keyword); + putKeyword(keyword); + } + + /** + * {@code + * + * WCS + * ImageMosaic + * srtm30 KEYWORD}\@language={LANGUAGE}\;\@vocabulary={VOCABULARY}\; + * {KEYWORD_2}\@vocabulary={VOCABULARY_2}\; {KEYWORD_3}\@language={LANGUAGE_3}\; } + * + * @param keyword mandatory keyword ('\' characters are not permitted) + * @param language optional parameter + * @param vocabulary optional parameter + */ + public void addKeyword(final String keyword, final String language, final String vocabulary) { + checkKeyword(keyword); + putKeyword(buildKeyword(keyword, language, vocabulary)); } /** @@ -178,13 +194,28 @@ public abstract class GSResourceEncoder extends PropertyXMLEncoder { * @return true if something is removed, false otherwise */ public boolean delKeyword(final String keyword) { - final Element el = new Element("string"); - el.setText(keyword); + return removeKeyword(keyword, null, null); + } + + /** + * delete a keyword from the list + * + * @param keyword + * @return true if something is removed, false otherwise + */ + public boolean delKeyword(final String keyword, final String language, final String vocabulary) { + return removeKeyword(keyword, language, vocabulary); + } + + private boolean removeKeyword(final String keyword, final String language, + final String vocabulary) { + checkKeyword(keyword); + final String text = buildKeyword(keyword, language, vocabulary); return (keywordsListEncoder.removeContent(new Filter() { private static final long serialVersionUID = 1L; public boolean matches(Object obj) { - if (((Element) obj).getText().equals(keyword)) { + if (((Element) obj).getText().equals(text)) { return true; } return false; @@ -192,6 +223,31 @@ public abstract class GSResourceEncoder extends PropertyXMLEncoder { })).size() == 0 ? false : true; } + private void putKeyword(String keyword) { + final Element el = new Element("string"); + el.setText(keyword); + keywordsListEncoder.addContent(el); + } + + private void checkKeyword(String keyword) { + if (keyword == null || keyword.isEmpty() || keyword.contains("\\")) { + throw new IllegalArgumentException("keyword may not be null, empty or contains '\'"); + } + } + + private String buildKeyword(final String keyword, final String language, final String vocabulary) { + StringBuilder sb = new StringBuilder(keyword); + // \@language={LANGUAGE_3}\; + if (language != null && !language.isEmpty()) { + sb.append("\\@language=").append(language).append("\\;"); + } + // \@vocabulary={VOCABULARY}\; + if (vocabulary != null && !vocabulary.isEmpty()) { + sb.append("\\@vocabulary=").append(vocabulary).append("\\;"); + } + return sb.toString(); + } + /** * Adds a MetadataLinkInfo to the GeoServer Resource * diff --git a/src/main/java/it/geosolutions/geoserver/rest/encoder/coverage/GSCoverageEncoder.java b/src/main/java/it/geosolutions/geoserver/rest/encoder/coverage/GSCoverageEncoder.java index d549005..e5077fd 100644 --- a/src/main/java/it/geosolutions/geoserver/rest/encoder/coverage/GSCoverageEncoder.java +++ b/src/main/java/it/geosolutions/geoserver/rest/encoder/coverage/GSCoverageEncoder.java @@ -47,7 +47,6 @@ public class GSCoverageEncoder extends GSResourceEncoder { public GSCoverageEncoder() { super("coverage"); - addContent(dimensionsEncoder); } /** diff --git a/src/test/java/it/geosolutions/geoserver/decoder/VersionDecoderTest.java b/src/test/java/it/geosolutions/geoserver/decoder/VersionDecoderTest.java index 1e5149a..c9dd3b0 100644 --- a/src/test/java/it/geosolutions/geoserver/decoder/VersionDecoderTest.java +++ b/src/test/java/it/geosolutions/geoserver/decoder/VersionDecoderTest.java @@ -78,10 +78,10 @@ public class VersionDecoderTest extends GeoserverRESTTest { if (!enabled()) return; GSVersionDecoder geoserver = reader.getGeoserverVersion(); - if (GSVersionDecoder.VERSION.v22.equals(GSVersionDecoder.VERSION.getVersion(VERSION))) { + if (GSVersionDecoder.VERSION.v22.equals(GSVersionDecoder.VERSION.getVersion(GS_VERSION))) { Assert.assertEquals(geoserver.getVersion(), GSVersionDecoder.VERSION.v22); } else if (GSVersionDecoder.VERSION.UNRECOGNIZED.equals(GSVersionDecoder.VERSION - .getVersion(VERSION))) { + .getVersion(GS_VERSION))) { Assert.assertEquals(geoserver.getVersion(), GSVersionDecoder.VERSION.UNRECOGNIZED); } // print(dec.getRoot()); diff --git a/src/test/java/it/geosolutions/geoserver/rest/GeoserverRESTTest.java b/src/test/java/it/geosolutions/geoserver/rest/GeoserverRESTTest.java index f460f50..a01ee78 100644 --- a/src/test/java/it/geosolutions/geoserver/rest/GeoserverRESTTest.java +++ b/src/test/java/it/geosolutions/geoserver/rest/GeoserverRESTTest.java @@ -32,6 +32,7 @@ import it.geosolutions.geoserver.rest.decoder.RESTFeatureType; import it.geosolutions.geoserver.rest.decoder.RESTLayer; import it.geosolutions.geoserver.rest.decoder.RESTLayerGroup; import it.geosolutions.geoserver.rest.decoder.about.GSVersionDecoder; +import it.geosolutions.geoserver.rest.decoder.about.GSVersionDecoder.VERSION; import it.geosolutions.geoserver.rest.decoder.utils.NameLinkElem; import java.net.MalformedURLException; @@ -77,7 +78,7 @@ public abstract class GeoserverRESTTest { public static final String RESTPW; // geoserver target version - public static final String VERSION; + public static final String GS_VERSION; public static URL URL; @@ -95,7 +96,7 @@ public abstract class GeoserverRESTTest { RESTURL = getenv("gsmgr_resturl", "http://localhost:8080/geoserver"); RESTUSER = getenv("gsmgr_restuser", "admin"); RESTPW = getenv("gsmgr_restpw", "geoserver"); - VERSION = getenv("gsmgr_version", "2.4"); + GS_VERSION = getenv("gsmgr_version", "2.4"); // These tests will destroy data, so let's make sure we do want to run them enabled = getenv("gsmgr_resttest", "false").equalsIgnoreCase("true"); @@ -138,9 +139,9 @@ public abstract class GeoserverRESTTest { } GSVersionDecoder v=reader.getGeoserverVersion(); - if (!v.getVersion().equals(GSVersionDecoder.VERSION.getVersion(VERSION))){ - System.out.println("Failing tests : geoserver version does not match.\nAccepted versions: "+GSVersionDecoder.VERSION.print()); - fail("GeoServer version ("+v.getVersion()+") does not match the desired one (+VERSION+)"); + if (v.compareTo(VERSION.getVersion(GS_VERSION))!=0){ + System.out.println("Failing tests : geoserver version does not match.\nAccepted versions: "+VERSION.print()); + fail("GeoServer version ("+v.getVersion()+") does not match the desired one ("+GS_VERSION+")"); } } else { System.out.println("Skipping tests "); diff --git a/src/test/java/it/geosolutions/geoserver/rest/encoder/feature/GSFeatureEncoderTest.java b/src/test/java/it/geosolutions/geoserver/rest/encoder/feature/GSFeatureEncoderTest.java index 691b60b..50cde70 100644 --- a/src/test/java/it/geosolutions/geoserver/rest/encoder/feature/GSFeatureEncoderTest.java +++ b/src/test/java/it/geosolutions/geoserver/rest/encoder/feature/GSFeatureEncoderTest.java @@ -90,10 +90,10 @@ public class GSFeatureEncoderTest extends GeoserverRESTTest { fte.addMetadataLinkInfo(metadatalink); GSLayerEncoder layerEncoder = null; - if (!GSVersionDecoder.VERSION.getVersion(VERSION).equals( + if (!GSVersionDecoder.VERSION.getVersion(GS_VERSION).equals( GSVersionDecoder.VERSION.UNRECOGNIZED)) { layerEncoder = new GSLayerEncoder(); - } else if (GSVersionDecoder.VERSION.getVersion(VERSION).equals( + } else if (GSVersionDecoder.VERSION.getVersion(GS_VERSION).equals( GSVersionDecoder.VERSION.UNRECOGNIZED)) { layerEncoder = new GSLayerEncoder21(); } @@ -224,12 +224,16 @@ public class GSFeatureEncoderTest extends GeoserverRESTTest { public void testModifyFeature() { GSFeatureTypeEncoder encoder = new GSFeatureTypeEncoder(); encoder.addKeyword("KEYWORD_1"); - encoder.addKeyword("KEYWORD_2"); + encoder.addKeyword("KEYWORD_1","LAN_1","VOCAB_1"); + assertTrue(encoder.delKeyword("KEYWORD_1","LAN_1","VOCAB_1")); + encoder.addKeyword("..."); encoder.addKeyword("KEYWORD_N"); - - assertTrue(encoder.delKeyword("KEYWORD_2")); assertFalse(encoder.delKeyword("KEYWORD_M")); + + encoder.addKeyword("KEYWORD_2"); + assertFalse(encoder.delKeyword("KEYWORD_2","LAN_1","VOCAB_1")); + assertTrue(encoder.delKeyword("KEYWORD_2")); // metadataLinkInfo encoder.addMetadataLinkInfo("text/xml", "ISO19115:2003", diff --git a/src/test/java/it/geosolutions/geoserver/rest/publisher/GeoserverRESTImageMosaicTest.java b/src/test/java/it/geosolutions/geoserver/rest/publisher/GeoserverRESTImageMosaicTest.java index 45a2baa..a8f6633 100644 --- a/src/test/java/it/geosolutions/geoserver/rest/publisher/GeoserverRESTImageMosaicTest.java +++ b/src/test/java/it/geosolutions/geoserver/rest/publisher/GeoserverRESTImageMosaicTest.java @@ -110,7 +110,7 @@ public class GeoserverRESTImageMosaicTest extends GeoserverRESTTest { coverageEncoder.setUSE_JAI_IMAGEREAD(true); GSVersionDecoder v=reader.getGeoserverVersion(); - if (v.getVersion().equals(GSVersionDecoder.VERSION.getVersion(GSVersionDecoder.VERSION.v24.toString()))){ + if (v.compareTo(GSVersionDecoder.VERSION.v24)>=0){ // New style dimensions (since gs-2.4.x) GSCoverageDimensionEncoder gsCoverageDimensionEncoder = new GSCoverageDimensionEncoder( "GRAY_INDEX", "GridSampleDimension[-Infinity,Infinity]", "-inf", "inf", From 6dda73a5f1110687427b1854b5180530b001824d Mon Sep 17 00:00:00 2001 From: carlo cancellieri Date: Tue, 18 Feb 2014 03:18:51 +0100 Subject: [PATCH 4/4] fix integration tests with the latest gs 2.5.x --- .../rest/GeoServerRESTPublisher.java | 14 +- .../manager/GeoServerRESTStyleManager.java | 4 +- .../geoserver/rest/GeoserverRESTTest.java | 51 +++---- .../GSArcSDEDatastoreEncoderTest.java | 2 +- .../GSOracleNGDatastoreEncoderTest.java | 2 +- .../rest/datastore/StoreIntegrationTest.java | 129 ++++++++---------- .../coverage/GSCoverageEncoderTest.java | 4 +- .../encoder/feature/GSFeatureEncoderTest.java | 80 ++++++----- .../GeoServerRESTImageMosaicManagerTest.java | 39 +++--- .../GeoserverRESTDatastoreManagerTest.java | 4 +- .../publisher/GeoserverRESTGeoTiffTest.java | 2 +- .../GeoserverRESTImageMosaicTest.java | 8 +- .../GeoserverRESTPostgisDatastoreTest.java | 2 +- 13 files changed, 180 insertions(+), 161 deletions(-) diff --git a/src/main/java/it/geosolutions/geoserver/rest/GeoServerRESTPublisher.java b/src/main/java/it/geosolutions/geoserver/rest/GeoServerRESTPublisher.java index 4a49f1d..374bc8b 100644 --- a/src/main/java/it/geosolutions/geoserver/rest/GeoServerRESTPublisher.java +++ b/src/main/java/it/geosolutions/geoserver/rest/GeoServerRESTPublisher.java @@ -1821,12 +1821,9 @@ public class GeoServerRESTPublisher { throw new IllegalArgumentException("no coverageEncoder provided for mosaic " + mosaicDir); } - // override name to match the FIRST configured coverage - String coverageName = coverageEncoder.getName(); if (layerEncoder == null) { - throw new IllegalArgumentException("no layerEncoder provided for " + workspace + ":" - + coverageName); + throw new IllegalArgumentException("no layerEncoder provided for " + mosaicDir); } RESTCoverageStore store = createExternaMosaicDatastore(workspace, storeName, mosaicDir, @@ -1835,6 +1832,13 @@ public class GeoServerRESTPublisher { if (store == null) { return false; } + + // override name to match the FIRST configured coverage + String coverageName = coverageEncoder.getName(); + if (coverageName==null){ + coverageName=mosaicDir.getName(); + coverageEncoder.setName(coverageName); + } if (!createCoverage(workspace, storeName, coverageEncoder)) { if (LOGGER.isErrorEnabled()) LOGGER.error("Unable to create a coverage for the store:" + coverageName); @@ -2129,6 +2133,8 @@ public class GeoServerRESTPublisher { */ private void deleteStylesForWorkspace(String workspace) { RESTStyleList styles = styleManager.getStyles(workspace); + if (styles==null) + return; for (NameLinkElem nameLinkElem : styles) { removeStyleInWorkspace(workspace, nameLinkElem.getName(), true); } diff --git a/src/main/java/it/geosolutions/geoserver/rest/manager/GeoServerRESTStyleManager.java b/src/main/java/it/geosolutions/geoserver/rest/manager/GeoServerRESTStyleManager.java index d06492a..18ff1ad 100644 --- a/src/main/java/it/geosolutions/geoserver/rest/manager/GeoServerRESTStyleManager.java +++ b/src/main/java/it/geosolutions/geoserver/rest/manager/GeoServerRESTStyleManager.java @@ -316,7 +316,9 @@ public class GeoServerRESTStyleManager extends GeoServerRESTAbstractManager { if(styleName.contains(":")) LOGGER.warn("Style name is going to be changed ["+styleName+"]"); styleName = styleName.replaceAll(":", "_"); - styleName = URLEncoder.encode(styleName); + + // currently REST interface does't support URLencoded URL +// styleName = URLEncoder.encode(styleName); String sUrl = buildUrl(null, styleName, null); if (purge) { diff --git a/src/test/java/it/geosolutions/geoserver/rest/GeoserverRESTTest.java b/src/test/java/it/geosolutions/geoserver/rest/GeoserverRESTTest.java index a01ee78..8157afc 100644 --- a/src/test/java/it/geosolutions/geoserver/rest/GeoserverRESTTest.java +++ b/src/test/java/it/geosolutions/geoserver/rest/GeoserverRESTTest.java @@ -40,6 +40,8 @@ import java.net.URL; import java.util.List; import static org.junit.Assert.*; + +import org.jdom.output.EscapeStrategy; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Rule; @@ -133,7 +135,7 @@ public abstract class GeoserverRESTTest { LOGGER.info("Using geoserver instance " + RESTUSER + ":" + RESTPW + " @ " + RESTURL); } - } else { + } else if (existgs == false){ System.out.println("Failing tests : geoserver not found"); fail("GeoServer not found"); } @@ -187,30 +189,32 @@ public abstract class GeoserverRESTTest { LOGGER.info("Found " + groups.size() + " layerGroups"); for (String groupName : groups) { RESTLayerGroup group = reader.getLayerGroup(groupName); - StringBuilder sb = new StringBuilder("Group: ").append(groupName).append(":"); - for (NameLinkElem layer : group.getLayerList()) { - sb.append(" ").append(layer); + if (groups != null) { + StringBuilder sb = new StringBuilder("Group: ").append(groupName).append(":"); + for (NameLinkElem layer : group.getLayerList()) { + sb.append(" ").append(layer); + } + + boolean removed = publisher.removeLayerGroup(groupName); + LOGGER.info(sb.toString() + ": removed: " + removed); + assertTrue("LayerGroup not removed: " + groupName, removed); } - - boolean removed = publisher.removeLayerGroup(groupName); - LOGGER.info(sb.toString() + ": removed: " + removed); - assertTrue("LayerGroup not removed: " + groupName, removed); } - } private void deleteAllLayers() { List layers = reader.getLayers().getNames(); - for (String layerName : layers) { - RESTLayer layer = reader.getLayer(layerName); - if (layer.getType() == RESTLayer.Type.VECTOR) - deleteFeatureType(layer); - else if (layer.getType() == RESTLayer.Type.RASTER) - deleteCoverage(layer); - else - LOGGER.error("Unknown layer type " + layer.getType()); + if (layers != null) { + for (String layerName : layers) { + RESTLayer layer = reader.getLayer(layerName); + if (layer.getType() == RESTLayer.Type.VECTOR) + deleteFeatureType(layer); + else if (layer.getType() == RESTLayer.Type.RASTER) + deleteCoverage(layer); + else + LOGGER.error("Unknown layer type " + layer.getType()); + } } - } private void deleteAllCoverageStores() { @@ -270,11 +274,12 @@ public abstract class GeoserverRESTTest { protected void deleteAllStyles() { List styles = reader.getStyles().getNames(); - for (String style : styles) { - LOGGER.warn("Deleting Style " + style); - boolean removed = publisher.removeStyle(style,true); - assertTrue("Style not removed " + style, removed); - + if (styles != null) { + for (String style : styles) { + LOGGER.warn("Deleting Style " + style); + boolean removed = publisher.removeStyle(style, true); + assertTrue("Style not removed " + style, removed); + } } } diff --git a/src/test/java/it/geosolutions/geoserver/rest/datastore/GSArcSDEDatastoreEncoderTest.java b/src/test/java/it/geosolutions/geoserver/rest/datastore/GSArcSDEDatastoreEncoderTest.java index c330afe..25ea83f 100644 --- a/src/test/java/it/geosolutions/geoserver/rest/datastore/GSArcSDEDatastoreEncoderTest.java +++ b/src/test/java/it/geosolutions/geoserver/rest/datastore/GSArcSDEDatastoreEncoderTest.java @@ -60,7 +60,7 @@ public class GSArcSDEDatastoreEncoderTest extends StoreIntegrationTest { public GSArcSDEDatastoreEncoderTest() throws IllegalArgumentException, MalformedURLException { - super(System.getProperty("Ignore", "false").equalsIgnoreCase("true")); + super(System.getProperty("Ignore", "true").equalsIgnoreCase("true")); } @Override diff --git a/src/test/java/it/geosolutions/geoserver/rest/datastore/GSOracleNGDatastoreEncoderTest.java b/src/test/java/it/geosolutions/geoserver/rest/datastore/GSOracleNGDatastoreEncoderTest.java index 1a2e3a5..aa5db70 100644 --- a/src/test/java/it/geosolutions/geoserver/rest/datastore/GSOracleNGDatastoreEncoderTest.java +++ b/src/test/java/it/geosolutions/geoserver/rest/datastore/GSOracleNGDatastoreEncoderTest.java @@ -61,7 +61,7 @@ public class GSOracleNGDatastoreEncoderTest extends StoreIntegrationTest { // private final static Logger LOGGER = LoggerFactory.getLogger(GSOracleNGDatastoreEncoderTest.class); public GSOracleNGDatastoreEncoderTest() throws IllegalArgumentException, MalformedURLException { - super(System.getProperty("pgIgnore", "false").equalsIgnoreCase("true")); + super(System.getProperty("pgIgnore", "true").equalsIgnoreCase("true")); } diff --git a/src/test/java/it/geosolutions/geoserver/rest/datastore/StoreIntegrationTest.java b/src/test/java/it/geosolutions/geoserver/rest/datastore/StoreIntegrationTest.java index 42b0442..67c4ccf 100644 --- a/src/test/java/it/geosolutions/geoserver/rest/datastore/StoreIntegrationTest.java +++ b/src/test/java/it/geosolutions/geoserver/rest/datastore/StoreIntegrationTest.java @@ -44,104 +44,93 @@ import org.slf4j.LoggerFactory; *

* Since these tests require a running Store instance, this is more like integration tests.
* - * For testing that a datastore is properly configured, a layer publication has - * to be attempted. For this, the 'states' data (states shapefile - available in - * testdata/states.zip) has to be imported in the corresponding store. - * Note: For Oracle NG this name has to be uppercase (STATES). + * For testing that a datastore is properly configured, a layer publication has to be attempted. For this, the 'states' data (states shapefile - + * available in testdata/states.zip) has to be imported in the corresponding store. Note: For Oracle NG this name has to be uppercase (STATES). * * @author carlo cancellieri - GeoSolutions * @author emmanuel blondel - * + * * @see GeoserverRESTTest */ public abstract class StoreIntegrationTest extends GeoserverRESTTest { protected final GeoServerRESTStoreManager storeManager; - + /** * ignore integration tests */ protected final boolean ignore; private final static Logger LOGGER = LoggerFactory.getLogger(StoreIntegrationTest.class); - + public boolean isIgnore() { return ignore; } /** * - * @param ignore false if this test shoudl be disabled + * @param ignore true if this test should be disabled * @throws IllegalArgumentException * @throws MalformedURLException */ - public StoreIntegrationTest(boolean ignore) throws IllegalArgumentException, MalformedURLException { + public StoreIntegrationTest(boolean ignore) throws IllegalArgumentException, + MalformedURLException { super(); this.storeManager = new GeoServerRESTStoreManager(URL, RESTUSER, RESTPW); - this.ignore=ignore; + this.ignore = ignore; } - + public abstract GSAbstractStoreEncoder getStoreEncoderTest(); @Test - public void testCreateDeleteDatastore() throws IllegalArgumentException, MalformedURLException { - if (!enabled()) { - return; - } - deleteAll(); - - assertTrue(publisher.createWorkspace(DEFAULT_WS)); - - // creation test - GSAbstractStoreEncoder storeEncoder=getStoreEncoderTest(); - - String storeName = storeEncoder.getName(); - // String description = storeEncoder.getDescription(); - - boolean created = storeManager.create(DEFAULT_WS, storeEncoder); - - if( ! ignore ) - assertTrue("Datastore not created", created); - else if( ! created) - LOGGER.error("*** store " + storeName + " has not been created."); - - - RESTDataStore datastore = reader.getDatastore(DEFAULT_WS, storeName); - assertNotNull(datastore); - LOGGER.info("The type of the created datastore is: " + datastore.getStoreType()); - - //check if the datastore is properly configured in GS for publishing layers - String layername = "states"; - if(storeEncoder instanceof GSOracleNGDatastoreEncoder) - layername = layername.toUpperCase(); - - GSFeatureTypeEncoder fte = new GSFeatureTypeEncoder(); - fte.setName(layername); - fte.setTitle(layername); - fte.setNativeCRS("EPSG:4326"); - fte.setDescription("desc"); - fte.setEnabled(true); - GSLayerEncoder layerEncoder = new GSLayerEncoder(); - layerEncoder.setEnabled(true); - layerEncoder.setQueryable(true); - layerEncoder.setDefaultStyle("polygon"); - - boolean published = publisher.publishDBLayer(DEFAULT_WS, storeName, fte, layerEncoder); - if(!ignore){ - assertTrue("Test layer not published", published); - }else if(!published){ - LOGGER.error("*** Test layer " - + layername - + " has not been published. Problem in datastore configuration"); - } - - // removing test - boolean removed = storeManager.remove(DEFAULT_WS, storeEncoder, true); - if( ! ignore ) - assertTrue("Datastore not removed", removed); - else if( ! removed ) - LOGGER.error("*** Datastore " + storeName + " has not been removed."); - - assertTrue(publisher.removeWorkspace(DEFAULT_WS, false)); + public void testCreateDeleteDatastore() throws IllegalArgumentException, MalformedURLException { + if (!enabled() || ignore) { + return; } + deleteAll(); + + assertTrue(publisher.createWorkspace(DEFAULT_WS)); + + // creation test + GSAbstractStoreEncoder storeEncoder = getStoreEncoderTest(); + + String storeName = storeEncoder.getName(); + // String description = storeEncoder.getDescription(); + + boolean created = storeManager.create(DEFAULT_WS, storeEncoder); + + assertTrue("*** store " + storeName + " has not been created.", created); + + RESTDataStore datastore = reader.getDatastore(DEFAULT_WS, storeName); + assertNotNull(datastore); + LOGGER.info("The type of the created datastore is: " + datastore.getStoreType()); + + // check if the datastore is properly configured in GS for publishing layers + String layername = "states"; + + if (storeEncoder instanceof GSOracleNGDatastoreEncoder) + layername = layername.toUpperCase(); + + GSFeatureTypeEncoder fte = new GSFeatureTypeEncoder(); + fte.setName(layername); + fte.setNativeName(layername); + fte.setTitle(layername+"_TITLE"); + fte.setNativeCRS("EPSG:4326"); + fte.setDescription("desc"); + fte.setEnabled(true); + GSLayerEncoder layerEncoder = new GSLayerEncoder(); + layerEncoder.setEnabled(true); + layerEncoder.setQueryable(true); + layerEncoder.setDefaultStyle("polygon"); + + boolean published = publisher.publishDBLayer(DEFAULT_WS, storeName, fte, layerEncoder); + + assertTrue("*** Test layer " + layername + + " has not been published. Problem in datastore configuration", published); + + // removing test + boolean removed = storeManager.remove(DEFAULT_WS, storeEncoder, true); + assertTrue("*** Datastore " + storeName + " has not been removed.", removed); + assertTrue(publisher.removeWorkspace(DEFAULT_WS, false)); + } } diff --git a/src/test/java/it/geosolutions/geoserver/rest/encoder/coverage/GSCoverageEncoderTest.java b/src/test/java/it/geosolutions/geoserver/rest/encoder/coverage/GSCoverageEncoderTest.java index 0c82101..bb52927 100644 --- a/src/test/java/it/geosolutions/geoserver/rest/encoder/coverage/GSCoverageEncoderTest.java +++ b/src/test/java/it/geosolutions/geoserver/rest/encoder/coverage/GSCoverageEncoderTest.java @@ -107,7 +107,7 @@ public class GSCoverageEncoderTest extends TestCase { encoder.addKeyword("KEYWORD_N"); - // Old style dimensions (into metadata) + // setting dimensions (into metadata) final GSDimensionInfoEncoder timeDimension=new GSDimensionInfoEncoder(true); timeDimension.setPresentation(Presentation.CONTINUOUS_INTERVAL); encoder.setMetadata("time", timeDimension); @@ -123,7 +123,7 @@ public class GSCoverageEncoderTest extends TestCase { elevationDimension.setPresentation(Presentation.LIST); encoder.setMetadata("elevation", elevationDimension); - // New style dimensions (since gs-2.4.x) + // setting dimensions (since gs-2.4.x) GSCoverageDimensionEncoder gsCoverageDimensionEncoder = new GSCoverageDimensionEncoder( "GRAY_INDEX", "GridSampleDimension[-Infinity,Infinity]", "-inf", "inf", "dobson units³", "REAL_32BITS"); diff --git a/src/test/java/it/geosolutions/geoserver/rest/encoder/feature/GSFeatureEncoderTest.java b/src/test/java/it/geosolutions/geoserver/rest/encoder/feature/GSFeatureEncoderTest.java index 50cde70..9a5bc99 100644 --- a/src/test/java/it/geosolutions/geoserver/rest/encoder/feature/GSFeatureEncoderTest.java +++ b/src/test/java/it/geosolutions/geoserver/rest/encoder/feature/GSFeatureEncoderTest.java @@ -21,9 +21,11 @@ package it.geosolutions.geoserver.rest.encoder.feature; import it.geosolutions.geoserver.rest.GeoServerRESTPublisher; import it.geosolutions.geoserver.rest.GeoserverRESTTest; +import it.geosolutions.geoserver.rest.decoder.RESTFeatureType; import it.geosolutions.geoserver.rest.decoder.RESTLayer; import it.geosolutions.geoserver.rest.decoder.RESTResource; import it.geosolutions.geoserver.rest.decoder.about.GSVersionDecoder; +import it.geosolutions.geoserver.rest.decoder.about.GSVersionDecoder.VERSION; import it.geosolutions.geoserver.rest.encoder.GSLayerEncoder; import it.geosolutions.geoserver.rest.encoder.GSLayerEncoder21; import it.geosolutions.geoserver.rest.encoder.GSResourceEncoder; @@ -71,9 +73,21 @@ public class GSFeatureEncoderTest extends GeoserverRESTTest { deleteAll(); GeoServerRESTPublisher publisher = new GeoServerRESTPublisher(RESTURL, RESTUSER, RESTPW); - + String storeName = "resttestshp"; String layerName = "cities"; + + publisher.createWorkspace(DEFAULT_WS); + + File zipFile = new ClassPathResource("testdata/resttestshp.zip").getFile(); + + // test insert + boolean published = publisher.publishShp(DEFAULT_WS, storeName, layerName, zipFile); + assertTrue("publish() failed", published); + assertTrue(existsLayer(layerName)); + + publisher.publishStyle(new File(new ClassPathResource("testdata").getFile(), + "default_point.sld")); GSFeatureTypeEncoder fte = new GSFeatureTypeEncoder(); fte.setNativeName(layerName); @@ -90,11 +104,9 @@ public class GSFeatureEncoderTest extends GeoserverRESTTest { fte.addMetadataLinkInfo(metadatalink); GSLayerEncoder layerEncoder = null; - if (!GSVersionDecoder.VERSION.getVersion(GS_VERSION).equals( - GSVersionDecoder.VERSION.UNRECOGNIZED)) { + if (VERSION.getVersion(GS_VERSION).compareTo(VERSION.UNRECOGNIZED) > 0) { layerEncoder = new GSLayerEncoder(); - } else if (GSVersionDecoder.VERSION.getVersion(GS_VERSION).equals( - GSVersionDecoder.VERSION.UNRECOGNIZED)) { + } else if (VERSION.getVersion(GS_VERSION).compareTo(VERSION.UNRECOGNIZED) == 0) { layerEncoder = new GSLayerEncoder21(); } layerEncoder.setEnabled(true); @@ -118,21 +130,10 @@ public class GSFeatureEncoderTest extends GeoserverRESTTest { layerEncoder.addIdentifier(identifier1); layerEncoder.addIdentifier(identifier2); - publisher.createWorkspace(DEFAULT_WS); - - File zipFile = new ClassPathResource("testdata/resttestshp.zip").getFile(); - - // test insert - boolean published = publisher.publishShp(DEFAULT_WS, storeName, layerName, zipFile); - assertTrue("publish() failed", published); - assertTrue(existsLayer(layerName)); - - publisher.publishStyle(new File(new ClassPathResource("testdata").getFile(), - "default_point.sld")); // optionally select the attributes to publish - RESTLayer layer = reader.getLayer(layerName); - RESTResource resource = reader.getResource(layer); + RESTLayer layer = reader.getLayer(DEFAULT_WS, layerName); + RESTFeatureType resource = reader.getFeatureType(layer); List attrs = resource.getEncodedAttributeList(); assertNotNull(attrs); for (GSAttributeEncoder enc : attrs) { @@ -143,8 +144,6 @@ public class GSFeatureEncoderTest extends GeoserverRESTTest { } - - @Test public void testFeatureTypeEncoder() { @@ -224,15 +223,15 @@ public class GSFeatureEncoderTest extends GeoserverRESTTest { public void testModifyFeature() { GSFeatureTypeEncoder encoder = new GSFeatureTypeEncoder(); encoder.addKeyword("KEYWORD_1"); - encoder.addKeyword("KEYWORD_1","LAN_1","VOCAB_1"); - assertTrue(encoder.delKeyword("KEYWORD_1","LAN_1","VOCAB_1")); - + encoder.addKeyword("KEYWORD_1", "LAN_1", "VOCAB_1"); + assertTrue(encoder.delKeyword("KEYWORD_1", "LAN_1", "VOCAB_1")); + encoder.addKeyword("..."); encoder.addKeyword("KEYWORD_N"); assertFalse(encoder.delKeyword("KEYWORD_M")); - + encoder.addKeyword("KEYWORD_2"); - assertFalse(encoder.delKeyword("KEYWORD_2","LAN_1","VOCAB_1")); + assertFalse(encoder.delKeyword("KEYWORD_2", "LAN_1", "VOCAB_1")); assertTrue(encoder.delKeyword("KEYWORD_2")); // metadataLinkInfo @@ -280,19 +279,35 @@ public class GSFeatureEncoderTest extends GeoserverRESTTest { * testdata/states.zip) - create a postgis db - import the states shapefile (using shp2pgsql or Postgis shapefile uploader) - In Geoserver, create * a postgis datastore for this DB, with the name "statesdb" * + * @throws IOException + * */ @Test - public void testSQLViewIntegration() { + public void testSQLViewIntegration() throws IOException { if (!enabled()) return; deleteAll(); + GeoServerRESTPublisher publisher = new GeoServerRESTPublisher(RESTURL, RESTUSER, RESTPW); - String storeName = "statesdb"; // name of the datastore setup for tests - String layerName = "my_sqlviewlayer"; - String nativeName = "popstates"; + String storeName = "resttestshp"; + String layerName = "cities"; + + // build the store + publisher.createWorkspace(DEFAULT_WS); + + // test insert + File zipFile = new ClassPathResource("testdata/resttestshp.zip").getFile(); + boolean published = publisher.publishShp(DEFAULT_WS, storeName, layerName, zipFile); + assertTrue("publish() failed", published); + publisher.publishStyle(new File(new ClassPathResource("testdata").getFile(), + "default_point.sld")); + + String nativeName = layerName; + layerName=layerName+"_NEW"; + GSFeatureTypeEncoder fte = new GSFeatureTypeEncoder(); fte.setName(layerName); fte.setNativeName(nativeName); @@ -323,7 +338,6 @@ public class GSFeatureEncoderTest extends GeoserverRESTTest { vte.addVirtualTableGeometry(vtGeom); vte.addVirtualTableParameter(vtParam1); vte.addVirtualTableParameter(vtParam2); - fte.setMetadataVirtualTable(vte); // Set the virtual table // modif the vte vte.delVirtualTableGeometry("the_geom"); @@ -333,17 +347,19 @@ public class GSFeatureEncoderTest extends GeoserverRESTTest { vte.addVirtualTableParameter(vtParam3); vte.addKeyColumn("gid"); + fte.setMetadataVirtualTable(vte); // Set the virtual table + // Layer encoder // ------------- GSLayerEncoder layerEncoder = new GSLayerEncoder(); layerEncoder.setEnabled(true); layerEncoder.setQueryable(true); layerEncoder.setDefaultStyle("polygon"); - + // test insert // ------------ publisher.createWorkspace(DEFAULT_WS); - boolean published = publisher.publishDBLayer(DEFAULT_WS, storeName, fte, layerEncoder); + published = publisher.publishDBLayer(DEFAULT_WS, storeName, fte, layerEncoder); assertTrue("Publication unsuccessful", published); assertTrue("Layer does not exist", existsLayer(layerName)); diff --git a/src/test/java/it/geosolutions/geoserver/rest/manager/GeoServerRESTImageMosaicManagerTest.java b/src/test/java/it/geosolutions/geoserver/rest/manager/GeoServerRESTImageMosaicManagerTest.java index a94759b..cf9dff7 100644 --- a/src/test/java/it/geosolutions/geoserver/rest/manager/GeoServerRESTImageMosaicManagerTest.java +++ b/src/test/java/it/geosolutions/geoserver/rest/manager/GeoServerRESTImageMosaicManagerTest.java @@ -39,27 +39,28 @@ public class GeoServerRESTImageMosaicManagerTest extends GeoserverRESTTest { if (!enabled()) { return; } + deleteAll(); + + publisher.createWorkspace(DEFAULT_WS); + // crea the manager GeoServerRESTStructuredGridCoverageReaderManager manager = new GeoServerRESTStructuredGridCoverageReaderManager(new URL(RESTURL), RESTUSER, RESTPW); // create mosaic - final String workspaceName = "it.geosolutions"; final String coverageStoreName = "mosaic"; final String coverageName = "mosaic"; final String format = "imagemosaic"; // upload the mosaic - boolean create=manager.create(workspaceName, coverageStoreName,new ClassPathResource("testdata/granules/mosaic.zip").getFile().getAbsolutePath()); + boolean create=manager.create(DEFAULT_WS, coverageStoreName,new ClassPathResource("testdata/granules/mosaic.zip").getFile().getAbsolutePath()); assertTrue(create); // enable dimension - fixDimensions(workspaceName, coverageStoreName, coverageName); + fixDimensions(DEFAULT_WS, coverageStoreName, coverageName); // check index format - RESTStructuredCoverageIndexSchema indexFormat = manager.getGranuleIndexSchema(workspaceName, coverageName,coverageName); - assertTrue(create); - + RESTStructuredCoverageIndexSchema indexFormat = manager.getGranuleIndexSchema(DEFAULT_WS, coverageName,coverageName); assertNotNull(indexFormat); assertFalse(indexFormat.isEmpty()); assertEquals(5, indexFormat.size()); @@ -95,14 +96,14 @@ public class GeoServerRESTImageMosaicManagerTest extends GeoserverRESTTest { // get with paging - granulesList = manager.getGranules(workspaceName, coverageStoreName, coverageName , null, 0, 1); + granulesList = manager.getGranules(DEFAULT_WS, coverageStoreName, coverageName , null, 0, 1); assertNotNull(granulesList); assertEquals(1, granulesList.size()); assertFalse(granulesList.isEmpty()); granule = granulesList.get(0); assertNotNull(granule); - granulesList = manager.getGranules(workspaceName, coverageStoreName, coverageName, null, null, 2); + granulesList = manager.getGranules(DEFAULT_WS, coverageStoreName, coverageName, null, null, 2); assertNotNull(granulesList); assertEquals(2, granulesList.size()); assertFalse(granulesList.isEmpty()); @@ -110,7 +111,7 @@ public class GeoServerRESTImageMosaicManagerTest extends GeoserverRESTTest { assertNotNull(granule); // get with no paging - granulesList = manager.getGranules(workspaceName, coverageStoreName, coverageName); + granulesList = manager.getGranules(DEFAULT_WS, coverageStoreName, coverageName); assertNotNull(granulesList); assertEquals(4, granulesList.size()); assertFalse(granulesList.isEmpty()); @@ -118,21 +119,21 @@ public class GeoServerRESTImageMosaicManagerTest extends GeoserverRESTTest { assertNotNull(granule); // examples of filtering with CQL - granulesList = manager.getGranules(workspaceName, coverageStoreName, coverageName, "depth = 100", null, null); + granulesList = manager.getGranules(DEFAULT_WS, coverageStoreName, coverageName, "depth = 100", null, null); assertNotNull(granulesList); assertEquals(2, granulesList.size()); assertFalse(granulesList.isEmpty()); granule = granulesList.get(0); assertNotNull(granule); - granulesList = manager.getGranules(workspaceName, coverageStoreName, coverageName, "depth = 100 AND date='20081101T0000000'", null, null); + granulesList = manager.getGranules(DEFAULT_WS, coverageStoreName, coverageName, "depth = 100 AND date='20081101T0000000'", null, null); assertNotNull(granulesList); assertEquals(1, granulesList.size()); assertFalse(granulesList.isEmpty()); granule = granulesList.get(0); assertNotNull(granule); - granulesList = manager.getGranules(workspaceName, coverageStoreName, coverageName, "location LIKE 'NCOM_wattemp%'", 0, 1); + granulesList = manager.getGranules(DEFAULT_WS, coverageStoreName, coverageName, "location LIKE 'NCOM_wattemp%'", 0, 1); assertNotNull(granulesList); assertEquals(1, granulesList.size()); assertFalse(granulesList.isEmpty()); @@ -141,21 +142,21 @@ public class GeoServerRESTImageMosaicManagerTest extends GeoserverRESTTest { // remove by filter final String fileLocation = "NCOM_wattemp_100_20081101T0000000_12.tiff"; - boolean result = manager.removeGranulesByCQL(workspaceName, coverageStoreName, coverageName, "location = '" + fileLocation + "'"); + boolean result = manager.removeGranulesByCQL(DEFAULT_WS, coverageStoreName, coverageName, "location = '" + fileLocation + "'"); Assert.assertTrue(result); - granulesList = manager.getGranules(workspaceName, coverageStoreName, coverageName); + granulesList = manager.getGranules(DEFAULT_WS, coverageStoreName, coverageName); assertNotNull(granulesList); - assertEquals(3, granulesList.size()); assertFalse(granulesList.isEmpty()); + assertEquals(4, granulesList.size()); granule = granulesList.get(0); assertNotNull(granule); // Readding that granule with harvest - result = manager.harvestExternal(workspaceName, coverageStoreName, format, new ClassPathResource("testdata/granules/NCOM_wattemp_100_20081101T0000000_12.tiff").getFile().getAbsolutePath() ); + result = manager.harvestExternal(DEFAULT_WS, coverageStoreName, format, new ClassPathResource("testdata/granules/NCOM_wattemp_100_20081101T0000000_12.tiff").getFile().getAbsolutePath() ); Assert.assertTrue(result); - granulesList = manager.getGranules(workspaceName, coverageStoreName, coverageName, null, null, null); + granulesList = manager.getGranules(DEFAULT_WS, coverageStoreName, coverageName, null, null, null); assertNotNull(granulesList); assertEquals(4, granulesList.size()); assertFalse(granulesList.isEmpty()); @@ -164,7 +165,7 @@ public class GeoServerRESTImageMosaicManagerTest extends GeoserverRESTTest { // delete - delete(workspaceName, coverageStoreName); + delete(DEFAULT_WS, coverageStoreName); } @@ -218,6 +219,8 @@ public class GeoServerRESTImageMosaicManagerTest extends GeoserverRESTTest { String csname) throws NumberFormatException { // get current config for the coverage to extract the params we want to set again final RESTCoverage coverage = reader.getCoverage(wsName, coverageStoreName, csname); + if (coverage==null) + return null; final Map params = coverage.getParametersList(); // prepare and fill the encoder diff --git a/src/test/java/it/geosolutions/geoserver/rest/manager/GeoserverRESTDatastoreManagerTest.java b/src/test/java/it/geosolutions/geoserver/rest/manager/GeoserverRESTDatastoreManagerTest.java index a7f916b..c09c085 100644 --- a/src/test/java/it/geosolutions/geoserver/rest/manager/GeoserverRESTDatastoreManagerTest.java +++ b/src/test/java/it/geosolutions/geoserver/rest/manager/GeoserverRESTDatastoreManagerTest.java @@ -79,8 +79,8 @@ public class GeoserverRESTDatastoreManagerTest extends StoreIntegrationTest { private static URL LOCATION_2; public GeoserverRESTDatastoreManagerTest() throws Exception { - super(true); - LOCATION_1 = new URL("file:data/1"); + super(false); + LOCATION_1 = new URL("file:data/shapefiles/"); LOCATION_2 = new URL("file:data/2"); } diff --git a/src/test/java/it/geosolutions/geoserver/rest/publisher/GeoserverRESTGeoTiffTest.java b/src/test/java/it/geosolutions/geoserver/rest/publisher/GeoserverRESTGeoTiffTest.java index fe79109..1eaf9df 100644 --- a/src/test/java/it/geosolutions/geoserver/rest/publisher/GeoserverRESTGeoTiffTest.java +++ b/src/test/java/it/geosolutions/geoserver/rest/publisher/GeoserverRESTGeoTiffTest.java @@ -108,7 +108,7 @@ public class GeoserverRESTGeoTiffTest extends GeoserverRESTTest { assertTrue("publish() failed", pub); double[] bbox = {-103.85, 44.38, -103.62, 44.50}; - pub = publisher.publishGeoTIFF(DEFAULT_WS, storeName+"another_complex", "layername_complex", geotiff, "EPSG:4326", ProjectionPolicy.REPROJECT_TO_DECLARED, "raster", bbox); + pub = publisher.publishGeoTIFF(DEFAULT_WS, storeName+"another_complex", storeName+"another_complex", geotiff, "EPSG:4326", ProjectionPolicy.REPROJECT_TO_DECLARED, "raster", bbox); assertTrue("publish() failed", pub); diff --git a/src/test/java/it/geosolutions/geoserver/rest/publisher/GeoserverRESTImageMosaicTest.java b/src/test/java/it/geosolutions/geoserver/rest/publisher/GeoserverRESTImageMosaicTest.java index a8f6633..93582c3 100644 --- a/src/test/java/it/geosolutions/geoserver/rest/publisher/GeoserverRESTImageMosaicTest.java +++ b/src/test/java/it/geosolutions/geoserver/rest/publisher/GeoserverRESTImageMosaicTest.java @@ -94,7 +94,7 @@ public class GeoserverRESTImageMosaicTest extends GeoserverRESTTest { * or create a new one from an existing store: * publisher.createCoverage(ce, wsname, csname); */ - coverageEncoder.setName("CoverageName"); +// coverageEncoder.setName("time_geotiff"); coverageEncoder.setAllowMultithreading(true); coverageEncoder.setBackgroundValues(""); @@ -111,13 +111,12 @@ public class GeoserverRESTImageMosaicTest extends GeoserverRESTTest { GSVersionDecoder v=reader.getGeoserverVersion(); if (v.compareTo(GSVersionDecoder.VERSION.v24)>=0){ - // New style dimensions (since gs-2.4.x) GSCoverageDimensionEncoder gsCoverageDimensionEncoder = new GSCoverageDimensionEncoder( "GRAY_INDEX", "GridSampleDimension[-Infinity,Infinity]", "-inf", "inf", "dobson units³", "REAL_32BITS"); coverageEncoder.addCoverageDimensionInfo(gsCoverageDimensionEncoder); - } else { - // Old stile setting code + } + // activate time final GSDimensionInfoEncoder time=new GSDimensionInfoEncoder(true); time.setPresentation(Presentation.LIST); @@ -125,7 +124,6 @@ public class GeoserverRESTImageMosaicTest extends GeoserverRESTTest { coverageEncoder.setMetadata("time", time); // not active elevation coverageEncoder.setMetadata("elevation", new GSDimensionInfoEncoder()); - } diff --git a/src/test/java/it/geosolutions/geoserver/rest/publisher/GeoserverRESTPostgisDatastoreTest.java b/src/test/java/it/geosolutions/geoserver/rest/publisher/GeoserverRESTPostgisDatastoreTest.java index c2e2ea8..fa39ecf 100644 --- a/src/test/java/it/geosolutions/geoserver/rest/publisher/GeoserverRESTPostgisDatastoreTest.java +++ b/src/test/java/it/geosolutions/geoserver/rest/publisher/GeoserverRESTPostgisDatastoreTest.java @@ -62,7 +62,7 @@ public class GeoserverRESTPostgisDatastoreTest extends StoreIntegrationTest { public GeoserverRESTPostgisDatastoreTest() throws IllegalArgumentException, MalformedURLException { - super(System.getProperty("pgIgnore", "false").equalsIgnoreCase("true")); + super(System.getProperty("pgIgnore", "true").equalsIgnoreCase("true")); }