package org.argeo.slc.ant.spring;\r
\r
import java.util.List;\r
-import java.util.Vector;\r
+import java.util.Map;\r
\r
+import org.apache.commons.logging.Log;\r
+import org.apache.commons.logging.LogFactory;\r
import org.apache.tools.ant.BuildException;\r
\r
-import org.argeo.slc.core.SlcException;\r
-\r
/** Ant type allowing to override bean properties. */\r
public class OverrideArg extends SpringArg<Object> {\r
+ private final static Log log = LogFactory.getLog(OverrideArg.class);\r
+\r
private String name;\r
private Object value;\r
- private OverrideList overrideList;\r
+ private ListArg overrideList;\r
private MapArg overrideMap;\r
- private String antref;\r
+\r
+ private Boolean merge = false;\r
\r
/** The name of the property to override. */\r
public String getName() {\r
this.name = name;\r
}\r
\r
- /** Sets a reference to an ant data type. */\r
- public void setAntref(String antref) {\r
- checkValueAlreadySet();\r
- this.antref = antref;\r
- }\r
-\r
/** Both value and bean cannot be set. */\r
public void setValue(String value) {\r
checkValueAlreadySet();\r
}\r
\r
/** Creates override list sub tag. */\r
- public OverrideList createList() {\r
+ public ListArg createList() {\r
checkValueAlreadySet();\r
- overrideList = new OverrideList();\r
+ overrideList = new ListArg();\r
return overrideList;\r
}\r
\r
*/\r
public Object getObject() {\r
if (value != null) {\r
+ if (log.isTraceEnabled())\r
+ log.trace(this + "\t: Returns override object as value");\r
return value;\r
- } else if (getBean() != null) {\r
- return getBeanInstance();\r
+ } else if (getBean() != null\r
+ || getAntref() != null\r
+ // works on original if no collection is defined\r
+ || (getOriginal() != null && overrideList == null && overrideMap == null)) {\r
+ if (log.isTraceEnabled())\r
+ log.trace(this + "\t: Returns override object as instance");\r
+ return getInstance();\r
} else if (overrideList != null) {\r
- return overrideList.getAsObjectList();\r
+ if (log.isTraceEnabled())\r
+ log.trace(this + "\t: Returns override object as list");\r
+ return overrideList.getAsObjectList((List<Object>) getOriginal());\r
} else if (overrideMap != null) {\r
- return overrideMap.getMap();\r
- } else if (antref != null) {\r
- Object obj = getProject().getReference(antref);\r
- if (obj == null) {\r
- throw new SlcException("No object found for reference "\r
- + antref);\r
- }\r
- setOverridenProperties(obj);\r
- return obj;\r
+ if (log.isTraceEnabled())\r
+ log.trace(this + "\t: Returns override object as map");\r
+ return overrideMap\r
+ .getAsObjectMap((Map<String, Object>) getOriginal());\r
} else {\r
throw new BuildException("Value or bean not set.");\r
}\r
}\r
\r
- private void checkValueAlreadySet() {\r
- if (value != null || overrideList != null || antref != null\r
- || getBean() != null || overrideMap != null) {\r
- throw new BuildException("Value already set.");\r
+ protected void checkValueAlreadySet() {\r
+ super.checkValueAlreadySet();\r
+ if (value != null || overrideList != null || overrideMap != null) {\r
+ if (!getMerge()) {\r
+ throw new BuildException("Value already set.");\r
+ }\r
}\r
}\r
\r
- /** List of overrides */\r
- protected class OverrideList {\r
- private List<OverrideArg> list = new Vector<OverrideArg>();\r
-\r
- /** Creates override sub tag. */\r
- public OverrideArg createOverride() {\r
- OverrideArg overrideArg = new OverrideArg();\r
- list.add(overrideArg);\r
- return overrideArg;\r
- }\r
+ public Boolean getMerge() {\r
+ return merge;\r
+ }\r
\r
- /** Gets as list of objects. */\r
- public List<Object> getAsObjectList() {\r
- List<Object> objectList = new Vector<Object>();\r
- for (OverrideArg arg : list) {\r
- objectList.add(arg.getObject());\r
- }\r
- return objectList;\r
- }\r
+ public void setMerge(Boolean merge) {\r
+ this.merge = merge;\r
}\r
+\r
}\r