blob: 8fdaa03049bdd46a786a479bf0da9e1a6e89e49b [file] [log] [blame]
/*********************************************************************
* Copyright (c) 2009, 2012 SpringSource, a division of VMware, Inc.
*
* This program and the accompanying materials are made
* available under the terms of the Eclipse Public License 2.0
* which is available at https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
**********************************************************************/
package org.eclipse.virgo.ide.manifest.internal.core;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import org.apache.commons.lang.ObjectUtils;
import org.eclipse.virgo.ide.manifest.core.IBundleManifestChangeListener;
import org.eclipse.virgo.ide.manifest.core.IBundleManifestChangeListener.Type;
import org.eclipse.virgo.util.osgi.manifest.BundleManifest;
import org.eclipse.virgo.util.osgi.manifest.ExportPackage;
import org.eclipse.virgo.util.osgi.manifest.ImportBundle;
import org.eclipse.virgo.util.osgi.manifest.ImportLibrary;
import org.eclipse.virgo.util.osgi.manifest.ImportPackage;
import org.eclipse.virgo.util.osgi.manifest.RequireBundle;
import org.osgi.framework.Constants;
/**
* Utility that checks two {@link BundleManifest} instances for equality.
*
* @author Christian Dupuis
* @since 1.0.1
*/
class BundleManifestDiffer {
/**
* Diffs the two given bundles and provides a set of changes.
*
* @param bundleManifest1 the first manifest to check
* @param bundleManifest2 the second manifest to check
* @return {@link Set} of {@link IBundleManifestChangeListener.Type} expressing the actual change.
*/
static Set<Type> diff(BundleManifest bundleManifest1, BundleManifest bundleManifest2) {
if (bundleManifest1 == null && bundleManifest2 == null) {
return Collections.emptySet();
} else if (bundleManifest1 == null && bundleManifest2 != null || bundleManifest1 != null && bundleManifest2 == null) {
return BundleManifestManager.IMPORTS_CHANGED;
}
ImportPackage importPackageHeader1 = bundleManifest1.getImportPackage();
ImportPackage importPackageHeader2 = bundleManifest2.getImportPackage();
ExportPackage exportPackageHeader1 = bundleManifest1.getExportPackage();
ExportPackage exportPackageHeader2 = bundleManifest2.getExportPackage();
ImportLibrary importLibraryHeader1 = bundleManifest1.getImportLibrary();
ImportLibrary importLibraryHeader2 = bundleManifest2.getImportLibrary();
ImportBundle importBundleHeader1 = bundleManifest1.getImportBundle();
ImportBundle importBundleHeader2 = bundleManifest2.getImportBundle();
RequireBundle requireBundleHeader1 = bundleManifest1.getRequireBundle();
RequireBundle requireBundleHeader2 = bundleManifest2.getRequireBundle();
String execEnvironment1 = bundleManifest1.toDictionary().get(Constants.BUNDLE_REQUIREDEXECUTIONENVIRONMENT);
String execEnvironment2 = bundleManifest2.toDictionary().get(Constants.BUNDLE_REQUIREDEXECUTIONENVIRONMENT);
Set<Type> differences = new HashSet<Type>();
if (!ObjectUtils.equals(importPackageHeader1.getImportedPackages(), importPackageHeader2.getImportedPackages())) {
differences.add(Type.IMPORT_PACKAGE);
}
if (!ObjectUtils.equals(execEnvironment1, execEnvironment2)) {
differences.add(Type.IMPORT_PACKAGE);
}
if (!ObjectUtils.equals(exportPackageHeader1.getExportedPackages(), exportPackageHeader2.getExportedPackages())) {
differences.add(Type.EXPORT_PACKAGE);
}
if (!ObjectUtils.equals(importLibraryHeader1.getImportedLibraries(), importLibraryHeader2.getImportedLibraries())) {
differences.add(Type.IMPORT_LIBRARY);
}
if (!ObjectUtils.equals(importBundleHeader1.getImportedBundles(), importBundleHeader2.getImportedBundles())) {
differences.add(Type.IMPORT_BUNDLE);
}
if (!ObjectUtils.equals(requireBundleHeader1.getRequiredBundles(), requireBundleHeader2.getRequiredBundles())) {
differences.add(Type.REQUIRE_BUNDLE);
}
return differences;
}
}