import org.apache.tools.ant.Project;\r
import org.apache.tools.ant.helper.ProjectHelper2;\r
\r
-import org.argeo.slc.core.UnsupportedException;\r
import org.argeo.slc.core.structure.DefaultSRegistry;\r
import org.argeo.slc.core.structure.SimpleSElement;\r
import org.argeo.slc.core.structure.StructureRegistry;\r
* /org/argeo/slc/ant/taskdefs.properties\r
*/\r
private static String SLC_TASKDEFS_RESOURCE_PATH = "/org/argeo/slc/ant/taskdefs.properties";\r
+ private static String SLC_TYPEDEFS_RESOURCE_PATH = "/org/argeo/slc/ant/typedefs.properties";\r
+\r
+ protected SlcAntConfig slcAntConfig = null;\r
\r
@Override\r
public void parse(Project project, Object source) throws BuildException {\r
- if (!(source instanceof File)) {\r
- throw new UnsupportedException("Ant file", source);\r
+\r
+ if (source instanceof File) {\r
+ File sourceFile = (File) source;\r
+ // Reset basedir property, in order to avoid base dir override when\r
+ // running in Maven\r
+ project.setProperty("basedir", sourceFile.getParentFile()\r
+ .getAbsolutePath());\r
+ }\r
+\r
+ if (slcAntConfig != null) {\r
+ // Config already initialized (probably import), only parse\r
+ super.parse(project, source);\r
+ return;\r
}\r
- File sourceFile = (File) source;\r
\r
- // initialize config\r
- SlcAntConfig slcAntConfig = new SlcAntConfig();\r
+ // Initialize config\r
+ slcAntConfig = new SlcAntConfig();\r
\r
- // Reset basedir property, in order to avoid base dir override when\r
- // running in Maven\r
- project.setProperty("basedir", sourceFile.getParentFile()\r
- .getAbsolutePath());\r
if (!slcAntConfig.initProject(project)) {\r
// not SLC compatible, do normal Ant\r
super.parse(project, source);\r
// log4j is initialized only now\r
log = LogFactory.getLog(SlcProjectHelper.class);\r
}\r
- log.debug("SLC properties are set, starting initialization..");\r
\r
- // init Spring application context\r
- initSpringContext(project);\r
+ if (log.isDebugEnabled())\r
+ log.debug("SLC properties are set, starting initialization for "\r
+ + source + " (projectHelper=" + this + ")");\r
\r
- // init structure registry\r
- DefaultSRegistry registry = new DefaultSRegistry();\r
- project.addReference(REF_STRUCTURE_REGISTRY, registry);\r
+ beforeParsing(project);\r
\r
- // call the underlying implementation to do the actual work\r
+ // Calls the underlying implementation to do the actual work\r
super.parse(project, source);\r
\r
- // create structure root\r
- registerProjectAndParents(project, slcAntConfig);\r
+ afterParsing(project);\r
+ }\r
\r
- addSlcTasks(project);\r
+ /**\r
+ * Performs operations after config initialization and before Ant file\r
+ * parsing. Performed only once when the main project file is parsed. Should\r
+ * be called by overriding methods.\r
+ */\r
+ protected void beforeParsing(Project project) {\r
+ // Init Spring application context\r
+ initSpringContext(project);\r
\r
+ // Init structure registry\r
+ DefaultSRegistry registry = new DefaultSRegistry();\r
+ project.addReference(REF_STRUCTURE_REGISTRY, registry);\r
+ }\r
+\r
+ /**\r
+ * Performs operations after parsing of the main file. Called only once (not\r
+ * for imports).\r
+ */\r
+ protected void afterParsing(Project project) {\r
+ // Creates structure root\r
+ registerProjectAndParents(project, slcAntConfig);\r
+ addCustomTaskAndTypes(project);\r
}\r
\r
/** Creates the tree-based structure for this project. */\r
private void registerProjectAndParents(Project project,\r
SlcAntConfig slcAntConfig) {\r
- StructureRegistry registry = (StructureRegistry) project\r
+ StructureRegistry<TreeSPath> registry = (StructureRegistry<TreeSPath>) project\r
.getReference(REF_STRUCTURE_REGISTRY);\r
File rootDir = new File(project\r
.getUserProperty(SlcAntConfig.ROOT_DIR_PROPERTY))\r
// retrieves description for this path\r
final String description;\r
if (i == 0) {// project itself\r
- description = project.getDescription() != null ? project\r
- .getDescription() : "[no desc]";\r
+ description = project.getDescription() != null\r
+ && !project.getDescription().equals("") ? project\r
+ .getDescription() : project.getName() != null ? project\r
+ .getName() : slcAntConfig.getDescriptionForDir(dir);\r
} else {\r
description = slcAntConfig.getDescriptionForDir(dir);\r
+ if (log.isTraceEnabled())\r
+ log.trace("Dir desc " + i + "/" + dirs.size() + ": "\r
+ + description);\r
}\r
SimpleSElement element = new SimpleSElement(description);\r
\r
// FIXME: workaround to the removal of leading '/' by Spring\r
// use URL instead?\r
AbstractApplicationContext context = new FileSystemXmlApplicationContext(\r
- '/'+acPath);\r
+ '/' + acPath);\r
context.registerShutdownHook();\r
project.addReference(REF_ROOT_CONTEXT, context);\r
}\r
\r
/** Loads the SLC specific Ant tasks. */\r
- private void addSlcTasks(Project project) {\r
- Properties taskdefs = new Properties();\r
- try {\r
- InputStream in = project.getClass().getResourceAsStream(\r
- SLC_TASKDEFS_RESOURCE_PATH);\r
- taskdefs.load(in);\r
- in.close();\r
- } catch (IOException e) {\r
- throw new SlcAntException("Cannot load task definitions", e);\r
- }\r
-\r
+ private void addCustomTaskAndTypes(Project project) {\r
+ Properties taskdefs = getDefs(project, SLC_TASKDEFS_RESOURCE_PATH);\r
for (Object o : taskdefs.keySet()) {\r
String name = o.toString();\r
try {\r
log.error("Unknown class for task " + name, e);\r
}\r
}\r
+ Properties typedefs = getDefs(project, SLC_TYPEDEFS_RESOURCE_PATH);\r
+ for (Object o : typedefs.keySet()) {\r
+ String name = o.toString();\r
+ try {\r
+ project.addDataTypeDefinition(name, Class.forName(typedefs\r
+ .getProperty(name)));\r
+ } catch (ClassNotFoundException e) {\r
+ log.error("Unknown class for type " + name, e);\r
+ }\r
+ }\r
+ }\r
+\r
+ private Properties getDefs(Project project, String path) {\r
+ Properties defs = new Properties();\r
+ try {\r
+ InputStream in = project.getClass().getResourceAsStream(path);\r
+ defs.load(in);\r
+ in.close();\r
+ } catch (IOException e) {\r
+ throw new SlcAntException("Cannot load task definitions", e);\r
+ }\r
+ return defs;\r
}\r
}\r