diff options
4 files changed, 101 insertions, 4 deletions
diff --git a/plugins/org.eclipse.emf.cdo.releng.setup/src/org/eclipse/emf/cdo/releng/internal/setup/SetupTaskPerformer.java b/plugins/org.eclipse.emf.cdo.releng.setup/src/org/eclipse/emf/cdo/releng/internal/setup/SetupTaskPerformer.java index c4ff4eac78..2294a185e5 100644 --- a/plugins/org.eclipse.emf.cdo.releng.setup/src/org/eclipse/emf/cdo/releng/internal/setup/SetupTaskPerformer.java +++ b/plugins/org.eclipse.emf.cdo.releng.setup/src/org/eclipse/emf/cdo/releng/internal/setup/SetupTaskPerformer.java @@ -36,6 +36,7 @@ import org.eclipse.emf.edit.provider.IItemLabelProvider; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.IPath; +import org.eclipse.core.runtime.IStatus; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.PlatformUI; @@ -58,7 +59,7 @@ public class SetupTaskPerformer extends HashMap<Object, Object> implements Setup { private static final String RELENG_URL = System.getProperty("releng.url", "http://download.eclipse.org/modeling/emf/cdo/updates/integration").replace('\\', '/'); - + private static boolean NEEDS_PATH_SEPARATOR_CONVERSION = File.pathSeparatorChar == '\\'; private static final ComposedAdapterFactory ADAPTER_FACTORY = new ComposedAdapterFactory( @@ -133,6 +134,11 @@ public class SetupTaskPerformer extends HashMap<Object, Object> implements Setup } } + public void log(IStatus status) + { + log(ProgressLogDialog.toString(status)); + } + public boolean isCancelled() { if (progress != null) diff --git a/plugins/org.eclipse.emf.cdo.releng.setup/src/org/eclipse/emf/cdo/releng/internal/setup/ui/ProgressLogDialog.java b/plugins/org.eclipse.emf.cdo.releng.setup/src/org/eclipse/emf/cdo/releng/internal/setup/ui/ProgressLogDialog.java index 9195b96369..d6c9487ca2 100644 --- a/plugins/org.eclipse.emf.cdo.releng.setup/src/org/eclipse/emf/cdo/releng/internal/setup/ui/ProgressLogDialog.java +++ b/plugins/org.eclipse.emf.cdo.releng.setup/src/org/eclipse/emf/cdo/releng/internal/setup/ui/ProgressLogDialog.java @@ -18,6 +18,7 @@ import org.eclipse.emf.cdo.releng.setup.util.log.ProgressLogRunnable; import org.eclipse.net4j.util.io.IOUtil; +import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.OperationCanceledException; @@ -41,10 +42,12 @@ import org.eclipse.swt.widgets.Text; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.internal.progress.ProgressManager; +import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.PrintStream; +import java.io.UnsupportedEncodingException; import java.text.SimpleDateFormat; import java.util.Date; @@ -244,6 +247,11 @@ public class ProgressLogDialog extends TitleAreaDialog implements ProgressLog }); } + public void log(IStatus status) + { + log(toString(status)); + } + public void setFinished() { Job.getJobManager().setProgressProvider(ProgressManager.getInstance()); @@ -363,4 +371,74 @@ public class ProgressLogDialog extends TitleAreaDialog implements ProgressLog Activator.log(ex); } } + + public static String toString(IStatus status) + { + ByteArrayOutputStream out = new ByteArrayOutputStream(); + PrintStream printStream; + try + { + printStream = new PrintStream(out, false, "UTF-8"); + deeplyPrint(status, printStream, 0); + printStream.close(); + return new String(out.toByteArray(), "UTF-8"); + } + catch (UnsupportedEncodingException ex) + { + return status.getMessage(); + } + } + + private static void deeplyPrint(IStatus status, PrintStream strm, int level) + { + appendLevelPrefix(strm, level); + String msg = status.getMessage(); + strm.println(msg); + Throwable cause = status.getException(); + if (cause != null) + { + strm.print("Caused by: "); + if (!(msg.equals(cause.getMessage()) || msg.equals(cause.toString()))) + { + deeplyPrint(cause, strm, level); + } + } + + if (status.isMultiStatus()) + { + IStatus[] children = status.getChildren(); + for (int i = 0; i < children.length; i++) + { + deeplyPrint(children[i], strm, level + 1); + } + } + } + + private static void deeplyPrint(Throwable t, PrintStream strm, int level) + { + if (t instanceof CoreException) + { + deeplyPrint(t, strm, level); + } + else + { + appendLevelPrefix(strm, level); + strm.println(t.toString()); + Throwable cause = t.getCause(); + if (cause != null) + { + strm.print("Caused by: "); //$NON-NLS-1$ + deeplyPrint(cause, strm, level); + } + } + } + + private static void appendLevelPrefix(PrintStream strm, int level) + { + for (int idx = 0; idx < level; ++idx) + { + strm.print(' '); + } + } + } diff --git a/plugins/org.eclipse.emf.cdo.releng.setup/src/org/eclipse/emf/cdo/releng/setup/impl/P2TaskImpl.java b/plugins/org.eclipse.emf.cdo.releng.setup/src/org/eclipse/emf/cdo/releng/setup/impl/P2TaskImpl.java index f02f8be70d..8ec6a1e0fe 100644 --- a/plugins/org.eclipse.emf.cdo.releng.setup/src/org/eclipse/emf/cdo/releng/setup/impl/P2TaskImpl.java +++ b/plugins/org.eclipse.emf.cdo.releng.setup/src/org/eclipse/emf/cdo/releng/setup/impl/P2TaskImpl.java @@ -29,9 +29,11 @@ import org.eclipse.emf.ecore.InternalEObject; import org.eclipse.emf.ecore.util.EObjectContainmentWithInverseEList; import org.eclipse.emf.ecore.util.InternalEList; +import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.OperationCanceledException; import org.eclipse.core.runtime.Platform; +import org.eclipse.core.runtime.Status; import org.eclipse.equinox.internal.p2.director.app.DirectorApplication; import org.eclipse.equinox.internal.p2.director.app.ILog; import org.eclipse.equinox.internal.p2.ui.ProvUI; @@ -416,7 +418,8 @@ public class P2TaskImpl extends SetupTaskImpl implements P2Task } else { - context.log(status.toString()); + context.log(status); + throw new CoreException(Status.CANCEL_STATUS); } } } @@ -492,7 +495,7 @@ public class P2TaskImpl extends SetupTaskImpl implements P2Task public void log(IStatus status) { - log(status.getMessage()); + context.log(status); } public void close() @@ -500,9 +503,15 @@ public class P2TaskImpl extends SetupTaskImpl implements P2Task } }); - app.run(args); + Object exitCode = app.run(args); + if (EXIT_ERROR.equals(exitCode)) + { + throw new CoreException(Status.CANCEL_STATUS); + } } + private static final Integer EXIT_ERROR = 13; + private String makeList(SetupTaskContext context, EList<? extends EObject> objects, EAttribute attribute) { StringBuilder builder = new StringBuilder(); diff --git a/plugins/org.eclipse.emf.cdo.releng.setup/src/org/eclipse/emf/cdo/releng/setup/util/log/ProgressLog.java b/plugins/org.eclipse.emf.cdo.releng.setup/src/org/eclipse/emf/cdo/releng/setup/util/log/ProgressLog.java index 3123c0f59f..78432050dd 100644 --- a/plugins/org.eclipse.emf.cdo.releng.setup/src/org/eclipse/emf/cdo/releng/setup/util/log/ProgressLog.java +++ b/plugins/org.eclipse.emf.cdo.releng.setup/src/org/eclipse/emf/cdo/releng/setup/util/log/ProgressLog.java @@ -10,6 +10,8 @@ */ package org.eclipse.emf.cdo.releng.setup.util.log; +import org.eclipse.core.runtime.IStatus; + import java.util.concurrent.atomic.AtomicReference; /** @@ -22,4 +24,6 @@ public interface ProgressLog public boolean isCancelled(); public void log(String line); + + public void log(IStatus status); } |