/**
* Copyright (C) 2005 - 2015 Eric Van Dewoestine
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.eclim.eclipse;
import java.io.PrintStream;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Map;
import org.apache.log4j.Level;
import org.apache.log4j.LogManager;
import org.eclim.logging.Logger;
import org.eclim.util.StringUtils;
import org.eclipse.e4.ui.internal.workbench.E4Workbench;
import org.eclipse.equinox.app.IApplicationContext;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.internal.IPreferenceConstants;
import org.eclipse.ui.internal.ide.application.IDEApplication;
import org.eclipse.ui.internal.util.PrefUtil;
/**
* Application used to start a headless version of eclipse running the eclim
* daemon.
*
* @author Eric Van Dewoestine
*/
public class EclimApplication
extends IDEApplication
{
private static final Logger logger = Logger.getLogger(EclimApplication.class);
private static EclimApplication instance;
private static boolean stopping;
public static PrintStream stdout = System.out;
public static PrintStream stderr = System.err;
@SuppressWarnings({"rawtypes", "unchecked"})
@Override
public Object start(IApplicationContext context)
throws Exception
{
if (System.getProperty("eclipse.launcher") == null){
System.setProperty("eclipse.launcher", "eclimd");
}
if (System.getProperty("org.eclim.debug") != null){
logger.info("Enabing debug logging for org.eclim...");
LogManager.getLogger("org.eclim").setLevel(Level.DEBUG);
}
Map args = context.getArguments();
String[] appArgs = (String[])args.get(IApplicationContext.APPLICATION_ARGS);
String[] presentationArgs = new String[]{
// prevent headless worbench settings from being persisted to
// workbench.xmi, which can break the default workbench.
"-" + E4Workbench.PERSIST_STATE,
"false",
// inject our headless presentation engine.
"-" + E4Workbench.PRESENTATION_URI_ARG,
"bundleclass://org.eclim/org.eclim.eclipse.e4.HeadlessPresentationEngine",
};
String[] newArgs = new String[appArgs.length + presentationArgs.length];
System.arraycopy(appArgs, 0, newArgs, 0, appArgs.length);
System.arraycopy(
presentationArgs, 0, newArgs, appArgs.length, presentationArgs.length);
args.put(IApplicationContext.APPLICATION_ARGS, newArgs);
instance = this;
Runtime.getRuntime().addShutdownHook(new Thread(){
public void run(){
try{
EclimApplication.shutdown();
}catch(Exception ex) {
logger.error("Error during shutdown.", ex);
}
}
});
// Note: starting of EclimDaemon is handled by EclimStartup so that the
// daemon is started after the workbench is available.
// Note: the user can disable the eclim IStartup class from the eclipse gui
// preferences: General > Startup and Shutdown
// So, re-enable it if necessary.
IPreferenceStore preferences = PrefUtil.getInternalPreferenceStore();
String pref = preferences.getString(
IPreferenceConstants.PLUGINS_NOT_ACTIVATED_ON_STARTUP);
HashSet<String> disabled = new HashSet<String>(
Arrays.asList(StringUtils.split(pref, IPreferenceConstants.SEPARATOR)));
if (disabled.contains("org.eclim")){
logger.debug("re-enable disabled eclim startup extension...");
disabled.remove("org.eclim");
preferences.setValue(
IPreferenceConstants.PLUGINS_NOT_ACTIVATED_ON_STARTUP,
StringUtils.join(disabled, IPreferenceConstants.SEPARATOR));
}
logger.debug("eclim application loading, starting IDEApplication...");
return super.start(context);
}
public static boolean isEnabled()
{
return instance != null;
}
public static synchronized void shutdown()
throws Exception
{
if (instance != null && !stopping){
stopping = true;
EclimDaemon.getInstance().stop();
final IWorkbench workbench = PlatformUI.getWorkbench();
workbench.getDisplay().syncExec(new Runnable(){
public void run() {
workbench.getActiveWorkbenchWindow().close();
}
});
}
}
}