Package org.teiid.adminshell

Source Code of org.teiid.adminshell.MigrationUtil

/*
* JBoss, Home of Professional Open Source.
* See the COPYRIGHT.txt file distributed with this work for information
* regarding copyright ownership.  Some portions may be licensed
* to Red Hat, Inc. under one or more contributor license agreements.
*
* 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 (at your option) 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., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301 USA.
*/

package org.teiid.adminshell;

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipOutputStream;

import javax.xml.transform.Result;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.TransformerFactoryConfigurationError;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;

import org.teiid.core.util.ApplicationInfo;
import org.teiid.core.util.FileUtils;
import org.teiid.core.util.ObjectConverterUtil;


@SuppressWarnings("nls")
public class MigrationUtil {

  public static void main(String[] args) throws IOException, TransformerConfigurationException, TransformerFactoryConfigurationError, TransformerException {
    if (args.length != 1) {
      System.err.println(
          "Teiid 7.0 VDB Migration Utility" +
          "\n\nUsage:" +
          "\n  A vdb or .def file must be specified as the only argument." +
          "\n\nResult:"+
          "\n  7.0 compatible replacement files will be created in the same directory " +
          "\n  as your file." +
          "\n  If you supply a vdb, the new vdb file will have a _70.vdb suffix." +
          "\n  If you supply a dynamic vdb file, <file name>-vdb.xml is created " +         
          "\n\nNote: This program will create translator names by Connector's Component Type name" +
          "\n  As they are not gureented to match; recheck their for their validity" +
          "\n\nNote: this program will NOT create the -ds.xml files needed by JBoss to " +
          "\n      create underlying DataSource connection pools." +
          "\n      You will need to manually create one -ds.xml for each JDBC DataSource " +
          "\n      with a JNDI name of <connector binding name>DS, " +
          "\n      where any spaces in the name are replace by _");
      System.exit(-1);
    }
    File file = new File(args[0]);
    if (!file.exists()) {
      System.err.println(args[0] + " does not exist."); //$NON-NLS-1$
      System.exit(-1);
    }
    String fullName = file.getName();
    String fileName = fullName.substring(0, fullName.length() - 4);
    String ext = FileUtils.getExtension(file);
    if (ext == null) {
      System.err.println(fullName + " is not a vdb or xml file."); //$NON-NLS-1$
      System.exit(-1);
    }
    ext = ext.toLowerCase();
    if (ext.endsWith("vdb")) {
      File dir = createTempDirectory();
      try {
        extract(file, dir);
        File metainf = new File(dir, "META-INF");
        File config = new File(dir, "ConfigurationInfo.def");
        File manifest = new File(dir, "MetaMatrix-VdbManifestModel.xmi");
        if (manifest.exists()) {
          String configStr = ObjectConverterUtil.convertFileToString(config);
          String manifestStr = ObjectConverterUtil.convertFileToString(manifest);
          int index = configStr.lastIndexOf("</VDB>");
          int manifestBegin = manifestStr.indexOf("<xmi");
          configStr = configStr.substring(0, index) + manifestStr.substring(manifestBegin) + "</VDB>";
          FileUtils.write(configStr.getBytes(), config);
          manifest.delete();
        }
        transformConfig(config, "/vdb.xsl", new StreamResult(new File(metainf, "vdb.xml")));
        config.delete();
        FileOutputStream out = new FileOutputStream(new File(file.getParent(), fileName + "_70.vdb"));
        ZipOutputStream zos = new ZipOutputStream(new BufferedOutputStream(out));
        int parentLength = dir.getPath().length();
        addDirectory(dir, zos, parentLength);
        zos.close();
      } finally {
        FileUtils.removeDirectoryAndChildren(dir);
      }
    } else if (ext.endsWith("xml") || ext.endsWith("def")){
      File parent = file.getParentFile();
      transformConfig(file, "/vdb.xsl", new StreamResult(new File(parent, fileName + "-vdb.xml")));
    } else {
      System.err.println(fullName + " is not a vdb or xml file.  Run with no arguments for help."); //$NON-NLS-1$
      System.exit(-1);
    }
  }

  private static void addDirectory(File dir, ZipOutputStream zos,
      int parentLength) throws IOException {
    String[] files = dir.list();
    for (String entry : files) {
      File f = new File(dir, entry);
      if (f.isDirectory()) {
        addDirectory(f, zos, parentLength);
      } else {
        ZipEntry e = new ZipEntry(f.getPath().substring(parentLength));
        zos.putNextEntry(e);
        FileUtils.write(f, zos);
        zos.closeEntry();
      }
    }
  }

  private static void transformConfig(File config, String styleSheet, Result target)
      throws TransformerFactoryConfigurationError,
      TransformerConfigurationException, TransformerException {
    TransformerFactory tf = TransformerFactory.newInstance();
    Transformer t = tf.newTransformer(new StreamSource(MigrationUtil.class.getResourceAsStream(styleSheet)));
    t.setParameter("version", ApplicationInfo.getInstance().getReleaseNumber()); //$NON-NLS-1$
    t.transform(new StreamSource(config), target);
  }

  /**
   * Extract the given zip file to the given destination directory base.
   *
   * @param zipFileName
   *            The full path and file name of the Zip file to extract.
   * @param destinationDirectory
   *            The root directory to extract to.
   * @throws IOException
   */
  static void extract(final File sourceZipFile, File unzipDestinationDirectory) throws IOException {
    // Open Zip file for reading
    ZipFile zipFile = new ZipFile(sourceZipFile, ZipFile.OPEN_READ);

    // Create an enumeration of the entries in the zip file
    Enumeration zipFileEntries = zipFile.entries();

    // Process each entry
    while (zipFileEntries.hasMoreElements()) {
      // grab a zip file entry
      ZipEntry entry = (ZipEntry) zipFileEntries.nextElement();

      String currentEntry = entry.getName();

      File destFile = new File(unzipDestinationDirectory, currentEntry);

      // grab file's parent directory structure
      File destinationParent = destFile.getParentFile();

      // create the parent directory structure if needed
      destinationParent.mkdirs();

      // extract file if not a directory
      if (!entry.isDirectory()) {
        ObjectConverterUtil.write(zipFile.getInputStream(entry),
            destFile);
      }
    }
    zipFile.close();
  }

  static File createTempDirectory() throws IOException {
    File temp = File.createTempFile("temp", Long.toString(System.nanoTime()));

    temp.delete();

    if (!(temp.mkdir())) {
      throw new IOException("Could not create temp directory: "
          + temp.getAbsolutePath());
    }

    return temp;
  }

}
TOP

Related Classes of org.teiid.adminshell.MigrationUtil

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.