Move JOGL debug setup to GuiceStartup.

Always capture System.err to log.
Also write captured System.err to STDERR if the log is NOT being written
to either STDERR or STDOUT (So it appears on the console one way or
another).
This commit is contained in:
bkuker 2012-12-27 10:17:48 -05:00
parent 02927d0f2d
commit ff7e5d5d04
3 changed files with 37 additions and 51 deletions

View File

@ -1,48 +0,0 @@
package net.sf.openrocket.gui.figure3d;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintStream;
import net.sf.openrocket.logging.LogHelper;
import net.sf.openrocket.startup.Application;
/**
* Redirects system err into OpenRocket's log.debug() if openrocket.debug is enabled.
* This lets me capture JOGL debug as log events, which can be included in error reports etc.
* I wish I could get the JOGL debug log on a separate printstream, so I do not have to take
* over all of ERR.
*
* @author bkuker
*
*/
final class JoglDebugAdaptor {
private static final LogHelper log = Application.getLogger();
final static void plumbJoglDebug() {
if (RocketFigure3d.is3dEnabled() && System.getProperty("openrocket.debug") != null) {
System.setProperty("jogl.debug", "all");
System.setErr(new PrintStream(new OutputStream() {
StringBuilder sb = new StringBuilder();
@Override
public synchronized void write(int b) throws IOException {
if (b == '\r' || b == '\n') {
if (sb.toString().trim().length() > 0){
String s = sb.toString();
if ( Character.isWhitespace(s.charAt(0))){
log.verbose(sb.toString());
} else {
log.debug(sb.toString());
}
}
sb = new StringBuilder();
} else {
sb.append((char) b);
}
}
}));
}
}
}

View File

@ -51,9 +51,7 @@ public class RocketFigure3d extends JPanel implements GLEventListener {
private static final long serialVersionUID = 1L;
private static final LogHelper log = Application.getLogger();
static {
JoglDebugAdaptor.plumbJoglDebug();
static {
//this allows the GL canvas and things like the motor selection
//drop down to z-order themselves.
JPopupMenu.setDefaultLightWeightPopupEnabled(false);

View File

@ -1,5 +1,7 @@
package net.sf.openrocket.startup;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintStream;
import java.util.Locale;
import java.util.prefs.Preferences;
@ -80,6 +82,7 @@ public class GuiceStartup {
setPropertyIfNotSet("openrocket.debug.menu", "true");
setPropertyIfNotSet("openrocket.debug.mutexlocation", "true");
setPropertyIfNotSet("openrocket.debug.motordigest", "true");
setPropertyIfNotSet("jogl.debug", "all");
}
}
@ -131,6 +134,39 @@ public class GuiceStartup {
str += " (" + LOG_STDOUT_PROPERTY + "=" + System.getProperty(LOG_STDOUT_PROPERTY) +
" " + LOG_STDERR_PROPERTY + "=" + System.getProperty(LOG_STDERR_PROPERTY) + ")";
log.info(str);
//Replace System.err with a PrintStream that logs lines to DEBUG, or VBOSE if they are indented.
//If debug info is not being output to the console then the data is both logged and written to
//stderr.
final boolean writeToStderr = !( printer.getOutput(LogLevel.DEBUG) == System.out || printer.getOutput(LogLevel.DEBUG) == System.err);
final PrintStream stdErr = System.err;
System.setErr(new PrintStream(new OutputStream() {
StringBuilder currentLine = new StringBuilder();
@Override
public synchronized void write(int b) throws IOException {
if ( writeToStderr ){
//Write to real stderr
stdErr.write(b);
}
if (b == '\r' || b == '\n') {
//Line is complete, log it
if (currentLine.toString().trim().length() > 0){
String s = currentLine.toString();
if ( Character.isWhitespace(s.charAt(0))){
log.verbose(currentLine.toString());
} else {
log.debug(currentLine.toString());
}
}
currentLine = new StringBuilder();
} else {
//append to the line being built
currentLine.append((char) b);
}
}
}));
}
private static boolean setLogOutput(PrintStreamLogger logger, PrintStream stream, String level, LogLevel defaultLevel) {