/**
* Copyright (c) Red Hat, Inc., contributors and others 2013 - 2014. All rights reserved
*
* Licensed under the Eclipse Public License version 1.0, available at
* http://www.eclipse.org/legal/epl-v10.html
*/
package org.jboss.tools.forge.core.internal;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Plugin;
import org.eclipse.core.runtime.Status;
import org.eclipse.debug.core.DebugException;
import org.eclipse.debug.core.model.IProcess;
import org.eclipse.m2e.core.MavenPlugin;
import org.eclipse.m2e.core.embedder.AbstractMavenConfigurationChangeListener;
import org.eclipse.m2e.core.embedder.IMavenConfiguration;
import org.eclipse.m2e.core.embedder.MavenConfigurationChangeEvent;
import org.jboss.tools.forge.core.runtime.ForgeRuntime;
import org.jboss.tools.usage.event.UsageEvent;
import org.jboss.tools.usage.event.UsageEventType;
import org.jboss.tools.usage.event.UsageReporter;
import org.osgi.framework.BundleContext;
public class ForgeCorePlugin extends Plugin {
public static final String PLUGIN_ID = "org.jboss.tools.forge.core";
private static ForgeCorePlugin plugin;
private static Thread shutdownHook;
private static List<IProcess> processes = new ArrayList<>();
private UsageEventType forgeStartEventType;
@Override
public void start(BundleContext context) throws Exception {
super.start(context);
setMavenSettings();
initializeShutdownHook();
plugin = this;
initializeUsageReporting();
}
private void initializeUsageReporting() {
forgeStartEventType = new UsageEventType("forge", UsageEventType.getVersion(this), null, "start",
"Forge Runtime Version", "major.minor.micro.identifier");
UsageReporter.getInstance().registerEvent(forgeStartEventType);
}
public void sendStartEvent(ForgeRuntime runtime) {
UsageEventType startEventType = getForgeStartEventType();
UsageEvent startEvent = startEventType.event(runtime.getVersion());
UsageReporter.getInstance().trackEvent(startEvent);
}
private void setMavenSettings() {
IMavenConfiguration mavenConfig = MavenPlugin.getMavenConfiguration();
mavenConfig.addConfigurationChangeListener(new AbstractMavenConfigurationChangeListener() {
@Override
public void mavenConfigurationChange(MavenConfigurationChangeEvent event) throws CoreException {
registerSystemProperties();
}
});
registerSystemProperties();
}
private void registerSystemProperties() {
IMavenConfiguration mavenConfig = MavenPlugin.getMavenConfiguration();
Properties properties = System.getProperties();
// Register user settings file
String userSettingsFile = mavenConfig.getUserSettingsFile();
if (userSettingsFile != null) {
properties.setProperty("org.apache.maven.user-settings", userSettingsFile);
} else {
properties.remove("org.apache.maven.user-settings");
}
// Register global settings file
String globalSettingsFile = mavenConfig.getGlobalSettingsFile();
if (globalSettingsFile != null) {
properties.setProperty("org.apache.maven.global-settings", globalSettingsFile);
} else {
properties.remove("org.apache.maven.global-settings");
}
}
public UsageEventType getForgeStartEventType() {
return forgeStartEventType;
}
private void initializeShutdownHook() {
if (shutdownHook == null) {
shutdownHook = new Thread(new Runnable() {
@Override
public void run() {
for (IProcess process : processes) {
if (process != null && process.canTerminate()) {
try {
process.terminate();
} catch (DebugException e) {
log(e);
}
}
}
}
});
Runtime.getRuntime().addShutdownHook(shutdownHook);
}
}
@Override
public void stop(BundleContext context) throws Exception {
plugin = null;
super.stop(context);
}
public static ForgeCorePlugin getDefault() {
return plugin;
}
public static void log(Throwable t) {
getDefault().getLog().log(newErrorStatus("Error logged from Forge Core Plugin: ", t));
}
private static IStatus newErrorStatus(String message, Throwable exception) {
return new Status(IStatus.ERROR, PLUGIN_ID, IStatus.INFO, message, exception);
}
public static void addForgeProcess(IProcess process) {
processes.add(process);
}
public static void removeForgeProcess(IProcess process) {
processes.remove(process);
}
public static void log(IStatus status) {
ResourcesPlugin.getPlugin().getLog().log(status);
}
public static void logErrorMessage(String message) {
log(IStatus.ERROR, message);
}
public static void logInfoMessage(String message) {
log(IStatus.INFO, message);
}
private static void log(int status, String message) {
log(new Status(status, PLUGIN_ID, status, message, null));
}
}