sahara-extra/edp-adapt-for-oozie/src/main/java/org/openstack/sahara/edp/MainWrapper.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;
}
}
}