/***************************************************************************** * 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.pde.cspecgen; import org.eclipse.buckminster.core.cspec.AbstractResolutionBuilder; import org.eclipse.buckminster.core.cspec.builder.CSpecBuilder; import org.eclipse.buckminster.core.metadata.model.BOMNode; import org.eclipse.buckminster.core.metadata.model.Resolution; import org.eclipse.buckminster.core.metadata.model.ResolvedNode; import org.eclipse.buckminster.core.reader.ICatalogReader; import org.eclipse.buckminster.core.reader.IComponentReader; import org.eclipse.buckminster.core.reader.IFileReader; import org.eclipse.buckminster.core.reader.LocalReader; import org.eclipse.buckminster.core.reader.ZipArchiveReader; import org.eclipse.buckminster.core.version.ProviderMatch; import org.eclipse.buckminster.pde.IPDEConstants; import org.eclipse.buckminster.pde.Messages; import org.eclipse.buckminster.pde.internal.EclipsePlatformReader; import org.eclipse.buckminster.runtime.MonitorUtils; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.pde.core.IModel; /** * This abstract builder contains all functionality that is common to the PDE * Cspec builders. Subclasses must implement * {@link #parseFile(IComponentReader reader)}. * * @author Thomas Hallgren */ public abstract class PDEBuilder extends AbstractResolutionBuilder implements IPDEConstants { /** * Name of the default generated target. */ public static final String DEFAULT_TARGET = "default"; //$NON-NLS-1$ /** * Name of the optional target. */ public static final String OPTIONAL_TARGET = "optional"; //$NON-NLS-1$ public static ResolvedNode createNode(ProviderMatch providerMatch, CSpecBuilder cspecBuilder) throws CoreException { return new ResolvedNode(providerMatch.getNodeQuery(), new Resolution(providerMatch.createResolution(cspecBuilder, false))); } private boolean usingInstalledReader; private IModel model; @Override public synchronized BOMNode build(IComponentReader[] readerHandle, boolean forResolutionAidOnly, IProgressMonitor monitor) throws CoreException { IComponentReader reader = readerHandle[0]; if (!(reader instanceof ICatalogReader)) reader = new ZipArchiveReader((IFileReader) reader); ICatalogReader catRdr = (ICatalogReader) reader; monitor.beginTask(null, forResolutionAidOnly ? 1200 : 1600); monitor.subTask(Messages.generating_cspec_from_PDE_artifacts); try { usingInstalledReader = reader instanceof EclipsePlatformReader; CSpecBuilder cspecBuilder = new CSpecBuilder(); parseFile(cspecBuilder, forResolutionAidOnly, catRdr, MonitorUtils.subMonitor(monitor, 1000)); if (!(reader instanceof LocalReader)) cspecBuilder.addSourceDependency(); applyExtensions(cspecBuilder, forResolutionAidOnly, reader, MonitorUtils.subMonitor(monitor, 200)); return createNode(reader, cspecBuilder); } finally { monitor.done(); } } public IModel getModel() { return model; } protected boolean isUsingInstalledReader() { return usingInstalledReader; } protected abstract void parseFile(CSpecBuilder cspecBuilder, boolean forResolutionAidOnly, ICatalogReader reader, IProgressMonitor monitor) throws CoreException; protected void setModel(IModel model) { this.model = model; } }