View Javadoc
1   /*
2    * Copyright (C) 2007-2012 Argeo GmbH
3    *
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    *         http://www.apache.org/licenses/LICENSE-2.0
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */
16  package org.argeo.slc.ant;
17  
18  import java.io.File;
19  import java.util.ArrayList;
20  import java.util.HashMap;
21  import java.util.List;
22  import java.util.Map;
23  import java.util.Vector;
24  
25  import org.apache.commons.logging.Log;
26  import org.apache.commons.logging.LogFactory;
27  import org.apache.tools.ant.BuildEvent;
28  import org.apache.tools.ant.BuildListener;
29  import org.apache.tools.ant.Project;
30  import org.apache.tools.ant.ProjectHelper;
31  import org.apache.tools.ant.helper.ProjectHelper2;
32  import org.argeo.slc.SlcException;
33  import org.springframework.core.io.Resource;
34  
35  public class AntRun implements Runnable {
36  	private final static Log log = LogFactory.getLog(AntRun.class);
37  
38  	private Resource buildFile;
39  	private File baseDir;
40  
41  	private List<String> targets = new ArrayList<String>();
42  	private Map<Object, Object> properties = new HashMap<Object, Object>();
43  
44  	public void run() {
45  		Project project = new Project();
46  
47  		try {
48  			String path = buildFile.getURL().getPath();
49  			project.setUserProperty("ant.file", path);
50  			project.setBaseDir(extractBaseDir(path));
51  
52  			project.init();
53  			ProjectHelper projectHelper = new ProjectHelper2();
54  			project.addReference(ProjectHelper.PROJECTHELPER_REFERENCE,
55  					projectHelper);
56  			projectHelper.parse(project, buildFile.getURL());
57  		} catch (Exception e) {
58  			throw new SlcException("Could not parse " + buildFile, e);
59  		}
60  
61  		if (properties != null) {
62  			for (Map.Entry<Object, Object> entry : properties.entrySet()) {
63  				project.setUserProperty(entry.getKey().toString(), entry
64  						.getValue().toString());
65  			}
66  		}
67  
68  		project.fireBuildStarted();
69  		Throwable exception = null;
70  		try {
71  			project.addBuildListener(new LoggingListener());
72  			if (targets.size() == 0) {
73  				project.executeTarget(project.getDefaultTarget());
74  			} else {
75  				project.executeTargets(new Vector<String>(targets));
76  			}
77  		} catch (Throwable e) {
78  			exception = e;
79  			throw new SlcException("Could not run Ant script " + buildFile, e);
80  		} finally {
81  			project.fireBuildFinished(exception);
82  		}
83  	}
84  
85  	private File extractBaseDir(String path) {
86  		if(this.baseDir!=null)
87  			return this.baseDir;
88  		
89  		String baseDir = null;
90  		if (path.length() > 1) {
91  			int indx = path.lastIndexOf('/', path.length() - 1);
92  			if (indx == -1 || indx == 0) {
93  				baseDir = "/";
94  			} else {
95  				baseDir = path.substring(0, indx) + "/";
96  			}
97  		} else {
98  			baseDir = "/";
99  		}
100 		File file = new File(baseDir);
101 		if (file.exists()) {
102 			return file;
103 		} else {
104 			return new File(System.getProperty("user.dir"));
105 		}
106 	}
107 
108 	public void setBuildFile(Resource buildFile) {
109 		this.buildFile = buildFile;
110 	}
111 
112 	public void setTargets(List<String> targets) {
113 		this.targets = targets;
114 	}
115 
116 	public void setProperties(Map<Object, Object> properties) {
117 		this.properties = properties;
118 	}
119 
120 	public void setBaseDir(File baseDir) {
121 		this.baseDir = baseDir;
122 	}
123 
124 	protected static class LoggingListener implements BuildListener {
125 
126 		public void buildFinished(BuildEvent event) {
127 			if (log.isDebugEnabled())
128 				log.debug("Ant build finished: " + event);
129 		}
130 
131 		public void buildStarted(BuildEvent event) {
132 			if (log.isDebugEnabled())
133 				log.debug("Ant build started: " + event);
134 		}
135 
136 		public void messageLogged(BuildEvent event) {
137 			if (event.getPriority() == Project.MSG_DEBUG) {
138 				if (log.isTraceEnabled())
139 					log.trace(event.getMessage());
140 			} else if (event.getPriority() == Project.MSG_VERBOSE) {
141 				if (log.isDebugEnabled())
142 					log.debug(event.getMessage());
143 			} else if (event.getPriority() == Project.MSG_INFO) {
144 				log.info(event.getMessage());
145 
146 			} else if (event.getPriority() == Project.MSG_WARN) {
147 				log.warn(event.getMessage());
148 
149 			} else if (event.getPriority() == Project.MSG_ERR) {
150 				log.error(event.getMessage());
151 			} else {
152 				log.error(event.getMessage());
153 			}
154 		}
155 
156 		public void targetFinished(BuildEvent event) {
157 			if (log.isTraceEnabled())
158 				log.debug("Target finished: " + event.getTarget());
159 		}
160 
161 		public void targetStarted(BuildEvent event) {
162 			if (log.isTraceEnabled())
163 				log.debug("Target started: " + event.getTarget());
164 		}
165 
166 		public void taskFinished(BuildEvent event) {
167 		}
168 
169 		public void taskStarted(BuildEvent event) {
170 		}
171 	}
172 }