+package org.argeo.slc.ant.spring;\r
+\r
+import java.util.List;\r
+import java.util.Vector;\r
+\r
+import org.apache.tools.ant.types.DataType;\r
+import org.argeo.slc.ant.SlcAntException;\r
+import org.argeo.slc.ant.SlcProjectHelper;\r
+import org.argeo.slc.core.SlcException;\r
+import org.springframework.beans.BeanWrapper;\r
+import org.springframework.beans.BeanWrapperImpl;\r
+import org.springframework.beans.factory.InitializingBean;\r
+import org.springframework.context.ApplicationContext;\r
+\r
+/** Abstract Ant type wrapping a Spring bean. */\r
+public class SpringArg<T> extends DataType {\r
+ private List<OverrideArg> overrides = new Vector<OverrideArg>();\r
+\r
+ private String bean;\r
+\r
+ // cache bean instance to avoid reading it twice if it is a prototype\r
+ private T beanInstance = null;\r
+\r
+ /** The <u>name</u> of the underlying bean, as set through the attribute. */\r
+ public String getBean() {\r
+ return bean;\r
+ }\r
+\r
+ /** Setter for the bean name. */\r
+ public void setBean(String bean) {\r
+ this.bean = bean;\r
+ }\r
+\r
+ /**\r
+ * Retrieve the instance of the bean, and sets the overriden properties.\r
+ * <b>The value is cached.</b>\r
+ */\r
+ public T getBeanInstance() {\r
+ if (beanInstance == null) {\r
+ beanInstance = (T)getContext().getBean(bean);\r
+ \r
+ setOverridenProperties(beanInstance);\r
+\r
+ // FIXME: why are we doing this? Could not find any object using it\r
+ if (beanInstance instanceof InitializingBean) {\r
+ try {\r
+ ((InitializingBean) beanInstance).afterPropertiesSet();\r
+ } catch (Exception e) {\r
+ throw new SlcException("Could not initialize bean", e);\r
+ }\r
+ }\r
+ }\r
+ return beanInstance;\r
+ }\r
+ \r
+ protected void setOverridenProperties(Object obj){\r
+ BeanWrapper wrapper = new BeanWrapperImpl(obj);\r
+ for (OverrideArg override : overrides) {\r
+ if (override.getName() == null) {\r
+ throw new SlcAntException(\r
+ "The name of the property to override has to be set.");\r
+ }\r
+\r
+// LogFactory.getLog(getClass()).debug(\r
+// "Prop " + override.getName());\r
+ wrapper.setPropertyValue(override.getName(), override\r
+ .getObject());\r
+ }\r
+ \r
+ }\r
+\r
+ /** Creates an override subtag. */\r
+ public OverrideArg createOverride() {\r
+ OverrideArg propertyArg = new OverrideArg();\r
+ overrides.add(propertyArg);\r
+ return propertyArg;\r
+ }\r
+\r
+ /** The related Spring application context. */\r
+ protected ApplicationContext getContext() {\r
+ return (ApplicationContext) getProject().getReference(\r
+ SlcProjectHelper.REF_ROOT_CONTEXT);\r
+ }\r
+\r
+}\r