blob: ee94ed2a61706f1a5295c87fc878125dc72a8dd3 [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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.apache.aries.blueprint;
import java.util.List;
import java.util.Set;
import org.osgi.service.blueprint.reflect.ComponentMetadata;
import org.osgi.service.blueprint.reflect.Target;
public interface ComponentDefinitionRegistry {
/**
* Determine if the component registry contains a component definition for the given id
* @param id
* @return
*/
boolean containsComponentDefinition(String id);
/**
* Retrieve a component's metadata by id
* @param id The id of the component. This is either the id specified in the Blueprint xml or the
* generated id of an unnamed component
* @return the <code>ComponentMetadata</code> or <code>null</code> if the id does not match
* any registered component
*/
ComponentMetadata getComponentDefinition(String id);
/**
* Returns a set of the id of top-level blueprint components (both named and unnamed).
*
* The ids of unnamed components are Blueprint generated. Anonymous components, which have no
* id, are not part of the set.
* @return
*/
Set<String> getComponentDefinitionNames();
/**
* Register a new component
*
* The <code>ComponentMetadata</code> argument must have an id. So unnamed components should have an id
* generated prior to invoking this method. Also, no component definition may already be registered
* under the same id.
*
* @param component the component to be registered
* @throws IllegalArgumentException if the component has no id
* @throws ComponentNameAlreadyInUseException if there already exists a component definition
* in the registry with the same id
*/
void registerComponentDefinition(ComponentMetadata component);
/**
* Remove the component definition with a given id
*
* If no component is registered under the id, this method is a no-op.
* @param id the id of the component definition to be removed
*/
void removeComponentDefinition(String id);
void registerTypeConverter(Target component);
List<Target> getTypeConverters();
/**
* Register an interceptor for a given component
*
* Since the interceptor is registered against a <code>ComponentMetadata</code> instance and not an id,
* interceptors can be registered for anonymous components as well as named and unnamed components.
*
* Note: Although an interceptor is registered against a specific <code>ComponentMetadata</code> instance,
* an interceptor should not rely on this fact. This will allow <code>NamespaceHandlers</code> and
* <code>ComponentDefinitionRegistryProcessors</code> to respect registered interceptors even when
* the actual <code>ComponentMetadata</code> instance is changed or augmented. If an interceptor does
* not support such a scenario it should nevertheless fail gracefully in the case of modified
* <code>ComponentMetadata</code> instances.
*
* Note: at the time of this writing (version 0.1) interceptors are only supported for <code>BeanMetadata</code>.
* Interceptors registered against other component types will be ignored.
*
* @param component the component the interceptor is to be registered against
* @param interceptor the interceptor to be used
*/
void registerInterceptorWithComponent(ComponentMetadata component, Interceptor interceptor);
/**
* Retrieve all interceptors registered against a <code>ComponentMetadata</code> instance
* @param component
* @return a list of interceptors sorted by decreasing rank. The list may be empty if no interceptors have been defined
*/
List<Interceptor> getInterceptors(ComponentMetadata component);
}