package com.github.dynamicextensionsalfresco.policy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
import org.alfresco.repo.policy.PolicyComponent;
import org.springframework.beans.factory.FactoryBean;
import org.springframework.beans.factory.annotation.Required;
/**
* {@link FactoryBean} for creating proxy {@link PolicyComponent}s.
*
* @author Laurens Fridael
*
*/
public class ProxyPolicyComponentFactoryBean implements FactoryBean<PolicyComponent> {
/* Dependencies */
private PolicyComponent policyComponent;
private BehaviourProxyFactory behaviourProxyFactory;
/* State */
private PolicyComponent proxyPolicyComponent;
/* Operations */
@Override
public Class<? extends PolicyComponent> getObjectType() {
return PolicyComponent.class;
}
@Override
public boolean isSingleton() {
return true;
}
@Override
public PolicyComponent getObject() {
if (proxyPolicyComponent == null) {
proxyPolicyComponent = createProxyPolicyComponent();
}
return proxyPolicyComponent;
}
/* Utility operations */
protected PolicyComponent createProxyPolicyComponent() {
final InvocationHandler handler = new ProxyPolicyComponentInvocationHandler(getPolicyComponent(),
getBehaviourProxyFactory());
return (PolicyComponent) Proxy.newProxyInstance(getClass().getClassLoader(),
new Class<?>[] { PolicyComponent.class }, handler);
}
/* Dependencies */
@Required
public void setPolicyComponent(final PolicyComponent policyComponent) {
this.policyComponent = policyComponent;
}
protected PolicyComponent getPolicyComponent() {
return policyComponent;
}
@Required
public void setBehaviourProxyFactory(final BehaviourProxyFactory behaviourProxyFactory) {
this.behaviourProxyFactory = behaviourProxyFactory;
}
protected BehaviourProxyFactory getBehaviourProxyFactory() {
return behaviourProxyFactory;
}
}