diff --git a/gCat-Feeder/pom.xml b/gCat-Feeder/pom.xml index 1c67713..1383a20 100644 --- a/gCat-Feeder/pom.xml +++ b/gCat-Feeder/pom.xml @@ -76,11 +76,10 @@ - org.eclipse.persistence - eclipselink - 2.6.6 - compile - + org.apache.commons + commons-dbcp2 + 2.0.1 + diff --git a/gCat-Feeder/src/main/java/org/gcube/data/publishing/gCatFeeder/service/GCatFeeder.java b/gCat-Feeder/src/main/java/org/gcube/data/publishing/gCatFeeder/service/GCatFeeder.java index 5da4f18..c3bdb22 100644 --- a/gCat-Feeder/src/main/java/org/gcube/data/publishing/gCatFeeder/service/GCatFeeder.java +++ b/gCat-Feeder/src/main/java/org/gcube/data/publishing/gCatFeeder/service/GCatFeeder.java @@ -14,7 +14,7 @@ import org.gcube.data.publishing.gCatFeeder.service.engine.impl.CollectorsManage import org.gcube.data.publishing.gCatFeeder.service.engine.impl.ExecutionManagerImpl; import org.gcube.data.publishing.gCatFeeder.service.engine.impl.FeederEngineImpl; import org.gcube.data.publishing.gCatFeeder.service.engine.impl.InfrastructureUtilsImpl; -import org.gcube.data.publishing.gCatFeeder.service.engine.impl.StorageImpl; +import org.gcube.data.publishing.gCatFeeder.service.engine.impl.persistence.StorageImpl; import org.gcube.data.publishing.gCatFeeder.service.rest.Capabilities; import org.gcube.data.publishing.gCatFeeder.service.rest.Executions; import org.glassfish.hk2.utilities.binding.AbstractBinder; diff --git a/gCat-Feeder/src/main/java/org/gcube/data/publishing/gCatFeeder/service/engine/ConnectionManager.java b/gCat-Feeder/src/main/java/org/gcube/data/publishing/gCatFeeder/service/engine/ConnectionManager.java index 613e61b..86b5fc1 100644 --- a/gCat-Feeder/src/main/java/org/gcube/data/publishing/gCatFeeder/service/engine/ConnectionManager.java +++ b/gCat-Feeder/src/main/java/org/gcube/data/publishing/gCatFeeder/service/engine/ConnectionManager.java @@ -1,10 +1,11 @@ package org.gcube.data.publishing.gCatFeeder.service.engine; import java.sql.Connection; +import java.sql.SQLException; public interface ConnectionManager { - public Connection getConnection(); + public Connection getConnection() throws SQLException, InternalError; } diff --git a/gCat-Feeder/src/main/java/org/gcube/data/publishing/gCatFeeder/service/engine/Infrastructure.java b/gCat-Feeder/src/main/java/org/gcube/data/publishing/gCatFeeder/service/engine/Infrastructure.java index 1908d80..e4229a4 100644 --- a/gCat-Feeder/src/main/java/org/gcube/data/publishing/gCatFeeder/service/engine/Infrastructure.java +++ b/gCat-Feeder/src/main/java/org/gcube/data/publishing/gCatFeeder/service/engine/Infrastructure.java @@ -1,5 +1,7 @@ package org.gcube.data.publishing.gCatFeeder.service.engine; +import org.gcube.data.publishing.gCatFeeder.service.engine.impl.persistence.DatabaseConnectionDescriptor; + public interface Infrastructure { public String getCurrentToken(); @@ -12,4 +14,9 @@ public interface Infrastructure { public String encrypt(String toEncrypt); public String decrypt(String toDecrypt); + + + // + + public DatabaseConnectionDescriptor queryForDatabase(String category,String name) throws InternalError; } diff --git a/gCat-Feeder/src/main/java/org/gcube/data/publishing/gCatFeeder/service/engine/LocalConfiguration.java b/gCat-Feeder/src/main/java/org/gcube/data/publishing/gCatFeeder/service/engine/LocalConfiguration.java new file mode 100644 index 0000000..50bdf38 --- /dev/null +++ b/gCat-Feeder/src/main/java/org/gcube/data/publishing/gCatFeeder/service/engine/LocalConfiguration.java @@ -0,0 +1,17 @@ +package org.gcube.data.publishing.gCatFeeder.service.engine; + +public interface LocalConfiguration { + + public static final String POOL_MAX_IDLE="db.pools.max_idle"; + public static final String POOL_MAX_TOTAL="db.pools.max_total"; + public static final String POOL_MIN_IDLE="db.pools.min_total"; + + + public static final String MAPPING_DB_ENDPOINT_NAME="db.ep.name"; + public static final String MAPPING_DB_ENDPOINT_CATEGORY="db.ep.category"; + + + + public String getProperty(String propertyName); + +} diff --git a/gCat-Feeder/src/main/java/org/gcube/data/publishing/gCatFeeder/service/engine/impl/InfrastructureUtilsImpl.java b/gCat-Feeder/src/main/java/org/gcube/data/publishing/gCatFeeder/service/engine/impl/InfrastructureUtilsImpl.java index bc49e6e..ecd77b3 100644 --- a/gCat-Feeder/src/main/java/org/gcube/data/publishing/gCatFeeder/service/engine/impl/InfrastructureUtilsImpl.java +++ b/gCat-Feeder/src/main/java/org/gcube/data/publishing/gCatFeeder/service/engine/impl/InfrastructureUtilsImpl.java @@ -1,12 +1,27 @@ package org.gcube.data.publishing.gCatFeeder.service.engine.impl; +import static org.gcube.resources.discovery.icclient.ICFactory.clientFor; +import static org.gcube.resources.discovery.icclient.ICFactory.queryFor; + +import java.util.List; + + +import org.gcube.common.resources.gcore.ServiceEndpoint; +import org.gcube.common.resources.gcore.ServiceEndpoint.AccessPoint; import org.gcube.data.publishing.gCatFeeder.service.engine.Infrastructure; +import org.gcube.data.publishing.gCatFeeder.service.engine.impl.persistence.DatabaseConnectionDescriptor; import org.gcube.data.publishing.gCatFeeder.utils.CommonUtils; import org.gcube.data.publishing.gCatFeeder.utils.ContextUtils; import org.gcube.data.publishing.gCatFeeder.utils.TokenUtils; +import org.gcube.resources.discovery.client.api.DiscoveryClient; +import org.gcube.resources.discovery.client.queries.api.SimpleQuery; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class InfrastructureUtilsImpl implements Infrastructure { + private static final Logger log= LoggerFactory.getLogger(InfrastructureUtilsImpl.class); + @Override public String getCurrentToken() { return TokenUtils.getCurrentToken(); @@ -47,4 +62,33 @@ public class InfrastructureUtilsImpl implements Infrastructure { public String encrypt(String toEncrypt) { return CommonUtils.encryptString(toEncrypt); } + + @Override + public DatabaseConnectionDescriptor queryForDatabase(String category, String name) throws InternalError { + log.debug("Querying for DB {},{} under {}",category,name,getCurrentContext()); + + SimpleQuery query = queryFor(ServiceEndpoint.class); + + + query.addCondition("$resource/Profile/Category/text() eq '"+category+"'"); + + + query.addCondition("$resource/Profile/Name/text() eq '"+name+"'"); + + + DiscoveryClient client = clientFor(ServiceEndpoint.class); + + List found=client.submit(query); + + if(found.size()==0) throw new InternalError("Unable to find DB "+category+"/"+name+" in "+getCurrentContext()); + if(found.size()>1) log.warn("Multiple DB "+category+"/"+name+" in "+getCurrentContext()); + AccessPoint point= found.get(0).profile().accessPoints().iterator().next(); + + String url="jdbc:postgresql://"+point.address()+"/"+point.name(); + + DatabaseConnectionDescriptor toReturn= new DatabaseConnectionDescriptor(point.username(), url, CommonUtils.decryptString(point.password())); + log.debug("Going to use DB : "+toReturn); + + return toReturn; + } } diff --git a/gCat-Feeder/src/main/java/org/gcube/data/publishing/gCatFeeder/service/engine/impl/persistence/ConnectionManagerImpl.java b/gCat-Feeder/src/main/java/org/gcube/data/publishing/gCatFeeder/service/engine/impl/persistence/ConnectionManagerImpl.java new file mode 100644 index 0000000..4ea3749 --- /dev/null +++ b/gCat-Feeder/src/main/java/org/gcube/data/publishing/gCatFeeder/service/engine/impl/persistence/ConnectionManagerImpl.java @@ -0,0 +1,119 @@ +package org.gcube.data.publishing.gCatFeeder.service.engine.impl.persistence; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.concurrent.ConcurrentHashMap; + +import javax.inject.Inject; +import javax.sql.DataSource; + +import org.apache.commons.dbcp2.ConnectionFactory; +import org.apache.commons.dbcp2.DriverManagerConnectionFactory; +import org.apache.commons.dbcp2.PoolableConnection; +import org.apache.commons.dbcp2.PoolableConnectionFactory; +import org.apache.commons.dbcp2.PoolingDataSource; +import org.apache.commons.pool2.ObjectPool; +import org.apache.commons.pool2.impl.GenericObjectPool; +import org.apache.commons.pool2.impl.GenericObjectPoolConfig; +import org.gcube.data.publishing.gCatFeeder.service.engine.ConnectionManager; +import org.gcube.data.publishing.gCatFeeder.service.engine.Infrastructure; +import org.gcube.data.publishing.gCatFeeder.service.engine.LocalConfiguration; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class ConnectionManagerImpl implements ConnectionManager { + + static { + try { + Class.forName("org.postgresql.Driver"); + } catch (ClassNotFoundException e) { + System.err.println("PERFORM SERVICE - UNABLE TO REGISTER postgresql DRIVER"); + e.printStackTrace(System.err); + throw new RuntimeException(e); + } + } + + + private static final Logger log= LoggerFactory.getLogger(ConnectionManagerImpl.class); + + // ************************************** INSTANCE + + + // Endpoint -> datasource + private ConcurrentHashMap datasources=new ConcurrentHashMap<>(); + + // Scope -> db + private ConcurrentHashMap databases=new ConcurrentHashMap<>(); + + + + /** + * Manages db connection pools by scope + * + * + */ + + @Inject + private Infrastructure infrastructure; + @Inject + private LocalConfiguration configuration; + + private synchronized DatabaseConnectionDescriptor getDB() throws InternalError { + if(!databases.containsKey(infrastructure.getCurrentContext())) + databases.put(infrastructure.getCurrentContext(), infrastructure.queryForDatabase( + configuration.getProperty(LocalConfiguration.MAPPING_DB_ENDPOINT_CATEGORY), + configuration.getProperty(LocalConfiguration.MAPPING_DB_ENDPOINT_NAME))); + return databases.get(infrastructure.getCurrentContext()); + } + + @Override + public Connection getConnection() throws SQLException, InternalError { + DataSource ds=getDataSource(); + Connection conn=ds.getConnection(); + conn.setAutoCommit(false); + return conn; + } + + + private synchronized DataSource getDataSource() throws InternalError { + DatabaseConnectionDescriptor dbDescriptor=getDB(); + + if(!datasources.containsKey(dbDescriptor.getUrl())) { + datasources.put(dbDescriptor.getUrl(), setupDataSource(dbDescriptor)); + } + return datasources.get(dbDescriptor.getUrl()); + } + + private DataSource setupDataSource(DatabaseConnectionDescriptor db) { + + log.trace("Setting up data source for {} ",db); + + + GenericObjectPoolConfig poolConfig=new GenericObjectPoolConfig(); + poolConfig.setMaxIdle(Integer.parseInt(configuration.getProperty(LocalConfiguration.POOL_MAX_IDLE))); + poolConfig.setMaxTotal(Integer.parseInt(configuration.getProperty(LocalConfiguration.POOL_MAX_TOTAL))); + poolConfig.setMinIdle(Integer.parseInt(configuration.getProperty(LocalConfiguration.POOL_MIN_IDLE))); + + + ConnectionFactory connectionFactory = + new DriverManagerConnectionFactory(db.getUrl(),db.getUsername(),db.getPassword()); + + + PoolableConnectionFactory poolableConnectionFactory = + new PoolableConnectionFactory(connectionFactory, null); + + + ObjectPool connectionPool = + new GenericObjectPool<>(poolableConnectionFactory); + + + poolableConnectionFactory.setPool(connectionPool); + + + PoolingDataSource dataSource = + new PoolingDataSource<>(connectionPool); + + return dataSource; + } + +} diff --git a/gCat-Feeder/src/main/java/org/gcube/data/publishing/gCatFeeder/service/engine/impl/persistence/DBField.java b/gCat-Feeder/src/main/java/org/gcube/data/publishing/gCatFeeder/service/engine/impl/persistence/DBField.java index 9f1b2c5..02a3f06 100644 --- a/gCat-Feeder/src/main/java/org/gcube/data/publishing/gCatFeeder/service/engine/impl/persistence/DBField.java +++ b/gCat-Feeder/src/main/java/org/gcube/data/publishing/gCatFeeder/service/engine/impl/persistence/DBField.java @@ -11,18 +11,28 @@ public class DBField { public static final Map fields=new HashMap<>(); - public static final String ID="id"; + public static final String ID="id"; + public static final String CALLER_TOKEN="caller_token"; + public static final String CALLER_ID="caller_id"; + public static final String CALLER_CONTEXT="caller_context"; + public static final String STATUS = "status"; + public static final String REPORT_URL="report_url"; + + public static final String COLLECTORS="collectors"; + public static final String CONTROLLERS="controllers"; + public static final String START="start_time"; public static final String END="end_time"; - public static final String STATUS="status"; - public static final String CALLER="caller"; static { fields.put(ID, new DBField(Types.BIGINT,ID)); + fields.put(CALLER_TOKEN, new DBField(Types.VARCHAR,CALLER_TOKEN)); + fields.put(CALLER_ID, new DBField(Types.VARCHAR,CALLER_ID)); + fields.put(CALLER_CONTEXT, new DBField(Types.VARCHAR,CALLER_CONTEXT)); + fields.put(STATUS, new DBField(Types.VARCHAR,STATUS)); + fields.put(REPORT_URL, new DBField(Types.VARCHAR,REPORT_URL)); fields.put(START, new DBField(Types.TIMESTAMP,START)); fields.put(END, new DBField(Types.TIMESTAMP,END)); - fields.put(STATUS, new DBField(Types.VARCHAR,STATUS)); - fields.put(CALLER, new DBField(Types.VARCHAR,CALLER)); } } diff --git a/gCat-Feeder/src/main/java/org/gcube/data/publishing/gCatFeeder/service/engine/impl/persistence/DatabaseConnectionDescriptor.java b/gCat-Feeder/src/main/java/org/gcube/data/publishing/gCatFeeder/service/engine/impl/persistence/DatabaseConnectionDescriptor.java new file mode 100644 index 0000000..5b2aa5c --- /dev/null +++ b/gCat-Feeder/src/main/java/org/gcube/data/publishing/gCatFeeder/service/engine/impl/persistence/DatabaseConnectionDescriptor.java @@ -0,0 +1,37 @@ +package org.gcube.data.publishing.gCatFeeder.service.engine.impl.persistence; + +public class DatabaseConnectionDescriptor { + + private String username; + private String url; + private String password; + + + + @Override + public String toString() { + return "DatabaseConnectionDescriptor [username=" + username + ", url=" + url + "]"; + } + + public DatabaseConnectionDescriptor(String username, String url, String password) { + super(); + this.username = username; + this.url = url; + this.password = password; + } + + public String getUsername() { + return username; + } + + public String getUrl() { + return url; + } + + public String getPassword() { + return password; + } + + + +} diff --git a/gCat-Feeder/src/main/java/org/gcube/data/publishing/gCatFeeder/service/engine/impl/PersistenceManagerImpl.java b/gCat-Feeder/src/main/java/org/gcube/data/publishing/gCatFeeder/service/engine/impl/persistence/PersistenceManagerImpl.java similarity index 96% rename from gCat-Feeder/src/main/java/org/gcube/data/publishing/gCatFeeder/service/engine/impl/PersistenceManagerImpl.java rename to gCat-Feeder/src/main/java/org/gcube/data/publishing/gCatFeeder/service/engine/impl/persistence/PersistenceManagerImpl.java index 74638d4..b491afc 100644 --- a/gCat-Feeder/src/main/java/org/gcube/data/publishing/gCatFeeder/service/engine/impl/PersistenceManagerImpl.java +++ b/gCat-Feeder/src/main/java/org/gcube/data/publishing/gCatFeeder/service/engine/impl/persistence/PersistenceManagerImpl.java @@ -1,4 +1,4 @@ -package org.gcube.data.publishing.gCatFeeder.service.engine.impl; +package org.gcube.data.publishing.gCatFeeder.service.engine.impl.persistence; import static org.gcube.data.publishing.gCatFeeder.service.engine.impl.persistence.DBField.ExecutionDescriptor.ID; import static org.gcube.data.publishing.gCatFeeder.service.engine.impl.persistence.DBField.ExecutionDescriptor.fields; @@ -15,8 +15,6 @@ import javax.inject.Inject; import org.gcube.data.publishing.gCatFeeder.service.engine.ConnectionManager; import org.gcube.data.publishing.gCatFeeder.service.engine.PersistenceManager; -import org.gcube.data.publishing.gCatFeeder.service.engine.impl.persistence.DBQueryDescriptor; -import org.gcube.data.publishing.gCatFeeder.service.engine.impl.persistence.Queries; import org.gcube.data.publishing.gCatFeeder.service.model.ExecutionDescriptor; import org.gcube.data.publishing.gCatFeeder.service.model.ExecutionRequest; import org.gcube.data.publishing.gCatFeeder.service.model.fault.ElementNotFound; diff --git a/gCat-Feeder/src/main/java/org/gcube/data/publishing/gCatFeeder/service/engine/impl/persistence/Queries.java b/gCat-Feeder/src/main/java/org/gcube/data/publishing/gCatFeeder/service/engine/impl/persistence/Queries.java index 724befc..9c00360 100644 --- a/gCat-Feeder/src/main/java/org/gcube/data/publishing/gCatFeeder/service/engine/impl/persistence/Queries.java +++ b/gCat-Feeder/src/main/java/org/gcube/data/publishing/gCatFeeder/service/engine/impl/persistence/Queries.java @@ -1,35 +1,148 @@ package org.gcube.data.publishing.gCatFeeder.service.engine.impl.persistence; +import static org.gcube.data.publishing.gCatFeeder.service.engine.impl.persistence.DBField.ExecutionDescriptor.CALLER_CONTEXT; +import static org.gcube.data.publishing.gCatFeeder.service.engine.impl.persistence.DBField.ExecutionDescriptor.CALLER_ID; +import static org.gcube.data.publishing.gCatFeeder.service.engine.impl.persistence.DBField.ExecutionDescriptor.CALLER_TOKEN; +import static org.gcube.data.publishing.gCatFeeder.service.engine.impl.persistence.DBField.ExecutionDescriptor.COLLECTORS; +import static org.gcube.data.publishing.gCatFeeder.service.engine.impl.persistence.DBField.ExecutionDescriptor.CONTROLLERS; +import static org.gcube.data.publishing.gCatFeeder.service.engine.impl.persistence.DBField.ExecutionDescriptor.END; +import static org.gcube.data.publishing.gCatFeeder.service.engine.impl.persistence.DBField.ExecutionDescriptor.ID; +import static org.gcube.data.publishing.gCatFeeder.service.engine.impl.persistence.DBField.ExecutionDescriptor.REPORT_URL; +import static org.gcube.data.publishing.gCatFeeder.service.engine.impl.persistence.DBField.ExecutionDescriptor.START; +import static org.gcube.data.publishing.gCatFeeder.service.engine.impl.persistence.DBField.ExecutionDescriptor.STATUS; +import static org.gcube.data.publishing.gCatFeeder.service.engine.impl.persistence.DBField.ExecutionDescriptor.TABLE; +import static org.gcube.data.publishing.gCatFeeder.service.engine.impl.persistence.DBField.ExecutionDescriptor.fields; + import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Timestamp; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashSet; +import java.util.Set; import org.gcube.data.publishing.gCatFeeder.service.model.ExecutionDescriptor; import org.gcube.data.publishing.gCatFeeder.service.model.ExecutionRequest; +import org.gcube.data.publishing.gCatFeeder.service.model.ExecutionStatus; import org.gcube.data.publishing.gCatFeeder.service.model.fault.InvalidRequest; + public class Queries { - public static final Query GET_BY_ID; - - public static final Query UPDATE; - - public static final Query ACQUIRE; - - public static final Query GET_ALL; - - public static final Query GET_SIMILAR; - - - public static final Query INSERT_NEW; - - public static final ExecutionDescriptor translateRow(ResultSet row) { - + public static final Query GET_BY_ID=new Query("Select * from "+TABLE+" where "+ID+" = ?", + new DBField[] {fields.get(ID)}); + + public static final Query UPDATE=new Query("UPDATE "+TABLE+" SET " + +START+"=?, "+END+"=?, "+ STATUS+"=?, "+REPORT_URL+"=? WHERE "+ID+"=?", + new DBField[] {fields.get(START), + fields.get(END), + fields.get(STATUS), + fields.get(REPORT_URL), + fields.get(ID)}); + + public static final Query ACQUIRE= new Query("UPDATE "+TABLE+" SET " + +STATUS+"="+ExecutionStatus.RUNNING+" WHERE "+ID+"=? AND "+STATUS+"="+ExecutionStatus.PENDING, + new DBField[] {fields.get(ID)}); + + public static final Query GET_ALL= new Query("SELECT * FROM "+TABLE+" ORDER BY "+END+" DESC", + new DBField[] {}); + + /* + * SAME CONTEXT, + * status is RUNNING OR PENDING + * SAME COLLECTORS + * SAME CATALOGUES + */ + public static final Query GET_SIMILAR=new Query ("SELECT * FROM "+TABLE+" WHERE " + +CALLER_CONTEXT+"=? AND "+COLLECTORS+"=? AND "+CONTROLLERS+"=? AND " + /* STATUS */ +"("+STATUS+"="+ExecutionStatus.RUNNING+" OR "+STATUS+"="+ExecutionStatus.PENDING+")", + new DBField[] {fields.get(CALLER_CONTEXT), + fields.get(COLLECTORS), + fields.get(CONTROLLERS)}); + + + public static final Query INSERT_NEW=new Query ("INSERT INTO "+TABLE+" (" + +CALLER_TOKEN+"," + +CALLER_ID+"," + +CALLER_CONTEXT+"," + +STATUS+"," + +REPORT_URL+"," + +COLLECTORS+"," + +CONTROLLERS+"," + +START+") VALUES (?,?,?,?,?,?,?,?)", + new DBField[] {fields.get(CALLER_TOKEN),fields.get(CALLER_ID),fields.get(CALLER_CONTEXT), + fields.get(STATUS),fields.get(REPORT_URL),fields.get(COLLECTORS),fields.get(CONTROLLERS),fields.get(START)}); + + public static final ExecutionDescriptor translateRow(ResultSet row) throws SQLException { + ExecutionDescriptor toReturn=new ExecutionDescriptor(); + toReturn.setCallerContext(row.getString(CALLER_CONTEXT)); + toReturn.setCallerEncryptedToken(row.getString(CALLER_TOKEN)); + toReturn.setCallerIdentity(row.getString(CALLER_ID)); + toReturn.getCatalogues().addAll(fromField(row.getString(CONTROLLERS))); + toReturn.getCollectors().addAll(fromField(row.getString(COLLECTORS))); + Timestamp endTime=row.getTimestamp(END); + if(endTime!=null) + toReturn.setEndTime(endTime.toInstant()); + + toReturn.setId(row.getLong(ID)); + toReturn.setReportUrl(row.getString(REPORT_URL)); + toReturn.setStartTime(row.getTimestamp(START).toInstant()); + toReturn.setStatus(ExecutionStatus.valueOf(row.getString(STATUS))); + return toReturn; } - + public static final DBQueryDescriptor translateObject(ExecutionDescriptor descriptor) throws InvalidRequest{ - + try{ + return new DBQueryDescriptor(). + add(fields.get(CALLER_CONTEXT),descriptor.getCallerContext()). + add(fields.get(CALLER_TOKEN),descriptor.getCallerEncryptedToken()). + add(fields.get(CALLER_ID),descriptor.getCallerIdentity()). + add(fields.get(CONTROLLERS),toField(descriptor.getCatalogues())). + add(fields.get(COLLECTORS),toField(descriptor.getCollectors())). + add(fields.get(END),descriptor.getEndTime()!=null?java.sql.Timestamp.from(descriptor.getEndTime()):null). + add(fields.get(ID),descriptor.getId()). + add(fields.get(REPORT_URL),descriptor.getReportUrl()). + add(fields.get(START),descriptor.getStartTime()!=null?java.sql.Timestamp.from(descriptor.getStartTime()):null). + add(fields.get(STATUS),descriptor.getStatus().toString()); + }catch(Throwable t) { + throw new InvalidRequest(t); + } } - + public static final DBQueryDescriptor translateObject(ExecutionRequest request) throws InvalidRequest{ - + try{ + return new DBQueryDescriptor(). + add(fields.get(CALLER_CONTEXT),request.getContext()). + add(fields.get(CALLER_TOKEN),request.getEncryptedToken()). + add(fields.get(CALLER_ID),request.getCallerID()). + add(fields.get(CONTROLLERS),toField(request.getToInvokeControllers())). + add(fields.get(COLLECTORS),toField(request.getToInvokeCollectors())); + // add(fields.get(END),descriptor.getEndTime()!=null?java.sql.Timestamp.from(descriptor.getEndTime()):null). + // add(fields.get(ID),descriptor.getId()). + // add(fields.get(REPORT_URL),descriptor.getReportUrl()). + // add(fields.get(START),descriptor.getStartTime()!=null?java.sql.Timestamp.from(descriptor.getStartTime()):null). + // add(fields.get(STATUS),descriptor.getStatus().toString()); + }catch(Throwable t) { + throw new InvalidRequest(t); + } + } + + private static final Set fromField(String fieldValue){ + HashSet toReturn=new HashSet<>(); + for(String v:fieldValue.split(",")) + toReturn.add(v); + return toReturn; + } + + private static final String toField(Set values){ + StringBuilder toReturn=new StringBuilder(); + if(values!=null&&!values.isEmpty()) { + ArrayList sorted=new ArrayList(values); + Collections.sort(sorted); + for(String v:sorted) + toReturn.append(v+","); + return toReturn.substring(0, toReturn.length()-1); + } + else return ""; } } diff --git a/gCat-Feeder/src/main/java/org/gcube/data/publishing/gCatFeeder/service/engine/impl/StorageImpl.java b/gCat-Feeder/src/main/java/org/gcube/data/publishing/gCatFeeder/service/engine/impl/persistence/StorageImpl.java similarity index 97% rename from gCat-Feeder/src/main/java/org/gcube/data/publishing/gCatFeeder/service/engine/impl/StorageImpl.java rename to gCat-Feeder/src/main/java/org/gcube/data/publishing/gCatFeeder/service/engine/impl/persistence/StorageImpl.java index 1753d6b..4ab923f 100644 --- a/gCat-Feeder/src/main/java/org/gcube/data/publishing/gCatFeeder/service/engine/impl/StorageImpl.java +++ b/gCat-Feeder/src/main/java/org/gcube/data/publishing/gCatFeeder/service/engine/impl/persistence/StorageImpl.java @@ -1,4 +1,4 @@ -package org.gcube.data.publishing.gCatFeeder.service.engine.impl; +package org.gcube.data.publishing.gCatFeeder.service.engine.impl.persistence; import org.gcube.data.publishing.gCatFeeder.service.engine.Storage; import org.gcube.data.publishing.gCatFeeder.service.model.fault.InternalError; diff --git a/gCat-Feeder/src/main/java/org/gcube/data/publishing/gCatFeeder/service/model/ExecutionDescriptor.java b/gCat-Feeder/src/main/java/org/gcube/data/publishing/gCatFeeder/service/model/ExecutionDescriptor.java index 177aec8..a96379d 100644 --- a/gCat-Feeder/src/main/java/org/gcube/data/publishing/gCatFeeder/service/model/ExecutionDescriptor.java +++ b/gCat-Feeder/src/main/java/org/gcube/data/publishing/gCatFeeder/service/model/ExecutionDescriptor.java @@ -1,5 +1,6 @@ package org.gcube.data.publishing.gCatFeeder.service.model; +import java.time.Instant; import java.util.Set; @@ -17,9 +18,22 @@ public class ExecutionDescriptor { private ExecutionStatus status; private String reportUrl; + private Instant startTime; + private Instant endTime; - + public Instant getStartTime() { + return startTime; + } + public void setStartTime(Instant startTime) { + this.startTime = startTime; + } + public Instant getEndTime() { + return endTime; + } + public void setEndTime(Instant endTime) { + this.endTime = endTime; + } public Long getId() { return id; } diff --git a/gCat-Feeder/src/main/java/org/gcube/data/publishing/gCatFeeder/service/model/ExecutionRequest.java b/gCat-Feeder/src/main/java/org/gcube/data/publishing/gCatFeeder/service/model/ExecutionRequest.java index b0697e9..12be207 100644 --- a/gCat-Feeder/src/main/java/org/gcube/data/publishing/gCatFeeder/service/model/ExecutionRequest.java +++ b/gCat-Feeder/src/main/java/org/gcube/data/publishing/gCatFeeder/service/model/ExecutionRequest.java @@ -8,6 +8,10 @@ public class ExecutionRequest { private Set toInvokeCollectors=new HashSet<>(); private Set toInvokeControllers=new HashSet<>(); + private String callerID; + private String context; + private String encryptedToken; + public ExecutionRequest addCollectorId(String id) { this.toInvokeCollectors.add(id); @@ -36,4 +40,36 @@ public class ExecutionRequest { public void setToInvokeControllers(Set toInvokeControllers) { this.toInvokeControllers = toInvokeControllers; } + + + public String getCallerID() { + return callerID; + } + + + public void setCallerID(String callerID) { + this.callerID = callerID; + } + + + public String getContext() { + return context; + } + + + public void setContext(String context) { + this.context = context; + } + + + public String getEncryptedToken() { + return encryptedToken; + } + + + public void setEncryptedToken(String encryptedToken) { + this.encryptedToken = encryptedToken; + } + + } diff --git a/gCat-Feeder/src/main/java/org/gcube/data/publishing/gCatFeeder/service/rest/Executions.java b/gCat-Feeder/src/main/java/org/gcube/data/publishing/gCatFeeder/service/rest/Executions.java index 88ae851..523addd 100644 --- a/gCat-Feeder/src/main/java/org/gcube/data/publishing/gCatFeeder/service/rest/Executions.java +++ b/gCat-Feeder/src/main/java/org/gcube/data/publishing/gCatFeeder/service/rest/Executions.java @@ -18,6 +18,7 @@ import javax.ws.rs.core.UriInfo; import org.gcube.data.publishing.gCatFeeder.service.GCatFeederManager; import org.gcube.data.publishing.gCatFeeder.service.ServiceConstants; import org.gcube.data.publishing.gCatFeeder.service.engine.FeederEngine; +import org.gcube.data.publishing.gCatFeeder.service.engine.Infrastructure; import org.gcube.data.publishing.gCatFeeder.service.engine.impl.persistence.DBQueryDescriptor; import org.gcube.data.publishing.gCatFeeder.service.model.ExecutionDescriptor; import org.gcube.data.publishing.gCatFeeder.service.model.ExecutionRequest; @@ -38,6 +39,9 @@ public class Executions { @Inject private FeederEngine engine; + @Inject + private Infrastructure infrastructure; + @POST @Produces(MediaType.APPLICATION_JSON) @@ -56,6 +60,10 @@ public class Executions { request.addControllerId(catalogue); else request.addControllerId(ServiceConstants.Executions.DEFAULT_VALUE); + String token=infrastructure.getCurrentToken(); + request.setCallerID(infrastructure.getClientID(token)); + request.setContext(infrastructure.getCurrentContext()); + request.setEncryptedToken(infrastructure.encrypt(token)); log.trace("Submitting request {} ",request);