/*
 * Copyright (c) OSGi Alliance (2000, 2018). 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: 41e648afb56767a610f279a9c7effef47dfcbf2e $
 */
@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
	 */
	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 implement.
	 * 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 optional 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";
}
