/******************************************************************************* * Copyright (c) 2006-2013, Cloudsmith Inc. * The code, documentation and other materials contained herein have been * licensed under the Eclipse Public License - v 1.0 by the copyright holder * listed above, as the Initial Contributor under such license. The text of * such license is available at www.eclipse.org. ******************************************************************************/ package org.eclipse.buckminster.ui.internal; import org.eclipse.buckminster.core.CorePlugin; import org.eclipse.buckminster.core.cspec.model.ComponentRequest; import org.eclipse.buckminster.core.materializer.MaterializationContext; import org.eclipse.buckminster.core.materializer.MaterializationJob; import org.eclipse.buckminster.core.metadata.model.BillOfMaterials; import org.eclipse.buckminster.core.mspec.builder.MaterializationSpecBuilder; import org.eclipse.buckminster.core.query.model.ComponentQuery; import org.eclipse.buckminster.core.resolver.IResolver; import org.eclipse.buckminster.core.resolver.MainResolver; import org.eclipse.buckminster.core.resolver.ResolutionContext; import org.eclipse.buckminster.runtime.BuckminsterException; import org.eclipse.buckminster.runtime.MonitorUtils; import org.eclipse.buckminster.ui.Messages; import org.eclipse.buckminster.ui.wizards.QueryWizard; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.OperationCanceledException; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.jobs.Job; import org.eclipse.swt.widgets.Display; import org.eclipse.ui.IWorkbenchPartSite; /** * @author Karel Brezina * */ public class ResolveJob extends Job { private final IResolver resolver; private final boolean materialize; private final IWorkbenchPartSite site; public ResolveJob(ComponentQuery query, boolean materialize, IWorkbenchPartSite site, boolean continueOnError) throws CoreException { super(Messages.resolving_qurey); this.resolver = new MainResolver(new ResolutionContext(query)); resolver.getContext().setContinueOnError(continueOnError); this.materialize = materialize; this.site = site; setUser(true); setPriority(BUILD); } @Override protected IStatus run(IProgressMonitor monitor) { ResolutionContext ctx = resolver.getContext(); ComponentQuery query = ctx.getComponentQuery(); try { IProgressMonitor resolutionMonitor; if (materialize) { monitor.beginTask(null, 1000); resolutionMonitor = MonitorUtils.subMonitor(monitor, 500); } else resolutionMonitor = monitor; Display display = site.getShell().getDisplay(); ComponentRequest rootRequest = query.getExpandedRootRequest(ctx); BillOfMaterials bom = null; IStatus status; try { bom = resolver.resolve(rootRequest, resolutionMonitor); status = ctx.getStatus(); } catch (OperationCanceledException e) { status = ctx.getStatus(); } catch (CoreException e) { status = e.getStatus(); } CorePlugin.logWarningsAndErrors(status); ctx.emitWarningAndErrorTags(); if (bom == null || (status.getSeverity() == IStatus.ERROR && !ctx.isContinueOnError())) return Status.OK_STATUS; if (!materialize) { final BillOfMaterials finalBom = bom; display.asyncExec(new Runnable() { @Override public void run() { QueryWizard.openWizard(site, resolver.getContext(), finalBom); } }); return Status.OK_STATUS; } try { if (bom.isFullyResolved(ctx) || ctx.isContinueOnError()) { setName(Messages.materializing); // Just create a default mspec that materializes to the // current // workspace // MaterializationSpecBuilder mspecBuilder = new MaterializationSpecBuilder(); mspecBuilder.setName(bom.getViewName()); bom.addMaterializationNodes(mspecBuilder); MaterializationContext matCtx = new MaterializationContext(bom, mspecBuilder.createMaterializationSpec(), ctx); MaterializationJob.runDelegated(matCtx, MonitorUtils.subMonitor(monitor, 500)); } return status; } finally { monitor.done(); } } catch (Exception e) { IStatus status = BuckminsterException.wrap(e).getStatus(); CorePlugin.logWarningsAndErrors(status); return status; } } }