Some Eclipse Foundation services are deprecated, or will be soon. Please ensure you've read this important communication.

Bug 351460

Summary: EclipseLogAppender is not fail safe in standalone execution
Product: [Modeling] TMF Reporter: Karsten Thoms <karsten.thoms>
Component: XtextAssignee: Project Inbox <tmf.xtext-inbox>
Status: CLOSED FIXED QA Contact:
Severity: normal    
Priority: P3 CC: Holger.Schill, sebastian.zarnekow, sven.efftinge
Version: 2.0.0Flags: sebastian.zarnekow: indigo+
Target Milestone: SR2   
Hardware: PC   
OS: Mac OS X - Carbon (unsup.)   
Whiteboard:

Description Karsten Thoms CLA 2011-07-07 10:55:52 EDT
When executing an Xtext workflow in standalone Java mode and with org.eclipse.xtext.logging on the classpath (screnario: Maven with Tycho and Fornax Workflow Plugin), the logging properties from the logging fragment are taken and the EclipseLogAppender used.

Since it is standalone mode, Platform.getBundles() will return null, which is not checked in the getLog() method.

I propose to check for null and also improve the error message:
--------------------------------------------
   Bundle[] bundles = Platform.getBundles(ORG_APACHE_LOG4J,"1.2.15");
   if (bundles==null || bundles.length==0)
      throw new IllegalStateException("Host bundle "+ORG_APACHE_LOG4J+" 1.2.15 not found!");
--------------------------------------------

Also isDoLog() should check 'log==null'

--------------------------------------------
private boolean isDoLog(Level level) {
  return log!=null && (level.toInt() >= Priority.WARN_INT);
}
--------------------------------------------


Stacktrace:
--------------------------------------------
java.lang.NullPointerException
[WARNING]       at org.eclipse.xtext.logging.EclipseLogAppender.getLog(EclipseLogAppender.java:33)
[WARNING]       at org.eclipse.xtext.logging.EclipseLogAppender.append(EclipseLogAppender.java:46)
[WARNING]       at org.apache.log4j.AppenderSkeleton.doAppend(AppenderSkeleton.java:251)
[WARNING]       at org.apache.log4j.helpers.AppenderAttachableImpl.appendLoopOnAppenders(AppenderAttachableImpl.java:66)
[WARNING]       at org.apache.log4j.Category.callAppenders(Category.java:206)
[WARNING]       at org.apache.log4j.Category.forcedLog(Category.java:391)
[WARNING]       at org.apache.log4j.Category.log(Category.java:856)
[WARNING]       at org.apache.commons.logging.impl.Log4JLogger.warn(Log4JLogger.java:222)
[WARNING]       at org.eclipse.emf.mwe.utils.GenModelHelper.registerGenModel(GenModelHelper.java:70)
[WARNING]       at org.eclipse.xtext.generator.ecore.EcoreGeneratorFragment.getSaveAndReconcileGenModel(EcoreGeneratorFragment.java:587)
[WARNING]       at org.eclipse.xtext.generator.ecore.EcoreGeneratorFragment.generate(EcoreGeneratorFragment.java:182)
[WARNING]       at org.eclipse.xtext.generator.CompositeGeneratorFragment.generate(CompositeGeneratorFragment.java:81)
[WARNING]       at org.eclipse.xtext.generator.LanguageConfig.generate(LanguageConfig.java:69)
[WARNING]       at org.eclipse.xtext.generator.Generator.generate(Generator.java:351)
[WARNING]       at org.eclipse.xtext.generator.Generator.invokeInternal(Generator.java:125)
[WARNING]       at org.eclipse.emf.mwe.core.lib.AbstractWorkflowComponent.invoke(AbstractWorkflowComponent.java:126)
[WARNING]       at org.eclipse.emf.mwe.core.lib.Mwe2Bridge.invoke(Mwe2Bridge.java:34)
[WARNING]       at org.eclipse.emf.mwe.core.lib.AbstractWorkflowComponent.invoke(AbstractWorkflowComponent.java:201)
[WARNING]       at org.eclipse.emf.mwe2.runtime.workflow.AbstractCompositeWorkflowComponent.invoke(AbstractCompositeWorkflowComponent.java:35)
[WARNING]       at org.eclipse.emf.mwe2.runtime.workflow.Workflow.run(Workflow.java:19)
[WARNING]       at org.eclipse.emf.mwe2.launch.runtime.Mwe2Runner.run(Mwe2Runner.java:97)
[WARNING]       at org.eclipse.emf.mwe2.launch.runtime.Mwe2Runner.run(Mwe2Runner.java:73)
[WARNING]       at org.eclipse.emf.mwe2.launch.runtime.Mwe2Launcher.run(Mwe2Launcher.java:76)
[WARNING]       at org.eclipse.emf.mwe2.launch.runtime.Mwe2Launcher.main(Mwe2Launcher.java:35)
Comment 1 Karsten Thoms CLA 2011-09-05 13:31:27 EDT
Workaround:
- add log4j.properties without EclipseLogAppender to the project
- configure with system property log4j.configuration

Example log4j.properties file:
=======================================
# Root logger configuration. Don't change this.
log4j.rootLogger=DEBUG, default

# This appender will write to the stdout console
log4j.appender.default=org.apache.log4j.ConsoleAppender
log4j.appender.default.layout=org.apache.log4j.PatternLayout
log4j.appender.default.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n

# This appender will write to the Eclipse error log. It will ONLY log ERROR and FATAL messages.
log4j.appender.eclipse=org.eclipse.xtext.logging.EclipseLogAppender
log4j.appender.eclipse.layout=org.apache.log4j.PatternLayout
log4j.appender.eclipse.layout.ConversionPattern=%c %x - %m%n

# Configure your log categories below:
log4j.logger.org.eclipse=WARN
log4j.logger.org.eclipse.xtext=WARN
log4j.logger.org.eclipse.xtext.ui.editor.outline=WARN
log4j.logger.org.eclipse.xtext.ui.editor.contentassist.antlr.internal=WARN
=======================================


Example configuration in Maven:
=======================================
<plugin>
  <groupId>org.fornax.toolsupport</groupId>
  <artifactId>fornax-oaw-m2-plugin</artifactId>
  <executions>
    <execution>
      <id>xtext</id>
      <phase>generate-sources</phase>
      <goals>
        <goal>run-workflow</goal>
      </goals>
      <configuration>
        <workflowEngine>mwe2</workflowEngine>
        <workflowDescriptor>org.xspray.xtext.GenerateXspray</workflowDescriptor>
        <timestampFileName>xtext-generator.timestamp</timestampFileName>
        <jvmSettings>
          <fork>true</fork>
          <jvmArgs>
            <jvmArg>-Xms100m</jvmArg>
            <jvmArg>-Xmx700m</jvmArg>
            <jvmArg>-XX:MaxPermSize=128m</jvmArg>
            <jvmArg>-Dlog4j.configuration=file:${basedir}/log4j.properties</jvmArg>
          </jvmArgs>
        </jvmSettings>
      </configuration>
    </execution>
  </executions>
</plugin>

=======================================
Comment 2 Sebastian Zarnekow CLA 2011-09-30 04:34:53 EDT
We should apply the suggested changes to simplify the automated build setup.
Comment 3 Holger Schill CLA 2011-09-30 04:38:17 EDT
+1
Comment 4 Sven Efftinge CLA 2011-10-17 04:59:15 EDT
pushed to master
Comment 5 Karsten Thoms CLA 2017-09-19 17:58:12 EDT
Closing all bugs that were set to RESOLVED before Neon.0
Comment 6 Karsten Thoms CLA 2017-09-19 18:08:58 EDT
Closing all bugs that were set to RESOLVED before Neon.0