/*
* 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;
}
}