Try to make logging safer against re-entrance
diff --git a/plugins/org.eclipse.objectteams.otequinox/src/org/eclipse/objectteams/internal/osgi/weaving/OTWeavingHook.java b/plugins/org.eclipse.objectteams.otequinox/src/org/eclipse/objectteams/internal/osgi/weaving/OTWeavingHook.java
index e4ef270..2865310 100644
--- a/plugins/org.eclipse.objectteams.otequinox/src/org/eclipse/objectteams/internal/osgi/weaving/OTWeavingHook.java
+++ b/plugins/org.eclipse.objectteams.otequinox/src/org/eclipse/objectteams/internal/osgi/weaving/OTWeavingHook.java
@@ -257,6 +257,8 @@
beingDefined.remove(wovenClass.getClassName());
@SuppressWarnings("null") @NonNull String className = wovenClass.getClassName();
instantiateScheduledTeams(className);
+
+ TransformerPlugin.flushLog();
}
}
diff --git a/plugins/org.eclipse.objectteams.otequinox/src/org/eclipse/objectteams/otequinox/TransformerPlugin.java b/plugins/org.eclipse.objectteams.otequinox/src/org/eclipse/objectteams/otequinox/TransformerPlugin.java
index b091441..dca4806 100644
--- a/plugins/org.eclipse.objectteams.otequinox/src/org/eclipse/objectteams/otequinox/TransformerPlugin.java
+++ b/plugins/org.eclipse.objectteams.otequinox/src/org/eclipse/objectteams/otequinox/TransformerPlugin.java
@@ -49,6 +49,7 @@
}
private static ILog log;
+ private static List<IStatus> pendingLogEntries = new ArrayList<>();
private static TransformerPlugin plugin;
private AspectBindingRegistry aspectBindingRegistry;
@@ -139,14 +140,11 @@
}
}
- public static void log (Throwable ex, String msg) {
+ public static synchronized void log (Throwable ex, String msg) {
msg = "OT/Equinox: "+msg;
System.err.println(msg);
ex.printStackTrace();
- if (log != null)
- log.log(new Status(IStatus.ERROR, TRANSFORMER_PLUGIN_ID, msg, ex));
- else
- System.err.println(msg);
+ pendingLogEntries.add(new Status(IStatus.ERROR, TRANSFORMER_PLUGIN_ID, msg, ex));
}
public static void log(int status, String msg) {
@@ -154,20 +152,30 @@
doLog(status, msg);
}
- public static void doLog(int status, String msg) {
+ public static synchronized void doLog(int status, String msg) {
msg = "OT/Equinox: "+msg;
// this seems to cause java.lang.NoClassDefFoundError: org/eclipse/ui/statushandlers/StatusAdapter etc.
// if (log == null) acquireLog(context);
- if (log != null) {
- log.log(new Status(status, TRANSFORMER_PLUGIN_ID, msg));
- } else {
- if ((status & IStatus.ERROR) != 0)
- System.err.println(msg);
- else
- System.out.println(msg);
- }
+ pendingLogEntries.add(new Status(status, TRANSFORMER_PLUGIN_ID, msg));
}
+ public static void flushLog() {
+ List<IStatus> copy;
+ synchronized(TransformerPlugin.class) {
+ copy = pendingLogEntries;
+ pendingLogEntries = new ArrayList<>();
+ }
+ for (IStatus status : copy) {
+ if (log != null) {
+ log.log(status);
+ } else {
+ if (status.getCode() == IStatus.ERROR)
+ System.err.println(status.getMessage());
+ else
+ System.out.println(status.getMessage());
+ }
+ }
+ }
public static TransformerPlugin getDefault() {