diff options
Diffstat (limited to 'basebuilder-3.6.2/org.eclipse.releng.basebuilder/plugins/org.eclipse.build.tools/src/org/eclipse/releng/generators/TestVersionTracker.java')
-rw-r--r-- | basebuilder-3.6.2/org.eclipse.releng.basebuilder/plugins/org.eclipse.build.tools/src/org/eclipse/releng/generators/TestVersionTracker.java | 405 |
1 files changed, 405 insertions, 0 deletions
diff --git a/basebuilder-3.6.2/org.eclipse.releng.basebuilder/plugins/org.eclipse.build.tools/src/org/eclipse/releng/generators/TestVersionTracker.java b/basebuilder-3.6.2/org.eclipse.releng.basebuilder/plugins/org.eclipse.build.tools/src/org/eclipse/releng/generators/TestVersionTracker.java new file mode 100644 index 0000000..7ed4ac3 --- /dev/null +++ b/basebuilder-3.6.2/org.eclipse.releng.basebuilder/plugins/org.eclipse.build.tools/src/org/eclipse/releng/generators/TestVersionTracker.java @@ -0,0 +1,405 @@ +/******************************************************************************* + * 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 <element>=<element>_<version> 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<prerequisitePlugins.size();i++){ + prerequisites=prerequisites.concat("**/${"+prerequisitePlugins.get(i)+"}** "); + } + return prerequisites; + } + } + + public void writeProperties(String propertiesFile,boolean append){ + + try{ + + PrintWriter writer = new PrintWriter(new FileWriter(propertiesFile,append)); + + Object[] keys = elements.keySet().toArray(); + Arrays.sort(keys); + for (int i=0;i<keys.length;i++){ + Object key = keys[i]; + writer.println(((TestPlugin)elements.get(key)).toString()); + writer.flush(); + } + writer.close(); + + } catch (IOException e){ + System.out.println("Unable to write to file "+propertiesFile); + } + + + } + + + /** + * @return Returns the outputFilePath. + */ + public String getOutputFilePath() { + return outputFile; + } + + /** + * @param outputFilePath The outputFilePath to set. + */ + public void setOutputFilePath(String outputFilePath) { + this.outputFile = outputFilePath; + } + + public String getBuildDirectory() { + return buildDirectory; + } + + public void setBuildDirectory(String buildDirectory) { + this.buildDirectory = buildDirectory; + } + + public String getFeatureId() { + return featureId; + } + + public void setFeatureId(String featureId) { + this.featureId = featureId; + } + + public String getOutputFile() { + return outputFile; + } + + public void setOutputFile(String outputFile) { + this.outputFile = outputFile; + } + + + + +} |