blob: ef265a9d08a9a2ae35c164e6f9f4e0f623c76dc2 [file] [log] [blame]
/**
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.karaf.tooling.features;
import java.util.LinkedList;
import java.util.List;
import java.util.jar.Manifest;
import org.apache.felix.utils.manifest.Clause;
import org.apache.felix.utils.manifest.Parser;
import org.apache.felix.utils.version.VersionRange;
import org.osgi.framework.Constants;
/**
* A set of utility methods to ease working with {@link org.apache.felix.utils.manifest.Parser} and
* {@link org.apache.felix.utils.manifest.Clause}
*/
public class ManifestUtils {
private ManifestUtils() {
// hide the constructor
}
/**
* Get the list of imports from the manifest. If no imports have been defined, this method returns an empty list.
*
* @param manifest the manifest
* @return the list of imports
*/
public static List<Clause> getImports(Manifest manifest) {
List<Clause> result = new LinkedList<Clause>();
Clause[] clauses = Parser.parseHeader(getHeader(Constants.IMPORT_PACKAGE, manifest));
for (Clause clause : clauses) {
result.add(clause);
}
return result;
}
/**
* Get the list of non-optional imports from the manifest.
*
* @param manifest the manifest
* @return the list of non-optional imports
*/
public static List<Clause> getMandatoryImports(Manifest manifest) {
List<Clause> result = new LinkedList<Clause>();
for (Clause clause : getImports(manifest)) {
if (!isOptional(clause)) {
result.add(clause);
}
}
return result;
}
/**
* Get the list of exports from the manifest. If no exports have been defined, this method returns an empty list.
*
* @param manifest the manifest
* @return the list of exports
*/
public static List<Clause> getExports(Manifest manifest) {
List<Clause> result = new LinkedList<Clause>();
Clause[] clauses = Parser.parseHeader(getHeader(Constants.EXPORT_PACKAGE, manifest));
for (Clause clause : clauses) {
result.add(clause);
}
return result;
}
/**
* Check if a given manifest clause represents an optional import
*
* @param clause the manifest clause
* @return <code>true</code> for an optional import, <code>false</code> for mandatory imports
*/
public static boolean isOptional(Clause clause) {
return "optional".equals(clause.getDirective("resolution"));
}
/**
* Check if the manifest contains the mandatory Bundle-Symbolic-Name
*
* @param manifest the manifest
* @return <code>true</code> if the manifest specifies a Bundle-Symbolic-Name
*/
public static boolean isBundle(Manifest manifest) {
return getBsn(manifest) != null;
}
public static boolean matches(Clause requirement, Clause export) {
if (requirement.getName().equals(export.getName())) {
VersionRange importVersionRange = getVersionRange(requirement);
VersionRange exportVersionRange = getVersionRange(export);
VersionRange intersection = importVersionRange.intersect(exportVersionRange);
return intersection != null;
}
return false;
}
public static String getHeader(String name, Manifest manifest) {
String value = manifest.getMainAttributes().getValue(name);
return value;
}
public static String getBsn(Manifest manifest) {
String bsn = getHeader(Constants.BUNDLE_SYMBOLICNAME, manifest);
return bsn;
}
public static VersionRange getVersionRange(Clause clause)
{
String v = clause.getAttribute(Constants.VERSION_ATTRIBUTE);
if (v == null)
{
v = clause.getAttribute(Constants.PACKAGE_SPECIFICATION_VERSION);
}
if (v == null)
{
v = clause.getAttribute(Constants.BUNDLE_VERSION_ATTRIBUTE);
}
return VersionRange.parseVersionRange(v);
}
}