From ef597824dce380397e211b9b151ddcea34c34d08 Mon Sep 17 00:00:00 2001 From: eblondel Date: Sat, 6 Apr 2013 15:27:05 +0200 Subject: [PATCH 1/3] MetadataLink support - add encoder/decoder --- .../geoserver/rest/decoder/RESTResource.java | 58 ++++++++++ .../rest/encoder/GSResourceEncoder.java | 45 ++++++++ .../GSMetadataLinkInfoEncoder.java | 107 ++++++++++++++++++ .../ResourceMetadataLinkInfo.java | 36 ++++++ 4 files changed, 246 insertions(+) create mode 100644 src/main/java/it/geosolutions/geoserver/rest/encoder/metadatalink/GSMetadataLinkInfoEncoder.java create mode 100644 src/main/java/it/geosolutions/geoserver/rest/encoder/metadatalink/ResourceMetadataLinkInfo.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 9067b49..5c78d3f 100644 --- a/src/main/java/it/geosolutions/geoserver/rest/decoder/RESTResource.java +++ b/src/main/java/it/geosolutions/geoserver/rest/decoder/RESTResource.java @@ -28,6 +28,8 @@ package it.geosolutions.geoserver.rest.decoder; import it.geosolutions.geoserver.rest.decoder.utils.JDOMBuilder; 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; @@ -41,6 +43,7 @@ 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 */ public class RESTResource { protected final Element rootElem; @@ -154,6 +157,61 @@ public class RESTResource { return attrsList; } + + + /** + * + * @author Emmanuel Blondel + * + * @return the list of metadataLinkInfo + */ + public List> getMetadataLinkInfoList() { + List> metaLinksList = null; + + final Element metaLinksRoot = rootElem.getChild("metadataLinks"); + final List metaLinks = metaLinksRoot.getChildren(); + if (metaLinks != null) { + metaLinksList = new ArrayList>(metaLinks.size()); + for (Element metaLink : metaLinks) { + Map metaLinkMap = new HashMap(); + metaLinksList.add(metaLinkMap); + for (ResourceMetadataLinkInfo rmd : ResourceMetadataLinkInfo.values()) { + String key = rmd.toString(); + metaLinkMap.put(rmd, metaLink.getChildText(key)); + } + } + } + return metaLinksList; + } + + + /** + * + * @author Emmanuel Blondel + * + * @return the list of GSMetadataLinkEncoder + */ + public List getEncodedMetadataLinkInfoList() { + List metaLinksList = null; + + final Element metaLinksRoot = rootElem.getChild("metadataLinks"); + final List metaLinks = metaLinksRoot.getChildren(); + if (metaLinks != null) { + metaLinksList = new ArrayList(metaLinks.size()); + for (Element metaLink : metaLinks) { + final GSMetadataLinkInfoEncoder metaLinkEnc = new GSMetadataLinkInfoEncoder(); + for (ResourceMetadataLinkInfo rmd : ResourceMetadataLinkInfo.values()) { + String key = rmd.toString(); + metaLinkEnc.setMetadataLinkInfoMember(rmd, metaLink.getChildText(key)); //change + } + metaLinksList.add(metaLinkEnc); + } + + } + return metaLinksList; + } + + // /** // * @return the list of available attribute names // */ 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 92cb5a7..2e180a2 100644 --- a/src/main/java/it/geosolutions/geoserver/rest/encoder/GSResourceEncoder.java +++ b/src/main/java/it/geosolutions/geoserver/rest/encoder/GSResourceEncoder.java @@ -29,6 +29,7 @@ import it.geosolutions.geoserver.rest.encoder.coverage.GSCoverageEncoder; import it.geosolutions.geoserver.rest.encoder.feature.GSFeatureTypeEncoder; import it.geosolutions.geoserver.rest.encoder.metadata.GSDimensionInfoEncoder; import it.geosolutions.geoserver.rest.encoder.metadata.GSFeatureDimensionInfoEncoder; +import it.geosolutions.geoserver.rest.encoder.metadatalink.GSMetadataLinkInfoEncoder; import it.geosolutions.geoserver.rest.encoder.utils.ElementUtils; import it.geosolutions.geoserver.rest.encoder.utils.NestedElementEncoder; import it.geosolutions.geoserver.rest.encoder.utils.PropertyXMLEncoder; @@ -46,15 +47,18 @@ 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 */ public abstract class GSResourceEncoder extends PropertyXMLEncoder { public final static String NAME = "name"; public final static String METADATA="metadata"; public final static String KEYWORDS="keywords"; + public final static String METADATALINKS="metadataLinks"; 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() { @@ -75,6 +79,7 @@ public abstract class GSResourceEncoder // Link members to the parent addContent(metadata.getRoot()); addContent(keywordsListEncoder); + addContent(metadataLinksListEncoder); } public void setEnabled(boolean enabled) { @@ -136,6 +141,46 @@ public abstract class GSResourceEncoder })).size() == 0 ? false : true; } + + /** + * @param MetadataLink the metadataLink to add + * + * @author Emmanuel Blondel + */ + public void addMetadataLinkInfo(GSMetadataLinkInfoEncoder metadataLinkInfo) { + metadataLinksListEncoder.addContent(metadataLinkInfo.getRoot()); + } + + + /** Quick MetadataLinkInfo set-up + * + * @author Emmanuel Blondel + * + * @param type + * @param metadataType + * @param content + */ + public void addMetadataLinkInfo(String type, String metadataType, String content){ + final GSMetadataLinkInfoEncoder mde = new GSMetadataLinkInfoEncoder(); + mde.setup(type, metadataType, content); + metadataLinksListEncoder.addContent(mde.getRoot()); + } + + + /** + * delete 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; + } + + /** * Reprojection policy for a published layer. One of: *
    diff --git a/src/main/java/it/geosolutions/geoserver/rest/encoder/metadatalink/GSMetadataLinkInfoEncoder.java b/src/main/java/it/geosolutions/geoserver/rest/encoder/metadatalink/GSMetadataLinkInfoEncoder.java new file mode 100644 index 0000000..65de75b --- /dev/null +++ b/src/main/java/it/geosolutions/geoserver/rest/encoder/metadatalink/GSMetadataLinkInfoEncoder.java @@ -0,0 +1,107 @@ +/* + * 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.metadatalink; + +import java.util.Map; +import java.util.Map.Entry; + +import org.jdom.Element; +import org.jdom.filter.Filter; + +import it.geosolutions.geoserver.rest.encoder.utils.ElementUtils; +import it.geosolutions.geoserver.rest.encoder.utils.PropertyXMLEncoder; + +/** GSMetadataLinkEncoder + * + * @author Emmanuel Blondel - emmanuel.blondel1@gmail.com | emmanuel.blondel@fao.org + * + */ +public class GSMetadataLinkInfoEncoder extends PropertyXMLEncoder { + + public 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(ResourceMetadataLinkInfo.content.toString()); + if (el!=null && el.getTextTrim().equals(key)) { + return true; + } + return false; + } + } + + public static Filter getFilterByContent(String content){ + return new filterByContent(content); + } + + + public GSMetadataLinkInfoEncoder() { + super("metadataLink"); + } + + /** quick MetadataLinkInfo set-up + * + * @param type + * @param metadataType + * @param content + */ + public void setup(String type, String metadataType, String content){ + set(ResourceMetadataLinkInfo.type.name(), type); + set(ResourceMetadataLinkInfo.metadataType.name(), metadataType); + set(ResourceMetadataLinkInfo.content.name(), content); + } + + public void setup(Map metadataLinkInfos){ + for (Entry mdLinkInfo:metadataLinkInfos.entrySet()){ + set(mdLinkInfo.getKey().toString(),mdLinkInfo.getValue()); + } + } + + public void setMetadataLinkInfoMember(ResourceMetadataLinkInfo type, String value){ + set(type.toString(),value); + } + + + public boolean delMetadataLinkInfoMember(ResourceMetadataLinkInfo type){ + return ElementUtils.remove(this.getRoot(), get(type.toString())); + } + + + public String getMetadataLinkInfoMember(ResourceMetadataLinkInfo type){ + Element el = get(type.toString()); + if (el!=null) + return el.getTextTrim(); + else + return null; + } + +} diff --git a/src/main/java/it/geosolutions/geoserver/rest/encoder/metadatalink/ResourceMetadataLinkInfo.java b/src/main/java/it/geosolutions/geoserver/rest/encoder/metadatalink/ResourceMetadataLinkInfo.java new file mode 100644 index 0000000..91c21e2 --- /dev/null +++ b/src/main/java/it/geosolutions/geoserver/rest/encoder/metadatalink/ResourceMetadataLinkInfo.java @@ -0,0 +1,36 @@ +/* + * 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.metadatalink; + +/** + * Enumeration of featureType metadataLink member + * + * @author Emmanuel Blondel - emmanuel.blondel1@gmail.com | emmanuel.blondel@fao.org + * + */ +public enum ResourceMetadataLinkInfo { + type, metadataType, content + +} From 7fee169369307766207007a5ba2fbbb945272419 Mon Sep 17 00:00:00 2001 From: eblondel Date: Sat, 6 Apr 2013 15:36:17 +0200 Subject: [PATCH 2/3] MetadataLink support - add tests --- .../decoder/MetadataDecoderTest.java | 30 ++++++++--- .../encoder/feature/GSFeatureEncoderTest.java | 14 +++++ .../GSMetadataLinkInfoEncoderTest.java | 53 +++++++++++++++++++ .../resources/testdata/coverageExample.xml | 12 +++++ 4 files changed, 103 insertions(+), 6 deletions(-) create mode 100644 src/test/java/it/geosolutions/geoserver/rest/encoder/metadatalink/GSMetadataLinkInfoEncoderTest.java diff --git a/src/test/java/it/geosolutions/geoserver/decoder/MetadataDecoderTest.java b/src/test/java/it/geosolutions/geoserver/decoder/MetadataDecoderTest.java index 39a46f2..a259360 100644 --- a/src/test/java/it/geosolutions/geoserver/decoder/MetadataDecoderTest.java +++ b/src/test/java/it/geosolutions/geoserver/decoder/MetadataDecoderTest.java @@ -23,6 +23,8 @@ package it.geosolutions.geoserver.decoder; import it.geosolutions.geoserver.rest.decoder.RESTCoverage; import it.geosolutions.geoserver.rest.decoder.RESTDimensionInfo; +import it.geosolutions.geoserver.rest.encoder.metadatalink.GSMetadataLinkInfoEncoder; +import it.geosolutions.geoserver.rest.encoder.metadatalink.ResourceMetadataLinkInfo; import java.io.File; import java.io.IOException; @@ -35,6 +37,7 @@ import org.springframework.core.io.ClassPathResource; /** * @author DamianoG + * @author eblondel * */ public class MetadataDecoderTest { @@ -64,11 +67,26 @@ public class MetadataDecoderTest { Assert.assertEquals(el.getKey(),"elevation"); Assert.assertEquals(el.isEnabled(),true); } - } - - - - - + } } + + @Test + public void testMetadataLinkInfo() throws IOException{ + File coverageFile = new ClassPathResource("testdata/coverageExample.xml").getFile(); + String coverageString = FileUtils.readFileToString(coverageFile); + RESTCoverage coverage = RESTCoverage.build(coverageString); + + List list = coverage.getEncodedMetadataLinkInfoList(); + + GSMetadataLinkInfoEncoder metadataLinkInfo1 = list.get(0); + Assert.assertEquals(metadataLinkInfo1.getMetadataLinkInfoMember(ResourceMetadataLinkInfo.type),"text/xml"); + Assert.assertEquals(metadataLinkInfo1.getMetadataLinkInfoMember(ResourceMetadataLinkInfo.metadataType),"ISO19115:2003"); + Assert.assertEquals(metadataLinkInfo1.getMetadataLinkInfoMember(ResourceMetadataLinkInfo.content),"http://www.organization.org/metadata1"); + + GSMetadataLinkInfoEncoder metadataLinkInfo2 = list.get(1); + Assert.assertEquals(metadataLinkInfo2.getMetadataLinkInfoMember(ResourceMetadataLinkInfo.type),"text/html"); + Assert.assertEquals(metadataLinkInfo2.getMetadataLinkInfoMember(ResourceMetadataLinkInfo.metadataType),"ISO19115:2003"); + Assert.assertEquals(metadataLinkInfo2.getMetadataLinkInfoMember(ResourceMetadataLinkInfo.content),"http://www.organization.org/metadata2"); + + } } 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 9372f9e..4703fb1 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.metadata.GSDimensionInfoEncoder; import it.geosolutions.geoserver.rest.encoder.metadata.GSDimensionInfoEncoder.Presentation; import it.geosolutions.geoserver.rest.encoder.metadata.GSDimensionInfoEncoder.PresentationDiscrete; import it.geosolutions.geoserver.rest.encoder.metadata.GSFeatureDimensionInfoEncoder; +import it.geosolutions.geoserver.rest.encoder.metadatalink.GSMetadataLinkInfoEncoder; import it.geosolutions.geoserver.rest.encoder.utils.ElementUtils; import it.geosolutions.geoserver.rest.publisher.GeoserverRESTPublisherTest; @@ -71,6 +72,11 @@ public class GSFeatureEncoderTest extends GeoserverRESTPublisherTest { fte.setDescription("desc"); fte.setEnabled(true); + //metadataLink + GSMetadataLinkInfoEncoder metadatalink = new GSMetadataLinkInfoEncoder(); + metadatalink.setup("text/xml", "ISO19115:2003","http://www.organization.org/metadata1"); + fte.addMetadataLinkInfo(metadatalink); + GSLayerEncoder layerEncoder = new GSLayerEncoder(); layerEncoder.setEnabled(true); layerEncoder.setQueryable(true); @@ -187,6 +193,14 @@ public class GSFeatureEncoderTest extends GeoserverRESTPublisherTest { Assert.assertTrue(encoder.delKeyword("KEYWORD_2")); Assert.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"); + + Assert.assertTrue(encoder.delMetadataLinkInfo("http://www.organization.org/metadata2")); + Assert.assertFalse(encoder.delMetadataLinkInfo("http://www.organization.org/metadata3")); + + //dimensions final GSFeatureDimensionInfoEncoder elevationDimension = new GSFeatureDimensionInfoEncoder( "elevation_field"); diff --git a/src/test/java/it/geosolutions/geoserver/rest/encoder/metadatalink/GSMetadataLinkInfoEncoderTest.java b/src/test/java/it/geosolutions/geoserver/rest/encoder/metadatalink/GSMetadataLinkInfoEncoderTest.java new file mode 100644 index 0000000..97de7fd --- /dev/null +++ b/src/test/java/it/geosolutions/geoserver/rest/encoder/metadatalink/GSMetadataLinkInfoEncoderTest.java @@ -0,0 +1,53 @@ +/* + * 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.metadatalink; + +import junit.framework.Assert; + +import org.junit.Test; + +/** +* +* @author eblondel +* +*/ +public class GSMetadataLinkInfoEncoderTest { + + @Test + public void metadataLinkInfoTest(){ + GSMetadataLinkInfoEncoder encoder = new GSMetadataLinkInfoEncoder(); + encoder.setup("text/xml", "ISO19115:2003","http://www.organization.org/metadata1"); + + Assert.assertEquals("text/xml", encoder.getMetadataLinkInfoMember(ResourceMetadataLinkInfo.type)); + Assert.assertEquals("ISO19115:2003", encoder.getMetadataLinkInfoMember(ResourceMetadataLinkInfo.metadataType)); + Assert.assertEquals("http://www.organization.org/metadata1", encoder.getMetadataLinkInfoMember(ResourceMetadataLinkInfo.content)); + + Assert.assertTrue(encoder.delMetadataLinkInfoMember(ResourceMetadataLinkInfo.content)); + Assert.assertNull(encoder.getMetadataLinkInfoMember(ResourceMetadataLinkInfo.content)); + + encoder.setMetadataLinkInfoMember(ResourceMetadataLinkInfo.type, "text/html"); + encoder.setMetadataLinkInfoMember(ResourceMetadataLinkInfo.metadataType, "FGDC"); + encoder.setMetadataLinkInfoMember(ResourceMetadataLinkInfo.content, "http://www.organization.org/metadata2"); + Assert.assertEquals("text/html", encoder.getMetadataLinkInfoMember(ResourceMetadataLinkInfo.type)); + Assert.assertEquals("FGDC", encoder.getMetadataLinkInfoMember(ResourceMetadataLinkInfo.metadataType)); + Assert.assertEquals("http://www.organization.org/metadata2", encoder.getMetadataLinkInfoMember(ResourceMetadataLinkInfo.content)); + + } +} \ No newline at end of file diff --git a/src/test/resources/testdata/coverageExample.xml b/src/test/resources/testdata/coverageExample.xml index 1e41f79..4230091 100644 --- a/src/test/resources/testdata/coverageExample.xml +++ b/src/test/resources/testdata/coverageExample.xml @@ -7,6 +7,18 @@ granuleTestMosaic + + + 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"]], From 4aeac4d080fbb951e4e6041edfcdc583e658af4f Mon Sep 17 00:00:00 2001 From: eblondel Date: Wed, 10 Apr 2013 14:51:27 +0200 Subject: [PATCH 3/3] MetadataLink support - enrich javadoc & format code/comments --- .../geoserver/rest/decoder/RESTResource.java | 104 +++++------ .../rest/encoder/GSResourceEncoder.java | 65 +++---- .../GSMetadataLinkInfoEncoder.java | 161 ++++++++++++------ .../ResourceMetadataLinkInfo.java | 3 +- 4 files changed, 199 insertions(+), 134 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 5c78d3f..23c3f8b 100644 --- a/src/main/java/it/geosolutions/geoserver/rest/decoder/RESTResource.java +++ b/src/main/java/it/geosolutions/geoserver/rest/decoder/RESTResource.java @@ -43,7 +43,8 @@ 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 */ public class RESTResource { protected final Element rootElem; @@ -159,58 +160,63 @@ public class RESTResource { - /** - * - * @author Emmanuel Blondel - * - * @return the list of metadataLinkInfo - */ - public List> getMetadataLinkInfoList() { - List> metaLinksList = null; + /** + * Decodes the list of MetadataLinkInfo from the GeoServer Resource + * + * @author Emmanuel Blondel + * + * @return the list of Map + */ + public List> getMetadataLinkInfoList() { + List> metaLinksList = null; - final Element metaLinksRoot = rootElem.getChild("metadataLinks"); - final List metaLinks = metaLinksRoot.getChildren(); - if (metaLinks != null) { - metaLinksList = new ArrayList>(metaLinks.size()); - for (Element metaLink : metaLinks) { - Map metaLinkMap = new HashMap(); - metaLinksList.add(metaLinkMap); - for (ResourceMetadataLinkInfo rmd : ResourceMetadataLinkInfo.values()) { - String key = rmd.toString(); - metaLinkMap.put(rmd, metaLink.getChildText(key)); - } - } - } - return metaLinksList; - } + final Element metaLinksRoot = rootElem.getChild("metadataLinks"); + final List metaLinks = metaLinksRoot.getChildren(); + if (metaLinks != null) { + metaLinksList = new ArrayList>( + metaLinks.size()); + for (Element metaLink : metaLinks) { + Map metaLinkMap = new HashMap(); + metaLinksList.add(metaLinkMap); + for (ResourceMetadataLinkInfo rmd : ResourceMetadataLinkInfo + .values()) { + String key = rmd.toString(); + metaLinkMap.put(rmd, metaLink.getChildText(key)); + } + } + } + return metaLinksList; + } - - /** - * - * @author Emmanuel Blondel - * - * @return the list of GSMetadataLinkEncoder - */ - public List getEncodedMetadataLinkInfoList() { - List metaLinksList = null; + /** + * Decodes the list of MetadataLinkInfo from the GeoServer Resource + * + * @author Emmanuel Blondel + * + * @return the list of GSMetadataLinkEncoder + */ + public List getEncodedMetadataLinkInfoList() { + List metaLinksList = null; - final Element metaLinksRoot = rootElem.getChild("metadataLinks"); - final List metaLinks = metaLinksRoot.getChildren(); - if (metaLinks != null) { - metaLinksList = new ArrayList(metaLinks.size()); - for (Element metaLink : metaLinks) { - final GSMetadataLinkInfoEncoder metaLinkEnc = new GSMetadataLinkInfoEncoder(); - for (ResourceMetadataLinkInfo rmd : ResourceMetadataLinkInfo.values()) { - String key = rmd.toString(); - metaLinkEnc.setMetadataLinkInfoMember(rmd, metaLink.getChildText(key)); //change - } - metaLinksList.add(metaLinkEnc); - } + final Element metaLinksRoot = rootElem.getChild("metadataLinks"); + final List metaLinks = metaLinksRoot.getChildren(); + if (metaLinks != null) { + metaLinksList = new ArrayList( + metaLinks.size()); + for (Element metaLink : metaLinks) { + final GSMetadataLinkInfoEncoder metaLinkEnc = new GSMetadataLinkInfoEncoder(); + for (ResourceMetadataLinkInfo rmd : ResourceMetadataLinkInfo + .values()) { + String key = rmd.toString(); + metaLinkEnc.setMetadataLinkInfoMember(rmd, + metaLink.getChildText(key)); // change + } + metaLinksList.add(metaLinkEnc); + } - } - return metaLinksList; - } - + } + return metaLinksList; + } // /** // * @return the list of available attribute names 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 2e180a2..7a801f3 100644 --- a/src/main/java/it/geosolutions/geoserver/rest/encoder/GSResourceEncoder.java +++ b/src/main/java/it/geosolutions/geoserver/rest/encoder/GSResourceEncoder.java @@ -47,7 +47,8 @@ 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 */ public abstract class GSResourceEncoder extends PropertyXMLEncoder { @@ -86,10 +87,6 @@ public abstract class GSResourceEncoder set("enabled", (enabled) ? "true" : "false"); } - // TODO MetadataLink -// public void setMetadata(String key, String url){ -// metadata.set(key, url); -// } /** * @param key @@ -141,34 +138,36 @@ public abstract class GSResourceEncoder })).size() == 0 ? false : true; } - /** - * @param MetadataLink the metadataLink to add - * - * @author Emmanuel Blondel - */ - public void addMetadataLinkInfo(GSMetadataLinkInfoEncoder metadataLinkInfo) { - metadataLinksListEncoder.addContent(metadataLinkInfo.getRoot()); - } - - - /** Quick MetadataLinkInfo set-up - * - * @author Emmanuel Blondel - * - * @param type - * @param metadataType - * @param content - */ - public void addMetadataLinkInfo(String type, String metadataType, String content){ - final GSMetadataLinkInfoEncoder mde = new GSMetadataLinkInfoEncoder(); - mde.setup(type, metadataType, content); - metadataLinksListEncoder.addContent(mde.getRoot()); - } + * Adds a MetadataLinkInfo to the GeoServer Resource + * + * @param MetadataLink + * + * @author Emmanuel Blondel + */ + 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(); + mde.setup(type, metadataType, content); + metadataLinksListEncoder.addContent(mde.getRoot()); + } - /** - * delete a metadataLinkInfo from the list using the metadataURL (MetadataLinkInfo content) + /** + * Deletes a metadataLinkInfo from the list using the metadataURL + * (MetadataLinkInfo content) * * @author Emmanuel Blondel * @@ -176,8 +175,10 @@ public abstract class GSResourceEncoder * @return true if something is removed, false otherwise */ public boolean delMetadataLinkInfo(final String metadataURL) { - return (metadataLinksListEncoder.removeContent(GSMetadataLinkInfoEncoder.getFilterByContent(metadataURL))).size() == 0 ? false - : true; + return (metadataLinksListEncoder + .removeContent(GSMetadataLinkInfoEncoder + .getFilterByContent(metadataURL))).size() == 0 ? false + : true; } diff --git a/src/main/java/it/geosolutions/geoserver/rest/encoder/metadatalink/GSMetadataLinkInfoEncoder.java b/src/main/java/it/geosolutions/geoserver/rest/encoder/metadatalink/GSMetadataLinkInfoEncoder.java index 65de75b..8ad2c4b 100644 --- a/src/main/java/it/geosolutions/geoserver/rest/encoder/metadatalink/GSMetadataLinkInfoEncoder.java +++ b/src/main/java/it/geosolutions/geoserver/rest/encoder/metadatalink/GSMetadataLinkInfoEncoder.java @@ -33,75 +33,132 @@ import org.jdom.filter.Filter; import it.geosolutions.geoserver.rest.encoder.utils.ElementUtils; import it.geosolutions.geoserver.rest.encoder.utils.PropertyXMLEncoder; -/** GSMetadataLinkEncoder +/** + * GSMetadataLinkEncoder - encodes a metadataLink for a given GeoServer Resource + * (feature type /coverage), as follows: + *
    + * {@code
    + * final GSMetadataLinkInfoEncoder mde = new GSMetadataLinkInfoEncoder();
    + * mde.setup("text/xml", "ISO19115:2003","http://www.organization.org/metadata");
    + * }
    + * 
    + * For this example, the XML output is: + *
    + * {@code
    + * 
    + * 	text/xml
    + * 	ISO19115:2003
    + * 	http://www.organization.org/metadata
    + * 
    + * }
    + * 
    + * + * @author Emmanuel Blondel - emmanuel.blondel1@gmail.com | + * emmanuel.blondel@fao.org * - * @author Emmanuel Blondel - emmanuel.blondel1@gmail.com | emmanuel.blondel@fao.org - * */ public class GSMetadataLinkInfoEncoder extends PropertyXMLEncoder { - - public 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(ResourceMetadataLinkInfo.content.toString()); - if (el!=null && el.getTextTrim().equals(key)) { - return true; - } - return false; - } - } - - public static Filter getFilterByContent(String content){ - return new filterByContent(content); - } - - - public GSMetadataLinkInfoEncoder() { - super("metadataLink"); + /** A class to filter the MetadataLinkInfo by content + * + * + */ + public 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(ResourceMetadataLinkInfo.content.toString()); + if (el != null && el.getTextTrim().equals(key)) { + return true; + } + return false; + } } - /** quick MetadataLinkInfo set-up + /** + * Get a Filter using the MetadataLinkInfo content (metadataURL) + * + * @param content + * @return the filter + */ + public static Filter getFilterByContent(String content) { + return new filterByContent(content); + } + + /** + * Constructs a new GSMetadataLinkInfoEncoder + * + */ + public GSMetadataLinkInfoEncoder() { + super("metadataLink"); + } + + /** + * Set-up quickly a metadataLinkInfo * * @param type * @param metadataType * @param content */ - public void setup(String type, String metadataType, String content){ + public void setup(String type, String metadataType, String content) { set(ResourceMetadataLinkInfo.type.name(), type); set(ResourceMetadataLinkInfo.metadataType.name(), metadataType); set(ResourceMetadataLinkInfo.content.name(), content); } - - public void setup(Map metadataLinkInfos){ - for (Entry mdLinkInfo:metadataLinkInfos.entrySet()){ - set(mdLinkInfo.getKey().toString(),mdLinkInfo.getValue()); - } + + /** + * Set-up a metadataLinkInfo + * + * @param metadataLinkInfos + */ + public void setup(Map metadataLinkInfos) { + for (Entry mdLinkInfo : metadataLinkInfos + .entrySet()) { + set(mdLinkInfo.getKey().toString(), mdLinkInfo.getValue()); + } } - public void setMetadataLinkInfoMember(ResourceMetadataLinkInfo type, String value){ - set(type.toString(),value); - } - + /** + * Set a MetadataLinkInfo member (type, metadataType or content) + * + * @param type + * @param value + */ + public void setMetadataLinkInfoMember(ResourceMetadataLinkInfo type, + String value) { + set(type.toString(), value); + } - public boolean delMetadataLinkInfoMember(ResourceMetadataLinkInfo type){ - return ElementUtils.remove(this.getRoot(), get(type.toString())); - } - + /** + * Deletes a MetadataLinkInfo member + * + * @param type + * @return true if the metadataLinkInfo member is removed + */ + public boolean delMetadataLinkInfoMember(ResourceMetadataLinkInfo type) { + return ElementUtils.remove(this.getRoot(), get(type.toString())); + } + + /** + * Get the value of the MetadataLinkInfo member + * + * @param type + * @return the value of the MetadataLinkInfo member + */ + public String getMetadataLinkInfoMember(ResourceMetadataLinkInfo type) { + Element el = get(type.toString()); + if (el != null) + return el.getTextTrim(); + else + return null; + } - public String getMetadataLinkInfoMember(ResourceMetadataLinkInfo type){ - Element el = get(type.toString()); - if (el!=null) - return el.getTextTrim(); - else - return null; - } - } diff --git a/src/main/java/it/geosolutions/geoserver/rest/encoder/metadatalink/ResourceMetadataLinkInfo.java b/src/main/java/it/geosolutions/geoserver/rest/encoder/metadatalink/ResourceMetadataLinkInfo.java index 91c21e2..d71c91c 100644 --- a/src/main/java/it/geosolutions/geoserver/rest/encoder/metadatalink/ResourceMetadataLinkInfo.java +++ b/src/main/java/it/geosolutions/geoserver/rest/encoder/metadatalink/ResourceMetadataLinkInfo.java @@ -27,7 +27,8 @@ package it.geosolutions.geoserver.rest.encoder.metadatalink; /** * Enumeration of featureType metadataLink member * - * @author Emmanuel Blondel - emmanuel.blondel1@gmail.com | emmanuel.blondel@fao.org + * @author Emmanuel Blondel - emmanuel.blondel1@gmail.com | + * emmanuel.blondel@fao.org * */ public enum ResourceMetadataLinkInfo {