Skip to content

Commit

Permalink
[GEOS-7631] Set store name on REST upload.
Browse files Browse the repository at this point in the history
https://osgeo-org.atlassian.net/browse/GEOS-7631 provides the background. I took a
different approach to that suggest by the reporter to ensure keywords and title are
set up correctly too.
  • Loading branch information
bradh committed Dec 17, 2016
1 parent 555693e commit 05d5ec0
Show file tree
Hide file tree
Showing 3 changed files with 132 additions and 15 deletions.
57 changes: 46 additions & 11 deletions src/main/src/main/java/org/geoserver/catalog/CatalogBuilder.java
Expand Up @@ -859,26 +859,54 @@ public CoverageInfo buildCoverage(String coverageName) throws Exception {
return buildCoverage(reader, coverageName, null);
}

/**
* Builds the default coverage contained in the current store
*
* @param nativeCoverageName the native name for the coverage
* @param specifiedName the published name for the coverage. If null, the name will be determined from the coverage store.
* @return coverage for the specified name
* @throws Exception if the coverage store was not found or could not be read, or if the coverage could not be created.
*/
public CoverageInfo buildCoverageByName(String nativeCoverageName, String specifiedName) throws Exception {
if (store == null || !(store instanceof CoverageStoreInfo)) {
throw new IllegalStateException("Coverage store not set.");
}

CoverageStoreInfo csinfo = (CoverageStoreInfo) store;
GridCoverage2DReader reader = (GridCoverage2DReader) catalog
.getResourcePool().getGridCoverageReader(csinfo, GeoTools.getDefaultHints());

if (reader == null)
throw new Exception("Unable to acquire a reader for this coverage with format: "
+ csinfo.getFormat().getName());

return buildCoverageInternal(reader, nativeCoverageName, null, specifiedName);
}

/**
* Builds a coverage from a geotools grid coverage reader.
* @param customParameters
*/
public CoverageInfo buildCoverage(GridCoverage2DReader reader, Map customParameters) throws Exception {
return buildCoverage(reader, null, customParameters);
}

/**
* Builds a coverage from a geotools grid coverage reader.
* @param customParameters
*/
public CoverageInfo buildCoverage(GridCoverage2DReader reader, String coverageName, Map customParameters) throws Exception {
return buildCoverageInternal(reader, coverageName, customParameters, null);
}

private CoverageInfo buildCoverageInternal(GridCoverage2DReader reader, String nativeCoverageName, Map customParameters, String specifiedName) throws Exception {
if (store == null || !(store instanceof CoverageStoreInfo)) {
throw new IllegalStateException("Coverage store not set.");
}

// if we are dealing with a multicoverage reader, wrap to simplify code
if (coverageName != null) {
reader = SingleGridCoverage2DReader.wrap(reader, coverageName);
if (nativeCoverageName != null) {
reader = SingleGridCoverage2DReader.wrap(reader, nativeCoverageName);
}

CoverageStoreInfo csinfo = (CoverageStoreInfo) store;
Expand All @@ -887,8 +915,8 @@ public CoverageInfo buildCoverage(GridCoverage2DReader reader, String coverageNa
cinfo.setStore(csinfo);
cinfo.setEnabled(true);

WorkspaceInfo workspace = store.getWorkspace();
NamespaceInfo namespace = catalog.getNamespaceByPrefix(workspace.getName());
WorkspaceInfo wspace = store.getWorkspace();
NamespaceInfo namespace = catalog.getNamespaceByPrefix(wspace.getName());
if (namespace == null) {
namespace = catalog.getDefaultNamespace();
}
Expand Down Expand Up @@ -984,20 +1012,27 @@ public CoverageInfo buildCoverage(GridCoverage2DReader reader, String coverageNa
parameters.remove(AbstractGridFormat.READ_GRIDGEOMETRY2D.getName().toString());

cinfo.getDimensions().addAll(getCoverageDimensions(gc.getSampleDimensions()));
String name = gc.getName().toString();
cinfo.setName(name);
cinfo.setNativeCoverageName(coverageName);
cinfo.setTitle(name);
if (specifiedName != null) {
cinfo.setName(specifiedName);
cinfo.setTitle(specifiedName);
cinfo.getKeywords().add(new Keyword(specifiedName));
} else {
String name = gc.getName().toString();
cinfo.setName(name);
cinfo.setTitle(name);
cinfo.getKeywords().add(new Keyword(name));
}
cinfo.setNativeCoverageName(nativeCoverageName);

cinfo.setDescription(new StringBuilder("Generated from ").append(format.getName()).toString());

// keywords
cinfo.getKeywords().add(new Keyword("WCS"));
cinfo.getKeywords().add(new Keyword(format.getName()));
cinfo.getKeywords().add(new Keyword(name));

// native format name
cinfo.setNativeFormat(format.getName());
cinfo.getMetadata().put("dirName", new StringBuilder(store.getName()).append("_").append(name).toString());
cinfo.getMetadata().put("dirName", new StringBuilder(store.getName()).append("_").append(nativeCoverageName).toString());

// request SRS's
if ((gc.getCoordinateReferenceSystem2D().getIdentifiers() != null)
Expand Down
Expand Up @@ -78,18 +78,22 @@ protected String handleObjectPost(Object object) throws Exception {
coverage.setStore( ds );
}
final boolean isNew = isNewCoverage(coverage);
String name = coverage.getNativeCoverageName();
String nativeCoverageName = coverage.getNativeCoverageName();
if (nativeCoverageName == null) {
nativeCoverageName = coverage.getNativeName();
}
CatalogBuilder builder = new CatalogBuilder(catalog);
CoverageStoreInfo store = coverage.getStore();
builder.setStore(store);

// We handle 2 different cases here
if (!isNew) {
// Configuring a partially defined coverage
builder.initCoverage(coverage, name);
builder.initCoverage(coverage, nativeCoverageName);
} else {
// Configuring a brand new coverage (only name has been specified)
coverage = builder.buildCoverage(name);
String specifiedName = coverage.getName();
coverage = builder.buildCoverageByName(nativeCoverageName, specifiedName);
}

NamespaceInfo ns = coverage.getNamespace();
Expand Down
Expand Up @@ -72,8 +72,16 @@ void addCoverageStore(boolean autoConfigureCoverage) throws Exception {

@Test
public void testGetAllByCoverageStore() throws Exception {
removeStore("gs", "usaWorldImage");
String req = "wcs?service=wcs&request=getcoverage&version=1.1.1&identifier=gs:usa" +
"&boundingbox=-100,30,-80,44,EPSG:4326&format=image/tiff" +
"&gridbasecrs=EPSG:4326&store=true";

Document dom = getAsDOM( req );
assertEquals( "ows:ExceptionReport", dom.getDocumentElement().getNodeName());

addCoverageStore(true);
Document dom = getAsDOM( "/rest/workspaces/gs/coveragestores/usaWorldImage/coverages.xml");
dom = getAsDOM( "/rest/workspaces/gs/coveragestores/usaWorldImage/coverages.xml");
assertEquals( 1, dom.getElementsByTagName( "coverage").getLength() );
assertXpathEvaluatesTo( "1", "count(//coverage/name[text()='usa'])", dom );
}
Expand Down Expand Up @@ -289,6 +297,76 @@ public void testPostAsXMLWithNativeName() throws Exception {

}

@Test
public void testPostNewAsXMLWithNativeCoverageName() throws Exception {
removeStore("gs", "usaWorldImage");
String req = "wcs?service=wcs&request=getcoverage&version=1.1.1&identifier=gs:differentName" +
"&boundingbox=-100,30,-80,44,EPSG:4326&format=image/tiff" +
"&gridbasecrs=EPSG:4326&store=true";

Document dom = getAsDOM( req );
assertEquals( "ows:ExceptionReport", dom.getDocumentElement().getNodeName());

addCoverageStore(false);
dom = getAsDOM( "/rest/workspaces/gs/coveragestores/usaWorldImage/coverages.xml");
assertEquals( 0, dom.getElementsByTagName( "coverage").getLength() );

String xml =
"<coverage>" +
"<name>differentName</name>"+
"<nativeCoverageName>usa</nativeCoverageName>"+
"</coverage>";
MockHttpServletResponse response =
postAsServletResponse( "/rest/workspaces/gs/coveragestores/usaWorldImage/coverages/", xml, "text/xml");

assertEquals( 201, response.getStatus() );
assertNotNull( response.getHeader( "Location") );
assertTrue( response.getHeader("Location").endsWith( "/workspaces/gs/coveragestores/usaWorldImage/coverages/differentName" ) );

dom = getAsDOM( req );
assertEquals( "wcs:Coverages", dom.getDocumentElement().getNodeName() );

dom = getAsDOM("/rest/workspaces/gs/coveragestores/usaWorldImage/coverages/differentName.xml");
assertXpathEvaluatesTo("differentName", "/coverage/name", dom);
assertXpathEvaluatesTo("differentName", "/coverage/title", dom);
assertXpathEvaluatesTo("usa", "/coverage/nativeCoverageName", dom);
}

@Test
public void testPostNewAsXMLWithNativeNameFallback() throws Exception {
removeStore("gs", "usaWorldImage");
String req = "wcs?service=wcs&request=getcoverage&version=1.1.1&identifier=gs:differentName" +
"&boundingbox=-100,30,-80,44,EPSG:4326&format=image/tiff" +
"&gridbasecrs=EPSG:4326&store=true";

Document dom = getAsDOM( req );
assertEquals( "ows:ExceptionReport", dom.getDocumentElement().getNodeName());

addCoverageStore(false);
dom = getAsDOM( "/rest/workspaces/gs/coveragestores/usaWorldImage/coverages.xml");
assertEquals( 0, dom.getElementsByTagName( "coverage").getLength() );

String xml =
"<coverage>" +
"<name>differentName</name>"+
"<nativeName>usa</nativeName>"+
"</coverage>";
MockHttpServletResponse response =
postAsServletResponse( "/rest/workspaces/gs/coveragestores/usaWorldImage/coverages/", xml, "text/xml");

assertEquals( 201, response.getStatus() );
assertNotNull( response.getHeader( "Location") );
assertTrue( response.getHeader("Location").endsWith( "/workspaces/gs/coveragestores/usaWorldImage/coverages/differentName" ) );

dom = getAsDOM( req );
assertEquals( "wcs:Coverages", dom.getDocumentElement().getNodeName() );

dom = getAsDOM("/rest/workspaces/gs/coveragestores/usaWorldImage/coverages/differentName.xml");
assertXpathEvaluatesTo("differentName", "/coverage/name", dom);
assertXpathEvaluatesTo("differentName", "/coverage/title", dom);
assertXpathEvaluatesTo("usa", "/coverage/nativeCoverageName", dom);
}

@Test
public void testPutWithCalculation() throws Exception {
String path = "/rest/workspaces/wcs/coveragestores/DEM/coverages/DEM.xml";
Expand Down

0 comments on commit 05d5ec0

Please sign in to comment.