import java.io.IOException;\r
import java.io.InputStream;\r
import java.util.List;\r
+import java.util.Map;\r
import java.util.Properties;\r
import java.util.Vector;\r
\r
-import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer;\r
-import org.springframework.context.ApplicationContext;\r
+import org.springframework.context.support.AbstractApplicationContext;\r
import org.springframework.context.support.FileSystemXmlApplicationContext;\r
\r
import org.apache.commons.logging.Log;\r
import org.argeo.slc.core.structure.tree.TreeSPath;\r
\r
/**\r
- * Custom implementation of a <code>ProjectHelper</code> binding a Spring\r
+ * Custom implementation of an Ant <code>ProjectHelper</code> binding a Spring\r
* application context and a structure registry with the Ant project.\r
*/\r
public class SlcProjectHelper extends ProjectHelperImpl {\r
- private static Log log = LogFactory.getLog(SlcProjectHelper.class);\r
+ private static Log log;\r
\r
+ /** The Ant reference to the Spring application context used. */\r
public static String REF_ROOT_CONTEXT = "slcApplicationContext";\r
+ /** The Ant reference to the SLC structure registry used. */\r
public static String REF_STRUCTURE_REGISTRY = "slcStructureRegistry";\r
- public static String REF_PROJECT_PATH = "slcProjectPath";\r
-\r
- private String slcRootFileName = "slcRoot.properties";\r
- private String slcLocalFileName = "slcLocal.properties";\r
+ /** The Ant reference to the <code>TreePath</code> of the current project */\r
+ private static String REF_PROJECT_PATH = "slcProjectPath";\r
+ /**\r
+ * Resource path to the property file listing the SLC specific Ant tasks:\r
+ * /org/argeo/slc/ant/taskdefs.properties\r
+ */\r
+ private static String SLC_TASKDEFS_RESOURCE_PATH = "/org/argeo/slc/ant/taskdefs.properties";\r
\r
@Override\r
public void parse(Project project, Object source) throws BuildException {\r
- log.debug("Entered SLC project helper");\r
\r
- // look for root file\r
- File projectBaseDir = project.getBaseDir();\r
- File slcRootFile = findSlcRootFile(projectBaseDir);\r
- if (slcRootFile == null) {\r
- throw new SlcAntException("Cannot find SLC root file");\r
+ // initialize config\r
+ SlcAntConfig slcAntConfig = new SlcAntConfig();\r
+ slcAntConfig.initProject(project);\r
+\r
+ if (log == null) {\r
+ // log4j is initialized only now\r
+ log = LogFactory.getLog(SlcProjectHelper.class);\r
}\r
- SlcAntConfig.initProject(project, slcRootFile);\r
+ log.debug("SLC properties are set, starting initialization..");\r
\r
// init Spring application context\r
initSpringContext(project);\r
- \r
+\r
// init structure registry\r
DefaultSRegistry registry = new DefaultSRegistry();\r
project.addReference(REF_STRUCTURE_REGISTRY, registry);\r
super.parse(project, source);\r
\r
// create structure root\r
- registerProjectAndParents(project);\r
+ registerProjectAndParents(project, slcAntConfig);\r
\r
addSlcTasks(project);\r
\r
}\r
\r
- private void registerProjectAndParents(Project project) {\r
+ /** Creates the tree-based structure for this project. */\r
+ private void registerProjectAndParents(Project project,\r
+ SlcAntConfig slcAntConfig) {\r
StructureRegistry registry = (StructureRegistry) project\r
.getReference(REF_STRUCTURE_REGISTRY);\r
File rootDir = new File(project\r
do {\r
dirs.add(currentDir);\r
currentDir = currentDir.getParentFile();\r
- log.trace("List " + currentDir);\r
+ if (log.isTraceEnabled())\r
+ log.trace("List " + currentDir);\r
} while (!currentDir.equals(rootDir.getParentFile()));\r
\r
- TreeSPath currPath = null;\r
+ // first path is root dir (because of previous algorithm)\r
+ TreeSPath currPath = TreeSPath.createRootPath(rootDir.getName());\r
for (int i = dirs.size() - 1; i >= 0; i--) {\r
File dir = dirs.get(i);\r
\r
- String description = dir.getName();\r
- File slcLocal = new File(dir.getPath() + File.separator\r
- + slcLocalFileName);\r
- if (slcLocal.exists()) {\r
- Properties properties = SlcAntConfig.loadFile(slcLocal\r
- .getAbsolutePath());\r
- description = properties\r
- .getProperty(SlcAntConfig.DIR_DESCRIPTION_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() : "";\r
} else {\r
- if (i == 0) {// project it self\r
- description = project.getDescription() != null ? project\r
- .getDescription() : "";\r
- }\r
+ description = slcAntConfig.getDescriptionForDir(dir);\r
}\r
SimpleSElement element = new SimpleSElement(description);\r
\r
- if (dir.equals(rootDir)) {\r
- currPath = TreeSPath.createRootPath(rootDir.getName());\r
- } else {\r
+ // creates and register path\r
+ if (!dir.equals(rootDir)) {// already set\r
currPath = currPath.createChild(dir.getName());\r
}\r
registry.register(currPath, element);\r
project.addReference(REF_PROJECT_PATH, currPath);\r
}\r
\r
- /** Get the path of a project (root). */\r
+ /** Gets the path of a project (root). */\r
public static TreeSPath getProjectPath(Project project) {\r
return (TreeSPath) project.getReference(REF_PROJECT_PATH);\r
}\r
\r
- private File findSlcRootFile(File dir) {\r
- for (File file : dir.listFiles()) {\r
- if (!file.isDirectory() && file.getName().equals(slcRootFileName)) {\r
- return file;\r
- }\r
- }\r
-\r
- File parentDir = dir.getParentFile();\r
- if (parentDir == null) {\r
- return null;// stop condition: not found\r
- } else {\r
- return findSlcRootFile(parentDir);\r
- }\r
- }\r
-\r
+ /** Initializes the Spring application context. */\r
private void initSpringContext(Project project) {\r
- System.getProperties().putAll(project.getProperties());\r
+ System.getProperties().putAll((Map<?, ?>) project.getProperties());\r
String acPath = project\r
.getUserProperty(SlcAntConfig.APPLICATION_CONTEXT_PROPERTY);\r
- ApplicationContext context = new FileSystemXmlApplicationContext(acPath);\r
+ AbstractApplicationContext context = new FileSystemXmlApplicationContext(\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
- "/org/argeo/slc/ant/taskdefs.properties");\r
+ SLC_TASKDEFS_RESOURCE_PATH);\r
taskdefs.load(in);\r
in.close();\r
} catch (IOException e) {\r