Home | History | Annotate | Download | only in releng
      1 /*******************************************************************************
      2  * Copyright (c) 2005, 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;
     12 
     13 import java.io.BufferedReader;
     14 import java.io.File;
     15 import java.io.FileNotFoundException;
     16 import java.io.FileReader;
     17 import java.io.IOException;
     18 import java.io.InputStream;
     19 import java.io.InputStreamReader;
     20 import java.util.ArrayList;
     21 
     22 import javax.xml.parsers.DocumentBuilder;
     23 import javax.xml.parsers.DocumentBuilderFactory;
     24 import javax.xml.parsers.ParserConfigurationException;
     25 
     26 import org.apache.tools.ant.Task;
     27 import org.w3c.dom.Document;
     28 import org.w3c.dom.NamedNodeMap;
     29 import org.w3c.dom.Node;
     30 import org.w3c.dom.NodeList;
     31 import org.xml.sax.InputSource;
     32 import org.xml.sax.SAXException;
     33 
     34 public class UnpackUpdateJars extends Task {
     35 
     36 	/**
     37 	 * @param args
     38 	 */
     39 	//parent to plugins and features directory which contains update jars
     40 	private String site;
     41 	private String output;
     42 	ArrayList unpackedPlugins=new ArrayList();
     43 
     44 	public static void main(String[] args) {
     45 		// TODO Auto-generated method stub
     46 		UnpackUpdateJars up=new UnpackUpdateJars();
     47 		up.site="C:\\updatejars\\eclipse";
     48 		up.output="C:\\updatejars\\newsite";
     49 		up.execute();
     50 	}
     51 
     52 	public UnpackUpdateJars(){
     53 		super();
     54 	}
     55 
     56 	//unpack features, then unpack plug-ins which are not set to unpack="false"
     57 	public void execute(){
     58 		new File(output).mkdirs();
     59 		new File(output+"/features").mkdirs();
     60 		new File(output+"/plugins").mkdirs();
     61 
     62 		//extract features
     63 		File featureDir=new File(site,"features");
     64 		if (!featureDir.exists()){
     65 			return;
     66 		}
     67 		File[] features = featureDir.listFiles();
     68 		for (int i = 0; i < features.length; i++) {
     69 			File feature = features[i];
     70 			if (feature.getName().endsWith(".jar")) {
     71 				String fileName = feature.getName();
     72 				String unpackedFeatureName = fileName.substring(0, fileName.length() - 4);
     73 				File unPackedFeature=new File(output+"/features/"+ unpackedFeatureName);
     74 				unzip(feature, unPackedFeature);
     75 				getUnpackedPluginList(new File(unPackedFeature,"feature.xml"));
     76 			}
     77 		}
     78 
     79 		//unpack plug-ins
     80 		for (int i=0;i<unpackedPlugins.size();i++){
     81 			File unpackedPluginDirName=new File(output+"/plugins/"+(String)unpackedPlugins.get(i));
     82 			File jardPlugin=new File(site,"plugins/"+(String)unpackedPlugins.get(i)+".jar");
     83 			if (jardPlugin.exists())
     84 				unzip (jardPlugin,unpackedPluginDirName);
     85 		}
     86 	}
     87 
     88 	public void unzip(File src, File dest) {
     89 		Runtime rt = Runtime.getRuntime();
     90 		String command = "unzip -qo " + src.getPath() + " -d " + dest.getPath();
     91 		System.out.println("[exec] "+command);
     92 		Process proc = null;
     93 		try {
     94 			proc = rt.exec(command);
     95 		} catch (IOException e) {
     96 			// TODO Auto-generated catch block
     97 			e.printStackTrace();
     98 		}
     99 		// pick up error messages
    100 		StreamHandler errorHandler = new StreamHandler(proc.getErrorStream(), "ERROR");
    101 
    102 		// pick up output
    103 		StreamHandler outputHandler = new StreamHandler(proc.getInputStream(), "OUTPUT");
    104 
    105 		// kick them off
    106 		errorHandler.start();
    107 		outputHandler.start();
    108 
    109 		// capture return code
    110 		int returnCode = 0;
    111 		try {
    112 			returnCode = proc.waitFor();
    113 		} catch (InterruptedException e) {
    114 			// TODO Auto-generated catch block
    115 			e.printStackTrace();
    116 		}
    117 		if (returnCode!=0)
    118 			System.out.println("returnCode: " + returnCode);
    119 
    120 	}
    121 
    122 	class StreamHandler extends Thread {
    123 		InputStream is;
    124 
    125 		String type;
    126 
    127 		StreamHandler(InputStream is, String type) {
    128 			this.is = is;
    129 			this.type = type;
    130 		}
    131 
    132 		public void run() {
    133 			try {
    134 				InputStreamReader isr = new InputStreamReader(is);
    135 				BufferedReader br = new BufferedReader(isr);
    136 				String line = null;
    137 				while ((line = br.readLine()) != null)
    138 					System.out.println(type + ">" + line);
    139 			} catch (IOException ioe) {
    140 				ioe.printStackTrace();
    141 			}
    142 		}
    143 	}
    144 
    145 	public String getSite() {
    146 		return site;
    147 	}
    148 
    149 	public void setSite(String site) {
    150 		this.site = site;
    151 	}
    152 
    153 	private void getUnpackedPluginList(File featureXml) {
    154 		Document aDocument=null;
    155 		BufferedReader reader = null;
    156 		try {
    157 			reader = new BufferedReader(new FileReader(featureXml));
    158 		} catch (FileNotFoundException e) {
    159 			e.printStackTrace();
    160 		}
    161 
    162 		InputSource inputSource = new InputSource(reader);
    163 		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    164 		DocumentBuilder builder = null;
    165 
    166 		try {
    167 			builder = factory.newDocumentBuilder();
    168 		} catch (ParserConfigurationException e) {
    169 			e.printStackTrace();
    170 		}
    171 
    172 		try {
    173 			aDocument = builder.parse(inputSource);
    174 		} catch (SAXException e) {
    175 			e.printStackTrace();
    176 		} catch (IOException e) {
    177 			e.printStackTrace();
    178 		}
    179 		// Get feature attributes
    180 		NodeList nodeList=aDocument.getElementsByTagName("plugin");
    181 		if (nodeList==null)
    182 			return;
    183 
    184 		for (int i = 0; i < nodeList.getLength(); i++) {
    185 			Node pluginNode = nodeList.item(i);
    186 			NamedNodeMap aNamedNodeMap = pluginNode.getAttributes();
    187 			Node idNode = aNamedNodeMap.getNamedItem("id");
    188 			Node versionNode = aNamedNodeMap.getNamedItem("version");
    189 			String pluginDirName = idNode.getNodeValue() + "_" + versionNode.getNodeValue();
    190 			Node unpackNode = aNamedNodeMap.getNamedItem("unpack");
    191 			if (unpackNode == null) {
    192 				if (!unpackedPlugins.contains(pluginDirName)) {
    193 					unpackedPlugins.add(pluginDirName);
    194 				}
    195 				continue;
    196 			}
    197 
    198 			if (unpackNode.getNodeValue().toString().trim().toLowerCase().equals("true")) {
    199 				if (!unpackedPlugins.contains(pluginDirName)){
    200 					System.out.println(pluginDirName);
    201 					unpackedPlugins.add(pluginDirName);
    202 				}
    203 				continue;
    204 			}
    205 			//copy file to new location
    206 			File jardPlugin=new File(site,"plugins/"+pluginDirName+".jar");
    207 			if (jardPlugin.exists())
    208 				if (!jardPlugin.renameTo(new File(output,"plugins/"+pluginDirName+".jar")))
    209 					System.out.println("Failed to move "+jardPlugin.getAbsolutePath()+" to "+output+"plugins/"+pluginDirName+".jar");
    210 		}
    211 	}
    212 
    213 	public String getOutput() {
    214 		return output;
    215 	}
    216 
    217 	public void setOutput(String output) {
    218 		this.output = output;
    219 	}
    220 }
    221