Merge pull request #91 from simboss/upm

#90, Improving support for ImageMosaics
This commit is contained in:
Simone Giannecchini 2013-08-01 10:55:52 -07:00
commit ef4e1db865
35 changed files with 553 additions and 193 deletions

View File

@ -2292,11 +2292,11 @@ public class GeoServerRESTPublisher {
}
// ==========================================================================
// === MISCELLANEA
// === MISCELLANEOUS
// ==========================================================================
/**
* Allows to configure some layer attributes such and DefaultStyle
* Allows to configure some layer attributes such as DefaultStyle
*
* @param workspace
* @param resourceName the name of the resource to use (featureStore or coverageStore name)

View File

@ -26,8 +26,8 @@
package it.geosolutions.geoserver.rest.decoder;
import it.geosolutions.geoserver.rest.decoder.utils.JDOMListIterator;
import it.geosolutions.geoserver.rest.decoder.utils.NameLinkElem;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;

View File

@ -25,9 +25,12 @@
package it.geosolutions.geoserver.rest.decoder;
import it.geosolutions.geoserver.rest.decoder.utils.JDOMBuilder;
import it.geosolutions.geoserver.rest.encoder.feature.FeatureTypeAttribute;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.jdom.Element;
@ -205,6 +208,136 @@ public class RESTCoverage extends RESTResource {
}
return listDim;
}
/**
* Retrieves the list of parameters for this coverage.
*
* @return a {@link Map} where the key is the name for the parameter and the value is the value for the parameter.
*/
@SuppressWarnings("unchecked")
public Map<String, String> getParametersList() {
Map<String, String> paramsList = new HashMap<String, String>();
final Element paramsRoot = rootElem.getChild("parameters");
if (paramsRoot != null) {
final List<Element> params = paramsRoot.getChildren();
if (params != null) {
for (Element param : params) {
final List<Element> values = param.getChildren();
assert values.size()==2;
paramsList.put(values.get(0).getValue(), values.get(1).getValue()); // save key and value
}
}
}
return paramsList;
}
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
builder.append("RESTCoverage [");
if (getNativeFormat() != null) {
builder.append("getNativeFormat()=");
builder.append(getNativeFormat());
builder.append(", ");
}
if (getNativeCRS() != null) {
builder.append("getNativeCRS()=");
builder.append(getNativeCRS());
builder.append(", ");
}
if (getSRS() != null) {
builder.append("getSRS()=");
builder.append(getSRS());
builder.append(", ");
}
if (getMetadataList() != null) {
builder.append("getMetadataList()=");
builder.append(getMetadataList());
builder.append(", ");
}
if (getDimensionInfo() != null) {
builder.append("getDimensionInfo()=");
builder.append(getDimensionInfo());
builder.append(", ");
}
if (getParametersList() != null) {
builder.append("getParametersList()=");
builder.append(getParametersList());
builder.append(", ");
}
if (getName() != null) {
builder.append("getName()=");
builder.append(getName());
builder.append(", ");
}
if (getTitle() != null) {
builder.append("getTitle()=");
builder.append(getTitle());
builder.append(", ");
}
if (getNativeName() != null) {
builder.append("getNativeName()=");
builder.append(getNativeName());
builder.append(", ");
}
if (getAbstract() != null) {
builder.append("getAbstract()=");
builder.append(getAbstract());
builder.append(", ");
}
if (getNameSpace() != null) {
builder.append("getNameSpace()=");
builder.append(getNameSpace());
builder.append(", ");
}
if (getStoreName() != null) {
builder.append("getStoreName()=");
builder.append(getStoreName());
builder.append(", ");
}
if (getStoreType() != null) {
builder.append("getStoreType()=");
builder.append(getStoreType());
builder.append(", ");
}
if (getStoreUrl() != null) {
builder.append("getStoreUrl()=");
builder.append(getStoreUrl());
builder.append(", ");
}
if (getCRS() != null) {
builder.append("getCRS()=");
builder.append(getCRS());
builder.append(", ");
}
builder.append("getMinX()=");
builder.append(getMinX());
builder.append(", getMaxX()=");
builder.append(getMaxX());
builder.append(", getMinY()=");
builder.append(getMinY());
builder.append(", getMaxY()=");
builder.append(getMaxY());
builder.append(", ");
if (getAttributeList() != null) {
builder.append("getAttributeList()=");
builder.append(getAttributeList());
builder.append(", ");
}
if (getEncodedAttributeList() != null) {
builder.append("getEncodedAttributeList()=");
builder.append(getEncodedAttributeList());
builder.append(", ");
}
if (getEncodedMetadataLinkInfoList() != null) {
builder.append("getEncodedMetadataLinkInfoList()=");
builder.append(getEncodedMetadataLinkInfoList());
}
builder.append("]");
return builder.toString();
}
// public String getStoreName() {
// return rootElem.getChild("store").getChildText("name");

View File

@ -25,8 +25,9 @@
package it.geosolutions.geoserver.rest.decoder;
import it.geosolutions.geoserver.rest.decoder.utils.NameLinkElem;
import it.geosolutions.geoserver.rest.decoder.utils.JDOMBuilder;
import it.geosolutions.geoserver.rest.decoder.utils.NameLinkElem;
import org.jdom.Element;
/**

View File

@ -26,6 +26,7 @@
package it.geosolutions.geoserver.rest.decoder;
import it.geosolutions.geoserver.rest.decoder.utils.JDOMBuilder;
import org.jdom.Element;
/**

View File

@ -25,8 +25,9 @@
package it.geosolutions.geoserver.rest.decoder;
import it.geosolutions.geoserver.rest.decoder.utils.NameLinkElem;
import it.geosolutions.geoserver.rest.decoder.utils.JDOMBuilder;
import it.geosolutions.geoserver.rest.decoder.utils.NameLinkElem;
import org.jdom.Element;
/**

View File

@ -25,8 +25,9 @@
package it.geosolutions.geoserver.rest.decoder;
import it.geosolutions.geoserver.rest.decoder.utils.NameLinkElem;
import it.geosolutions.geoserver.rest.decoder.utils.JDOMBuilder;
import it.geosolutions.geoserver.rest.decoder.utils.NameLinkElem;
import org.jdom.Element;
/**

View File

@ -29,6 +29,7 @@ import it.geosolutions.geoserver.rest.decoder.utils.JDOMBuilder;
import it.geosolutions.geoserver.rest.decoder.utils.JDOMListIterator;
import java.util.Iterator;
import org.jdom.Element;
/**

View File

@ -26,6 +26,7 @@
package it.geosolutions.geoserver.rest.decoder;
import it.geosolutions.geoserver.rest.decoder.utils.JDOMBuilder;
import org.jdom.Element;
import org.jdom.Namespace;

View File

@ -26,6 +26,7 @@
package it.geosolutions.geoserver.rest.decoder;
import it.geosolutions.geoserver.rest.decoder.utils.JDOMBuilder;
import org.jdom.Element;
/**

View File

@ -25,8 +25,9 @@
package it.geosolutions.geoserver.rest.decoder;
import it.geosolutions.geoserver.rest.decoder.utils.NameLinkElem;
import it.geosolutions.geoserver.rest.decoder.utils.JDOMBuilder;
import it.geosolutions.geoserver.rest.decoder.utils.NameLinkElem;
import org.jdom.Element;
/**

View File

@ -25,8 +25,9 @@
package it.geosolutions.geoserver.rest.decoder;
import it.geosolutions.geoserver.rest.decoder.utils.NameLinkElem;
import it.geosolutions.geoserver.rest.decoder.utils.JDOMBuilder;
import it.geosolutions.geoserver.rest.decoder.utils.NameLinkElem;
import org.jdom.Element;
/**

View File

@ -26,9 +26,10 @@ package it.geosolutions.geoserver.rest.decoder;
import it.geosolutions.geoserver.rest.decoder.utils.JDOMBuilder;
import org.jdom.Element;
import java.net.URI;
import org.jdom.Element;
/**
* Parse <TT>namespace</TT>s returned as XML REST objects.
*

View File

@ -26,6 +26,7 @@
package it.geosolutions.geoserver.rest.decoder;
import it.geosolutions.geoserver.rest.decoder.utils.JDOMBuilder;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;

View File

@ -25,10 +25,10 @@
package it.geosolutions.geoserver.rest.decoder;
import org.jdom.Element;
import it.geosolutions.geoserver.rest.decoder.utils.NameLinkElem;
import org.jdom.Element;
/**
* Parse a <TT>published</TT> returned as XML REST objects.

View File

@ -123,15 +123,17 @@ public class RESTResource {
List<Map<FeatureTypeAttribute, String>> attrsList = null;
final Element attrsRoot = rootElem.getChild("attributes");
final List<Element> attrs = attrsRoot.getChildren();
if (attrs != null) {
attrsList = new ArrayList<Map<FeatureTypeAttribute, String>>(attrs.size());
for (Element attr : attrs) {
Map<FeatureTypeAttribute, String> attrsMap = new HashMap<FeatureTypeAttribute, String>();
attrsList.add(attrsMap);
for (FeatureTypeAttribute at : FeatureTypeAttribute.values()) {
String key = at.toString();
attrsMap.put(at, attr.getChildText(key));
if(attrsRoot!=null){
final List<Element> attrs = attrsRoot.getChildren();
if (attrs != null) {
attrsList = new ArrayList<Map<FeatureTypeAttribute, String>>(attrs.size());
for (Element attr : attrs) {
Map<FeatureTypeAttribute, String> attrsMap = new HashMap<FeatureTypeAttribute, String>();
attrsList.add(attrsMap);
for (FeatureTypeAttribute at : FeatureTypeAttribute.values()) {
String key = at.toString();
attrsMap.put(at, attr.getChildText(key));
}
}
}
}
@ -142,18 +144,20 @@ public class RESTResource {
List<GSAttributeEncoder> attrsList = null;
final Element attrsRoot = rootElem.getChild("attributes");
final List<Element> attrs = attrsRoot.getChildren();
if (attrs != null) {
attrsList = new ArrayList<GSAttributeEncoder>(attrs.size());
for (Element attr : attrs) {
final GSAttributeEncoder attrEnc = new GSAttributeEncoder();
for (FeatureTypeAttribute at : FeatureTypeAttribute.values()) {
String key = at.toString();
attrEnc.setAttribute(at, attr.getChildText(key));
if(attrsRoot!=null){
final List<Element> attrs = attrsRoot.getChildren();
if (attrs != null) {
attrsList = new ArrayList<GSAttributeEncoder>(attrs.size());
for (Element attr : attrs) {
final GSAttributeEncoder attrEnc = new GSAttributeEncoder();
for (FeatureTypeAttribute at : FeatureTypeAttribute.values()) {
String key = at.toString();
attrEnc.setAttribute(at, attr.getChildText(key));
}
attrsList.add(attrEnc);
}
attrsList.add(attrEnc);
}
}
return attrsList;
}
@ -169,19 +173,21 @@ public class RESTResource {
List<GSMetadataLinkInfoEncoder> metaLinksList = null;
final Element metaLinksRoot = rootElem.getChild("metadataLinks");
final List<Element> metaLinks = metaLinksRoot.getChildren();
if (metaLinks != null) {
metaLinksList = new ArrayList<GSMetadataLinkInfoEncoder>(
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);
}
}
if(metaLinksRoot!=null){
final List<Element> metaLinks = metaLinksRoot.getChildren();
if (metaLinks != null) {
metaLinksList = new ArrayList<GSMetadataLinkInfoEncoder>(
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;
}

View File

@ -25,8 +25,9 @@
package it.geosolutions.geoserver.rest.decoder;
import it.geosolutions.geoserver.rest.decoder.utils.NameLinkElem;
import it.geosolutions.geoserver.rest.decoder.utils.JDOMBuilder;
import it.geosolutions.geoserver.rest.decoder.utils.NameLinkElem;
import org.jdom.Element;
/**

View File

@ -25,8 +25,9 @@
package it.geosolutions.geoserver.rest.decoder;
import it.geosolutions.geoserver.rest.decoder.utils.NameLinkElem;
import it.geosolutions.geoserver.rest.decoder.utils.JDOMBuilder;
import it.geosolutions.geoserver.rest.decoder.utils.NameLinkElem;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;

View File

@ -27,6 +27,7 @@ package it.geosolutions.geoserver.rest.decoder.utils;
import java.util.Iterator;
import java.util.List;
import org.jdom.Element;
/**

View File

@ -24,13 +24,13 @@
*/
package it.geosolutions.geoserver.rest.encoder;
import org.jdom.Element;
import it.geosolutions.geoserver.rest.GeoServerRESTPublisher;
import it.geosolutions.geoserver.rest.GeoServerRESTPublisher.StoreType;
import it.geosolutions.geoserver.rest.encoder.utils.ElementUtils;
import it.geosolutions.geoserver.rest.encoder.utils.PropertyXMLEncoder;
import org.jdom.Element;
/**
* Generic Store encoder.
*

View File

@ -25,9 +25,10 @@
package it.geosolutions.geoserver.rest.encoder;
import it.geosolutions.geoserver.rest.encoder.utils.PropertyXMLEncoder;
import org.jdom.Element;
import org.jdom.filter.Filter;
import it.geosolutions.geoserver.rest.encoder.utils.PropertyXMLEncoder;
/**
*

View File

@ -24,11 +24,11 @@
*/
package it.geosolutions.geoserver.rest.encoder;
import java.net.URI;
import it.geosolutions.geoserver.rest.encoder.utils.ElementUtils;
import it.geosolutions.geoserver.rest.encoder.utils.PropertyXMLEncoder;
import java.net.URI;
/**
* Namespace XML encoder. Namespaces must contain a non empty prefix and a URI:
*

View File

@ -111,13 +111,42 @@ public abstract class GSResourceEncoder
* @param dimensionInfo
*/
protected void addMetadataDimension(String key, GSDimensionInfoEncoder dimensionInfo) {
metadata.add(key, dimensionInfo.getRoot());
addMetadataDimension(key, dimensionInfo, false);
}
/**
* Add the metadata for a custom dimension.
*
* @param key the name of the dimension
* @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{
metadata.add(key, dimensionInfo.getRoot());
}
}
public void setMetadataDimension(String key, GSDimensionInfoEncoder dimensionInfo) {
metadata.set(key, dimensionInfo.getRoot());
setMetadataDimension(key, dimensionInfo, false);
}
/**
* Set the metadata for a custom dimension.
*
* @param key the name of the dimension
* @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{
metadata.set(key, dimensionInfo.getRoot());
}
}
/**
* @param key
* the name of the metadata to add (f.e.: elevation, time)

View File

@ -25,11 +25,11 @@
package it.geosolutions.geoserver.rest.encoder;
import org.jdom.Element;
import it.geosolutions.geoserver.rest.encoder.utils.ElementUtils;
import it.geosolutions.geoserver.rest.encoder.utils.PropertyXMLEncoder;
import org.jdom.Element;
/**
*
* @author ETj (etj at geo-solutions.it)

View File

@ -38,8 +38,10 @@ import org.jdom.filter.Filter;
* Use this encoder for ImageMosaic coverages.
*
* @author Carlo Cancellieri - carlo.cancellieri@geo-solutions.it
* @author Simone Giannecchini, GeoSolutions SAS
*
*/
@SuppressWarnings("unchecked")
public class GSImageMosaicEncoder extends GSCoverageEncoder {
final private static String STRING = "string";
@ -98,7 +100,7 @@ public class GSImageMosaicEncoder extends GSCoverageEncoder {
return null;
}
private final static String allowMultithreading = "AllowMultithreading";
public final static String allowMultithreading = "AllowMultithreading";
/**
* @param val
@ -133,7 +135,10 @@ public class GSImageMosaicEncoder extends GSCoverageEncoder {
return null;
}
private final static String filter = "Filter";
//
// Filter
//
public final static String filter = "Filter";
/**
* @param val
@ -151,9 +156,25 @@ public class GSImageMosaicEncoder extends GSCoverageEncoder {
removeParameter(filterFilter);
addFilter(val);
}
private final static String maxAllowedTiles = "MaxAllowedTiles";
public Boolean getFilter() {
Element el = getParameter(filterFilter);
if (el != null) {
List<Element> values = el.getChildren();
for (Element elm : values) {
String value = elm.getValue();
if (!value.equalsIgnoreCase(filter)) {
return Boolean.valueOf(value);
}
}
}
return null;
}
//
// MaxAllowedTiles
//
public final static String maxAllowedTiles = "MaxAllowedTiles";
/**
* @param val
*/
@ -170,8 +191,26 @@ public class GSImageMosaicEncoder extends GSCoverageEncoder {
removeParameter(maxAllowedTilesFilter);
addMaxAllowedTiles(val);
}
public Boolean getMaxAllowedTiles() {
Element el = getParameter(maxAllowedTilesFilter);
if (el != null) {
List<Element> values = el.getChildren();
for (Element elm : values) {
String value = elm.getValue();
if (!value.equalsIgnoreCase(maxAllowedTiles)) {
return Boolean.valueOf(value);
}
}
}
return null;
}
private final static String inputTransparentColor = "InputTransparentColor";
//
// InputTransparentColor
//
public final static String inputTransparentColor = "InputTransparentColor";
/**
* @param val
@ -190,8 +229,26 @@ public class GSImageMosaicEncoder extends GSCoverageEncoder {
removeParameter(inputTransparentColorFilter);
addInputTransparentColor(val);
}
public Boolean getInputTransparentColor() {
Element el = getParameter(inputTransparentColorFilter);
if (el != null) {
List<Element> values = el.getChildren();
for (Element elm : values) {
String value = elm.getValue();
if (!value.equalsIgnoreCase(inputTransparentColor)) {
return Boolean.valueOf(value);
}
}
}
return null;
}
private final static String outputTransparentColor = "OutputTransparentColor";
//
// OutputTransparentColor
//
public final static String outputTransparentColor = "OutputTransparentColor";
/**
* @param val
@ -210,8 +267,24 @@ public class GSImageMosaicEncoder extends GSCoverageEncoder {
removeParameter(outputTransparentColorFilter);
addInputTransparentColor(val);
}
private final static String SUGGESTED_TILE_SIZE = "SUGGESTED_TILE_SIZE";
public Boolean getOutputTransparentColor() {
Element el = getParameter(outputTransparentColorFilter);
if (el != null) {
List<Element> values = el.getChildren();
for (Element elm : values) {
String value = elm.getValue();
if (!value.equalsIgnoreCase(outputTransparentColor)) {
return Boolean.valueOf(value);
}
}
}
return null;
}
//
// SUGGESTED_TILE_SIZE
//
public final static String SUGGESTED_TILE_SIZE = "SUGGESTED_TILE_SIZE";
/**
* @param val
@ -246,7 +319,10 @@ public class GSImageMosaicEncoder extends GSCoverageEncoder {
return null;
}
private final static String USE_JAI_IMAGEREAD = "USE_JAI_IMAGEREAD";
//
// USE_JAI_IMAGEREAD
//
public final static String USE_JAI_IMAGEREAD = "USE_JAI_IMAGEREAD";
/**
* @param val
@ -279,7 +355,10 @@ public class GSImageMosaicEncoder extends GSCoverageEncoder {
return null;
}
private final static String backgroundValues = "BackgroundValues";
//
// BackgroundValues
//
public final static String backgroundValues = "BackgroundValues";
/**
* @param val
@ -297,5 +376,62 @@ public class GSImageMosaicEncoder extends GSCoverageEncoder {
removeParameter(backgroundValuesFilter);
addBackgroundValues(val);
}
public Boolean getBackgroundValues() {
Element el = getParameter(backgroundValuesFilter);
if (el != null) {
List<Element> values = el.getChildren();
for (Element elm : values) {
String value = elm.getValue();
if (!value.equalsIgnoreCase(backgroundValues)) {
return Boolean.valueOf(value);
}
}
}
return null;
}
//
// SORTING
//
public final static String SORTING = "SORTING";
/**
* @param val
*/
protected void addSORTING(final String val) {
final List<Element> list = new ArrayList<Element>(2);
list.add(new Element(STRING).setText(SORTING));
list.add(new Element(STRING).setText(val));
parameters.add(null, list);
}
private final static Filter SORTING_FILTER = new parametersFilter(SORTING);
public void setSORTING(final String val) {
removeParameter(SORTING_FILTER);
addBackgroundValues(val);
}
//
// SORTING
//
public final static String MERGEBEHAVIOR = "MergeBehavior";
/**
* @param val
*/
protected void addMergeBehavior(final String val) {
final List<Element> list = new ArrayList<Element>(2);
list.add(new Element(STRING).setText(MERGEBEHAVIOR));
list.add(new Element(STRING).setText(val));
parameters.add(null, list);
}
private final static Filter MERGEBEHAVIOR_FILTER = new parametersFilter(MERGEBEHAVIOR);
public void setMergeBehavior(final String val) {
removeParameter(MERGEBEHAVIOR_FILTER);
addBackgroundValues(val);
}
}

View File

@ -24,13 +24,13 @@
*/
package it.geosolutions.geoserver.rest.encoder.datastore;
import it.geosolutions.geoserver.rest.decoder.RESTDataStore;
import it.geosolutions.geoserver.rest.encoder.utils.ElementUtils;
import java.net.MalformedURLException;
import java.net.URL;
import java.nio.charset.Charset;
import it.geosolutions.geoserver.rest.decoder.RESTDataStore;
import it.geosolutions.geoserver.rest.encoder.utils.ElementUtils;
/**
* Encoder for a {@value #TYPE} datastore.
*

View File

@ -24,15 +24,15 @@
*/
package it.geosolutions.geoserver.rest.encoder.feature;
import it.geosolutions.geoserver.rest.encoder.utils.ElementUtils;
import it.geosolutions.geoserver.rest.encoder.utils.PropertyXMLEncoder;
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;
/**
*
* @author carlo cancellieri - GeoSolutions

View File

@ -53,12 +53,7 @@ public class GSDimensionInfoEncoder extends XmlElement{
*/
public enum Presentation {
LIST,
CONTINUOUS_INTERVAL
}
/**
* Enum for presentation mode which needs arguments
*/
public enum PresentationDiscrete {
CONTINUOUS_INTERVAL,
DISCRETE_INTERVAL
}
@ -87,38 +82,40 @@ public class GSDimensionInfoEncoder extends XmlElement{
this.enabled=Boolean.TRUE;
}
/**
* @param pres
*/
protected void addPresentation(final Presentation pres){
if (enabled){
add(PRESENTATION,pres.toString());
}
}
public void setPresentation(final Presentation pres){
if (enabled){
set(PRESENTATION,pres.toString());
remove(RESOLUTION);
}
setPresentation(pres, null);
}
/**
* @param pres
* @param interval
*/
protected void addPresentation(final PresentationDiscrete pres, final BigDecimal interval){
protected void addPresentation(final Presentation pres, final BigDecimal interval){
if (enabled){
add(PRESENTATION,pres.toString());
add(RESOLUTION,String.valueOf(interval));
if(pres==Presentation.DISCRETE_INTERVAL){
if(pres==Presentation.DISCRETE_INTERVAL&&interval==null){
throw new IllegalArgumentException("Null interval was provided while trying to set the presentation to discrete interval.");
}
add(RESOLUTION,String.valueOf(interval));
} else {
remove(RESOLUTION);
}
}
}
public void setPresentation(final PresentationDiscrete pres, final BigDecimal interval){
if (enabled){
set(PRESENTATION,pres.toString());
set(RESOLUTION,String.valueOf(interval));
}
public void setPresentation(final Presentation pres, final BigDecimal interval){
if (enabled){
set(PRESENTATION,pres.toString());
if(pres==Presentation.DISCRETE_INTERVAL){
if(pres==Presentation.DISCRETE_INTERVAL&&interval==null){
throw new IllegalArgumentException("Null interval was provided while trying to set the presentation to discrete interval.");
}
set(RESOLUTION,String.valueOf(interval));
} else {
remove(RESOLUTION);
}
}
}

View File

@ -24,14 +24,14 @@
*/
package it.geosolutions.geoserver.rest.encoder.metadata.virtualtable;
import it.geosolutions.geoserver.rest.encoder.utils.ElementUtils;
import it.geosolutions.geoserver.rest.encoder.utils.XmlElement;
import java.util.List;
import org.jdom.Element;
import org.jdom.filter.Filter;
import it.geosolutions.geoserver.rest.encoder.utils.ElementUtils;
import it.geosolutions.geoserver.rest.encoder.utils.XmlElement;
/**
* GSVirtualTableEncoder - Encodes a metadata VirtualTable for a GeoServer
* featureType.

View File

@ -24,15 +24,12 @@
*/
package it.geosolutions.geoserver.rest.encoder.metadatalink;
import java.util.Map;
import java.util.Map.Entry;
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;
import it.geosolutions.geoserver.rest.encoder.utils.ElementUtils;
import it.geosolutions.geoserver.rest.encoder.utils.XmlElement;
/**
* GSMetadataLinkEncoder - encodes a metadataLink for a given GeoServer Resource
* (feature type /coverage), as follows:

View File

@ -25,7 +25,6 @@
package it.geosolutions.geoserver.rest.manager;
import it.geosolutions.geoserver.rest.GeoServerRESTPublisher.Format;
import it.geosolutions.geoserver.rest.GeoServerRESTPublisher.StoreType;
import it.geosolutions.geoserver.rest.HTTPUtils;
import it.geosolutions.geoserver.rest.encoder.GSAbstractStoreEncoder;
import it.geosolutions.geoserver.rest.encoder.datastore.GSAbstractDatastoreEncoder;

View File

@ -381,6 +381,26 @@ public class GeoServerRESTStructuredGridCoverageReaderManager extends GeoServerR
return null;
}
/**
* Get information about all the granules for a coverage with optional filter and paging.
*
* @param workspace the GeoServer workspace
* @param coverageStore the GeoServer coverageStore
* @param coverage the name of the target coverage
*
* @return <code>null</code> in case the call does not succeed, or an instance of {@link RESTStructuredCoverageGranulesList}.
*
* @throws MalformedURLException
* @throws UnsupportedEncodingException
*
* @since geoserver-2.4.0, geoserver-mng-1.6.0
*/
public RESTStructuredCoverageGranulesList getGranules(final String workspace,
String coverageStore, String coverage)
throws MalformedURLException, UnsupportedEncodingException {
return getGranules(workspace, coverageStore, coverage, null, null, null);
}
/**
* Get information about the granules for a coverage with optional filter and paging.
*

View File

@ -2,7 +2,6 @@ package it.geosolutions.geoserver.rest.encoder.feature;
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.utils.ElementUtils;
@ -25,10 +24,10 @@ public class GSFeatureDimensionInfoEncoderTest {
// LOGGER.info(encoder.toString());
elevationDimension.setPresentation(
PresentationDiscrete.DISCRETE_INTERVAL, BigDecimal.valueOf(10));
Presentation.DISCRETE_INTERVAL, BigDecimal.valueOf(10));
elevationDimension.setPresentation(
PresentationDiscrete.DISCRETE_INTERVAL, BigDecimal.valueOf(12));
Presentation.DISCRETE_INTERVAL, BigDecimal.valueOf(12));
List<Element> elList = ElementUtils.search(
elevationDimension.getRoot(), new Filter() {
@ -44,8 +43,8 @@ public class GSFeatureDimensionInfoEncoderTest {
}
});
// using set we get only one element called
// PresentationDiscrete.DISCRETE_INTERVAL
Assert.assertEquals(Integer.valueOf(elList.size()), Integer.valueOf(1));
// Presentation.DISCRETE_INTERVAL
Assert.assertEquals(elList.size(), 1);
elevationDimension.setPresentation(Presentation.LIST);
@ -65,7 +64,7 @@ public class GSFeatureDimensionInfoEncoderTest {
}
});
Assert.assertEquals(Integer.valueOf(elList.size()), Integer.valueOf(0));
Assert.assertEquals(elList.size(), 0);
}

View File

@ -26,7 +26,6 @@ import it.geosolutions.geoserver.rest.encoder.GSLayerEncoder;
import it.geosolutions.geoserver.rest.encoder.GSResourceEncoder;
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.metadata.virtualtable.GSVirtualTableEncoder;
import it.geosolutions.geoserver.rest.encoder.metadata.virtualtable.VTGeometryEncoder;
@ -155,21 +154,21 @@ public class GSFeatureEncoderTest extends GeoserverRESTPublisherTest {
GSFeatureDimensionInfoEncoder dim2 = new GSFeatureDimensionInfoEncoder("ELE");
encoder.addMetadata("elevation", dim2);
dim2.setPresentation(PresentationDiscrete.DISCRETE_INTERVAL, BigDecimal.valueOf(10));
encoder.setMetadataDimension("elevation", dim2);
dim2.setPresentation(Presentation.DISCRETE_INTERVAL, BigDecimal.valueOf(10));
Element el = ElementUtils.contains(encoder.getRoot(), GSDimensionInfoEncoder.PRESENTATION);
Assert.assertNotNull(el);
LOGGER.info("contains_key:" + el.toString());
dim2.setPresentation(PresentationDiscrete.DISCRETE_INTERVAL, BigDecimal.valueOf(12));
dim2.setPresentation(Presentation.DISCRETE_INTERVAL, BigDecimal.valueOf(12));
el = ElementUtils.contains(encoder.getRoot(), GSDimensionInfoEncoder.RESOLUTION);
Assert.assertNotNull(el);
Assert.assertEquals("12", el.getText());
dim2.setPresentation(Presentation.CONTINUOUS_INTERVAL);
encoder.setMetadata("time", new GSFeatureDimensionInfoEncoder("time"));
encoder.setMetadataDimension("time", new GSFeatureDimensionInfoEncoder("time"));
el = ElementUtils.contains(encoder.getRoot(), GSDimensionInfoEncoder.PRESENTATION);
Assert.assertNotNull(el);
el = ElementUtils.contains(encoder.getRoot(), GSDimensionInfoEncoder.RESOLUTION);
@ -220,9 +219,9 @@ public class GSFeatureEncoderTest extends GeoserverRESTPublisherTest {
// LOGGER.info(encoder.toString());
final String metadata = "elevation";
encoder.setMetadata(metadata, elevationDimension);
encoder.setMetadataDimension(metadata, elevationDimension);
elevationDimension.setPresentation(PresentationDiscrete.DISCRETE_INTERVAL,
elevationDimension.setPresentation(Presentation.DISCRETE_INTERVAL,
BigDecimal.valueOf(10));
if (LOGGER.isInfoEnabled())

View File

@ -1,33 +1,18 @@
/*
* GeoTools - The Open Source Java GIS Toolkit
* http://geotools.org
*
* (C) 2002-2011, Open Source Geospatial Foundation (OSGeo)
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License.
*
* This library 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
* Lesser General Public License for more details.
*/
package it.geosolutions.geoserver.rest.manager;
import it.geosolutions.geoserver.rest.GeoserverRESTTest;
import it.geosolutions.geoserver.rest.decoder.RESTCoverage;
import it.geosolutions.geoserver.rest.decoder.RESTStructuredCoverageGranulesList;
import it.geosolutions.geoserver.rest.decoder.RESTStructuredCoverageGranulesList.RESTStructuredCoverageGranule;
import it.geosolutions.geoserver.rest.decoder.RESTStructuredCoverageIndexSchema;
import it.geosolutions.geoserver.rest.decoder.RESTStructuredCoverageIndexSchema.RESTStructuredCoverageIndexAttribute;
import it.geosolutions.geoserver.rest.encoder.GSResourceEncoder.ProjectionPolicy;
import it.geosolutions.geoserver.rest.encoder.coverage.GSImageMosaicEncoder;
import it.geosolutions.geoserver.rest.encoder.metadata.GSDimensionInfoEncoder;
import it.geosolutions.geoserver.rest.encoder.metadata.GSDimensionInfoEncoder.Presentation;
import java.net.URL;
import java.util.Iterator;
import java.util.Map;
import org.junit.Assert;
import org.junit.Test;
@ -53,18 +38,25 @@ public class GeoServerRESTImageMosaicManagerTest extends GeoserverRESTTest {
if (!enabled()) {
return;
}
// crea the manager
GeoServerRESTStructuredGridCoverageReaderManager manager =
new GeoServerRESTStructuredGridCoverageReaderManager(new URL(RESTURL), RESTUSER, RESTPW);
// create mosaic
boolean create=manager.create("it.geosolutions", "mosaic",new ClassPathResource("testdata/granules/mosaic.zip").getFile().getAbsolutePath());
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());
assertTrue(create);
// enable dimension
fixDimensions("it.geosolutions", "mosaic", "mosaic");
fixDimensions(workspaceName, coverageStoreName, coverageName);
// check index format
RESTStructuredCoverageIndexSchema indexFormat = manager.getGranuleIndexSchema("it.geosolutions", "mosaic","mosaic");
RESTStructuredCoverageIndexSchema indexFormat = manager.getGranuleIndexSchema(workspaceName, coverageName,coverageName);
assertTrue(create);
assertNotNull(indexFormat);
@ -99,47 +91,47 @@ public class GeoServerRESTImageMosaicManagerTest extends GeoserverRESTTest {
RESTStructuredCoverageGranulesList granulesList = null;
RESTStructuredCoverageGranule granule = null;
// get some granules by id
// manager.getGranuleById("it.geosolutions", "mosaic","mosaic","2");
// assertNotNull(granulesList);
// assertSame(1, granulesList.size());
// assertFalse(granulesList.isEmpty());
// RESTStructuredCoverageGranule granule = granulesList.get(0);
// assertNotNull(granule);
// assertEquals(granule.getAttributeByIndex(4), "1250.0");
// assertEquals(granule.getAttributeByName("elevation"), "1250.0");
// get with paging
granulesList = manager.getGranules("it.geosolutions", "mosaic", "mosaic" , null, 0, 1);
granulesList = manager.getGranules(workspaceName, coverageStoreName, coverageName , null, 0, 1);
assertNotNull(granulesList);
assertEquals(1, granulesList.size());
assertFalse(granulesList.isEmpty());
granule = granulesList.get(0);
assertNotNull(granule);
granulesList = manager.getGranules("it.geosolutions", "mosaic", "mosaic", null, null, 2);
granulesList = manager.getGranules(workspaceName, coverageStoreName, coverageName, null, null, 2);
assertNotNull(granulesList);
assertEquals(2, granulesList.size());
assertFalse(granulesList.isEmpty());
granule = granulesList.get(0);
assertNotNull(granule);
granulesList = manager.getGranules("it.geosolutions", "mosaic", "mosaic", null, null, null);
// get with no paging
granulesList = manager.getGranules(workspaceName, coverageStoreName, coverageName);
assertNotNull(granulesList);
assertEquals(4, granulesList.size());
assertFalse(granulesList.isEmpty());
granule = granulesList.get(0);
assertNotNull(granule);
granulesList = manager.getGranules("it.geosolutions", "mosaic", "mosaic", "depth = 100", null, null);
// examples of filtering with CQL
granulesList = manager.getGranules(workspaceName, coverageStoreName, coverageName, "depth = 100", null, null);
assertNotNull(granulesList);
assertEquals(2, granulesList.size());
assertFalse(granulesList.isEmpty());
granule = granulesList.get(0);
assertNotNull(granule);
granulesList = manager.getGranules("it.geosolutions", "mosaic", "mosaic", "depth = 100 AND date='20081101T0000000'", null, null);
granulesList = manager.getGranules(workspaceName, 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);
assertNotNull(granulesList);
assertEquals(1, granulesList.size());
assertFalse(granulesList.isEmpty());
@ -148,22 +140,21 @@ public class GeoServerRESTImageMosaicManagerTest extends GeoserverRESTTest {
// remove by filter
final String fileLocation = "NCOM_wattemp_100_20081101T0000000_12.tiff";
boolean result = manager.removeGranulesByCQL("it.geosolutions", "mosaic", "mosaic", "location = '" + fileLocation + "'");
boolean result = manager.removeGranulesByCQL(workspaceName, coverageStoreName, coverageName, "location = '" + fileLocation + "'");
Assert.assertTrue(result);
granulesList = manager.getGranules("it.geosolutions", "mosaic", "mosaic", null, null, null);
granulesList = manager.getGranules(workspaceName, coverageStoreName, coverageName);
assertNotNull(granulesList);
assertEquals(3, granulesList.size());
assertFalse(granulesList.isEmpty());
granule = granulesList.get(0);
assertNotNull(granule);
// Readding that granule
// use reflection to get the store URL since coveragestore only returns name and workspace
result = manager.harvestExternal("it.geosolutions", "mosaic", "imagemosaic", new ClassPathResource("testdata/granules/NCOM_wattemp_100_20081101T0000000_12.tiff").getFile().getAbsolutePath() );
// Readding that granule with harvest
result = manager.harvestExternal(workspaceName, coverageStoreName, format, new ClassPathResource("testdata/granules/NCOM_wattemp_100_20081101T0000000_12.tiff").getFile().getAbsolutePath() );
Assert.assertTrue(result);
granulesList = manager.getGranules("it.geosolutions", "mosaic", "mosaic", null, null, null);
granulesList = manager.getGranules(workspaceName, coverageStoreName, coverageName, null, null, null);
assertNotNull(granulesList);
assertEquals(4, granulesList.size());
assertFalse(granulesList.isEmpty());
@ -171,57 +162,96 @@ public class GeoServerRESTImageMosaicManagerTest extends GeoserverRESTTest {
assertNotNull(granule);
}
/**
* This method enables the various dimensions for the coverage autocreated for this test.
*
* <p> Notice that
* @param wsName the workspace
* @param coverageStoreName the coverage store name
* @param csname the coverage name
*/
private void fixDimensions(String wsName, String coverageStoreName, String csname) {
// get current config for the coverage to extract the params we want to set again
final RESTCoverage coverage = reader.getCoverage(wsName, coverageStoreName, csname);
final Map<String, String> params = coverage.getParametersList();
// prepare and fill the encoder
final GSImageMosaicEncoder coverageEncoder = new GSImageMosaicEncoder();
/*
* unused in mosaic creation
* this is only useful if you want to modify an existing coverage:
* publisher.configureCoverage(ce, wsname, csname);
* or create a new one from an existing store:
* publisher.createCoverage(ce, wsname, csname);
*/
coverageEncoder.setName("mosaic");
coverageEncoder.setAllowMultithreading(true);
coverageEncoder.setBackgroundValues("");
coverageEncoder.setFilter("");
coverageEncoder.setInputTransparentColor("");
coverageEncoder.setLatLonBoundingBox(-180, -90, 180, 90, "EPSG:4326");
coverageEncoder.setMaxAllowedTiles(11);
coverageEncoder.setNativeBoundingBox(-180, -90, 180, 90, "EPSG:4326");
coverageEncoder.setProjectionPolicy(ProjectionPolicy.NONE);
coverageEncoder.setSRS("EPSG:4326");
// activate time
// set the current params, change here if you want to change the values
for(Map.Entry<String, String> entry:params.entrySet()){
if(entry.getKey().equals(GSImageMosaicEncoder.allowMultithreading)){
coverageEncoder.setAllowMultithreading(Boolean.parseBoolean(entry.getValue()));
continue;
}
if(entry.getKey().equals(GSImageMosaicEncoder.backgroundValues)){
coverageEncoder.setBackgroundValues(entry.getValue());
continue;
}
if(entry.getKey().equals(GSImageMosaicEncoder.filter)){
coverageEncoder.setFilter(entry.getValue());
continue;
}
if(entry.getKey().equals(GSImageMosaicEncoder.inputTransparentColor)){
coverageEncoder.setInputTransparentColor(entry.getValue());
continue;
}
if(entry.getKey().equals(GSImageMosaicEncoder.maxAllowedTiles)){
coverageEncoder.setMaxAllowedTiles(Integer.parseInt(entry.getValue()));
continue;
}
if(entry.getKey().equals(GSImageMosaicEncoder.MERGEBEHAVIOR)){
coverageEncoder.setMergeBehavior(entry.getValue());
continue;
}
if(entry.getKey().equals(GSImageMosaicEncoder.outputTransparentColor)){
coverageEncoder.setOutputTransparentColor(entry.getValue());
continue;
}
if(entry.getKey().equals(GSImageMosaicEncoder.SORTING)){
coverageEncoder.setSORTING(entry.getValue());
continue;
}
if(entry.getKey().equals(GSImageMosaicEncoder.SUGGESTED_TILE_SIZE)){
coverageEncoder.setSUGGESTED_TILE_SIZE(entry.getValue());
continue;
}
if(entry.getKey().equals(GSImageMosaicEncoder.USE_JAI_IMAGEREAD)){
coverageEncoder.setUSE_JAI_IMAGEREAD(Boolean.parseBoolean(entry.getValue()));
continue;
}
}
// activate time dimension
final GSDimensionInfoEncoder time=new GSDimensionInfoEncoder(true);
time.setUnit("Seconds");
time.setUnitSymbol("s");
time.setPresentation(Presentation.LIST);
time.setPresentation(Presentation.CONTINUOUS_INTERVAL);
coverageEncoder.setMetadataDimension("time", time);
// activate date
final GSDimensionInfoEncoder date=new GSDimensionInfoEncoder(true);
date.setPresentation(Presentation.LIST);
coverageEncoder.setMetadataDimension("custom_dimension_DATE", date);
// activate depth
final GSDimensionInfoEncoder depth=new GSDimensionInfoEncoder(true);
depth.setPresentation(Presentation.LIST);
depth.setUnit("Meters");
depth.setUnitSymbol("m");
coverageEncoder.setMetadataDimension("custom_dimension_DEPTH", depth);
// activate run which is a custom dimension
final GSDimensionInfoEncoder run=new GSDimensionInfoEncoder(true);
run.setPresentation(Presentation.LIST);
run.setUnit("Hours");
run.setUnitSymbol("h");
coverageEncoder.setMetadataDimension("run", run,true);
// persiste the changes
boolean config=publisher.configureCoverage(coverageEncoder, wsName, csname);
assertTrue(config);