diff --git a/geoportal-client/src/main/java/org/gcube/application/geoportal/client/DefaultMongoConcessioni.java b/geoportal-client/src/main/java/org/gcube/application/geoportal/client/DefaultMongoConcessioni.java index b4fce3d..eea5663 100644 --- a/geoportal-client/src/main/java/org/gcube/application/geoportal/client/DefaultMongoConcessioni.java +++ b/geoportal-client/src/main/java/org/gcube/application/geoportal/client/DefaultMongoConcessioni.java @@ -207,6 +207,9 @@ public class DefaultMongoConcessioni implements MongoConcessioni{ } + + + protected static T check(Response resp, Class clazz) throws IOException { String resString=resp.readEntity(String.class); if(resp.getStatus()<200||resp.getStatus()>=300) diff --git a/geoportal-client/src/main/java/org/gcube/application/geoportal/client/utils/ConcessioniUtils.java b/geoportal-client/src/main/java/org/gcube/application/geoportal/client/utils/ConcessioniUtils.java new file mode 100644 index 0000000..df3eb99 --- /dev/null +++ b/geoportal-client/src/main/java/org/gcube/application/geoportal/client/utils/ConcessioniUtils.java @@ -0,0 +1,132 @@ +package org.gcube.application.geoportal.client.utils; + +import com.sun.corba.se.spi.orbutil.threadpool.Work; +import lombok.extern.slf4j.Slf4j; +import org.gcube.application.geoportal.common.model.legacy.*; +import org.gcube.application.geoportal.common.model.rest.AddSectionToConcessioneRequest; +import org.gcube.application.geoportal.common.rest.MongoConcessioni; +import org.gcube.application.geoportal.common.rest.TempFile; +import org.gcube.application.geoportal.common.utils.StorageUtils; + +import java.io.IOException; +import java.net.MalformedURLException; +import java.net.URL; +import java.util.ArrayList; + +@Slf4j +public class ConcessioniUtils { + + public static final Concessione clone(MongoConcessioni client,String toCloneId) throws Exception { + StorageUtils storage=new StorageUtils(); + log.info("Cloning {}",toCloneId); + Concessione src = client.getById(toCloneId); + // copy + Concessione copied = Serialization.read(Serialization.write(src),Concessione.class); + // cleanup + copied.setMongo_id(null); + copied.setLastUpdateTime(null); + copied.setLastUpdateUser(null); + copied.setFolderId(null); + copied.setReport(null); + copied.setCreationTime(null); + copied.setCreationUser(null); + copied.setId(0); + copied.setVersion("1.0.0"); + + copied.setRelazioneScavo(null); + copied.setAbstractRelazione(null); + copied.setPosizionamentoScavo(null); + copied.setImmaginiRappresentative(null); + copied.setPianteFineScavo(null); + + + copied = client.createNew(copied); + + + //Handle Files + + copied.setRelazioneScavo(clean(src.getRelazioneScavo())); + copied=client.replace(copied); + AddSectionToConcessioneRequest req=asCopyRequest(src.getRelazioneScavo(),storage); + if(req.getStreams()!=null&&!req.getStreams().isEmpty()) + copied=client.registerFileSet(copied.getMongo_id(),req); + + copied.setAbstractRelazione(clean(src.getAbstractRelazione())); + copied=client.replace(copied); + req=asCopyRequest(src.getAbstractRelazione(),storage); + if(req.getStreams()!=null&&!req.getStreams().isEmpty()) + copied=client.registerFileSet(copied.getMongo_id(),req); + + + copied.setPosizionamentoScavo(clean(src.getPosizionamentoScavo())); + copied=client.replace(copied); + req=asCopyRequest(src.getPosizionamentoScavo(),storage); + if(req.getStreams()!=null&&!req.getStreams().isEmpty()) + copied=client.registerFileSet(copied.getMongo_id(),req); + + if(src.getImmaginiRappresentative()!=null&&src.getImmaginiRappresentative().size()>0) { + copied.setImmaginiRappresentative(new ArrayList<>()); + for (int i = 0; i < src.getImmaginiRappresentative().size(); i++) { + copied.getImmaginiRappresentative().add(clean(src.getImmaginiRappresentative().get(i))); + copied=client.replace(copied); + req=asCopyRequest(src.getImmaginiRappresentative().get(i),storage); + req.setDestinationPath(Concessione.Paths.imgByIndex(i)); + if(req.getStreams()!=null&&!req.getStreams().isEmpty()) + copied=client.registerFileSet(copied.getMongo_id(),req); + } + } + + if(src.getPianteFineScavo()!=null&&src.getPianteFineScavo().size()>0) { + copied.setPianteFineScavo(new ArrayList<>()); + for (int i = 0; i < src.getPianteFineScavo().size(); i++) { + copied.getPianteFineScavo().add(clean(src.getPianteFineScavo().get(i))); + copied=client.replace(copied); + req=asCopyRequest(src.getPianteFineScavo().get(i),storage); + req.setDestinationPath(Concessione.Paths.imgByIndex(i)); + if(req.getStreams()!=null&&!req.getStreams().isEmpty()) + copied=client.registerFileSet(copied.getMongo_id(),req); + } + } + + log.info("Cloned {} into {} ",src.getMongo_id(),copied.getMongo_id()); + return copied; + } + + private static AddSectionToConcessioneRequest asCopyRequest(T content, StorageUtils storage) throws IOException { + AddSectionToConcessioneRequest request = new AddSectionToConcessioneRequest(); + request.setStreams(new ArrayList<>()); + if(content.getActualContent()!=null) { + for (PersistedContent persistedContent : content.getActualContent()) { + if (persistedContent instanceof WorkspaceContent) { + WorkspaceContent wc = (WorkspaceContent) persistedContent; + request.getStreams().add(storage.putOntoStorage(new URL(wc.getLink()).openStream(), wc.getName())); + } + } + } + + String path = null; + if(content instanceof LayerConcessione) path = Concessione.Paths.POSIZIONAMENTO; + else if (content instanceof RelazioneScavo) path = Concessione.Paths.RELAZIONE; + else if (content instanceof AbstractRelazione) path = Concessione.Paths.ABSTRACT_RELAZIONE; + request.setDestinationPath(path); + return request; + } + + private static T clean(T content) throws IOException { + T toReturn = (T) Serialization.read(Serialization.write(content),content.getClass()); + toReturn.setMongo_id(null); + toReturn.setCreationTime(null); + toReturn.setId(0); + toReturn.setActualContent(new ArrayList<>()); + + if(content instanceof LayerConcessione) { + ((LayerConcessione)toReturn).setLayerName(null); + ((LayerConcessione)toReturn).setLayerID(null); + ((LayerConcessione)toReturn).setBbox(null); + ((LayerConcessione)toReturn).setLayerUUID(null); + ((LayerConcessione)toReturn).setWorkspace(null); + ((LayerConcessione)toReturn).setWmsLink(null); + } + return toReturn; + } +} diff --git a/geoportal-client/src/test/java/org/gcube/application/geoportal/clients/legacy/StatelessClientTests.java b/geoportal-client/src/test/java/org/gcube/application/geoportal/clients/legacy/StatelessClientTests.java index f6ac25e..778ac88 100644 --- a/geoportal-client/src/test/java/org/gcube/application/geoportal/clients/legacy/StatelessClientTests.java +++ b/geoportal-client/src/test/java/org/gcube/application/geoportal/clients/legacy/StatelessClientTests.java @@ -3,6 +3,7 @@ package org.gcube.application.geoportal.clients.legacy; import org.gcube.application.cms.tests.model.concessioni.TestConcessioniFilters; import org.gcube.application.cms.tests.model.concessioni.TestConcessioniModel; import org.gcube.application.cms.tests.model.concessioni.TestConcessioniQueries; +import org.gcube.application.geoportal.client.utils.ConcessioniUtils; import org.gcube.application.geoportal.client.utils.Queries; import org.gcube.application.geoportal.client.utils.Serialization; import org.gcube.application.geoportal.clients.BasicVreTests; @@ -105,6 +106,20 @@ public class StatelessClientTests extends BasicVreTests { assertNotNull(c.getMongo_id()); } + + + @Test + public void testClone() throws Exception { + Concessione c= prepare(); + Concessione copied = ConcessioniUtils.clone(client,c.getMongo_id()); + assertEquals(copied.getNome(),c.getNome()); + assertEquals(copied.getPianteFineScavo().size(),c.getPianteFineScavo().size()); + } + + + + + @Test public void testReplace() throws Exception { assumeTrue(GCubeTest.isTestInfrastructureEnabled()); diff --git a/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/postgis/PostgisDBManager.java b/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/postgis/PostgisDBManager.java index 7447978..5184e1d 100644 --- a/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/postgis/PostgisDBManager.java +++ b/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/postgis/PostgisDBManager.java @@ -2,13 +2,13 @@ package org.gcube.application.geoportal.service.engine.postgis; import lombok.Synchronized; import lombok.extern.slf4j.Slf4j; -import org.gcube.application.cms.implementations.ISInterface; import org.gcube.application.geoportal.common.model.legacy.BBOX; import org.gcube.application.geoportal.common.model.rest.DatabaseConnection; -import org.gcube.application.cms.implementations.ImplementationProvider; +import org.gcube.application.geoportal.service.engine.ImplementationProvider; import org.gcube.application.geoportal.service.model.internal.db.PostgisTable; -import org.gcube.application.geoportal.common.model.rest.ConfigurationException; +import org.gcube.application.geoportal.service.model.internal.faults.ConfigurationException; import org.gcube.application.geoportal.service.model.internal.faults.DataParsingException; +import org.gcube.application.geoportal.service.utils.ISUtils; import java.sql.*; import java.util.regex.Matcher; @@ -17,50 +17,57 @@ import java.util.regex.Pattern; @Slf4j public class PostgisDBManager implements PostgisDBManagerI { - @Synchronized - public static PostgisDBManager get() throws SQLException, ConfigurationException { - if(config==null) { - log.debug("Looking for Default Configuration.. "); +// @Synchronized +// public static PostgisDBManager get() throws SQLException, ConfigurationException { +// if(config==null) { +// log.debug("Looking for Default Configuration.. "); +// +// // TODO GENERIC +// DatabaseConnection defaultConfiguration= +// ImplementationProvider.get().getIsProvider().getIS().queryForDB("postgis", "Concessioni"); +// +// log.debug("Found configuration : "+defaultConfiguration); +// config=defaultConfiguration; +// } +// return new PostgisDBManager(); +// } +// +// - // TODO GENERIC - DatabaseConnection defaultConfiguration= - ImplementationProvider.get().getProvidedObjectByClass(ISInterface.class) - .queryForDatabase("Database","postgis", "GNA_DB","Concessioni"); - log.debug("Found configuration : "+defaultConfiguration); - config=defaultConfiguration; - } - return new PostgisDBManager(); + public static PostgisDBManagerI get() throws SQLException, ConfigurationException { + return get(false); } - public static PostgisDBManagerI get(boolean autocommit) throws SQLException, ConfigurationException { - PostgisDBManager toReturn=get(); + + private static PostgisDBManagerI get(boolean autocommit) throws SQLException, ConfigurationException { + DatabaseConnection config= + ImplementationProvider.get().getIsProvider().getIS().queryForDB("postgis", "Concessioni"); + log.debug("Found configuration : "+config); + PostgisDBManager toReturn=new PostgisDBManager(config); toReturn.conn.setAutoCommit(autocommit); return toReturn; } - private static DatabaseConnection config; + + +// private static DatabaseConnection config; - private static Connection getConnection() throws SQLException { - - Connection toReturn= DriverManager.getConnection(config.getUrl(),config.getUser(),config.getPwd()); - - //TODO configure behaviour - toReturn.setAutoCommit(false); - return toReturn; - } - - private Connection conn=null; + private DatabaseConnection config; + private PostgisDBManager(DatabaseConnection config) throws SQLException { + this.config=config; + log.info("Opening connection to {}",config); + conn= DriverManager.getConnection(config.getUrl(),config.getUser(),config.getPwd()); - private PostgisDBManager() throws SQLException { - conn=getConnection(); + //TODO configure behaviour + conn.setAutoCommit(false); } @Override diff --git a/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/postgis/PostgisIndex.java b/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/postgis/PostgisIndex.java index a5bfa1d..e21fcc2 100644 --- a/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/postgis/PostgisIndex.java +++ b/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/postgis/PostgisIndex.java @@ -4,16 +4,16 @@ import lombok.extern.slf4j.Slf4j; import org.gcube.application.geoportal.common.model.legacy.Concessione; import org.gcube.application.geoportal.common.model.rest.DatabaseConnection; import org.gcube.application.geoportal.common.model.rest.PostgisIndexDescriptor; -import org.gcube.application.cms.implementations.ImplementationProvider; +import org.gcube.application.geoportal.service.engine.ImplementationProvider; import org.gcube.application.geoportal.service.engine.materialization.SDIManager; import org.gcube.application.geoportal.service.model.internal.db.DBConstants; import org.gcube.application.geoportal.service.model.internal.db.PostgisTable; import org.gcube.application.geoportal.service.model.internal.db.PostgisTable.Field; import org.gcube.application.geoportal.service.model.internal.db.PostgisTable.FieldType; -import org.gcube.application.geoportal.common.model.rest.ConfigurationException; +import org.gcube.application.geoportal.service.model.internal.faults.ConfigurationException; import org.gcube.application.geoportal.service.model.internal.faults.PublishException; import org.gcube.application.geoportal.service.model.internal.faults.SDIInteractionException; -import org.gcube.application.cms.serialization.Serialization; +import org.gcube.application.geoportal.service.utils.Serialization; import java.sql.PreparedStatement; import java.sql.SQLException; @@ -38,8 +38,8 @@ public class PostgisIndex { private SDIManager sdiManager; private String wmsLink=null; - private static PostgisDBManager getDB() throws ConfigurationException { - return ImplementationProvider.get().getProvidedObjectByClass(PostgisDBManager.class); + private static PostgisDBManagerI getDB() throws ConfigurationException { + return ImplementationProvider.get().getDbProvider().getObject(); }; public PostgisIndex() throws SDIInteractionException, SQLException, ConfigurationException { @@ -60,7 +60,7 @@ public class PostgisIndex { public String init() throws SQLException, ConfigurationException, SDIInteractionException { log.debug("Contacting postgis DB .. "); - PostgisDBManagerI db=getDB(); + PostgisDBManagerI db=ImplementationProvider.get().getDbProvider().getObject(); log.debug("Checking if centroids table exists.."); PostgisTable table=getCentroidsTable(); db.create(table); @@ -77,7 +77,7 @@ public class PostgisIndex { Map centroidRow=evaluateCentroid(record); log.debug("Contacting postgis DB .. "); - PostgisDBManagerI db=getDB(); + PostgisDBManagerI db=ImplementationProvider.get().getDbProvider().getObject(); PostgisTable centroidsTable=getCentroidsTable(); log.debug("Inserting / updated centroid Row {} ",centroidRow); @@ -107,7 +107,7 @@ public class PostgisIndex { public void removeCentroid(Concessione record) { try { - PostgisDBManagerI db=getDB(); + PostgisDBManagerI db=ImplementationProvider.get().getDbProvider().getObject(); PostgisTable centroidsTable=getCentroidsTable(); log.debug("Deleting centroid if present. ID is "+record.getMongo_id()); int result= db.deleteByFieldValue(centroidsTable, new Field(DBConstants.Concessioni.PRODUCT_ID,FieldType.TEXT), record.getMongo_id()); diff --git a/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/providers/PostgisConnectionProvider.java b/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/providers/PostgisConnectionProvider.java index 327ef9a..60a8b24 100644 --- a/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/providers/PostgisConnectionProvider.java +++ b/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/providers/PostgisConnectionProvider.java @@ -1,20 +1,23 @@ package org.gcube.application.geoportal.service.engine.providers; -import org.gcube.application.cms.caches.AbstractScopedMap; import org.gcube.application.geoportal.service.engine.postgis.PostgisDBManager; -import org.gcube.application.geoportal.common.model.rest.ConfigurationException; +import org.gcube.application.geoportal.service.engine.postgis.PostgisDBManagerI; +import org.gcube.application.geoportal.service.model.internal.faults.ConfigurationException; import java.sql.SQLException; +import java.time.Duration; +import java.time.temporal.ChronoUnit; -public class PostgisConnectionProvider extends AbstractScopedMap { +public class PostgisConnectionProvider extends AbstractScopedMap{ public PostgisConnectionProvider() { super("Postgis connection descriptor cache"); + setTTL(Duration.of(30, ChronoUnit.SECONDS)); } @Override - protected PostgisDBManager retrieveObject(String context) throws ConfigurationException { + protected PostgisDBManagerI retrieveObject() throws ConfigurationException { try { return PostgisDBManager.get(); } catch (SQLException throwables) { @@ -23,7 +26,7 @@ public class PostgisConnectionProvider extends AbstractScopedMap