/*
* $Id$
*
* SARL is an general-purpose agent programming language.
* More details on http://www.sarl.io
*
* Copyright (C) 2014-2017 the original authors or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package io.sarl.eclipse;
import java.util.Arrays;
import com.google.common.base.Strings;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.ILog;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.MultiStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.preferences.IEclipsePreferences;
import org.eclipse.core.runtime.preferences.InstanceScope;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.osgi.internal.debug.Debug;
import org.eclipse.swt.graphics.Image;
import org.eclipse.ui.plugin.AbstractUIPlugin;
import org.osgi.service.prefs.BackingStoreException;
/**
* Utility functions for the plugin.
*
* @author $Author: sgalland$
* @version $FullVersion$
* @mavengroupid $GroupId$
* @mavenartifactid $ArtifactId$
*/
public class SARLEclipsePlugin extends AbstractUIPlugin {
/** Identifier of the plugin.
*/
public static final String PLUGIN_ID = "io.sarl.eclipse"; //$NON-NLS-1$
private static SARLEclipsePlugin instance;
/** Construct an Eclipse plugin for SARL.
*/
public SARLEclipsePlugin() {
setDefault(this);
}
/** Replies the logger.
*
* <p>Thus function is a non-final version of {@link #getLog()}.
*
* @return the logger.
*/
public ILog getILog() {
return getLog();
}
/**
* Returns a section in the SARL Eclipse plugin's dialog settings.
* If the section doesn't exist yet, it is created.
*
* @param name - the name of the section
* @return the section of the given name
*/
public IDialogSettings getDialogSettingsSection(String name) {
final IDialogSettings dialogSettings = getDialogSettings();
IDialogSettings section = dialogSettings.getSection(name);
if (section == null) {
section = dialogSettings.addNewSection(name);
}
return section;
}
/** Set the default instance of the plugin.
*
* @param defaultInstance - the default plugin instance.
*/
public static void setDefault(SARLEclipsePlugin defaultInstance) {
instance = defaultInstance;
}
/** Replies the instance of the plugin.
*
* @return the default plugin instance.
*/
public static SARLEclipsePlugin getDefault() {
return instance;
}
/** Replies the image stored in the current Eclipse plugin.
*
* @param imagePath - path of the image.
* @return the image.
*/
public Image getImage(String imagePath) {
final ImageDescriptor descriptor = getImageDescriptor(imagePath);
if (descriptor == null) {
return null;
}
return descriptor.createImage();
}
/** Replies the image descriptor for the given image path.
*
* @param imagePath - path of the image.
* @return the image descriptor.
*/
public ImageDescriptor getImageDescriptor(String imagePath) {
ImageDescriptor descriptor = getImageRegistry().getDescriptor(imagePath);
if (descriptor == null) {
descriptor = AbstractUIPlugin.imageDescriptorFromPlugin(SARLEclipsePlugin.PLUGIN_ID, imagePath);
if (descriptor != null) {
getImageRegistry().put(imagePath, descriptor);
}
}
return descriptor;
}
/** Create a status.
*
* @param severity - the severity level, see {@link IStatus}.
* @param message - the message associated to the status.
* @param cause - the cause of the problem.
* @return the status.
*/
@SuppressWarnings("static-method")
public IStatus createStatus(int severity, String message, Throwable cause) {
return new Status(severity, PLUGIN_ID, message, cause);
}
/** Create a status.
*
* @param severity - the severity level, see {@link IStatus}.
* @param code - the code of the error.
* @param message - the message associated to the status.
* @param cause - the cause of the problem.
* @return the status.
*/
@SuppressWarnings("static-method")
public IStatus createStatus(int severity, int code, String message, Throwable cause) {
return new Status(severity, PLUGIN_ID, code, message, cause);
}
/** Create a status.
*
* @param severity - the severity level, see {@link IStatus}.
* @param cause - the cause of the problem.
* @return the status.
*/
public IStatus createStatus(int severity, Throwable cause) {
String message = cause.getLocalizedMessage();
if (Strings.isNullOrEmpty(message)) {
message = cause.getMessage();
}
if (Strings.isNullOrEmpty(message)) {
message = cause.getClass().getSimpleName();
}
return createStatus(severity, message, cause);
}
/** Create a status.
*
* @param severity - the severity level, see {@link IStatus}.
* @param code - the code of the error.
* @param cause - the cause of the problem.
* @return the status.
*/
public IStatus createStatus(int severity, int code, Throwable cause) {
String message = cause.getLocalizedMessage();
if (Strings.isNullOrEmpty(message)) {
message = cause.getMessage();
}
if (Strings.isNullOrEmpty(message)) {
message = cause.getClass().getSimpleName();
}
return createStatus(severity, code, message, cause);
}
/** Create a status.
*
* @param severity - the severity level, see {@link IStatus}.
* @param message - the message associated to the status.
* @return the status.
*/
@SuppressWarnings("static-method")
public IStatus createStatus(int severity, String message) {
return new Status(severity, PLUGIN_ID, message);
}
/** Create a status.
*
* @param severity - the severity level, see {@link IStatus}.
* @param code - the code of the error.
* @param message - the message associated to the status.
* @return the status.
*/
@SuppressWarnings("static-method")
public IStatus createStatus(int severity, int code, String message) {
return new Status(severity, PLUGIN_ID, code, message, null);
}
/** Create a ok status.
*
* @return the status.
*/
@SuppressWarnings("static-method")
public IStatus createOkStatus() {
return Status.OK_STATUS;
}
/** Create a multistatus.
*
* @param status - the status to put in the same status instance.
* @return the status.
*/
public IStatus createMultiStatus(IStatus... status) {
return createMultiStatus(Arrays.asList(status));
}
/** Create a multistatus.
*
* @param status - the status to put in the same status instance.
* @return the status.
*/
@SuppressWarnings("static-method")
public IStatus createMultiStatus(Iterable<? extends IStatus> status) {
final IStatus max = findMax(status);
final MultiStatus multiStatus;
if (max == null) {
multiStatus = new MultiStatus(PLUGIN_ID, 0, null, null);
} else {
multiStatus = new MultiStatus(PLUGIN_ID, 0, max.getMessage(), max.getException());
}
for (final IStatus s : status) {
multiStatus.add(s);
}
return multiStatus;
}
private static IStatus findMax(Iterable<? extends IStatus> status) {
IStatus max = null;
for (final IStatus s : status) {
if (max == null || max.getSeverity() > s.getSeverity()) {
max = s;
}
}
return max;
}
/**
* Logs an internal error with the specified message.
*
* @param message the error message to log
*/
public void logErrorMessage(String message) {
getILog().log(new Status(IStatus.ERROR, PLUGIN_ID, message, null));
}
/**
* Logs an internal debug message with the specified message.
*
* @param message the debug message to log
*/
@SuppressWarnings("static-method")
public void logDebugMessage(String message) {
Debug.println(message);
}
/**
* Logs an internal debug message with the specified message.
*
* @param cause - the cause of the message log.
*/
@SuppressWarnings({"static-method", "checkstyle:regexp"})
public void logDebugMessage(Throwable cause) {
Debug.printStackTrace(cause);
}
/**
* Logs an internal debug message with the specified message.
*
* @param message - the debug message to log
* @param cause - the cause of the message log.
*/
@SuppressWarnings({"static-method", "checkstyle:regexp"})
public void logDebugMessage(String message, Throwable cause) {
Debug.println(message);
if (cause != null) {
Debug.printStackTrace(cause);
}
}
/**
* Logs an internal error with the specified throwable.
*
* @param exception the exception to be logged
*/
public void log(Throwable exception) {
if (exception instanceof CoreException) {
getILog().log(new Status(IStatus.ERROR, PLUGIN_ID,
exception.getMessage(),
exception.getCause()));
} else if (exception != null) {
getILog().log(new Status(IStatus.ERROR, PLUGIN_ID,
exception.getMessage(), exception));
} else {
getILog().log(new Status(IStatus.ERROR, PLUGIN_ID,
"Internal Error", exception)); //$NON-NLS-1$
}
}
/** Replies the Eclipse preferences for this plugin.
*
* @return the Eclipse preferences, never <code>null</code>.
*/
@SuppressWarnings("static-method")
public IEclipsePreferences getPreferences() {
return InstanceScope.INSTANCE.getNode(PLUGIN_ID);
}
/**
* Saves the preferences for the plug-in.
*/
public void savePreferences() {
final IEclipsePreferences prefs = getPreferences();
try {
prefs.flush();
} catch (BackingStoreException e) {
getILog().log(createStatus(IStatus.ERROR, e));
}
}
}