/*
 * Copyright (c) OSGi Alliance (2009, 2010). 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.service.remoteserviceadmin;

import org.osgi.framework.Constants;

/**
 * Provide the definition of the constants used in the Remote Service Admin
 * specification.
 * 
 * @Immutable
 * @version $Id: 03766065c89cec9d6b51caf9617d024fd18e4bc4 $
 */
public class RemoteConstants {
	private RemoteConstants() {
		// non-instantiable
	}

	/**
	 * 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}.
	 * 
	 * @see "Remote Services Specification"
	 */
	public static final String	REMOTE_CONFIGS_SUPPORTED		= Constants.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}.
	 * 
	 * @see "Remote Services Specification"
	 */
	public static final String	REMOTE_INTENTS_SUPPORTED		= Constants.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}.
	 * 
	 * @see "Remote Services Specification"
	 */
	public static final String	SERVICE_EXPORTED_CONFIGS		= Constants.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}.
	 * 
	 * @see "Remote Services Specification"
	 */
	public static final String	SERVICE_EXPORTED_INTENTS		= Constants.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}.
	 * 
	 * @see "Remote Services Specification"
	 */
	public static final String	SERVICE_EXPORTED_INTENTS_EXTRA	= Constants.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 (&quot;*&quot;, &#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}.
	 * 
	 * @see "Remote Services Specification"
	 */
	public static final String	SERVICE_EXPORTED_INTERFACES		= Constants.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.
	 * 
	 * @see "Remote Services Specification"
	 */
	public static final String	SERVICE_IMPORTED				= Constants.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}.
	 * 
	 * @see "Remote Services Specification"
	 * @see #SERVICE_EXPORTED_CONFIGS
	 */
	public static final String	SERVICE_IMPORTED_CONFIGS		= Constants.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, and 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.
	 * 
	 * The value of this property must be of type {@code String},
	 * {@code String[]}, or {@code Collection} of {@code String}.
	 * 
	 * @see "Remote Services Specification"
	 */
	public static final String	SERVICE_INTENTS					= Constants.SERVICE_INTENTS;

	/* The above are from Ch. 13 Remote Services specification. */

	/**
	 * Endpoint property identifying the id for this endpoint. This service
	 * property must always be set.
	 * 
	 * <p>
	 * The value of this property must be of type {@code String}.
	 */
	public final static String	ENDPOINT_ID						= "endpoint.id";

	/**
	 * Endpoint property identifying the service id of the exported service. Can
	 * be absent or 0 if the corresponding endpoint is not for an OSGi service.
	 * 
	 * <p>
	 * The value of this property must be of type {@code Long}.
	 */
	public final static String	ENDPOINT_SERVICE_ID				= "endpoint.service.id";

	/**
	 * Endpoint property identifying the universally unique id of the exporting
	 * framework. Can be absent if the corresponding endpoint is not for an OSGi
	 * service.
	 * 
	 * <p>
	 * The value of this property must be of type {@code String}.
	 */
	public final static String	ENDPOINT_FRAMEWORK_UUID			= "endpoint.framework.uuid";

	/**
	 * Prefix for an endpoint property identifying the interface Java package
	 * version for an interface. For example, the property
	 * {@code endpoint.package.version.com.acme=1.3} describes the version
	 * of the package for the {@code com.acme.Foo} interface. This endpoint
	 * property for an interface package does not have to be set. If not set,
	 * the value must be assumed to be 0.
	 * 
	 * <p>
	 * Since endpoint properties are stored in a case insensitive map, case
	 * variants of a package name are folded together.
	 * 
	 * <p>
	 * The value of properties having this prefix must be of type
	 * {@code String}.
	 */
	public final static String	ENDPOINT_PACKAGE_VERSION_		= "endpoint.package.version.";
}
