diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/IMaintenanceTask.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/IMaintenanceTask.java index 99e883737b0b39fe084a32dd1eb7ae10dbb51ec6..5506be5bc9626a6658c415d29f869844c8fbb6ce 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/IMaintenanceTask.java +++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/IMaintenanceTask.java @@ -19,24 +19,24 @@ package ch.systemsx.cisd.etlserver; import java.util.Properties; /** - * The interface that should be implemented by all maintenance tasks. + * The interface that should be implemented by all maintenance tasks. Task instances are reusable. * * @author Izabela Adamczyk */ public interface IMaintenanceTask { - - /** - * Performs the maintenance task. - */ - public void execute(); - /** - * Prepares the task for execution and checks that it has been configured correctly. + * Prepares the task for execution and checks that it has been configured correctly. It will be + * called exactly once immediately after the task is created. * * @param pluginName Name of the plugin. Useful for creating messages. - * @param properties Properties to set up the task. + * @param properties Properties to set up the task. */ public void setUp(String pluginName, Properties properties); + /** + * Performs the maintenance task. This method is reusable - it will be called many times every + * certain time period. + */ + public void execute(); } diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/MaintenancePlugin.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/MaintenancePlugin.java index 9c870437eced6aeb77b1e9413f4f7af855de8b25..9da7146a77e8571f779809b53f47f643763d043e 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/MaintenancePlugin.java +++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/MaintenancePlugin.java @@ -9,9 +9,9 @@ import ch.systemsx.cisd.common.utilities.ClassUtils; public class MaintenancePlugin { - IMaintenanceTask task; + private final IMaintenanceTask task; - MaintenanceTaskParameters parameters; + private final MaintenanceTaskParameters parameters; public MaintenancePlugin(MaintenanceTaskParameters parameters) { diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/plugins/DataSetDeletionMaintenanceTask.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/plugins/DataSetDeletionMaintenanceTask.java index 240d423deaa0985d623d2504d537916f02c66b45..7905191229e9c643ad33f61ea2991b002de0a4ec 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/plugins/DataSetDeletionMaintenanceTask.java +++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/plugins/DataSetDeletionMaintenanceTask.java @@ -22,6 +22,8 @@ import java.sql.SQLException; import java.util.List; import java.util.Properties; +import javax.sql.DataSource; + import org.apache.commons.lang.StringEscapeUtils; import org.apache.log4j.Logger; @@ -58,7 +60,7 @@ public class DataSetDeletionMaintenanceTask implements IMaintenanceTask private static final String DATABASE_ENGINE_KEY = "database.engine"; private static final String DEFAULT_DATABASE_ENGINE = "postgresql"; - + private static final String DEFAULT_DATA_SET_PERM_ID = "PERM_ID"; private static final String DATA_SET_PERM_ID_KEY = "data-set-perm-id"; @@ -80,9 +82,7 @@ public class DataSetDeletionMaintenanceTask implements IMaintenanceTask private final IEncapsulatedOpenBISService openBISService; - private DatabaseConfigurationContext context; - - private Connection connection; + private DataSource dataSource; private String synchronizationTable; @@ -107,8 +107,9 @@ public class DataSetDeletionMaintenanceTask implements IMaintenanceTask dataSetTableName = properties.getProperty(DATA_SET_TABLE_NAME_KEY, DEFAULT_DATA_SET_TABLE_NAME); permIDColumn = properties.getProperty(DATA_SET_PERM_ID_KEY, DEFAULT_DATA_SET_PERM_ID); - context = createDatabaseConfigurationContext(properties); + DatabaseConfigurationContext context = createDatabaseConfigurationContext(properties); init(context); + this.dataSource = context.getDataSource(); checkDatabseConnection(); operationLog.info("Plugin initialized: " + pluginName); } @@ -149,29 +150,33 @@ public class DataSetDeletionMaintenanceTask implements IMaintenanceTask */ protected void init(DatabaseConfigurationContext databaseConfigurationContext) { - + } private void checkDatabseConnection() { + Connection connection = null; try { - connection = context.getDataSource().getConnection(); - tryGetPreviousLastSeenEventId(); - connection.close(); + connection = createConnection(); + tryGetPreviousLastSeenEventId(connection); } catch (SQLException ex) { throw new ConfigurationFailureException("Initialization failed", ex); + } finally + { + closeConnection(connection); } } public void execute() { operationLog.info("Synchronizing data set information"); + Connection connection = null; try { - connection = context.getDataSource().getConnection(); - Long lastSeenEventId = tryGetPreviousLastSeenEventId(); + connection = createConnection(); + Long lastSeenEventId = tryGetPreviousLastSeenEventId(connection); List<DeletedDataSet> deletedDataSets = openBISService.listDeletedDataSets(lastSeenEventId); if (deletedDataSets.size() > 0) @@ -179,32 +184,55 @@ public class DataSetDeletionMaintenanceTask implements IMaintenanceTask boolean autoCommit = connection.getAutoCommit(); connection.setAutoCommit(false); long t0 = System.currentTimeMillis(); - deleteDatasets(deletedDataSets); - updateSynchronizationDate(lastSeenEventId, deletedDataSets); + deleteDatasets(deletedDataSets, connection); + updateSynchronizationDate(lastSeenEventId, deletedDataSets, connection); connection.commit(); operationLog.info("Synchronization task took " + ((System.currentTimeMillis() - t0 + 500) / 1000) + " seconds."); connection.setAutoCommit(autoCommit); } - connection.close(); } catch (SQLException ex) { operationLog.error(ex); + } finally + { + closeConnection(connection); } } - private void deleteDatasets(List<DeletedDataSet> deletedDataSets) throws SQLException + private void closeConnection(Connection connectionOrNull) { - operationLog.info(String.format( - "Synchronizing deletions of %d datasets with the database.", - deletedDataSets.size())); - connection.createStatement().execute( - String.format("DELETE FROM " + dataSetTableName + " WHERE " + permIDColumn + " IN (%s)", - joinIds(deletedDataSets))); + if (connectionOrNull != null) + { + try + { + connectionOrNull.close(); + } catch (SQLException ex) + { + // suppress this exception + operationLog.error(ex); + } + } + } + + private Connection createConnection() throws SQLException + { + return dataSource.getConnection(); } - private void updateSynchronizationDate(Long lastSeenEventIdOrNull, List<DeletedDataSet> deleted) + private void deleteDatasets(List<DeletedDataSet> deletedDataSets, Connection connection) throws SQLException + { + operationLog.info(String + .format("Synchronizing deletions of %d datasets with the database.", + deletedDataSets.size())); + connection.createStatement().execute( + String.format("DELETE FROM " + dataSetTableName + " WHERE " + permIDColumn + + " IN (%s)", joinIds(deletedDataSets))); + } + + private void updateSynchronizationDate(Long lastSeenEventIdOrNull, + List<DeletedDataSet> deleted, Connection connection) throws SQLException { Long maxEventId = lastSeenEventIdOrNull; for (DeletedDataSet dds : deleted) @@ -218,13 +246,13 @@ public class DataSetDeletionMaintenanceTask implements IMaintenanceTask if (lastSeenEventIdOrNull == null || maxEventId > lastSeenEventIdOrNull) { // we store only the last update time, so all the others can be deleted - executeSql("delete from " + synchronizationTable); + executeSql("delete from " + synchronizationTable, connection); executeSql("INSERT INTO " + synchronizationTable + " (" + lastSeenEventID - + ") VALUES('" + maxEventId + "')"); + + ") VALUES('" + maxEventId + "')", connection); } } - private void executeSql(String sql) throws SQLException + private void executeSql(String sql, Connection connection) throws SQLException { PreparedStatement statement = connection.prepareStatement(sql); statement.executeUpdate(); @@ -245,13 +273,13 @@ public class DataSetDeletionMaintenanceTask implements IMaintenanceTask return ids; } - private long tryGetPreviousLastSeenEventId() throws SQLException + private long tryGetPreviousLastSeenEventId(Connection connection) throws SQLException { Long maxLastSeenEventId = null; ResultSet result = connection.createStatement().executeQuery( - "SELECT MAX(" + lastSeenEventID + ") AS " + lastSeenEventID - + " FROM " + synchronizationTable); + "SELECT MAX(" + lastSeenEventID + ") AS " + lastSeenEventID + " FROM " + + synchronizationTable); while (result.next()) { long newLastSeenEventId = result.getLong(lastSeenEventID); diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/DataStoreService.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/DataStoreService.java index 2d27798abf44d1670a6ccbe9f647642962e07bd2..86869a65c77670d38d44754b25fe4564d5c9dce9 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/DataStoreService.java +++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/DataStoreService.java @@ -226,7 +226,7 @@ public class DataStoreService extends AbstractServiceWithLogger<IDataStoreServic PluginTaskProvider<IReportingPluginTask> reportingPlugins = pluginTaskParameters.getReportingPluginsProvider(); - IReportingPluginTask task = reportingPlugins.createPluginInstance(serviceKey, storeRoot); + IReportingPluginTask task = reportingPlugins.getPluginInstance(serviceKey); return task.createReport(datasets); } @@ -238,7 +238,7 @@ public class DataStoreService extends AbstractServiceWithLogger<IDataStoreServic PluginTaskProvider<IProcessingPluginTask> plugins = pluginTaskParameters.getProcessingPluginsProvider(); - IProcessingPluginTask task = plugins.createPluginInstance(serviceKey, storeRoot); + IProcessingPluginTask task = plugins.getPluginInstance(serviceKey); DatastoreServiceDescription pluginDescription = plugins.getPluginDescription(serviceKey); commandExecutor.scheduleProcessDatasets(task, datasets, userEmailOrNull, pluginDescription, mailClientParameters); diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/tasks/AbstractPluginTaskFactory.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/tasks/AbstractPluginTaskFactory.java index 99f056f9cd12164160aa98c7883a70c9d3f75d93..1ff38b6506f7828b36276f141f69815c1bef7349 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/tasks/AbstractPluginTaskFactory.java +++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/tasks/AbstractPluginTaskFactory.java @@ -47,13 +47,6 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatastoreServiceDescrip */ public abstract class AbstractPluginTaskFactory<T> { - /** - * Creates a new instance of a plugin task - * - * @param storeRoot the root directory of the file store - */ - abstract public T createPluginInstance(File storeRoot); - /** * Logs the current parameters to the {@link LogCategory#OPERATION} log. */ @@ -87,7 +80,10 @@ public abstract class AbstractPluginTaskFactory<T> private final Properties instanceParameters; - protected AbstractPluginTaskFactory(SectionProperties sectionProperties, String datastoreCode) + private final T pluginInstance; + + protected AbstractPluginTaskFactory(SectionProperties sectionProperties, String datastoreCode, + Class<T> clazz, File storeRoot) { Properties pluginProperties = sectionProperties.getProperties(); String pluginKey = sectionProperties.getKey(); @@ -97,9 +93,18 @@ public abstract class AbstractPluginTaskFactory<T> new DatastoreServiceDescription(pluginKey, label, datasetCodes, datastoreCode); this.className = PropertyUtils.getMandatoryProperty(pluginProperties, CLASS_PROPERTY_NAME); this.instanceParameters = extractInstanceParameters(pluginProperties); + this.pluginInstance = createPluginInstance(clazz, storeRoot); + } + + /** + * Returns an instance of a plugin task + */ + public T getPluginInstance() + { + return pluginInstance; } - protected T createPluginInstance(Class<T> clazz, File storeRoot) + private T createPluginInstance(Class<T> clazz, File storeRoot) { try { @@ -170,14 +175,13 @@ public abstract class AbstractPluginTaskFactory<T> */ public void check(boolean checkIfSerializable) { - T pluginInstance = createPluginInstance(new File(".")); // just to see if it is possible if (checkIfSerializable) { - checkInstanceSerializable(pluginInstance); + checkInstanceSerializable(); } } - private void checkInstanceSerializable(T pluginInstance) + private void checkInstanceSerializable() { try { @@ -191,12 +195,12 @@ public abstract class AbstractPluginTaskFactory<T> in.readObject(); // read the object back } catch (Exception ex) { - throwSerializationError(pluginInstance, ex.getMessage()); + throwSerializationError(ex.getMessage()); } } - private void throwSerializationError(T pluginInstance, String message) + private void throwSerializationError(String message) { throw UserFailureException.fromTemplate( "Plugin '%s' has problems with serialization/deserialization: %s", pluginInstance diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/tasks/IProcessingPluginTask.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/tasks/IProcessingPluginTask.java index 6bcbcf8c376f463b41a288e6cdc6e1d8ae6fb0f4..5a38089dd32d0bdd94bbf691ae54e94bd3af40b4 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/tasks/IProcessingPluginTask.java +++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/tasks/IProcessingPluginTask.java @@ -22,7 +22,8 @@ import java.util.List; import ch.systemsx.cisd.openbis.generic.shared.dto.DatasetDescription; /** - * Interface of the processing plugin task. + * Interface of the processing plugin task. Implementations will be singletons serving all the + * requests. * * @author Tomasz Pylak */ diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/tasks/IReportingPluginTask.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/tasks/IReportingPluginTask.java index 413584ecbb3a019fd3d8759103e2fc50e5771811..61ea4952e8024f0ac7c8a30013bad44a5e0b578c 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/tasks/IReportingPluginTask.java +++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/tasks/IReportingPluginTask.java @@ -22,14 +22,15 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModel; import ch.systemsx.cisd.openbis.generic.shared.dto.DatasetDescription; /** - * Interface of the reporting plugin task. + * Interface of the reporting plugin task. Implementations will be singletons serving all the + * requests. * * @author Tomasz Pylak */ public interface IReportingPluginTask { /** - * Creates a report for the specified datasets + * Creates a report for the specified datasets. This method should be multi threaded. */ TableModel createReport(List<DatasetDescription> datasets); } diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/tasks/PluginTaskProvider.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/tasks/PluginTaskProvider.java index 28537f048966ba11376462d0a468d7355d4d02e1..0d80c7d6a62278d0e80319146a96a870eba76974 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/tasks/PluginTaskProvider.java +++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/tasks/PluginTaskProvider.java @@ -16,7 +16,6 @@ package ch.systemsx.cisd.openbis.dss.generic.server.plugins.tasks; -import java.io.File; import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -47,10 +46,12 @@ public class PluginTaskProvider<P> }); } - /** creates an instance of the plugin with the given key */ - public P createPluginInstance(String pluginKey, File storeRoot) + /** + * returns an instance of the plugin with the given key + */ + public P getPluginInstance(String pluginKey) { - return getFactory(pluginKey).createPluginInstance(storeRoot); + return getFactory(pluginKey).getPluginInstance(); } public DatastoreServiceDescription getPluginDescription(String pluginKey) @@ -97,4 +98,3 @@ public class PluginTaskProvider<P> return factory; } } - diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/tasks/PluginTaskProviders.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/tasks/PluginTaskProviders.java index c7751e18df7a68dde2241f54ca49c6695243e46c..b86119161de5790cd32a53946c60d4288c5c6f0c 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/tasks/PluginTaskProviders.java +++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/tasks/PluginTaskProviders.java @@ -16,6 +16,7 @@ package ch.systemsx.cisd.openbis.dss.generic.server.plugins.tasks; +import java.io.File; import java.util.Properties; import ch.rinn.restrictions.Private; @@ -47,10 +48,10 @@ public class PluginTaskProviders private final ArchiverTaskFactory archiverTaskFactory; /** for external injections */ - public static PluginTaskProviders create() + public static PluginTaskProviders create(File storeRoot) { Properties properties = PropertyParametersUtil.loadServiceProperties(); - PluginTaskProviders providers = new PluginTaskProviders(properties); + PluginTaskProviders providers = new PluginTaskProviders(properties, storeRoot); providers.check(); providers.logConfigurations(); return providers; @@ -58,11 +59,13 @@ public class PluginTaskProviders @Private // public only for tests - public PluginTaskProviders(Properties serviceProperties) + public PluginTaskProviders(Properties serviceProperties, File storeRoot) { String datastoreCode = PropertyParametersUtil.getDataStoreCode(serviceProperties); - this.reportingPlugins = createReportingPluginsFactories(serviceProperties, datastoreCode); - this.processingPlugins = createProcessingPluginsFactories(serviceProperties, datastoreCode); + this.reportingPlugins = + createReportingPluginsFactories(serviceProperties, datastoreCode, storeRoot); + this.processingPlugins = + createProcessingPluginsFactories(serviceProperties, datastoreCode, storeRoot); this.archiverTaskFactory = createArchiverTaskFactory(serviceProperties, datastoreCode); } @@ -96,7 +99,7 @@ public class PluginTaskProviders @Private static PluginTaskProvider<IReportingPluginTask> createReportingPluginsFactories( - Properties serviceProperties, String datastoreCode) + Properties serviceProperties, String datastoreCode, File storeRoot) { SectionProperties[] sectionsProperties = extractSectionProperties(serviceProperties, REPORTING_PLUGIN_NAMES); @@ -104,14 +107,15 @@ public class PluginTaskProviders new ReportingPluginTaskFactory[sectionsProperties.length]; for (int i = 0; i < factories.length; i++) { - factories[i] = new ReportingPluginTaskFactory(sectionsProperties[i], datastoreCode); + factories[i] = + new ReportingPluginTaskFactory(sectionsProperties[i], datastoreCode, storeRoot); } return new PluginTaskProvider<IReportingPluginTask>(factories); } @Private static PluginTaskProvider<IProcessingPluginTask> createProcessingPluginsFactories( - Properties serviceProperties, String datastoreCode) + Properties serviceProperties, String datastoreCode, File storeRoot) { SectionProperties[] sectionsProperties = extractSectionProperties(serviceProperties, PROCESSING_PLUGIN_NAMES); @@ -119,7 +123,8 @@ public class PluginTaskProviders new ProcessingPluginTaskFactory[sectionsProperties.length]; for (int i = 0; i < factories.length; i++) { - factories[i] = new ProcessingPluginTaskFactory(sectionsProperties[i], datastoreCode); + factories[i] = + new ProcessingPluginTaskFactory(sectionsProperties[i], datastoreCode, storeRoot); } return new PluginTaskProvider<IProcessingPluginTask>(factories); } diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/tasks/ProcessingPluginTaskFactory.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/tasks/ProcessingPluginTaskFactory.java index 7624d73e9aa4d151d9087c28e694d893e54afa70..3a570b3d21106805bd4281dc311bfefe369f0ac4 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/tasks/ProcessingPluginTaskFactory.java +++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/tasks/ProcessingPluginTaskFactory.java @@ -34,15 +34,10 @@ public class ProcessingPluginTaskFactory extends AbstractPluginTaskFactory<IProc private static final Logger operationLog = LogFactory.getLogger(LogCategory.OPERATION, ProcessingPluginTaskFactory.class); - public ProcessingPluginTaskFactory(SectionProperties sectionProperties, String datastoreCode) + public ProcessingPluginTaskFactory(SectionProperties sectionProperties, String datastoreCode, + File storeRoot) { - super(sectionProperties, datastoreCode); - } - - @Override - public IProcessingPluginTask createPluginInstance(File storeRoot) - { - return createPluginInstance(IProcessingPluginTask.class, storeRoot); + super(sectionProperties, datastoreCode, IProcessingPluginTask.class, storeRoot); } @Override diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/tasks/ReportingPluginTaskFactory.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/tasks/ReportingPluginTaskFactory.java index c53fe66052a9c83b0737fca7fda642b40869fb62..468e541fe3c5ada649101ec2757522d711c208bb 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/tasks/ReportingPluginTaskFactory.java +++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/tasks/ReportingPluginTaskFactory.java @@ -34,15 +34,10 @@ public class ReportingPluginTaskFactory extends AbstractPluginTaskFactory<IRepor private static final Logger operationLog = LogFactory.getLogger(LogCategory.OPERATION, ProcessingPluginTaskFactory.class); - public ReportingPluginTaskFactory(SectionProperties sectionProperties, String datastoreCode) + public ReportingPluginTaskFactory(SectionProperties sectionProperties, String datastoreCode, + File storeRoot) { - super(sectionProperties, datastoreCode); - } - - @Override - public IReportingPluginTask createPluginInstance(File storeRoot) - { - return createPluginInstance(IReportingPluginTask.class, storeRoot); + super(sectionProperties, datastoreCode, IReportingPluginTask.class, storeRoot); } @Override diff --git a/datastore_server/source/java/dssApplicationContext.xml b/datastore_server/source/java/dssApplicationContext.xml index 38516a6d53eb579be6ad7a259b4fee7696cbfa14..c394f4281a789b1945fe3903a1c6d9cfbbb17a60 100644 --- a/datastore_server/source/java/dssApplicationContext.xml +++ b/datastore_server/source/java/dssApplicationContext.xml @@ -18,8 +18,9 @@ <property name="ignoreUnresolvablePlaceholders" value="true" /> </bean> - <bean id="plugin-tasks" class="ch.systemsx.cisd.openbis.dss.generic.server.plugins.tasks.PluginTaskProviders" factory-method="create" /> - + <bean id="plugin-tasks" class="ch.systemsx.cisd.openbis.dss.generic.server.plugins.tasks.PluginTaskProviders" factory-method="create" > + <constructor-arg value="${storeroot-dir}" /> + </bean> <bean id="openBIS-service" class="ch.systemsx.cisd.openbis.dss.generic.server.EncapsulatedOpenBISService"> <constructor-arg ref="session-token-manager"/> diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/TransferredDataSetHandlerTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/TransferredDataSetHandlerTest.java index fc334cf8f289300a55a0148a939ce59c53f069d4..90f42d60ad166a78c8a4c6b30ebf132b5f4a4f2c 100644 --- a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/TransferredDataSetHandlerTest.java +++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/TransferredDataSetHandlerTest.java @@ -249,7 +249,8 @@ public final class TransferredDataSetHandlerTest extends AbstractFileSystemTestC final Properties properties = new Properties(); properties.setProperty(JavaMailProperties.MAIL_SMTP_HOST, "host"); properties.setProperty(JavaMailProperties.MAIL_FROM, "me"); - properties.setProperty(ETLDaemon.STOREROOT_DIR_KEY, workingDirectory.getPath()); + String storeRoot = workingDirectory.getPath(); + properties.setProperty(ETLDaemon.STOREROOT_DIR_KEY, storeRoot); storageProcessor = context.mock(IStorageProcessor.class); limsService = context.mock(IETLLIMSService.class); mailClient = context.mock(IMailClient.class); @@ -258,7 +259,7 @@ public final class TransferredDataSetHandlerTest extends AbstractFileSystemTestC typeExtractor, storageProcessor); final EncapsulatedOpenBISService authorizedLimsService = new EncapsulatedOpenBISService(new SessionTokenManager(), limsService, - PluginUtilTest.createPluginTaskProviders()); + PluginUtilTest.createPluginTaskProviders(new File(storeRoot))); authorizedLimsService.setUsername("u"); authorizedLimsService.setPassword("p"); dataSetValidator = context.mock(IDataSetValidator.class); diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/DataStoreServiceTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/DataStoreServiceTest.java index 0818805e462365e76544ed544648d73d8f3ca7c6..2ca94255804c49a3d7f7930af9f6b4f4d78ec776 100644 --- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/DataStoreServiceTest.java +++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/DataStoreServiceTest.java @@ -111,7 +111,7 @@ public class DataStoreServiceTest extends AssertJUnit mailClientParameters.setFrom("a@bc.de"); mailClientParameters.setSmtpHost("file://targets/email"); FileUtilities.deleteRecursively(TEST_FOLDER); - pluginTaskParameters = PluginUtilTest.createPluginTaskProviders(); + pluginTaskParameters = PluginUtilTest.createPluginTaskProviders(TEST_STORE); TEST_STORE.mkdirs(); } diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/EncapsulatedOpenBISServiceTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/EncapsulatedOpenBISServiceTest.java index 159b29ea54d049bd31a7e32666f2315d9e738098..18eca0705785c8f91c40b9e24a44baee29255d5a 100644 --- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/EncapsulatedOpenBISServiceTest.java +++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/EncapsulatedOpenBISServiceTest.java @@ -16,6 +16,8 @@ package ch.systemsx.cisd.openbis.dss.generic.server; +import java.io.File; + import org.hamcrest.BaseMatcher; import org.hamcrest.Description; import org.jmock.Expectations; @@ -123,7 +125,7 @@ public class EncapsulatedOpenBISServiceTest }); encapsulatedLimsService = new EncapsulatedOpenBISService(new SessionTokenManager(), limsService, - PluginUtilTest.createPluginTaskProviders()); + PluginUtilTest.createPluginTaskProviders(new File("."))); encapsulatedLimsService.setUsername(LIMS_USER); encapsulatedLimsService.setPassword(LIMS_PASSWORD); encapsulatedLimsService.setDataStoreCode(DATA_STORE_CODE); diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/tasks/PluginTaskParametersTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/tasks/PluginTaskParametersTest.java index 90dc5c94217bf1f7cc874daca850d670028124f3..b2034178d8811a7c1df28798f7ef172b9d9f0eb4 100644 --- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/tasks/PluginTaskParametersTest.java +++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/tasks/PluginTaskParametersTest.java @@ -66,9 +66,8 @@ public class PluginTaskParametersTest extends AbstractFileSystemTestCase PluginTaskProvider<IReportingPluginTask> factories = createReportingPluginsFactories(props); factories.check(false); factories.logConfigurations(); - IReportingPluginTask pluginInstance1 = factories.createPluginInstance(plugin1, STORE_ROOT); + IReportingPluginTask pluginInstance1 = factories.getPluginInstance(plugin1); pluginInstance1.createReport(createDatasetDescriptions()); - factories.createPluginInstance(plugin2, STORE_ROOT); List<DatastoreServiceDescription> descriptions = factories.getPluginDescriptions(); assertEquals(2, descriptions.size()); @@ -98,13 +97,13 @@ public class PluginTaskParametersTest extends AbstractFileSystemTestCase private static PluginTaskProvider<IReportingPluginTask> createReportingPluginsFactories( Properties props) { - return PluginTaskProviders.createReportingPluginsFactories(props, "dss"); + return PluginTaskProviders.createReportingPluginsFactories(props, "dss", STORE_ROOT); } private static PluginTaskProvider<IProcessingPluginTask> createProcessingPluginsFactories( Properties props) { - return PluginTaskProviders.createProcessingPluginsFactories(props, "dss"); + return PluginTaskProviders.createProcessingPluginsFactories(props, "dss", STORE_ROOT); } @Test @@ -135,7 +134,7 @@ public class PluginTaskParametersTest extends AbstractFileSystemTestCase createProcessingPluginsFactories(props); factories.check(true); factories.logConfigurations(); - IProcessingPluginTask pluginInstance1 = factories.createPluginInstance(plugin1, STORE_ROOT); + IProcessingPluginTask pluginInstance1 = factories.getPluginInstance(plugin1); pluginInstance1.process(createDatasetDescriptions()); } diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/shared/utils/PluginUtilTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/shared/utils/PluginUtilTest.java index 8645bf32bccd79cb7f9850bbfbb3d910ca91a7bb..7d7e69df91f98d97c2cc94f5f0d9740d1f41e4f1 100644 --- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/shared/utils/PluginUtilTest.java +++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/shared/utils/PluginUtilTest.java @@ -16,6 +16,7 @@ package ch.systemsx.cisd.openbis.dss.generic.shared.utils; +import java.io.File; import java.util.Properties; import ch.rinn.restrictions.Friend; @@ -27,10 +28,10 @@ import ch.systemsx.cisd.openbis.dss.generic.server.plugins.tasks.PluginTaskProvi @Friend(toClasses = PropertyParametersUtil.class) public class PluginUtilTest { - public static PluginTaskProviders createPluginTaskProviders() + public static PluginTaskProviders createPluginTaskProviders(File storeRoot) { Properties serviceProperties = new Properties(); serviceProperties.put(PropertyParametersUtil.DSS_CODE_KEY, "dss"); - return new PluginTaskProviders(serviceProperties); + return new PluginTaskProviders(serviceProperties, storeRoot); } } diff --git a/rtd_yeastx/source/java/ch/systemsx/cisd/yeastx/eicml/AbstractEICMLDatastoreReportingPlugin.java b/rtd_yeastx/source/java/ch/systemsx/cisd/yeastx/eicml/AbstractEICMLDatastoreReportingPlugin.java new file mode 100644 index 0000000000000000000000000000000000000000..e2cc1edbd774369392928ff3f2ff868f276730a4 --- /dev/null +++ b/rtd_yeastx/source/java/ch/systemsx/cisd/yeastx/eicml/AbstractEICMLDatastoreReportingPlugin.java @@ -0,0 +1,72 @@ +/* + * Copyright 2010 ETH Zuerich, CISD + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package ch.systemsx.cisd.yeastx.eicml; + +import java.io.File; +import java.util.List; +import java.util.Properties; + +import javax.sql.DataSource; + +import net.lemnik.eodsql.QueryTool; + +import ch.systemsx.cisd.dbmigration.DatabaseConfigurationContext; +import ch.systemsx.cisd.openbis.dss.generic.server.plugins.standard.AbstractDatastorePlugin; +import ch.systemsx.cisd.openbis.dss.generic.server.plugins.tasks.IReportingPluginTask; +import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModel; +import ch.systemsx.cisd.openbis.generic.shared.dto.DatasetDescription; +import ch.systemsx.cisd.yeastx.db.DBUtils; + +/** + * Abstract superclass for reporting plugins operating on the metabol database. + * + * @author Tomasz Pylak + */ +abstract public class AbstractEICMLDatastoreReportingPlugin extends AbstractDatastorePlugin + implements IReportingPluginTask +{ + private static final long serialVersionUID = 1L; + + /** creates a report for specified datasets using a given DAO. */ + abstract protected TableModel createReport(List<DatasetDescription> datasets, IEICMSRunDAO query); + + private final DataSource dataSource; + + public AbstractEICMLDatastoreReportingPlugin(Properties properties, File storeRoot) + { + super(properties, storeRoot); + final DatabaseConfigurationContext dbContext = DBUtils.createAndInitDBContext(properties); + this.dataSource = dbContext.getDataSource(); + } + + private IEICMSRunDAO createQuery() + { + return QueryTool.getQuery(dataSource, IEICMSRunDAO.class); + } + + public TableModel createReport(List<DatasetDescription> datasets) + { + IEICMSRunDAO query = createQuery(); + try + { + return createReport(datasets, query); + } finally + { + query.close(); + } + } +} diff --git a/rtd_yeastx/source/java/ch/systemsx/cisd/yeastx/eicml/EICMLChromatogramImagesReporter.java b/rtd_yeastx/source/java/ch/systemsx/cisd/yeastx/eicml/EICMLChromatogramImagesReporter.java index b698d2718ac728af2f5b28b7c2f00049248960a3..76b6f0bd65439d8e04a79b1a568e90bab04a4912 100644 --- a/rtd_yeastx/source/java/ch/systemsx/cisd/yeastx/eicml/EICMLChromatogramImagesReporter.java +++ b/rtd_yeastx/source/java/ch/systemsx/cisd/yeastx/eicml/EICMLChromatogramImagesReporter.java @@ -23,15 +23,9 @@ import java.util.Comparator; import java.util.List; import java.util.Properties; -import javax.sql.DataSource; - import net.lemnik.eodsql.DataIterator; -import net.lemnik.eodsql.QueryTool; import ch.rinn.restrictions.Private; -import ch.systemsx.cisd.dbmigration.DatabaseConfigurationContext; -import ch.systemsx.cisd.openbis.dss.generic.server.plugins.standard.AbstractDatastorePlugin; -import ch.systemsx.cisd.openbis.dss.generic.server.plugins.tasks.IReportingPluginTask; import ch.systemsx.cisd.openbis.dss.generic.server.plugins.tasks.SimpleTableModelBuilder; import ch.systemsx.cisd.openbis.dss.yeastx.server.EICMLChromatogramGeneratorServlet; import ch.systemsx.cisd.openbis.generic.shared.GenericSharedConstants; @@ -40,18 +34,16 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ISerializableComparable import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModel; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelRow; import ch.systemsx.cisd.openbis.generic.shared.dto.DatasetDescription; -import ch.systemsx.cisd.yeastx.db.DBUtils; /** * Reporting plugin which shows images for the chromatograms contained in the specified datasets. * * @author Chandrasekhar Ramakrishnan */ -public class EICMLChromatogramImagesReporter extends AbstractDatastorePlugin implements - IReportingPluginTask +public class EICMLChromatogramImagesReporter extends AbstractEICMLDatastoreReportingPlugin { private static final String CHROMATOGRAM_SERVLET = "chromatogram"; - + private static final int MZ_1_COLUMN_INDEX = 1; private static final int THUMBNAIL_WIDTH = 300; @@ -64,8 +56,6 @@ public class EICMLChromatogramImagesReporter extends AbstractDatastorePlugin imp private static final long serialVersionUID = 1L; - private final IEICMSRunDAO query; - /** * An internal helper class for storing the information for the query parameters to the image * servlet. @@ -110,21 +100,14 @@ public class EICMLChromatogramImagesReporter extends AbstractDatastorePlugin imp public EICMLChromatogramImagesReporter(Properties properties, File storeRoot) { super(properties, storeRoot); - this.query = createQuery(properties); - } - - private static IEICMSRunDAO createQuery(Properties properties) - { - final DatabaseConfigurationContext dbContext = DBUtils.createAndInitDBContext(properties); - DataSource dataSource = dbContext.getDataSource(); - return QueryTool.getQuery(dataSource, IEICMSRunDAO.class); } - public TableModel createReport(List<DatasetDescription> datasets) + @Override + protected final TableModel createReport(List<DatasetDescription> datasets, IEICMSRunDAO query) { SimpleTableModelBuilder builder = new SimpleTableModelBuilder(); addReportHeaders(builder); - List<DatasetRun> runs = fetchRuns(datasets); + List<DatasetRun> runs = fetchRuns(datasets, query); for (DatasetRun datasetRun : runs) { DataIterator<ChromatogramDTO> chromatograms = @@ -146,7 +129,7 @@ public class EICMLChromatogramImagesReporter extends AbstractDatastorePlugin imp return tableModel; } - private List<DatasetRun> fetchRuns(List<DatasetDescription> datasets) + private List<DatasetRun> fetchRuns(List<DatasetDescription> datasets, IEICMSRunDAO query) { List<DatasetRun> runs = new ArrayList<DatasetRun>(); for (DatasetDescription dataset : datasets) diff --git a/rtd_yeastx/source/java/ch/systemsx/cisd/yeastx/eicml/EICMLChromatogramsReporter.java b/rtd_yeastx/source/java/ch/systemsx/cisd/yeastx/eicml/EICMLChromatogramsReporter.java index 868e46872c2d204029e42a0292ae6bcb35d51ca2..8785555b1c3a27061aab16b1b658c8c67573e8ae 100644 --- a/rtd_yeastx/source/java/ch/systemsx/cisd/yeastx/eicml/EICMLChromatogramsReporter.java +++ b/rtd_yeastx/source/java/ch/systemsx/cisd/yeastx/eicml/EICMLChromatogramsReporter.java @@ -24,50 +24,33 @@ import java.util.ArrayList; import java.util.List; import java.util.Properties; -import javax.sql.DataSource; - import net.lemnik.eodsql.DataIterator; -import net.lemnik.eodsql.QueryTool; -import ch.systemsx.cisd.dbmigration.DatabaseConfigurationContext; -import ch.systemsx.cisd.openbis.dss.generic.server.plugins.standard.AbstractDatastorePlugin; -import ch.systemsx.cisd.openbis.dss.generic.server.plugins.tasks.IReportingPluginTask; import ch.systemsx.cisd.openbis.dss.generic.server.plugins.tasks.SimpleTableModelBuilder; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ISerializableComparable; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModel; import ch.systemsx.cisd.openbis.generic.shared.dto.DatasetDescription; -import ch.systemsx.cisd.yeastx.db.DBUtils; /** * Reporting plugin which shows all the chromatograms details for the chosen datasets. * * @author Tomasz Pylak */ -public class EICMLChromatogramsReporter extends AbstractDatastorePlugin implements - IReportingPluginTask +public class EICMLChromatogramsReporter extends AbstractEICMLDatastoreReportingPlugin { - private final IEICMSRunDAO query; + private static final long serialVersionUID = 1L; public EICMLChromatogramsReporter(Properties properties, File storeRoot) { super(properties, storeRoot); - this.query = createQuery(properties); } - private static IEICMSRunDAO createQuery(Properties properties) - { - final DatabaseConfigurationContext dbContext = DBUtils.createAndInitDBContext(properties); - DataSource dataSource = dbContext.getDataSource(); - return QueryTool.getQuery(dataSource, IEICMSRunDAO.class); - } - - private static final long serialVersionUID = 1L; - - public TableModel createReport(List<DatasetDescription> datasets) + @Override + protected final TableModel createReport(List<DatasetDescription> datasets, IEICMSRunDAO query) { SimpleTableModelBuilder builder = new SimpleTableModelBuilder(); addReportHeaders(builder); - List<EICMSRunDTO> runs = fetchRuns(datasets); + List<EICMSRunDTO> runs = fetchRuns(datasets, query); for (EICMSRunDTO run : runs) { DataIterator<ChromatogramDTO> chromatograms = query.getChromatogramsForRun(run); @@ -76,7 +59,7 @@ public class EICMLChromatogramsReporter extends AbstractDatastorePlugin implemen return builder.getTableModel(); } - private List<EICMSRunDTO> fetchRuns(List<DatasetDescription> datasets) + private List<EICMSRunDTO> fetchRuns(List<DatasetDescription> datasets, IEICMSRunDAO query) { List<EICMSRunDTO> runs = new ArrayList<EICMSRunDTO>(); for (DatasetDescription dataset : datasets) diff --git a/rtd_yeastx/source/java/ch/systemsx/cisd/yeastx/eicml/EICMLRunsReporter.java b/rtd_yeastx/source/java/ch/systemsx/cisd/yeastx/eicml/EICMLRunsReporter.java index b55d1828b71ef0d77d6a399385ee98c1110a2b87..69f0cef0de663efe9079c23e7b792e0749d0cc57 100644 --- a/rtd_yeastx/source/java/ch/systemsx/cisd/yeastx/eicml/EICMLRunsReporter.java +++ b/rtd_yeastx/source/java/ch/systemsx/cisd/yeastx/eicml/EICMLRunsReporter.java @@ -24,44 +24,27 @@ import java.util.Date; import java.util.List; import java.util.Properties; -import javax.sql.DataSource; - -import net.lemnik.eodsql.QueryTool; - -import ch.systemsx.cisd.dbmigration.DatabaseConfigurationContext; -import ch.systemsx.cisd.openbis.dss.generic.server.plugins.standard.AbstractDatastorePlugin; -import ch.systemsx.cisd.openbis.dss.generic.server.plugins.tasks.IReportingPluginTask; import ch.systemsx.cisd.openbis.dss.generic.server.plugins.tasks.SimpleTableModelBuilder; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ISerializableComparable; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModel; import ch.systemsx.cisd.openbis.generic.shared.dto.DatasetDescription; -import ch.systemsx.cisd.yeastx.db.DBUtils; /** * Reporting plugin which shows all the run details for the chosen datasets. * * @author Tomasz Pylak */ -public class EICMLRunsReporter extends AbstractDatastorePlugin implements IReportingPluginTask +public class EICMLRunsReporter extends AbstractEICMLDatastoreReportingPlugin { - private final IEICMSRunDAO query; + private static final long serialVersionUID = 1L; public EICMLRunsReporter(Properties properties, File storeRoot) { super(properties, storeRoot); - this.query = createQuery(properties); - } - - private static IEICMSRunDAO createQuery(Properties properties) - { - final DatabaseConfigurationContext dbContext = DBUtils.createAndInitDBContext(properties); - DataSource dataSource = dbContext.getDataSource(); - return QueryTool.getQuery(dataSource, IEICMSRunDAO.class); } - private static final long serialVersionUID = 1L; - - public TableModel createReport(List<DatasetDescription> datasets) + @Override + protected final TableModel createReport(List<DatasetDescription> datasets, IEICMSRunDAO query) { SimpleTableModelBuilder builder = new SimpleTableModelBuilder(); addReportHeaders(builder);