You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@aries.apache.org by oz...@apache.org on 2009/11/17 14:54:37 UTC
svn commit: r881291 - in
/incubator/aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint:
ComponentDefinitionRegistry.java container/BeanRecipe.java
namespace/ComponentDefinitionRegistryImpl.java
Author: ozzy
Date: Tue Nov 17 13:54:37 2009
New Revision: 881291
URL: http://svn.apache.org/viewvc?rev=881291&view=rev
Log:
ARIES-47 Add interceptor concept to blueprint
Modified:
incubator/aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/ComponentDefinitionRegistry.java
incubator/aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/container/BeanRecipe.java
incubator/aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/namespace/ComponentDefinitionRegistryImpl.java
Modified: incubator/aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/ComponentDefinitionRegistry.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/ComponentDefinitionRegistry.java?rev=881291&r1=881290&r2=881291&view=diff
==============================================================================
--- incubator/aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/ComponentDefinitionRegistry.java (original)
+++ incubator/aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/ComponentDefinitionRegistry.java Tue Nov 17 13:54:37 2009
@@ -37,5 +37,9 @@
void registerTypeConverter(Target component);
List<Target> getTypeConverters();
+
+ void registerInterceptorWithComponent(ComponentMetadata component, Interceptor interceptor);
+
+ List<Interceptor> getInterceptors(ComponentMetadata component);
}
Modified: incubator/aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/container/BeanRecipe.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/container/BeanRecipe.java?rev=881291&r1=881290&r2=881291&view=diff
==============================================================================
--- incubator/aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/container/BeanRecipe.java (original)
+++ incubator/aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/container/BeanRecipe.java Tue Nov 17 13:54:37 2009
@@ -33,13 +33,19 @@
import java.util.Map;
import org.apache.aries.blueprint.BeanProcessor;
+import org.apache.aries.blueprint.ComponentDefinitionRegistry;
import org.apache.aries.blueprint.ExtendedBlueprintContainer;
+import org.apache.aries.blueprint.Interceptor;
+import org.apache.aries.blueprint.container.AbstractServiceReferenceRecipe.CgLibProxyFactory;
+import org.apache.aries.blueprint.container.AbstractServiceReferenceRecipe.JdkProxyFactory;
import org.apache.aries.blueprint.di.AbstractRecipe;
import org.apache.aries.blueprint.di.Recipe;
+import org.apache.aries.blueprint.proxy.CgLibInterceptorWrapper;
import org.apache.aries.blueprint.utils.ReflectionUtils;
import org.osgi.service.blueprint.container.ComponentDefinitionException;
import org.osgi.service.blueprint.container.ReifiedType;
import org.osgi.service.blueprint.reflect.BeanMetadata;
+import org.osgi.service.blueprint.reflect.ComponentMetadata;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -594,6 +600,32 @@
}
return obj;
}
+
+ private Object addInterceptors(Object original) throws ComponentDefinitionException{
+
+ try {
+ // Try load load a cglib class (to make sure it's actually available
+ getClass().getClassLoader().loadClass("net.sf.cglib.proxy.Enhancer");
+ } catch (Throwable t) {
+ throw new ComponentDefinitionException("Interceptors have been configured but cglib can not be used", t);
+ }
+
+ Object intercepted = null;
+ String beanName = getName();
+ ComponentDefinitionRegistry reg = blueprintContainer.getComponentDefinitionRegistry();
+ ComponentMetadata metaData = reg.getComponentDefinition(beanName);
+ List<Interceptor> interceptors = reg.getInterceptors(metaData);
+ if(interceptors!=null && interceptors.size()>0){
+ intercepted = CgLibInterceptorWrapper.createProxyObject(original.getClass().getClassLoader(),
+ metaData,
+ interceptors,
+ original,
+ original.getClass().getInterfaces());
+ }else{
+ intercepted = original;
+ }
+ return intercepted;
+ }
@Override
protected Object internalCreate() throws ComponentDefinitionException {
@@ -622,6 +654,8 @@
obj = runBeanProcPostInit(obj);
+ obj = addInterceptors(obj);
+
return obj;
}
Modified: incubator/aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/namespace/ComponentDefinitionRegistryImpl.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/namespace/ComponentDefinitionRegistryImpl.java?rev=881291&r1=881290&r2=881291&view=diff
==============================================================================
--- incubator/aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/namespace/ComponentDefinitionRegistryImpl.java (original)
+++ incubator/aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/namespace/ComponentDefinitionRegistryImpl.java Tue Nov 17 13:54:37 2009
@@ -18,7 +18,10 @@
*/
package org.apache.aries.blueprint.namespace;
+import java.util.ArrayList;
import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
@@ -27,6 +30,7 @@
import org.apache.aries.blueprint.ComponentDefinitionRegistry;
import org.apache.aries.blueprint.ComponentNameAlreadyInUseException;
+import org.apache.aries.blueprint.Interceptor;
import org.apache.aries.blueprint.reflect.PassThroughMetadataImpl;
import org.osgi.service.blueprint.reflect.ComponentMetadata;
import org.osgi.service.blueprint.reflect.Target;
@@ -43,11 +47,13 @@
private final Map<String, ComponentMetadata> components;
private final List<Target> typeConverters;
+ private final Map<ComponentMetadata, List<Interceptor>> interceptors;
public ComponentDefinitionRegistryImpl() {
// Use a linked hash map to keep the declaration order
components = Collections.synchronizedMap(new LinkedHashMap<String, ComponentMetadata>());
typeConverters = new CopyOnWriteArrayList<Target>();
+ interceptors = Collections.synchronizedMap(new HashMap<ComponentMetadata, List<Interceptor>>());
}
public boolean containsComponentDefinition(String name) {
@@ -79,7 +85,10 @@
}
public void removeComponentDefinition(String name) {
- components.remove(name);
+ ComponentMetadata removed = components.remove(name);
+ if(removed!=null){
+ interceptors.remove(removed);
+ }
}
public void registerTypeConverter(Target component) {
@@ -92,5 +101,28 @@
public List<Target> getTypeConverters() {
return typeConverters;
}
+
+ public void registerInterceptorWithComponent(ComponentMetadata component, Interceptor interceptor) {
+ if(interceptor!=null){
+ List<Interceptor> componentInterceptorList = interceptors.get(component);
+ if(componentInterceptorList==null){
+ componentInterceptorList = new ArrayList<Interceptor>();
+ interceptors.put(component, componentInterceptorList);
+ }
+ if(!componentInterceptorList.contains(interceptor)){
+ componentInterceptorList.add(interceptor);
+ Collections.sort(componentInterceptorList, new Comparator<Interceptor>(){
+ public int compare(Interceptor object1, Interceptor object2) {
+ //invert the order so higher ranks are sorted 1st
+ return object2.getRank() - object1.getRank();
+ }
+ });
+ }
+ }
+ }
+
+ public List<Interceptor> getInterceptors(ComponentMetadata component) {
+ return interceptors.get(component);
+ }
}