]> git.argeo.org Git - gpl/argeo-slc.git/blobdiff - org.argeo.slc.agent/src/main/java/org/argeo/slc/ant/spring/AbstractSpringArg.java
Introduce agent project
[gpl/argeo-slc.git] / org.argeo.slc.agent / src / main / java / org / argeo / slc / ant / spring / AbstractSpringArg.java
diff --git a/org.argeo.slc.agent/src/main/java/org/argeo/slc/ant/spring/AbstractSpringArg.java b/org.argeo.slc.agent/src/main/java/org/argeo/slc/ant/spring/AbstractSpringArg.java
new file mode 100644 (file)
index 0000000..6096f1f
--- /dev/null
@@ -0,0 +1,87 @@
+package org.argeo.slc.ant.spring;\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.beans.factory.InitializingBean;\r
+import org.springframework.context.ApplicationContext;\r
+\r
+import org.apache.commons.logging.LogFactory;\r
+import org.apache.tools.ant.types.DataType;\r
+\r
+import org.argeo.slc.ant.SlcAntException;\r
+import org.argeo.slc.ant.SlcProjectHelper;\r
+import org.argeo.slc.core.SlcException;\r
+\r
+/** Abstract Ant type wrapping a Spring bean. */\r
+public abstract class AbstractSpringArg 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 Object beanInstance = null;\r
+\r
+       /** The <u>name</u> of the underlying bean, as set throught 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 Object getBeanInstance() {\r
+               if (beanInstance == null) {\r
+                       beanInstance = getContext().getBean(bean);\r
+                       \r
+                       setOverridenProperties(beanInstance);\r
+\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