Skip to content

Commit bb951b5

Browse files
committed
Add slf4j and logback, configure a simple EclipseLogAppender
1 parent 6af15bc commit bb951b5

File tree

4 files changed

+95
-1
lines changed

4 files changed

+95
-1
lines changed

kepler/kepler.target

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919
<unit id="org.junit.source" version="4.11.0.v201303080030"/>
2020
<unit id="org.slf4j.api" version="1.7.2.v20121108-1250"/>
2121
<unit id="org.slf4j.api.source" version="1.7.2.v20121108-1250"/>
22+
<unit id="ch.qos.logback.slf4j" version="1.0.7.v20121108-1250"/>
23+
<unit id="ch.qos.logback.slf4j.source" version="1.0.7.v20121108-1250"/>
2224
</location>
2325
</locations>
2426
<targetJRE path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7"/>

net.sourceforge.pmd.eclipse.plugin/META-INF/MANIFEST.MF

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,10 @@ Require-Bundle: org.apache.commons.logging;bundle-version="1.0.4",
1717
org.eclipse.help,
1818
org.eclipse.help.ui,
1919
org.eclipse.wst.xml.core,
20-
org.eclipse.ui.workbench.texteditor
20+
org.eclipse.ui.workbench.texteditor,
21+
org.slf4j.api,
22+
ch.qos.logback.classic,
23+
ch.qos.logback.core
2124
Bundle-ActivationPolicy: lazy
2225
Bundle-RequiredExecutionEnvironment: JavaSE-1.7
2326
Bundle-Vendor: %plugin.provider
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
/**
2+
* BSD-style license; for more info see http://pmd.sourceforge.net/license.html
3+
*/
4+
5+
package net.sourceforge.pmd.eclipse.logging.internal;
6+
7+
import org.eclipse.core.runtime.ILog;
8+
import org.eclipse.core.runtime.IStatus;
9+
import org.eclipse.core.runtime.Status;
10+
11+
import ch.qos.logback.classic.Level;
12+
import ch.qos.logback.classic.spi.ILoggingEvent;
13+
import ch.qos.logback.core.AppenderBase;
14+
15+
public class EclipseLogAppender extends AppenderBase<ILoggingEvent> {
16+
private final ILog eclipseLog;
17+
private final String pluginId;
18+
19+
public EclipseLogAppender(String pluginId, ILog eclipseLog) {
20+
this.pluginId = pluginId;
21+
this.eclipseLog = eclipseLog;
22+
}
23+
24+
@Override
25+
protected void append(ILoggingEvent eventObject) {
26+
int statusSeverity = convertLevel(eventObject.getLevel());
27+
Throwable throwable = getThrowable(eventObject.getArgumentArray());
28+
29+
this.eclipseLog.log(new Status(statusSeverity, pluginId, eventObject.getFormattedMessage(), throwable));
30+
}
31+
32+
private Throwable getThrowable(Object[] argumentArray) {
33+
if (argumentArray != null && argumentArray.length > 0) {
34+
Object last = argumentArray[argumentArray.length - 1];
35+
if (last instanceof Throwable) {
36+
return (Throwable) last;
37+
}
38+
}
39+
return null;
40+
}
41+
42+
private int convertLevel(Level level) {
43+
switch (level.levelInt) {
44+
case Level.ERROR_INT:
45+
return IStatus.ERROR;
46+
case Level.WARN_INT:
47+
return IStatus.WARNING;
48+
case Level.INFO_INT:
49+
return IStatus.INFO;
50+
default:
51+
return IStatus.OK;
52+
}
53+
}
54+
}

net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/plugin/PMDPlugin.java

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@
5656
import org.eclipse.ui.plugin.AbstractUIPlugin;
5757
import org.osgi.framework.Bundle;
5858
import org.osgi.framework.BundleContext;
59+
import org.slf4j.LoggerFactory;
5960

6061
import net.sourceforge.pmd.PMDConfiguration;
6162
import net.sourceforge.pmd.RuleSet;
@@ -64,6 +65,7 @@
6465
import net.sourceforge.pmd.eclipse.core.IRuleSetManager;
6566
import net.sourceforge.pmd.eclipse.core.ext.RuleSetsExtensionProcessor;
6667
import net.sourceforge.pmd.eclipse.core.impl.RuleSetManagerImpl;
68+
import net.sourceforge.pmd.eclipse.logging.internal.EclipseLogAppender;
6769
import net.sourceforge.pmd.eclipse.runtime.cmd.JavaProjectClassLoader;
6870
import net.sourceforge.pmd.eclipse.runtime.preferences.IPreferences;
6971
import net.sourceforge.pmd.eclipse.runtime.preferences.IPreferencesFactory;
@@ -88,10 +90,13 @@
8890
import net.sourceforge.pmd.lang.LanguageVersion;
8991
import net.sourceforge.pmd.lang.java.JavaLanguageModule;
9092

93+
import ch.qos.logback.classic.LoggerContext;
94+
9195
/**
9296
* The activator class controls the plug-in life cycle
9397
*/
9498
public class PMDPlugin extends AbstractUIPlugin {
99+
private static final org.slf4j.Logger LOGGER = LoggerFactory.getLogger(PMDPlugin.class);
95100

96101
private static File pluginFolder;
97102

@@ -124,6 +129,8 @@ public class PMDPlugin extends AbstractUIPlugin {
124129

125130
private final IRuleSetManager ruleSetManager = new RuleSetManagerImpl(); // NOPMD:SingularField
126131

132+
private EclipseLogAppender logbackEclipseAppender;
133+
127134
/**
128135
* The constructor
129136
*/
@@ -234,6 +241,7 @@ public static File getPluginFolder() {
234241
*/
235242
public void start(BundleContext context) throws Exception {
236243
super.start(context);
244+
configureLogback();
237245

238246
// this needs to be executed before the preferences are loaded, because
239247
// the standard
@@ -259,6 +267,32 @@ public void resourceChanged(IResourceChangeEvent arg0) {
259267
PriorityFilter.getInstance().initialize();
260268

261269
version = context.getBundle().getHeaders().get("Bundle-Version");
270+
LOGGER.debug("PMD Plugin {} has started...", version);
271+
}
272+
273+
private void configureLogback() {
274+
unconfigureLogback();
275+
276+
LoggerContext logbackContext = (LoggerContext) LoggerFactory.getILoggerFactory();
277+
logbackEclipseAppender = new EclipseLogAppender(PLUGIN_ID, getLog());
278+
logbackEclipseAppender.setContext(logbackContext);
279+
logbackEclipseAppender.setName(PLUGIN_ID);
280+
logbackEclipseAppender.start();
281+
282+
ch.qos.logback.classic.Logger l = logbackContext.getLogger("net.sourceforge.pmd");
283+
l.addAppender(logbackEclipseAppender);
284+
}
285+
286+
private void unconfigureLogback() {
287+
if (logbackEclipseAppender == null) {
288+
return;
289+
}
290+
291+
LoggerContext logbackContext = (LoggerContext) LoggerFactory.getILoggerFactory();
292+
ch.qos.logback.classic.Logger l = logbackContext.getLogger("net.sourceforge.pmd");
293+
l.detachAppender(logbackEclipseAppender);
294+
logbackEclipseAppender.stop();
295+
logbackEclipseAppender = null;
262296
}
263297

264298
/**
@@ -380,6 +414,7 @@ public void stop(BundleContext context) throws Exception {
380414
ShapePainter.disposeAll();
381415
ResourceManager.dispose();
382416
PriorityDescriptorCache.INSTANCE.dispose();
417+
unconfigureLogback();
383418
super.stop(context);
384419
}
385420

0 commit comments

Comments
 (0)