diff --git a/plugins/org.jkiss.dbeaver.debug.core/META-INF/MANIFEST.MF b/plugins/org.jkiss.dbeaver.debug.core/META-INF/MANIFEST.MF index ac8e47146d7bbeed316a1223535e8bcfd249ae63..0f0d46983e7d82cd14816baebca188e9db5ad51f 100644 --- a/plugins/org.jkiss.dbeaver.debug.core/META-INF/MANIFEST.MF +++ b/plugins/org.jkiss.dbeaver.debug.core/META-INF/MANIFEST.MF @@ -12,8 +12,6 @@ Require-Bundle: org.eclipse.core.runtime, Export-Package: org.jkiss.dbeaver.debug, org.jkiss.dbeaver.debug.core, org.jkiss.dbeaver.debug.core.breakpoints, - org.jkiss.dbeaver.debug.core.model, - org.jkiss.dbeaver.runtime, - org.jkiss.dbeaver.runtime.core + org.jkiss.dbeaver.debug.core.model Bundle-Activator: org.jkiss.dbeaver.debug.internal.core.DebugCoreActivator Bundle-ActivationPolicy: lazy diff --git a/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/DBGBaseController.java b/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/DBGBaseController.java index df9bc04d0b3d62f7316ab6637b39fb3b4997995a..a87d36f22552116d9be2239dc650bf906b9eb54d 100644 --- a/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/DBGBaseController.java +++ b/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/DBGBaseController.java @@ -29,8 +29,6 @@ import org.jkiss.dbeaver.model.exec.DBCExecutionPurpose; import org.jkiss.dbeaver.model.exec.DBCSession; import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor; import org.jkiss.dbeaver.registry.DataSourceDescriptor; -import org.jkiss.dbeaver.runtime.DBRResult; -import org.jkiss.dbeaver.runtime.DefaultResult; public class DBGBaseController implements DBGController { @@ -50,7 +48,7 @@ public class DBGBaseController implements DBGController { } @Override - public DBRResult connect(DBRProgressMonitor monitor) { + public void connect(DBRProgressMonitor monitor) throws DBGException { DBPDataSource dataSource = dataSourceDescriptor.getDataSource(); if (!dataSourceDescriptor.isConnected()) { @@ -60,7 +58,7 @@ public class DBGBaseController implements DBGController { } catch (DBException e) { String message = NLS.bind(DebugMessages.DatabaseDebugController_e_connecting_datasource, dataSourceDescriptor); log.error(message, e); - return DefaultResult.error(message, e); + throw new DBGException(message, e); } } try { @@ -70,9 +68,8 @@ public class DBGBaseController implements DBGController { } catch (DBException e) { String message = NLS.bind(DebugMessages.DatabaseDebugController_e_opening_debug_context, dataSourceDescriptor); log.error(message, e); - return DefaultResult.error(message, e); + throw new DBGException(message, e); } - return DefaultResult.ok(); } protected void afterSessionOpen(DBCSession session) { @@ -84,19 +81,19 @@ public class DBGBaseController implements DBGController { } @Override - public void resume() { + public void resume() throws DBGException { // TODO Auto-generated method stub } @Override - public void suspend() { + public void suspend() throws DBGException { // TODO Auto-generated method stub } @Override - public void terminate() { + public void terminate() throws DBGException { beforeSessionClose(this.debugSession); if (this.debugSession != null) { this.debugSession.close(); diff --git a/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/DBGController.java b/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/DBGController.java index 3480675aac62659b0052a5ce206ced7e52df04dc..e192a4a91943ce07c96eec412fba50e537068155 100644 --- a/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/DBGController.java +++ b/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/DBGController.java @@ -21,26 +21,22 @@ import java.util.Map; import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor; import org.jkiss.dbeaver.registry.DataSourceDescriptor; -import org.jkiss.dbeaver.runtime.DBRResult; - -//FIXME:AF: we need "operation result" interface like IStatus to express the result of operation -//FIXME:AF: so let's return void for now and let's throw an exception for any issue (poor practice) /** * This interface is expected to be used in synch manner */ public interface DBGController { - + void init(DataSourceDescriptor dataSourceDescriptor, String databaseName, Map attributes); - public DBRResult connect(DBRProgressMonitor monitor); + void connect(DBRProgressMonitor monitor) throws DBGException; + + void resume() throws DBGException; - void resume(); + void suspend() throws DBGException; - void suspend(); + void terminate() throws DBGException; - void terminate(); - - void dispose(); + void dispose() throws DBGException; } diff --git a/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/core/DatabaseLaunchDelegate.java b/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/core/DatabaseLaunchDelegate.java index 759f5e99cb7a5da165f3f0ad9115d8c3e7aab4f7..e72d5e14be4c1e0b9d56292c69b6ded03ad35fbf 100644 --- a/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/core/DatabaseLaunchDelegate.java +++ b/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/core/DatabaseLaunchDelegate.java @@ -22,19 +22,17 @@ import java.util.Map; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.core.runtime.IStatus; import org.eclipse.debug.core.ILaunch; import org.eclipse.debug.core.ILaunchConfiguration; import org.eclipse.debug.core.model.LaunchConfigurationDelegate; import org.eclipse.osgi.util.NLS; import org.jkiss.dbeaver.debug.DBGController; +import org.jkiss.dbeaver.debug.DBGException; import org.jkiss.dbeaver.debug.core.model.DatabaseDebugTarget; import org.jkiss.dbeaver.debug.core.model.DatabaseProcess; import org.jkiss.dbeaver.model.runtime.DefaultProgressMonitor; import org.jkiss.dbeaver.registry.DataSourceDescriptor; import org.jkiss.dbeaver.registry.DataSourceRegistry; -import org.jkiss.dbeaver.runtime.DBRResult; -import org.jkiss.dbeaver.runtime.core.RuntimeCore; public abstract class DatabaseLaunchDelegate extends LaunchConfigurationDelegate { @@ -54,10 +52,11 @@ public abstract class DatabaseLaunchDelegate extends La DatabaseDebugTarget target = createDebugTarget(launch, controller, process); launch.addDebugTarget(target); DefaultProgressMonitor progress = new DefaultProgressMonitor(monitor); - DBRResult connectResult = controller.connect(progress); - IStatus status = RuntimeCore.toStatus(connectResult); - if (!status.isOK()) { - throw new CoreException(status); + try { + controller.connect(progress); + } catch (DBGException e) { + String message = NLS.bind("Unable to connect to {0}", datasourceDescriptor.getName()); + throw new CoreException(DebugCore.newErrorStatus(message)); } } diff --git a/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/core/DebugCore.java b/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/core/DebugCore.java index 5835e6c6f9e1511560210df34d742ca53727eb48..b503ede3248251fdc57bebc1e3fe248a49cf4a87 100644 --- a/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/core/DebugCore.java +++ b/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/core/DebugCore.java @@ -63,6 +63,10 @@ public class DebugCore { private static Log log = Log.getLog(DebugCore.class); + public static void log(IStatus status) { + Log.log(log, status); + } + public static CoreException abort(String message, Throwable th) { return new CoreException(newErrorStatus(message, th)); } @@ -124,40 +128,6 @@ public class DebugCore { } } - // FIXME: AF: move to org.jkiss.dbeaver.Log - public static void log(Log delegate, IStatus status) { - if (delegate == null) { - // no way to log - return; - } - if (status == null) { - // nothing to log - return; - } - int severity = status.getSeverity(); - String message = status.getMessage(); - Throwable exception = status.getException(); - switch (severity) { - case IStatus.CANCEL: - delegate.debug(message, exception); - break; - case IStatus.ERROR: - delegate.error(message, exception); - break; - case IStatus.WARNING: - delegate.warn(message, exception); - break; - case IStatus.INFO: - delegate.info(message, exception); - break; - case IStatus.OK: - delegate.trace(message, exception); - break; - default: - break; - } - } - public static Status newErrorStatus(String message, Throwable th) { return new Status(IStatus.ERROR, BUNDLE_SYMBOLIC_NAME, message, th); } diff --git a/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/core/model/DatabaseDebugTarget.java b/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/core/model/DatabaseDebugTarget.java index be292a6beaec2f829da331c54702870ac86d23f2..e1e55ab30ad5685be1909bfd54076e12d9cb1129 100644 --- a/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/core/model/DatabaseDebugTarget.java +++ b/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/core/model/DatabaseDebugTarget.java @@ -19,6 +19,7 @@ package org.jkiss.dbeaver.debug.core.model; import org.eclipse.core.resources.IMarkerDelta; import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IStatus; import org.eclipse.debug.core.DebugEvent; import org.eclipse.debug.core.DebugException; import org.eclipse.debug.core.ILaunch; @@ -28,7 +29,10 @@ import org.eclipse.debug.core.model.IDebugTarget; import org.eclipse.debug.core.model.IMemoryBlock; import org.eclipse.debug.core.model.IProcess; import org.eclipse.debug.core.model.IThread; +import org.eclipse.osgi.util.NLS; import org.jkiss.dbeaver.debug.DBGController; +import org.jkiss.dbeaver.debug.DBGException; +import org.jkiss.dbeaver.debug.core.DebugCore; public abstract class DatabaseDebugTarget extends DatabaseDebugElement implements IDatabaseDebugTarget { @@ -113,7 +117,11 @@ public abstract class DatabaseDebugTarget extends Datab for (int i = 0; i < events.length; i++) { DebugEvent event = events[i]; if (event.getKind() == DebugEvent.TERMINATE && event.getSource().equals(process)) { - terminated(); + try { + terminated(); + } catch (DebugException e) { + DebugCore.log(e.getStatus()); + } } } } @@ -133,11 +141,17 @@ public abstract class DatabaseDebugTarget extends Datab terminated(); } - public synchronized void terminated() { + public synchronized void terminated() throws DebugException { if (!terminated) { terminated = true; suspended = false; - controller.terminate(); + try { + controller.terminate(); + } catch (DBGException e) { + String message = NLS.bind("Error terminating {0}", getName()); + IStatus status = DebugCore.newErrorStatus(message, e); + throw new DebugException(status); + } } } @@ -159,7 +173,13 @@ public abstract class DatabaseDebugTarget extends Datab @Override public void resume() throws DebugException { suspended = false; - controller.resume(); + try { + controller.resume(); + } catch (DBGException e) { + String message = NLS.bind("Error resuming {0}", getName()); + IStatus status = DebugCore.newErrorStatus(message, e); + throw new DebugException(status); + } if (thread.isSuspended()) { thread.resumedByTarget(); } @@ -168,7 +188,13 @@ public abstract class DatabaseDebugTarget extends Datab @Override public void suspend() throws DebugException { - controller.suspend(); + try { + controller.suspend(); + } catch (DBGException e) { + String message = NLS.bind("Error suspending {0}", getName()); + IStatus status = DebugCore.newErrorStatus(message, e); + throw new DebugException(status); + } } public void suspended(int detail) { diff --git a/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/internal/core/ProcedureDebugControllerRegistry.java b/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/internal/core/ProcedureDebugControllerRegistry.java index e9767834a041d84905fc9ec1d31939390616f24a..8ffc4b63aeadb081664bd2556af6b41c991e7f8d 100644 --- a/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/internal/core/ProcedureDebugControllerRegistry.java +++ b/plugins/org.jkiss.dbeaver.debug.core/src/org/jkiss/dbeaver/debug/internal/core/ProcedureDebugControllerRegistry.java @@ -36,7 +36,7 @@ public class ProcedureDebugControllerRegistry implements DBGControllerRegistry { @@ -67,9 +70,7 @@ public class PostgreDebugSession implements DBGSession breakpoints = new ArrayList(1); - private PostgreDebugSessionWorker worker; - - private FutureTask task; + private FutureTask task; private Thread workerThread = null; @@ -128,7 +129,6 @@ public class PostgreDebugSession implements DBGSession(worker); + task = new FutureTask(worker); workerThread = new Thread(task); diff --git a/plugins/org.jkiss.dbeaver.ext.postgresql.debug.core/src/org/jkiss/dbeaver/ext/postgresql/debug/internal/impl/PostgreDebugSessionWorker.java b/plugins/org.jkiss.dbeaver.ext.postgresql.debug.core/src/org/jkiss/dbeaver/ext/postgresql/debug/internal/impl/PostgreDebugSessionWorker.java index 2f35189f4b5e43993d7feabe2d805a7e6ebe1065..b4535a5ffd7826b157587e9cc1718d4b6fa92f8a 100644 --- a/plugins/org.jkiss.dbeaver.ext.postgresql.debug.core/src/org/jkiss/dbeaver/ext/postgresql/debug/internal/impl/PostgreDebugSessionWorker.java +++ b/plugins/org.jkiss.dbeaver.ext.postgresql.debug.core/src/org/jkiss/dbeaver/ext/postgresql/debug/internal/impl/PostgreDebugSessionWorker.java @@ -23,35 +23,27 @@ import java.sql.SQLException; import java.sql.Statement; import java.util.concurrent.Callable; -import org.jkiss.dbeaver.runtime.DBRResult; -import org.jkiss.dbeaver.runtime.DefaultResult; - -public class PostgreDebugSessionWorker implements Callable { +public class PostgreDebugSessionWorker implements Callable { private final Connection conn; - private String sql = ""; + private final String sql; - public void execSQL(String sqlCommand) - { - this.sql = sqlCommand; - } - - public PostgreDebugSessionWorker(Connection conn) + public PostgreDebugSessionWorker(Connection conn, String sqlCommand) { this.conn = conn; + this.sql = sqlCommand; } @Override - public DBRResult call() throws Exception + public Void call() throws Exception { try (Statement stmt = conn.createStatement()) { stmt.executeQuery(sql); - return DefaultResult.ok(); - + return null; } catch (SQLException e) { String message = String.format("Failed to execute %s", sql); - return DefaultResult.error(message, e); + throw new Exception(message, e); } } diff --git a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/Log.java b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/Log.java index 500cea4c47ad6c8e6d12e6d7d7e36968cd7c7aaa..6076c491a06f5e90072a3c113c9bfa7e6f19f17f 100644 --- a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/Log.java +++ b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/Log.java @@ -1,233 +1,256 @@ -/* - * DBeaver - Universal Database Manager - * Copyright (C) 2010-2017 Serge Rider (serge@jkiss.org) - * - * 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 org.jkiss.dbeaver; - -import org.eclipse.core.runtime.ILog; -import org.eclipse.core.runtime.Status; -import org.jkiss.dbeaver.bundle.ModelActivator; -import org.jkiss.dbeaver.utils.GeneralUtils; -import org.jkiss.utils.ArrayUtils; - -import java.io.PrintStream; -import java.text.SimpleDateFormat; -import java.util.Date; - -/** - * Log - */ -public class Log -{ - private static String corePluginID = ModelPreferences.PLUGIN_ID; - - private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); - private static final ILog eclipseLog = ModelActivator.getInstance().getLog(); - private static Listener[] listeners = new Listener[0]; - - private final String name; - - public static ILog getEclipseLog() { - return eclipseLog; - } - - public static Log getLog(Class forClass) { - return new Log(forClass.getName()); - } - - private Log(String name) - { - this.name = name; - } - - public String getName() - { - return name; - } - - public boolean isDebugEnabled() - { - return true; - } - - public boolean isErrorEnabled() - { - return true; - } - - public boolean isFatalEnabled() - { - return true; - } - - public boolean isInfoEnabled() - { - return true; - } - - public boolean isTraceEnabled() - { - return false; - } - - public boolean isWarnEnabled() - { - return true; - } - - public void trace(Object message) - { - } - - public void trace(Object message, Throwable t) - { - } - - public void debug(Object message) - { - if (message instanceof Throwable) { - debug(message.toString(), (Throwable)message); - } else { - debug(message, null); - } - } - - public void debug(Object message, Throwable t) - { - ModelActivator activator = ModelActivator.getInstance(); - debugMessage(message, t, System.err); -// if (activator != null) { -// debugMessage(message, t, activator.getDebugWriter()); -// } - } - - private static void debugMessage(Object message, Throwable t, PrintStream debugWriter) { - synchronized (Log.class) { - debugWriter.print(sdf.format(new Date()) + " - "); - debugWriter.println(message); - if (t != null) { - t.printStackTrace(debugWriter); - } - debugWriter.flush(); - for (Listener listener : listeners) { - listener.loggedMessage(message, t); - } - } - } - - public void info(Object message) - { - if (message instanceof Throwable) { - info(message.toString(), (Throwable) message); - return; - } - debugMessage(message, null, System.err); - eclipseLog.log(new Status( - Status.INFO, - corePluginID, - message == null ? null : message.toString())); - } - - public void info(Object message, Throwable t) - { - writeExceptionStatus(Status.INFO, message, t); - } - - public void warn(Object message) - { - if (message instanceof Throwable) { - warn(message.toString(), (Throwable)message); - return; - } - debugMessage(message, null, System.err); - ModelActivator.getInstance().getLog().log(new Status( - Status.WARNING, - corePluginID, - message == null ? null : message.toString())); - } - - public void warn(Object message, Throwable t) - { - writeExceptionStatus(Status.WARNING, message, t); - } - - public void error(Object message) - { - if (message instanceof Throwable) { - error(null, (Throwable)message); - return; - } - debugMessage(message, null, System.err); - ModelActivator.getInstance().getLog().log(new Status( - Status.ERROR, - corePluginID, - message == null ? null : message.toString())); - } - - public void error(Object message, Throwable t) - { - writeExceptionStatus(Status.ERROR, message, t); - } - - public void fatal(Object message) - { - error(message); - } - - public void fatal(Object message, Throwable t) - { - error(message, t); - } - - private static void writeExceptionStatus(int severity, Object message, Throwable t) - { - debugMessage(message, t, System.err); - ModelActivator activator = ModelActivator.getInstance(); - if (activator != null) { - // Activator may be null in some unclear circumstances (like shutdown is in progress) - ILog log = activator.getLog(); - if (log != null) { - if (t == null) { - log.log(new Status( - severity, - corePluginID, - message == null ? null : message.toString())); - } else { - if (message == null) { - log.log(GeneralUtils.makeExceptionStatus(severity, t)); - } else { - log.log(GeneralUtils.makeExceptionStatus(severity, message.toString(), t)); - } - } - } - } - } - - public static void addListener(Listener listener) { - synchronized (Log.class) { - listeners = ArrayUtils.add(Listener.class, listeners, listener); - } - } - - public static void removeListener(Listener listener) { - synchronized (Log.class) { - listeners = ArrayUtils.remove(Listener.class, listeners, listener); - } - } - - public static interface Listener { - void loggedMessage(Object message, Throwable t); - } -} +/* + * DBeaver - Universal Database Manager + * Copyright (C) 2010-2017 Serge Rider (serge@jkiss.org) + * + * 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 org.jkiss.dbeaver; + +import org.eclipse.core.runtime.ILog; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Status; +import org.jkiss.dbeaver.bundle.ModelActivator; +import org.jkiss.dbeaver.utils.GeneralUtils; +import org.jkiss.utils.ArrayUtils; + +import java.io.PrintStream; +import java.text.SimpleDateFormat; +import java.util.Date; + +/** + * Log + */ +public class Log +{ + private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); //$NON-NLS-1$ + + private static final ILog eclipseLog = ModelActivator.getInstance().getLog(); + private static Listener[] listeners = new Listener[0]; + + private final String name; + + public static ILog getEclipseLog() { + return eclipseLog; + } + + public static Log getLog(Class forClass) { + return new Log(forClass.getName()); + } + + public static void log(Log delegate, IStatus status) { + if (status == null) { + // nothing to log + return; + } + if (delegate == null) { + getEclipseLog().log(status); + // no way to log + return; + } + int severity = status.getSeverity(); + String message = status.getMessage(); + Throwable exception = status.getException(); + switch (severity) { + case IStatus.CANCEL: + delegate.debug(message, exception); + break; + case IStatus.ERROR: + delegate.error(message, exception); + break; + case IStatus.WARNING: + delegate.warn(message, exception); + break; + case IStatus.INFO: + delegate.info(message, exception); + break; + case IStatus.OK: + delegate.trace(message, exception); + break; + default: + break; + } + } + + private Log(String name) + { + this.name = name; + } + + public String getName() + { + return name; + } + + public boolean isDebugEnabled() + { + return true; + } + + public boolean isErrorEnabled() + { + return true; + } + + public boolean isFatalEnabled() + { + return true; + } + + public boolean isInfoEnabled() + { + return true; + } + + public boolean isTraceEnabled() + { + return false; + } + + public boolean isWarnEnabled() + { + return true; + } + + public void trace(Object message) + { + } + + public void trace(Object message, Throwable t) + { + } + + public void debug(Object message) + { + if (message instanceof Throwable) { + debug(message.toString(), (Throwable)message); + } else { + debug(message, null); + } + } + + public void debug(Object message, Throwable t) + { + debugMessage(message, t, System.err); + } + + private static void debugMessage(Object message, Throwable t, PrintStream debugWriter) { + synchronized (Log.class) { + debugWriter.print(sdf.format(new Date()) + " - "); //$NON-NLS-1$ + debugWriter.println(message); + if (t != null) { + t.printStackTrace(debugWriter); + } + debugWriter.flush(); + for (Listener listener : listeners) { + listener.loggedMessage(message, t); + } + } + } + + public void info(Object message) + { + if (message instanceof Throwable) { + info(message.toString(), (Throwable) message); + return; + } + debugMessage(message, null, System.err); + int severity = Status.INFO; + getEclipseLog().log(createStatus(severity, message)); + } + + public void info(Object message, Throwable t) + { + writeExceptionStatus(Status.INFO, message, t); + } + + public void warn(Object message) + { + if (message instanceof Throwable) { + warn(message.toString(), (Throwable)message); + return; + } + debugMessage(message, null, System.err); + int severity = Status.WARNING; + getEclipseLog().log(createStatus(severity, message)); + } + + public void warn(Object message, Throwable t) + { + writeExceptionStatus(Status.WARNING, message, t); + } + + public void error(Object message) + { + if (message instanceof Throwable) { + error(null, (Throwable)message); + return; + } + debugMessage(message, null, System.err); + int severity = Status.ERROR; + getEclipseLog().log(createStatus(severity, message)); + } + + public void error(Object message, Throwable t) + { + writeExceptionStatus(Status.ERROR, message, t); + } + + public void fatal(Object message) + { + error(message); + } + + public void fatal(Object message, Throwable t) + { + error(message, t); + } + + private static void writeExceptionStatus(int severity, Object message, Throwable t) + { + debugMessage(message, t, System.err); + ILog log = getEclipseLog(); + if (t == null) { + log.log(createStatus(severity, message)); + } else { + if (message == null) { + log.log(GeneralUtils.makeExceptionStatus(severity, t)); + } else { + log.log(GeneralUtils.makeExceptionStatus(severity, message.toString(), t)); + } + } + } + + private static Status createStatus(int severity, Object message) { + //we never include Exception to the status for some reason + return new Status( + severity, + ModelPreferences.PLUGIN_ID, + message == null ? null : message.toString()); + } + + public static void addListener(Listener listener) { + synchronized (Log.class) { + listeners = ArrayUtils.add(Listener.class, listeners, listener); + } + } + + public static void removeListener(Listener listener) { + synchronized (Log.class) { + listeners = ArrayUtils.remove(Listener.class, listeners, listener); + } + } + + public static interface Listener { + void loggedMessage(Object message, Throwable t); + } +}