--- /dev/null
+/*******************************************************************************\r
+ * Copyright (c) 2007, 2010 Association for Decentralized Information Management\r
+ * in Industry THTH ry.\r
+ * All rights reserved. This program and the accompanying materials\r
+ * are made available under the terms of the Eclipse Public License v1.0\r
+ * which accompanies this distribution, and is available at\r
+ * http://www.eclipse.org/legal/epl-v10.html\r
+ *\r
+ * Contributors:\r
+ * VTT Technical Research Centre of Finland - initial API and implementation\r
+ *******************************************************************************/\r
+package org.simantics.message.internal;\r
+\r
+import java.io.File;\r
+import java.util.Hashtable;\r
+\r
+import org.eclipse.core.runtime.IPath;\r
+import org.eclipse.core.runtime.Plugin;\r
+import org.eclipse.osgi.framework.log.FrameworkLog;\r
+import org.osgi.framework.BundleContext;\r
+import org.osgi.framework.ServiceRegistration;\r
+import org.simantics.message.ILogListener;\r
+import org.simantics.message.ILogger;\r
+import org.simantics.message.IMessageSchemeManager;\r
+\r
+/**\r
+ * The activator class controls the plug-in life cycle\r
+ */\r
+@SuppressWarnings("restriction")\r
+public class Activator extends Plugin {\r
+\r
+ private static final String DEFAULT_LOG_FILE_NAME = "messages.log";\r
+\r
+ // The plug-in ID\r
+ public static final String PLUGIN_ID = "org.simantics.message";\r
+\r
+ private static final String LOGGER_NAME = "org.simantics.message.logger"; //$NON-NLS-1$\r
+\r
+ // The shared instance\r
+ private static Activator plugin;\r
+ private BundleContext bundleContext;\r
+\r
+ // The one and only message service instance\r
+ private Messages messagesService;\r
+ private MessageSchemeManager messageSchemeManagerService;\r
+\r
+ @SuppressWarnings("rawtypes")\r
+ private ServiceRegistration messages = null;\r
+ @SuppressWarnings("rawtypes")\r
+ private ServiceRegistration messageSchemeManager = null;\r
+\r
+ private LogWriter platformLog = null;\r
+ private FrameworkLog frameworkLog = null;\r
+\r
+ /**\r
+ * The constructor\r
+ */\r
+ public Activator() {\r
+ }\r
+\r
+ /*\r
+ * (non-Javadoc)\r
+ * \r
+ * @see\r
+ * org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext\r
+ * )\r
+ */\r
+ @SuppressWarnings({ "rawtypes", "unchecked" })\r
+ @Override\r
+ public void start(BundleContext context) throws Exception {\r
+ super.start(context);\r
+ this.bundleContext = context;\r
+\r
+ messagesService = new Messages();\r
+ messageSchemeManagerService = new MessageSchemeManager();\r
+\r
+ messages = bundleContext.registerService(ILogger.class.getName(), messagesService, new Hashtable());\r
+ messageSchemeManager = bundleContext.registerService(IMessageSchemeManager.class.getName(), messageSchemeManagerService, new Hashtable<String, Object>());\r
+\r
+ // Attach a writer listener to the Messages ILog to actually get the logs stored on disk.\r
+ // NOTE: This must be the first listener for this ILog, to guarantee that the log on disk\r
+ // is always up-to-date if other ILogListeners want to read it. LogView does exactly this.\r
+ FrameworkLog log = getFrameworkLog();\r
+ if (log != null) {\r
+ platformLog = new LogWriter(getFrameworkLog());\r
+ addLogListener(platformLog);\r
+ } else\r
+ platformLog = null;\r
+\r
+ plugin = this;\r
+ }\r
+\r
+ /*\r
+ * (non-Javadoc)\r
+ * \r
+ * @see\r
+ * org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext\r
+ * )\r
+ */\r
+ @Override\r
+ public void stop(BundleContext context) throws Exception {\r
+ if (platformLog != null)\r
+ removeLogListener(platformLog);\r
+ if (frameworkLog != null)\r
+ frameworkLog.close();\r
+\r
+ if (messageSchemeManager != null) {\r
+ messageSchemeManager.unregister();\r
+ messageSchemeManager = null;\r
+ messageSchemeManagerService = null;\r
+ }\r
+\r
+ if (messages != null) {\r
+ messages.unregister();\r
+ messages = null;\r
+ messagesService = null;\r
+ }\r
+\r
+ bundleContext = null;\r
+ plugin = null;\r
+ super.stop(context);\r
+ }\r
+\r
+ /**\r
+ * Returns the shared instance\r
+ * \r
+ * @return the shared instance\r
+ */\r
+ public static Activator getDefault() {\r
+ return plugin;\r
+ }\r
+\r
+ /**\r
+ * Returns the shared Simantics ILogger service instance.\r
+ * \r
+ * @return the shared message service\r
+ */\r
+ public ILogger getMessages() {\r
+ return messagesService;\r
+ }\r
+\r
+ /**\r
+ * Add a listener to the Simantics platform ILogger service.\r
+ */\r
+ public void addLogListener(ILogListener listener) {\r
+ getMessages().addLogListener(listener);\r
+ }\r
+\r
+ /**\r
+ * Remove a listener from the Simantics platform ILogger service.\r
+ */\r
+ public void removeLogListener(ILogListener listener) {\r
+ getMessages().removeLogListener(listener);\r
+ }\r
+\r
+ /**\r
+ * @return\r
+ */\r
+ private FrameworkLog getFrameworkLog() {\r
+ if (frameworkLog == null) {\r
+ // TODO: make this a configurable preference, just like the osgi.logfile preference\r
+ IPath logLocation = getStateLocation().append(DEFAULT_LOG_FILE_NAME);\r
+ // TODO: need to clone EquinoxLogWriter and EquinoxLogFactory to this plugin\r
+// EquinoxLogWriter logWriter = new EclipseLogWriter(logLocation.toFile(), LOGGER_NAME, true);\r
+// LogServiceManager logServiceManager = new LogServiceManager(logWriter);\r
+// EquinoxLogFactory logFactory = new EquinoxLogFactory(logWriter, logServiceManager);\r
+// frameworkLog = logFactory.getService(getBundle(), null);\r
+ }\r
+ return frameworkLog;\r
+ }\r
+\r
+ /**\r
+ * @return\r
+ */\r
+ public static File getLogFile() {\r
+ return getDefault().getFrameworkLog().getFile();\r
+ }\r
+\r
+ /**\r
+ * Returns the shared Simantics ILogger service instance.\r
+ * \r
+ * @return the shared message service\r
+ */\r
+ public IMessageSchemeManager getMessageSchemeManager() {\r
+ return messageSchemeManagerService;\r
+ }\r
+\r
+}\r