blob: 8d27054724a72a14828995254c1d0d5d376fb15f [file] [log] [blame]
/******************************************************************************
* Copyright (c) 2016 Alex Blewitt 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:
* Alex Blewitt - initial API and implementation
******************************************************************************/
package org.eclipse.osgi.internal.loader.classpath;
/**
* Stores a pair of {@link TitleVersionVendor} package attributes for the Implementation- and Specification- entries.
*/
class ManifestPackageAttributes {
/**
* Constant used when no titles, versions or vendors are specified for the package.
*/
static final ManifestPackageAttributes NONE = new ManifestPackageAttributes(TitleVersionVendor.NONE, TitleVersionVendor.NONE);
private final TitleVersionVendor implementation;
private final TitleVersionVendor specification;
/**
* Utility method to return the first version, or the second if it is null
* @param first the string to return if not null
* @param second the fallback value if the first is null
* @return the first value, or the second value if the first is null
*/
private static String or(String first, String second) {
return first == null ? second : first;
}
/**
* Factory method for creating ManifestPackageAttributes. If any of the given title,
* version, or vendor values are <code>null</code> then the defaultAttributes will be
* used. If the defaultAttributes is null or returns all <code>null</code> values then
* <code>null</code> values will be used. If <code>null</code> values are used for all of the
* versions, titles, and vendors then {@link #NONE} is returned.
* @param specificationTitle the package specification title
* @param specificationVersion the package specification version
* @param specificationVendor the package specification vendor
* @param implementationTitle the package implementation title
* @param implementationVersion the package implementation version
* @param implementationVendor the package implementation vendor
* @param defaultAttributes the default attributes to use when the specified title, version or vendor is <code>null</code>.
* @return
*/
static ManifestPackageAttributes of(String specificationTitle, String specificationVersion, String specificationVendor, String implementationTitle, String implementationVersion, String implementationVendor, ManifestPackageAttributes defaultAttributes) {
if (defaultAttributes == null) {
defaultAttributes = NONE;
}
return of(//
or(specificationTitle, defaultAttributes.getSpecification().getTitle()), //
or(specificationVersion, defaultAttributes.getSpecification().getVersion()), //
or(specificationVendor, defaultAttributes.getSpecification().getVendor()), //
or(implementationTitle, defaultAttributes.getImplementation().getTitle()), //
or(implementationVersion, defaultAttributes.getImplementation().getVersion()), //
or(implementationVendor, defaultAttributes.getImplementation().getVendor())//
);
}
private static ManifestPackageAttributes of(String specificationTitle, String specificationVersion, String specificationVendor, String implementationTitle, String implementationVersion, String implementationVendor) {
TitleVersionVendor specification = TitleVersionVendor.of(specificationTitle, specificationVersion, specificationVendor);
TitleVersionVendor implementation = TitleVersionVendor.of(implementationTitle, implementationVersion, implementationVendor);
if (specification == TitleVersionVendor.NONE && implementation == TitleVersionVendor.NONE) {
return NONE;
}
return new ManifestPackageAttributes(implementation, specification);
}
private ManifestPackageAttributes(TitleVersionVendor implementation, TitleVersionVendor specification) {
if (implementation == null || specification == null) {
throw new IllegalArgumentException();
}
this.implementation = implementation;
this.specification = specification;
}
/**
* Returns the title, version and vendor for the package implementation.
* @return the title, version and vendor for the package implemetnation.
*/
TitleVersionVendor getImplementation() {
return implementation;
}
/**
* Returns the title, version and vendor for the package specification.
* @return the title, version and vendor for the package specification.
*/
TitleVersionVendor getSpecification() {
return specification;
}
}