blob: e1f35a55059a15073b06aaf65fa9aee617d26977 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2007, 2016 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:
* Tatsuya ISHIHARA - initial API and implementation
*******************************************************************************/
package org.eclipse.actf.model.dom.odf.util;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipOutputStream;
import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.eclipse.actf.model.dom.odf.ODFConstants;
import org.eclipse.actf.model.dom.odf.base.ODFDocument;
import org.eclipse.actf.model.internal.dom.odf.OdfPlugin;
import org.eclipse.core.runtime.IPath;
/**
* Utility class to save ODF document
*/
public class ODFWriter {
private static final String SLASH = "/"; //$NON-NLS-1$
private void addFileToZip(ZipOutputStream zos, String inputDir, File file)
throws IOException, Exception {
if (file.isDirectory()) {
String entry = file.getPath();
entry = entry.substring(inputDir.length() + 1);
entry = entry.replaceAll("\\\\", SLASH); //$NON-NLS-1$
ZipEntry target = new ZipEntry(entry + SLASH);
target.setSize(0);
zos.putNextEntry(target);
zos.closeEntry();
File[] fileList = file.listFiles();
for (int i = 0; i < fileList.length; i++) {
addFileToZip(zos, inputDir, fileList[i]);
}
} else {
BufferedInputStream bis = new BufferedInputStream(
new FileInputStream(file));
String entry = file.getPath();
entry = entry.substring(inputDir.length() + 1);
entry = entry.replaceAll("\\\\", SLASH); //$NON-NLS-1$
ZipEntry target = new ZipEntry(entry);
zos.putNextEntry(target);
byte buf[] = new byte[1024];
int count;
while ((count = bis.read(buf, 0, 1024)) != -1) {
zos.write(buf, 0, count);
}
bis.close();
zos.closeEntry();
}
}
public List<String> unzipODFFile(String odfName, String outputDir) {
List<String> outputFileList = new ArrayList<String>();
FileOutputStream fos = null;
URL url = null;
try {
url = new URL(odfName);
} catch (MalformedURLException e) {
}
try {
ZipFile zipFile = null;
if (url != null) {
zipFile = new ZipFile(new File(url.toURI()));
} else {
zipFile = new ZipFile(odfName);
}
Enumeration<? extends ZipEntry> entries = zipFile.entries();
while (entries.hasMoreElements()) {
ZipEntry zent = entries.nextElement();
String fileName = zent.getName();
if (fileName.contains(SLASH)) {
int lastIndex = fileName.lastIndexOf(SLASH);
File dir = new File(outputDir + File.separator
+ fileName.substring(0, lastIndex));
if (!dir.exists()) {
dir.mkdirs();
}
}
if (!fileName.endsWith(SLASH)) {
BufferedInputStream bis = new BufferedInputStream(zipFile
.getInputStream(zent));
String outputFile = outputDir + File.separator + fileName;
outputFileList.add(outputFile);
fos = new FileOutputStream(outputFile);
try {
byte[] buffer = new byte[8192];
int size;
while ((size = bis.read(buffer)) != -1) {
fos.write(buffer, 0, size);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
zipFile.close();
fos.close();
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
return outputFileList;
}
public void createODFFile(String inputDir, String outputODFName) {
File inputDirFile = new File(inputDir);
if (inputDirFile.isDirectory()) {
URL url = null;
try {
url = new URL(outputODFName);
} catch (MalformedURLException e) {
}
try {
File zipFile = null;
if (url != null) {
zipFile = new File(url.toURI());
} else {
zipFile = new File(outputODFName);
}
File[] fileList = inputDirFile.listFiles();
ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(
zipFile));
for (int i = 0; i < fileList.length; i++) {
addFileToZip(zos, inputDir, fileList[i]);
}
zos.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (URISyntaxException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
}
private boolean rmDir(File deletedDir) {
File[] files = deletedDir.listFiles();
if (files != null)
for (int i = 0; i < files.length; i++) {
if (!rmDir(files[i]))
return false;
}
return deletedDir.delete();
}
/*
* ODFDocument doc -- modified content.xml String outFile -- output ODF file
*/
public void saveODFFile(ODFDocument doc, String outFile) {
String inFile = doc.getURL();
// create tmp directory
IPath tmpDir = OdfPlugin.getDefault().getStateLocation().append("tmp"); //$NON-NLS-1$
File tmpDirFile = tmpDir.toFile();
tmpDirFile.mkdir();
String tmpDirPath = tmpDirFile.getPath();
// unzip ODF file
ODFWriter odfWriter = new ODFWriter();
odfWriter.unzipODFFile(inFile, tmpDirPath);
// save content.xml
try {
FileOutputStream writer = new FileOutputStream(tmpDirPath
+ System.getProperty("file.separator") //$NON-NLS-1$
+ ODFConstants.ODF_CONTENT_FILENAME);
TransformerFactory tFactory = TransformerFactory.newInstance();
Source source = new DOMSource(doc);
Result target = new StreamResult(writer);
// if (source != null) {
try {
tFactory.newTransformer().transform(source, target);
} catch (TransformerConfigurationException e) {
e.printStackTrace();
} catch (TransformerException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
}
// }
writer.close();
} catch (Exception e) {
e.printStackTrace();
}
// save ODF file
odfWriter.createODFFile(tmpDirPath, outFile);
// remove tmp directory
rmDir(tmpDirFile);
}
}