/*
* OpenOfficeDocumentCreator.java
*
* Created on February 16, 2005, 8:04 PM
*/
package net.sf.jabref.export;
import java.io.*;
import java.net.URL;
import java.util.Set;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import net.sf.jabref.BibtexDatabase;
import net.sf.jabref.Globals;
import net.sf.jabref.MetaData;
/**
* @author alver
*/
public class OpenOfficeDocumentCreator extends ExportFormat {
/**
* Creates a new instance of OpenOfficeDocumentCreator
*/
public OpenOfficeDocumentCreator() {
super(Globals.lang("OpenOffice Calc"), "oocalc", null, null, ".sxc");
}
public void performExport(final BibtexDatabase database, final MetaData metaData,
final String file, final String encoding, Set<String> keySet) throws Exception {
exportOpenOfficeCalc(new File(file), database, keySet);
}
public static void storeOpenOfficeFile(File file, InputStream source) throws Exception {
ZipOutputStream out = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(file)));
try {
ZipEntry zipEntry = new ZipEntry("content.xml");
out.putNextEntry(zipEntry);
int c = -1;
while ((c = source.read()) >= 0) {
out.write(c);
}
out.closeEntry();
// Add manifest (required for OOo 2.0), "meta.xml", "mimetype" files. These are in the
// resource/openoffice directory, and are copied verbatim into the zip file.
addResourceFile("meta.xml", "/resource/openoffice/meta.xml", out);
addResourceFile("mimetype", "/resource/openoffice/mimetype", out);
addResourceFile("META-INF/manifest.xml", "/resource/openoffice/manifest.xml", out);
//zipEntry = new ZipEntry()
} finally {
out.close();
}
}
public static void exportOpenOfficeCalc(File file, BibtexDatabase database,
Set<String> keySet) throws Exception {
// First store the xml formatted content to a temporary file.
File tmpFile = File.createTempFile("oocalc", null);
exportOpenOfficeCalcXML(tmpFile, database, keySet);
// Then add the content to the zip file:
BufferedInputStream in = new BufferedInputStream(new FileInputStream(tmpFile));
storeOpenOfficeFile(file, in);
// Delete the temporary file:
tmpFile.delete();
}
public static void exportOpenOfficeCalcXML(File tmpFile, BibtexDatabase database, Set<String> keySet) {
OOCalcDatabase od = new OOCalcDatabase(database, keySet);
try {
Writer ps = new OutputStreamWriter(new FileOutputStream(tmpFile), "UTF8");
try {
// Writer ps = new FileWriter(tmpFile);
DOMSource source = new DOMSource(od.getDOMrepresentation());
StreamResult result = new StreamResult(ps);
Transformer trans = TransformerFactory.newInstance().newTransformer();
trans.setOutputProperty(OutputKeys.INDENT, "yes");
trans.transform(source, result);
} finally {
ps.close();
}
} catch (Exception e) {
throw new Error(e);
}
return;
}
private static void addResourceFile(String name, String resource, ZipOutputStream out) throws IOException {
ZipEntry zipEntry = new ZipEntry(name);
out.putNextEntry(zipEntry);
addFromResource(resource, out);
out.closeEntry();
}
private static void addFromResource(String resource, OutputStream out) {
URL url = OpenOfficeDocumentCreator.class.getResource(resource);
try {
InputStream in = url.openStream();
byte[] buffer = new byte[256];
synchronized (in) {
synchronized (out) {
while (true) {
int bytesRead = in.read(buffer);
if (bytesRead == -1) break;
out.write(buffer, 0, bytesRead);
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}