/*
 * Copyright (c) OSGi Alliance (2004, 2014). 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.component;

import java.util.Dictionary;
import org.osgi.annotation.versioning.ProviderType;

/**
 * When a component is declared with the {@code factory} attribute on its
 * {@code component} element, Service Component Runtime will register a
 * Component Factory service to allow new component configurations to be created
 * and activated rather than automatically creating and activating component
 * configuration as necessary.
 * 
 * @ThreadSafe
 * @author $Id: a6422fc517a31533b1188d5ab9d9ee95a7a52c8a $
 */
@ProviderType
public interface ComponentFactory {
	/**
	 * Create and activate a new component configuration. Additional properties
	 * may be provided for the component configuration.
	 * 
	 * @param properties Additional properties for the component configuration
	 *        or {@code null} if there are no additional properties.
	 * @return A {@code ComponentInstance} object encapsulating the component
	 *         instance of the component configuration. The component
	 *         configuration has been activated and, if the component specifies
	 *         a {@code service} element, the component instance has been
	 *         registered as a service.
	 * @throws ComponentException If Service Component Runtime is unable to
	 *         activate the component configuration.
	 */
	public ComponentInstance newInstance(Dictionary<String, ?> properties);
}
