+
+ protected void initProject(Project project, Properties properties,
+ Map<String, Object> references) {
+ if (properties != null) {
+ for (Map.Entry<Object, Object> entry : properties.entrySet()) {
+ project.setUserProperty(entry.getKey().toString(), entry
+ .getValue().toString());
+ }
+ }
+
+ if (references != null) {
+ for (Map.Entry<String, Object> entry : references.entrySet()) {
+ project.addReference(entry.getKey(), entry.getValue());
+ }
+ }
+
+ project.addBuildListener(new CommonsLoggingListener());
+
+ ListableBeanFactory context = (ListableBeanFactory) project
+ .getReference(AntConstants.REF_ROOT_CONTEXT);
+ // Register build listeners
+ Map<String, BuildListener> listeners = context.getBeansOfType(
+ BuildListener.class, false, true);
+ for (BuildListener listener : listeners.values()) {
+ project.addBuildListener(listener);
+ }
+
+ // Register log4j appenders from context
+ MDC.put(AntConstants.MDC_ANT_PROJECT, project);
+ Map<String, Appender> appenders = context.getBeansOfType(
+ Appender.class, false, true);
+ for (Appender appender : appenders.values()) {
+ LogManager.getRootLogger().addAppender(appender);
+ }
+
+ project.init();
+ addCustomTaskAndTypes(project);
+ }
+
+ /** Loads the SLC specific Ant tasks. */
+ protected void addCustomTaskAndTypes(Project project) {
+ Properties taskdefs = getDefs(project,
+ AntConstants.SLC_TASKDEFS_RESOURCE_PATH);
+ for (Object o : taskdefs.keySet()) {
+ String name = o.toString();
+ try {
+ project.addTaskDefinition(name, Class.forName(taskdefs
+ .getProperty(name)));
+ } catch (ClassNotFoundException e) {
+ log.error("Unknown class for task " + name, e);
+ }
+ }
+ Properties typedefs = getDefs(project,
+ AntConstants.SLC_TYPEDEFS_RESOURCE_PATH);
+ for (Object o : typedefs.keySet()) {
+ String name = o.toString();
+ try {
+ project.addDataTypeDefinition(name, Class.forName(typedefs
+ .getProperty(name)));
+ } catch (ClassNotFoundException e) {
+ log.error("Unknown class for type " + name, e);
+ }
+ }
+ }
+
+ private Properties getDefs(Project project, String path) {
+ Properties defs = new Properties();
+ try {
+ InputStream in = project.getClass().getResourceAsStream(path);
+ defs.load(in);
+ in.close();
+ } catch (IOException e) {
+ throw new SlcException("Cannot load task definitions", e);
+ }
+ return defs;
+ }
+
+ protected void initStructure(Project project, String scriptRelativePath) {
+ // Init structure registry
+ StructureRegistry<TreeSPath> registry = new TreeSRegistry();
+ project.addReference(AntConstants.REF_STRUCTURE_REGISTRY, registry);
+
+ // Lowest levels
+ StringTokenizer st = new StringTokenizer(scriptRelativePath, "/");
+ TreeSPath currPath = null;
+ while (st.hasMoreTokens()) {
+ String name = st.nextToken();
+ if (currPath == null) {
+ currPath = TreeSPath.createRootPath(name);
+ } else {
+ if (st.hasMoreTokens())// don't register project file
+ currPath = currPath.createChild(name);
+ }
+ registry.register(currPath, new SimpleSElement(name));
+ }
+
+ // Project level
+ String projectName = project.getName() != null
+ && !project.getName().equals("") ? project.getName()
+ : "project";
+ TreeSPath projectPath = currPath.createChild(projectName);
+
+ String projectDesc = project.getDescription() != null
+ && !project.getDescription().equals("") ? project
+ .getDescription() : projectPath.getName();
+
+ registry.register(projectPath, new SimpleSElement(projectDesc));
+ project.addReference(AntConstants.REF_PROJECT_PATH, projectPath);
+
+ if (log.isDebugEnabled())
+ log.debug("Project path: " + projectPath);
+ }
+
+ protected void parseProject(Project project, String scriptRelativePath) {
+ try {
+ Resource script = rootDir.createRelative(scriptRelativePath);
+ File baseDir = null;
+ try {
+ File scriptFile = script.getFile();
+ baseDir = scriptFile.getParentFile();
+ } catch (IOException e) {// resource is not a file
+ baseDir = new File(System.getProperty("user.dir"));
+ }
+ project.setBaseDir(baseDir);
+ // Reset basedir property, in order to avoid base dir override when
+ // running in Maven
+ project.setProperty("basedir", baseDir.getAbsolutePath());
+
+ ProjectHelper2 projectHelper = new ProjectHelper2();
+ project.addReference(ProjectHelper.PROJECTHELPER_REFERENCE,
+ projectHelper);
+ projectHelper.parse(project, script.getURL());
+ } catch (Exception e) {
+ throw new SlcException("Could not parse project for script "
+ + scriptRelativePath, e);
+ }
+
+ }
+
+ protected void runProject(Project p, List<String> targets) {
+ p.fireBuildStarted();
+ Throwable exception = null;
+ try {
+ if (targets.size() == 0) {// no target defined
+ p.executeTarget(p.getDefaultTarget());
+ } else {
+ p.executeTargets(new Vector<String>(targets));
+ }
+ } catch (Throwable e) {
+ exception = e;
+ throw new SlcException("SLC Ant execution failed", exception);
+ } finally {
+ p.fireBuildFinished(exception);
+ }
+ }
+
+ public void setContextLocation(Resource contextLocation) {
+ this.contextLocation = contextLocation;
+ }
+
+ public void setRootDir(Resource rootDir) {
+ this.rootDir = rootDir;
+ }
+
+ public void setConfDir(Resource confDir) {
+ this.confDir = confDir;
+ }
+
+ public void setWorkDir(File workDir) {
+ this.workDir = workDir;
+ }
+
+ public void setParentContext(ApplicationContext runtimeContext) {
+ this.parentContext = runtimeContext;
+ }
+