/***************************************************************************** * 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.feature; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.net.URI; import java.util.Map; import org.eclipse.buckminster.core.cspec.builder.CSpecBuilder; import org.eclipse.buckminster.core.ctype.IComponentType; import org.eclipse.buckminster.core.ctype.IResolutionBuilder; import org.eclipse.buckminster.core.ctype.MissingCSpecSourceException; import org.eclipse.buckminster.core.helpers.PropertiesParser; import org.eclipse.buckminster.core.reader.ICatalogReader; import org.eclipse.buckminster.core.reader.URLFileReader; import org.eclipse.buckminster.core.reader.ZipArchiveReader; import org.eclipse.buckminster.pde.IPDEConstants; import org.eclipse.buckminster.pde.Messages; import org.eclipse.buckminster.pde.PDEPlugin; import org.eclipse.buckminster.pde.cspecgen.CSpecGenerator; import org.eclipse.buckminster.pde.cspecgen.PDEBuilder; import org.eclipse.buckminster.pde.internal.EclipsePlatformReader; import org.eclipse.buckminster.pde.internal.FeatureModelReader; import org.eclipse.buckminster.runtime.BuckminsterException; import org.eclipse.buckminster.runtime.MonitorUtils; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.Path; import org.eclipse.osgi.util.NLS; import org.eclipse.pde.internal.core.ifeature.IFeature; import org.eclipse.pde.internal.core.ifeature.IFeatureModel; /** * A CSpec builder that creates a cspec from a Eclipse plugin.xml file. * * @author Thomas Hallgren */ @SuppressWarnings("restriction") public class FeatureBuilder extends PDEBuilder { @Override public int compareTo(IResolutionBuilder other) { return 1; } @Override public String getComponentTypeID() { return IComponentType.ECLIPSE_FEATURE; } @Override protected void parseFile(CSpecBuilder cspecBuilder, boolean forResolutionAidOnly, ICatalogReader reader, IProgressMonitor monitor) throws CoreException { monitor.beginTask(null, 100); IFeature feature; try { IFeatureModel model; if (reader instanceof EclipsePlatformReader) { model = ((EclipsePlatformReader) reader).getFeatureModel(); MonitorUtils.worked(monitor, 40); } else { try { model = reader.readFile("feature.xml", new FeatureModelReader(), MonitorUtils.subMonitor(monitor, //$NON-NLS-1$ 40)); } catch (FileNotFoundException e) { model = null; } } if (model == null) throw new MissingCSpecSourceException(reader.getProviderMatch()); setModel(model); feature = model.getFeature(); } catch (IOException e) { throw BuckminsterException.wrap(e); } String featureId = feature.getId(); if (featureId == null || featureId.length() == 0) { PDEPlugin.getLogger().warning( NLS.bind(Messages.No_feature_id_found_in_0, new File(reader.getLocation(), IPDEConstants.FEATURE_MANIFEST).getAbsolutePath())); feature.setId("<undefined feature id>"); //$NON-NLS-1$ } CSpecGenerator generator; if (reader instanceof EclipsePlatformReader) { // Binary features found in the target platform are handled here. // String location = ((EclipsePlatformReader) reader).getFeatureModel().getInstallLocation(); generator = new CSpecFromBinary(cspecBuilder, reader, feature, new Path(location)); } else if (reader instanceof ZipArchiveReader && ((ZipArchiveReader) reader).getFileReader() instanceof URLFileReader) { // Binary features found elsewhere are handled here. // URI uri = ((URLFileReader) ((ZipArchiveReader) reader).getFileReader()).getURI(); generator = new CSpecFromBinary(cspecBuilder, reader, feature, new Path(uri.getPath())); } else { Map<String, String> buildProperties = null; if (!forResolutionAidOnly) { try { buildProperties = reader.readFile("build.properties", new PropertiesParser(), MonitorUtils.subMonitor( //$NON-NLS-1$ monitor, 40)); } catch (FileNotFoundException e) { } catch (IOException e) { throw BuckminsterException.wrap(e); } } generator = new CSpecFromSource(cspecBuilder, reader, feature, buildProperties); } generator.generate(MonitorUtils.subMonitor(monitor, 20)); monitor.done(); } }