blob: 348d3e9d3d0ba6332dfa1ad236aecb10a97a5664 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008, 2013 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.pde.api.tools.internal.provisional.comparator;
import java.util.Set;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.SubMonitor;
import org.eclipse.pde.api.tools.internal.builder.AbstractProblemDetector;
import org.eclipse.pde.api.tools.internal.comparator.Delta;
import org.eclipse.pde.api.tools.internal.provisional.ApiPlugin;
import org.eclipse.pde.api.tools.internal.provisional.model.ApiScopeVisitor;
import org.eclipse.pde.api.tools.internal.provisional.model.ApiTypeContainerVisitor;
import org.eclipse.pde.api.tools.internal.provisional.model.IApiBaseline;
import org.eclipse.pde.api.tools.internal.provisional.model.IApiComponent;
import org.eclipse.pde.api.tools.internal.provisional.model.IApiTypeContainer;
import org.eclipse.pde.api.tools.internal.provisional.model.IApiTypeRoot;
/**
* ApiScope visitor implementation to run the comparison on all elements of the
* scope.
*/
public class CompareApiScopeVisitor extends ApiScopeVisitor {
Set<IDelta> deltas;
IApiBaseline referenceBaseline;
int visibilityModifiers;
boolean force;
boolean continueOnResolverError = false;
boolean containsErrors = false;
SubMonitor monitor;
public CompareApiScopeVisitor(final Set<IDelta> deltas, final IApiBaseline baseline, final boolean force, final int visibilityModifiers, final boolean continueOnResolverError, final SubMonitor monitor) {
this.deltas = deltas;
this.referenceBaseline = baseline;
this.visibilityModifiers = visibilityModifiers;
this.force = force;
this.continueOnResolverError = continueOnResolverError;
this.monitor = monitor;
}
@Override
public boolean visit(IApiBaseline baseline) throws CoreException {
this.monitor.setWorkRemaining(100).split(1);
IDelta delta = ApiComparator.compare(this.referenceBaseline, baseline, this.visibilityModifiers, this.force, null);
if (delta != null) {
delta.accept(new DeltaVisitor() {
@Override
public void endVisit(IDelta localDelta) {
if (localDelta.getChildren().length == 0) {
CompareApiScopeVisitor.this.deltas.add(localDelta);
}
}
});
} else {
this.containsErrors = true;
}
return false;
}
@Override
public boolean visit(IApiTypeContainer container) throws CoreException {
SubMonitor localMonitor = this.monitor.setWorkRemaining(100).split(1);
container.accept(new ApiTypeContainerVisitor() {
@Override
public void visit(String packageName, IApiTypeRoot typeroot) {
localMonitor.setWorkRemaining(100).split(1);
try {
compareApiTypeRoot(typeroot);
} catch (CoreException e) {
ApiPlugin.log(e);
AbstractProblemDetector.checkIfDisposed(typeroot.getApiComponent(), localMonitor);
}
}
});
return false;
}
@Override
public boolean visit(IApiComponent component) throws CoreException {
SubMonitor subMonitor = this.monitor.setWorkRemaining(100).split(1).setWorkRemaining(100);
if (component.isSourceComponent() || component.isSystemComponent()) {
return false;
}
if (component.getErrors() != null) {
this.containsErrors = true;
if (!continueOnResolverError) {
return false;
}
}
IApiComponent referenceComponent = this.referenceBaseline.getApiComponent(component.getSymbolicName());
// referenceComponent can be null if this is an added component
if (referenceComponent != null && referenceComponent.getErrors() != null) {
this.containsErrors = true;
if (!continueOnResolverError) {
return false;
}
}
subMonitor.split(50);
final Delta globalDelta = new Delta();
globalDelta.add(ApiComparator.compare(referenceComponent, component, this.visibilityModifiers, null));
if (referenceComponent != null) {
String versionString = referenceComponent.getVersion();
String versionString2 = component.getVersion();
IDelta bundleVersionChangesDelta = ApiComparator.checkBundleVersionChanges(component, referenceComponent.getSymbolicName(), versionString, versionString2);
if (bundleVersionChangesDelta != null) {
globalDelta.add(bundleVersionChangesDelta);
}
}
globalDelta.accept(new DeltaVisitor() {
@Override
public void endVisit(IDelta localDelta) {
if (localDelta.getChildren().length == 0) {
CompareApiScopeVisitor.this.deltas.add(localDelta);
}
}
});
return false;
}
@Override
public void visit(IApiTypeRoot root) throws CoreException {
this.monitor.setWorkRemaining(100).split(1);
compareApiTypeRoot(root);
}
void compareApiTypeRoot(IApiTypeRoot root) throws CoreException {
IApiComponent apiComponent = root.getApiComponent();
if (apiComponent == null || apiComponent.isSystemComponent() || apiComponent.isSourceComponent()) {
return;
}
if (apiComponent.getErrors() != null) {
this.containsErrors = true;
if (!continueOnResolverError) {
return;
}
}
IApiComponent referenceComponent = this.referenceBaseline.getApiComponent(apiComponent.getSymbolicName());
if (referenceComponent == null) {
return;
}
if (referenceComponent.getErrors() != null) {
this.containsErrors = true;
if (!continueOnResolverError) {
return;
}
}
IApiBaseline baseline = referenceComponent.getBaseline();
IDelta delta = ApiComparator.compare(root, referenceComponent, apiComponent, null, this.referenceBaseline, baseline, this.visibilityModifiers, null);
if (delta != null) {
delta.accept(new DeltaVisitor() {
@Override
public void endVisit(IDelta localDelta) {
if (localDelta.getChildren().length == 0) {
CompareApiScopeVisitor.this.deltas.add(localDelta);
}
}
});
} else {
this.containsErrors = true;
}
}
public boolean containsError() {
return this.containsErrors;
}
}