diff --git a/common/source/java/ch/systemsx/cisd/common/jython/IJythonInterpreter.java b/common/source/java/ch/systemsx/cisd/common/jython/IJythonInterpreter.java index 627a2a3630e6abfce813ee71c07cf86bff583caf..68ec87109e08fbeb6914a8157d94eb0dcb36699b 100644 --- a/common/source/java/ch/systemsx/cisd/common/jython/IJythonInterpreter.java +++ b/common/source/java/ch/systemsx/cisd/common/jython/IJythonInterpreter.java @@ -19,6 +19,10 @@ package ch.systemsx.cisd.common.jython; public interface IJythonInterpreter { void exec(String scriptString, String scriptFile); + + void exec(String scriptString); + + void addToPath(String... pythonPaths); void set(String variableName, Object object); diff --git a/common/source/java/ch/systemsx/cisd/common/jython/evaluator/Evaluator.java b/common/source/java/ch/systemsx/cisd/common/jython/evaluator/Evaluator.java index 595997174c95e006191724e2ce838f42d6c7b270..08ea16c97a00a0a5b56444bb46367d0d74220c88 100644 --- a/common/source/java/ch/systemsx/cisd/common/jython/evaluator/Evaluator.java +++ b/common/source/java/ch/systemsx/cisd/common/jython/evaluator/Evaluator.java @@ -16,6 +16,8 @@ package ch.systemsx.cisd.common.jython.evaluator; +import ch.systemsx.cisd.common.jython.IJythonInterpreterFactory; + /** * @author Jakub Straszewski */ @@ -30,6 +32,7 @@ public class Evaluator } private static IJythonEvaluatorFactory factory; + private static IJythonInterpreterFactory interpreterFactory; static void setFactory(IJythonEvaluatorFactory factory) { @@ -40,13 +43,34 @@ public class Evaluator { if (factory == null) { - // we should make sure that the initialization hapens before first call to this method - throw new IllegalStateException( - "Jython evaluator component not initialized. Application context is not initialized properly - JythonEvaluatorSpringComponent must be initialized before jython evaluators are used."); + // we should make sure that the initialization happens before first call to this method + throw createException("evaluators"); } return factory; } + static void setInterpreterFactory(IJythonInterpreterFactory interpreterFactory) + { + Evaluator.interpreterFactory = interpreterFactory; + } + + public static IJythonInterpreterFactory getInterpreterFactory() + { + if (interpreterFactory == null) + { + // we should make sure that the initialization happens before first call to this method + throw createException("interpreters"); + } + return interpreterFactory; + } + + private static IllegalStateException createException(String type) + { + return new IllegalStateException( + "Jython evaluator component not initialized. Application context is not initialized properly " + + "- JythonEvaluatorSpringComponent must be initialized before jython " + type + " are used."); + } + public static boolean isMultiline(String expression) { return expression.indexOf('\n') >= 0; diff --git a/common/source/java/ch/systemsx/cisd/common/jython/evaluator/JythonEvaluatorSpringComponent.java b/common/source/java/ch/systemsx/cisd/common/jython/evaluator/JythonEvaluatorSpringComponent.java index 85a3dbabfca2d91461f73a11396f530b0c91607f..f698150a9222c78c5c867df6cfd7dfc88e4fbed5 100644 --- a/common/source/java/ch/systemsx/cisd/common/jython/evaluator/JythonEvaluatorSpringComponent.java +++ b/common/source/java/ch/systemsx/cisd/common/jython/evaluator/JythonEvaluatorSpringComponent.java @@ -21,7 +21,9 @@ import org.springframework.beans.factory.BeanInitializationException; import ch.rinn.restrictions.Private; import ch.systemsx.cisd.common.jython.v25.Jython25EvaluatorFactory; +import ch.systemsx.cisd.common.jython.v25.Jython25InterpreterFactory; import ch.systemsx.cisd.common.jython.v27.Jython27EvaluatorFactory; +import ch.systemsx.cisd.common.jython.v27.Jython27InterpreterFactory; import ch.systemsx.cisd.common.logging.LogCategory; import ch.systemsx.cisd.common.logging.LogFactory; import ch.systemsx.cisd.common.spring.ExposablePropertyPlaceholderConfigurer; @@ -42,9 +44,11 @@ public class JythonEvaluatorSpringComponent if ("2.7".equals(jythonVersion)) { Evaluator.setFactory(new Jython27EvaluatorFactory()); + Evaluator.setInterpreterFactory(new Jython27InterpreterFactory()); } else if ("2.5".equals(jythonVersion)) { Evaluator.setFactory(new Jython25EvaluatorFactory()); + Evaluator.setInterpreterFactory(new Jython25InterpreterFactory()); } else { String msg = diff --git a/common/source/java/ch/systemsx/cisd/common/jython/v25/Jython25InterpreterFactory.java b/common/source/java/ch/systemsx/cisd/common/jython/v25/Jython25InterpreterFactory.java index 2d31ee7ed1254834edbcbf4cd74393f74d8e4a58..f5fa157e0b3bc9feb659a8c386aae84f973cc98d 100644 --- a/common/source/java/ch/systemsx/cisd/common/jython/v25/Jython25InterpreterFactory.java +++ b/common/source/java/ch/systemsx/cisd/common/jython/v25/Jython25InterpreterFactory.java @@ -115,12 +115,24 @@ public class Jython25InterpreterFactory implements IJythonInterpreterFactory interpreter.exec(scriptString, scriptFile); } + @Override + public void exec(String scriptString) + { + interpreter.exec(scriptString); + } + @Override public void set(String variableName, Object object) { interpreter.set(variableName, object); } + @Override + public void addToPath(String... pythonPaths) + { + interpreter.addToPath(pythonPaths); + } + @Override public void releaseResources() { diff --git a/common/source/java/ch/systemsx/cisd/common/jython/v27/Jython27InterpreterFactory.java b/common/source/java/ch/systemsx/cisd/common/jython/v27/Jython27InterpreterFactory.java index 2e3581ec6a1d4ac605c1bfdc063f40fe7ceaae1e..b7abfc09c1382bbaf065b9531dd6d9f6e54623ac 100644 --- a/common/source/java/ch/systemsx/cisd/common/jython/v27/Jython27InterpreterFactory.java +++ b/common/source/java/ch/systemsx/cisd/common/jython/v27/Jython27InterpreterFactory.java @@ -116,12 +116,24 @@ public class Jython27InterpreterFactory implements IJythonInterpreterFactory interpreter.exec(scriptString, scriptFile); } + @Override + public void exec(String scriptString) + { + interpreter.exec(scriptString); + } + @Override public void set(String variableName, Object object) { interpreter.set(variableName, object); } + @Override + public void addToPath(String... pythonPaths) + { + interpreter.addToPath(pythonPaths); + } + @Override public void releaseResources() { diff --git a/openbis/dist/server/register-master-data.sh b/openbis/dist/server/register-master-data.sh index 2cbcbfb413ce5ebaf92efe369258c6a8d0026bc0..0ed3ec8c9ba872bf074863a0a4c8a60db6f9534b 100755 --- a/openbis/dist/server/register-master-data.sh +++ b/openbis/dist/server/register-master-data.sh @@ -18,10 +18,11 @@ if [ ! -x "$JVM" ]; then exit 1 fi +disableJythonByProperty LIB=$BASE/../webapps/$APPLICATION_NAME/WEB-INF/lib $JVM \ -Dorg.eclipse.jetty.util.log.class=org.eclipse.jetty.util.log.StrErrLog \ - -cp $LIB/jython-2.5.2.jar:$LIB/\* \ + -cp $LIB/\* \ ch.systemsx.cisd.openbis.generic.server.jython.api.v1.impl.MasterDataRegistrationScriptRunnerStandalone "$@" diff --git a/openbis/dist/server/setup-env b/openbis/dist/server/setup-env index c488c62ea8549bb7d9d0e6319c33f23806e14dd8..449e089e32c21bc531e9af72131f14015d69aecb 100644 --- a/openbis/dist/server/setup-env +++ b/openbis/dist/server/setup-env @@ -87,3 +87,27 @@ printStatus() return 2 fi } + +enableJython() +{ + version=$1 + path=`ls webapps/openbis/WEB-INF/lib/jyth*$version*` + mv $path ${path%_*} + echo ${path%_*} +} + +disableJythonByProperty() +{ + jython25=`enableJython 2.5` + jython27=`enableJython 2.7` + required_jython_version=`awk -F'=' '/^jython-version/ {gsub(/[ \t]/, "", $2); print $2}' etc/service.properties` + echo "required jython version: $required_jython_version" + if [ "$required_jython_version" == "2.5" ]; then + mv "$jython27" "${jython27}_disabled" + echo jython 2.7 disabled + fi + if [ "$required_jython_version" == "2.7" ]; then + mv "$jython25" "${jython25}_disabled" + echo jython 2.5 disabled + fi +} \ No newline at end of file diff --git a/openbis/dist/server/startup.sh b/openbis/dist/server/startup.sh index 32d681e828a7aad5c0694e870d86ab461e833c5c..9d7ec575016b929241b06f53c618fc5583953ff9 100755 --- a/openbis/dist/server/startup.sh +++ b/openbis/dist/server/startup.sh @@ -5,6 +5,8 @@ source `dirname "$0"`/setup-env + + checkNotRoot bin/status.sh -q @@ -13,6 +15,8 @@ if [ $? -eq 0 ]; then exit 1 fi +disableJythonByProperty + $JVM -DSTOP.PORT=$JETTY_STOP_PORT \ -DSTOP.KEY=$JETTY_STOP_KEY \ $JAVA_OPTS $JAVA_MEM_OPTS \ diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/jython/api/v1/impl/MasterDataRegistrationScriptRunner.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/jython/api/v1/impl/MasterDataRegistrationScriptRunner.java index bb5cd51680f134180432af918cd8cc28b902f98f..922c4a70cfd8157921722e4987013d1a27621261 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/jython/api/v1/impl/MasterDataRegistrationScriptRunner.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/jython/api/v1/impl/MasterDataRegistrationScriptRunner.java @@ -21,9 +21,10 @@ import java.util.List; import ch.systemsx.cisd.base.exceptions.CheckedExceptionTunnel; import ch.systemsx.cisd.common.filesystem.FileUtilities; +import ch.systemsx.cisd.common.jython.IJythonInterpreter; import ch.systemsx.cisd.common.jython.JythonScriptSplitter; import ch.systemsx.cisd.common.jython.JythonUtils; -import ch.systemsx.cisd.common.jython.PythonInterpreter; +import ch.systemsx.cisd.common.jython.evaluator.Evaluator; /** * A class for running python scripts that register master data. @@ -56,7 +57,7 @@ public class MasterDataRegistrationScriptRunner implements IMasterDataScriptRegi MasterDataRegistrationService service = new MasterDataRegistrationService(commonServer); // Configure the evaluator - PythonInterpreter interpreter = PythonInterpreter.createIsolatedPythonInterpreter(); + IJythonInterpreter interpreter = Evaluator.getInterpreterFactory().createInterpreter(); interpreter.addToPath(jythonPath); interpreter.set(SERVICE_VARIABLE_NAME, service);