/* * 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.felix.deploymentadmin; import java.util.StringTokenizer; import java.util.jar.Attributes; import org.osgi.framework.Version; import org.osgi.service.deploymentadmin.BundleInfo; import org.osgi.service.deploymentadmin.DeploymentException; /** * Implementation of the <code>BundleInfo</code> interface as defined by the OSGi mobile specification. */ public class BundleInfoImpl extends AbstractInfo implements BundleInfo { private final Version m_version; private final String m_symbolicName; private final boolean m_customizer; /** * Creates an instance of this class. * * @param path The path / resource-id of the bundle resource. * @param attributes Set of attributes describing the bundle resource. * @throws DeploymentException If the specified attributes do not describe a valid bundle. */ public BundleInfoImpl(String path, Attributes attributes) throws DeploymentException { super(path, attributes); String bundleSymbolicName = attributes.getValue(BUNDLE_SYMBOLICNAME); if (bundleSymbolicName == null) { throw new DeploymentException(CODE_MISSING_HEADER, "Missing '" + BUNDLE_SYMBOLICNAME + "' header for manifest entry '" + getPath() + "'"); } else if (bundleSymbolicName.trim().equals("")) { throw new DeploymentException(CODE_BAD_HEADER, "Invalid '" + BUNDLE_SYMBOLICNAME + "' header for manifest entry '" + getPath() + "'"); } else { m_symbolicName = parseSymbolicName(bundleSymbolicName); } String version = attributes.getValue(BUNDLE_VERSION); if (version == null || version == "") { throw new DeploymentException(CODE_BAD_HEADER, "Invalid '" + BUNDLE_VERSION + "' header for manifest entry '" + getPath() + "'"); } try { m_version = Version.parseVersion(version); } catch (IllegalArgumentException e) { throw new DeploymentException(CODE_BAD_HEADER, "Invalid '" + BUNDLE_VERSION + "' header for manifest entry '" + getPath() + "'"); } m_customizer = parseBooleanHeader(attributes, DEPLOYMENTPACKAGE_CUSTOMIZER); } /** * Strips parameters from the bundle symbolic name such as "foo;singleton:=true". * * @param name full name as found in the manifest of the deployment package * @return name without parameters */ private String parseSymbolicName(String name) { // note that we don't explicitly check if there are tokens, because that // check has already been made before we are invoked here StringTokenizer st = new StringTokenizer(name, ";"); return st.nextToken(); } public String getSymbolicName() { return m_symbolicName; } public Version getVersion() { return m_version; } /** * Determine whether this bundle resource is a customizer bundle. * * @return True if the bundle is a customizer bundle, false otherwise. */ public boolean isCustomizer() { return m_customizer; } /** * Verify if the specified attributes describe a bundle resource. * * @param attributes Attributes describing the resource * @return true if the attributes describe a bundle resource, false otherwise */ public static boolean isBundleResource(Attributes attributes) { return (attributes.getValue(BUNDLE_SYMBOLICNAME) != null); } }