Skip to content

Commit

Permalink
[GEOS-7519] Keywords & Identifier for LayerGroups
Browse files Browse the repository at this point in the history
  • Loading branch information
Nuno Oliveira committed Jun 15, 2017
1 parent e1c38bb commit b772809
Show file tree
Hide file tree
Showing 18 changed files with 281 additions and 30 deletions.
14 changes: 14 additions & 0 deletions doc/en/api/1.0.0/layergroups.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -132,6 +132,10 @@ paths:
<metadata>
<entry key="rawStyleList"></entry>
</metadata>
<keywords>
<keyword>keyword1\@language=en\;\@vocabulary=vocabulary1\;</keyword>
<keyword>keyword2\@language=pt\;\@vocabulary=vocabulary2\;</keyword>
</keywords>
</layerGroup>
application/json: |
Expand Down Expand Up @@ -486,6 +490,16 @@ definitions:
crs:
type: string
description: CRS code, usually in the form EPSG:####
keywords:
type: object
description: A collection of keywords associated with the resource.
properties:
keyword:
type: array
description: List of keyword values with internationalization and vocabulary
items:
type: string
description: A single keyword value

LayergroupPublished:
type: object
Expand Down
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
11 changes: 11 additions & 0 deletions doc/en/user/source/data/webadmin/layergroups.rst
Original file line number Diff line number Diff line change
Expand Up @@ -112,3 +112,14 @@ To remove a layer group, select it by clicking the checkbox next to the layer gr
.. figure:: img/data_layergroups_delete.png

Removing a layer group

Layer Group Keywords
--------------------

Is possible to associate a layer group with some keywords that will be used to assist catalog searching.

.. figure:: img/data_layergroups_keywords.png

Layer groups keywords editor

Layer groups keywords will no be merged with contained layers keywords but keywords of a layer group should be logically inherited by contained layers.
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ protected void onSetUp(SystemTestData testData) throws Exception {
id_forestsandstreams = addLayerGroup(NAME_FORESTSANDSTREAMS,
getCatalog().getLayerByName("Forests"),
getCatalog().getLayerByName("Streams") );
addKeywordsToLayerGroup(NAME_FORESTSANDSTREAMS);
id_buildingsandbridges = addLayerGroup(NAME_BUILDINGSANDBRIDGES,
getCatalog().getLayerByName("Buildings"),
getCatalog().getLayerByName("Bridges") );
Expand All @@ -56,8 +57,11 @@ public void testRecords() throws Exception {


assertXpathExists("//csw:Record[dc:title='"+ NAME_BUILDINGSANDBRIDGES + "']", d);
assertXpathExists("//csw:Record[dc:title='"+ NAME_FORESTSANDSTREAMS + "']", d);

assertXpathExists("//csw:Record[dc:title='"+ NAME_FORESTSANDSTREAMS + "']", d);

// check that layer groups keywords were encoded
assertXpathExists("//csw:Record[dc:subject='keyword1']", d);
assertXpathExists("//csw:Record[dc:subject='keyword2']", d);
}

@Test
Expand All @@ -82,5 +86,4 @@ public void testRecordSortedAndPaged() throws Exception {
assertXpathExists("//csw:SummaryRecord[dc:title='"+ NAME_BUILDINGSANDBRIDGES + "']", d);
assertXpathExists("//csw:SummaryRecord[dc:title='Buildings']", d);
}

}
10 changes: 10 additions & 0 deletions src/main/src/main/java/org/geoserver/catalog/LayerGroupInfo.java
Original file line number Diff line number Diff line change
Expand Up @@ -197,6 +197,16 @@ public Integer getCode() {
*/
List<MetadataLinkInfo> getMetadataLinks();

/**
* Return the keywords associated with this layer group. If no keywords are available
* an empty list should be returned.
*
* @return a non NULL list containing the keywords associated with this layer group
*/
default List<KeywordInfo> getKeywords() {
return new ArrayList<>();
}

/**
* A way to compare two LayerGroupInfo instances that works around all the wrappers we have
* around (secured, decorating ecc) all changing some aspects of the bean and breaking
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import org.geoserver.catalog.AttributionInfo;
import org.geoserver.catalog.AuthorityURLInfo;
import org.geoserver.catalog.CatalogVisitor;
import org.geoserver.catalog.KeywordInfo;
import org.geoserver.catalog.LayerGroupHelper;
import org.geoserver.catalog.LayerGroupInfo;
import org.geoserver.catalog.LayerIdentifierInfo;
Expand Down Expand Up @@ -75,9 +76,24 @@ public class LayerGroupInfoImpl implements LayerGroupInfo {
* @since 2.1.3
*/
protected List<LayerIdentifierInfo> identifiers = new ArrayList<LayerIdentifierInfo>(2);




private List<KeywordInfo> keywords = new ArrayList<>();

@Override
public List<KeywordInfo> getKeywords() {
return keywords;
}

/**
* Set the keywords of this layer group. The provided keywords will override any existing
* keywords no merge will be done.
*
* @param keywords new keywords of this layer group
*/
public void setKeywords(List<KeywordInfo> keywords) {
this.keywords = keywords == null ? new ArrayList<>() : keywords;
}

public LayerGroupInfoImpl() {
mode = Mode.SINGLE;
publishables = new ArrayList<PublishedInfo>();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -450,6 +450,7 @@ protected void init(XStream xs) {
xs.registerLocalConverter(impl(LayerGroupInfo.class), "publishables", new ReferenceCollectionConverter( PublishedInfo.class, LayerInfo.class, LayerGroupInfo.class ));
xs.registerLocalConverter(impl(LayerGroupInfo.class), "styles", new ReferenceCollectionConverter( StyleInfo.class ));
xs.registerLocalConverter(impl(LayerGroupInfo.class), "metadata", new MetadataMapConverter() );
xs.registerLocalConverter(impl(LayerGroupInfo.class), "keywords", new KeywordListConverter());

//ReferencedEnvelope
xs.registerLocalConverter( ReferencedEnvelope.class, "crs", new SRSConverter() );
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import org.geoserver.catalog.AttributionInfo;
import org.geoserver.catalog.AuthorityURLInfo;
import org.geoserver.catalog.CatalogVisitor;
import org.geoserver.catalog.KeywordInfo;
import org.geoserver.catalog.LayerGroupHelper;
import org.geoserver.catalog.LayerGroupInfo;
import org.geoserver.catalog.LayerIdentifierInfo;
Expand Down Expand Up @@ -217,4 +218,9 @@ public boolean equals(Object obj) {
public int hashCode() {
return LayerGroupInfo.hashCode(this);
}

@Override
public List<KeywordInfo> getKeywords() {
return delegate.getKeywords();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,8 @@
import org.geoserver.catalog.CascadeDeleteVisitor;
import org.geoserver.catalog.Catalog;
import org.geoserver.catalog.FeatureTypeInfo;
import org.geoserver.catalog.Keyword;
import org.geoserver.catalog.KeywordInfo;
import org.geoserver.catalog.LayerGroupInfo;
import org.geoserver.catalog.LayerInfo;
import org.geoserver.catalog.NamespaceInfo;
Expand Down Expand Up @@ -2109,4 +2111,31 @@ public int readLine(byte[] b, int offset, int length){
return i;
}
}

/**
* Helper method that adds some tests keywords to a layer group.
* The provided layer group name should not be NULL, if the layer
* group cannot be found an exception will be throw.
*/
protected void addKeywordsToLayerGroup(String layerGroupName) {
// create a list of keywords
List<KeywordInfo> keywords = new ArrayList<>();
Keyword keyword1 = new Keyword("keyword1");
keyword1.setLanguage("en");
keyword1.setVocabulary("vocabulary1");
keywords.add(keyword1);
Keyword keyword2 = new Keyword("keyword2");
keyword2.setLanguage("pt");
keyword2.setVocabulary("vocabulary2");
keywords.add(keyword2);
// add keywords to a layer group
LayerGroupInfo layerGroup = getCatalog().getLayerGroupByName(layerGroupName);
if (layerGroup == null) {
// targeted layer group doesn't exists
throw new RuntimeException(String.format(
"Layer group '%s' doesn't exists.", layerGroupName));
}
layerGroup.getKeywords().addAll(keywords);
getCatalog().save(layerGroup);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,20 @@
import static org.custommonkey.xmlunit.XMLAssert.assertXpathExists;
import static org.hamcrest.Matchers.endsWith;
import static org.hamcrest.Matchers.equalTo;
import static org.junit.Assert.*;
import static org.hamcrest.Matchers.containsInAnyOrder;
import static org.hamcrest.Matchers.is;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;

import net.sf.json.JSON;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import org.geoserver.catalog.Catalog;
import org.geoserver.catalog.Keyword;
import org.geoserver.catalog.LayerGroupInfo;
import org.geoserver.catalog.PublishedInfo;
import org.geoserver.catalog.StyleInfo;
Expand All @@ -23,10 +31,10 @@
import org.geotools.referencing.CRS;
import org.junit.Before;
import org.junit.Test;
import org.w3c.dom.Document;

import org.springframework.mock.web.MockHttpServletResponse;
import org.w3c.dom.Document;

import java.util.ArrayList;
import java.util.List;

public class LayerGroupControllerTest extends CatalogRESTTestSupport {
Expand Down Expand Up @@ -68,7 +76,11 @@ public void revertChanges() throws Exception {
styles.add(null);

lg2.setBounds(new ReferencedEnvelope(-180, -90, 180, 90, CRS.decode("EPSG:4326")));

catalog.add(lg2);

// add some keywords to the CITE layer group
addKeywordsToLayerGroup("citeLayerGroup");
}

@Test
Expand Down Expand Up @@ -138,6 +150,11 @@ public void testGetAsXML() throws Exception {
assertXpathEvaluatesTo("citeLayerGroup", "/layerGroup/name", dom );
assertXpathEvaluatesTo( "6", "count(//published)", dom );
assertXpathEvaluatesTo( "6", "count(//style)", dom );
assertXpathEvaluatesTo( "2", "count(//layerGroup/keywords/string)", dom );
assertXpathEvaluatesTo( "1", "count(//layerGroup/keywords[string='keyword1\\@language=en\\;\\@vocabulary=vocabulary1\\;'])", dom );
assertXpathEvaluatesTo( "1", "count(//layerGroup/keywords[string='keyword2\\@language=pt\\;\\@vocabulary=vocabulary2\\;'])", dom );
// check keywords were encoded

}

@Test
Expand Down Expand Up @@ -165,10 +182,23 @@ public void testGetAsJSON() throws Exception {

print(get(RestBaseController.ROOT_PATH + "/layergroups/citeLayerGroup.json"));
json = getAsJSON( RestBaseController.ROOT_PATH + "/layergroups/citeLayerGroup.json");
arr = ((JSONObject)json).getJSONObject("layerGroup").getJSONObject("publishables").getJSONArray("published");
JSONObject layerGroup = ((JSONObject) json).getJSONObject("layerGroup");
arr = layerGroup.getJSONObject("publishables").getJSONArray("published");
assertEquals(6, arr.size());
arr = ((JSONObject)json).getJSONObject("layerGroup").getJSONObject("styles").getJSONArray("style");
arr = layerGroup.getJSONObject("styles").getJSONArray("style");
assertEquals(6, arr.size());
// check keywords were correctly encoded
assertThat(layerGroup.containsKey("keywords"), is(true));
JSONObject keywordsObject = layerGroup.getJSONObject("keywords");
assertThat(keywordsObject.containsKey("string"), is(true));
JSONArray keywords = keywordsObject.getJSONArray("string");
assertThat(keywords.size(), is(2));
// created a list of keywords so we can check is content with hamcrest
List<Object> keywordsList = new ArrayList<>();
keywordsList.addAll(keywords);
assertThat(keywordsList, containsInAnyOrder(
"keyword1\\@language=en\\;\\@vocabulary=vocabulary1\\;",
"keyword2\\@language=pt\\;\\@vocabulary=vocabulary2\\;"));
}


Expand Down Expand Up @@ -297,19 +327,21 @@ public void testGetFromWorkspace() throws Exception {

@Test
public void testPost() throws Exception {
String xml =
"<layerGroup>" +
"<name>newLayerGroup</name>" +
"<layers>" +
"<layer>Ponds</layer>" +
"<layer>Forests</layer>" +
"</layers>" +
"<styles>" +
"<style>polygon</style>" +
"<style>point</style>" +
"</styles>" +
"</layerGroup>";

String xml = "<layerGroup>" +
" <name>newLayerGroup</name>" +
" <layers>" +
" <layer>Ponds</layer>" +
" <layer>Forests</layer>" +
" </layers>" +
" <styles>" +
" <style>polygon</style>" +
" <style>point</style>" +
" </styles>" +
" <keywords>" +
" <string>keyword1\\@language=en\\;\\@vocabulary=vocabulary1\\;</string>" +
" <string>keyword2\\@language=pt\\;\\@vocabulary=vocabulary2\\;</string>" +
" </keywords>" +
"</layerGroup>";
MockHttpServletResponse response = postAsServletResponse(RestBaseController.ROOT_PATH + "/layergroups", xml );
assertEquals( 201, response.getStatus() );

Expand All @@ -328,6 +360,17 @@ public void testPost() throws Exception {
assertEquals( "point", lg.getStyles().get( 1 ).getName() );

assertNotNull( lg.getBounds() );

// expected keywords
Keyword keyword1 = new Keyword("keyword1");
keyword1.setLanguage("en");
keyword1.setVocabulary("vocabulary1");
Keyword keyword2 = new Keyword("keyword2");
keyword2.setLanguage("pt");
keyword2.setVocabulary("vocabulary2");
// check that the keywords were correctly added
assertThat(lg.getKeywords().size(), is(2));
assertThat(lg.getKeywords(), containsInAnyOrder(keyword1, keyword2));
}

@Test
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,16 @@
</ul>
</fieldset>
</li>
<li>
<fieldset>
<legend><span><wicket:message key="keywords">Keywords</wicket:message></span></legend>
<ul>
<li>
<div wicket:id="keywords"></div>
</li>
</ul>
</fieldset>
</li>
</ul>
</wicket:panel>
</body>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
import org.apache.wicket.markup.html.form.TextArea;
import org.apache.wicket.markup.html.form.TextField;
import org.apache.wicket.model.Model;
import org.apache.wicket.model.PropertyModel;
import org.apache.wicket.model.StringResourceModel;
import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.validation.IValidatable;
Expand All @@ -26,6 +27,7 @@
import org.apache.wicket.validation.ValidationError;
import org.geoserver.catalog.Catalog;
import org.geoserver.catalog.CatalogBuilder;
import org.geoserver.catalog.KeywordInfo;
import org.geoserver.catalog.LayerGroupInfo;
import org.geoserver.catalog.WorkspaceInfo;
import org.geoserver.web.data.resource.MetadataLinkEditor;
Expand All @@ -35,6 +37,8 @@
import org.geoserver.web.publish.PublishedEditTabPanel;
import org.geoserver.web.wicket.EnvelopePanel;
import org.geoserver.web.wicket.GeoServerAjaxFormLink;
import org.geoserver.web.wicket.KeywordsEditor;
import org.geoserver.web.wicket.LiveCollectionModel;
import org.geoserver.web.wicket.ParamResourceModel;
import org.opengis.referencing.crs.CoordinateReferenceSystem;

Expand Down Expand Up @@ -227,6 +231,10 @@ protected void onClick(AjaxRequestTarget target, Form<?> form) {
add(lgEntryPanel = new LayerGroupEntryPanel( "layers", getPublishedInfo(), wsChoice.getModel()));

add(new MetadataLinkEditor("metadataLinks", myModel));

// add keywords editor
add(new KeywordsEditor("keywords", LiveCollectionModel.list(
new PropertyModel<List<KeywordInfo>>(myModel, "keywords"))));

if (!isAuthenticatedAsAdmin()) {
if (isNew) {
Expand Down

0 comments on commit b772809

Please sign in to comment.