blob: 2f1e8a963f6ca255ed55dd53bbd9b9fabaa332d0 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005, 2017 IBM Corporation and others.
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0.
*
* SPDX-License-Identifier: EPL-2.0
*
*******************************************************************************/
package org.eclipse.dltk.ruby.core;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.ListenerList;
import org.eclipse.core.runtime.OperationCanceledException;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.Plugin;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.SubProgressMonitor;
import org.eclipse.dltk.core.DLTKCore;
import org.eclipse.dltk.core.IShutdownListener;
import org.eclipse.dltk.core.ModelException;
import org.eclipse.dltk.core.search.IDLTKSearchConstants;
import org.eclipse.dltk.core.search.IDLTKSearchScope;
import org.eclipse.dltk.core.search.NopTypeNameRequestor;
import org.eclipse.dltk.core.search.SearchEngine;
import org.eclipse.dltk.core.search.SearchPattern;
import org.osgi.framework.BundleContext;
/**
* The activator class controls the plug-in life cycle
*/
public class RubyPlugin extends Plugin {
// The plug-in ID
public static final String PLUGIN_ID = "org.eclipse.dltk.ruby.core"; //$NON-NLS-1$
public static final boolean DUMP_EXCEPTIONS_TO_CONSOLE = Boolean
.valueOf(Platform.getDebugOption(
"org.eclipse.dltk.ruby.core/dumpErrorsToConsole")) //$NON-NLS-1$
.booleanValue();
// The shared instance
private static RubyPlugin plugin;
/**
* The constructor
*/
public RubyPlugin() {
plugin = this;
}
@Override
public void start(BundleContext context) throws Exception {
super.start(context);
}
private final ListenerList<IShutdownListener> shutdownListeners = new ListenerList<>();
public void addShutdownListener(IShutdownListener listener) {
shutdownListeners.add(listener);
}
@Override
public void stop(BundleContext context) throws Exception {
for (IShutdownListener listener : shutdownListeners) {
listener.shutdown();
}
shutdownListeners.clear();
plugin = null;
savePluginPreferences();
super.stop(context);
}
/**
* Returns the shared instance
*
* @return the shared instance
*/
public static RubyPlugin getDefault() {
return plugin;
}
public static void log(Exception ex) {
if (DLTKCore.DEBUG || DUMP_EXCEPTIONS_TO_CONSOLE)
ex.printStackTrace();
String message = ex.getMessage();
if (message == null)
message = "(no message)"; //$NON-NLS-1$
getDefault().getLog()
.log(new Status(IStatus.ERROR, PLUGIN_ID, 0, message, ex));
}
public static void log(String message) {
if (DLTKCore.DEBUG || DUMP_EXCEPTIONS_TO_CONSOLE)
System.out.println(message);
getDefault().getLog()
.log(new Status(IStatus.WARNING, PLUGIN_ID, 0, message, null));
}
/**
* Initializes DLTKCore internal structures to allow subsequent operations
* (such as the ones that need a resolved classpath) to run full speed. A
* client may choose to call this method in a background thread early after
* the workspace has started so that the initialization is transparent to
* the user.
* <p>
* However calling this method is optional. Services will lazily perform
* initialization when invoked. This is only a way to reduce initialization
* overhead on user actions, if it can be performed before at some
* appropriate moment.
* </p>
* <p>
* This initialization runs accross all Java projects in the workspace. Thus
* the workspace root scheduling rule is used during this operation.
* </p>
* <p>
* This method may return before the initialization is complete. The
* initialization will then continue in a background thread.
* </p>
* <p>
* This method can be called concurrently.
* </p>
*
* @param monitor
* a progress monitor, or <code>null</code> if progress reporting
* and cancellation are not desired
* @exception CoreException
* if the initialization fails, the status of the exception
* indicates the reason of the failure
* @since 3.1
*/
public static void initializeAfterLoad(IProgressMonitor monitor)
throws CoreException {
try {
if (monitor != null)
monitor.beginTask(Messages.RubyPlugin_initializingDltkRuby,
100);
// dummy query for waiting until the indexes are ready
SearchEngine engine = new SearchEngine();
IDLTKSearchScope scope = SearchEngine
.createWorkspaceScope(RubyLanguageToolkit.getDefault());
try {
if (monitor != null)
monitor.subTask(
Messages.RubyPlugin_initializingSearchEngine);
engine.searchAllTypeNames(null, SearchPattern.R_EXACT_MATCH,
"!@$#!@".toCharArray(), //$NON-NLS-1$
SearchPattern.R_PATTERN_MATCH
| SearchPattern.R_CASE_SENSITIVE,
IDLTKSearchConstants.TYPE, scope,
new NopTypeNameRequestor(),
// will not activate index query caches if indexes are
// not ready, since it would take to long
// to wait until indexes are fully rebuild
IDLTKSearchConstants.CANCEL_IF_NOT_READY_TO_SEARCH,
monitor == null ? null
: new SubProgressMonitor(monitor, 49) // 49% of
// the
// time
// is
// spent
// in
// the
// dummy search
);
// String[] mainClasses = new String[] {
// "Object", "String", "Fixnum", "Array", "Regexp", "Class",
// "Kernel" }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
// //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$
// for (int i = 0; i < mainClasses.length; i++) {
// RubyMixinModel.getInstance().createRubyElement(
// mainClasses[i]);
// RubyMixinModel.getInstance().createRubyElement(
// mainClasses[i] + "%"); //$NON-NLS-1$
// monitor.worked(10);
// }
// RubyMixinModel.getRawInstance().find("$*"); //$NON-NLS-1$
// monitor.worked(10);
} catch (ModelException e) {
// /search failed: ignore
} catch (OperationCanceledException e) {
if (monitor != null && monitor.isCanceled())
throw e;
// else indexes were not ready: catch the exception so that jars
// are still refreshed
}
} finally {
if (monitor != null)
monitor.done();
}
}
}