diff --git a/core/src/net/sf/openrocket/gui/figure3d/JoglDebugAdaptor.java b/core/src/net/sf/openrocket/gui/figure3d/JoglDebugAdaptor.java deleted file mode 100644 index bd8120a14..000000000 --- a/core/src/net/sf/openrocket/gui/figure3d/JoglDebugAdaptor.java +++ /dev/null @@ -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); - } - } - })); - } - } -} diff --git a/core/src/net/sf/openrocket/gui/figure3d/RocketFigure3d.java b/core/src/net/sf/openrocket/gui/figure3d/RocketFigure3d.java index 0b15e19cb..9c98bb5b0 100644 --- a/core/src/net/sf/openrocket/gui/figure3d/RocketFigure3d.java +++ b/core/src/net/sf/openrocket/gui/figure3d/RocketFigure3d.java @@ -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); diff --git a/core/src/net/sf/openrocket/startup/GuiceStartup.java b/core/src/net/sf/openrocket/startup/GuiceStartup.java index 51ba42f8d..5ba0c5c34 100644 --- a/core/src/net/sf/openrocket/startup/GuiceStartup.java +++ b/core/src/net/sf/openrocket/startup/GuiceStartup.java @@ -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) {