UnpackJarAntExporter.java :  » IDE-Eclipse » jdt » org » eclipse » jdt » internal » ui » jarpackagerfat » Java Open Source

Java Open Source » IDE Eclipse » jdt 
jdt » org » eclipse » jdt » internal » ui » jarpackagerfat » UnpackJarAntExporter.java
/*******************************************************************************
 * Copyright (c) 2008, 2009 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
 *     Ferenc Hechler, ferenc_hechler@users.sourceforge.net - 219530 [jar application] add Jar-in-Jar ClassLoader option
 *     Ferenc Hechler, ferenc_hechler@users.sourceforge.net - 262766 [jar exporter] ANT file for Jar-in-Jar option contains relative path to jar-rsrc-loader.zip
 *     Ferenc Hechler, ferenc_hechler@users.sourceforge.net - 262763 [jar exporter] remove Built-By attribute in ANT files from Fat JAR Exporter
 *******************************************************************************/
package org.eclipse.jdt.internal.ui.jarpackagerfat;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;

import org.eclipse.core.runtime.IPath;

import org.eclipse.debug.core.ILaunchConfiguration;

/**
 * Create an ANT script for a runnable JAR wit libraries in a sub-folder. The script is generated
 * based on the classpath of the selected launch-configuration.
 * 
 * @since 3.5
 */
public class UnpackJarAntExporter extends FatJarAntExporter {

  public UnpackJarAntExporter(IPath antScriptLocation, IPath jarLocation, ILaunchConfiguration launchConfiguration) {
    super(antScriptLocation, jarLocation, launchConfiguration);
  }

  protected void buildANTScript(IPath antScriptLocation, String projectName, IPath absJarfile, String mainClass, SourceInfo[] sourceInfos) throws IOException {
    OutputStream outputStream = new FileOutputStream(antScriptLocation.toFile());
    String absJarname= absJarfile.toString();
    String subfolder= absJarfile.removeFileExtension().lastSegment() + "_lib"; //$NON-NLS-1$
    String absSubfolder= absJarfile.removeLastSegments(1).append(subfolder).toString();

    DocumentBuilder docBuilder= null;
    DocumentBuilderFactory factory= DocumentBuilderFactory.newInstance();
    factory.setValidating(false);
    try {
      docBuilder= factory.newDocumentBuilder();
    } catch (ParserConfigurationException ex) {
      throw new IOException(FatJarPackagerMessages.FatJarPackageAntScript_error_couldNotGetXmlBuilder);
    }
    Document document= docBuilder.newDocument();

    Node comment;

    // Create the document
    Element project= document.createElement("project"); //$NON-NLS-1$
    project.setAttribute("name", "Create Runnable Jar for Project " + projectName + " with libraries in sub-folder"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
    project.setAttribute("default", "create_run_jar"); //$NON-NLS-1$ //$NON-NLS-2$
    comment= document.createComment("this file was created by Eclipse Runnable JAR Export Wizard"); //$NON-NLS-1$
    project.appendChild(comment);
    comment= document.createComment("ANT 1.7 is required                                        "); //$NON-NLS-1$
    project.appendChild(comment);
    document.appendChild(project);

    Element target= document.createElement("target"); //$NON-NLS-1$
    target.setAttribute("name", "create_run_jar"); //$NON-NLS-1$ //$NON-NLS-2$
    project.appendChild(target);

    Element jar= document.createElement("jar"); //$NON-NLS-1$
    jar.setAttribute("destfile", absJarname); //$NON-NLS-1$s 
    target.appendChild(jar);

    Element manifest= document.createElement("manifest"); //$NON-NLS-1$
    jar.appendChild(manifest);

    Element attribute= document.createElement("attribute"); //$NON-NLS-1$
    attribute.setAttribute("name", "Main-Class"); //$NON-NLS-1$ //$NON-NLS-2$s 
    attribute.setAttribute("value", mainClass); //$NON-NLS-1$ 
    manifest.appendChild(attribute);

    attribute= document.createElement("attribute"); //$NON-NLS-1$
    attribute.setAttribute("name", "Class-Path"); //$NON-NLS-1$ //$NON-NLS-2$s 
    StringBuffer classPath= new StringBuffer();
    classPath.append("."); //$NON-NLS-1$
    for (int i= 0; i < sourceInfos.length; i++) {
      SourceInfo sourceInfo= sourceInfos[i];
      if (sourceInfo.isJar) {
        classPath.append(" ").append(subfolder).append("/") //$NON-NLS-1$ //$NON-NLS-2$
            .append(new File(sourceInfo.absPath).getName());
      }
    }
    attribute.setAttribute("value", classPath.toString()); //$NON-NLS-1$  
    manifest.appendChild(attribute);

    // add folders
    for (int i= 0; i < sourceInfos.length; i++) {
      SourceInfo sourceInfo= sourceInfos[i];
      if (!sourceInfo.isJar) {
        Element fileset= document.createElement("fileset"); //$NON-NLS-1$
        fileset.setAttribute("dir", sourceInfo.absPath); //$NON-NLS-1$
        jar.appendChild(fileset);
      }
    }

    
    Element delete= document.createElement("delete"); //$NON-NLS-1$
    delete.setAttribute("dir", absSubfolder); //$NON-NLS-1$s 
    target.appendChild(delete);

    Element mkdir= document.createElement("mkdir"); //$NON-NLS-1$
    mkdir.setAttribute("dir", absSubfolder); //$NON-NLS-1$s 
    target.appendChild(mkdir);

    // add libraries
    for (int i= 0; i < sourceInfos.length; i++) {
      SourceInfo sourceInfo= sourceInfos[i];
      if (sourceInfo.isJar) {
        Element copy= document.createElement("copy"); //$NON-NLS-1$
        copy.setAttribute("file", sourceInfo.absPath); //$NON-NLS-1$
        copy.setAttribute("todir", absSubfolder); //$NON-NLS-1$
        target.appendChild(copy);
      }
    }

    // add folders
    for (int i= 0; i < sourceInfos.length; i++) {
      SourceInfo sourceInfo= sourceInfos[i];
      if (!sourceInfo.isJar) {
      }
    }
    
    
    try {
      // Write the document to the stream
      Transformer transformer= TransformerFactory.newInstance().newTransformer();
      transformer.setOutputProperty(OutputKeys.METHOD, "xml"); //$NON-NLS-1$
      transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8"); //$NON-NLS-1$
      transformer.setOutputProperty(OutputKeys.INDENT, "yes"); //$NON-NLS-1$
      transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4"); //$NON-NLS-1$ //$NON-NLS-2$
      DOMSource source= new DOMSource(document);
      StreamResult result= new StreamResult(outputStream);
      transformer.transform(source, result);
    } catch (TransformerException e) {
      throw new IOException(FatJarPackagerMessages.FatJarPackageAntScript_error_couldNotTransformToXML);
    }
  }

}
java2s.com  | Contact Us | Privacy Policy
Copyright 2009 - 12 Demo Source and Support. All rights reserved.
All other trademarks are property of their respective owners.