Package org.gudy.azureus2.core3.util.jar

Source Code of org.gudy.azureus2.core3.util.jar.AEJarBuilder

/*
* File    : WUJarBuilder.java
* Created : 10-Feb-2004
* By      : parg
*
* Azureus - a Java Bittorrent client
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
* GNU General Public License for more details ( see the LICENSE file ).
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
*/

package org.gudy.azureus2.core3.util.jar;

/**
* @author parg
*
*/

import java.io.*;
import java.net.URL;
import java.net.URI;
import java.util.jar.*;
import java.util.*;

import org.gudy.azureus2.core3.security.SEKeyDetails;
import org.gudy.azureus2.core3.security.SESecurityManager;
import org.gudy.azureus2.core3.util.*;
import org.gudy.azureus2.core3.logging.*;

public class
AEJarBuilder
  public static long
  buildFromPackages(
    OutputStream    os,
    ClassLoader      class_loader,
    String[]      package_names,
    Map          package_map,
    String        sign_alias )
   
      throws IOException
  {
    List  resource_names = new ArrayList();
   
    for (int i=0;i<package_names.length;i++){
     
      List  entries = (List)package_map.get(package_names[i]);
     
      if ( entries == null ){
       
        Debug.out( "package '" + package_names[i] + "' missing" );
       
      }else{
     
        for (int j=0;j<entries.size();j++){
       
          resource_names.add( package_names[i] + "/" + entries.get(j));
        }
      }
    }
   
    String[]  res = new String[resource_names.size()];
   
    resource_names.toArray( res );
   
    return( buildFromResources2( os, class_loader, null, res, sign_alias ))
  }
 
  public static void
  buildFromResources(
    OutputStream    os,
    ClassLoader      class_loader,
    String        resource_prefix,
    String[]      resource_names,
    String        sign_alias )
   
      throws IOException
  {
    buildFromResources2( os, class_loader, resource_prefix, resource_names, sign_alias )
  }
 
  private static long
  buildFromResources2(
    OutputStream    os,
    ClassLoader      class_loader,
    String        resource_prefix,
    String[]      resource_names,
    String        sign_alias )
   
    throws IOException
  {
    if ( sign_alias != null ){
     
      ByteArrayOutputStream  baos = new ByteArrayOutputStream(65536);
     
      long tim = buildFromResourcesSupport( new JarOutputStream( baos ),class_loader,resource_prefix,resource_names );
           
      try{
          // leave this check in here as we might as well check for the alias
       
        SEKeyDetails  kd = SESecurityManager.getKeyDetails( sign_alias );
     
        if ( kd == null ){
          Logger.log(new LogAlert(LogAlert.UNREPEATABLE, LogAlert.AT_ERROR,
              "Certificate alias '" + sign_alias
                  + "' not found, jar signing fails"));
         
          throw( new Exception( "Certificate alias '" + sign_alias + "' not found "));
        }
       
        // WUJarSigner signer = new WUJarSigner(sign_alias, (PrivateKey)kd.getKey(), kd.getCertificateChain());

        AEJarSigner2 signer =
          new AEJarSigner2(
              sign_alias,
              SESecurityManager.getKeystoreName(),
              SESecurityManager.getKeystorePassword());
             
        signer.signJarStream( new ByteArrayInputStream(baos.toByteArray()), os );
     
        return( tim );
       
      }catch( Throwable e ){
       
        Debug.printStackTrace( e );
       
        throw( new IOException( e.getMessage()));
      }
     
    }else{
           
      JarOutputStream  jos;
     
      if ( os instanceof JarOutputStream ){
       
        jos  = (JarOutputStream)os;
       
      }else{
               
        jos = new JarOutputStream( os );
      }
     
      return( buildFromResourcesSupport( jos,class_loader,resource_prefix,resource_names ));
    }
  }
 
  public static long
  buildFromResourcesSupport(
    JarOutputStream    jos,
    ClassLoader      class_loader,
    String        resource_prefix,
    String[]      resource_names )
 
    throws IOException
  {   
    long  latest_time  = 0;
    long  now      = SystemTime.getCurrentTime();
   
    for (int i=0;i<resource_names.length;i++){
 
      String  resource_name = resource_names[i];
 
      if ( resource_prefix != null ){
       
        resource_name = resource_prefix + "/" + resource_name;
      }
     
      InputStream  is = null;
     
      try{
        is  = class_loader.getResourceAsStream(resource_name);
     
        if ( is == null ){
       
          Debug.out( "WUJarBuilder: failed to find resource '" + resource_name + "'");
 
        }else{
       
          URL  url = class_loader.getResource( resource_name );
         
          try{
            File  file = null;
           
            if ( url != null ){
             
              String  url_str = url.toString();
             
              if ( url_str.startsWith("jar:file:" )){
               
                file  = FileUtil.getJarFileFromURL( url_str );
               
              }else if ( url_str.startsWith( "file:")){
               
                file  = new File( URI.create( url_str ));
              }
            }
           
            if ( file == null ){
             
              latest_time  = now;
             
            }else{
           
              long  time = file.lastModified();
             
              if ( time > latest_time ){
               
                latest_time  = time;
              }
            }
          }catch( Throwable e ){
           
            Debug.printStackTrace( e );
          }
         
          JarEntry entry = new JarEntry(resource_name);
     
          writeEntry( jos, entry, is );
        }
      }finally{
        if ( is != null ){
         
          is.close();
        }
      }
    }
   
    JarEntry entry = new JarEntry("META-INF/MANIFEST.MF");
   
    ByteArrayInputStream bais = new ByteArrayInputStream("Manifest-Version: 1.0\r\n\r\n".getBytes());
   
    writeEntry( jos, entry, bais );
   
    jos.flush();
   
    jos.finish();
   
    return( latest_time );
  }
 
 

  private static void
  writeEntry(
    JarOutputStream   jos,
    JarEntry       entry,
    InputStream     data )
 
    throws IOException
  {
    jos.putNextEntry(entry);

    byte[]  newBytes = new byte[4096];
   
    int size = data.read(newBytes);

    while (size != -1){
     
      jos.write(newBytes, 0, size);
     
      size = data.read(newBytes);
    }
  }
}
TOP

Related Classes of org.gudy.azureus2.core3.util.jar.AEJarBuilder

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.