/** * */ package org.springmodules.jsr94.factory; import javax.rules.RuleServiceProvider; import javax.rules.RuleServiceProviderManager; import org.springframework.beans.factory.DisposableBean; import org.springframework.beans.factory.FactoryBean; import org.springframework.beans.factory.InitializingBean; /** * @author janm * */ public class DefaultRuleServiceProviderFactoryBean implements FactoryBean, InitializingBean, DisposableBean { /** * Provider implementing class */ private String providerClass; /** * Provider URI, such as http://drools.org/ */ private String provider; /** * Indicates that this factory has been destoyed */ private boolean destroyed; /** * The instance */ private RuleServiceProvider instance; /* (non-Javadoc) * @see org.springframework.beans.factory.FactoryBean#getObject() */ public Object getObject() throws Exception { if (destroyed) throw new IllegalStateException(getClass().getName() + " has alread been destroyed"); return instance; } /* (non-Javadoc) * @see org.springframework.beans.factory.FactoryBean#isSingleton() */ public final boolean isSingleton() { return true; } /* (non-Javadoc) * @see org.springframework.beans.factory.FactoryBean#getObjectType() */ public Class getObjectType() { return RuleServiceProvider.class; } /* (non-Javadoc) * @see org.springframework.beans.factory.InitializingBean#afterPropertiesSet() */ public void afterPropertiesSet() throws Exception { // check the arguments if (providerClass == null) throw new IllegalArgumentException("Must set providerClass on " + getClass().getName()); if (provider == null) throw new IllegalArgumentException("Must set provider on " + getClass().getName()); // load the provider implementation Class clazz = Class.forName(providerClass); // register the provider RuleServiceProviderManager.registerRuleServiceProvider(provider, clazz); // create the instance instance = RuleServiceProviderManager.getRuleServiceProvider(provider); } /* (non-Javadoc) * @see org.springframework.beans.factory.DisposableBean#destroy() */ public void destroy() throws Exception { // deregister the RuleServiceProvider and clear the instance instance = null; RuleServiceProviderManager.deregisterRuleServiceProvider(provider); // mark the factory as destroyed destroyed = true; } /** * Sets new value for field provider * * @param provider The provider to set. */ public final void setProvider(String provider) { this.provider = provider; } /** * Sets new value for field providerClass * @param providerClass The providerClass to set. */ public final void setProviderClass(String providerClass) { this.providerClass = providerClass; } }