Scoped Postgis DB Manager

This commit is contained in:
Fabio Sinibaldi 2021-08-04 16:22:29 +02:00
parent 5e9154d87e
commit 38a8b89963
19 changed files with 129 additions and 61 deletions

View File

@ -6,8 +6,7 @@ package org.gcube.application.geoportal.service.engine;
import lombok.Getter;
import lombok.Setter;
import lombok.Synchronized;
import org.gcube.application.geoportal.service.engine.cache.MongoClientProvider;
import org.gcube.application.geoportal.service.engine.cache.MongoConnectionProvider;
import org.gcube.application.geoportal.service.engine.providers.*;
public class ImplementationProvider {
@ -35,7 +34,11 @@ public class ImplementationProvider {
@Setter
private StorageClientProvider storageProvider=new StorageClientProvider();
@Getter
@Setter
private PostgisConnectionProvider dbProvider=new PostgisConnectionProvider();
// @Getter
// @Setter
// private EMFProvider emfProvider=new ScopedEMFProvider();

View File

@ -13,7 +13,7 @@ import org.gcube.application.geoportal.common.rest.TempFile;
import org.gcube.application.geoportal.common.utils.Files;
import org.gcube.application.geoportal.service.engine.ImplementationProvider;
import org.gcube.application.geoportal.service.engine.SDIManager;
import org.gcube.application.geoportal.service.engine.StorageClientProvider;
import org.gcube.application.geoportal.service.engine.providers.StorageClientProvider;
import org.gcube.application.geoportal.service.engine.WorkspaceManager;
import org.gcube.application.geoportal.service.engine.WorkspaceManager.FileOptions;
import org.gcube.application.geoportal.service.engine.WorkspaceManager.FolderOptions;

View File

@ -8,7 +8,6 @@ import org.gcube.application.geoportal.service.model.internal.db.PostgisTable;
import org.gcube.application.geoportal.service.model.internal.faults.ConfigurationException;
import org.gcube.application.geoportal.service.model.internal.faults.DataParsingException;
import java.io.IOException;
import java.sql.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@ -35,19 +34,7 @@ public class PostgisDBManager implements PostgisDBManagerI {
private static DatabaseConnection config;
public static void init(DatabaseConnection config) throws SQLException, IOException {
PostgisDBManager.config=config;
try{
Class.forName("org.postgresql.Driver");
Class.forName("org.postgis.DriverWrapper");
}catch(Exception e){
throw new RuntimeException(e);
}
}
@ -83,16 +70,16 @@ public class PostgisDBManager implements PostgisDBManagerI {
conn.commit();
}
/* (non-Javadoc)
* @see org.gcube.application.geoportal.PostgisDBManagerI#evaluateBoundingBox(org.gcube.application.geoportal.model.PostgisTable)
*/
@Override
public BBOX evaluateBoundingBox(PostgisTable table) throws SQLException, DataParsingException {
ResultSet rs=conn.createStatement().executeQuery("Select ST_Extent("+table.getGeometryColumn()+") as extent from "+table.getTablename());
if(rs.next())
return DBUtils.parseST_Extent(rs.getString("extent"));
else throw new SQLException("No extent returned");
}
// /* (non-Javadoc)
// * @see org.gcube.application.geoportal.PostgisDBManagerI#evaluateBoundingBox(org.gcube.application.geoportal.model.PostgisTable)
// */
// @Override
// public BBOX evaluateBoundingBox(PostgisTable table) throws SQLException, DataParsingException {
// ResultSet rs=conn.createStatement().executeQuery("Select ST_Extent("+table.getGeometryColumn()+") as extent from "+table.getTablename());
// if(rs.next())
// return DBUtils.parseST_Extent(rs.getString("extent"));
// else throw new SQLException("No extent returned");
// }
/* (non-Javadoc)
* @see org.gcube.application.geoportal.PostgisDBManagerI#evaluateBoundingBox(org.gcube.application.geoportal.model.PostgisTable)

View File

@ -1,6 +1,5 @@
package org.gcube.application.geoportal.service.engine.postgis;
import org.gcube.application.geoportal.common.model.legacy.BBOX;
import org.gcube.application.geoportal.service.model.internal.db.DatabaseConnection;
import org.gcube.application.geoportal.service.model.internal.db.PostgisTable;
import org.gcube.application.geoportal.service.model.internal.faults.DataParsingException;
@ -13,11 +12,9 @@ public interface PostgisDBManagerI {
void commit() throws SQLException;
// int insertCentroid(CentroidRecord record) throws SQLException;
// int deleteCentroid(String uuid) throws SQLException;
BBOX evaluateBoundingBox(PostgisTable table) throws SQLException, DataParsingException;
PreparedStatement prepareInsertStatement(PostgisTable target, boolean createTable, boolean geometryAsText)
throws SQLException;

View File

@ -2,6 +2,7 @@ package org.gcube.application.geoportal.service.engine.postgis;
import lombok.extern.slf4j.Slf4j;
import org.gcube.application.geoportal.common.model.legacy.Concessione;
import org.gcube.application.geoportal.service.engine.ImplementationProvider;
import org.gcube.application.geoportal.service.engine.SDIManager;
import org.gcube.application.geoportal.service.model.internal.db.DBConstants;
import org.gcube.application.geoportal.service.model.internal.db.PostgisTable;
@ -34,7 +35,10 @@ public class PostgisIndex {
private SDIManager sdiManager;
private static PostgisDBManager getDB() throws ConfigurationException {
return ImplementationProvider.get().getDbProvider().getObject();
};
public PostgisIndex() throws SDIInteractionException, SQLException, ConfigurationException {
super();
@ -49,7 +53,7 @@ public class PostgisIndex {
public void init() throws SQLException, ConfigurationException, SDIInteractionException {
log.debug("Contacting postgis DB .. ");
PostgisDBManagerI db=PostgisDBManager.get();
PostgisDBManagerI db=ImplementationProvider.get().getDbProvider().getObject();
log.debug("Checking if centroids table exists..");
PostgisTable table=getCentroidsTable();
db.create(table);
@ -67,7 +71,7 @@ public class PostgisIndex {
Map<String,String> centroidRow=evaluateCentroid(record);
log.debug("Contacting postgis DB .. ");
PostgisDBManagerI db=PostgisDBManager.get();
PostgisDBManagerI db=ImplementationProvider.get().getDbProvider().getObject();
PostgisTable centroidsTable=getCentroidsTable();
log.debug("Inserting / updated centroid Row {} ",centroidRow);
@ -97,7 +101,7 @@ public class PostgisIndex {
public void removeCentroid(Concessione record) {
try {
PostgisDBManagerI db=PostgisDBManager.get();
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());

View File

@ -1,4 +1,4 @@
package org.gcube.application.geoportal.service.engine;
package org.gcube.application.geoportal.service.engine.providers;
import lombok.NonNull;
import lombok.RequiredArgsConstructor;
@ -17,7 +17,7 @@ import java.util.concurrent.ConcurrentHashMap;
public abstract class AbstractScopedMap<T> implements Engine<T>{
// scope-> object
private ConcurrentHashMap<String,TTLObject<T>> scopeMap=new ConcurrentHashMap<String,TTLObject<T>>();
private ConcurrentHashMap<String, TTLObject<T>> scopeMap=new ConcurrentHashMap<String,TTLObject<T>>();
@Setter
private TemporalAmount TTL=null;

View File

@ -1,4 +1,4 @@
package org.gcube.application.geoportal.service.engine;
package org.gcube.application.geoportal.service.engine.providers;
import org.gcube.application.geoportal.service.model.internal.faults.ConfigurationException;

View File

@ -1,11 +1,10 @@
package org.gcube.application.geoportal.service.engine.cache;
package org.gcube.application.geoportal.service.engine.providers;
import com.mongodb.MongoClient;
import com.mongodb.MongoClientOptions;
import com.mongodb.MongoCredential;
import com.mongodb.ServerAddress;
import lombok.extern.slf4j.Slf4j;
import org.gcube.application.geoportal.service.engine.AbstractScopedMap;
import org.gcube.application.geoportal.service.engine.ImplementationProvider;
import org.gcube.application.geoportal.service.model.internal.db.MongoConnection;
import org.gcube.application.geoportal.service.model.internal.faults.ConfigurationException;

View File

@ -1,7 +1,6 @@
package org.gcube.application.geoportal.service.engine.cache;
package org.gcube.application.geoportal.service.engine.providers;
import org.gcube.application.geoportal.service.ServiceConstants;
import org.gcube.application.geoportal.service.engine.AbstractScopedMap;
import org.gcube.application.geoportal.service.model.internal.db.MongoConnection;
import org.gcube.application.geoportal.service.model.internal.faults.ConfigurationException;
import org.gcube.application.geoportal.service.utils.ISUtils;

View File

@ -0,0 +1,33 @@
package org.gcube.application.geoportal.service.engine.providers;
import org.gcube.application.geoportal.service.engine.postgis.PostgisDBManager;
import org.gcube.application.geoportal.service.model.internal.faults.ConfigurationException;
import java.sql.SQLException;
public class PostgisConnectionProvider extends AbstractScopedMap<PostgisDBManager>{
public PostgisConnectionProvider() {
super("Postgis connection descriptor cache");
}
@Override
protected PostgisDBManager retrieveObject() throws ConfigurationException {
try {
return PostgisDBManager.get();
} catch (SQLException throwables) {
throw new ConfigurationException(throwables);
}
}
@Override
protected void dispose(PostgisDBManager toDispose) {
// toDispose.close();
}
@Override
public void init() {
//
}
}

View File

@ -1,4 +1,4 @@
package org.gcube.application.geoportal.service.engine;
package org.gcube.application.geoportal.service.engine.providers;
import org.gcube.application.geoportal.common.model.profile.Profile;
import org.gcube.application.geoportal.service.model.internal.faults.ConfigurationException;

View File

@ -1,4 +1,4 @@
package org.gcube.application.geoportal.service.engine;
package org.gcube.application.geoportal.service.engine.providers;
import lombok.extern.slf4j.Slf4j;
import org.gcube.application.geoportal.common.rest.InterfaceConstants;
@ -18,7 +18,7 @@ import java.net.URL;
import java.time.Duration;
import java.time.temporal.ChronoUnit;
@Slf4j
public class StorageClientProvider extends AbstractScopedMap<IClient>{
public class StorageClientProvider extends AbstractScopedMap<IClient> {
@ -34,8 +34,9 @@ public class StorageClientProvider extends AbstractScopedMap<IClient>{
@Override
protected void dispose(IClient toDispose) {
try {
toDispose.close();
try {
//TODO ASK LUCA
// toDispose.close();
}catch (NullPointerException e) {
// expected if closed without uploading
}catch(Throwable t) {

View File

@ -1,9 +1,9 @@
package org.gcube.application.geoportal.service.engine;
package org.gcube.application.geoportal.service.engine.providers;
import org.gcube.application.geoportal.service.model.internal.faults.ConfigurationException;
import org.gcube.common.storagehub.client.dsl.StorageHubClient;
public class StorageHubProvider implements Engine<StorageHubClient>{
public class StorageHubProvider implements Engine<StorageHubClient> {
@Override

View File

@ -1,4 +1,4 @@
package org.gcube.application.geoportal.service.engine;
package org.gcube.application.geoportal.service.engine.providers;
import lombok.AllArgsConstructor;
import lombok.Getter;

View File

@ -0,0 +1,14 @@
package org.gcube.application.geoportal.service.model.internal;
import lombok.Data;
import org.gcube.application.geoportal.service.model.internal.db.DatabaseConnection;
import java.util.Map;
@Data
public class Configuration {
public DatabaseConnection postgisDBIndex;
public Map<String,String> details;
}

View File

@ -4,7 +4,9 @@ import lombok.extern.slf4j.Slf4j;
import org.gcube.application.geoportal.common.model.legacy.Concessione;
import org.gcube.application.geoportal.common.rest.AddSectionToConcessioneRequest;
import org.gcube.application.geoportal.common.rest.InterfaceConstants;
import org.gcube.application.geoportal.service.engine.ImplementationProvider;
import org.gcube.application.geoportal.service.engine.mongo.ConcessioniMongoManager;
import org.gcube.application.geoportal.service.model.internal.Configuration;
import org.gcube.application.geoportal.service.model.internal.faults.DeletionException;
import org.gcube.application.geoportal.service.utils.Serialization;
import org.json.JSONArray;
@ -18,7 +20,22 @@ import javax.ws.rs.core.Response;
@Slf4j
public class ConcessioniOverMongo {
@HEAD
@Path("some")
@Produces(MediaType.APPLICATION_JSON)
public String getConfiguration(){
return new GuardedMethod<String>(){
@Override
protected String run() throws Exception, WebApplicationException {
Configuration toReturn = new Configuration();
toReturn.setPostgisDBIndex(ImplementationProvider.get().getDbProvider().getObject().getConnectionDescriptor());
return Serialization.write(toReturn);
}
}.execute().getResult();
}
@PUT
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)

View File

@ -2,9 +2,11 @@ package org.gcube.application.geoportal.service;
import com.mongodb.MongoClient;
import org.gcube.application.geoportal.service.engine.ImplementationProvider;
import org.gcube.application.geoportal.service.engine.StorageClientProvider;
import org.gcube.application.geoportal.service.engine.cache.MongoClientProvider;
import org.gcube.application.geoportal.service.engine.cache.MongoConnectionProvider;
import org.gcube.application.geoportal.service.engine.postgis.PostgisDBManager;
import org.gcube.application.geoportal.service.engine.providers.PostgisConnectionProvider;
import org.gcube.application.geoportal.service.engine.providers.StorageClientProvider;
import org.gcube.application.geoportal.service.engine.providers.MongoClientProvider;
import org.gcube.application.geoportal.service.engine.providers.MongoConnectionProvider;
import org.gcube.application.geoportal.service.model.internal.faults.ConfigurationException;
import org.gcube.application.geoportal.service.utils.Serialization;
import org.gcube.contentmanagement.blobstorage.service.IClient;
@ -53,7 +55,14 @@ public class BasicServiceTestUnit extends JerseyTest {
return super.getObject();
}
});
ImplementationProvider.get().setDbProvider(new PostgisConnectionProvider() {
@Override
public PostgisDBManager getObject() throws ConfigurationException {
TokenSetter.set(scope);
return super.getObject();
}
});
}

View File

@ -11,7 +11,6 @@ import org.gcube.application.geoportal.common.utils.Files;
import org.gcube.application.geoportal.common.utils.StorageUtils;
import org.gcube.application.geoportal.service.utils.Serialization;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import javax.ws.rs.client.Entity;
@ -33,10 +32,6 @@ public class ConcessioniOverMongoTest extends BasicServiceTestUnit{
private static final String FILES_PATH=InterfaceConstants.Methods.REGISTER_FILES_PATH;
@Before
public void setContext() {
TokenSetter.set("/gcube/devsec/devVRE");
}
private static Concessione upload(WebTarget target,String id, String path, String ...files) throws Exception {
@ -78,6 +73,14 @@ public class ConcessioniOverMongoTest extends BasicServiceTestUnit{
System.out.println(target.request(MediaType.APPLICATION_JSON).get(List.class));
}
@Test
public void getConfiguration() throws Exception {
WebTarget target=target(PATH);
System.out.println(check(target.path("some").request(MediaType.APPLICATION_JSON).head(),String.class));
}
@Test
public void createNew() throws Exception {
WebTarget target=target(PATH);
@ -99,6 +102,8 @@ public class ConcessioniOverMongoTest extends BasicServiceTestUnit{
}
@Test
public void republish() throws Exception{
WebTarget target=target(PATH);

View File

@ -6,7 +6,7 @@ import com.mongodb.MongoClient;
import org.bson.Document;
import org.gcube.application.geoportal.service.TokenSetter;
import org.gcube.application.geoportal.service.engine.ImplementationProvider;
import org.gcube.application.geoportal.service.engine.cache.MongoClientProvider;
import org.gcube.application.geoportal.service.engine.providers.MongoClientProvider;
import org.gcube.application.geoportal.service.model.internal.faults.ConfigurationException;
import org.junit.BeforeClass;
import org.junit.Test;