/******************************************************************************* * Copyright (c) 2000, 2006 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.releng.generators; /** * This class finds the version of a plug-in, or fragment listed in a feature * and writes =_ for each in a properties file. * The file produced from this task can be loaded by an Ant script to find files in the * binary versions of plugins and fragments. */ import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileWriter; import java.io.IOException; import java.io.InputStream; import java.io.PrintWriter; import java.util.ArrayList; import java.util.Arrays; import java.util.Enumeration; import java.util.Hashtable; import java.util.StringTokenizer; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.apache.tools.ant.Task; import org.eclipse.osgi.framework.util.Headers; import org.eclipse.osgi.util.ManifestElement; import org.osgi.framework.BundleException; import org.osgi.framework.Constants; import org.w3c.dom.Document; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.Attributes; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import org.xml.sax.SAXParseException; import org.xml.sax.helpers.DefaultHandler; public class TestVersionTracker extends Task{ private Hashtable elements; //fields to hold temporary values for parsing private SAXParser parser; //the feature to from which to collect version information private String featureId; //buildDirectory private String buildDirectory; //the path to the file in which to write the results private String outputFile; public static void main(String[] args) { TestVersionTracker tracker = new TestVersionTracker(); tracker.buildDirectory="D:/src"; tracker.featureId="org.eclipse.sdk.tests"; tracker.outputFile="d:/eclipse-testing/test.properties"; tracker.execute(); } public TestVersionTracker(){ super(); } public void execute() { elements = new Hashtable(); SAXParserFactory saxParserFactory = SAXParserFactory.newInstance(); try { parser = saxParserFactory.newSAXParser(); } catch (ParserConfigurationException e) { e.printStackTrace(); } catch (SAXException e) { e.printStackTrace(); } parse(buildDirectory+"/features/"+featureId+"/build.xml",new FeatureHandler()); getTestPluginProperties(); writeProperties(outputFile, true); } public void parse(String xmlFile,DefaultHandler handler){ try { parser.parse(xmlFile,handler); } catch (SAXException e) { System.err.println (e); } catch (IOException e) { System.err.println (e); } } private void getTestPluginProperties(){ //set prerequisites list for each test plugin Enumeration keys=elements.keys(); while (keys.hasMoreElements()){ String id=keys.nextElement().toString(); TestPlugin testPlugin=(TestPlugin)elements.get(id); testPlugin.getPrerequisitePlugins(id); testPlugin.setHasPerformanceTarget(); } } private class FeatureHandler extends DefaultHandler{ // Start Element Event Handler public void startElement( String uri, String local, String qName, Attributes atts) { if (qName.equals("eclipse.idReplacer")) { try{ String pluginIds = atts.getValue("pluginIds"); //get pluginIDs and versions from generated build.xml. Create TestPlugin objects StringTokenizer tokenizer= new StringTokenizer(pluginIds,","); while (tokenizer.hasMoreTokens()){ String idtmp=tokenizer.nextToken(); String id=idtmp.substring(0, idtmp.indexOf(":")); String version=tokenizer.nextToken(); TestPlugin testPlugin=new TestPlugin(id,version); elements.put(id,testPlugin); } } catch (Exception e){ e.printStackTrace(); } } } } private class TestPlugin { String id; String version; boolean hasPerformanceTarget=false; ArrayList prerequisitePlugins=new ArrayList(); File testXml; TestPlugin(String id, String version){ this.id=id; this.version=version; this.testXml=new File(buildDirectory,"plugins/"+id+"/test.xml"); } private void getPrerequisitePlugins(String id) { Headers headers = null; String value = null; File manifest = new File(buildDirectory, "plugins/" + id + "/META-INF/MANIFEST.MF"); ManifestElement[] manifestElements=null; if (manifest.exists()) { try { headers = Headers.parseManifest(new FileInputStream(manifest)); if (headers.get(Constants.REQUIRE_BUNDLE)==null) return; value = headers.get(Constants.REQUIRE_BUNDLE).toString(); manifestElements = ManifestElement.parseHeader(Constants.REQUIRE_BUNDLE, value); } catch (BundleException e) { e.printStackTrace(); } catch (FileNotFoundException e) { e.printStackTrace(); } for (int i = 0; i < manifestElements.length; i++) { String name = manifestElements[i].getValue(); if (elements.containsKey(name)){ if (!prerequisitePlugins.contains(name)){ boolean prereqAdded=prerequisitePlugins.add(name); if (prereqAdded){ getPrerequisitePlugins(name); } } } } } getPrerequisitePluginsFromPluginXml(id); } /** * Returns the required list of plug-ins from plugin.xml */ private void getPrerequisitePluginsFromPluginXml(String id) { File pluginXml = new File(buildDirectory, "/plugins/" + id + "/plugin.xml"); if (!pluginXml.exists()) return; InputStream is = null; Document doc = null; try { is = new BufferedInputStream(new FileInputStream(pluginXml)); InputSource inputSource = new InputSource(is); DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = null; try { builder = factory.newDocumentBuilder(); } catch (ParserConfigurationException e1) { e1.printStackTrace(); } try { doc = builder.parse(inputSource); } catch (SAXParseException e) { e.printStackTrace(); } } catch (IOException e) { e.printStackTrace(); } catch (SAXException e) { e.printStackTrace(); } finally { try { is.close(); } catch (IOException e) { } } // Find the fragment's plugins's name, id and version NodeList nodeList = doc.getElementsByTagName("import"); if (nodeList == null || nodeList.getLength() == 0) { return; } for (int i = 0; i < nodeList.getLength(); i++) { Node node = nodeList.item(i); NamedNodeMap map = node.getAttributes(); Node namedItem = map.getNamedItem("plugin"); String name = namedItem.getNodeValue(); if (namedItem == null) { continue; } else { if (elements.containsKey(name)) { if (!prerequisitePlugins.contains(name)) { boolean prereqAdded = prerequisitePlugins.add(name); if (prereqAdded) { getPrerequisitePlugins(name); } } } } } } /** * Returns the required list of plug-ins from plugin.xml */ private void setHasPerformanceTarget() { File testXml = new File(buildDirectory, "/plugins/" + id + "/test.xml"); if (!testXml.exists()) return; InputStream is = null; Document doc = null; try { is = new BufferedInputStream(new FileInputStream(testXml)); InputSource inputSource = new InputSource(is); DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = null; try { builder = factory.newDocumentBuilder(); } catch (ParserConfigurationException e1) { e1.printStackTrace(); } try { doc = builder.parse(inputSource); } catch (SAXParseException e) { e.printStackTrace(); } } catch (IOException e) { e.printStackTrace(); } catch (SAXException e) { e.printStackTrace(); } finally { try { is.close(); } catch (IOException e) { } } // Find a target named "performance" NodeList nodeList = doc.getElementsByTagName("target"); if (nodeList == null || nodeList.getLength() == 0) { return; } for (int i = 0; i < nodeList.getLength(); i++) { Node node = nodeList.item(i); NamedNodeMap map = node.getAttributes(); Node namedItem = map.getNamedItem("name"); String name = namedItem.getNodeValue(); if (namedItem == null) { continue; } else { if (name.equals("performance")){ hasPerformanceTarget=true; return; } } } } public String toString(){ String keyPrefix=id+"_"+version; String performanceProperty=hasPerformanceTarget?id+".has.performance.target="+hasPerformanceTarget+"\n":""; return id+"="+keyPrefix+"\n"+ performanceProperty+ id+".prerequisite.testplugins="+getPrerequisiteList()+"\n"; } private String getPrerequisiteList(){ String prerequisites=""; for (int i=0;i