package org.springmodules.ant.task;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.Task;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
/**
* General purpose Ant task that allows us to autowire a task in the project
* from a Spring container. To use it there needs to be a beanRefContext.xml on
* the classpath with a BeanFactory configured as a bean identified by the
* factoryKey parameter.
*
* @author Dave Syer
*
*/
public class SpringDependencyInjectorTask extends AbstractSpringBeanFactoryTask {
/**
* Legal value of autowire attribute for autowire by name.
*/
public static final String AUTOWIRE_BY_NAME = "byName";
/**
* Legal value of autowire attribute for autowire by type.
*/
public static final String AUTOWIRE_BY_TYPE = "byType";
private String taskref;
private String autowire = AUTOWIRE_BY_NAME;
/**
* Setter for the task reference
*
* @param name
*/
public void setTaskRef(String name) {
this.taskref = name;
}
/**
* Setter for the autowire property. Legal values are byName (default) and
* byType.
*
* @param autowire
*/
public void setAutowire(String autowire) {
this.autowire = autowire;
}
/**
* Grab the task referred to by the taskref attribute, and autowire it from
* the bean factory discovered from context ref and factory key.
*
* @see org.apache.tools.ant.Task#execute()
*/
public void execute() throws BuildException {
BeanFactory parentBeanFactory = getBeanFactory();
Project project = getProject();
if ((taskref == null) || !project.getReferences().containsKey(taskref)) {
throw new BuildException(
"The project does not contain the required reference: ["
+ taskref + "]");
}
// Check that the reference we were given is a valid Task instance
Object ref = project.getReference(taskref);
if (!(ref instanceof Task)) {
throw new BuildException("Reference (" + taskref
+ ") does not refer to a task");
}
Task target = (Task) ref;
// Assign the autowire value for the bean factory
int autowireValue = AutowireCapableBeanFactory.AUTOWIRE_BY_NAME;
if (AUTOWIRE_BY_TYPE.equals(autowire)) {
autowireValue = AutowireCapableBeanFactory.AUTOWIRE_BY_TYPE;
}
DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
beanFactory.setParentBeanFactory(parentBeanFactory);
beanFactory.registerSingleton(taskref, target);
log("Autowiring reference: " + taskref);
beanFactory.autowireBeanProperties(target, autowireValue, false);
}
}