AdminMain now can print stacktraces
- required to set env AS_TRACE=true in the asadmin shell first
diff --git a/nucleus/admin/cli/src/main/java/com/sun/enterprise/admin/cli/AdminMain.java b/nucleus/admin/cli/src/main/java/com/sun/enterprise/admin/cli/AdminMain.java
index 07b8bcd..3aae330 100644
--- a/nucleus/admin/cli/src/main/java/com/sun/enterprise/admin/cli/AdminMain.java
+++ b/nucleus/admin/cli/src/main/java/com/sun/enterprise/admin/cli/AdminMain.java
@@ -19,6 +19,8 @@
import com.sun.enterprise.admin.remote.reader.ProprietaryReaderFactory;
import com.sun.enterprise.admin.remote.writer.ProprietaryWriterFactory;
import java.io.PrintStream;
+import java.io.PrintWriter;
+import java.io.StringWriter;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
@@ -59,7 +61,7 @@
private String command;
private ProgramOptions po;
private CLIContainer cliContainer;
- private Environment env = new Environment();
+ private final Environment env = new Environment();
protected Logger logger;
private final static int ERROR = 1;
private final static int CONNECTION_ERROR = 2;
@@ -121,14 +123,15 @@
* @return set of JAR files or directories with JAR files
*/
protected Set<File> getExtensions() {
- Set<File> result = new HashSet<File>();
+ Set<File> result = new HashSet<>();
final File inst = new File(System.getProperty(SystemPropertyConstants.INSTALL_ROOT_PROPERTY));
final File ext = new File(new File(inst, "lib"), "asadmin");
if (ext.exists() && ext.isDirectory()) {
result.add(ext);
} else {
- if (logger.isLoggable(Level.FINER))
+ if (logger.isLoggable(Level.FINER)) {
logger.finer(strings.get("ExtDirMissing", ext));
+ }
}
result.add(new File(new File(inst, "modules"), "admin-cli.jar"));
return result;
@@ -147,8 +150,8 @@
*/
private static class CLILoggerHandler extends ConsoleHandler {
- private CLILoggerHandler() {
- setFormatter(new CLILoggerFormatter());
+ private CLILoggerHandler(boolean printStacktraces) {
+ setFormatter(new CLILoggerFormatter(printStacktraces));
}
@Override
@@ -156,16 +159,35 @@
if (!isLoggable(logRecord)) {
return;
}
- final PrintStream ps = (logRecord.getLevel() == Level.SEVERE) ? System.err : System.out;
+ @SuppressWarnings("resource")
+ final PrintStream ps = logRecord.getLevel() == Level.SEVERE ? System.err : System.out;
ps.println(getFormatter().format(logRecord));
}
}
private static class CLILoggerFormatter extends SimpleFormatter {
+ private final boolean printStacktraces;
+
+ CLILoggerFormatter(boolean printStacktraces) {
+ this.printStacktraces = printStacktraces;
+ }
+
@Override
public synchronized String format(LogRecord record) {
- return formatMessage(record);
+ if (record.getThrown() == null || !printStacktraces) {
+ return formatMessage(record);
+ }
+ return formatMessage(record) + printStackTrace(record.getThrown());
+ }
+
+ private String printStackTrace(Throwable throwable) {
+ StringWriter sw = new StringWriter();
+ PrintWriter pw = new PrintWriter(sw);
+ pw.println();
+ throwable.printStackTrace(pw);
+ pw.close();
+ return sw.toString();
}
}
@@ -209,7 +231,7 @@
logger.setLevel(Level.FINE);
}
logger.setUseParentHandlers(false);
- Handler h = new CLILoggerHandler();
+ Handler h = new CLILoggerHandler(trace);
h.setLevel(logger.getLevel());
logger.addHandler(h);
@@ -223,9 +245,10 @@
if (debug) {
System.setProperty(CLIConstants.WALL_CLOCK_START_PROP, "" + System.currentTimeMillis());
- if (logger.isLoggable(Level.FINER))
+ if (logger.isLoggable(Level.FINER)) {
logger.log(Level.FINER, "CLASSPATH= {0}\nCommands: {1}",
new Object[] { System.getProperty("java.class.path"), Arrays.toString(args) });
+ }
}
/*
* Set the thread's context class loader so that everyone can load from
@@ -278,8 +301,9 @@
break;
case WARNING:
- if (logger.isLoggable(Level.FINE))
+ if (logger.isLoggable(Level.FINE)) {
logger.fine(strings.get("CommandSuccessfulWithWarnings", command));
+ }
exitCode = SUCCESS;
break;