From 61b27f3e226881ff58e6abf32543ed024403a489 Mon Sep 17 00:00:00 2001 From: Eike Stepper Date: Sun, 22 Jul 2012 05:58:47 +0200 Subject: Add feature validation --- .../version/digest/ui/CreateDigestAction.java | 29 ++--- .../cdo/releng/version/digest/DigestValidator.java | 62 +++++----- .../eclipse/emf/cdo/releng/version/Release.java | 55 ++++++++- .../emf/cdo/releng/version/VersionBuilder.java | 133 +++++++++++++++++---- .../emf/cdo/releng/version/VersionValidator.java | 4 +- 5 files changed, 214 insertions(+), 69 deletions(-) diff --git a/plugins/org.eclipse.emf.cdo.releng.version.digest.ui/src/org/eclipse/emf/cdo/releng/version/digest/ui/CreateDigestAction.java b/plugins/org.eclipse.emf.cdo.releng.version.digest.ui/src/org/eclipse/emf/cdo/releng/version/digest/ui/CreateDigestAction.java index 20b4aa9916..cb11376111 100644 --- a/plugins/org.eclipse.emf.cdo.releng.version.digest.ui/src/org/eclipse/emf/cdo/releng/version/digest/ui/CreateDigestAction.java +++ b/plugins/org.eclipse.emf.cdo.releng.version.digest.ui/src/org/eclipse/emf/cdo/releng/version/digest/ui/CreateDigestAction.java @@ -12,8 +12,8 @@ package org.eclipse.emf.cdo.releng.version.digest.ui; import org.eclipse.emf.cdo.releng.version.Release; import org.eclipse.emf.cdo.releng.version.Release.Element; -import org.eclipse.emf.cdo.releng.version.Release.Element.Type; import org.eclipse.emf.cdo.releng.version.ReleaseManager; +import org.eclipse.emf.cdo.releng.version.VersionBuilder; import org.eclipse.emf.cdo.releng.version.digest.DigestValidator; import org.eclipse.emf.cdo.releng.version.digest.DigestValidatorState; @@ -29,9 +29,7 @@ import org.eclipse.jface.action.IAction; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredSelection; -import org.eclipse.osgi.service.resolver.BundleDescription; -import org.eclipse.pde.core.plugin.IPluginModelBase; -import org.eclipse.pde.core.plugin.PluginRegistry; +import org.eclipse.pde.core.IModel; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.IObjectActionDelegate; import org.eclipse.ui.IWorkbenchPart; @@ -129,9 +127,9 @@ public class CreateDigestAction implements IObjectActionDelegate try { Map result = new HashMap(); - for (Entry entry : release.getElements().entrySet()) + for (Entry entry : release.getElements().entrySet()) { - String name = entry.getKey(); + String name = entry.getKey().getName(); monitor.subTask(name); try @@ -139,27 +137,26 @@ public class CreateDigestAction implements IObjectActionDelegate try { Element element = entry.getValue(); - if (element.getType() != Type.PLUGIN || element.getName().endsWith(".source")) + if (element.getName().endsWith(".source")) { continue; } - IPluginModelBase pluginModel = PluginRegistry.findModel(name); - if (pluginModel == null) + IModel componentModel = VersionBuilder.getComponentModel(element); + if (componentModel == null) { - warnings.add(name + ": Plugin not found"); + warnings.add(name + ": Component not found"); continue; } - IResource resource = pluginModel.getUnderlyingResource(); + IResource resource = componentModel.getUnderlyingResource(); if (resource == null) { - warnings.add(name + ": Plugin is not in workspace"); + warnings.add(name + ": Component is not in workspace"); continue; } - BundleDescription description = pluginModel.getBundleDescription(); - Version version = description.getVersion(); + Version version = VersionBuilder.getComponentVersion(componentModel); version = new Version(version.getMajor(), version.getMinor(), version.getMicro()); if (!element.getVersion().equals(version)) @@ -169,8 +166,8 @@ public class CreateDigestAction implements IObjectActionDelegate // TODO Determine validator class from .project DigestValidator validator = new DigestValidator.BuildModel(); - validator.beforeValidation(null, pluginModel); - DigestValidatorState state = validator.validateFull(resource.getProject(), null, pluginModel, + validator.beforeValidation(null, componentModel); + DigestValidatorState state = validator.validateFull(resource.getProject(), null, componentModel, new NullProgressMonitor()); validator.afterValidation(state); result.put(state.getName(), state.getDigest()); diff --git a/plugins/org.eclipse.emf.cdo.releng.version.digest/src/org/eclipse/emf/cdo/releng/version/digest/DigestValidator.java b/plugins/org.eclipse.emf.cdo.releng.version.digest/src/org/eclipse/emf/cdo/releng/version/digest/DigestValidator.java index 14fce0f4c9..a5331a54d3 100644 --- a/plugins/org.eclipse.emf.cdo.releng.version.digest/src/org/eclipse/emf/cdo/releng/version/digest/DigestValidator.java +++ b/plugins/org.eclipse.emf.cdo.releng.version.digest/src/org/eclipse/emf/cdo/releng/version/digest/DigestValidator.java @@ -25,11 +25,12 @@ import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.Path; +import org.eclipse.pde.core.IModel; import org.eclipse.pde.core.build.IBuild; import org.eclipse.pde.core.build.IBuildEntry; import org.eclipse.pde.core.build.IBuildModel; import org.eclipse.pde.core.plugin.IPluginModelBase; -import org.eclipse.pde.core.plugin.PluginRegistry; +import org.eclipse.pde.internal.core.ifeature.IFeatureModel; import java.io.FilterInputStream; import java.io.IOException; @@ -57,20 +58,20 @@ public class DigestValidator extends VersionValidator @Override public void updateBuildState(BuildState buildState, String releasePath, Release release, IProject project, - IResourceDelta delta, IPluginModelBase pluginModel, IProgressMonitor monitor) throws Exception + IResourceDelta delta, IModel componentModel, IProgressMonitor monitor) throws Exception { DigestValidatorState validatorState = (DigestValidatorState)buildState.getValidatorState(); - beforeValidation(validatorState, pluginModel); + beforeValidation(validatorState, componentModel); if (validatorState == null || delta == null) { VersionBuilder.trace("Digest: Full validation..."); buildState.setValidatorState(null); - validatorState = validateFull(project, null, pluginModel, monitor); + validatorState = validateFull(project, null, componentModel, monitor); } else { VersionBuilder.trace("Digest: Delta validation..."); - validatorState = validateDelta(delta, validatorState, pluginModel, monitor); + validatorState = validateDelta(delta, validatorState, componentModel, monitor); } afterValidation(validatorState); @@ -89,8 +90,8 @@ public class DigestValidator extends VersionValidator buildState.setValidatorState(validatorState); } - public DigestValidatorState validateFull(IResource resource, DigestValidatorState parentState, - IPluginModelBase pluginModel, IProgressMonitor monitor) throws Exception + public DigestValidatorState validateFull(IResource resource, DigestValidatorState parentState, IModel componentModel, + IProgressMonitor monitor) throws Exception { if (resource.getType() != IResource.PROJECT && !isConsidered(resource)) { @@ -108,7 +109,7 @@ public class DigestValidator extends VersionValidator List memberStates = new ArrayList(); for (IResource member : container.members()) { - DigestValidatorState memberState = validateFull(member, result, pluginModel, monitor); + DigestValidatorState memberState = validateFull(member, result, componentModel, monitor); if (memberState != null) { memberStates.add(memberState); @@ -132,7 +133,7 @@ public class DigestValidator extends VersionValidator } public DigestValidatorState validateDelta(IResourceDelta delta, DigestValidatorState validatorState, - IPluginModelBase pluginModel, IProgressMonitor monitor) throws Exception + IModel componentModel, IProgressMonitor monitor) throws Exception { IResource resource = delta.getResource(); if (!resource.exists() || resource.getType() != IResource.PROJECT && !isConsidered(resource)) @@ -156,7 +157,7 @@ public class DigestValidator extends VersionValidator { IResource memberResource = memberDelta.getResource(); DigestValidatorState memberState = validatorState.getChild(memberResource.getName()); - DigestValidatorState newMemberState = validateDelta(memberDelta, memberState, pluginModel, monitor); + DigestValidatorState newMemberState = validateDelta(memberDelta, memberState, componentModel, monitor); if (newMemberState != null) { newMemberState.setParent(result); @@ -204,7 +205,7 @@ public class DigestValidator extends VersionValidator return result; } - public void beforeValidation(DigestValidatorState validatorState, IPluginModelBase pluginModel) throws Exception + public void beforeValidation(DigestValidatorState validatorState, IModel componentModel) throws Exception { } @@ -389,12 +390,12 @@ public class DigestValidator extends VersionValidator } @Override - public void beforeValidation(DigestValidatorState validatorState, IPluginModelBase pluginModel) throws Exception + public void beforeValidation(DigestValidatorState validatorState, IModel componentModel) throws Exception { considered.clear(); considered.add(""); - IBuild build = getBuild(pluginModel); + IBuild build = getBuild(componentModel); IBuildEntry binIncludes = build.getEntry(IBuildEntry.BIN_INCLUDES); if (binIncludes != null) { @@ -440,36 +441,43 @@ public class DigestValidator extends VersionValidator } @SuppressWarnings("restriction") - private IBuild getBuild(IPluginModelBase pluginModel) throws CoreException + private IBuild getBuild(IModel componentModel) throws CoreException { - IBuildModel buildModel = PluginRegistry.createBuildModel(pluginModel); - if (buildModel == null) + IProject project = componentModel.getUnderlyingResource().getProject(); + IFile buildFile = org.eclipse.pde.internal.core.project.PDEProject.getBuildProperties(project); + + IBuildModel buildModel = null; + if (buildFile.exists()) { - IProject project = pluginModel.getUnderlyingResource().getProject(); - IFile buildFile = org.eclipse.pde.internal.core.project.PDEProject.getBuildProperties(project); - if (buildFile.exists()) - { - buildModel = new org.eclipse.pde.internal.core.build.WorkspaceBuildModel(buildFile); - buildModel.load(); - } + buildModel = new org.eclipse.pde.internal.core.build.WorkspaceBuildModel(buildFile); + buildModel.load(); } if (buildModel == null) { - throw new IllegalStateException("Could not determine build model for " - + pluginModel.getBundleDescription().getSymbolicName()); + throw new IllegalStateException("Could not determine build model for " + getName(componentModel)); } IBuild build = buildModel.getBuild(); if (build == null) { - throw new IllegalStateException("Could not determine build model for " - + pluginModel.getBundleDescription().getSymbolicName()); + throw new IllegalStateException("Could not determine build model for " + getName(componentModel)); } return build; } + private String getName(IModel componentModel) + { + if (componentModel instanceof IPluginModelBase) + { + IPluginModelBase pluginModel = (IPluginModelBase)componentModel; + return pluginModel.getBundleDescription().getSymbolicName(); + } + + return ((IFeatureModel)componentModel).getFeature().getId(); + } + private void consider(String path) { if (path.endsWith("/")) diff --git a/plugins/org.eclipse.emf.cdo.releng.version/src/org/eclipse/emf/cdo/releng/version/Release.java b/plugins/org.eclipse.emf.cdo.releng.version/src/org/eclipse/emf/cdo/releng/version/Release.java index c8d874f937..ed248ba42c 100644 --- a/plugins/org.eclipse.emf.cdo.releng.version/src/org/eclipse/emf/cdo/releng/version/Release.java +++ b/plugins/org.eclipse.emf.cdo.releng.version/src/org/eclipse/emf/cdo/releng/version/Release.java @@ -43,7 +43,7 @@ public class Release private String repository; - private Map elements = new HashMap(); + private Map elements = new HashMap(); Release(SAXParser parser, IFile file) throws CoreException, IOException, SAXException { @@ -93,7 +93,7 @@ public class Release return repository; } - public Map getElements() + public Map getElements() { return Collections.unmodifiableMap(elements); } @@ -136,6 +136,55 @@ public class Release return version; } + @Override + public int hashCode() + { + final int prime = 31; + int result = 1; + result = prime * result + (name == null ? 0 : name.hashCode()); + result = prime * result + (getType() == null ? 0 : getType().hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) + { + if (this == obj) + { + return true; + } + + if (obj == null) + { + return false; + } + + if (!(obj instanceof Element)) + { + return false; + } + + Element other = (Element)obj; + if (name == null) + { + if (other.name != null) + { + return false; + } + } + else if (!name.equals(other.name)) + { + return false; + } + + if (getType() != other.getType()) + { + return false; + } + + return true; + } + public Type getType() { return type; @@ -175,7 +224,7 @@ public class Release Type type = getType(attributes, "type"); Element element = new Element(name, version, type); - elements.put(name, element); + elements.put(element, element); } } diff --git a/plugins/org.eclipse.emf.cdo.releng.version/src/org/eclipse/emf/cdo/releng/version/VersionBuilder.java b/plugins/org.eclipse.emf.cdo.releng.version/src/org/eclipse/emf/cdo/releng/version/VersionBuilder.java index 1fd264505d..8a6ec394c2 100644 --- a/plugins/org.eclipse.emf.cdo.releng.version/src/org/eclipse/emf/cdo/releng/version/VersionBuilder.java +++ b/plugins/org.eclipse.emf.cdo.releng.version/src/org/eclipse/emf/cdo/releng/version/VersionBuilder.java @@ -27,8 +27,13 @@ import org.eclipse.osgi.service.resolver.BundleSpecification; import org.eclipse.osgi.service.resolver.ExportPackageDescription; import org.eclipse.osgi.service.resolver.ImportPackageSpecification; import org.eclipse.osgi.service.resolver.VersionRange; +import org.eclipse.pde.core.IModel; import org.eclipse.pde.core.plugin.IPluginModelBase; import org.eclipse.pde.core.plugin.PluginRegistry; +import org.eclipse.pde.internal.core.FeatureModelManager; +import org.eclipse.pde.internal.core.PDECore; +import org.eclipse.pde.internal.core.ifeature.IFeature; +import org.eclipse.pde.internal.core.ifeature.IFeatureModel; import org.osgi.framework.Version; @@ -54,12 +59,15 @@ public class VersionBuilder extends IncrementalProjectBuilder private static final Path MANIFEST_PATH = new Path("META-INF/MANIFEST.MF"); + private static final Path FEATURE_PATH = new Path("feature.xml"); + private Release release; public VersionBuilder() { } + @SuppressWarnings("restriction") @Override protected final IProject[] build(int kind, @SuppressWarnings("rawtypes") Map args, IProgressMonitor monitor) throws CoreException @@ -77,20 +85,19 @@ public class VersionBuilder extends IncrementalProjectBuilder { Markers.deleteAllMarkers(project); - IPluginModelBase pluginModel = PluginRegistry.findModel(getProject()); - if (pluginModel == null) - { - throw new IllegalStateException("Could not locate the plugin model base for project: " + getProject().getName()); - } + IModel componentModel = getComponentModel(project); - if (!"true".equals(args.get(DEPENDENCY_RANGES_ARGUMENT))) + if (componentModel instanceof IPluginModelBase) { - checkDependencyRanges(pluginModel); - } + if (!"true".equals(args.get(DEPENDENCY_RANGES_ARGUMENT))) + { + checkDependencyRanges((IPluginModelBase)componentModel); + } - if (!"true".equals(args.get(EXPORT_VERSIONS_ARGUMENT))) - { - checkPackageExports(pluginModel); + if (!"true".equals(args.get(EXPORT_VERSIONS_ARGUMENT))) + { + checkPackageExports((IPluginModelBase)componentModel); + } } /* @@ -158,8 +165,8 @@ public class VersionBuilder extends IncrementalProjectBuilder * Determine if a validation is needed or if the version has already been increased properly */ - Element element = getElement(pluginModel); - Element releaseElement = release.getElements().get(element.getName()); + Element element = getElement(componentModel); + Element releaseElement = release.getElements().get(element); if (releaseElement == null) { validator.abort(buildState, project, null, monitor); @@ -205,7 +212,7 @@ public class VersionBuilder extends IncrementalProjectBuilder delta = getDelta(project); } - validator.updateBuildState(buildState, releasePath, release, project, delta, pluginModel, monitor); + validator.updateBuildState(buildState, releasePath, release, project, delta, componentModel, monitor); try { @@ -244,12 +251,22 @@ public class VersionBuilder extends IncrementalProjectBuilder return releaseProject; } - private Element getElement(IPluginModelBase pluginModel) throws CoreException + private Element getElement(IModel componentModel) throws CoreException { - BundleDescription description = pluginModel.getBundleDescription(); - String name = description.getSymbolicName(); - Version version = description.getVersion(); - return new Element(name, version, Type.PLUGIN); + if (componentModel instanceof IPluginModelBase) + { + IPluginModelBase pluginModel = (IPluginModelBase)componentModel; + BundleDescription description = pluginModel.getBundleDescription(); + String name = description.getSymbolicName(); + Version version = description.getVersion(); + return new Element(name, version, Type.PLUGIN); + } + + IFeatureModel featureModel = (IFeatureModel)componentModel; + IFeature feature = featureModel.getFeature(); + String name = feature.getId(); + Version version = new Version(feature.getVersion()); + return new Element(name, version, Type.FEATURE); } private void checkDependencyRanges(IPluginModelBase pluginModel) throws CoreException, IOException @@ -401,8 +418,19 @@ public class VersionBuilder extends IncrementalProjectBuilder private void addVersionMarker(String message) throws CoreException, IOException { - IFile file = getProject().getFile(MANIFEST_PATH); - String regex = "Bundle-Version: *([^ ]*)"; + String regex; + IFile file = getProject().getFile(FEATURE_PATH); + if (file.exists()) + { + + regex = ".*version\\s*=\\s*[\"'](\\d+\\.\\d+\\.\\d+).*"; + } + else + { + file = getProject().getFile(MANIFEST_PATH); + regex = "Bundle-Version: *(\\d+\\.\\d+\\.\\d+).*"; + } + Markers.addMarker(file, message, IMarker.SEVERITY_ERROR, regex); } @@ -413,4 +441,67 @@ public class VersionBuilder extends IncrementalProjectBuilder System.out.println(msg); } } + + public static IModel getComponentModel(IProject project) + { + IModel componentModel = PluginRegistry.findModel(project); + if (componentModel == null) + { + componentModel = getFeatureModel(project); + if (componentModel == null) + { + throw new IllegalStateException("The project " + project.getName() + " is neither a plugin nor a feature"); + } + } + return componentModel; + } + + private static IFeatureModel getFeatureModel(IProject project) + { + FeatureModelManager featureModelManager = PDECore.getDefault().getFeatureModelManager(); + for (IFeatureModel featureModel : featureModelManager.getWorkspaceModels()) + { + if (featureModel.getUnderlyingResource().getProject() == project) + { + return featureModel; + } + } + + return null; + } + + public static IModel getComponentModel(Element element) + { + String name = element.getName(); + if (element.getType() == Element.Type.PLUGIN) + { + IModel pluginModel = PluginRegistry.findModel(name); + if (pluginModel != null) + { + return pluginModel; + } + } + + IFeatureModel[] featureModels = PDECore.getDefault().getFeatureModelManager().getWorkspaceModels(); + for (IFeatureModel featureModel : featureModels) + { + if (featureModel.getFeature().getId().equals(name)) + { + return featureModel; + } + } + + return null; + } + + public static Version getComponentVersion(IModel componentModel) + { + if (componentModel instanceof IPluginModelBase) + { + IPluginModelBase pluginModel = (IPluginModelBase)componentModel; + return pluginModel.getBundleDescription().getVersion(); + } + + return new Version(((IFeatureModel)componentModel).getFeature().getVersion()); + } } diff --git a/plugins/org.eclipse.emf.cdo.releng.version/src/org/eclipse/emf/cdo/releng/version/VersionValidator.java b/plugins/org.eclipse.emf.cdo.releng.version/src/org/eclipse/emf/cdo/releng/version/VersionValidator.java index c0c98bd232..180c7d1cd7 100644 --- a/plugins/org.eclipse.emf.cdo.releng.version/src/org/eclipse/emf/cdo/releng/version/VersionValidator.java +++ b/plugins/org.eclipse.emf.cdo.releng.version/src/org/eclipse/emf/cdo/releng/version/VersionValidator.java @@ -13,7 +13,7 @@ package org.eclipse.emf.cdo.releng.version; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResourceDelta; import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.pde.core.plugin.IPluginModelBase; +import org.eclipse.pde.core.IModel; /** * @author Eike Stepper @@ -31,5 +31,5 @@ public abstract class VersionValidator } public abstract void updateBuildState(BuildState buildState, String releasePath, Release release, IProject project, - IResourceDelta delta, IPluginModelBase pluginModel, IProgressMonitor monitor) throws Exception; + IResourceDelta delta, IModel componentModel, IProgressMonitor monitor) throws Exception; } -- cgit v1.2.3