Skip to content

Commit

Permalink
Merge pull request #141 from dragos/make-stdout-redirect-optional-100…
Browse files Browse the repository at this point in the history
…1133

Make standard output/error redirection optional.
  • Loading branch information
dragos committed Jul 5, 2012
2 parents e45cd67 + a8e7fb2 commit c61528c
Show file tree
Hide file tree
Showing 5 changed files with 54 additions and 17 deletions.
11 changes: 11 additions & 0 deletions org.scala-ide.sdt.core/src/scala/tools/eclipse/ScalaPlugin.scala
Expand Up @@ -218,6 +218,17 @@ class ScalaPlugin extends AbstractUIPlugin with PluginLogConfigurator with IReso
} }
} }


/** Restart all presentation compilers in the workspace. Need to do it in order
* for them to pick up the new std out/err streams.
*/
def resetAllPresentationCompilers() {
for {
iProject <- ResourcesPlugin.getWorkspace.getRoot.getProjects
if iProject.isOpen
scalaProject <- asScalaProject(iProject)
} scalaProject.resetPresentationCompiler()
}

/** /**
* Return Some(ScalaProject) if the project has the Scala nature, None otherwise. * Return Some(ScalaProject) if the project has the Scala nature, None otherwise.
*/ */
Expand Down
Expand Up @@ -8,38 +8,56 @@ import org.eclipse.jface.util.PropertyChangeEvent
import org.eclipse.jdt.ui.PreferenceConstants import org.eclipse.jdt.ui.PreferenceConstants
import scala.tools.eclipse.util.SWTUtils import scala.tools.eclipse.util.SWTUtils
import java.io.File import java.io.File
import org.eclipse.core.resources.ResourcesPlugin


object LogManager extends Log4JFacade with HasLogger { object LogManager extends Log4JFacade with HasLogger {
import ui.properties.LoggingPreferenceConstants._ import ui.properties.LoggingPreferenceConstants._


private def updateLogLevel: IPropertyChangeListener = { private def updateLogLevel(event: PropertyChangeEvent): Unit = {
SWTUtils.fnToPropertyChangeListener { event => if (event.getProperty == LogLevel) {
if (event.getProperty == LogLevel) { val level = event.getNewValue.asInstanceOf[String]
val level = event.getNewValue.asInstanceOf[String] setLogLevel(Level.withName(level))
setLogLevel(Level.withName(level))
}
} }
} }


private def updateConsoleAppenderStatus: IPropertyChangeListener = { private def updateConsoleAppenderStatus(event: PropertyChangeEvent): Unit = {
SWTUtils.fnToPropertyChangeListener { event => if (event.getProperty == IsConsoleAppenderEnabled) {
if (event.getProperty == IsConsoleAppenderEnabled) { val enable = event.getNewValue.asInstanceOf[Boolean]
val enable = event.getNewValue.asInstanceOf[Boolean] withoutConsoleRedirects {
withoutConsoleRedirects { updateConsoleAppender(enable)
updateConsoleAppender(enable)
}
} }
} }
} }


private def updateStdRedirectStatus(event: PropertyChangeEvent): Unit = {
if (event.getProperty == RedirectStdErrOut) {
val enable = event.getNewValue.asInstanceOf[Boolean]
if (enable) redirectStdOutAndStdErr()
else disableRedirectStdOutAndStdErr()

// we need to restart the presentation compilers so that
// the std out/err streams are refreshed by Console.in/out
if (enable != event.getOldValue.asInstanceOf[Boolean])
ScalaPlugin.plugin.resetAllPresentationCompilers()
}
}

override protected def logFileName = "scala-ide.log" override protected def logFileName = "scala-ide.log"


override def configure(logOutputLocation: String, preferredLogLevel: Level.Value) { override def configure(logOutputLocation: String, preferredLogLevel: Level.Value) {
import SWTUtils.fnToPropertyChangeListener

super.configure(logOutputLocation, preferredLogLevel) super.configure(logOutputLocation, preferredLogLevel)
ScalaPlugin.plugin.getPreferenceStore.addPropertyChangeListener(updateLogLevel)
ScalaPlugin.plugin.getPreferenceStore.addPropertyChangeListener(updateConsoleAppenderStatus) val prefStore = ScalaPlugin.plugin.getPreferenceStore

prefStore.addPropertyChangeListener(updateLogLevel _)
redirectStdOutAndStdErr() prefStore.addPropertyChangeListener(updateConsoleAppenderStatus _)
prefStore.addPropertyChangeListener(updateStdRedirectStatus _)

if (prefStore.getBoolean(RedirectStdErrOut)) {
redirectStdOutAndStdErr()
ScalaPlugin.plugin.resetAllPresentationCompilers()
}
} }


override protected def setLogLevel(level: Level.Value) { override protected def setLogLevel(level: Level.Value) {
Expand Down
Expand Up @@ -16,13 +16,15 @@ private[logging] object StreamRedirect {
val logger = LogManager.getLogger("System.out") val logger = LogManager.getLogger("System.out")
val outStream = redirect(msg => logger.debug(msg)) val outStream = redirect(msg => logger.debug(msg))
System.setOut(outStream) System.setOut(outStream)
Console.setOut(outStream)
isStdOutRedirected = true isStdOutRedirected = true
} }
} }


def disableRedirectStdOutput(): Unit = synchronized { def disableRedirectStdOutput(): Unit = synchronized {
if(isStdOutRedirected) { if(isStdOutRedirected) {
System.setOut(defaultStdOut) System.setOut(defaultStdOut)
Console.setOut(defaultStdOut)
isStdOutRedirected = false isStdOutRedirected = false
} }
} }
Expand All @@ -32,13 +34,15 @@ private[logging] object StreamRedirect {
val logger = LogManager.getLogger("System.err") val logger = LogManager.getLogger("System.err")
val errStream = redirect(msg => logger.error(msg)) val errStream = redirect(msg => logger.error(msg))
System.setErr(errStream) System.setErr(errStream)
Console.setErr(errStream)
isStdErrRedirected = true isStdErrRedirected = true
} }
} }


def disableRedirectStdError(): Unit = synchronized { def disableRedirectStdError(): Unit = synchronized {
if(isStdErrRedirected) { if(isStdErrRedirected) {
System.setErr(defaultStdErr) System.setErr(defaultStdErr)
Console.setErr(defaultStdErr)
isStdErrRedirected = false isStdErrRedirected = false
} }
} }
Expand Down
Expand Up @@ -4,4 +4,5 @@ private[logging] object LoggingPreferenceConstants {
private final val Prefix = "scala.tools.eclipse.logging.ui.properties." private final val Prefix = "scala.tools.eclipse.logging.ui.properties."
final val LogLevel = Prefix + "LogLevel" final val LogLevel = Prefix + "LogLevel"
final val IsConsoleAppenderEnabled = Prefix + "ConsoleAppenderEnabled" final val IsConsoleAppenderEnabled = Prefix + "ConsoleAppenderEnabled"
final val RedirectStdErrOut = Prefix + "RedirectSdtErrOut"
} }
Expand Up @@ -28,6 +28,7 @@ class LoggingPreferencePage extends FieldEditorPreferencePage with IWorkbenchPre


addField(new ComboFieldEditor(LoggingPreferenceConstants.LogLevel, "Log Level", namesAndValues, getFieldEditorParent)) addField(new ComboFieldEditor(LoggingPreferenceConstants.LogLevel, "Log Level", namesAndValues, getFieldEditorParent))
addField(new BooleanFieldEditor(LoggingPreferenceConstants.IsConsoleAppenderEnabled, "Output log in terminal", getFieldEditorParent)) addField(new BooleanFieldEditor(LoggingPreferenceConstants.IsConsoleAppenderEnabled, "Output log in terminal", getFieldEditorParent))
addField(new BooleanFieldEditor(LoggingPreferenceConstants.RedirectStdErrOut, "Redirect standard out/err to log file", getFieldEditorParent))
} }


override def createContents(parent: Composite): Control = { override def createContents(parent: Composite): Control = {
Expand All @@ -49,10 +50,12 @@ class LoggingPreferencePageInitializer extends AbstractPreferenceInitializer {
if(ScalaPlugin.plugin.headlessMode) { if(ScalaPlugin.plugin.headlessMode) {
store.setDefault(LoggingPreferenceConstants.LogLevel, Level.DEBUG.toString) store.setDefault(LoggingPreferenceConstants.LogLevel, Level.DEBUG.toString)
store.setDefault(LoggingPreferenceConstants.IsConsoleAppenderEnabled, true) store.setDefault(LoggingPreferenceConstants.IsConsoleAppenderEnabled, true)
store.setDefault(LoggingPreferenceConstants.RedirectStdErrOut, false)
} }
else { else {
store.setDefault(LoggingPreferenceConstants.LogLevel, LogManager.defaultLogLevel.toString) store.setDefault(LoggingPreferenceConstants.LogLevel, LogManager.defaultLogLevel.toString)
store.setDefault(LoggingPreferenceConstants.IsConsoleAppenderEnabled, false) store.setDefault(LoggingPreferenceConstants.IsConsoleAppenderEnabled, false)
store.setDefault(LoggingPreferenceConstants.RedirectStdErrOut, true)
} }
} }
} }

0 comments on commit c61528c

Please sign in to comment.