1 /******************************************************************************* 2 * Copyright (c) 2000, 2006 IBM Corporation and others. 3 * All rights reserved. This program and the accompanying materials 4 * are made available under the terms of the Eclipse Public License v1.0 5 * which accompanies this distribution, and is available at 6 * http://www.eclipse.org/legal/epl-v10.html 7 * 8 * Contributors: 9 * IBM Corporation - initial API and implementation 10 *******************************************************************************/ 11 package org.eclipse.releng.generators; 12 /** 13 * This class finds the version of a plug-in, or fragment listed in a feature 14 * and writes <element>=<element>_<version> for each in a properties file. 15 * The file produced from this task can be loaded by an Ant script to find files in the 16 * binary versions of plugins and fragments. 17 */ 18 19 import java.io.BufferedInputStream; 20 import java.io.File; 21 import java.io.FileInputStream; 22 import java.io.FileNotFoundException; 23 import java.io.FileWriter; 24 import java.io.IOException; 25 import java.io.InputStream; 26 import java.io.PrintWriter; 27 import java.util.ArrayList; 28 import java.util.Arrays; 29 import java.util.Enumeration; 30 import java.util.Hashtable; 31 import java.util.StringTokenizer; 32 33 import javax.xml.parsers.DocumentBuilder; 34 import javax.xml.parsers.DocumentBuilderFactory; 35 import javax.xml.parsers.ParserConfigurationException; 36 import javax.xml.parsers.SAXParser; 37 import javax.xml.parsers.SAXParserFactory; 38 39 import org.apache.tools.ant.Task; 40 import org.eclipse.osgi.framework.util.Headers; 41 import org.eclipse.osgi.util.ManifestElement; 42 import org.osgi.framework.BundleException; 43 import org.osgi.framework.Constants; 44 import org.w3c.dom.Document; 45 import org.w3c.dom.NamedNodeMap; 46 import org.w3c.dom.Node; 47 import org.w3c.dom.NodeList; 48 import org.xml.sax.Attributes; 49 import org.xml.sax.InputSource; 50 import org.xml.sax.SAXException; 51 import org.xml.sax.SAXParseException; 52 import org.xml.sax.helpers.DefaultHandler; 53 54 public class TestVersionTracker extends Task{ 55 56 private Hashtable elements; 57 58 //fields to hold temporary values for parsing 59 private SAXParser parser; 60 61 //the feature to from which to collect version information 62 private String featureId; 63 64 //buildDirectory 65 private String buildDirectory; 66 67 //the path to the file in which to write the results 68 private String outputFile; 69 70 public static void main(String[] args) { 71 TestVersionTracker tracker = 72 new TestVersionTracker(); 73 tracker.buildDirectory="D:/src"; 74 tracker.featureId="org.eclipse.sdk.tests"; 75 tracker.outputFile="d:/eclipse-testing/test.properties"; 76 tracker.execute(); 77 78 } 79 80 public TestVersionTracker(){ 81 super(); 82 } 83 84 85 public void execute() { 86 elements = new Hashtable(); 87 88 SAXParserFactory saxParserFactory = SAXParserFactory.newInstance(); 89 try { 90 parser = saxParserFactory.newSAXParser(); 91 } catch (ParserConfigurationException e) { 92 e.printStackTrace(); 93 } catch (SAXException e) { 94 e.printStackTrace(); 95 } 96 97 parse(buildDirectory+"/features/"+featureId+"/build.xml",new FeatureHandler()); 98 getTestPluginProperties(); 99 writeProperties(outputFile, true); 100 } 101 102 public void parse(String xmlFile,DefaultHandler handler){ 103 try { 104 parser.parse(xmlFile,handler); 105 } catch (SAXException e) { 106 System.err.println (e); 107 } catch (IOException e) { 108 System.err.println (e); 109 } 110 } 111 112 private void getTestPluginProperties(){ 113 //set prerequisites list for each test plugin 114 Enumeration keys=elements.keys(); 115 while (keys.hasMoreElements()){ 116 String id=keys.nextElement().toString(); 117 TestPlugin testPlugin=(TestPlugin)elements.get(id); 118 testPlugin.getPrerequisitePlugins(id); 119 testPlugin.setHasPerformanceTarget(); 120 } 121 } 122 123 private class FeatureHandler extends DefaultHandler{ 124 // Start Element Event Handler 125 public void startElement( 126 String uri, 127 String local, 128 String qName, 129 Attributes atts) { 130 131 if (qName.equals("eclipse.idReplacer")) { 132 try{ 133 String pluginIds = atts.getValue("pluginIds"); 134 135 //get pluginIDs and versions from generated build.xml. Create TestPlugin objects 136 StringTokenizer tokenizer= new StringTokenizer(pluginIds,","); 137 while (tokenizer.hasMoreTokens()){ 138 String idtmp=tokenizer.nextToken(); 139 String id=idtmp.substring(0, idtmp.indexOf(":")); 140 String version=tokenizer.nextToken(); 141 TestPlugin testPlugin=new TestPlugin(id,version); 142 elements.put(id,testPlugin); 143 } 144 } catch (Exception e){ 145 e.printStackTrace(); 146 } 147 } 148 } 149 } 150 151 private class TestPlugin { 152 String id; 153 String version; 154 boolean hasPerformanceTarget=false; 155 ArrayList prerequisitePlugins=new ArrayList(); 156 File testXml; 157 158 TestPlugin(String id, String version){ 159 this.id=id; 160 this.version=version; 161 this.testXml=new File(buildDirectory,"plugins/"+id+"/test.xml"); 162 } 163 164 private void getPrerequisitePlugins(String id) { 165 Headers headers = null; 166 String value = null; 167 File manifest = new File(buildDirectory, "plugins/" + id + "/META-INF/MANIFEST.MF"); 168 ManifestElement[] manifestElements=null; 169 if (manifest.exists()) { 170 try { 171 headers = Headers.parseManifest(new FileInputStream(manifest)); 172 if (headers.get(Constants.REQUIRE_BUNDLE)==null) 173 return; 174 value = headers.get(Constants.REQUIRE_BUNDLE).toString(); 175 manifestElements = ManifestElement.parseHeader(Constants.REQUIRE_BUNDLE, value); 176 177 } catch (BundleException e) { 178 e.printStackTrace(); 179 } catch (FileNotFoundException e) { 180 e.printStackTrace(); 181 } 182 183 for (int i = 0; i < manifestElements.length; i++) { 184 String name = manifestElements[i].getValue(); 185 if (elements.containsKey(name)){ 186 if (!prerequisitePlugins.contains(name)){ 187 boolean prereqAdded=prerequisitePlugins.add(name); 188 if (prereqAdded){ 189 getPrerequisitePlugins(name); 190 } 191 } 192 } 193 } 194 } 195 getPrerequisitePluginsFromPluginXml(id); 196 } 197 198 /** 199 * Returns the required list of plug-ins from plugin.xml 200 */ 201 private void getPrerequisitePluginsFromPluginXml(String id) { 202 File pluginXml = new File(buildDirectory, "/plugins/" + id + "/plugin.xml"); 203 if (!pluginXml.exists()) 204 return; 205 206 InputStream is = null; 207 Document doc = null; 208 try { 209 is = new BufferedInputStream(new FileInputStream(pluginXml)); 210 InputSource inputSource = new InputSource(is); 211 212 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 213 214 DocumentBuilder builder = null; 215 216 try { 217 builder = factory.newDocumentBuilder(); 218 } catch (ParserConfigurationException e1) { 219 e1.printStackTrace(); 220 } 221 222 try { 223 doc = builder.parse(inputSource); 224 } catch (SAXParseException e) { 225 e.printStackTrace(); 226 } 227 228 } catch (IOException e) { 229 e.printStackTrace(); 230 } catch (SAXException e) { 231 e.printStackTrace(); 232 } finally { 233 try { 234 is.close(); 235 } catch (IOException e) { 236 } 237 } 238 // Find the fragment's plugins's name, id and version 239 NodeList nodeList = doc.getElementsByTagName("import"); 240 if (nodeList == null || nodeList.getLength() == 0) { 241 return; 242 } 243 for (int i = 0; i < nodeList.getLength(); i++) { 244 Node node = nodeList.item(i); 245 NamedNodeMap map = node.getAttributes(); 246 Node namedItem = map.getNamedItem("plugin"); 247 String name = namedItem.getNodeValue(); 248 if (namedItem == null) { 249 continue; 250 } else { 251 if (elements.containsKey(name)) { 252 if (!prerequisitePlugins.contains(name)) { 253 boolean prereqAdded = prerequisitePlugins.add(name); 254 if (prereqAdded) { 255 getPrerequisitePlugins(name); 256 } 257 } 258 } 259 } 260 } 261 } 262 263 /** 264 * Returns the required list of plug-ins from plugin.xml 265 */ 266 private void setHasPerformanceTarget() { 267 File testXml = new File(buildDirectory, "/plugins/" + id + "/test.xml"); 268 if (!testXml.exists()) 269 return; 270 271 InputStream is = null; 272 Document doc = null; 273 try { 274 is = new BufferedInputStream(new FileInputStream(testXml)); 275 InputSource inputSource = new InputSource(is); 276 277 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 278 279 DocumentBuilder builder = null; 280 281 try { 282 builder = factory.newDocumentBuilder(); 283 } catch (ParserConfigurationException e1) { 284 e1.printStackTrace(); 285 } 286 287 try { 288 doc = builder.parse(inputSource); 289 } catch (SAXParseException e) { 290 e.printStackTrace(); 291 } 292 293 } catch (IOException e) { 294 e.printStackTrace(); 295 } catch (SAXException e) { 296 e.printStackTrace(); 297 } finally { 298 try { 299 is.close(); 300 } catch (IOException e) { 301 } 302 } 303 // Find a target named "performance" 304 NodeList nodeList = doc.getElementsByTagName("target"); 305 if (nodeList == null || nodeList.getLength() == 0) { 306 return; 307 } 308 for (int i = 0; i < nodeList.getLength(); i++) { 309 Node node = nodeList.item(i); 310 NamedNodeMap map = node.getAttributes(); 311 Node namedItem = map.getNamedItem("name"); 312 String name = namedItem.getNodeValue(); 313 if (namedItem == null) { 314 continue; 315 } else { 316 if (name.equals("performance")){ 317 hasPerformanceTarget=true; 318 return; 319 } 320 } 321 } 322 } 323 324 public String toString(){ 325 String keyPrefix=id+"_"+version; 326 String performanceProperty=hasPerformanceTarget?id+".has.performance.target="+hasPerformanceTarget+"\n":""; 327 return id+"="+keyPrefix+"\n"+ 328 performanceProperty+ 329 id+".prerequisite.testplugins="+getPrerequisiteList()+"\n"; 330 } 331 332 private String getPrerequisiteList(){ 333 String prerequisites=""; 334 for (int i=0;i<prerequisitePlugins.size();i++){ 335 prerequisites=prerequisites.concat("**/${"+prerequisitePlugins.get(i)+"}** "); 336 } 337 return prerequisites; 338 } 339 } 340 341 public void writeProperties(String propertiesFile,boolean append){ 342 343 try{ 344 345 PrintWriter writer = new PrintWriter(new FileWriter(propertiesFile,append)); 346 347 Object[] keys = elements.keySet().toArray(); 348 Arrays.sort(keys); 349 for (int i=0;i<keys.length;i++){ 350 Object key = keys[i]; 351 writer.println(((TestPlugin)elements.get(key)).toString()); 352 writer.flush(); 353 } 354 writer.close(); 355 356 } catch (IOException e){ 357 System.out.println("Unable to write to file "+propertiesFile); 358 } 359 360 361 } 362 363 364 /** 365 * @return Returns the outputFilePath. 366 */ 367 public String getOutputFilePath() { 368 return outputFile; 369 } 370 371 /** 372 * @param outputFilePath The outputFilePath to set. 373 */ 374 public void setOutputFilePath(String outputFilePath) { 375 this.outputFile = outputFilePath; 376 } 377 378 public String getBuildDirectory() { 379 return buildDirectory; 380 } 381 382 public void setBuildDirectory(String buildDirectory) { 383 this.buildDirectory = buildDirectory; 384 } 385 386 public String getFeatureId() { 387 return featureId; 388 } 389 390 public void setFeatureId(String featureId) { 391 this.featureId = featureId; 392 } 393 394 public String getOutputFile() { 395 return outputFile; 396 } 397 398 public void setOutputFile(String outputFile) { 399 this.outputFile = outputFile; 400 } 401 402 403 404 405 } 406