Package org.objectweb.joram.client.connector.utils

Source Code of org.objectweb.joram.client.connector.utils.RAConfig

/*
* JORAM: Java(TM) Open Reliable Asynchronous Messaging
* Copyright (C) 2005 - Bull SA
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or any later version.
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307
* USA.
*
* Initial developer(s): Nicolas Tachker (ScalAgent)
* Contributor(s):
*/
package org.objectweb.joram.client.connector.utils;

import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.InputStream;
import java.io.LineNumberReader;
import java.io.OutputStream;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Map;
import java.util.StringTokenizer;
import java.util.jar.JarFile;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;

import fr.dyade.aaa.agent.conf.A3CML;
import fr.dyade.aaa.agent.conf.A3CMLConfig;
import fr.dyade.aaa.agent.conf.A3CMLServer;
import fr.dyade.aaa.agent.conf.A3CMLService;

/**
*
*/
public class RAConfig {

  private static final String RA_XML = "META-INF/ra.xml";
  private static final String JORAM_CONFIG_JAR = "joram-config.jar";
  private static final String A3SERVERS_XML = "a3servers.xml";
  private static final String A3DEBUG_CFG = "a3debug.cfg";
  private static final String RA_PROPERTIES = "ra.properties";
  private static final String JORAMADMIN_CFG = "joram-admin.cfg";
  private static final String JORAMADMIN_XML = "joramAdmin.xml";
  private static final int BUFFER_SIZE = 2048;
  private static boolean debug = false;
  private static boolean verbose = false;
  private static String confDir = null;
  private static String tmpDir = null;


  private RAConfig() {
  }

  public static void main(String [] args) throws Exception {
    RAConfig raconfig = new RAConfig();

    debug = new Boolean(System.getProperty("debug","false")).booleanValue();

    String rarName = null;
    String jarName = null;
    String raProperties = null;
    String extractFile = null;
    String hostName = null;
    String port = null;
    String serverId = null;
    String path = null;
    String newFileName = null;
    String oldFileName = null;
    String rootName = null;
    String rootPasswd = null;
    String identityClass = null;

    int command = -1;

    try {
      int i = 0;
      while (i < args.length) {
        if (args[i].equals("-rar")) {
          rarName = args[i+1];
          i = i + 2;
        } else if (args[i].equals("-jar")) {
          jarName = args[i+1];
          i = i + 2;
        } else if (args[i].equals("-c")) {
          command = 1;
          i++;
        } else if (args[i].equals("-u")) {
          command = 2;
          raProperties = args[i+1];
          i = i + 2;
        } else if (args[i].equals("-x")) {
          command = 3;
          extractFile = args[i+1];
          i = i + 2;
        } else if (args[i].equals("-uhp")) {
          command = 4;
          hostName = args[i+1];
          port = args[i+2];
          serverId = args[i+3];
          i = i + 3;
        } else if (args[i].equals("-ua3")) {
          command = 5;
          hostName = args[i+1];
          port = args[i+2];
          serverId = args[i+3];
          i = i + 3;
        } else if (args[i].equals("-uz")) {
          command = 6;
          path = args[i+1];
          newFileName = args[i+2];
          oldFileName = args[i+3];
          i = i + 3;
        } else if (args[i].equals("-urpi")) {
          command = 7;
          rootName = args[i+1];
          rootPasswd = args[i+2];
          identityClass = args[i+3];
          i = i + 3;
        } else if (args[i].equals("-conf")) {
          confDir = args[i+1];
          i = i + 2;
        } else if (args[i].equals("-v")) {
          verbose = true;
          i = i + 1;
        } else
          i++;
      }
    } catch (Exception e) {
      usage();
      e.printStackTrace();
      System.exit(1);
    }

    //  Get the temp directory
    tmpDir = System.getProperty("java.io.tmpdir") + "/";

    switch (command) {
    case 1: // createRaProperties
      if (rarName == null)
        usage();
      raconfig.createRaProperties(rarName);
      break;
    case 2: // updateRAR
      if (raProperties == null)
        usage();
      raconfig.updateRAR(raProperties, true);
      break;
    case 3: // extractFile
      if (extractFile != null) {
        if (rarName != null) {
          raconfig.extractFromRAR(rarName,extractFile);
        } else if (jarName != null) {
          raconfig.extractFromJAR(jarName,extractFile);
        } else
          usage();
      } else
        usage();
      break;
    case 4: // updateHostPort
      if (rarName == null
          || hostName == null
          || port == null
          || serverId == null)
        usage();
      raconfig.updateHostPort(rarName,hostName,port,new Short(serverId).shortValue());
      break;
    case 5: // updateA3Servers
      if (rarName == null
          || hostName == null
          || port == null
          || serverId == null)
        usage();
      raconfig.updateA3Servers(rarName,hostName,port,new Short(serverId).shortValue());
      break;
    case 6: // updateZIP
      if ( path != null
           && newFileName != null) {
        if (rarName != null)
          raconfig.updateZIP(rarName,path,newFileName,oldFileName);
        if (jarName != null)
          raconfig.updateZIP(jarName,path,newFileName,oldFileName);
      } else
        usage();
      break;
    case 7: // update rootName rootPasswd identityClass
      if (rootName == null
          || rootPasswd == null
          || identityClass == null)
        usage();
      raconfig.updateRootName(rarName, rootName, rootPasswd, identityClass);
      break;
    default:
      usage();
      break;
    }
  }

  /**
   * Usage of RAConfig.
   */
  public static void usage() {
    StringBuffer buff = new StringBuffer();

    buff.append("\n\n");
    buff.append("\nConfigure your Joram RAR:");
    buff.append("\n  -resource adapter deployment descriptor (ra.xml)");
    buff.append("\n  -joram server configuration file (a3servers.xml)");
    buff.append("\n\n");
    buff.append("\nSimple: create ra.properties, modify ra.properties and update rar.");
    buff.append("\n  create ra.properties         : java RAconfig -rar rarName -c");
    buff.append("\n  update RAR                   : java RAconfig -u ra.properties");
    buff.append("\n");
    buff.append("\nChange host and port value in ra.xml and a3servers.xml.");
    buff.append("\n  update RAR (host/port)       : java RAconfig -rar rarName -uhp host port serverId");
    buff.append("\nChange host and port value only in a3servers.xml");
    buff.append("\n  update A3servers (host/port) : java RAconfig -rar rarName -ua3 host port serverId");
    buff.append("\n\n");
    buff.append("\nExpert: extract ra.xml and a3servers.xml (joram-config.jar), modify and update jar/rar.");
    buff.append("\n  extract file from RAR        : java RAconfig -rar rarName -x fileName");
    buff.append("\n  update RAR                   : java RAconfig -rar rarName -uz path newFileName oldFileName");
    buff.append("\n");
    buff.append("\nchange rootName rootPass       : java RAconfig -rar rarName -urpi rootName rootPasswd identityClass");
    buff.append("\n");
    buff.append("\n  extract file from JAR        : java RAconfig -jar jarName -x fileName");
    buff.append("\n  update JAR                   : java RAconfig -jar jarName -uz path newFileName oldFileName");
    buff.append("\n\n");
    buff.append("\nVerbose                        : -v");
    buff.append("\n\n");
    buff.append("\nexample :");
    buff.append("\n   java RAconfig -u ra.properties");
    buff.append("\n   java RAconfig -rar joram.rar -uhp localhost 16010 0");
    buff.append("\n   java RAconfig -rar joram.rar -uz META-INF/ra.xml ra.xml META-INF/ra.xml");
    buff.append("\n\n\n");

    System.out.println(buff.toString());
  }


  /**
   * create ra.properties
   * build from the ra.xml file from RAR.
   * @param rarName  String input RAR file name
   * @throws Exception to throw if an Exception occurs
   */
  private void createRaProperties(String rarName)
    throws Exception {

    if (debug)
      System.out.println("RAConfig.createRaProperties(" + rarName + ")");
    else if (verbose)
      System.out.println("create ra.properties " + rarName);

    File file = new File(rarName);
    if (file.exists()) {
      ZipFile zipFile = new ZipFile(file.getAbsolutePath());
      for (Enumeration zippedFiles = zipFile.entries(); zippedFiles.hasMoreElements(); ) {
        //Retrieve entry of existing files
        ZipEntry currEntry = (ZipEntry) zippedFiles.nextElement();
        if (debug)
          System.out.println("RAConfig.createRaProperties : currEntry = " + currEntry);
        if (currEntry.getName().equalsIgnoreCase(RA_XML)) {
          InputStream reader = zipFile.getInputStream(currEntry);
          StringBuffer buff = new StringBuffer();
          buff.append("RAR_NAME  ");
          buff.append(file.getAbsolutePath());
          buff.append("\n");
          //parse ra.xml file
          buff.append(parse(reader));
          // create ra.properties file
          createFile(RA_PROPERTIES,buff.toString());
          break;
        }
      }
      zipFile.close();
    }
  }


  /**
   * Extract the fileName from the RAR file.
   * @param rarName   RAR file name
   * @param fileName  file name
   * @throws Exception to throw if an Exception occurs
   */
  private void extractFromRAR(String rarName, String fileName)
    throws Exception {

    if (debug)
      System.out.println("RAConfig.extractFromRAR(" + rarName + "," + fileName + ")");
    else if (verbose)
      System.out.println("extract \"" + fileName + "\" from \"" + rarName + "\"");

    InputStream res = null;
    File file = new File(rarName);
    if (file.exists()) {
      ZipFile zipFile = new ZipFile(file.getAbsolutePath());
      for (Enumeration zippedFiles = zipFile.entries(); zippedFiles.hasMoreElements(); ) {
        //Retrieve entry of existing files
        ZipEntry currEntry = (ZipEntry) zippedFiles.nextElement();
        if (debug)
          System.out.println("RAConfig.extractFromRAR : currEntry = " + currEntry);
        if (currEntry.getName().equalsIgnoreCase(fileName)
            || currEntry.getName().equalsIgnoreCase("META-INF/"+fileName)) {
          // the fileName is found.
          res =  zipFile.getInputStream(currEntry);
          break;
        } else if (currEntry.getName().endsWith(".jar")) {
          // search fileName in jar file.
          InputStream reader = zipFile.getInputStream(currEntry);
          res = extractFromJAR(fileName,reader);
          if (res == null) continue;
         
          // the fileName found in jar file.
          reader.close();
          break;
        }
      }
      // extract the fileName from InputStream
      // in the tmp directory.
      if (res != null)
        createFile(fileName,res);
      zipFile.close();
    }
  }

  /**
   * Extract fileName from the JAR file.
   * @param fileName  file name
   * @param reader    Input stream
   * @throws Exception to throw if an Exception occurs
   */
  private InputStream extractFromJAR(String fileName, InputStream reader)
    throws Exception {

    if (debug)
      System.out.println("RAConfig.extractFromJAR(" + fileName +  "," + reader + ")");

    ZipInputStream stream = new ZipInputStream(reader);
    ZipEntry currEntry = stream.getNextEntry();
    while (stream.available() > 0) {
      if (currEntry == null) break;
      if (currEntry.getName().equalsIgnoreCase(fileName)) {
        // the fileName is found, return the InputStream.
        if (debug)
          System.out.println("RAConfig.extractFromJAR : currEntry = " + currEntry);
        else if (verbose)
          System.out.println("extract \"" + fileName + "\" from JAR.");

        return stream;
      }
      currEntry = stream.getNextEntry();
    }
    // close the stream and return null if file not found.
    stream.close();
    return null;
  }

  /**
   * Extract config files from the JAR file.
   * @param jarName    JAR file name
   * @param fileName   file to be extract
   * @throws Exception to throw if an Exception occurs
   */
  private void extractFromJAR(String jarName, String fileName)
    throws Exception {

    if (debug)
      System.out.println("RAConfig.extractFromJAR(" + jarName +  "," + fileName + ")");
    else if (verbose)
      System.out.println("extract \"" + fileName + "\" from \"" + jarName + "\"");

    JarFile jar = new JarFile(jarName);
    ZipEntry entry = jar.getEntry(fileName);
    if (debug)
      System.out.println("RAConfig.extractFromJAR : entry = " + entry);
    // extract the fileName from jar in the tmp directory.
    if (entry != null)
      createFile(fileName,jar.getInputStream(entry));
    jar.close();
  }


  /**
   * write the inputstream in outputstream.
   * @param is    input stream
   * @param os    output stream
   * @throws Exception to throw if an Exception occurs
   */
  private void dump(InputStream is, OutputStream os) throws Exception {
    int n = 0;
    byte[] buffer = new byte[BUFFER_SIZE];
    n = is.read(buffer);
    while (n > 0) {
      os.write(buffer, 0, n);
      n = is.read(buffer);
    }
  }

  private String getFileName(String path) throws Exception {
    int i = path.lastIndexOf("/");
    if (i > 0)
      return path.substring(i+1,path.length());
    i = path.lastIndexOf("\\");
    if (i > 0)
      return path.substring(i+1,path.length());
    return path;
  }

  /**
   * create the filename in the tmp directory
   * by writing the input stream in the file name.
   * @param path        new file
   * @param is          input stream
   * @throws Exception to throw if an Exception occurs
   */
  private void createFile(String path, InputStream is) throws Exception {
    if (debug)
      System.out.println("RAConfig.createFile(" + path + "," + is + ")");

    String fileName = tmpDir + getFileName(path);
    if (debug)
      System.out.println("RAConfig.createFile : fileName = " + fileName);
    else if (verbose)
      System.out.println("create file \"" + fileName + "\"");

    new File(fileName).delete();
    FileOutputStream fos = new FileOutputStream(fileName);
    try {
      dump(is,fos);
    } finally {
      fos.close();
    }
  }

  /**
   * create the filename in the tmp directory,
   * by writing the input in the file name.
   * @param path        new file
   * @param input       string to write
   * @throws Exception to throw if an Exception occurs
   */
  private void createFile(String path, String input) throws Exception {
    if (debug)
      System.out.println("RAConfig.createFile(" + path + "," + input + ")");
    String fileName = tmpDir + getFileName(path);
    if (debug)
      System.out.println("RAConfig.createFile : fileName = " + fileName);
    else if (verbose)
      System.out.println("create file \"" + fileName + "\"");

    new File(fileName).delete();
    ByteArrayInputStream bis = new ByteArrayInputStream(input.getBytes());
    FileOutputStream fos = new FileOutputStream(fileName);
    try {
      dump(bis,fos);
    } finally {
      fos.close();
      bis.close();
    }
  }

  /**
   * parse input stream.
   * @param is    input stream
   * @throws Exception to throw if an Exception occurs
   */
  private String parse(InputStream is) throws Exception {
    if (debug)
      System.out.println("RAConfig.parse(" + is + ")");

    Wrapper wrapper = new Wrapper(debug);
    return wrapper.parse(is);
  }

  /**
   * update input stream with map value.
   * @param is    input stream
   * @param map   map value (see ra.properties)
   * @throws Exception to throw if an Exception occurs
   */
  private String update(InputStream is, Map map) throws Exception {
    if (debug)
      System.out.println("RAConfig.update(" + is + "," + map + ")");

    Wrapper wrapper = new Wrapper(debug);
    return wrapper.update(is,map);
  }

  /**
   * update host/port in ra.xml and a3server.xml in RAR.
   * @param rarName   rar file name
   * @param hostName  new host name
   * @param port      new port
   * @param serverId  server Id
   */
  private void updateHostPort(String rarName,
                              String hostName,
                              String port,
                              short serverId) throws Exception {
    if (debug)
      System.out.println("RAConfig.updateHostPort(" + rarName +
                         "," + hostName +
                         "," + port +
                         "," + serverId + ")");
    else if (verbose)
      System.out.println("update (ra.xml and a3server.xml) in \"" + rarName +
                         "\" with host=" + hostName +
                         " port=" + port +
                         " serverId=" + serverId);

    // update ra.xml file
    File file = new File(rarName);
    StringBuffer buff = new StringBuffer();
    buff.append("RAR_NAME  ");
    buff.append(file.getAbsolutePath());
    buff.append("\n[org.objectweb.joram.client.connector.JoramAdapter]");
    buff.append("\nHostName  ");
    buff.append(hostName);
    buff.append("\nServerPort  ");
    buff.append(port);
    buff.append("\nServerId  ");
    buff.append(serverId);
    // create temporary raProperty file
    String tempFile = "ra.properties_tmp";
    createFile(tempFile,buff.toString());
    updateRAR(tmpDir + tempFile, true);
    new File(tmpDir + tempFile).delete();
  }

  /**
   * update host/port in ra.xml and a3server.xml in RAR.
   * @param rarName   rar file name
   * @param rootName  new root name
   * @param rootPasswd  new RootPasswd
   * @param identityClass  new IdentityClass
   * @param serverId  server Id
   */
  private void updateRootName(String rarName,
                              String rootName,
                              String rootPasswd,
                              String identityClass) throws Exception {
    if (debug)
      System.out.println("RAConfig.updateRootName(" + rarName +
                         "," + rootName +
                         "," + rootPasswd +
                         "," + identityClass + ")");
    else if (verbose)
      System.out.println("update (ra.xml) in \"" + rarName +
                         "\" with RootName=" + rootName +
                         " RootPasswd=" + rootPasswd +
                         " IdentityClass=" + identityClass);

    // update ra.xml file
    File file = new File(rarName);
    StringBuffer buff = new StringBuffer();
    buff.append("RAR_NAME  ");
    buff.append(file.getAbsolutePath());
    buff.append("\n[org.objectweb.joram.client.connector.JoramAdapter]");
    buff.append("\nRootName  ");
    buff.append(rootName);
    buff.append("\nRootPasswd  ");
    buff.append(rootPasswd);
    buff.append("\nIdentityClass  ");
    buff.append(identityClass);
    // create temporary raProperty file
    String tempFile = "ra.properties_tmp";
    createFile(tempFile,buff.toString());
    updateRAR(tmpDir + tempFile, false);
    new File(tmpDir + tempFile).delete();
  }
 
  /**
   * update A3SERVERS_XML file
   * @param rarName   rar file name
   * @param hostName  new host name
   * @param port      new port
   * @param serverId  server Id
   */
  private void updateA3Servers(String rarName,
                               String hostName,
                               String port,
                               short serverId)
    throws Exception {
    if (debug)
      System.out.println("RAConfig.updateA3Servers(" + rarName +
                         "," + hostName +
                         "," + port +
                         "," + serverId + ")");
    else if (verbose)
      System.out.println("update (a3server.xml) in \"" + rarName +
                         "\" host=" + hostName +
                         " port=" + port +
                         " serverId=" + serverId);

    // extract the joram-config.jar file from RAR in the temp dir
    extractFromRAR(rarName,JORAM_CONFIG_JAR);

    // if present the a3server.xml source is the confdir one
    // otherwise, we take the RAR one
    if (confDir != null) {
        File f = new File(confDir, A3SERVERS_XML);
        if (f.exists()) {
            copy(f.getPath(), tmpDir + A3SERVERS_XML);
        } else {
          // extract the a3servers.xml file from joram-config.jar in the tmp dir
          extractFromJAR(tmpDir + JORAM_CONFIG_JAR, A3SERVERS_XML);
        }
    } else {
      // extract the a3servers.xml file from joram-config.jar in the tmp dir
      extractFromJAR(tmpDir + JORAM_CONFIG_JAR, A3SERVERS_XML);
    }

    // update A3SERVERS_XML
    A3CMLConfig conf = A3CML.getXMLConfig(tmpDir + A3SERVERS_XML);
    A3CMLServer server = conf.getServer(serverId);
    server.hostname = hostName;
    A3CMLService service =
      server.getService("org.objectweb.joram.mom.proxies.tcp.TcpProxyService");
    service.args = port;
    // write changes to A3SERVERS_XML file
    A3CML.toXML(conf,null, tmpDir + A3SERVERS_XML);

    if (debug)
      System.out.println("RAConfig.updateA3Servers : confDir=" + confDir);
    // update file in conf dir.
    if (confDir != null) {
      File f = new File(confDir, A3SERVERS_XML);
      if (f.exists())
        copy(tmpDir + A3SERVERS_XML, f.getPath());
      if (new File(confDir, JORAMADMIN_CFG).exists())
        updateJoramAdminCfg(hostName, port);
      if (new File(confDir, JORAMADMIN_XML).exists())
        updateJoramAdminXml(hostName, port);
    }

    // update jar
    updateZIP(tmpDir + JORAM_CONFIG_JAR,A3SERVERS_XML,tmpDir + A3SERVERS_XML,A3SERVERS_XML);
    // update rar
    updateZIP(rarName,JORAM_CONFIG_JAR,tmpDir +JORAM_CONFIG_JAR,JORAM_CONFIG_JAR);

    // remove temporary file
    new File(tmpDir + JORAM_CONFIG_JAR).delete();
    new File(tmpDir + A3SERVERS_XML).delete();
  }

  private boolean copy(String file1, String file2)
    throws Exception {
    if (! new File(file1).exists())
      return false;

    new File(file2).delete();

    FileInputStream fis = new FileInputStream(file1);
    FileOutputStream fos = new FileOutputStream(file2);
    try {
      dump(fis,fos);
      return true;
    } finally {
      fos.close();
      fis.close();
    }
  }

  private void updateJoramAdminCfg(String hostName,
                                   String port)
    throws Exception {
    File file = new File(confDir, JORAMADMIN_CFG);
    FileReader fileReader = new FileReader(file);
    BufferedReader reader = new BufferedReader(fileReader);
    boolean end = false;
    String line;
    StringTokenizer tokenizer;
    String firstToken;
    StringBuffer buff = new StringBuffer();

    while (! end) {
      line = reader.readLine();
      if (line == null)
        end = true;
      else {
        tokenizer = new StringTokenizer(line);
        if (tokenizer.hasMoreTokens()) {
          firstToken = tokenizer.nextToken();
          if (firstToken.equalsIgnoreCase("Host")) {
            buff.append("Host   " + hostName + "\n");
            continue;
          }
          else if (firstToken.equalsIgnoreCase("Port")) {
            buff.append("Port   " + port + "\n");
            continue;
          }
        }
        buff.append(line + "\n");
      }
    }
    file.delete();
    ByteArrayInputStream bis = new ByteArrayInputStream(buff.toString().getBytes());
    FileOutputStream fos = new FileOutputStream(file);
    try {
      dump(bis,fos);
    } finally {
      fos.close();
      bis.close();
    }
  }

  private void updateJoramAdminXml(String hostName,
                                   String port)
    throws Exception {
    File file = new File(confDir, JORAMADMIN_XML);
    FileReader fileReader = new FileReader(file);
    BufferedReader reader = new BufferedReader(fileReader);
    boolean end = false;
    String line;
    StringBuffer buff = new StringBuffer();
    int i = -1;

    while (! end) {
      line = reader.readLine();
      if (line == null)
        end = true;
      else {
        if (line.trim().startsWith("<connect")) {
          while (true) {
            i = line.indexOf("host");
            if (i > 0) {
              buff.append(line.substring(0,i+10));
              buff.append(hostName);
              int j = line.indexOf("\"",i+11);
              buff.append(line.substring(j,line.length()) + "\n");
              if (line.trim().endsWith("/>")) {
                line = reader.readLine();
                break;
              }
              line = reader.readLine();
              continue;
            }
            i = line.indexOf("port");
            if (i > 0) {
              buff.append(line.substring(0,i+6));
              buff.append(port);
              int j = line.indexOf("\"",i+7);
              buff.append(line.substring(j,line.length()) + "\n");
              if (line.trim().endsWith("/>")) {
                line = reader.readLine();
                break;
              }
              line = reader.readLine();
              continue;
            }
            buff.append(line + "\n");
            if (line.trim().endsWith("/>")) {
              line = reader.readLine();
              break;
            }
            line = reader.readLine();
          }
        } else if (line.trim().startsWith("<tcp")) {
          while (true) {
            i = line.indexOf("host");
            if (i > 0) {
              buff.append(line.substring(0,i+6));
              buff.append(hostName);
              int j = line.indexOf("\"",i+7);
              buff.append(line.substring(j,line.length()) + "\n");
              if (line.trim().endsWith("/>")) {
                line = reader.readLine();
                break;
              }
              line = reader.readLine();
              continue;
            }
            i = line.indexOf("port");
            if (i > 0) {
              buff.append(line.substring(0,i+6));
              buff.append(port);
              int j = line.indexOf("\"",i+7);
              buff.append(line.substring(j,line.length()) + "\n");
              if (line.trim().endsWith("/>")) {
                line = reader.readLine();
                break;
              }
              line = reader.readLine();
              continue;
            }
            buff.append(line + "\n");
            if (line.trim().endsWith("/>"))
              break;
            line = reader.readLine();
          }
        }
        buff.append(line + "\n");
      }
    }
    file.delete();
    ByteArrayInputStream bis = new ByteArrayInputStream(buff.toString().getBytes());
    FileOutputStream fos = new FileOutputStream(file);
    try {
      dump(bis,fos);
    } finally {
      fos.close();
      bis.close();
    }
  }

  /**
   * update RA_XML file
   * @param raProperties   ra.properties file
   */
  private void updateRAR(String raProperties, boolean updateA3servers) throws Exception {
    if (debug)
      System.out.println("RAConfig.updateRAR(" + raProperties + ")");

    FileReader file = new FileReader(raProperties);
    LineNumberReader lnr = new LineNumberReader(file);

    // get RAR name
    String line = lnr.readLine();
    while (line != null) {
      if (line.startsWith("RAR_NAME"))
        break;
      line = lnr.readLine();
    }
    int i = line.indexOf("RAR_NAME");
    String rarName = line.substring(i+"RAR_NAME".length()).trim();
    if (debug)
      System.out.println("RAConfig.updateRAR : rarName = " + rarName);
    else if (verbose)
      System.out.println("update rar \"" + rarName +
                         "\" with \"" + raProperties + "\"");

    // create Map of properties
    Map map = new Hashtable();
    Hashtable prop = null;
    String nodeName = null;
    line = lnr.readLine();
    while (line != null) {
      if (line.startsWith("[")) {
        prop = new Hashtable();
        nodeName = line.substring(line.indexOf("[")+1,line.indexOf("]"));
        map.put(nodeName.trim(),prop);
      } else {
        StringTokenizer st = new StringTokenizer(line);
        if (st.countTokens() == 2 && prop != null) {
          prop.put(st.nextToken(),st.nextToken());
        }
      }
      line = lnr.readLine();
    }
    file.close();

    if (debug)
      System.out.println("RAConfig.updateRAR : map = " + map);

    // create ra.xml file with new values
    File rarFile = new File(rarName);
    if (rarFile.exists()) {
      ZipFile zipFile = new ZipFile(rarFile.getAbsolutePath());
      for (Enumeration zippedFiles = zipFile.entries(); zippedFiles.hasMoreElements(); ) {
        // Retrieve entry of existing files
        ZipEntry currEntry = (ZipEntry) zippedFiles.nextElement();
        if (debug)
          System.out.println("RAConfig.updateRAR : currEntry = " + currEntry);
        if (currEntry.getName().equalsIgnoreCase(RA_XML)) {
          InputStream reader = zipFile.getInputStream(currEntry);
          createFile("ra.xml",update(reader,map));
          reader.close();
          break;
        }
      }
      zipFile.close();
    }

    // update rar
    updateZIP(rarName,RA_XML, tmpDir + "ra.xml",RA_XML);

    if (updateA3servers) {
      // update a3servers.xml (host and port).
      prop = (Hashtable) map.get("org.objectweb.joram.client.connector.JoramAdapter");
      if (prop != null) {
        if (debug)
          System.out.println("RAConfig.updateRAR : prop = " + prop);
        String host = (String) prop.get("HostName");
        short serverId = -1;
        String sid = (String) prop.get("ServerId");
        if (sid != null)
          serverId = new Short(sid).shortValue();
        else {
          if (debug)
            System.out.println("RAConfig.updateRAR : ServerId not found in ra.properties");
        }
        String port = (String) prop.get("ServerPort");
        if (host != null && host.length() > 0
            && port != null && port.length() > 0
            && serverId >= 0) {
          updateA3Servers(rarName,host,port,serverId);
        }
      }
    }
    new File(tmpDir + "ra.xml").delete();
  }

  /**
   * Update the RAR file
   * @param zipName     String JAR or RAR file
   * @param path        path in JAR or RAR file
   * @param newFileName add new filename
   * @param oldFileName remove old file from JAR or RAR
   */
  private void updateZIP(String zipName,
                         String path,
                         String newFileName,
                         String oldFileName)
    throws Exception {

    if (debug)
      System.out.println("RAConfig.updateZIP(" + zipName +
                         "," + path + "," + newFileName +
                         "," + oldFileName + ")");
    else if (verbose)
      System.out.println("updateZIP \"" + zipName +
                         "\", path \"" + path +
                         "\", new file \"" + newFileName +
                         "\", old file \"" + oldFileName + "\"");


    ZipEntry entry = null;

    File file = new File(zipName);
    if (file.exists()) {
      ZipFile zipFile = new ZipFile(file.getAbsolutePath());
      Enumeration zipEntries = zipFile.entries();
      // create your output zip file
      ZipOutputStream newZip = new ZipOutputStream(
        new FileOutputStream(new File(file.getAbsolutePath() + "_TMP")));

      // Get all data (except the oldFileName) from zip file and
      // write it to the tmp zip file
      while (zipEntries.hasMoreElements()) {
        entry = (ZipEntry) zipEntries.nextElement();
        if (entry.getName().equalsIgnoreCase(oldFileName))
          continue;
        newZip.putNextEntry(new ZipEntry(entry.getName()));
        InputStream is = zipFile.getInputStream(entry);
        try {
          dump(is,newZip);
        } finally {
          newZip.closeEntry();
          is.close();
        }
      }
      zipFile.close();

      // Write the new fileName to the zip
      entry = new ZipEntry(path);
      newZip.putNextEntry(entry);
      try {
        FileInputStream fis = new FileInputStream(newFileName);
        dump(fis,newZip);
        fis.close();
      } catch (Exception exc) {
        System.out.println("Error reading input file: " + newFileName + " " + exc);
        newZip.close();
        new File(file.getAbsolutePath() + "_TMP").delete();
        throw exc;
      } finally {
        newZip.flush();
        newZip.closeEntry();
        newZip.finish();
        newZip.close();
      }
      String toRename = file.getAbsolutePath() + "_TMP";
      new File(file.getAbsolutePath()).delete();
      new File(toRename).renameTo(file);
    }
  }
}
TOP

Related Classes of org.objectweb.joram.client.connector.utils.RAConfig

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.