/*
 * Copyright (c) OSGi Alliance (2000, 2020). All Rights Reserved.
 *
 * 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.osgi.framework;

import org.osgi.annotation.versioning.ProviderType;
import org.osgi.framework.hooks.bundle.CollisionHook;
import org.osgi.framework.launch.Framework;

/**
 * Defines standard names for the OSGi environment system properties, service
 * properties, and Manifest header attribute keys.
 * 
 * <p>
 * The values associated with these keys are of type {@code String}, unless
 * otherwise indicated.
 * 
 * @since 1.1
 * @author $Id$
 */
@ProviderType
public interface Constants {
	/**
	 * Location identifier of the OSGi <i>system bundle </i>, which is defined
	 * to be &quot;System Bundle&quot;.
	 */
	String	SYSTEM_BUNDLE_LOCATION					= "System Bundle";

	/**
	 * Alias for the symbolic name of the OSGi <i>system bundle </i>. It is
	 * defined to be &quot;system.bundle&quot;.
	 * 
	 * @since 1.3
	 */
	String	SYSTEM_BUNDLE_SYMBOLICNAME				= "system.bundle";

	/**
	 * Identifier of the OSGi <i>system bundle </i>, which is defined to be
	 * {@code 0}.
	 * 
	 * @since 1.8
	 */
	long	SYSTEM_BUNDLE_ID						= 0L;

	/**
	 * Manifest header identifying the bundle's category.
	 * <p>
	 * The header value may be retrieved from the {@code Dictionary} object
	 * returned by the {@code Bundle.getHeaders} method.
	 */
	String	BUNDLE_CATEGORY							= "Bundle-Category";

	/**
	 * Manifest header identifying a list of directories and embedded JAR files,
	 * which are bundle resources used to extend the bundle's classpath.
	 * 
	 * <p>
	 * The header value may be retrieved from the {@code Dictionary} object
	 * returned by the {@code Bundle.getHeaders} method.
	 */
	String	BUNDLE_CLASSPATH						= "Bundle-ClassPath";

	/**
	 * Manifest header identifying the bundle's copyright information.
	 * <p>
	 * The header value may be retrieved from the {@code Dictionary} object
	 * returned by the {@code Bundle.getHeaders} method.
	 */
	String	BUNDLE_COPYRIGHT						= "Bundle-Copyright";

	/**
	 * Manifest header containing a brief description of the bundle's
	 * functionality.
	 * <p>
	 * The header value may be retrieved from the {@code Dictionary} object
	 * returned by the {@code Bundle.getHeaders} method.
	 */
	String	BUNDLE_DESCRIPTION						= "Bundle-Description";

	/**
	 * Manifest header identifying the bundle's name.
	 * <p>
	 * The header value may be retrieved from the {@code Dictionary} object
	 * returned by the {@code Bundle.getHeaders} method.
	 */
	String	BUNDLE_NAME								= "Bundle-Name";

	/**
	 * Manifest header identifying a number of hardware environments and the
	 * native language code libraries that the bundle is carrying for each of
	 * these environments.
	 * 
	 * <p>
	 * The header value may be retrieved from the {@code Dictionary} object
	 * returned by the {@code Bundle.getHeaders} method.
	 */
	String	BUNDLE_NATIVECODE						= "Bundle-NativeCode";

	/**
	 * Manifest header identifying the packages that the bundle offers to the
	 * Framework for export.
	 * 
	 * <p>
	 * The header value may be retrieved from the {@code Dictionary} object
	 * returned by the {@code Bundle.getHeaders} method.
	 */
	String	EXPORT_PACKAGE							= "Export-Package";

	/**
	 * Manifest header identifying the fully qualified class names of the
	 * services that the bundle may register (used for informational purposes
	 * only).
	 * 
	 * <p>
	 * The header value may be retrieved from the {@code Dictionary} object
	 * returned by the {@code Bundle.getHeaders} method.
	 * 
	 * @deprecated As of 1.2.
	 */
	String	EXPORT_SERVICE							= "Export-Service";

	/**
	 * Manifest header identifying the packages on which the bundle depends.
	 * 
	 * <p>
	 * The header value may be retrieved from the {@code Dictionary} object
	 * returned by the {@code Bundle.getHeaders} method.
	 */
	String	IMPORT_PACKAGE							= "Import-Package";

	/**
	 * Manifest header identifying the packages that the bundle may dynamically
	 * import during execution.
	 * 
	 * <p>
	 * The header value may be retrieved from the {@code Dictionary} object
	 * returned by the {@code Bundle.getHeaders} method.
	 * 
	 * @since 1.2
	 */
	String	DYNAMICIMPORT_PACKAGE					= "DynamicImport-Package";

	/**
	 * Manifest header identifying the fully qualified class names of the
	 * services that the bundle requires (used for informational purposes only).
	 * 
	 * <p>
	 * The header value may be retrieved from the {@code Dictionary} object
	 * returned by the {@code Bundle.getHeaders} method.
	 * 
	 * @deprecated As of 1.2.
	 */
	String	IMPORT_SERVICE							= "Import-Service";

	/**
	 * Manifest header identifying the bundle's vendor.
	 * 
	 * <p>
	 * The header value may be retrieved from the {@code Dictionary} object
	 * returned by the {@code Bundle.getHeaders} method.
	 */
	String	BUNDLE_VENDOR							= "Bundle-Vendor";

	/**
	 * Manifest header identifying the bundle's version.
	 * 
	 * <p>
	 * The header value may be retrieved from the {@code Dictionary} object
	 * returned by the {@code Bundle.getHeaders} method.
	 */
	String	BUNDLE_VERSION							= "Bundle-Version";

	/**
	 * Manifest header identifying the bundle's documentation URL, from which
	 * further information about the bundle may be obtained.
	 * 
	 * <p>
	 * The header value may be retrieved from the {@code Dictionary} object
	 * returned by the {@code Bundle.getHeaders} method.
	 */
	String	BUNDLE_DOCURL							= "Bundle-DocURL";

	/**
	 * Manifest header identifying the contact address where problems with the
	 * bundle may be reported; for example, an email address.
	 * 
	 * <p>
	 * The header value may be retrieved from the {@code Dictionary} object
	 * returned by the {@code Bundle.getHeaders} method.
	 */
	String	BUNDLE_CONTACTADDRESS					= "Bundle-ContactAddress";

	/**
	 * Manifest header identifying the bundle's activator class.
	 * 
	 * <p>
	 * If present, this header specifies the name of the bundle resource class
	 * that implements the {@code BundleActivator} interface and whose
	 * {@code start} and {@code stop} methods are called by the Framework when
	 * the bundle is started and stopped, respectively.
	 * 
	 * <p>
	 * The header value may be retrieved from the {@code Dictionary} object
	 * returned by the {@code Bundle.getHeaders} method.
	 */
	String	BUNDLE_ACTIVATOR						= "Bundle-Activator";

	/**
	 * Manifest header identifying the extension bundle's activator class.
	 * 
	 * <p>
	 * If present, this header specifies the name of the extension bundle
	 * resource class that implements the {@code BundleActivator} interface and
	 * whose {@code start} and {@code stop} methods are called by the Framework
	 * when the Framework is initialized and shutdown, respectively.
	 * 
	 * @since 1.8
	 */
	String	EXTENSION_BUNDLE_ACTIVATOR				= "ExtensionBundle-Activator";

	/**
	 * Manifest header identifying the location from which a new bundle version
	 * is obtained during a bundle update operation.
	 * 
	 * <p>
	 * The header value may be retrieved from the {@code Dictionary} object
	 * returned by the {@code Bundle.getHeaders} method.
	 */
	String	BUNDLE_UPDATELOCATION					= "Bundle-UpdateLocation";

	/**
	 * Manifest header attribute identifying the version of a package specified
	 * in the Export-Package or Import-Package manifest header.
	 * 
	 * @deprecated As of 1.3. This has been replaced by
	 *             {@link #VERSION_ATTRIBUTE}.
	 */
	String	PACKAGE_SPECIFICATION_VERSION			= "specification-version";

	/**
	 * Manifest header attribute identifying the processor required to run
	 * native bundle code specified in the Bundle-NativeCode manifest header).
	 * 
	 * <p>
	 * The attribute value is encoded in the Bundle-NativeCode manifest header
	 * like:
	 * 
	 * <pre>
	 *     Bundle-NativeCode: http.so ; processor=x86 ...
	 * </pre>
	 * 
	 * @see #BUNDLE_NATIVECODE
	 */
	String	BUNDLE_NATIVECODE_PROCESSOR				= "processor";

	/**
	 * Manifest header attribute identifying the operating system required to
	 * run native bundle code specified in the Bundle-NativeCode manifest
	 * header).
	 * <p>
	 * The attribute value is encoded in the Bundle-NativeCode manifest header
	 * like:
	 * 
	 * <pre>
	 *     Bundle-NativeCode: http.so ; osname=Linux ...
	 * </pre>
	 * 
	 * @see #BUNDLE_NATIVECODE
	 */
	String	BUNDLE_NATIVECODE_OSNAME				= "osname";

	/**
	 * Manifest header attribute identifying the operating system version
	 * required to run native bundle code specified in the Bundle-NativeCode
	 * manifest header).
	 * <p>
	 * The attribute value is encoded in the Bundle-NativeCode manifest header
	 * like:
	 * 
	 * <pre>
	 *     Bundle-NativeCode: http.so ; osversion=&quot;2.34&quot; ...
	 * </pre>
	 * 
	 * @see #BUNDLE_NATIVECODE
	 */
	String	BUNDLE_NATIVECODE_OSVERSION				= "osversion";

	/**
	 * Manifest header attribute identifying the language in which the native
	 * bundle code is written specified in the Bundle-NativeCode manifest
	 * header. See ISO 639 for possible values.
	 * <p>
	 * The attribute value is encoded in the Bundle-NativeCode manifest header
	 * like:
	 * 
	 * <pre>
	 *     Bundle-NativeCode: http.so ; language=nl_be ...
	 * </pre>
	 * 
	 * @see #BUNDLE_NATIVECODE
	 */
	String	BUNDLE_NATIVECODE_LANGUAGE				= "language";

	/**
	 * Manifest header identifying the required execution environment for the
	 * bundle. The service platform may run this bundle if any of the execution
	 * environments named in this header matches one of the execution
	 * environments it implements.
	 * 
	 * <p>
	 * The header value may be retrieved from the {@code Dictionary} object
	 * returned by the {@code Bundle.getHeaders} method.
	 * 
	 * @since 1.2
	 * @deprecated As of 1.6. Replaced by the {@code osgi.ee} capability.
	 */
	String	BUNDLE_REQUIREDEXECUTIONENVIRONMENT		= "Bundle-RequiredExecutionEnvironment";

	/**
	 * Manifest header identifying the bundle's symbolic name.
	 * 
	 * <p>
	 * The header value may be retrieved from the {@code Dictionary} object
	 * returned by the {@code Bundle.getHeaders} method.
	 * 
	 * @since 1.3
	 */
	String	BUNDLE_SYMBOLICNAME						= "Bundle-SymbolicName";

	/**
	 * Manifest header directive identifying whether a bundle is a singleton.
	 * The default value is {@code false}.
	 * 
	 * <p>
	 * The directive value is encoded in the Bundle-SymbolicName manifest header
	 * like:
	 * 
	 * <pre>
	 *     Bundle-SymbolicName: com.acme.module.test; singleton:=true
	 * </pre>
	 * 
	 * @see #BUNDLE_SYMBOLICNAME
	 * @since 1.3
	 */
	String	SINGLETON_DIRECTIVE						= "singleton";

	/**
	 * Manifest header directive identifying if and when a fragment may attach
	 * to a host bundle. The default value is
	 * {@link #FRAGMENT_ATTACHMENT_ALWAYS always}.
	 * 
	 * <p>
	 * The directive value is encoded in the Bundle-SymbolicName manifest header
	 * like:
	 * 
	 * <pre>
	 *     Bundle-SymbolicName: com.acme.module.test; fragment-attachment:=&quot;never&quot;
	 * </pre>
	 * 
	 * @see #BUNDLE_SYMBOLICNAME
	 * @see #FRAGMENT_ATTACHMENT_ALWAYS
	 * @see #FRAGMENT_ATTACHMENT_RESOLVETIME
	 * @see #FRAGMENT_ATTACHMENT_NEVER
	 * @since 1.3
	 */
	String	FRAGMENT_ATTACHMENT_DIRECTIVE			= "fragment-attachment";

	/**
	 * Manifest header directive value identifying a fragment attachment type of
	 * always. A fragment attachment type of always indicates that fragments are
	 * allowed to attach to the host bundle at any time (while the host is
	 * resolved or during the process of resolving the host bundle).
	 * 
	 * <p>
	 * The directive value is encoded in the Bundle-SymbolicName manifest header
	 * like:
	 * 
	 * <pre>
	 *     Bundle-SymbolicName: com.acme.module.test; fragment-attachment:=&quot;always&quot;
	 * </pre>
	 * 
	 * @see #FRAGMENT_ATTACHMENT_DIRECTIVE
	 * @since 1.3
	 */
	String	FRAGMENT_ATTACHMENT_ALWAYS				= "always";

	/**
	 * Manifest header directive value identifying a fragment attachment type of
	 * resolve-time. A fragment attachment type of resolve-time indicates that
	 * fragments are allowed to attach to the host bundle only during the
	 * process of resolving the host bundle.
	 * 
	 * <p>
	 * The directive value is encoded in the Bundle-SymbolicName manifest header
	 * like:
	 * 
	 * <pre>
	 *     Bundle-SymbolicName: com.acme.module.test;
	 *       fragment-attachment:=&quot;resolve-time&quot;
	 * </pre>
	 * 
	 * @see #FRAGMENT_ATTACHMENT_DIRECTIVE
	 * @since 1.3
	 */
	String	FRAGMENT_ATTACHMENT_RESOLVETIME			= "resolve-time";

	/**
	 * Manifest header directive value identifying a fragment attachment type of
	 * never. A fragment attachment type of never indicates that no fragments
	 * are allowed to attach to the host bundle at any time.
	 * 
	 * <p>
	 * The directive value is encoded in the Bundle-SymbolicName manifest header
	 * like:
	 * 
	 * <pre>
	 *     Bundle-SymbolicName: com.acme.module.test; fragment-attachment:=&quot;never&quot;
	 * </pre>
	 * 
	 * @see #FRAGMENT_ATTACHMENT_DIRECTIVE
	 * @since 1.3
	 */
	String	FRAGMENT_ATTACHMENT_NEVER				= "never";

	/**
	 * Manifest header identifying the base name of the bundle's localization
	 * entries.
	 * 
	 * <p>
	 * The header value may be retrieved from the {@code Dictionary} object
	 * returned by the {@code Bundle.getHeaders} method.
	 * 
	 * @see #BUNDLE_LOCALIZATION_DEFAULT_BASENAME
	 * @since 1.3
	 */
	String	BUNDLE_LOCALIZATION						= "Bundle-Localization";

	/**
	 * Default value for the {@code Bundle-Localization} manifest header.
	 * 
	 * @see #BUNDLE_LOCALIZATION
	 * @since 1.3
	 */
	String	BUNDLE_LOCALIZATION_DEFAULT_BASENAME	= "OSGI-INF/l10n/bundle";

	/**
	 * Manifest header identifying the symbolic names of other bundles required
	 * by the bundle.
	 * 
	 * <p>
	 * The header value may be retrieved from the {@code Dictionary} object
	 * returned by the {@code Bundle.getHeaders} method.
	 * 
	 * @since 1.3
	 */
	String	REQUIRE_BUNDLE							= "Require-Bundle";

	/**
	 * Manifest header attribute identifying a range of versions for a bundle
	 * specified in the {@code Require-Bundle} or {@code Fragment-Host} manifest
	 * headers. The default value is {@code 0.0.0}.
	 * 
	 * <p>
	 * The attribute value is encoded in the Require-Bundle manifest header
	 * like:
	 * 
	 * <pre>
	 *     Require-Bundle: com.acme.module.test; bundle-version=&quot;1.1&quot;
	 *     Require-Bundle: com.acme.module.test; bundle-version=&quot;[1.0,2.0)&quot;
	 * </pre>
	 * 
	 * <p>
	 * The bundle-version attribute value uses a mathematical interval notation
	 * to specify a range of bundle versions. A bundle-version attribute value
	 * specified as a single version means a version range that includes any
	 * bundle version greater than or equal to the specified version.
	 * 
	 * @see #REQUIRE_BUNDLE
	 * @since 1.3
	 */
	String	BUNDLE_VERSION_ATTRIBUTE				= "bundle-version";

	/**
	 * Manifest header identifying the symbolic name of another bundle for which
	 * that the bundle is a fragment.
	 * 
	 * <p>
	 * The header value may be retrieved from the {@code Dictionary} object
	 * returned by the {@code Bundle.getHeaders} method.
	 * 
	 * @since 1.3
	 */
	String	FRAGMENT_HOST							= "Fragment-Host";

	/**
	 * Manifest header attribute is used for selection by filtering based upon
	 * system properties.
	 * 
	 * <p>
	 * The attribute value is encoded in manifest headers like:
	 * 
	 * <pre>
	 *     Bundle-NativeCode: libgtk.so; selection-filter=&quot;(ws=gtk)&quot;; ...
	 * </pre>
	 * 
	 * @see #BUNDLE_NATIVECODE
	 * @since 1.3
	 */
	String	SELECTION_FILTER_ATTRIBUTE				= "selection-filter";

	/**
	 * Manifest header identifying the bundle manifest version. A bundle
	 * manifest may express the version of the syntax in which it is written by
	 * specifying a bundle manifest version. Bundles exploiting OSGi Release 4,
	 * or later, syntax must specify a bundle manifest version.
	 * <p>
	 * The bundle manifest version defined by OSGi Release 4 or, more
	 * specifically, by version 1.3 of the OSGi Core Specification is "2".
	 * 
	 * <p>
	 * The header value may be retrieved from the {@code Dictionary} object
	 * returned by the {@code Bundle.getHeaders} method.
	 * 
	 * @since 1.3
	 */
	String	BUNDLE_MANIFESTVERSION					= "Bundle-ManifestVersion";

	/**
	 * Manifest header attribute identifying the version of a package specified
	 * in the Export-Package or Import-Package manifest header.
	 * 
	 * <p>
	 * The attribute value is encoded in the Export-Package or Import-Package
	 * manifest header like:
	 * 
	 * <pre>
	 *     Export-Package: org.osgi.framework; version=&quot;1.1&quot;
	 * </pre>
	 * 
	 * @see #EXPORT_PACKAGE
	 * @see #IMPORT_PACKAGE
	 * @since 1.3
	 */
	String	VERSION_ATTRIBUTE						= "version";

	/**
	 * Manifest header attribute identifying the symbolic name of a bundle that
	 * exports a package specified in the Import-Package manifest header.
	 * 
	 * <p>
	 * The attribute value is encoded in the Import-Package manifest header
	 * like:
	 * 
	 * <pre>
	 *     Import-Package: org.osgi.framework;
	 *       bundle-symbolic-name=&quot;com.acme.module.test&quot;
	 * </pre>
	 * 
	 * @see #IMPORT_PACKAGE
	 * @since 1.3
	 */
	String	BUNDLE_SYMBOLICNAME_ATTRIBUTE			= "bundle-symbolic-name";

	/**
	 * Manifest header directive identifying the resolution type in the
	 * Import-Package, Require-Bundle or Require-Capability manifest header. The
	 * default value is {@link #RESOLUTION_MANDATORY mandatory}.
	 * 
	 * <p>
	 * The directive value is encoded in the Import-Package, Require-Bundle or
	 * Require-Capability manifest header like:
	 * 
	 * <pre>
	 *     Import-Package: org.osgi.framework; resolution:=&quot;optional&quot;
	 *     Require-Bundle: com.acme.module.test; resolution:=&quot;optional&quot;
	 *     Require-Capability: com.acme.capability; resolution:=&quot;optional&quot;
	 * </pre>
	 * 
	 * @see #IMPORT_PACKAGE
	 * @see #REQUIRE_BUNDLE
	 * @see #REQUIRE_CAPABILITY
	 * @see #RESOLUTION_MANDATORY
	 * @see #RESOLUTION_OPTIONAL
	 * @since 1.3
	 */
	String	RESOLUTION_DIRECTIVE					= "resolution";

	/**
	 * Manifest header directive value identifying a mandatory resolution type.
	 * A mandatory resolution type indicates that the import package, require
	 * bundle or require capability must be resolved when the bundle is
	 * resolved. If such an import, require bundle or require capability cannot
	 * be resolved, the module fails to resolve.
	 * 
	 * <p>
	 * The directive value is encoded in the Import-Package, Require-Bundle or
	 * Require-Capability manifest header like:
	 * 
	 * <pre>
	 *     Import-Package: org.osgi.framework; resolution:=&quot;mandatory&quot;
	 *     Require-Bundle: com.acme.module.test; resolution:=&quot;mandatory&quot;
	 *     Require-Capability: com.acme.capability; resolution:=&quot;mandatory&quot;
	 * </pre>
	 * 
	 * @see #RESOLUTION_DIRECTIVE
	 * @since 1.3
	 */
	String	RESOLUTION_MANDATORY					= "mandatory";

	/**
	 * Manifest header directive value identifying an optional resolution type.
	 * An optional resolution type indicates that the import, require bundle or
	 * require capability is optional and the bundle may be resolved without the
	 * import, require bundle or require capability being resolved. If the
	 * import, require bundle or require capability is not resolved when the
	 * bundle is resolved, the import, require bundle or require capability may
	 * not be resolved until the bundle is refreshed.
	 * 
	 * <p>
	 * The directive value is encoded in the Import-Package, Require-Bundle or
	 * Require-Capability manifest header like:
	 * 
	 * <pre>
	 *     Import-Package: org.osgi.framework; resolution:=&quot;optional&quot;
	 *     Require-Bundle: com.acme.module.test; resolution:=&quot;optional&quot;
	 *     Require-Capability: com.acme.capability; resolution:=&quot;optional&quot;
	 * </pre>
	 * 
	 * @see #RESOLUTION_DIRECTIVE
	 * @since 1.3
	 */
	String	RESOLUTION_OPTIONAL						= "optional";

	/**
	 * Manifest header directive identifying a list of packages that an exported
	 * package or provided capability uses.
	 * 
	 * <p>
	 * The directive value is encoded in the Export-Package or
	 * Provide-Capability manifest header like:
	 * 
	 * <pre>
	 *     Export-Package: org.osgi.util.tracker; uses:=&quot;org.osgi.framework&quot;
	 *     Provide-Capability: com.acme.capability; uses:=&quot;com.acme.service&quot;
	 * </pre>
	 * 
	 * @see #EXPORT_PACKAGE
	 * @see #PROVIDE_CAPABILITY
	 * @since 1.3
	 */
	String	USES_DIRECTIVE							= "uses";

	/**
	 * Manifest header directive identifying a list of classes to include in the
	 * exported package.
	 * 
	 * <p>
	 * This directive is used by the Export-Package manifest header to identify
	 * a list of classes of the specified package which must be allowed to be
	 * exported. The directive value is encoded in the Export-Package manifest
	 * header like:
	 * 
	 * <pre>
	 *     Export-Package: org.osgi.framework; include:=&quot;MyClass*&quot;
	 * </pre>
	 * 
	 * <p>
	 * This directive is also used by the Bundle-ActivationPolicy manifest
	 * header to identify the packages from which class loads will trigger lazy
	 * activation. The directive value is encoded in the Bundle-ActivationPolicy
	 * manifest header like:
	 * 
	 * <pre>
	 *     Bundle-ActivationPolicy: lazy; include:=&quot;org.osgi.framework&quot;
	 * </pre>
	 * 
	 * @see #EXPORT_PACKAGE
	 * @see #BUNDLE_ACTIVATIONPOLICY
	 * @since 1.3
	 */
	String	INCLUDE_DIRECTIVE						= "include";

	/**
	 * Manifest header directive identifying a list of classes to exclude in the
	 * exported package..
	 * <p>
	 * This directive is used by the Export-Package manifest header to identify
	 * a list of classes of the specified package which must not be allowed to
	 * be exported. The directive value is encoded in the Export-Package
	 * manifest header like:
	 * 
	 * <pre>
	 *     Export-Package: org.osgi.framework; exclude:=&quot;*Impl&quot;
	 * </pre>
	 * 
	 * <p>
	 * This directive is also used by the Bundle-ActivationPolicy manifest
	 * header to identify the packages from which class loads will not trigger
	 * lazy activation. The directive value is encoded in the
	 * Bundle-ActivationPolicy manifest header like:
	 * 
	 * <pre>
	 *     Bundle-ActivationPolicy: lazy; exclude:=&quot;org.osgi.framework&quot;
	 * </pre>
	 * 
	 * @see #EXPORT_PACKAGE
	 * @see #BUNDLE_ACTIVATIONPOLICY
	 * @since 1.3
	 */
	String	EXCLUDE_DIRECTIVE						= "exclude";

	/**
	 * Manifest header directive identifying names of matching attributes which
	 * must be specified by matching Import-Package statements in the
	 * Export-Package manifest header.
	 * 
	 * <p>
	 * The directive value is encoded in the Export-Package manifest header
	 * like:
	 * 
	 * <pre>
	 *     Export-Package: org.osgi.framework; mandatory:=&quot;bundle-symbolic-name&quot;
	 * </pre>
	 * 
	 * @see #EXPORT_PACKAGE
	 * @since 1.3
	 */
	String	MANDATORY_DIRECTIVE						= "mandatory";

	/**
	 * Manifest header directive identifying the visibility of a required bundle
	 * in the Require-Bundle manifest header. The default value is
	 * {@link #VISIBILITY_PRIVATE private}.
	 * 
	 * <p>
	 * The directive value is encoded in the Require-Bundle manifest header
	 * like:
	 * 
	 * <pre>
	 *     Require-Bundle: com.acme.module.test; visibility:=&quot;reexport&quot;
	 * </pre>
	 * 
	 * @see #REQUIRE_BUNDLE
	 * @see #VISIBILITY_PRIVATE
	 * @see #VISIBILITY_REEXPORT
	 * @since 1.3
	 */
	String	VISIBILITY_DIRECTIVE					= "visibility";

	/**
	 * Manifest header directive value identifying a private visibility type. A
	 * private visibility type indicates that any packages that are exported by
	 * the required bundle are not made visible on the export signature of the
	 * requiring bundle.
	 * 
	 * <p>
	 * The directive value is encoded in the Require-Bundle manifest header
	 * like:
	 * 
	 * <pre>
	 *     Require-Bundle: com.acme.module.test; visibility:=&quot;private&quot;
	 * </pre>
	 * 
	 * @see #VISIBILITY_DIRECTIVE
	 * @since 1.3
	 */
	String	VISIBILITY_PRIVATE						= "private";

	/**
	 * Manifest header directive value identifying a reexport visibility type. A
	 * reexport visibility type indicates any packages that are exported by the
	 * required bundle are re-exported by the requiring bundle. Any arbitrary
	 * matching attributes with which they were exported by the required bundle
	 * are deleted.
	 * <p>
	 * The directive value is encoded in the Require-Bundle manifest header
	 * like:
	 * 
	 * <pre>
	 *     Require-Bundle: com.acme.module.test; visibility:=&quot;reexport&quot;
	 * </pre>
	 * 
	 * @see #VISIBILITY_DIRECTIVE
	 * @since 1.3
	 */
	String	VISIBILITY_REEXPORT						= "reexport";

	/**
	 * Manifest header directive identifying the type of the extension fragment.
	 * 
	 * <p>
	 * The directive value is encoded in the Fragment-Host manifest header like:
	 * 
	 * <pre>
	 *     Fragment-Host: system.bundle; extension:=&quot;framework&quot;
	 * </pre>
	 * 
	 * <p>
	 * The default value is {@link #EXTENSION_FRAMEWORK framework}.
	 * 
	 * @see #FRAGMENT_HOST
	 * @see #EXTENSION_FRAMEWORK
	 * @since 1.3
	 */
	String	EXTENSION_DIRECTIVE						= "extension";

	/**
	 * Manifest header directive value identifying the type of extension
	 * fragment. An extension fragment type of framework indicates that the
	 * extension fragment is to be loaded by the framework's class loader.
	 * 
	 * <p>
	 * The directive value is encoded in the Fragment-Host manifest header like:
	 * 
	 * <pre>
	 *     Fragment-Host: system.bundle; extension:=&quot;framework&quot;
	 * </pre>
	 * 
	 * @see #EXTENSION_DIRECTIVE
	 * @since 1.3
	 */
	String	EXTENSION_FRAMEWORK						= "framework";

	/**
	 * Manifest header directive value identifying the type of extension
	 * fragment. An extension fragment type of bootclasspath indicates that the
	 * extension fragment is to be loaded by the boot class loader.
	 * <p>
	 * The directive value is encoded in the Fragment-Host manifest header like:
	 * 
	 * <pre>
	 *     Fragment-Host: system.bundle; extension:=&quot;bootclasspath&quot;
	 * </pre>
	 * 
	 * @see #EXTENSION_DIRECTIVE
	 * @since 1.3
	 * @deprecated As of 1.9.
	 */
	String	EXTENSION_BOOTCLASSPATH					= "bootclasspath";

	/**
	 * Manifest header identifying the bundle's activation policy.
	 * <p>
	 * The header value may be retrieved from the {@code Dictionary} object
	 * returned by the {@code Bundle.getHeaders} method.
	 * 
	 * @since 1.4
	 * @see #ACTIVATION_LAZY
	 * @see #INCLUDE_DIRECTIVE
	 * @see #EXCLUDE_DIRECTIVE
	 */
	String	BUNDLE_ACTIVATIONPOLICY					= "Bundle-ActivationPolicy";

	/**
	 * Bundle activation policy declaring the bundle must be activated when the
	 * first class load is made from the bundle.
	 * <p>
	 * A bundle with the lazy activation policy that is started with the
	 * {@link Bundle#START_ACTIVATION_POLICY START_ACTIVATION_POLICY} option
	 * will wait in the {@link Bundle#STARTING STARTING} state until the first
	 * class load from the bundle occurs. The bundle will then be activated
	 * before the class is returned to the requester.
	 * <p>
	 * The activation policy value is specified as in the
	 * Bundle-ActivationPolicy manifest header like:
	 * 
	 * <pre>
	 *       Bundle-ActivationPolicy: lazy
	 * </pre>
	 * 
	 * @see #BUNDLE_ACTIVATIONPOLICY
	 * @see Bundle#start(int)
	 * @see Bundle#START_ACTIVATION_POLICY
	 * @since 1.4
	 */
	String	ACTIVATION_LAZY							= "lazy";

	/**
	 * Framework environment property identifying the Framework version.
	 * 
	 * <p>
	 * The value of this property may be retrieved by calling the
	 * {@code BundleContext.getProperty} method.
	 */
	String	FRAMEWORK_VERSION						= "org.osgi.framework.version";

	/**
	 * Framework environment property identifying the Framework implementation
	 * vendor.
	 * 
	 * <p>
	 * The value of this property may be retrieved by calling the
	 * {@code BundleContext.getProperty} method.
	 */
	String	FRAMEWORK_VENDOR						= "org.osgi.framework.vendor";

	/**
	 * Framework launching property identifying the Framework implementation
	 * language (see ISO 639 for possible values).
	 * 
	 * <p>
	 * The value of this property may be retrieved by calling the
	 * {@code BundleContext.getProperty} method.
	 */
	String	FRAMEWORK_LANGUAGE						= "org.osgi.framework.language";

	/**
	 * Framework launching property identifying the Framework host-computer's
	 * operating system.
	 * 
	 * <p>
	 * The value of this property may be retrieved by calling the
	 * {@code BundleContext.getProperty} method.
	 */
	String	FRAMEWORK_OS_NAME						= "org.osgi.framework.os.name";

	/**
	 * Framework launching property identifying the Framework host-computer's
	 * operating system version number.
	 * 
	 * <p>
	 * The value of this property may be retrieved by calling the
	 * {@code BundleContext.getProperty} method.
	 */
	String	FRAMEWORK_OS_VERSION					= "org.osgi.framework.os.version";

	/**
	 * Framework launching property identifying the Framework host-computer's
	 * processor name.
	 * 
	 * <p>
	 * The value of this property may be retrieved by calling the
	 * {@code BundleContext.getProperty} method.
	 */
	String	FRAMEWORK_PROCESSOR						= "org.osgi.framework.processor";

	/**
	 * Framework launching property identifying execution environments provided
	 * by the Framework.
	 * 
	 * <p>
	 * The value of this property may be retrieved by calling the
	 * {@code BundleContext.getProperty} method.
	 * 
	 * @since 1.2
	 * @deprecated As of 1.6. Replaced by the {@code osgi.ee} capability.
	 */
	String	FRAMEWORK_EXECUTIONENVIRONMENT			= "org.osgi.framework.executionenvironment";

	/**
	 * Framework launching property identifying packages for which the Framework
	 * must delegate class loading to the parent class loader of the bundle.
	 * 
	 * <p>
	 * The value of this property may be retrieved by calling the
	 * {@code BundleContext.getProperty} method.
	 * 
	 * @see #FRAMEWORK_BUNDLE_PARENT
	 * @since 1.3
	 */
	String	FRAMEWORK_BOOTDELEGATION				= "org.osgi.framework.bootdelegation";

	/**
	 * Framework launching property identifying packages which the system bundle
	 * must export.
	 * 
	 * <p>
	 * If this property is not specified then the framework must calculate a
	 * reasonable default value for the current execution environment.
	 * 
	 * <p>
	 * The value of this property may be retrieved by calling the
	 * {@code BundleContext.getProperty} method.
	 * 
	 * @since 1.3
	 */
	String	FRAMEWORK_SYSTEMPACKAGES				= "org.osgi.framework.system.packages";

	/**
	 * Framework launching property identifying extra packages which the system
	 * bundle must export from the current execution environment.
	 * 
	 * <p>
	 * This property is useful for configuring extra system packages in addition
	 * to the system packages calculated by the framework.
	 * 
	 * <p>
	 * The value of this property may be retrieved by calling the
	 * {@code BundleContext.getProperty} method.
	 * 
	 * @see #FRAMEWORK_SYSTEMPACKAGES
	 * @since 1.5
	 */
	String	FRAMEWORK_SYSTEMPACKAGES_EXTRA			= "org.osgi.framework.system.packages.extra";

	/**
	 * Framework environment property identifying whether the Framework supports
	 * framework extension bundles.
	 * 
	 * <p>
	 * As of version 1.4, the value of this property must be {@code true}. The
	 * Framework must support framework extension bundles.
	 * 
	 * <p>
	 * The value of this property may be retrieved by calling the
	 * {@code BundleContext.getProperty} method.
	 * 
	 * @since 1.3
	 */
	String	SUPPORTS_FRAMEWORK_EXTENSION			= "org.osgi.supports.framework.extension";

	/**
	 * Framework environment property identifying whether the Framework supports
	 * bootclasspath extension bundles.
	 * <p>
	 * If the value of this property is {@code true}, then the Framework
	 * supports bootclasspath extension bundles. The default value is
	 * {@code false}.
	 * <p>
	 * The value of this property may be retrieved by calling the
	 * {@code BundleContext.getProperty} method.
	 * 
	 * @since 1.3
	 * @deprecated As of 1.10.
	 */
	String	SUPPORTS_BOOTCLASSPATH_EXTENSION		= "org.osgi.supports.bootclasspath.extension";

	/**
	 * Framework environment property identifying whether the Framework supports
	 * fragment bundles.
	 * 
	 * <p>
	 * As of version 1.4, the value of this property must be {@code true}. The
	 * Framework must support fragment bundles.
	 * <p>
	 * The value of this property may be retrieved by calling the
	 * {@code BundleContext.getProperty} method.
	 * 
	 * @since 1.3
	 */
	String	SUPPORTS_FRAMEWORK_FRAGMENT				= "org.osgi.supports.framework.fragment";

	/**
	 * Framework environment property identifying whether the Framework supports
	 * the {@link #REQUIRE_BUNDLE Require-Bundle} manifest header.
	 * 
	 * <p>
	 * As of version 1.4, the value of this property must be {@code true}. The
	 * Framework must support the {@code Require-Bundle} manifest header.
	 * <p>
	 * The value of this property may be retrieved by calling the
	 * {@code BundleContext.getProperty} method.
	 * 
	 * @since 1.3
	 */
	String	SUPPORTS_FRAMEWORK_REQUIREBUNDLE		= "org.osgi.supports.framework.requirebundle";

	/**
	 * Framework launching property specifying the type of security manager the
	 * framework must use. If not specified then the framework will not set the
	 * VM security manager.
	 * 
	 * @see #FRAMEWORK_SECURITY_OSGI
	 * @since 1.5
	 */
	String	FRAMEWORK_SECURITY						= "org.osgi.framework.security";

	/**
	 * Specifies that a security manager that supports all security aspects of
	 * the OSGi core specification including postponed conditions must be
	 * installed.
	 * 
	 * <p>
	 * If this value is specified and there is a security manager already
	 * installed, then a {@code SecurityException} must be thrown when the
	 * Framework is initialized.
	 * 
	 * @see #FRAMEWORK_SECURITY
	 * @since 1.5
	 */
	String	FRAMEWORK_SECURITY_OSGI					= "osgi";

	/**
	 * Framework launching property specifying the persistent storage area used
	 * by the framework. The value of this property must be a valid file path in
	 * the file system to a directory. If the specified directory does not exist
	 * then the framework will create the directory. If the specified path
	 * exists but is not a directory or if the framework fails to create the
	 * storage directory, then framework initialization must fail. The framework
	 * is free to use this directory as it sees fit. This area can not be shared
	 * with anything else.
	 * <p>
	 * If this property is not set, the framework should use a reasonable
	 * platform default for the persistent storage area.
	 * 
	 * @since 1.5
	 */
	String	FRAMEWORK_STORAGE						= "org.osgi.framework.storage";

	/**
	 * Framework launching property specifying if and when the persistent
	 * storage area for the framework should be cleaned. If this property is not
	 * set, then the framework storage area must not be cleaned.
	 * 
	 * @see #FRAMEWORK_STORAGE_CLEAN_ONFIRSTINIT
	 * @since 1.5
	 */
	String	FRAMEWORK_STORAGE_CLEAN					= "org.osgi.framework.storage.clean";

	/**
	 * Specifies that the framework storage area must be cleaned before the
	 * framework is initialized for the first time. Subsequent inits, starts or
	 * updates of the framework will not result in cleaning the framework
	 * storage area.
	 * 
	 * @since 1.5
	 */
	String	FRAMEWORK_STORAGE_CLEAN_ONFIRSTINIT		= "onFirstInit";

	/**
	 * Framework launching property specifying a comma separated list of
	 * additional library file extensions that must be used when a bundle's
	 * class loader is searching for native libraries. If this property is not
	 * set, then only the library name returned by
	 * {@code System.mapLibraryName(String)} will be used to search. This is
	 * needed for certain operating systems which allow more than one extension
	 * for a library. For example, AIX allows library extensions of {@code .a}
	 * and {@code .so}, but {@code System.mapLibraryName(String)} will only
	 * return names with the {@code .a} extension.
	 * 
	 * @since 1.5
	 */
	String	FRAMEWORK_LIBRARY_EXTENSIONS			= "org.osgi.framework.library.extensions";

	/**
	 * Framework launching property specifying an optional OS specific command
	 * to set file permissions on extracted native code. On some operating
	 * systems, it is required that native libraries be set to executable. This
	 * optional property allows you to specify the command. For example, on a
	 * UNIX style OS, this property could have the following value.
	 * 
	 * <pre>
	 * chmod +rx ${abspath}
	 * </pre>
	 * 
	 * The <code>${abspath}</code> is used by the framework to substitute the
	 * actual absolute file path.
	 * 
	 * @since 1.5
	 */
	String	FRAMEWORK_EXECPERMISSION				= "org.osgi.framework.command.execpermission";

	/**
	 * Specified the substitution string for the absolute path of a file.
	 * 
	 * @see #FRAMEWORK_EXECPERMISSION
	 * @since 1.6
	 */
	String	FRAMEWORK_COMMAND_ABSPATH				= "abspath";

	/**
	 * Framework launching property specifying the trust repositories used by
	 * the framework. The value is a {@code java.io.File.pathSeparator}
	 * separated list of valid file paths to files that contain key stores. Key
	 * stores of type {@code JKS} must be supported and other key store types
	 * may be supported. The framework will use the key stores as trust
	 * repositories to authenticate certificates of trusted signers. The key
	 * stores are only used as read-only trust repositories to access public
	 * keys. No passwords are required to access the key stores' public keys.
	 * <p>
	 * Note that framework implementations are allowed to use other trust
	 * repositories in addition to the trust repositories specified by this
	 * property. How these other trust repositories are configured and populated
	 * is implementation specific.
	 * 
	 * @since 1.5
	 */
	String	FRAMEWORK_TRUST_REPOSITORIES			= "org.osgi.framework.trust.repositories";

	/**
	 * Framework launching property specifying the current windowing system. The
	 * framework should provide a reasonable default if this is not set.
	 * 
	 * @since 1.5
	 */
	String	FRAMEWORK_WINDOWSYSTEM					= "org.osgi.framework.windowsystem";

	/**
	 * Framework launching property specifying the beginning start level of the
	 * framework.
	 * 
	 * @see "Core Specification, Starting the Framework."
	 * @since 1.5
	 */
	String	FRAMEWORK_BEGINNING_STARTLEVEL			= "org.osgi.framework.startlevel.beginning";

	/**
	 * Framework launching property specifying the parent class loader type for
	 * all bundle class loaders. Default value is
	 * {@link #FRAMEWORK_BUNDLE_PARENT_BOOT boot}.
	 * 
	 * @see #FRAMEWORK_BUNDLE_PARENT_BOOT
	 * @see #FRAMEWORK_BUNDLE_PARENT_EXT
	 * @see #FRAMEWORK_BUNDLE_PARENT_APP
	 * @see #FRAMEWORK_BUNDLE_PARENT_FRAMEWORK
	 * @since 1.5
	 */
	String	FRAMEWORK_BUNDLE_PARENT					= "org.osgi.framework.bundle.parent";

	/**
	 * Specifies to use of the boot class loader as the parent class loader for
	 * all bundle class loaders.
	 * 
	 * @since 1.5
	 * @see #FRAMEWORK_BUNDLE_PARENT
	 */
	String	FRAMEWORK_BUNDLE_PARENT_BOOT			= "boot";

	/**
	 * Specifies to use the extension class loader as the parent class loader
	 * for all bundle class loaders.
	 * 
	 * @since 1.5
	 * @see #FRAMEWORK_BUNDLE_PARENT
	 */
	String	FRAMEWORK_BUNDLE_PARENT_EXT				= "ext";

	/**
	 * Specifies to use the application class loader as the parent class loader
	 * for all bundle class loaders. Depending on how the framework is launched,
	 * this may refer to the same class loader as
	 * {@link #FRAMEWORK_BUNDLE_PARENT_FRAMEWORK}.
	 * 
	 * @since 1.5
	 * @see #FRAMEWORK_BUNDLE_PARENT
	 */
	String	FRAMEWORK_BUNDLE_PARENT_APP				= "app";

	/**
	 * Specifies to use the framework class loader as the parent class loader
	 * for all bundle class loaders. The framework class loader is the class
	 * loader used to load the framework implementation. Depending on how the
	 * framework is launched, this may refer to the same class loader as
	 * {@link #FRAMEWORK_BUNDLE_PARENT_APP}.
	 * 
	 * @since 1.5
	 * @see #FRAMEWORK_BUNDLE_PARENT
	 */
	String	FRAMEWORK_BUNDLE_PARENT_FRAMEWORK		= "framework";

	/*
	 * Service properties.
	 */

	/**
	 * Service property identifying all of the class names under which a service
	 * was registered in the Framework. The value of this property must be of
	 * type {@code String[]}.
	 * 
	 * <p>
	 * This property is set by the Framework when a service is registered.
	 */
	String	OBJECTCLASS								= "objectClass";

	/**
	 * Service property identifying a service's registration number. The value
	 * of this property must be of type {@code Long}.
	 * 
	 * <p>
	 * The value of this property is assigned by the Framework when a service is
	 * registered. The Framework assigns a unique, non-negative value that is
	 * larger than all previously assigned values since the Framework was
	 * started. These values are NOT persistent across restarts of the
	 * Framework.
	 */
	String	SERVICE_ID								= "service.id";

	/**
	 * Service property identifying a service's persistent identifier.
	 * 
	 * <p>
	 * This property may be supplied in the {@code properties}
	 * {@code Dictionary} object passed to the
	 * {@code BundleContext.registerService} method. The value of this property
	 * must be of type {@code String}, {@code String[]}, or {@code Collection}
	 * of {@code String}.
	 * 
	 * <p>
	 * A service's persistent identifier uniquely identifies the service and
	 * persists across multiple Framework invocations.
	 * 
	 * <p>
	 * By convention, every bundle has its own unique namespace, starting with
	 * the bundle's identifier (see {@link Bundle#getBundleId()}) and followed
	 * by a dot (.). A bundle may use this as the prefix of the persistent
	 * identifiers for the services it registers.
	 */
	String	SERVICE_PID								= "service.pid";

	/**
	 * Service property identifying a service's ranking number.
	 * 
	 * <p>
	 * This property may be supplied in the {@code properties
	 * Dictionary} object passed to the {@code BundleContext.registerService}
	 * method. The value of this property must be of type {@code Integer}.
	 * 
	 * <p>
	 * The service ranking is used by the Framework to determine the <i>natural
	 * order</i> of services, see {@link ServiceReference#compareTo(Object)},
	 * and the <i>default</i> service to be returned from a call to the
	 * {@link BundleContext#getServiceReference(Class)} or
	 * {@link BundleContext#getServiceReference(String)} method.
	 * 
	 * <p>
	 * The default ranking is zero (0). A service with a ranking of
	 * {@code Integer.MAX_VALUE} is very likely to be returned as the default
	 * service, whereas a service with a ranking of {@code Integer.MIN_VALUE} is
	 * very unlikely to be returned.
	 * 
	 * <p>
	 * If the supplied property value is not of type {@code Integer}, it is
	 * deemed to have a ranking value of zero.
	 */
	String	SERVICE_RANKING							= "service.ranking";

	/**
	 * Service property identifying a service's vendor.
	 * 
	 * <p>
	 * This property may be supplied in the properties {@code Dictionary} object
	 * passed to the {@code BundleContext.registerService} method.
	 */
	String	SERVICE_VENDOR							= "service.vendor";

	/**
	 * Service property identifying a service's description.
	 * 
	 * <p>
	 * This property may be supplied in the properties {@code Dictionary} object
	 * passed to the {@code BundleContext.registerService} method.
	 */
	String	SERVICE_DESCRIPTION						= "service.description";

	/**
	 * Service property identifying the {@link Bundle#getBundleId() bundle id}
	 * of the {@link ServiceReference#getBundle() bundle registering the
	 * service}.
	 * 
	 * <p>
	 * This property is set by the Framework when a service is registered. The
	 * value of this property must be of type {@code Long}.
	 * 
	 * @since 1.8
	 */
	String	SERVICE_BUNDLEID						= "service.bundleid";

	/**
	 * Service property identifying a service's scope.
	 * 
	 * <p>
	 * This property is set by the Framework when a service is registered. If
	 * the registered object implements {@link PrototypeServiceFactory}, then
	 * the value of this service property will be {@link #SCOPE_PROTOTYPE}.
	 * Otherwise, if the registered object implements {@link ServiceFactory},
	 * then the value of this service property will be {@link #SCOPE_BUNDLE}.
	 * Otherwise, the value of this service property will be
	 * {@link #SCOPE_SINGLETON}.
	 * 
	 * @since 1.8
	 * @see #SCOPE_SINGLETON
	 * @see #SCOPE_BUNDLE
	 * @see #SCOPE_PROTOTYPE
	 */
	String	SERVICE_SCOPE							= "service.scope";

	/**
	 * Service scope is singleton. All bundles using the service receive the
	 * same service object.
	 * 
	 * @since 1.8
	 * @see #SERVICE_SCOPE
	 */
	String	SCOPE_SINGLETON							= "singleton";

	/**
	 * Service scope is bundle. Each bundle using the service receives a
	 * customized service object.
	 * 
	 * @since 1.8
	 * @see #SERVICE_SCOPE
	 */
	String	SCOPE_BUNDLE							= "bundle";

	/**
	 * Service scope is prototype. Each bundle using the service receives either
	 * a customized service object or can request multiple customized service
	 * objects via {@link ServiceObjects}.
	 * 
	 * @since 1.8
	 * @see #SERVICE_SCOPE
	 */
	String	SCOPE_PROTOTYPE							= "prototype";

	/**
	 * Framework environment property identifying the Framework's universally
	 * unique identifier (UUID). A UUID represents a 128-bit value. A new UUID
	 * is generated by the {@link Framework#init()} method each time a framework
	 * is initialized. The value of this property must conform to the UUID
	 * string representation specified in <a
	 * href="http://www.ietf.org/rfc/rfc4122.txt">RFC 4122</a>.
	 * 
	 * <p>
	 * The value of this property may be retrieved by calling the
	 * {@code BundleContext.getProperty} method.
	 * 
	 * @since 1.6
	 */
	String	FRAMEWORK_UUID							= "org.osgi.framework.uuid";

	/**
	 * Service property identifying the configuration types supported by a
	 * distribution provider. Registered by the distribution provider on one of
	 * its services to indicate the supported configuration types.
	 * 
	 * <p>
	 * The value of this property must be of type {@code String},
	 * {@code String[]}, or {@code Collection} of {@code String}.
	 * 
	 * @since 1.6
	 * @see "Remote Services Specification"
	 */
	String	REMOTE_CONFIGS_SUPPORTED				= "remote.configs.supported";

	/**
	 * Service property identifying the intents supported by a distribution
	 * provider. Registered by the distribution provider on one of its services
	 * to indicate the vocabulary of implemented intents.
	 * 
	 * <p>
	 * The value of this property must be of type {@code String},
	 * {@code String[]}, or {@code Collection} of {@code String}.
	 * 
	 * @since 1.6
	 * @see "Remote Services Specification"
	 */
	String	REMOTE_INTENTS_SUPPORTED				= "remote.intents.supported";

	/**
	 * Service property identifying the configuration types that should be used
	 * to export the service. Each configuration type represents the
	 * configuration parameters for an endpoint. A distribution provider should
	 * create an endpoint for each configuration type that it supports.
	 * 
	 * <p>
	 * This property may be supplied in the {@code properties}
	 * {@code Dictionary} object passed to the
	 * {@code BundleContext.registerService} method. The value of this property
	 * must be of type {@code String}, {@code String[]}, or {@code Collection}
	 * of {@code String}.
	 * 
	 * @since 1.6
	 * @see "Remote Services Specification"
	 */
	String	SERVICE_EXPORTED_CONFIGS				= "service.exported.configs";

	/**
	 * Service property identifying the intents that the distribution provider
	 * must implement to distribute the service. Intents listed in this property
	 * are reserved for intents that are critical for the code to function
	 * correctly, for example, ordering of messages. These intents should not be
	 * configurable.
	 * 
	 * <p>
	 * This property may be supplied in the {@code properties}
	 * {@code Dictionary} object passed to the
	 * {@code BundleContext.registerService} method. The value of this property
	 * must be of type {@code String}, {@code String[]}, or {@code Collection}
	 * of {@code String}.
	 * 
	 * @since 1.6
	 * @see "Remote Services Specification"
	 */
	String	SERVICE_EXPORTED_INTENTS				= "service.exported.intents";

	/**
	 * Service property identifying the extra intents that the distribution
	 * provider must implement to distribute the service. This property is
	 * merged with the {@code service.exported.intents} property before the
	 * distribution provider interprets the listed intents; it has therefore the
	 * same semantics but the property should be configurable so the
	 * administrator can choose the intents based on the topology. Bundles
	 * should therefore make this property configurable, for example through the
	 * Configuration Admin service.
	 * 
	 * <p>
	 * This property may be supplied in the {@code properties}
	 * {@code Dictionary} object passed to the
	 * {@code BundleContext.registerService} method. The value of this property
	 * must be of type {@code String}, {@code String[]}, or {@code Collection}
	 * of {@code String}.
	 * 
	 * @since 1.6
	 * @see "Remote Services Specification"
	 */
	String	SERVICE_EXPORTED_INTENTS_EXTRA			= "service.exported.intents.extra";

	/**
	 * Service property marking the service for export. It defines the
	 * interfaces under which this service can be exported. This list must be a
	 * subset of the types under which the service was registered. The single
	 * value of an asterisk ({@code '*'} &#92;u002A) indicates all the interface
	 * types under which the service was registered excluding the non-interface
	 * types. It is strongly recommended to only export interface types and not
	 * concrete classes due to the complexity of creating proxies for some type
	 * of concrete classes.
	 * 
	 * <p>
	 * This property may be supplied in the {@code properties}
	 * {@code Dictionary} object passed to the
	 * {@code BundleContext.registerService} method. The value of this property
	 * must be of type {@code String}, {@code String[]}, or {@code Collection}
	 * of {@code String}.
	 * 
	 * @since 1.6
	 * @see "Remote Services Specification"
	 */
	String	SERVICE_EXPORTED_INTERFACES				= "service.exported.interfaces";

	/**
	 * Service property identifying the service as imported. This service
	 * property must be set by a distribution provider to any value when it
	 * registers the endpoint proxy as an imported service. A bundle can use
	 * this property to filter out imported services.
	 * 
	 * <p>
	 * The value of this property may be of any type.
	 * 
	 * @since 1.6
	 * @see "Remote Services Specification"
	 */
	String	SERVICE_IMPORTED						= "service.imported";

	/**
	 * Service property identifying the configuration types used to import the
	 * service. Any associated properties for this configuration types must be
	 * properly mapped to the importing system. For example, a URL in these
	 * properties must point to a valid resource when used in the importing
	 * framework. If multiple configuration types are listed in this property,
	 * then they must be synonyms for exactly the same remote endpoint that is
	 * used to export this service.
	 * 
	 * <p>
	 * The value of this property must be of type {@code String},
	 * {@code String[]}, or {@code Collection} of {@code String}.
	 * 
	 * @since 1.6
	 * @see "Remote Services Specification"
	 * @see #SERVICE_EXPORTED_CONFIGS
	 */
	String	SERVICE_IMPORTED_CONFIGS				= "service.imported.configs";

	/**
	 * Service property identifying the intents that this service implements.
	 * This property has a dual purpose:
	 * <ul>
	 * <li>A bundle can use this service property to notify the distribution
	 * provider that these intents are already implemented by the exported
	 * service object.</li>
	 * <li>A distribution provider must use this property to convey the combined
	 * intents of: the exporting service, the intents that the exporting
	 * distribution provider adds, and the intents that the importing
	 * distribution provider adds.</li>
	 * </ul>
	 * 
	 * To export a service, a distribution provider must expand any qualified
	 * intents. Both the exporting and importing distribution providers must
	 * recognize all intents before a service can be distributed.
	 * 
	 * <p>
	 * The value of this property must be of type {@code String},
	 * {@code String[]}, or {@code Collection} of {@code String}.
	 * 
	 * @since 1.6
	 * @see "Remote Services Specification"
	 */
	String	SERVICE_INTENTS							= "service.intents";

	/**
	 * Manifest header identifying the capabilities that the bundle offers to
	 * provide to other bundles.
	 * 
	 * <p>
	 * The header value may be retrieved from the {@code Dictionary} object
	 * returned by the {@code Bundle.getHeaders} method.
	 * 
	 * @since 1.6
	 */
	String	PROVIDE_CAPABILITY						= "Provide-Capability";

	/**
	 * Manifest header identifying the capabilities on which the bundle depends.
	 * 
	 * <p>
	 * The header value may be retrieved from the {@code Dictionary} object
	 * returned by the {@code Bundle.getHeaders} method.
	 * 
	 * @since 1.6
	 */
	String	REQUIRE_CAPABILITY						= "Require-Capability";

	/**
	 * Manifest header directive identifying the effective time of the provided
	 * capability. The default value is {@link #EFFECTIVE_RESOLVE resolve}.
	 * 
	 * <p>
	 * The directive value is encoded in the Provide-Capability manifest header
	 * like:
	 * 
	 * <pre>
	 *     Provide-Capability: com.acme.capability; effective:=&quot;resolve&quot;
	 * </pre>
	 * 
	 * @see #PROVIDE_CAPABILITY
	 * @see #EFFECTIVE_RESOLVE
	 * @see #EFFECTIVE_ACTIVE
	 * @since 1.6
	 */
	String	EFFECTIVE_DIRECTIVE						= "effective";

	/**
	 * Manifest header directive value identifying a capability that is
	 * effective at resolve time. Capabilities with an effective time of resolve
	 * are the only capabilities which are processed by the resolver.
	 * 
	 * <p>
	 * The directive value is encoded in the Provide-Capability manifest header
	 * like:
	 * 
	 * <pre>
	 *     Provide-Capability: com.acme.capability; effective:=&quot;resolve&quot;
	 * </pre>
	 * 
	 * @see #EFFECTIVE_DIRECTIVE
	 * @since 1.6
	 */
	String	EFFECTIVE_RESOLVE						= "resolve";

	/**
	 * Manifest header directive value identifying a capability that is
	 * effective at active time. Capabilities with an effective time of active
	 * are ignored by the resolver.
	 * 
	 * <p>
	 * The directive value is encoded in the Provide-Capability manifest header
	 * like:
	 * 
	 * <pre>
	 *     Provide-Capability: com.acme.capability; effective:=&quot;active&quot;
	 * </pre>
	 * 
	 * @see #EFFECTIVE_DIRECTIVE
	 * @since 1.6
	 */
	String	EFFECTIVE_ACTIVE						= "active";

	/**
	 * Manifest header directive identifying the capability filter specified in
	 * the Require-Capability manifest header.
	 * 
	 * <p>
	 * The directive value is encoded in the Require-Capability manifest header
	 * like:
	 * 
	 * <pre>
	 *     Require-Capability: com.acme.capability; filter:=&quot;(someattr=somevalue)&quot;
	 * </pre>
	 * 
	 * @see #REQUIRE_CAPABILITY
	 * @since 1.6
	 */
	String	FILTER_DIRECTIVE						= "filter";

	/**
	 * Framework launching property identifying capabilities which the system
	 * bundle must provide.
	 * 
	 * <p>
	 * If this property is not specified then the framework must calculate a
	 * reasonable default value for the current execution environment.
	 * 
	 * <p>
	 * The value of this property may be retrieved by calling the
	 * {@code BundleContext.getProperty} method.
	 * 
	 * @since 1.6
	 */
	String	FRAMEWORK_SYSTEMCAPABILITIES			= "org.osgi.framework.system.capabilities";

	/**
	 * Framework launching property identifying extra capabilities which the
	 * system bundle must additionally provide.
	 * 
	 * <p>
	 * This property is useful for configuring extra system capabilities in
	 * addition to the system capabilities calculated by the framework.
	 * 
	 * <p>
	 * The value of this property may be retrieved by calling the
	 * {@code BundleContext.getProperty} method.
	 * 
	 * @see #FRAMEWORK_SYSTEMCAPABILITIES
	 * @since 1.6
	 */
	String	FRAMEWORK_SYSTEMCAPABILITIES_EXTRA		= "org.osgi.framework.system.capabilities.extra";

	/**
	 * Framework launching property specifying whether multiple bundles having
	 * the same {@link #BUNDLE_SYMBOLICNAME symbolic name} and
	 * {@link #BUNDLE_VERSION version} may be installed.
	 * 
	 * <p>
	 * Default value is {@link #FRAMEWORK_BSNVERSION_MANAGED managed} in this
	 * release of the specification. This default may change in a future
	 * specification release. Therefore, code must not assume the default
	 * behavior is {@code managed} and should interrogate the value of this
	 * property to determine the behavior.
	 * 
	 * <p>
	 * The value of this property may be retrieved by calling the
	 * {@code BundleContext.getProperty} method.
	 * 
	 * @see #FRAMEWORK_BSNVERSION_MULTIPLE
	 * @see #FRAMEWORK_BSNVERSION_SINGLE
	 * @see #FRAMEWORK_BSNVERSION_MANAGED
	 * @since 1.6
	 */
	String	FRAMEWORK_BSNVERSION					= "org.osgi.framework.bsnversion";

	/**
	 * Specifies the framework will allow multiple bundles to be installed
	 * having the same symbolic name and version.
	 * 
	 * @since 1.6
	 * @see #FRAMEWORK_BSNVERSION
	 */
	String	FRAMEWORK_BSNVERSION_MULTIPLE			= "multiple";

	/**
	 * Specifies the framework will only allow a single bundle to be installed
	 * for a given symbolic name and version. It will be an error to install a
	 * bundle or update a bundle to have the same symbolic name and version as
	 * another installed bundle.
	 * 
	 * @since 1.6
	 * @see #FRAMEWORK_BSNVERSION
	 * @see BundleException#DUPLICATE_BUNDLE_ERROR
	 */
	String	FRAMEWORK_BSNVERSION_SINGLE				= "single";

	/**
	 * Specifies the framework must consult the {@link CollisionHook bundle
	 * collision hook} services to determine if it will be an error to install a
	 * bundle or update a bundle to have the same symbolic name and version as
	 * another installed bundle. If no bundle collision hook services are
	 * registered, then it will be an error to install a bundle or update a
	 * bundle to have the same symbolic name and version as another installed
	 * bundle.
	 * 
	 * @since 1.7
	 * @see #FRAMEWORK_BSNVERSION
	 * @see BundleException#DUPLICATE_BUNDLE_ERROR
	 */
	String	FRAMEWORK_BSNVERSION_MANAGED			= "managed";

	/**
	 * Manifest header identifying the bundle's icon URLs.
	 * 
	 * <p>
	 * The header value may be retrieved from the {@code Dictionary} object
	 * returned by the {@code Bundle.getHeaders} method.
	 * 
	 * @since 1.8
	 */
	String	BUNDLE_ICON								= "Bundle-Icon";

	/**
	 * Manifest header identifying the bundle's license information.
	 * 
	 * <p>
	 * The header value may be retrieved from the {@code Dictionary} object
	 * returned by the {@code Bundle.getHeaders} method.
	 * 
	 * @since 1.8
	 */
	String	BUNDLE_LICENSE							= "Bundle-License";

	/**
	 * Manifest header identifying the bundle's developers.
	 * <p>
	 * The header value may be retrieved from the {@code Dictionary} object
	 * returned by the {@code Bundle.getHeaders} method.
	 * 
	 * @since 1.9
	 */
	String	BUNDLE_DEVELOPERS						= "Bundle-Developers";

	/**
	 * Manifest header identifying the bundle's software configuration
	 * management system.
	 * <p>
	 * The header value may be retrieved from the {@code Dictionary} object
	 * returned by the {@code Bundle.getHeaders} method.
	 * 
	 * @since 1.9
	 */
	String	BUNDLE_SCM								= "Bundle-SCM";

	/**
	 * Service property identifying the monotonically increasing change count of
	 * a service.
	 * <p>
	 * A service may provide this property to indicate there has been a change
	 * in some data provided by the service. The change count must be
	 * incremented with a positive value every time the data provided by the
	 * service is changed. The service announces the modified change count by
	 * updating its service properties with the new value for this service
	 * property.
	 * <p>
	 * The value of this property must be of type {@code Long}.
	 * 
	 * @since 1.9
	 */
	String	SERVICE_CHANGECOUNT						= "service.changecount";

	/**
	 * Intent supported by Remote Services implementations that support Basic
	 * Remote Services as defined for the {@code osgi.basic} intent.
	 * 
	 * @since 1.9
	 */
	String	INTENT_BASIC							= "osgi.basic";

	/**
	 * Intent supported by Remote Service implementations that support
	 * Asynchronous Remote Services as defined for the {@code osgi.async}
	 * intent.
	 * 
	 * @since 1.9
	 */
	String	INTENT_ASYNC							= "osgi.async";

	/**
	 * Intent supported by Remote Service implementation that provide
	 * confidential communications as defined for the {@code osgi.confidential}
	 * intent.
	 * 
	 * @since 1.9
	 */
	String	INTENT_CONFIDENTIAL						= "osgi.confidential";

	/**
	 * Intent supported by Remote Service implementations that provide private
	 * communications as defined for the {@code osgi.private} intent.
	 * 
	 * @since 1.9
	 */
	String	INTENT_PRIVATE							= "osgi.private";
}
