/* * Copyright 2008 Alin Dreghiciu. * * Licensed 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.ops4j.pax.exam.options; import static org.osgi.framework.Constants.BUNDLE_SYMBOLICNAME; import static org.osgi.framework.Constants.BUNDLE_VERSION; import static org.osgi.framework.Constants.EXPORT_PACKAGE; import static org.osgi.framework.Constants.IMPORT_PACKAGE; /** * Option specifying a provision url that will wrap (osgify) another bundle. * * @author Alin Dreghiciu (adreghiciu@gmail.com) * @since 0.3.0, December 27, 2008 */ public class WrappedUrlProvisionOption extends AbstractUrlProvisionOption<WrappedUrlProvisionOption> { /** * Wrapped jar bundle symbolic name. Can be null. */ private String bundleSymbolicName; /** * Wrapped jar bundle version. Can be null. */ private String bundleVersion; /** * Wrapped jar imports. */ private String[] imports; /** * Wrapped jar exports. */ private String[] exports; /** * Wrapped jar raw instructions. */ private String[] instructions; private WrappedUrlProvisionOption.OverwriteMode overwriteMode; /** * Constructor. * * @param url * wrapped jar url (cannot be null or empty) * * @throws IllegalArgumentException * - If url is null or empty */ public WrappedUrlProvisionOption(final String url) { super(url); } /** * Constructor. * * @param url * wrapped jar url (cannot be null) * * @throws IllegalArgumentException * - If url is null */ public WrappedUrlProvisionOption(final UrlReference url) { super(url); } public String getURL() { final StringBuilder options = new StringBuilder(); if (overwriteMode != null) { if (options.length() > 0) { options.append("&"); } options.append("overwrite=").append(overwriteMode); } if (bundleSymbolicName != null) { if (options.length() > 0) { options.append("&"); } options.append(BUNDLE_SYMBOLICNAME).append("=").append(bundleSymbolicName); } if (bundleVersion != null) { if (options.length() > 0) { options.append("&"); } options.append(BUNDLE_VERSION).append("=").append(bundleVersion); } if (imports != null && imports.length > 0) { if (options.length() > 0) { options.append("&"); } options.append(IMPORT_PACKAGE).append("="); for (String entry : imports) { options.append(entry).append(","); } options.delete(options.length() - 1, options.length()); } if (exports != null && exports.length > 0) { if (options.length() > 0) { options.append("&"); } options.append(EXPORT_PACKAGE).append("="); for (String entry : exports) { options.append(entry).append(","); } options.delete(options.length() - 1, options.length()); } if (instructions != null && instructions.length > 0) { for (String entry : instructions) { if (options.length() > 0) { options.append("&"); } options.append(entry); } } if (options.length() > 0) { options.insert(0, "$"); } return "wrap:" + super.getURL() + options.toString(); } /** * Sets wrapped jar bundle symbolic name. * * @param _bundleSymbolicName * bundle symbolic name * * @return itself */ public WrappedUrlProvisionOption bundleSymbolicName(final String _bundleSymbolicName) { this.bundleSymbolicName = _bundleSymbolicName; return this; } /** * Sets wrapped jar bundle version. * * @param _bundleVersion * bundle symbolic name * * @return itself */ public WrappedUrlProvisionOption bundleVersion(final String _bundleVersion) { this.bundleVersion = _bundleVersion; return this; } /** * Sets wrapped jar imports. * * @param _imports * BND style imports * * @return itself */ public WrappedUrlProvisionOption imports(final String... _imports) { this.imports = _imports; return this; } /** * Sets wrapped jar exports. * * @param _exports * BND style exports * * @return itself */ public WrappedUrlProvisionOption exports(final String... _exports) { this.exports = _exports; return this; } /** * Sets wrapped jar manifest overwrite mode. * * @param mode * overwrite mode * * @return itself */ public WrappedUrlProvisionOption overwriteManifest(final OverwriteMode mode) { overwriteMode = mode; return this; } /** * Sets wrapped jar raw BND instructions. * * @param _instructions * BND instructions * * @return itself */ public WrappedUrlProvisionOption instructions(final String... _instructions) { this.instructions = _instructions; return this; } protected WrappedUrlProvisionOption itself() { return this; } /** * Strategy to use regarding manifest rewrite, for a jar that is already a bundle (has osgi * manifest attributes). */ public static enum OverwriteMode { /** * Keep existing manifest. */ KEEP, /** * Merge instructions with current manifest entries. */ MERGE, /** * Full rewrite. */ FULL } }