package org.springmodules.ant.task; import java.util.Map; import ognl.Ognl; import ognl.OgnlException; import org.apache.tools.ant.BuildException; import org.springframework.beans.factory.BeanFactory; /** * General purpose Ant task that allows us to call methods on Spring beans. * Works by evaluating an OGNL expression with the bean as root. 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 SpringBeanTask extends AbstractSpringBeanFactoryTask { private String name; private String expression; private String property; /** * The name of the property to set with the generated result. Ignored if * null; * * @param property */ public void setProperty(String property) { this.property = property; } /** * An expression to execute on the target bean. The expression will be * evaluated in OGNL with the bean as root. * * @param expression */ public void setExpression(String expression) { this.expression = expression; } /** * Setter for the bean name property (must be a valid bean) * * @param name */ public void setName(String name) { this.name = name; } /* * @see org.apache.tools.ant.Task#execute() */ public void execute() throws BuildException { if (this.name == null) { throw new BuildException("Cannot locate a null bean name"); } if (this.expression == null) { throw new BuildException("Cannot execute a null expression"); } BeanFactory beanFactory = getBeanFactory(); if ((name == null) || !beanFactory.containsBean(name)) { throw new BuildException( "The BeanFactory does not contain the required bean: [" + name + "]"); } Object target = beanFactory.getBean(name); // TODO: set properties on the bean first (or just use OGNL) try { Map context = Ognl.createDefaultContext(target); context.put("project", getProject()); Object result = Ognl.getValue(expression, context, target); if (result != null) { getProject().setUserProperty(property, result.toString()); } } catch (OgnlException e) { throw new BuildException("Invalid OGNL expresson [" + expression + "] on object[" + target + "]", e); } } }