diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/ThreadParameters.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/ThreadParameters.java index 2a080ee0d7707b35ea1437085626f701b5650a50..eba8b7f1cbc2a0bbd0320c785c777511916bc782 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/ThreadParameters.java +++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/ThreadParameters.java @@ -59,7 +59,7 @@ public final class ThreadParameters * A path to a script which should be invoked to validate the data set. */ @Private - static final String VALIDATION_SCRIPT_KEY = "validation-script"; + static final String VALIDATION_SCRIPT_KEY = "validation-script-path"; @Private static final String GROUP_CODE_KEY = "group-code"; diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/api/v1/DataSetTypeToRegistratorMapper.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/api/v1/DataSetTypeToRegistratorMapper.java index f4dc90e03a07644f373713fbe3c6f855f1a5ec5e..672a82bb2441b1a7b49c0caa8ad0de66a4455c27 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/api/v1/DataSetTypeToRegistratorMapper.java +++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/api/v1/DataSetTypeToRegistratorMapper.java @@ -163,9 +163,9 @@ class DataSetTypeToRegistratorMapper return ETLDaemon.createTopLevelDataSetRegistrator(params.getProperties(), defaultThread, shareId, openBISService, mailClient, dataSetValidator, false, - false, false, firstThread.tryGetPreRegistrationScript(), - firstThread.tryGetPostRegistrationScript(), firstThread.tryValidationScript(), - PutDataSetServerPluginHolder.class); + false, false, defaultThread.tryGetPreRegistrationScript(), + defaultThread.tryGetPostRegistrationScript(), + defaultThread.tryValidationScript(), PutDataSetServerPluginHolder.class); } public HashMap<String, ITopLevelDataSetRegistrator> getHandlerMap() diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/api/v1/PutDataSetService.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/api/v1/PutDataSetService.java index 2915d47f77a2332a9103d2686139cfad9c61efd2..40e81371047dea32ea83274d67264211df794fa9 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/api/v1/PutDataSetService.java +++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/api/v1/PutDataSetService.java @@ -199,6 +199,11 @@ public class PutDataSetService */ public String getValidationScript(String dataSetTypeOrNull) { + if (false == isInitialized) + { + doInitialization(); + } + ITopLevelDataSetRegistrator registrator = registratorMap.getRegistratorForType(dataSetTypeOrNull); TopLevelDataSetRegistratorGlobalState globalState = registrator.getGlobalState(); diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/cli/CommandTestValid.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/cli/CommandTestValid.java index 8a4216d4774914213451ce84e8bfb8d9637e7994..6e673d1ba557122413b8b343a1544618e4e40e1a 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/cli/CommandTestValid.java +++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/cli/CommandTestValid.java @@ -243,7 +243,7 @@ class CommandTestValid extends AbstractDssCommand<CommandTestValid.CommandTestVa @Override protected String getRequiredArgumentsString() { - return "<owner type> <owner> <path> <script>"; + return "<owner type> <owner> <path> [<script>]"; } /** diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/DataSetUploadClient.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/DataSetUploadClient.java index 1e1dfad27f1b0cd68fdf673d287a7a2906524e9d..e84b90853aa9daecb8e58038bd7542c660e15d23 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/DataSetUploadClient.java +++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/DataSetUploadClient.java @@ -27,6 +27,7 @@ import java.awt.GridBagLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.ArrayList; +import java.util.Properties; import javax.swing.Box; import javax.swing.BoxLayout; @@ -45,6 +46,8 @@ import javax.swing.event.ListSelectionListener; import javax.swing.table.TableCellRenderer; import javax.swing.table.TableColumn; +import org.python.core.PySystemState; + import ch.systemsx.cisd.common.exceptions.EnvironmentFailureException; import ch.systemsx.cisd.common.exceptions.UserFailureException; import ch.systemsx.cisd.common.utilities.ITimeProvider; @@ -69,8 +72,31 @@ public class DataSetUploadClient extends AbstractSwingGUI static { // Disable any logging output. + // System.setProperty("org.apache.commons.logging.Log", + // "org.apache.commons.logging.impl.NoOpLog"); + + // Provide some logging System.setProperty("org.apache.commons.logging.Log", - "org.apache.commons.logging.impl.NoOpLog"); + "org.apache.commons.logging.impl.SimpleLog"); + System.setProperty("org.apache.commons.logging.simplelog.showdatetime", "true"); + + // Properties baseProperties = System.getProperties(); + // String path = + // PySystemState.class.getProtectionDomain().getCodeSource().getLocation().getPath(); + // System.out.println(path); + // baseProperties.setProperty("python.home", path); + // + // PySystemState.initialize(baseProperties, null, new String[] + // { "" }); + + Properties baseProperties = System.getProperties(); + String path = PySystemState.class.getResource("PySystemState.class").getPath(); + path = path.substring(5, path.indexOf("!")); + System.out.println(path); + baseProperties.setProperty("python.home", path); + + PySystemState.initialize(baseProperties, null, new String[] + { "" }); } private static final String TITLE = "Data Set Uploader"; diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/v1/impl/DssComponent.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/v1/impl/DssComponent.java index a572760ad4e461d2125a5e5da4224b38d7704696..f7cb501d317c0122026f5a4cf08d334485c3db60 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/v1/impl/DssComponent.java +++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/v1/impl/DssComponent.java @@ -24,6 +24,8 @@ import java.util.Collections; import java.util.HashMap; import java.util.List; +import org.python.core.Py; +import org.python.core.PyException; import org.springframework.remoting.RemoteAccessException; import org.springframework.remoting.RemoteConnectFailureException; @@ -319,7 +321,8 @@ class AuthenticatedState extends AbstractDssComponentState private final IRpcServiceFactory dssServiceFactory; - private final HashMap<String, String> validationScriptCache = new HashMap<String, String>(); + private final HashMap<String, ValidationScriptRunner> validationScriptRunnerCache = + new HashMap<String, ValidationScriptRunner>(); AuthenticatedState(IGeneralInformationService generalOpenBisService, IRpcServiceFactory dssServiceFactory, String sessionToken) @@ -573,22 +576,50 @@ class AuthenticatedState extends AbstractDssComponentState } String dataSetTypeOrNull = newDataset.tryDataSetType(); - String validationScript; + ValidationScriptRunner runner; + // Check if the script is in the cache - if (validationScriptCache.containsKey(dataSetTypeOrNull)) + if (validationScriptRunnerCache.containsKey(dataSetTypeOrNull)) { - validationScript = validationScriptCache.get(dataSetTypeOrNull); + runner = validationScriptRunnerCache.get(dataSetTypeOrNull); } else { - validationScript = dssService.getValidationScript(sessionToken, dataSetTypeOrNull); - validationScriptCache.put(dataSetTypeOrNull, validationScript); + + String validationScript = + dssService.getValidationScript(sessionToken, dataSetTypeOrNull); + try + { + runner = ValidationScriptRunner.createValidatorFromScriptString(validationScript); + validationScriptRunnerCache.put(dataSetTypeOrNull, runner); + } catch (PyException ex) + { + System.err.println("Could not create validation script "); + System.err.println(validationScript); + System.err.println(ex); + ex.printStackTrace(System.err); + System.err.println(Py.getSystemState().modules); + + return new ArrayList<ValidationError>(); + } catch (Throwable ex) + { + System.err.println("Could not create validation script "); + System.err.println(validationScript); + System.err.println(ex); + ex.printStackTrace(System.err); + + return new ArrayList<ValidationError>(); + } } - if (null == validationScript) + + try + { + return runner.validate(dataSetFile); + } catch (Throwable ex) { + System.err.println("Could not run validation script: "); + System.err.println(runner.getScriptString()); + ex.printStackTrace(System.err); return new ArrayList<ValidationError>(); } - ValidationScriptRunner runner = - ValidationScriptRunner.createValidatorFromScriptString(validationScript); - return runner.validate(dataSetFile); } } diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/api/v1/validation/ValidationScriptRunner.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/api/v1/validation/ValidationScriptRunner.java index 73d065f0106f5a30c7289231ea74f770a4875ea1..ff64c5dc1e89ab67d7b655d241afbcf0cb6c45f7 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/api/v1/validation/ValidationScriptRunner.java +++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/api/v1/validation/ValidationScriptRunner.java @@ -61,6 +61,10 @@ public class ValidationScriptRunner */ public static ValidationScriptRunner createValidatorFromScriptString(String scriptString) { + if (scriptString == null) + { + return new NullValidationScriptRunner(); + } String theScriptString = getValidationScriptString(scriptString); return new ValidationScriptRunner(theScriptString); } @@ -111,6 +115,11 @@ public class ValidationScriptRunner return errors; } + public String getScriptString() + { + return scriptString; + } + private PyFunction tryJythonFunction(String functionName) { try