From f106045775ef31b6e349b69df5b22299cc4bded6 Mon Sep 17 00:00:00 2001 From: Fabio Sinibaldi Date: Thu, 17 Mar 2022 17:54:00 +0100 Subject: [PATCH] PostgisIndexer bugfixes --- .../requests/BaseExecutionRequest.java | 3 +- .../cms/plugins/requests/BaseRequest.java | 9 +- .../cms/tests/BasicPluginTest.java | 19 ++- .../plugins/ConcessioniLifeCycleManager.java | 34 +++-- .../document/filesets/GCubeSDILayer.java | 13 +- .../geoportal/common/utils/Files.java | 2 +- .../common/utils/tests/GCubeTest.java | 2 +- .../cms/sdi/engine/PostgisDBManager.java | 17 ++- .../cms/sdi/engine/PostgisDBManagerI.java | 4 +- .../cms/sdi/engine/PostgisIndexer.java | 47 +++---- .../cms/sdi/engine/PostgisTable.java | 1 - .../cms/sdi/engine/SDIManager.java | 23 +--- .../cms/sdi/engine/SDIManagerWrapper.java | 82 ++++-------- .../cms/sdi/model/CrossReferencedLayer.java | 4 + .../cms/sdi/model/GCubeSDILayerBuilder.java | 121 ++++++++++++++++++ .../cms/sdi/plugins/SDIIndexerPlugin.java | 9 ++ .../cms/sdi/plugins/IndexerTest.java | 23 ++++ 17 files changed, 275 insertions(+), 138 deletions(-) create mode 100644 sdi-plugins/src/main/java/org/gcube/application/cms/sdi/model/CrossReferencedLayer.java create mode 100644 sdi-plugins/src/main/java/org/gcube/application/cms/sdi/model/GCubeSDILayerBuilder.java diff --git a/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/requests/BaseExecutionRequest.java b/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/requests/BaseExecutionRequest.java index f148395..493242a 100644 --- a/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/requests/BaseExecutionRequest.java +++ b/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/requests/BaseExecutionRequest.java @@ -21,8 +21,9 @@ public class BaseExecutionRequest extends BaseRequest{ this.document = document; } - public void validate() throws InvalidPluginRequestException { + public BaseExecutionRequest validate() throws InvalidPluginRequestException { super.validate(); if(document==null) throw new InvalidPluginRequestException("Document cannot be null"); + return this; } } diff --git a/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/requests/BaseRequest.java b/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/requests/BaseRequest.java index 23a5fc8..c12d2ae 100644 --- a/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/requests/BaseRequest.java +++ b/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/requests/BaseRequest.java @@ -1,5 +1,6 @@ package org.gcube.application.cms.plugins.requests; +import com.fasterxml.jackson.databind.ser.Serializers; import lombok.*; import org.bson.Document; import org.gcube.application.cms.plugins.faults.InvalidPluginRequestException; @@ -32,8 +33,14 @@ public class BaseRequest { return params.getString(param); } - public void validate() throws InvalidPluginRequestException { + public BaseRequest validate() throws InvalidPluginRequestException { if(useCaseDescriptor ==null)throw new InvalidPluginRequestException("UseCaseDescriptor cannot be null "); + return this; } + public BaseRequest setParameter(String key,Object value){ + if(callParameters==null) callParameters=new Document(); + callParameters.put(key, value); + return this; + } } diff --git a/cms-test-commons/src/main/java/org/gcube/application/cms/tests/BasicPluginTest.java b/cms-test-commons/src/main/java/org/gcube/application/cms/tests/BasicPluginTest.java index b02e997..c310cb3 100644 --- a/cms-test-commons/src/main/java/org/gcube/application/cms/tests/BasicPluginTest.java +++ b/cms-test-commons/src/main/java/org/gcube/application/cms/tests/BasicPluginTest.java @@ -3,19 +3,22 @@ package org.gcube.application.cms.tests; import org.gcube.application.cms.implementations.ISInterface; import org.gcube.application.cms.implementations.ImplementationProvider; import org.gcube.application.cms.plugins.InitializablePlugin; +import org.gcube.application.cms.plugins.LifecycleManager; import org.gcube.application.cms.plugins.Plugin; import org.gcube.application.cms.plugins.PluginsReflections; import org.gcube.application.cms.plugins.faults.InitializationException; import org.gcube.application.cms.plugins.faults.PluginExecutionException; import org.gcube.application.geoportal.common.model.document.accounting.Context; import org.gcube.application.geoportal.common.model.document.accounting.User; +import org.gcube.application.geoportal.common.model.rest.ConfigurationException; import org.gcube.application.geoportal.common.utils.tests.GCubeTest; -import org.junit.Assert; -import org.junit.BeforeClass; +import org.junit.*; import java.util.HashMap; import java.util.Map; +import static org.junit.Assume.assumeTrue; + public class BasicPluginTest { @@ -69,9 +72,15 @@ public class BasicPluginTest { System.out.println("Plugin Loading OK"); - if(GCubeTest.isTestInfrastructureEnabled()){ - - } } + @Before + public void initContext(){ + assumeTrue(GCubeTest.isTestInfrastructureEnabled()); + TokenSetter.set(GCubeTest.getContext()); + } + + + + } diff --git a/concessioni-lifecycle/src/main/java/org/gcube/application/cms/concessioni/plugins/ConcessioniLifeCycleManager.java b/concessioni-lifecycle/src/main/java/org/gcube/application/cms/concessioni/plugins/ConcessioniLifeCycleManager.java index 0e85d5c..fed3961 100644 --- a/concessioni-lifecycle/src/main/java/org/gcube/application/cms/concessioni/plugins/ConcessioniLifeCycleManager.java +++ b/concessioni-lifecycle/src/main/java/org/gcube/application/cms/concessioni/plugins/ConcessioniLifeCycleManager.java @@ -162,9 +162,7 @@ public class ConcessioniLifeCycleManager implements LifecycleManager { IndexDocumentRequest indexRequest = new IndexDocumentRequest(request.getUseCaseDescriptor(),request.getCaller(), request.getContext(),request.getDocument()); - Document callParameters = new Document(); - callParameters.put("workspace",Files.fixFilename("gna_concessioni_"+request.getContext().getId())); - callParameters.put("indexName",Files.fixFilename("gna_concessioni_centroids_"+request.getContext().getId())); + Document callParameters = getPublicIndexParams(request); indexRequest.setCallParameters(callParameters); IndexDocumentReport indexReport = indexerPlugin.index(indexRequest); @@ -254,19 +252,18 @@ public class ConcessioniLifeCycleManager implements LifecycleManager { @Override public Configuration getCurrentConfiguration(BaseRequest req) throws ConfigurationException { Configuration toReturn = new Configuration(); - toReturn.setArchives(new ArrayList<>()); + toReturn.setIndexes(new ArrayList<>()); IndexerPluginInterface indexerPlugin; indexerPlugin = (IndexerPluginInterface) pluginManager.getById("SDI-Indexer-Plugin"); - - Document callParameters = new Document(); - callParameters.put("workspace",Files.fixFilename("gna_concessioni_"+req.getContext())); - callParameters.put("indexName",Files.fixFilename("gna_concessioni_centroids_"+req.getContext())); - - BaseRequest indexRequest = new BaseRequest(req.getUseCaseDescriptor(),req.getCaller(),req.getContext()); - indexRequest.setCallParameters(callParameters); + // Info on Public index + indexRequest.setCallParameters(getPublicIndexParams(req)); + toReturn.getIndexes().add(indexerPlugin.getIndex(indexRequest)); + + // Info on internal_index + indexRequest.setCallParameters(getInternalIndexParams(req)); toReturn.getIndexes().add(indexerPlugin.getIndex(indexRequest)); return toReturn; @@ -278,6 +275,21 @@ public class ConcessioniLifeCycleManager implements LifecycleManager { } + private Document getInternalIndexParams(BaseRequest req){ + Document callParameters = new Document(); + + callParameters.put("workspace",Files.fixFilename(req.getUseCaseDescriptor().getId()+"_internal_"+req.getContext().getName())); + callParameters.put("indexName",Files.fixFilename(req.getUseCaseDescriptor().getId()+"_internal_"+req.getContext().getName()+"_centroids")); + return callParameters; + } + + private Document getPublicIndexParams(BaseRequest req){ + Document callParameters = new Document(); + callParameters.put("workspace",Files.fixFilename(req.getUseCaseDescriptor().getId()+req.getContext().getName())); + callParameters.put("indexName",Files.fixFilename(req.getUseCaseDescriptor().getId()+req.getContext().getName()+"_centroids")); + return callParameters; + } + // STATIC ROUTINES diff --git a/geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/document/filesets/GCubeSDILayer.java b/geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/document/filesets/GCubeSDILayer.java index 7fe5979..2e87129 100644 --- a/geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/document/filesets/GCubeSDILayer.java +++ b/geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/document/filesets/GCubeSDILayer.java @@ -88,17 +88,17 @@ public class GCubeSDILayer extends Materialization{ } @JsonIgnore - public void setMaxX(Double d){this.put(MAX_X,d);} + public BBOX setMaxX(Double d){this.put(MAX_X,d);return this;} @JsonIgnore - public void setMaxY(Double d){this.put(MAX_Y,d);} + public BBOX setMaxY(Double d){this.put(MAX_Y,d);return this;} @JsonIgnore - public void setMaxZ(Double d){this.put(MAX_Z,d);} + public BBOX setMaxZ(Double d){this.put(MAX_Z,d);return this;} @JsonIgnore - public void setMinX(Double d){this.put(MIN_X,d);} + public BBOX setMinX(Double d){this.put(MIN_X,d);return this;} @JsonIgnore - public void setMinY(Double d){this.put(MIN_Y,d);} + public BBOX setMinY(Double d){this.put(MIN_Y,d);return this;} @JsonIgnore - public void setMinZ(Double d){this.put(MIN_Z,d);} + public BBOX setMinZ(Double d){this.put(MIN_Z,d);return this;} @JsonIgnore public Double getMinY(){return (Double) this.getOrDefault(MIN_Y,-90d);} @JsonIgnore @@ -135,4 +135,5 @@ public class GCubeSDILayer extends Materialization{ @JsonIgnore public List getPlatformInfo(){return this.get(PLATFORM_INFO,List.class);} + } diff --git a/geoportal-common/src/main/java/org/gcube/application/geoportal/common/utils/Files.java b/geoportal-common/src/main/java/org/gcube/application/geoportal/common/utils/Files.java index a8145e6..e0d016f 100644 --- a/geoportal-common/src/main/java/org/gcube/application/geoportal/common/utils/Files.java +++ b/geoportal-common/src/main/java/org/gcube/application/geoportal/common/utils/Files.java @@ -96,6 +96,6 @@ public class Files { toFix=toFix.substring(0,toFix.indexOf(".")); } return toFix.toLowerCase(). - replaceAll("[\\*\\+\\/\\\\ \\[\\]\\(\\)\\.\\\"\\:\\;\\|\\=]","_")+extension; + replaceAll("[\\-\\*\\+\\/\\\\ \\[\\]\\(\\)\\.\\\"\\:\\;\\|\\=]","_")+extension; } } diff --git a/geoportal-common/src/main/java/org/gcube/application/geoportal/common/utils/tests/GCubeTest.java b/geoportal-common/src/main/java/org/gcube/application/geoportal/common/utils/tests/GCubeTest.java index 9873b40..5abada9 100644 --- a/geoportal-common/src/main/java/org/gcube/application/geoportal/common/utils/tests/GCubeTest.java +++ b/geoportal-common/src/main/java/org/gcube/application/geoportal/common/utils/tests/GCubeTest.java @@ -12,7 +12,7 @@ public class GCubeTest { //testContext = "/pred4s/preprod/preVRE"; - //testContext = "/gcube/devsec/devVRE"; + testContext = "/gcube/devsec/devVRE"; System.out.println("TEST CONTEXT = "+testContext); diff --git a/sdi-plugins/src/main/java/org/gcube/application/cms/sdi/engine/PostgisDBManager.java b/sdi-plugins/src/main/java/org/gcube/application/cms/sdi/engine/PostgisDBManager.java index bb1becc..0e7b3d2 100644 --- a/sdi-plugins/src/main/java/org/gcube/application/cms/sdi/engine/PostgisDBManager.java +++ b/sdi-plugins/src/main/java/org/gcube/application/cms/sdi/engine/PostgisDBManager.java @@ -101,11 +101,18 @@ public class PostgisDBManager implements PostgisDBManagerI { conn.createStatement().executeUpdate("TRUNCATE Table "+tableName); } -// @Override -// public ResultSet queryAll(PostgisTable table) throws SQLException { -// // TODO Check schema -// return conn.createStatement().executeQuery("Select * from "+table.getTablename()); -// } + @Override + public ResultSet queryAll(PostgisTable table) throws SQLException { + // TODO Check schema + return conn.createStatement().executeQuery("Select * from "+table.getTablename()); + } + + @Override + public long count(PostgisTable table) throws SQLException { + ResultSet rs = conn.createStatement().executeQuery("Select count(*) from "+table.getTablename()); + rs.next(); + return rs.getLong(1); + } // *********************** INNER UTILS CLASS diff --git a/sdi-plugins/src/main/java/org/gcube/application/cms/sdi/engine/PostgisDBManagerI.java b/sdi-plugins/src/main/java/org/gcube/application/cms/sdi/engine/PostgisDBManagerI.java index 6cb64af..7fecb74 100644 --- a/sdi-plugins/src/main/java/org/gcube/application/cms/sdi/engine/PostgisDBManagerI.java +++ b/sdi-plugins/src/main/java/org/gcube/application/cms/sdi/engine/PostgisDBManagerI.java @@ -24,7 +24,7 @@ public interface PostgisDBManagerI { void truncate(String tableName) throws SQLException; int deleteByFieldValue(PostgisTable target, PostgisTable.Field field, Object value) throws SQLException; - + long count(PostgisTable table)throws SQLException; // DatabaseConnection getConnectionDescriptor(); @@ -32,7 +32,7 @@ public interface PostgisDBManagerI { // PostgisTable.POINT evaluateCentroid(PostgisTable table) throws SQLException, DataParsingException; -// ResultSet queryAll(PostgisTable table) throws SQLException; + ResultSet queryAll(PostgisTable table) throws SQLException; } diff --git a/sdi-plugins/src/main/java/org/gcube/application/cms/sdi/engine/PostgisIndexer.java b/sdi-plugins/src/main/java/org/gcube/application/cms/sdi/engine/PostgisIndexer.java index cff2374..4e41268 100644 --- a/sdi-plugins/src/main/java/org/gcube/application/cms/sdi/engine/PostgisIndexer.java +++ b/sdi-plugins/src/main/java/org/gcube/application/cms/sdi/engine/PostgisIndexer.java @@ -5,7 +5,9 @@ import lombok.extern.slf4j.Slf4j; import org.bson.Document; import org.gcube.application.cms.plugins.requests.BaseRequest; import org.gcube.application.cms.sdi.faults.SDIInteractionException; +import org.gcube.application.cms.sdi.model.CrossReferencedLayer; import org.gcube.application.geoportal.common.model.configuration.Index; +import org.gcube.application.geoportal.common.model.document.filesets.GCubeSDILayer; import org.gcube.application.geoportal.common.model.legacy.SDILayerDescriptor; import org.gcube.application.geoportal.common.model.useCaseDescriptor.UseCaseDescriptor; import org.gcube.application.geoportal.common.model.rest.DatabaseConnection; @@ -22,6 +24,10 @@ import java.util.List; public class PostgisIndexer { + + public static final String INDEX_TYPE="GIS-CENTROIDS"; + + public static void init() throws ClassNotFoundException { Class.forName("org.postgresql.Driver"); @@ -38,6 +44,12 @@ public class PostgisIndexer { DatabaseConnection connectionParameters; PostgisDBManagerI dbManager=null; + PostgisTable table = null; + GCubeSDILayer indexLayer = null; + String indexName = null; + + private List crossReferenceableLayers= new ArrayList<>(); + public PostgisIndexer(SDIManagerWrapper manager, UseCaseDescriptor useCaseDescriptor, DatabaseConnection postgisConnection) throws SQLException { @@ -52,13 +64,7 @@ public class PostgisIndexer { } - PostgisTable table = null; - private String storeName = null; - private String workspace = null; - private SDILayerDescriptor indexLayer = null; - - private List crossReferenceableLayers= new ArrayList<>(); public void initIndex(String indexName, List fields, String workspace,String storeName) throws SQLException, SDIInteractionException { @@ -70,31 +76,28 @@ public class PostgisIndexer { dbManager.create(table); log.debug("Checking/ registering index layer in GS "); - String wmsUrl=manager.configureCentroidLayer(indexName,workspace,storeName,table,connectionParameters); - - + indexName = indexName; + indexLayer = manager.configureCentroidLayer(indexName,workspace,storeName,table,connectionParameters); // TODO Additional layers // Create layer - // Publish cross related layers + // register cross related layers } - - HashMap wmsUrls=new HashMap<>(); - - //private String wmsByIndex(String indexName){} + HashMap crossReferenced = new HashMap<>(); public Index getIndexConfiguration(){ - Index toReturn = new Index("GIS-CENTROIDS"); + Index toReturn = new Index(INDEX_TYPE); // SDI Layers - - - - // cross reference info - - - toReturn.put("",null); + toReturn.put("layer",indexLayer); + toReturn.put("indexName",indexName); + try { + toReturn.put("records", dbManager.count(table)); + }catch (SQLException e) { + log.warn("Unable to count records for index " + indexName, e); + } + toReturn.put("crossReferencedLayers",crossReferenced); return toReturn; } diff --git a/sdi-plugins/src/main/java/org/gcube/application/cms/sdi/engine/PostgisTable.java b/sdi-plugins/src/main/java/org/gcube/application/cms/sdi/engine/PostgisTable.java index d20c121..4cf50c5 100644 --- a/sdi-plugins/src/main/java/org/gcube/application/cms/sdi/engine/PostgisTable.java +++ b/sdi-plugins/src/main/java/org/gcube/application/cms/sdi/engine/PostgisTable.java @@ -113,7 +113,6 @@ public class PostgisTable { return null; } - @NonNull private String tablename; diff --git a/sdi-plugins/src/main/java/org/gcube/application/cms/sdi/engine/SDIManager.java b/sdi-plugins/src/main/java/org/gcube/application/cms/sdi/engine/SDIManager.java index bab626f..24fa9e5 100644 --- a/sdi-plugins/src/main/java/org/gcube/application/cms/sdi/engine/SDIManager.java +++ b/sdi-plugins/src/main/java/org/gcube/application/cms/sdi/engine/SDIManager.java @@ -1,38 +1,22 @@ package org.gcube.application.cms.sdi.engine; -import it.geosolutions.geoserver.rest.GeoServerRESTPublisher; -import it.geosolutions.geoserver.rest.GeoServerRESTReader; -import it.geosolutions.geoserver.rest.decoder.RESTFeatureType; -import it.geosolutions.geoserver.rest.decoder.RESTLayer; + import it.geosolutions.geoserver.rest.encoder.datastore.GSPostGISDatastoreEncoder; import lombok.Getter; import lombok.extern.slf4j.Slf4j; -import org.bson.Document; import org.gcube.application.cms.sdi.faults.SDIInteractionException; -import org.gcube.application.cms.plugins.requests.BaseExecutionRequest; import org.gcube.application.cms.serialization.Serialization; -import org.gcube.application.geoportal.common.model.document.filesets.GCubeSDILayer; - import org.gcube.application.geoportal.common.model.document.filesets.RegisteredFile; import org.gcube.application.geoportal.common.model.document.filesets.RegisteredFileSet; - import org.gcube.application.geoportal.common.model.rest.DatabaseConnection; import org.gcube.application.geoportal.common.utils.Files; - - - import org.gcube.data.transfer.library.DataTransferClient; -import org.gcube.data.transfer.library.TransferResult; -import org.gcube.data.transfer.model.Destination; -import org.gcube.data.transfer.model.DestinationClashPolicy; import org.gcube.spatial.data.gis.GISInterface; import org.gcube.spatial.data.gis.is.AbstractGeoServerDescriptor; import java.io.File; import java.net.MalformedURLException; import java.net.URL; -import java.util.ArrayList; -import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -40,11 +24,6 @@ import java.util.regex.Pattern; public class SDIManager { - static protected final String EPSG_4326="EPSG:4326"; - static final String WGS84_FULL="GEOGCS[\"WGS 84\", DATUM[\"World Geodetic System 1984\", SPHEROID[\"WGS 84\", 6378137.0, 298.257223563, AUTHORITY[\"EPSG\",\"7030\"]],"+ - "AUTHORITY[\"EPSG\",\"6326\"]], PRIMEM[\"Greenwich\", 0.0, AUTHORITY[\"EPSG\",\"8901\"]], UNIT[\"degree\", 0.017453292519943295],"+ - "AXIS[\"Geodetic longitude\", EAST], AXIS[\"Geodetic latitude\", NORTH], AUTHORITY[\"EPSG\",\"4326\"]]"; - public static final Pattern HOSTNAME_PATTERN=Pattern.compile("(?<=\\:\\/\\/)[^\\:]*"); public static final Pattern PORT_PATTERN=Pattern.compile("(?<=\\:)[\\d]+"); diff --git a/sdi-plugins/src/main/java/org/gcube/application/cms/sdi/engine/SDIManagerWrapper.java b/sdi-plugins/src/main/java/org/gcube/application/cms/sdi/engine/SDIManagerWrapper.java index 92044ff..3d674d0 100644 --- a/sdi-plugins/src/main/java/org/gcube/application/cms/sdi/engine/SDIManagerWrapper.java +++ b/sdi-plugins/src/main/java/org/gcube/application/cms/sdi/engine/SDIManagerWrapper.java @@ -11,6 +11,7 @@ import org.bson.Document; import org.gcube.application.cms.caches.AbstractScopedMap; import org.gcube.application.cms.plugins.requests.BaseExecutionRequest; import org.gcube.application.cms.sdi.faults.SDIInteractionException; +import org.gcube.application.cms.sdi.model.GCubeSDILayerBuilder; import org.gcube.application.cms.serialization.Serialization; import org.gcube.application.geoportal.common.model.document.filesets.GCubeSDILayer; import org.gcube.application.geoportal.common.model.document.filesets.RegisteredFile; @@ -28,6 +29,9 @@ import java.net.URL; import java.util.ArrayList; import java.util.List; +import static org.gcube.application.cms.sdi.model.GCubeSDILayerBuilder.EPSG_4326; +import static org.gcube.application.cms.sdi.model.GCubeSDILayerBuilder.WGS84_FULL; + @Slf4j public class SDIManagerWrapper extends SDIManager{ @@ -60,9 +64,10 @@ public class SDIManagerWrapper extends SDIManager{ if (fileSet.getPayloads().isEmpty()) throw new SDIInteractionException("No payload to materialize"); - Document geoserverInfo = new Document(); - geoserverInfo.put("_type", "Geoserver"); - geoserverInfo.put("workspace", workspace); + // Document geoserverInfo = new Document(); + GCubeSDILayerBuilder layerBuilder=new GCubeSDILayerBuilder(); + layerBuilder.setWorkspace(workspace); + layerBuilder.setHost(getGeoserverHostName()); // Evaluate Layer Name @@ -77,13 +82,13 @@ public class SDIManagerWrapper extends SDIManager{ toSetLayerName = baseName + "_" + count; log.debug("layer for " + baseName + " already existing, trying " + toSetLayerName); } - geoserverInfo.put("layerName", toSetLayerName); log.debug("Layer name will be {}", toSetLayerName); + layerBuilder.setLayerName(toSetLayerName); String folderRelativePath = basePersistencePAth + "/" + documentID + "/" + fileSet.getUUID() + "/" + toSetLayerName; log.debug("GS Relative destination path is {}", folderRelativePath); - geoserverInfo.put("persistencePath", folderRelativePath); + layerBuilder.setPersistencePath(folderRelativePath); List filenames = new ArrayList<>(); @@ -114,11 +119,12 @@ public class SDIManagerWrapper extends SDIManager{ //geoserverInfo.put(""result.getRemotePath().substring(0, result.getRemotePath().lastIndexOf("/"))); absolutePath = result.getRemotePath().substring(0, result.getRemotePath().lastIndexOf("/")); } - geoserverInfo.put("files", filenames); + + layerBuilder.setFiles(filenames); // Publishing layer in GS String storeName = toSetLayerName + "_store"; - geoserverInfo.put("storeName", storeName); + layerBuilder.setStoreName(storeName); GeoServerRESTPublisher publisher = getCurrentGeoserver().getPublisher(); log.debug("Trying to create remote workspace : " + workspace); @@ -150,35 +156,7 @@ public class SDIManagerWrapper extends SDIManager{ RESTFeatureType f = gsReader.getFeatureType(l); - List ogcLinks = new ArrayList<>(); - - Document wmsLink = new Document(); - wmsLink.put("wms", String.format("https://%1$s/geoserver/%2$s/wms?" - + "service=WMS&version=1.1.0&request=GetMap&layers=%2$s:%3$s&" - + "styles=&bbox=%4$f,%5$f,%6$f,%7$f&srs=%8$s&format=application/openlayers&width=%9$d&height=%10$d", - getGeoserverHostName(), - workspace, - toSetLayerName, - f.getMinX(), - f.getMinY(), - f.getMaxX(), - f.getMaxY(), - EPSG_4326, - 400, - 400)); - ogcLinks.add(wmsLink); - - List platformInfo = new ArrayList<>(); - platformInfo.add(geoserverInfo); - // TODO Metadata - - - // Materialization object - GCubeSDILayer materialization = new GCubeSDILayer(); - materialization.put(GCubeSDILayer.OGC_LINKS, ogcLinks); - materialization.put(GCubeSDILayer.B_BOX, new GCubeSDILayer.BBOX(f.getMaxX(), f.getMaxY(), f.getMinX(), f.getMinY())); - materialization.put(GCubeSDILayer.PLATFORM_INFO, platformInfo); - + GCubeSDILayer materialization = layerBuilder.getLayer(); log.info("Generated Materialization {}", materialization); //Add Materialization to registered file set @@ -196,7 +174,12 @@ public class SDIManagerWrapper extends SDIManager{ } - public String configureCentroidLayer(String name, String workspace, String storeName, PostgisTable table, DatabaseConnection connection) throws SDIInteractionException { + public GCubeSDILayer configureCentroidLayer(String name, String workspace, String storeName, PostgisTable table, DatabaseConnection connection) throws SDIInteractionException { + + GCubeSDILayerBuilder builder = new GCubeSDILayerBuilder() + .setWorkspace(workspace) + .setStoreName(storeName) + .setHost(getGeoserverHostName()); GSFeatureTypeEncoder fte=new GSFeatureTypeEncoder(); fte.setAbstract("Centroid layer for "+name); @@ -205,11 +188,6 @@ public class SDIManagerWrapper extends SDIManager{ fte.setTitle(name); fte.setName(name); - - // GeoServer loads all fields -// fte.setAttribute(attrs); - - fte.setLatLonBoundingBox(-180.0, -90.0, 180.0, 90.0, WGS84_FULL); String style="clustered_centroids"; @@ -233,25 +211,9 @@ public class SDIManagerWrapper extends SDIManager{ log.debug("layer "+name+" already exists"); - String link=String.format("https://%1$s/geoserver/%2$s/wms?" - +"service=WMS&version=1.1.0&request=GetMap&layers=%2$s:%3$s&" - + "styles=&bbox=%4$s,%5$s,%6$s,%7$s&srs=%8$s&format=application/openlayers&width=%9$d&height=%10$d", - getGeoserverHostName(), - workspace, - name, - "-1563071.166172796", - "4789738.204048398", - "4334926.486925308", - "5828118.072551585", - EPSG_4326, - 400, - 400); - - return name; + return builder.getLayer(); } catch (IllegalArgumentException | MalformedURLException e) { throw new SDIInteractionException("Unable to create layer "+name,e); } - - - } + } } diff --git a/sdi-plugins/src/main/java/org/gcube/application/cms/sdi/model/CrossReferencedLayer.java b/sdi-plugins/src/main/java/org/gcube/application/cms/sdi/model/CrossReferencedLayer.java new file mode 100644 index 0000000..439f563 --- /dev/null +++ b/sdi-plugins/src/main/java/org/gcube/application/cms/sdi/model/CrossReferencedLayer.java @@ -0,0 +1,4 @@ +package org.gcube.application.cms.sdi.model; + +public class CrossReferencedLayer { +} diff --git a/sdi-plugins/src/main/java/org/gcube/application/cms/sdi/model/GCubeSDILayerBuilder.java b/sdi-plugins/src/main/java/org/gcube/application/cms/sdi/model/GCubeSDILayerBuilder.java new file mode 100644 index 0000000..5875466 --- /dev/null +++ b/sdi-plugins/src/main/java/org/gcube/application/cms/sdi/model/GCubeSDILayerBuilder.java @@ -0,0 +1,121 @@ +package org.gcube.application.cms.sdi.model; + +import freemarker.core.PlainTextOutputFormat; +import lombok.Getter; +import org.bson.Document; +import org.gcube.application.geoportal.common.model.document.filesets.GCubeSDILayer; +import sun.misc.GC; + +import javax.print.Doc; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class GCubeSDILayerBuilder { + + public static enum OGC_TYPE{ + wms,wfs,wcs,csw + } + + + public static final String EPSG_4326="EPSG:4326"; + public static final String WGS84_FULL="GEOGCS[\"WGS 84\", DATUM[\"World Geodetic System 1984\", SPHEROID[\"WGS 84\", 6378137.0, 298.257223563, AUTHORITY[\"EPSG\",\"7030\"]],"+ + "AUTHORITY[\"EPSG\",\"6326\"]], PRIMEM[\"Greenwich\", 0.0, AUTHORITY[\"EPSG\",\"8901\"]], UNIT[\"degree\", 0.017453292519943295],"+ + "AXIS[\"Geodetic longitude\", EAST], AXIS[\"Geodetic latitude\", NORTH], AUTHORITY[\"EPSG\",\"4326\"]]"; + + + + public static final String GS_PLATFORM="Geoserver"; + + + GCubeSDILayer theObject = new GCubeSDILayer(); + + @Getter + Document platformInfo= new Document(GCubeSDILayer.PLATFORM_INFO,GS_PLATFORM); + + @Getter + GCubeSDILayer.BBOX bbox = GCubeSDILayer.BBOX.WORLD; + + @Getter + Map ogcLinks = new HashMap<>(); + + public GCubeSDILayerBuilder(){ + + } + + + public GCubeSDILayer getLayer(){ + theObject.put(GCubeSDILayer.PLATFORM_INFO,platformInfo); + theObject.put(GCubeSDILayer.B_BOX,bbox); + + prepareOGCLinks(); + theObject.put(GCubeSDILayer.OGC_LINKS,ogcLinks); + return theObject; + } + + + // @@@@@@@@@@@@@@@@@@ Platform info + public GCubeSDILayerBuilder setWorkspace(String ws){ + platformInfo.put("workspace",ws); + return this; + } + + public GCubeSDILayerBuilder setHost(String ws){ + platformInfo.put("host",ws); + return this; + } + + public GCubeSDILayerBuilder setEngineVersion(String ws){ + platformInfo.put("engineVersion",ws); + return this; + } + + public GCubeSDILayerBuilder setLayerName(String ws){ + platformInfo.put("layerName",ws); + return this; + } + + public GCubeSDILayerBuilder setPersistencePath(String ws){ + platformInfo.put("persistencePath",ws); + return this; + } + + public GCubeSDILayerBuilder setStoreName(String ws){ + platformInfo.put("storeName",ws); + return this; + } + + public GCubeSDILayerBuilder setFiles(List ws){ + platformInfo.put("files",ws); + return this; + } + + + private void prepareOGCLinks(){ + if(!ogcLinks.containsKey(OGC_TYPE.wms)){ + addLink(OGC_TYPE.wms,String.format("https://%1$s/geoserver/%2$s/wms?" + + "service=WMS&version=1.1.0&request=GetMap&layers=%2$s:%3$s&" + + "styles=&bbox=%4$f,%5$f,%6$f,%7$f&srs=%8$s&format=application/openlayers&width=%9$d&height=%10$d", + platformInfo.get("host"), + platformInfo.get("workspace"), + platformInfo.get("layerName"), + bbox.getMinX(), + bbox.getMinY(), + bbox.getMaxX(), + bbox.getMaxY(), + EPSG_4326, + 400, + 400)); + } + } + + //@@@@@@@@@@@@@@@@@@@@@@@@@@@@ OGC + public GCubeSDILayerBuilder addLink(OGC_TYPE type,String link){ + ogcLinks.put(type,new Document(type.name(),link)); + return this; + } + //@@@@@@@@@@@@@@@@@@@@@@@@@@@@ BBOX + + +} diff --git a/sdi-plugins/src/main/java/org/gcube/application/cms/sdi/plugins/SDIIndexerPlugin.java b/sdi-plugins/src/main/java/org/gcube/application/cms/sdi/plugins/SDIIndexerPlugin.java index b9cef6e..fec02da 100644 --- a/sdi-plugins/src/main/java/org/gcube/application/cms/sdi/plugins/SDIIndexerPlugin.java +++ b/sdi-plugins/src/main/java/org/gcube/application/cms/sdi/plugins/SDIIndexerPlugin.java @@ -215,6 +215,15 @@ public class SDIIndexerPlugin extends SDIAbstractPlugin implements IndexerPlugin } } + /** + * Expected parameters : + * workspace + * indexName + * + * @param request + * @return + * @throws ConfigurationException + */ @Override public Index getIndex(BaseRequest request) throws ConfigurationException { try { diff --git a/sdi-plugins/src/test/java/org/gcube/application/cms/sdi/plugins/IndexerTest.java b/sdi-plugins/src/test/java/org/gcube/application/cms/sdi/plugins/IndexerTest.java index 3ef9792..e34a443 100644 --- a/sdi-plugins/src/test/java/org/gcube/application/cms/sdi/plugins/IndexerTest.java +++ b/sdi-plugins/src/test/java/org/gcube/application/cms/sdi/plugins/IndexerTest.java @@ -6,18 +6,27 @@ import org.gcube.application.cms.plugins.IndexerPluginInterface; import org.gcube.application.cms.plugins.faults.PluginExecutionException; import org.gcube.application.cms.plugins.reports.IndexDocumentReport; import org.gcube.application.cms.plugins.reports.Report; +import org.gcube.application.cms.plugins.requests.BaseRequest; import org.gcube.application.cms.plugins.requests.IndexDocumentRequest; +import org.gcube.application.cms.sdi.engine.PostgisIndexer; +import org.gcube.application.cms.sdi.plugins.SDIIndexerPlugin; import org.gcube.application.cms.serialization.Serialization; import org.gcube.application.cms.tests.BasicPluginTest; import org.gcube.application.cms.tests.TestDocuments; import org.gcube.application.cms.tests.TestProfiles; +import org.gcube.application.geoportal.common.model.configuration.Index; import org.gcube.application.geoportal.common.model.document.Project; import org.gcube.application.geoportal.common.model.document.accounting.Context; import org.gcube.application.geoportal.common.model.document.accounting.User; +import org.gcube.application.geoportal.common.model.rest.ConfigurationException; +import org.gcube.application.geoportal.common.model.useCaseDescriptor.UseCaseDescriptor; +import org.gcube.application.geoportal.common.utils.Files; import org.gcube.application.geoportal.common.utils.tests.GCubeTest; import org.gcube.spatial.data.geonetwork.utils.UserUtils; import org.junit.Test; +import ucar.units.Base; +import static junit.framework.TestCase.assertEquals; import static junit.framework.TestCase.assertTrue; import static org.junit.Assume.assumeTrue; @@ -47,4 +56,18 @@ public class IndexerTest extends BasicPluginTest { assertTrue(response.prepareResult().getSpatialReference()!=null); } + + @Test + public void getIndex() throws ConfigurationException { + assumeTrue(GCubeTest.isTestInfrastructureEnabled()); + IndexerPluginInterface plugin = (IndexerPluginInterface) plugins.get(SDIIndexerPlugin.DESCRIPTOR.getId()); + UseCaseDescriptor descriptor=TestProfiles.profiles.get("profiledConcessioni"); + + Index index = plugin.getIndex(new BaseRequest(descriptor,getTestUser(),getTestContext()) + .setParameter("workspace", Files.fixFilename(GCubeTest.getContext()+"_test-ws")) + .setParameter("indexName",Files.fixFilename(GCubeTest.getContext()+"test_index"))); + System.out.println("Test Index Is "+index); + assertEquals(index.getType(), PostgisIndexer.INDEX_TYPE); + } + }