92 lines
2.7 KiB
Java
92 lines
2.7 KiB
Java
package org.openstack.sahara.edp;
|
|
|
|
import java.lang.reflect.InvocationTargetException;
|
|
import java.lang.reflect.Method;
|
|
import java.security.Permission;
|
|
import java.util.Arrays;
|
|
|
|
public class MainWrapper {
|
|
|
|
public static void main(String[] args) throws Throwable {
|
|
|
|
// Load oozie configuration file
|
|
String actionConf = System.getProperty("oozie.action.conf.xml");
|
|
if (actionConf != null) {
|
|
Class<?> configClass
|
|
= Class.forName("org.apache.hadoop.conf.Configuration");
|
|
Method method = configClass.getMethod("addDefaultResource", String.class);
|
|
method.invoke(null, "action.xml");
|
|
}
|
|
|
|
SecurityManager originalSecurityManager = System.getSecurityManager();
|
|
WrapperSecurityManager newSecurityManager
|
|
= new WrapperSecurityManager(originalSecurityManager);
|
|
System.setSecurityManager(newSecurityManager);
|
|
|
|
Class<?> mainClass = Class.forName(args[0]);
|
|
Method mainMethod = mainClass.getMethod("main", String[].class);
|
|
String[] newArgs = Arrays.copyOfRange(args, 1, args.length);
|
|
Throwable exception = null;
|
|
try {
|
|
mainMethod.invoke(null, (Object) newArgs);
|
|
} catch (InvocationTargetException e) {
|
|
if (!newSecurityManager.getExitInvoked()) {
|
|
exception = e.getTargetException();
|
|
}
|
|
}
|
|
|
|
System.setSecurityManager(originalSecurityManager);
|
|
|
|
if (exception != null) {
|
|
throw exception;
|
|
}
|
|
if (newSecurityManager.getExitInvoked()) {
|
|
System.exit(newSecurityManager.getExitCode());
|
|
}
|
|
}
|
|
|
|
static class WrapperSecurityManager extends SecurityManager {
|
|
private static boolean exitInvoked = false;
|
|
private static int firstExitCode;
|
|
private SecurityManager securityManager;
|
|
|
|
public WrapperSecurityManager(SecurityManager securityManager) {
|
|
this.securityManager = securityManager;
|
|
}
|
|
|
|
@Override
|
|
public void checkPermission(Permission perm, Object context) {
|
|
if (securityManager != null) {
|
|
// check everything with the original SecurityManager
|
|
securityManager.checkPermission(perm, context);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void checkPermission(Permission perm) {
|
|
if (securityManager != null) {
|
|
// check everything with the original SecurityManager
|
|
securityManager.checkPermission(perm);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void checkExit(int status) throws SecurityException {
|
|
if (!exitInvoked) {
|
|
// save first System.exit status code
|
|
exitInvoked = true;
|
|
firstExitCode = status;
|
|
}
|
|
throw new SecurityException("Intercepted System.exit(" + status + ")");
|
|
}
|
|
|
|
public static boolean getExitInvoked() {
|
|
return exitInvoked;
|
|
}
|
|
|
|
public static int getExitCode() {
|
|
return firstExitCode;
|
|
}
|
|
}
|
|
}
|