Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLaurent Delaigue2015-06-25 14:51:31 +0000
committerLaurent Delaigue2015-07-10 12:02:07 +0000
commit4a4774f3e2b135aed324febe27eff7e66ca9e449 (patch)
treef7f983d0097d872a7e4241fad035e21fd86e08c9
parent4f2ddd2d0c5484f49135582251e100ccf7caa6d9 (diff)
downloadorg.eclipse.emf.compare-4a4774f3e2b135aed324febe27eff7e66ca9e449.tar.gz
org.eclipse.emf.compare-4a4774f3e2b135aed324febe27eff7e66ca9e449.tar.xz
org.eclipse.emf.compare-4a4774f3e2b135aed324febe27eff7e66ca9e449.zip
[471010] Fix log4j config management
The log4j config initialization was made in rcp.ui which may not start before an EGit merge operation takes place, for instance. Moving this to rcp core solves the issue. Additionally, the preferences that indicate the max size of log files and the max number of log files to keep were systematically erased each time eclipse was restarted. Bug: 471010 Change-Id: Id05efc971853bd080425ffce7ab7b176b8744734 Signed-off-by: Laurent Delaigue <laurent.delaigue@obeo.fr>
-rw-r--r--plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/EMFCompareRCPUIPlugin.java127
-rw-r--r--plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/emfcomparercpuimessages.properties2
-rw-r--r--plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/preferences/LoggingPreferencePage.java72
-rw-r--r--plugins/org.eclipse.emf.compare.rcp/META-INF/MANIFEST.MF5
-rw-r--r--plugins/org.eclipse.emf.compare.rcp/pom.xml2
-rw-r--r--plugins/org.eclipse.emf.compare.rcp/src/org/eclipse/emf/compare/rcp/EMFCompareRCPPlugin.java134
-rw-r--r--plugins/org.eclipse.emf.compare.rcp/src/org/eclipse/emf/compare/rcp/internal/emfcomparercpmessages.properties4
-rw-r--r--plugins/org.eclipse.emf.compare.rcp/src/org/eclipse/emf/compare/rcp/internal/preferences/EMFComparePreferences.java38
8 files changed, 216 insertions, 168 deletions
diff --git a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/EMFCompareRCPUIPlugin.java b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/EMFCompareRCPUIPlugin.java
index a51828767..384ff77cb 100644
--- a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/EMFCompareRCPUIPlugin.java
+++ b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/EMFCompareRCPUIPlugin.java
@@ -10,16 +10,12 @@
*******************************************************************************/
package org.eclipse.emf.compare.rcp.ui;
-import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
-import org.apache.log4j.Level;
import org.apache.log4j.Logger;
-import org.apache.log4j.PatternLayout;
-import org.apache.log4j.RollingFileAppender;
import org.eclipse.core.runtime.IExtensionRegistry;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Platform;
@@ -30,13 +26,11 @@ import org.eclipse.emf.compare.rcp.extension.AbstractRegistryEventListener;
import org.eclipse.emf.compare.rcp.internal.extension.IItemRegistry;
import org.eclipse.emf.compare.rcp.internal.extension.impl.ItemRegistry;
import org.eclipse.emf.compare.rcp.ui.contentmergeviewer.accessor.factory.IAccessorFactory;
-import org.eclipse.emf.compare.rcp.ui.internal.EMFCompareRCPUIMessages;
import org.eclipse.emf.compare.rcp.ui.internal.configuration.IEMFCompareConfiguration;
import org.eclipse.emf.compare.rcp.ui.internal.configuration.ui.ConfigurationUIRegistryEventListener;
import org.eclipse.emf.compare.rcp.ui.internal.configuration.ui.IConfigurationUIFactory;
import org.eclipse.emf.compare.rcp.ui.internal.contentmergeviewer.accessor.factory.impl.AccessorFactoryExtensionRegistryListener;
import org.eclipse.emf.compare.rcp.ui.internal.contentmergeviewer.accessor.factory.impl.AccessorFactoryRegistryImpl;
-import org.eclipse.emf.compare.rcp.ui.internal.preferences.LoggingPreferencePage;
import org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.filters.impl.DifferenceFilterExtensionRegistryListener;
import org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.filters.impl.DifferenceFilterManager;
import org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.filters.impl.DifferenceFilterRegistryImpl;
@@ -48,12 +42,8 @@ import org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.groups.impl.
import org.eclipse.emf.compare.rcp.ui.structuremergeviewer.filters.IDifferenceFilter;
import org.eclipse.emf.compare.rcp.ui.structuremergeviewer.groups.IDifferenceGroupProvider;
import org.eclipse.emf.compare.rcp.ui.structuremergeviewer.groups.extender.IDifferenceGroupExtender;
-import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.plugin.AbstractUIPlugin;
import org.osgi.framework.BundleContext;
import org.osgi.service.prefs.Preferences;
@@ -69,7 +59,10 @@ public class EMFCompareRCPUIPlugin extends AbstractUIPlugin {
* Log4j logger to use throughout EMFCompare for logging purposes.
*
* @since 4.1
+ * @deprecated This should never have been public. Loggers should be obtained where needed by using
+ * {@code Logger.getLogger(...)} as appropriate.
*/
+ @Deprecated
public static final Logger LOGGER = Logger.getLogger("org.eclipse.emf.compare"); //$NON-NLS-1$
/**
@@ -94,15 +87,6 @@ public class EMFCompareRCPUIPlugin extends AbstractUIPlugin {
private static final String MATCH_ENGINE_FACTORY_CONFIGURATION_UI_PPID = "matchEngineFactoryConfigurationUI";//$NON-NLS-1$
/**
- * Pattern used for log4j logging:
- *
- * <pre>
- * Date [Thread name] LEVEL 3.last.segments.of.logger.name <NDC Tag> - message\n
- * </pre>
- */
- private static final String LOG_PATTERN = "%d{ISO8601} [%t] %-5p %c{3} %x - %m%n"; //$NON-NLS-1$
-
- /**
* the shared instance.
*/
private static EMFCompareRCPUIPlugin plugin;
@@ -136,8 +120,6 @@ public class EMFCompareRCPUIPlugin extends AbstractUIPlugin {
private IEMFCompareConfiguration compareConfiguration;
- private IPropertyChangeListener propertyChangeListener;
-
/**
* Instance scope for preferences.
* <p>
@@ -205,8 +187,6 @@ public class EMFCompareRCPUIPlugin extends AbstractUIPlugin {
extensionRegistry.addListener(matchEngineConfiguratorRegistryListener, PLUGIN_ID + '.'
+ MATCH_ENGINE_FACTORY_CONFIGURATION_UI_PPID);
matchEngineConfiguratorRegistryListener.readRegistry(extensionRegistry);
-
- initLogging();
}
/*
@@ -215,7 +195,6 @@ public class EMFCompareRCPUIPlugin extends AbstractUIPlugin {
*/
@Override
public void stop(BundleContext context) throws Exception {
- getPreferenceStore().removePropertyChangeListener(propertyChangeListener);
IExtensionRegistry extensionRegistry = Platform.getExtensionRegistry();
extensionRegistry.removeListener(matchEngineConfiguratorRegistryListener);
@@ -255,60 +234,6 @@ public class EMFCompareRCPUIPlugin extends AbstractUIPlugin {
}
/**
- * Initializes log4j by reading the preferences.
- */
- private void initLogging() {
- resetDefaultLoggingPreferences();
- LOGGER.setLevel(Level.toLevel(getPreferenceStore().getString(LoggingPreferencePage.LOG_LEVEL_KEY)));
- RollingFileAppender appender = (RollingFileAppender)LOGGER
- .getAppender(LoggingPreferencePage.EMFC_APPENDER_NAME);
- String logFileName = getPreferenceStore().getString(LoggingPreferencePage.LOG_FILENAME_KEY);
- if (logFileName.length() > 0) {
- if (appender == null) {
- try {
- createLogAppender(logFileName);
- } catch (IOException e) {
- // Invalidate file name
- getPreferenceStore().setToDefault(LoggingPreferencePage.LOG_FILENAME_KEY);
- }
- } else {
- appender.setMaxBackupIndex(getPreferenceStore().getInt(
- LoggingPreferencePage.LOG_BACKUP_COUNT_KEY));
- appender.setMaximumFileSize((getPreferenceStore()
- .getLong(LoggingPreferencePage.LOG_FILE_MAX_SIZE_KEY)) * 1024 * 1024);
- }
- }
- propertyChangeListener = new LoggingPropertyChangeListener();
- getPreferenceStore().addPropertyChangeListener(propertyChangeListener);
- }
-
- private void resetDefaultLoggingPreferences() {
- getPreferenceStore().setDefault(LoggingPreferencePage.LOG_FILENAME_KEY, ""); //$NON-NLS-1$
- getPreferenceStore().setDefault(LoggingPreferencePage.LOG_LEVEL_KEY, "OFF"); //$NON-NLS-1$
- getPreferenceStore().setValue(LoggingPreferencePage.LOG_BACKUP_COUNT_KEY, 20);
- getPreferenceStore().setValue(LoggingPreferencePage.LOG_FILE_MAX_SIZE_KEY, 10);
- }
-
- /**
- * Creates the RollingFileAppender used to log with log4j.
- *
- * @param newFileName
- * Path opf the log file
- * @throws IOException
- * If an IO problem occurs, like the given path does not represent a file, or it cannot be
- * written;
- */
- private void createLogAppender(String newFileName) throws IOException {
- RollingFileAppender appender;
- appender = new RollingFileAppender(new PatternLayout(LOG_PATTERN), newFileName, true);
- LOGGER.removeAllAppenders(); // We don't want to log elsewhere
- LOGGER.addAppender(appender);
- appender.setMaxBackupIndex(getPreferenceStore().getInt(LoggingPreferencePage.LOG_BACKUP_COUNT_KEY));
- appender.setMaximumFileSize((EMFCompareRCPUIPlugin.getDefault().getPreferenceStore()
- .getLong(LoggingPreferencePage.LOG_FILE_MAX_SIZE_KEY)) * 1024 * 1024);
- }
-
- /**
* Log an {@link Exception} in the {@link #getLog() current logger}.
*
* @param e
@@ -468,50 +393,4 @@ public class EMFCompareRCPUIPlugin extends AbstractUIPlugin {
public void setEMFCompareConfiguration(IEMFCompareConfiguration compareConfiguration) {
this.compareConfiguration = compareConfiguration;
}
-
- private static class LoggingPropertyChangeListener implements IPropertyChangeListener {
-
- public void propertyChange(PropertyChangeEvent event) {
- if (LoggingPreferencePage.LOG_FILENAME_KEY.equals(event.getProperty())) {
- String newFileName = (String)event.getNewValue();
- RollingFileAppender appender = (RollingFileAppender)LOGGER
- .getAppender(LoggingPreferencePage.EMFC_APPENDER_NAME);
- if (newFileName != null && newFileName.length() > 0) {
- if (appender == null) {
- try {
- EMFCompareRCPUIPlugin.getDefault().createLogAppender(newFileName);
- } catch (IOException e) {
- EMFCompareRCPUIPlugin.getDefault().getPreferenceStore().setToDefault(
- LoggingPreferencePage.LOG_FILENAME_KEY);
- MessageDialog.openError(Display.getCurrent().getActiveShell(),
- EMFCompareRCPUIMessages
- .getString("LoggingPreferencePage.appender.error.title"), //$NON-NLS-1$
- EMFCompareRCPUIMessages.getString(
- "LoggingPreferencePage.appender.error.msg", //$NON-NLS-1$
- newFileName, e.getMessage()));
- }
- } else {
- appender.setFile(newFileName);
- }
- } else {
- // No file name, remove appender
- LOGGER.removeAllAppenders();
- }
- } else if (LoggingPreferencePage.LOG_LEVEL_KEY.equals(event.getProperty())) {
- LOGGER.setLevel(Level.toLevel((String)event.getNewValue()));
- } else if (LoggingPreferencePage.LOG_BACKUP_COUNT_KEY.equals(event.getProperty())) {
- RollingFileAppender appender = (RollingFileAppender)LOGGER
- .getAppender(LoggingPreferencePage.EMFC_APPENDER_NAME);
- if (appender != null) {
- appender.setMaxBackupIndex(Integer.parseInt(((String)event.getNewValue())));
- }
- } else if (LoggingPreferencePage.LOG_FILE_MAX_SIZE_KEY.equals(event.getProperty())) {
- RollingFileAppender appender = (RollingFileAppender)LOGGER
- .getAppender(LoggingPreferencePage.EMFC_APPENDER_NAME);
- if (appender != null) {
- appender.setMaximumFileSize(Long.parseLong((String)event.getNewValue()) * 1024 * 1024);
- }
- }
- }
- }
}
diff --git a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/emfcomparercpuimessages.properties b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/emfcomparercpuimessages.properties
index 3cc2a20c2..112d52698 100644
--- a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/emfcomparercpuimessages.properties
+++ b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/emfcomparercpuimessages.properties
@@ -89,8 +89,6 @@ LoggingPreferencePage.log.file = Log file:
LoggingPreferencePage.log.file.size = Maximum file size (MB):
LoggingPreferencePage.log.backup.count = Max number of backup log files:
LoggingPreferencePage.filebutton.label = Select...
-LoggingPreferencePage.appender.error.title = Configuration error
-LoggingPreferencePage.appender.error.msg = Impossible to log to file {0}.\nException message is: {1}
EMFComparePreferencePage.intro.text = Expand the tree to edit preferences for a specific feature.
diff --git a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/preferences/LoggingPreferencePage.java b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/preferences/LoggingPreferencePage.java
index 00c874de0..58511fcf6 100644
--- a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/preferences/LoggingPreferencePage.java
+++ b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/preferences/LoggingPreferencePage.java
@@ -10,15 +10,21 @@
*******************************************************************************/
package org.eclipse.emf.compare.rcp.ui.internal.preferences;
-import static org.eclipse.emf.compare.rcp.ui.EMFCompareRCPUIPlugin.LOGGER;
+import static org.eclipse.emf.compare.rcp.internal.preferences.EMFComparePreferences.LOG_BACKUP_COUNT_KEY;
+import static org.eclipse.emf.compare.rcp.internal.preferences.EMFComparePreferences.LOG_BACKUP_DEFAULT;
+import static org.eclipse.emf.compare.rcp.internal.preferences.EMFComparePreferences.LOG_FILENAME_KEY;
+import static org.eclipse.emf.compare.rcp.internal.preferences.EMFComparePreferences.LOG_FILE_DEFAULT;
+import static org.eclipse.emf.compare.rcp.internal.preferences.EMFComparePreferences.LOG_FILE_MAX_SIZE_KEY;
+import static org.eclipse.emf.compare.rcp.internal.preferences.EMFComparePreferences.LOG_FILE_SIZE_DEFAULT;
+import static org.eclipse.emf.compare.rcp.internal.preferences.EMFComparePreferences.LOG_LEVEL_DEFAULT;
+import static org.eclipse.emf.compare.rcp.internal.preferences.EMFComparePreferences.LOG_LEVEL_KEY;
import java.io.File;
import java.util.Arrays;
-import org.apache.log4j.Level;
-import org.eclipse.emf.compare.rcp.ui.EMFCompareRCPUIPlugin;
+import org.eclipse.core.runtime.preferences.IEclipsePreferences;
+import org.eclipse.emf.compare.rcp.EMFCompareRCPPlugin;
import org.eclipse.emf.compare.rcp.ui.internal.EMFCompareRCPUIMessages;
-import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.preference.PreferencePage;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.swt.SWT;
@@ -38,6 +44,7 @@ import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPreferencePage;
+import org.osgi.service.prefs.BackingStoreException;
/**
* Preference page used to configure logging in EMFCompare.
@@ -45,7 +52,6 @@ import org.eclipse.ui.IWorkbenchPreferencePage;
* @author <a href="mailto:laurent.delaigue@obeo.fr">Laurent Delaigue</a>
*/
public class LoggingPreferencePage extends PreferencePage implements IWorkbenchPreferencePage {
- public static final String EMFC_APPENDER_NAME = "EMFCFile"; //$NON-NLS-1$
private Combo levelCombo;
@@ -57,14 +63,6 @@ public class LoggingPreferencePage extends PreferencePage implements IWorkbenchP
private final String[] LOG_LEVELS = new String[] {"OFF", "ERROR", "INFO", "DEBUG" }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
- public static final String LOG_FILENAME_KEY = "org.eclipse.emf.compare.log.file.name"; //$NON-NLS-1$
-
- public static final String LOG_LEVEL_KEY = "org.eclipse.emf.compare.log.level"; //$NON-NLS-1$
-
- public static final String LOG_BACKUP_COUNT_KEY = "org.eclipse.emf.compare.log.backup.count"; //$NON-NLS-1$
-
- public static final String LOG_FILE_MAX_SIZE_KEY = "org.eclipse.emf.compare.log.file.max.size"; //$NON-NLS-1$
-
/**
* Constructor.
*/
@@ -102,11 +100,6 @@ public class LoggingPreferencePage extends PreferencePage implements IWorkbenchP
}
@Override
- protected IPreferenceStore doGetPreferenceStore() {
- return EMFCompareRCPUIPlugin.getDefault().getPreferenceStore();
- }
-
- @Override
protected Control createContents(Composite parent) {
Group group = new Group(parent, SWT.NULL);
group.setLayout(new GridLayout(3, false));
@@ -161,25 +154,30 @@ public class LoggingPreferencePage extends PreferencePage implements IWorkbenchP
return gd;
}
- protected void savePreferences() {
- getPreferenceStore().setValue(LOG_FILENAME_KEY, fileField.getText());
- getPreferenceStore().setValue(LOG_LEVEL_KEY, levelCombo.getText());
- getPreferenceStore().setValue(LOG_BACKUP_COUNT_KEY, maxBackupField.getText());
- getPreferenceStore().setValue(LOG_FILE_MAX_SIZE_KEY, maxSizeField.getText());
+ protected void savePreferences() throws BackingStoreException {
+ IEclipsePreferences prefs = EMFCompareRCPPlugin.getDefault().getEMFComparePreferences();
+ prefs.put(LOG_FILENAME_KEY, fileField.getText());
+ String item = levelCombo.getItem(levelCombo.getSelectionIndex());
+ prefs.put(LOG_LEVEL_KEY, item);
+ prefs.put(LOG_BACKUP_COUNT_KEY, maxBackupField.getText());
+ prefs.put(LOG_FILE_MAX_SIZE_KEY, maxSizeField.getText());
+ prefs.flush();
}
protected void resetPreferences() {
- getPreferenceStore().setToDefault(LOG_FILENAME_KEY);
- getPreferenceStore().setToDefault(LOG_LEVEL_KEY);
- getPreferenceStore().setToDefault(LOG_BACKUP_COUNT_KEY);
- getPreferenceStore().setToDefault(LOG_FILE_MAX_SIZE_KEY);
+ IEclipsePreferences prefs = EMFCompareRCPPlugin.getDefault().getEMFComparePreferences();
+ prefs.put(LOG_FILENAME_KEY, ""); //$NON-NLS-1$
+ prefs.put(LOG_LEVEL_KEY, "OFF"); //$NON-NLS-1$
+ prefs.putInt(LOG_BACKUP_COUNT_KEY, LOG_BACKUP_DEFAULT);
+ prefs.putInt(LOG_FILE_MAX_SIZE_KEY, LOG_FILE_SIZE_DEFAULT);
}
protected void refreshWidgets() {
- String fileName = getPreferenceStore().getString(LOG_FILENAME_KEY);
- String level = getPreferenceStore().getString(LOG_LEVEL_KEY);
- int maxBackupCount = getPreferenceStore().getInt(LOG_BACKUP_COUNT_KEY);
- int maxSizeInMB = getPreferenceStore().getInt(LOG_FILE_MAX_SIZE_KEY);
+ IEclipsePreferences prefs = EMFCompareRCPPlugin.getDefault().getEMFComparePreferences();
+ String fileName = prefs.get(LOG_FILENAME_KEY, LOG_FILE_DEFAULT);
+ String level = prefs.get(LOG_LEVEL_KEY, LOG_LEVEL_DEFAULT);
+ int maxBackupCount = prefs.getInt(LOG_BACKUP_COUNT_KEY, LOG_BACKUP_DEFAULT);
+ int maxSizeInMB = prefs.getInt(LOG_FILE_MAX_SIZE_KEY, LOG_FILE_SIZE_DEFAULT);
levelCombo.select(Arrays.asList(LOG_LEVELS).indexOf(level));
levelCombo.pack();
fileField.setText(fileName);
@@ -189,11 +187,13 @@ public class LoggingPreferencePage extends PreferencePage implements IWorkbenchP
@Override
public boolean performOk() {
- String item = levelCombo.getItem(levelCombo.getSelectionIndex());
- LOGGER.setLevel(Level.toLevel(item));
- savePreferences();
- refreshWidgets();
- return super.performOk();
+ try {
+ savePreferences();
+ refreshWidgets();
+ return super.performOk();
+ } catch (BackingStoreException e) {
+ return false;
+ }
}
@Override
diff --git a/plugins/org.eclipse.emf.compare.rcp/META-INF/MANIFEST.MF b/plugins/org.eclipse.emf.compare.rcp/META-INF/MANIFEST.MF
index 02ecb84f2..54d791a39 100644
--- a/plugins/org.eclipse.emf.compare.rcp/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.emf.compare.rcp/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: %pluginName
Bundle-SymbolicName: org.eclipse.emf.compare.rcp;singleton:=true
-Bundle-Version: 2.3.0.qualifier
+Bundle-Version: 2.3.1.qualifier
Bundle-Activator: org.eclipse.emf.compare.rcp.EMFCompareRCPPlugin
Bundle-Vendor: %providerName
Require-Bundle: org.eclipse.core.runtime,
@@ -24,4 +24,5 @@ Export-Package: org.eclipse.emf.compare.rcp,
org.eclipse.emf.compare.rcp.internal.tracer;x-friends:="org.eclipse.emf.compare.rcp.ui,org.eclipse.emf.compare.ide.ui",
org.eclipse.emf.compare.rcp.policy
Import-Package: com.google.common.base;version="[11.0.0,16.0.0)",
- com.google.common.collect;version="[11.0.0,16.0.0)"
+ com.google.common.collect;version="[11.0.0,16.0.0)",
+ org.apache.log4j;version="1.2.0"
diff --git a/plugins/org.eclipse.emf.compare.rcp/pom.xml b/plugins/org.eclipse.emf.compare.rcp/pom.xml
index b87a9fc02..a040ed785 100644
--- a/plugins/org.eclipse.emf.compare.rcp/pom.xml
+++ b/plugins/org.eclipse.emf.compare.rcp/pom.xml
@@ -10,6 +10,6 @@
</parent>
<groupId>org.eclipse.emf.compare</groupId>
<artifactId>org.eclipse.emf.compare.rcp</artifactId>
- <version>2.3.0-SNAPSHOT</version>
+ <version>2.3.1-SNAPSHOT</version>
<packaging>eclipse-plugin</packaging>
</project>
diff --git a/plugins/org.eclipse.emf.compare.rcp/src/org/eclipse/emf/compare/rcp/EMFCompareRCPPlugin.java b/plugins/org.eclipse.emf.compare.rcp/src/org/eclipse/emf/compare/rcp/EMFCompareRCPPlugin.java
index 3e7b599c9..055b2f2f3 100644
--- a/plugins/org.eclipse.emf.compare.rcp/src/org/eclipse/emf/compare/rcp/EMFCompareRCPPlugin.java
+++ b/plugins/org.eclipse.emf.compare.rcp/src/org/eclipse/emf/compare/rcp/EMFCompareRCPPlugin.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2013, 2014 Obeo.
+ * Copyright (c) 2013, 2015 Obeo.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -10,20 +10,37 @@
*******************************************************************************/
package org.eclipse.emf.compare.rcp;
+import static org.eclipse.emf.compare.rcp.internal.preferences.EMFComparePreferences.EMFC_APPENDER_NAME;
+import static org.eclipse.emf.compare.rcp.internal.preferences.EMFComparePreferences.LOG_BACKUP_COUNT_KEY;
+import static org.eclipse.emf.compare.rcp.internal.preferences.EMFComparePreferences.LOG_BACKUP_DEFAULT;
+import static org.eclipse.emf.compare.rcp.internal.preferences.EMFComparePreferences.LOG_FILENAME_KEY;
+import static org.eclipse.emf.compare.rcp.internal.preferences.EMFComparePreferences.LOG_FILE_MAX_SIZE_KEY;
+import static org.eclipse.emf.compare.rcp.internal.preferences.EMFComparePreferences.LOG_FILE_SIZE_DEFAULT;
+import static org.eclipse.emf.compare.rcp.internal.preferences.EMFComparePreferences.LOG_LEVEL_KEY;
+import static org.eclipse.emf.compare.rcp.internal.preferences.EMFComparePreferences.LOG_PATTERN;
+
import com.google.common.base.Predicate;
import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.ImmutableMultimap;
import com.google.common.collect.Multimap;
import com.google.common.collect.Multimaps;
+import java.io.IOException;
import java.util.Collection;
import java.util.List;
+import org.apache.log4j.Level;
+import org.apache.log4j.Logger;
+import org.apache.log4j.PatternLayout;
+import org.apache.log4j.RollingFileAppender;
import org.eclipse.core.runtime.IExtensionRegistry;
+import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.Plugin;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.preferences.IEclipsePreferences;
+import org.eclipse.core.runtime.preferences.IEclipsePreferences.IPreferenceChangeListener;
+import org.eclipse.core.runtime.preferences.IEclipsePreferences.PreferenceChangeEvent;
import org.eclipse.core.runtime.preferences.InstanceScope;
import org.eclipse.emf.compare.conflict.IConflictDetector;
import org.eclipse.emf.compare.diff.IDiffEngine;
@@ -37,6 +54,7 @@ import org.eclipse.emf.compare.merge.IMerger;
import org.eclipse.emf.compare.postprocessor.IPostProcessor;
import org.eclipse.emf.compare.provider.EMFCompareEditPlugin;
import org.eclipse.emf.compare.rcp.extension.AbstractRegistryEventListener;
+import org.eclipse.emf.compare.rcp.internal.EMFCompareRCPMessages;
import org.eclipse.emf.compare.rcp.internal.adapterfactory.AdapterFactoryDescriptorRegistryListener;
import org.eclipse.emf.compare.rcp.internal.extension.IItemRegistry;
import org.eclipse.emf.compare.rcp.internal.extension.impl.DescriptorRegistryEventListener;
@@ -95,6 +113,14 @@ public class EMFCompareRCPPlugin extends Plugin {
/** The id of the adapter factory extension point. */
public static final String FACTORY_PPID = "adapterFactory"; //$NON-NLS-1$
+ /**
+ * Log4j logger to use throughout EMFCompare for logging purposes.
+ */
+ private static final Logger LOGGER = Logger.getLogger("org.eclipse.emf.compare"); //$NON-NLS-1$
+
+ /** Number of bytes in a MiB. */
+ private static final int MEGABYTE = 1024 * 1024;
+
/** This plugin is a singleton, so it's quite ok to keep the plugin in a static field. */
private static EMFCompareRCPPlugin plugin;
@@ -167,6 +193,9 @@ public class EMFCompareRCPPlugin extends Plugin {
/** The registry listener that will be used to react to weight provider changes. */
private WeightProviderDescriptorRegistryListener weightProviderListener;
+ /** Will listen to preference changes and update log4j configuration accordingly. */
+ private IPreferenceChangeListener preferenceChangeListener;
+
/**
* Instance scope for preferences.
* <p>
@@ -209,6 +238,7 @@ public class EMFCompareRCPPlugin extends Plugin {
setUpConflictDetectorRegistry(registry);
+ initLogging();
}
/**
@@ -365,6 +395,10 @@ public class EMFCompareRCPPlugin extends Plugin {
*/
@Override
public void stop(BundleContext bundleContext) throws Exception {
+ if (preferenceChangeListener != null) {
+ getEMFComparePreferences().removePreferenceChangeListener(preferenceChangeListener);
+ }
+
EMFCompareRCPPlugin.plugin = null;
final IExtensionRegistry registry = Platform.getExtensionRegistry();
@@ -681,4 +715,102 @@ public class EMFCompareRCPPlugin extends Plugin {
return instanceScope.getNode(EMFCompareRCPPlugin.PLUGIN_ID);
}
+ /**
+ * Initializes log4j by reading the preferences.
+ */
+ private void initLogging() {
+ IEclipsePreferences prefs = getEMFComparePreferences();
+ LOGGER.setLevel(Level.toLevel(prefs.get(LOG_LEVEL_KEY, "OFF"))); //$NON-NLS-1$
+ RollingFileAppender appender = (RollingFileAppender)LOGGER.getAppender(EMFC_APPENDER_NAME);
+ String logFileName = prefs.get(LOG_FILENAME_KEY, ""); //$NON-NLS-1$
+ if (logFileName.length() > 0) {
+ if (appender == null) {
+ try {
+ createLogAppender(logFileName);
+ } catch (IOException e) {
+ // Invalidate file name
+ prefs.put(LOG_FILENAME_KEY, ""); //$NON-NLS-1$
+ }
+ } else {
+ appender.setMaxBackupIndex(prefs.getInt(LOG_BACKUP_COUNT_KEY, 10));
+ appender.setMaximumFileSize((prefs.getInt(LOG_FILE_MAX_SIZE_KEY, 100)) * MEGABYTE);
+ }
+ }
+ preferenceChangeListener = new LoggingPreferenceChangeListener();
+ prefs.addPreferenceChangeListener(preferenceChangeListener);
+ }
+
+ /**
+ * Creates the RollingFileAppender used to log with log4j.
+ *
+ * @param newFileName
+ * Path opf the log file
+ * @throws IOException
+ * If an IO problem occurs, like the given path does not represent a file, or it cannot be
+ * written;
+ */
+ private void createLogAppender(String newFileName) throws IOException {
+ RollingFileAppender appender;
+ appender = new RollingFileAppender(new PatternLayout(LOG_PATTERN), newFileName, true);
+ LOGGER.removeAllAppenders(); // We don't want to log elsewhere
+ LOGGER.addAppender(appender);
+ appender.setMaxBackupIndex(getEMFComparePreferences()
+ .getInt(LOG_BACKUP_COUNT_KEY, LOG_BACKUP_DEFAULT));
+ appender.setMaximumFileSize((getEMFComparePreferences().getInt(LOG_FILE_MAX_SIZE_KEY,
+ LOG_FILE_SIZE_DEFAULT))
+ * MEGABYTE);
+ }
+
+ /**
+ * Listens to logging preference changes to maintain the log4j configuration up-to-date.
+ *
+ * @author <a href="mailto:laurent.delaigue@obeo.fr">Laurent Delaigue</a>
+ */
+ private static class LoggingPreferenceChangeListener implements IPreferenceChangeListener {
+
+ /**
+ * Updates the log4j configuration when logging preferences change.
+ *
+ * @param event
+ * the preference change event.
+ */
+ public void preferenceChange(PreferenceChangeEvent event) {
+ if (LOG_FILENAME_KEY.equals(event.getKey())) {
+ String newFileName = (String)event.getNewValue();
+ RollingFileAppender appender = (RollingFileAppender)LOGGER.getAppender(EMFC_APPENDER_NAME);
+ if (newFileName != null && newFileName.length() > 0) {
+ if (appender == null) {
+ try {
+ EMFCompareRCPPlugin.getDefault().createLogAppender(newFileName);
+ } catch (IOException e) {
+ EMFCompareRCPPlugin.getDefault().getEMFComparePreferences().put(LOG_FILENAME_KEY,
+ ""); //$NON-NLS-1$
+ getDefault().log(
+ IStatus.ERROR,
+ EMFCompareRCPMessages.getString(
+ "logging.appender.error", newFileName, e.getMessage())); //$NON-NLS-1$
+ }
+ } else {
+ appender.setFile(newFileName);
+ }
+ } else {
+ // No file name, remove appender
+ LOGGER.removeAllAppenders();
+ }
+ } else if (LOG_LEVEL_KEY.equals(event.getKey())) {
+ LOGGER.setLevel(Level.toLevel((String)event.getNewValue()));
+ } else if (LOG_BACKUP_COUNT_KEY.equals(event.getKey())) {
+ RollingFileAppender appender = (RollingFileAppender)LOGGER.getAppender(EMFC_APPENDER_NAME);
+ if (appender != null) {
+ appender.setMaxBackupIndex(Integer.parseInt((String)event.getNewValue()));
+ }
+ } else if (LOG_FILE_MAX_SIZE_KEY.equals(event.getKey())) {
+ RollingFileAppender appender = (RollingFileAppender)LOGGER.getAppender(EMFC_APPENDER_NAME);
+ if (appender != null) {
+ appender.setMaximumFileSize(Integer.parseInt((String)event.getNewValue()) * MEGABYTE);
+ }
+ }
+ }
+ }
+
}
diff --git a/plugins/org.eclipse.emf.compare.rcp/src/org/eclipse/emf/compare/rcp/internal/emfcomparercpmessages.properties b/plugins/org.eclipse.emf.compare.rcp/src/org/eclipse/emf/compare/rcp/internal/emfcomparercpmessages.properties
index e6ac9c67f..5c5605a9b 100644
--- a/plugins/org.eclipse.emf.compare.rcp/src/org/eclipse/emf/compare/rcp/internal/emfcomparercpmessages.properties
+++ b/plugins/org.eclipse.emf.compare.rcp/src/org/eclipse/emf/compare/rcp/internal/emfcomparercpmessages.properties
@@ -13,4 +13,6 @@ malformed.extension.attribute = Attribute {0} is malformed, should be an integer
duplicate.merger = The merger {0} is registered twice.
duplicate.extension = The extension {0} is registered twice
-RCPMatchEngineFactory.INCORECT_USE_IDENTIFIER_ATTRIBUTE = Incorrect value of UseIdentifier stored in preferences \ No newline at end of file
+RCPMatchEngineFactory.INCORECT_USE_IDENTIFIER_ATTRIBUTE = Incorrect value of UseIdentifier stored in preferences
+
+logging.appender.error = Impossible to log to file {0}.\nException message is: {1} \ No newline at end of file
diff --git a/plugins/org.eclipse.emf.compare.rcp/src/org/eclipse/emf/compare/rcp/internal/preferences/EMFComparePreferences.java b/plugins/org.eclipse.emf.compare.rcp/src/org/eclipse/emf/compare/rcp/internal/preferences/EMFComparePreferences.java
index 953348761..f5b7b3da7 100644
--- a/plugins/org.eclipse.emf.compare.rcp/src/org/eclipse/emf/compare/rcp/internal/preferences/EMFComparePreferences.java
+++ b/plugins/org.eclipse.emf.compare.rcp/src/org/eclipse/emf/compare/rcp/internal/preferences/EMFComparePreferences.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2014 Obeo.
+ * Copyright (c) 2014, 2015 Obeo.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -45,6 +45,42 @@ public final class EMFComparePreferences {
/** Disabled adapter factories preference. */
public static final String DISABLED_ADAPTER_FACTORY = "org.eclipse.emf.compare.preference.disabled.adapter.factories"; //$NON-NLS-1$
+ /** Preference key for log4j file name. */
+ public static final String LOG_FILENAME_KEY = "org.eclipse.emf.compare.log.file.name"; //$NON-NLS-1$
+
+ /** Preference key for log4j log level. */
+ public static final String LOG_LEVEL_KEY = "org.eclipse.emf.compare.log.level"; //$NON-NLS-1$
+
+ /** Preference key for log4j backup file max number. */
+ public static final String LOG_BACKUP_COUNT_KEY = "org.eclipse.emf.compare.log.backup.count"; //$NON-NLS-1$
+
+ /** Preference key for log4j maximum file size. */
+ public static final String LOG_FILE_MAX_SIZE_KEY = "org.eclipse.emf.compare.log.file.max.size"; //$NON-NLS-1$
+
+ /** Log4j appender used by EMFCompare. */
+ public static final String EMFC_APPENDER_NAME = "EMFCFile"; //$NON-NLS-1$
+
+ /** Default log4j file name. */
+ public static final String LOG_FILE_DEFAULT = ""; //$NON-NLS-1$
+
+ /** Default log4j level. */
+ public static final String LOG_LEVEL_DEFAULT = "OFF"; //$NON-NLS-1$
+
+ /** Default log4j backup file max number. */
+ public static final int LOG_BACKUP_DEFAULT = 10;
+
+ /** Default log4j maximum file size. */
+ public static final int LOG_FILE_SIZE_DEFAULT = 100;
+
+ /**
+ * Pattern used for log4j logging.
+ *
+ * <pre>
+ * Date [Thread name] LEVEL 3.last.segments.of.logger.name <NDC Tag> - message\n
+ * </pre>
+ */
+ public static final String LOG_PATTERN = "%d{ISO8601} [%t] %-5p %c{3} %x - %m%n"; //$NON-NLS-1$
+
/**
* Private constructor. Not to be called.
*/

Back to the top