package org.argeo.slc.ant;\r
\r
+import java.util.List;\r
+import java.util.Vector;\r
+\r
+import org.springframework.beans.BeanWrapper;\r
+import org.springframework.beans.BeanWrapperImpl;\r
import org.springframework.context.ApplicationContext;\r
\r
+import org.apache.tools.ant.BuildException;\r
+\r
public abstract class AbstractSpringArg {\r
+ private List<OverrideArg> overrides = new Vector<OverrideArg>();\r
\r
private String bean;\r
private ApplicationContext context;\r
public void setBean(String bean) {\r
this.bean = bean;\r
}\r
- \r
- protected Object getBeanInstance(){\r
- return context.getBean(bean);\r
+\r
+ protected Object getBeanInstance() {\r
+ Object obj = context.getBean(bean);\r
+\r
+ BeanWrapper wrapper = new BeanWrapperImpl(obj);\r
+ for (OverrideArg override : overrides) {\r
+ wrapper.setPropertyValue(override.getName(), override.getObject());\r
+ }\r
+\r
+ return obj;\r
}\r
\r
public void setContext(ApplicationContext context) {\r
this.context = context;\r
}\r
- \r
- \r
+\r
+ public OverrideArg createOverride() {\r
+ OverrideArg propertyArg = new OverrideArg();\r
+ propertyArg.setContext(context);\r
+ overrides.add(propertyArg);\r
+ return propertyArg;\r
+ }\r
}\r
--- /dev/null
+package org.argeo.slc.ant;\r
+\r
+import org.apache.tools.ant.BuildException;\r
+\r
+public class OverrideArg extends AbstractSpringArg {\r
+ private String name;\r
+ private Object value;\r
+\r
+ public String getName() {\r
+ return name;\r
+ }\r
+\r
+ public void setName(String name) {\r
+ this.name = name;\r
+ }\r
+\r
+ public void setValue(String value) {\r
+ if (getBean() != null) {\r
+ throw new BuildException(\r
+ "Cannot set both 'bean' and 'value' attributes.");\r
+ }\r
+ this.value = value;\r
+ }\r
+\r
+ @Override\r
+ public void setBean(String bean) {\r
+ if (value != null) {\r
+ throw new BuildException(\r
+ "Cannot set both 'bean' and 'value' attributes.");\r
+ }\r
+ super.setBean(bean);\r
+ }\r
+\r
+ public Object getObject() {\r
+ if (value != null) {\r
+ return value;\r
+ } else if (getBean() != null) {\r
+ return getBeanInstance();\r
+ } else {\r
+ throw new BuildException("Value or bean not set.");\r
+ }\r
+ }\r
+\r
+}\r
<property name="reached" value="value2" />\r
</bean>\r
\r
+ <bean id="dummyTestDataObjOK"\r
+ class="org.argeo.slc.testslc.DummyTestData" scope="prototype">\r
+ <property name="expected" ref="dummyTestDataObject1" />\r
+ <property name="reached" ref="dummyTestDataObject1" />\r
+ </bean>\r
+\r
+ <bean id="dummyTestDataObjNOK"\r
+ class="org.argeo.slc.testslc.DummyTestData" scope="prototype">\r
+ <property name="expected" ref="dummyTestDataObject1" />\r
+ <property name="reached" ref="dummyTestDataObject2" />\r
+ </bean>\r
+\r
+ <bean id="dummyTestDataObject1"\r
+ class="org.argeo.slc.testslc.DummyTestDataObject" scope="prototype">\r
+ <property name="value" value="dummy1" />\r
+ </bean>\r
+\r
+ <bean id="dummyTestDataObject2"\r
+ class="org.argeo.slc.testslc.DummyTestDataObject" scope="prototype">\r
+ <property name="value" value="dummy2" />\r
+ </bean>\r
+\r
</beans>
\ No newline at end of file
<project default="test">\r
<taskdef name="slc.test" classname="org.argeo.slc.ant.SlcTestTask" />\r
\r
- <target name="test">\r
+ <target name="test" depends="testSimple,testObj">\r
+ </target>\r
+\r
+ <target name="testSimple">\r
+ <!-- Success -->\r
<slc.test>\r
<testDefinition bean="dummyTestDefinition" />\r
<testData bean="dummyTestDataOK" />\r
</slc.test>\r
\r
+ <!-- Failure -->\r
<slc.test>\r
<testDefinition bean="dummyTestDefinition" />\r
<testData bean="dummyTestDataNOK" />\r
</slc.test>\r
+\r
+ <!-- Override property -->\r
+ <slc.test>\r
+ <testDefinition bean="dummyTestDefinition" />\r
+ <testData bean="dummyTestDataNOK">\r
+ <override name="reached" value="value1" />\r
+ </testData>\r
+ </slc.test>\r
+ </target>\r
+ \r
+ <target name="testObj">\r
+ <!-- Success -->\r
+ <slc.test>\r
+ <testDefinition bean="dummyTestDefinition" />\r
+ <testData bean="dummyTestDataObjOK" />\r
+ </slc.test>\r
+\r
+ <!-- Failure -->\r
+ <slc.test>\r
+ <testDefinition bean="dummyTestDefinition" />\r
+ <testData bean="dummyTestDataObjNOK" />\r
+ </slc.test>\r
+\r
+ <!-- Override property -->\r
+ <slc.test>\r
+ <testDefinition bean="dummyTestDefinition" />\r
+ <testData bean="dummyTestDataObjNOK">\r
+ <override name="reached" bean="dummyTestDataObject1" />\r
+ </testData>\r
+ </slc.test>\r
</target>\r
</project>
\ No newline at end of file
--- /dev/null
+package org.argeo.slc.testslc;\r
+\r
+public class DummyTestDataObject {\r
+ private Object value;\r
+\r
+ public Object getValue() {\r
+ return value;\r
+ }\r
+\r
+ public void setValue(Object value) {\r
+ this.value = value;\r
+ }\r
+\r
+ @Override\r
+ public boolean equals(Object obj) {\r
+ if (obj instanceof DummyTestDataObject) {\r
+ DummyTestDataObject dtdo = (DummyTestDataObject) obj;\r
+ return value.equals(dtdo.value);\r
+ }\r
+ return false;\r
+ }\r
+\r
+}\r