Delete odfdom
Project: http://git-wip-us.apache.org/repos/asf/incubator-taverna-language/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-taverna-language/commit/372aab83 Tree: http://git-wip-us.apache.org/repos/asf/incubator-taverna-language/tree/372aab83 Diff: http://git-wip-us.apache.org/repos/asf/incubator-taverna-language/diff/372aab83 Branch: refs/heads/ucfpackage-robundle Commit: 372aab8380e1d962c7e93a7194e111ec924652a5 Parents: 0d1cd83 Author: Stian Soiland-Reyes <[email protected]> Authored: Tue Jun 10 15:09:52 2014 +0100 Committer: Stian Soiland-Reyes <[email protected]> Committed: Thu Jul 2 15:11:13 2015 +0100 ---------------------------------------------------------------------- .../taverna/scufl2/ucfpackage/UCFPackage.java | 4 +- .../ucfpackage/impl/odfdom/pkg/OdfPackage.java | 1880 ------------------ .../impl/odfdom/pkg/OdfPackageStream.java | 81 - .../impl/odfdom/pkg/OdfXMLHelper.java | 370 ---- .../impl/odfdom/pkg/StreamHelper.java | 81 - .../ucfpackage/impl/odfdom/pkg/TempDir.java | 57 - .../impl/odfdom/pkg/TempDirDeleter.java | 83 - .../impl/odfdom/pkg/manifest/Algorithm.java | 51 - .../odfdom/pkg/manifest/EncryptionData.java | 72 - .../impl/odfdom/pkg/manifest/KeyDerivation.java | 61 - .../impl/odfdom/pkg/manifest/OdfFileEntry.java | 101 - 11 files changed, 2 insertions(+), 2839 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-taverna-language/blob/372aab83/taverna-scufl2-ucfpackage/src/main/java/org/apache/taverna/scufl2/ucfpackage/UCFPackage.java ---------------------------------------------------------------------- diff --git a/taverna-scufl2-ucfpackage/src/main/java/org/apache/taverna/scufl2/ucfpackage/UCFPackage.java b/taverna-scufl2-ucfpackage/src/main/java/org/apache/taverna/scufl2/ucfpackage/UCFPackage.java index 4a5eaeb..48b8e48 100644 --- a/taverna-scufl2-ucfpackage/src/main/java/org/apache/taverna/scufl2/ucfpackage/UCFPackage.java +++ b/taverna-scufl2-ucfpackage/src/main/java/org/apache/taverna/scufl2/ucfpackage/UCFPackage.java @@ -57,8 +57,8 @@ import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; -import org.apache.taverna.scufl2.ucfpackage.impl.odfdom.pkg.OdfPackage; -import org.apache.taverna.scufl2.ucfpackage.impl.odfdom.pkg.manifest.OdfFileEntry; +//import org.apache.taverna.scufl2.ucfpackage.impl.odfdom.pkg.OdfPackage; +//import org.apache.taverna.scufl2.ucfpackage.impl.odfdom.pkg.manifest.OdfFileEntry; import org.oasis_open.names.tc.opendocument.xmlns.container.Container; import org.oasis_open.names.tc.opendocument.xmlns.container.Container.RootFiles; import org.oasis_open.names.tc.opendocument.xmlns.container.ObjectFactory; http://git-wip-us.apache.org/repos/asf/incubator-taverna-language/blob/372aab83/taverna-scufl2-ucfpackage/src/main/java/org/apache/taverna/scufl2/ucfpackage/impl/odfdom/pkg/OdfPackage.java ---------------------------------------------------------------------- diff --git a/taverna-scufl2-ucfpackage/src/main/java/org/apache/taverna/scufl2/ucfpackage/impl/odfdom/pkg/OdfPackage.java b/taverna-scufl2-ucfpackage/src/main/java/org/apache/taverna/scufl2/ucfpackage/impl/odfdom/pkg/OdfPackage.java deleted file mode 100644 index c99cdbe..0000000 --- a/taverna-scufl2-ucfpackage/src/main/java/org/apache/taverna/scufl2/ucfpackage/impl/odfdom/pkg/OdfPackage.java +++ /dev/null @@ -1,1880 +0,0 @@ -/************************************************************************ - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER - * - * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved. - * Copyright 2009 IBM. All rights reserved. - * - * Use is subject to license terms. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy - * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also - * obtain a copy of the License at http://odftoolkit.org/docs/license.txt - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * - * See the License for the specific language governing permissions and - * limitations under the License. - * - ************************************************************************/ -package org.apache.taverna.scufl2.ucfpackage.impl.odfdom.pkg; - -import static java.util.logging.Level.INFO; -import static java.util.logging.Level.SEVERE; -import static java.util.logging.Level.WARNING; -import static java.util.zip.ZipEntry.DEFLATED; -import static java.util.zip.ZipEntry.STORED; -import static org.apache.taverna.scufl2.ucfpackage.impl.odfdom.pkg.StreamHelper.PAGE_SIZE; -import static org.apache.taverna.scufl2.ucfpackage.impl.odfdom.pkg.TempDir.newTempOdfDirectory; - -import java.io.BufferedInputStream; -import java.io.BufferedOutputStream; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.io.PipedInputStream; -import java.io.PipedOutputStream; -import java.io.UnsupportedEncodingException; -import java.net.JarURLConnection; -import java.net.URI; -import java.net.URISyntaxException; -import java.net.URL; -import java.util.Enumeration; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.LinkedList; -import java.util.List; -import java.util.Set; -import java.util.StringTokenizer; -import java.util.Vector; -import java.util.logging.Level; -import java.util.logging.Logger; -import java.util.zip.CRC32; -import java.util.zip.ZipEntry; -import java.util.zip.ZipFile; -import java.util.zip.ZipInputStream; -import java.util.zip.ZipOutputStream; - -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.parsers.ParserConfigurationException; -import javax.xml.parsers.SAXParser; -import javax.xml.parsers.SAXParserFactory; -import javax.xml.transform.Source; -import javax.xml.transform.TransformerConfigurationException; -import javax.xml.transform.TransformerException; -import javax.xml.transform.URIResolver; -import javax.xml.transform.stream.StreamSource; - -import org.apache.taverna.scufl2.ucfpackage.impl.odfdom.pkg.manifest.Algorithm; -import org.apache.taverna.scufl2.ucfpackage.impl.odfdom.pkg.manifest.EncryptionData; -import org.apache.taverna.scufl2.ucfpackage.impl.odfdom.pkg.manifest.KeyDerivation; -import org.apache.taverna.scufl2.ucfpackage.impl.odfdom.pkg.manifest.OdfFileEntry; -import org.w3c.dom.Document; -import org.w3c.dom.bootstrap.DOMImplementationRegistry; -import org.w3c.dom.ls.DOMImplementationLS; -import org.w3c.dom.ls.LSOutput; -import org.w3c.dom.ls.LSSerializer; -import org.xml.sax.Attributes; -import org.xml.sax.ContentHandler; -import org.xml.sax.EntityResolver; -import org.xml.sax.InputSource; -import org.xml.sax.Locator; -import org.xml.sax.SAXException; -import org.xml.sax.XMLReader; - - -/** - * OdfPackage represents the package view to an OpenDocument document. The - * OdfPackage will be created from an ODF document and represents a copy of the - * loaded document, where files can be inserted and deleted. The changes take - * effect, when the OdfPackage is being made persistend by save(). - */ -public class OdfPackage implements AutoCloseable { - /** - * This class solely exists to clean up after a package object has been - * removed by garbage collector. Finalizable classes are said to have slow - * garbage collection, so we don't make the whole OdfPackage finalizable. - */ - static private class OdfFinalizablePackage { - File mTempDirForDeletion; - - OdfFinalizablePackage(File tempDir) { - mTempDirForDeletion = tempDir; - } - - @Override - protected void finalize() { - if (mTempDirForDeletion != null) - TempDir.deleteTempOdfDirectory(mTempDirForDeletion); - } - } - private final Logger mLog = Logger.getLogger(OdfPackage.class.getName()); - - public enum OdfFile { - IMAGE_DIRECTORY("Pictures"), MANIFEST("META-INF/manifest.xml"), MEDIA_TYPE( - "mimetype"); - private final String packagePath; - - OdfFile(String packagePath) { - this.packagePath = packagePath; - } - - public String getPath() { - return packagePath; - } - } - - private static HashSet<String> mCompressedFileTypes = new HashSet<>(); - { - String[] typelist = new String[] { "jpg", "gif", "png", "zip", "rar", - "jpeg", "mpe", "mpg", "mpeg", "mpeg4", "mp4", "7z", "ari", - "arj", "jar", "gz", "tar", "war", "mov", "avi" }; - for (int i = 0; i < typelist.length; i++) - mCompressedFileTypes.add(typelist[i]); - } - - // Static parts of file references - private static final String TWO_DOTS = ".."; - private static final String SLASH = "/"; - private static final String COLON = ":"; - private static final String EMPTY_STRING = ""; - private static final String XML_MEDIA_TYPE = "text/xml"; - // temp Dir for this ODFpackage (2DO: temp dir handling will be removed most - // likely) - private File mTempDirParent; - private File mTempDir; - // only used indirectly for its finalizer (garbage collection) - @SuppressWarnings("unused") - private OdfFinalizablePackage mFinalize; - // some well known streams inside ODF packages - private String mMediaType; - private List<String> mPackageEntries; - private ZipHelper mZipFile; - private HashMap<String, ZipEntry> mZipEntries; - private HashMap<String, Document> mContentDoms; - private HashMap<String, byte[]> mContentStreams; - private HashMap<String, File> mTempFiles; - private boolean mUseTempFile; - private List<String> mManifestList; - private HashMap<String, OdfFileEntry> mManifestEntries; - private String mBaseURI; - private Resolver mResolver; - - /** - * Creates the ODFPackage as an empty Package. For setting a specific temp - * directory, set the System variable org.odftoolkit.odfdom.tmpdir:<br> - * <code>System.setProperty("org.odftoolkit.odfdom.tmpdir");</code> - */ - private OdfPackage() { - mMediaType = null; - mResolver = null; - mTempDir = null; - mTempDirParent = null; - mPackageEntries = new LinkedList<String>(); - mZipEntries = new HashMap<String, ZipEntry>(); - mContentDoms = new HashMap<String, Document>(); - mContentStreams = new HashMap<String, byte[]>(); - mTempFiles = new HashMap<String, File>(); - mManifestList = new LinkedList<String>(); - - // get a temp directory for everything - String userPropDir = System.getProperty("org.odftoolkit.odfdom.tmpdir"); - if (userPropDir != null) - mTempDirParent = new File(userPropDir); - - // specify whether temporary files are able to used. - String userPropTempEnable = System - .getProperty("org.odftoolkit.odfdom.tmpfile.disable"); - mUseTempFile = (userPropTempEnable == null) - || !userPropTempEnable.equalsIgnoreCase("true"); - } - - public static OdfPackage create() throws Exception { - OdfPackage odfPackage = new OdfPackage(); - odfPackage.mManifestEntries = new HashMap<>(); - // We just need some dummy XML first - odfPackage.insert("<x />".getBytes(), OdfFile.MANIFEST.getPath(), - XML_MEDIA_TYPE); - return odfPackage; - } - - /** - * Creates an OdfPackage from the OpenDocument provided by a filePath. - * - * <p> - * OdfPackage relies on the file being available for read access over the - * whole lifecycle of OdfPackage. - * </p> - * - * @param odfPath - * - the path to the ODF document. - * @throws java.lang.Exception - * - if the package could not be created - */ - private OdfPackage(String odfPath) throws Exception { - this(); - initialize(new File(odfPath)); - } - - /** - * Creates an OdfPackage from the OpenDocument provided by a File. - * - * <p> - * OdfPackage relies on the file being available for read access over the - * whole lifecycle of OdfPackage. - * </p> - * - * @param odfFile - * - a file representing the ODF document - * @throws java.lang.Exception - * - if the package could not be created - */ - private OdfPackage(File odfFile) throws Exception { - this(); - initialize(odfFile); - } - - /** - * Creates an OdfPackage from the OpenDocument provided by a InputStream. - * - * <p> - * Since an InputStream does not provide the arbitrary (non sequentiell) - * read access needed by OdfPackage, the InputStream is cached. This usually - * takes more time compared to the other constructors. - * </p> - * - * @param odfStream - * - an inputStream representing the ODF package - * @throws java.lang.Exception - * - if the package could not be created - */ - private OdfPackage(InputStream odfStream) throws Exception { - this(); - if (mUseTempFile) { - File tempFile = newTempSourceFile(odfStream); - initialize(tempFile); - } else { - initialize(odfStream); - } - } - - /** - * Loads an OdfPackage from the given filePath. - * - * <p> - * OdfPackage relies on the file being available for read access over the - * whole lifecycle of OdfPackage. - * </p> - * - * @param odfPath - * - the filePath to the ODF package - * @return the OpenDocument document represented as an OdfPackage - * @throws java.lang.Exception - * - if the package could not be loaded - */ - public static OdfPackage loadPackage(String odfPath) throws Exception { - return new OdfPackage(odfPath); - } - - /** - * Loads an OdfPackage from the OpenDocument provided by a File. - * - * <p> - * OdfPackage relies on the file being available for read access over the - * whole lifecycle of OdfPackage. - * </p> - * - * @param odfFile - * - a File to loadPackage content from - * @return the OpenDocument document represented as an OdfPackage - * @throws java.lang.Exception - * - if the package could not be loaded - */ - public static OdfPackage loadPackage(File odfFile) throws Exception { - return new OdfPackage(odfFile); - } - - /** - * Creates an OdfPackage from the OpenDocument provided by a InputStream. - * - * <p> - * Since an InputStream does not provide the arbitrary (non sequentiell) - * read access needed by OdfPackage, the InputStream is cached. This usually - * takes more time compared to the other loadPackage methods. - * </p> - * - * @param odfStream - * - an inputStream representing the ODF package - * @return the OpenDocument document represented as an OdfPackage - * @throws java.lang.Exception - * - if the package could not be loaded - */ - public static OdfPackage loadPackage(InputStream odfStream) - throws Exception { - return new OdfPackage(odfStream); - } - - // Initialize using memory instead temporary disc - private void initialize(InputStream odfStream) throws Exception { - ByteArrayOutputStream tempBuf = new ByteArrayOutputStream(); - StreamHelper.stream(odfStream, tempBuf); - byte[] mTempByteBuf = tempBuf.toByteArray(); - tempBuf.close(); - - if (mTempByteBuf.length < 3) - throw new IllegalArgumentException( - "An empty file was tried to be opened as ODF package!"); - - mZipFile = new ZipHelper(mTempByteBuf); - Enumeration<? extends ZipEntry> entries = mZipFile.entries(); - if (!entries.hasMoreElements()) - throw new IllegalArgumentException( - "It was not possible to unzip the file!"); - do { - ZipEntry zipEntry = entries.nextElement(); - mZipEntries.put(zipEntry.getName(), zipEntry); - /* - * TODO: think about if the additional list mPackageEntries is - * necessary - shouldn't everything be part of one of the other - * lists? maybe keep this as "master", rename it? - */ - mPackageEntries.add(zipEntry.getName()); - if (zipEntry.getName().equals( - OdfPackage.OdfFile.MEDIA_TYPE.getPath())) { - ByteArrayOutputStream out = new ByteArrayOutputStream(); - StreamHelper.stream(mZipFile.getInputStream(zipEntry), out); - try { - mMediaType = new String(out.toByteArray(), 0, - out.size(), "UTF-8"); - } catch (UnsupportedEncodingException ex) { - mLog.log(SEVERE, null, ex); - } - } - } while (entries.hasMoreElements()); - } - - // Initialize using temporary directory on hard disc - private void initialize(File odfFile) throws Exception { - mBaseURI = getBaseURIFromFile(odfFile); - - if (mTempDirParent == null) { - /* - * getParentFile() returns already java.io.tmpdir when package is an - * odfStream - */ - mTempDirParent = odfFile.getAbsoluteFile().getParentFile(); - if (!mTempDirParent.canWrite()) - mTempDirParent = null; // java.io.tmpdir will be used implicitly - } - - try { - mZipFile = new ZipHelper(new ZipFile(odfFile)); - } catch (Exception e) { - if (odfFile.length() < 3) - throw new IllegalArgumentException("The empty file '" - + odfFile.getPath() + "' is no ODF package!", e); - throw new IllegalArgumentException("Could not unzip the file " - + odfFile.getPath(), e); - } - Enumeration<? extends ZipEntry> entries = mZipFile.entries(); - - while (entries.hasMoreElements()) { - ZipEntry zipEntry = entries.nextElement(); - mZipEntries.put(zipEntry.getName(), zipEntry); - /* - * TODO: think about if the additional list mPackageEntries is - * necessary - shouldn't everything be part of one of the other - * lists? maybe keep this as "master", rename it? - */ - mPackageEntries.add(zipEntry.getName()); - if (zipEntry.getName().equals( - OdfPackage.OdfFile.MEDIA_TYPE.getPath())) { - ByteArrayOutputStream out = new ByteArrayOutputStream(); - StreamHelper.stream(mZipFile.getInputStream(zipEntry), out); - try { - mMediaType = new String(out.toByteArray(), 0, out.size(), - "UTF-8"); - } catch (UnsupportedEncodingException ex) { - mLog.log(Level.SEVERE, null, ex); - } - } - } - } - - private File newTempSourceFile(InputStream odfStream) throws Exception { - // no idea yet what type of file this will be, so we take .tmp - File odfFile = new File(getTempDir(), "theFile.tmp"); - // copy stream to temp file - FileOutputStream os = new FileOutputStream(odfFile); - StreamHelper.stream(odfStream, os); - os.close(); - return odfFile; - } - - /** - * Set the baseURI for this ODF package. NOTE: Should only be set during - * saving the package. - */ - void setBaseURI(String baseURI) { - mBaseURI = baseURI; - } - - /** - * Get the URI, where this ODF package is stored. - * - * @return the URI to the ODF package. Returns null if package is not stored - * yet. - */ - public String getBaseURI() { - return mBaseURI; - } - - /** - * Get the media type of the ODF package (equal to media type of ODF root - * document) - * - * @return the mediaType string of this ODF package - */ - public String getMediaType() { - return mMediaType; - } - - /** - * Set the media type of the ODF package (equal to media type of ODF root - * document) - * - * @param mediaType - * string of this ODF package - */ - public void setMediaType(String mediaType) { - mMediaType = mediaType; - mPackageEntries.remove(OdfPackage.OdfFile.MEDIA_TYPE.getPath()); - if (mMediaType != null) - mPackageEntries.add(0, OdfPackage.OdfFile.MEDIA_TYPE.getPath()); - } - - /** - * - * Get an OdfFileEntry for the packagePath NOTE: This method should be - * better moved to a DOM inherited Manifest class - * - * @param packagePath - * The relative package path within the ODF package - * @return The manifest file entry will be returned. - */ - public OdfFileEntry getFileEntry(String packagePath) { - packagePath = ensureValidPackagePath(packagePath); - return getManifestEntries().get(packagePath); - } - - /** - * Get a OdfFileEntries from the manifest file (i.e. /META/manifest.xml") - * - * @return The manifest file entries will be returned. - */ - public Set<String> getFileEntries() { - return getManifestEntries().keySet(); - } - - /** - * - * Check existence of a file in the package. - * - * @param packagePath - * The relative package filePath within the ODF package - * @return True if there is an entry and a file for the given filePath - */ - public boolean contains(String packagePath) { - packagePath = ensureValidPackagePath(packagePath); - return mPackageEntries.contains(packagePath); - /* TODO: return true for later added stuff */ - // return (mPackageEntries.contains(packagePath) && - // (mTempFiles.get(packagePath) != null || - // mContentStreams.get(packagePath)!=null) && getFileEntry(packagePath) - // != null); - } - - /** - * Save the package to given filePath. - * - * @param odfPath - * - the path to the ODF package destination - * @throws java.lang.Exception - * - if the package could not be saved - */ - public void save(String odfPath) throws Exception { - File f = new File(odfPath); - save(f); - } - - /** - * Save package to a given File. After saving it is still necessary to close - * the package to have again full access about the file. - * - * @param odfFile - * - the File to save the ODF package to - * @throws java.lang.Exception - * - if the package could not be saved - */ - public void save(File odfFile) throws Exception { - String baseURI = odfFile.getCanonicalFile().toURI().toString(); - if (File.separatorChar == '\\') - baseURI = baseURI.replaceAll("\\\\", SLASH); - if (baseURI.equals(mBaseURI)) - /* save to the same file: cache everything first */ - // TODO: maybe it's better to write to a new file and copy that - // to the original one - would be less memory footprint - cacheContent(); - FileOutputStream fos = new FileOutputStream(odfFile); - save(fos, baseURI); - } - - public void save(OutputStream odfStream) throws Exception { - save(odfStream, null); - } - - /** - * Save an ODF document to the OutputStream. - * - * @param odfStream - * - the OutputStream to insert content to - * @param baseURI - * - a URI for the package to be stored - * @throws java.lang.Exception - * - if the package could not be saved - */ - private void save(OutputStream odfStream, String baseURI) throws Exception { - mBaseURI = baseURI; - - OdfFileEntry rootEntry = getManifestEntries().get(SLASH); - if (rootEntry == null) { - rootEntry = new OdfFileEntry(SLASH, mMediaType); - mManifestList.add(0, rootEntry.getPath()); - } else - rootEntry.setMediaType(mMediaType); - - ZipOutputStream zos = new ZipOutputStream(odfStream); - long modTime = (new java.util.Date()).getTime(); - - /* - * move manifest to first place to ensure it is written first into the - * package zip file - */ - if (mPackageEntries.contains(OdfFile.MEDIA_TYPE.getPath())) { - mPackageEntries.remove(OdfFile.MEDIA_TYPE.getPath()); - mPackageEntries.add(0, OdfFile.MEDIA_TYPE.getPath()); - } - - Iterator<String> it = mPackageEntries.iterator(); - while (it.hasNext()) { - String key = it.next(); - byte[] data = getBytes(key); - - ZipEntry ze = mZipEntries.get(key); - if (ze == null) - ze = new ZipEntry(key); - ze.setTime(modTime); - ze.setMethod(isFileCompressed(key) ? DEFLATED : STORED); - - CRC32 crc = new CRC32(); - if (data != null) { - crc.update(data); - ze.setSize(data.length); - } else { - ze.setMethod(STORED); - ze.setSize(0); - } - ze.setCrc(crc.getValue()); - ze.setCompressedSize(-1); - zos.putNextEntry(ze); - if (data != null) - zos.write(data, 0, data.length); - zos.closeEntry(); - - mZipEntries.put(key, ze); - } - zos.close(); - odfStream.flush(); - } - - /** - * if the file is to be compressed,return true - * - * @param key - * --file name - * @return false if the file is not to be compressed - */ - private boolean isFileCompressed(String key) { - if (key.equals(OdfPackage.OdfFile.MEDIA_TYPE.getPath())) - return false; - boolean result = true; - if (key.lastIndexOf(".") > 0) { - String endWith = key.substring(key.lastIndexOf(".") + 1, - key.length()); - if (mCompressedFileTypes.contains(endWith.toLowerCase())) - result = false; - } - return result; - } - - /** - * If this file is saved to itself, we have to cache it. It is not possible - * to read and write from the same zip file at the same time, so the content - * must be read and stored in memory. - */ - private void cacheContent() throws Exception { - // read all entries - getManifestEntries(); - Iterator<String> entries = mZipEntries.keySet().iterator(); - while (entries.hasNext()) { - // open all entries once so the data is cached - ZipEntry nextElement = mZipEntries.get(entries.next()); - String entryPath = nextElement.getName(); - getBytes(entryPath); - } - } - - /** - * Close the OdfPackage after it is no longer needed. Even after saving it - * is still necessary to close the package to have again full access about - * the file. Closing the OdfPackage will release all temporary created data. - * Do this as the last action to free resources. Closing an already closed - * document has no effect. - */ - @Override - public void close() { - if (mTempDir != null) - TempDir.deleteTempOdfDirectory(mTempDir); - try { - if (mZipFile != null) - mZipFile.close(); - } catch (IOException ex) { - // log exception and continue - Logger.getLogger(OdfPackage.class.getName()).log(INFO, null, ex); - } - // release all stuff - this class is impossible to use afterwards - mZipFile = null; - mTempDirParent = null; - mTempDir = null; - mMediaType = null; - mPackageEntries = null; - mZipEntries = null; - mContentDoms = null; - mContentStreams = null; - mTempFiles = null; - mManifestList = null; - mManifestEntries = null; - mBaseURI = null; - mResolver = null; - } - - /** - * Data was updated, update mZipEntry and OdfFileEntry as well - */ - private void entryUpdate(String packagePath) throws Exception, - SAXException, TransformerConfigurationException, - TransformerException, ParserConfigurationException { - - byte[] data = getBytes(packagePath); - int size = (data == null ? 0 : data.length); - OdfFileEntry fileEntry = getManifestEntries().get(packagePath); - ZipEntry zipEntry = mZipEntries.get(packagePath); - - if (fileEntry != null) { - // if (XML_MEDIA_TYPE.equals(fileEntry.getMediaType())) { - // fileEntry.setSize(-1); - // } else { - fileEntry.setSize(size); - // } - } - if (zipEntry == null) - return; - zipEntry.setSize(size); - CRC32 crc = new CRC32(); - if ((data != null) && size > 0) - crc.update(data); - zipEntry.setCrc(crc.getValue()); - zipEntry.setCompressedSize(-1); - long modTime = (new java.util.Date()).getTime(); - zipEntry.setTime(modTime); - } - - /** - * Parse the Manifest file - */ - void parseManifest() throws Exception { - InputStream is = getInputStream(OdfPackage.OdfFile.MANIFEST.packagePath); - if (is == null) { - mManifestList = null; - mManifestEntries = null; - return; - } - - mManifestList = new LinkedList<>(); - - SAXParserFactory factory = SAXParserFactory.newInstance(); - factory.setNamespaceAware(true); - factory.setValidating(false); - try { - factory.setFeature( - "http://apache.org/xml/features/nonvalidating/load-external-dtd", - false); - } catch (Exception ex) { - mLog.log(Level.SEVERE, null, ex); - } - - SAXParser parser = factory.newSAXParser(); - XMLReader xmlReader = parser.getXMLReader(); - // More details at http://xerces.apache.org/xerces2-j/features.html#namespaces - xmlReader.setFeature("http://xml.org/sax/features/namespaces", true); - // More details at http://xerces.apache.org/xerces2-j/features.html#namespace-prefixes - xmlReader.setFeature("http://xml.org/sax/features/namespace-prefixes", - true); - try { - // More details at http://xerces.apache.org/xerces2-j/features.html#xmlns-uris - xmlReader.setFeature("http://xml.org/sax/features/xmlns-uris", true); - } catch (SAXException ex) { - mLog.log(Level.FINE, "Can't set XML reader feature xmlns-uris", ex); - } - - String uri = mBaseURI + OdfPackage.OdfFile.MANIFEST.packagePath; - xmlReader.setEntityResolver(getEntityResolver()); - xmlReader.setContentHandler(new ManifestContentHandler()); - - InputSource ins = new InputSource(is); - ins.setSystemId(uri); - - xmlReader.parse(ins); - - mContentStreams.remove(OdfPackage.OdfFile.MANIFEST.packagePath); - entryUpdate(OdfPackage.OdfFile.MANIFEST.packagePath); - } - - /** - * Checks if packagePath is not null nor empty and not an external reference - */ - private String ensureValidPackagePath(String packagePath) { - if (packagePath == null) { - String errMsg = "The packagePath given by parameter is NULL!"; - mLog.severe(errMsg); - throw new IllegalArgumentException(errMsg); - } - if (packagePath.equals(EMPTY_STRING)) { - String errMsg = "The packagePath given by parameter is an empty string!"; - mLog.severe(errMsg); - throw new IllegalArgumentException(errMsg); - } - - if (packagePath.indexOf('\\') != -1) - packagePath = packagePath.replace('\\', '/'); - if (isExternalReference(packagePath)) { - String errMsg = "The packagePath given by parameter '" - + packagePath - + "' is not an internal ODF package path!"; - mLog.severe(errMsg); - throw new IllegalArgumentException(errMsg); - } - return packagePath; - } - - /** - * add a directory to the OdfPackage - */ - private void addDirectory(String packagePath) throws Exception { - packagePath = ensureValidPackagePath(packagePath); - - if ((packagePath.length() < 1) - || (packagePath.charAt(packagePath.length() - 1) != '/')) - packagePath = packagePath + SLASH; - insert((byte[]) null, packagePath, null); - } - - /** - * Insert DOM tree into OdfPackage. An existing file will be replaced. - * - * @param fileDOM - * - XML DOM tree to be inserted as file - * @param packagePath - * - relative filePath where the DOM tree should be inserted as - * XML file - * @param mediaType - * - media type of stream. Set to null if unknown - * @throws java.lang.Exception - * when the DOM tree could not be inserted - */ - public void insert(Document fileDOM, String packagePath, String mediaType) - throws Exception { - packagePath = ensureValidPackagePath(packagePath); - - try { - if (mManifestEntries == null) - parseManifest(); - } catch (Exception e) { - throw new RuntimeException(e); - } - - if (mediaType == null) - mediaType = XML_MEDIA_TYPE; - String d = EMPTY_STRING; - StringTokenizer tok = new StringTokenizer(packagePath, SLASH); - while (tok.hasMoreTokens()) { - String s = tok.nextToken(); - if (EMPTY_STRING.equals(d)) - d = s + SLASH; - else - d = d + s + SLASH; - if (tok.hasMoreTokens() && !mPackageEntries.contains(d)) - addDirectory(d); - } - - mContentStreams.remove(packagePath); - if (fileDOM == null) - mContentDoms.remove(packagePath); - else - mContentDoms.put(packagePath, fileDOM); - - if (!mPackageEntries.contains(packagePath)) - mPackageEntries.add(packagePath); - - try { - if (!OdfPackage.OdfFile.MANIFEST.packagePath.equals(packagePath)) { - if (mManifestEntries != null - && mManifestEntries.get(packagePath) == null) { - OdfFileEntry fileEntry = new OdfFileEntry(packagePath, - mediaType); - mManifestEntries.put(packagePath, fileEntry); - mManifestList.add(packagePath); - } - } else - parseManifest(); - // try to get the package from our cache - ZipEntry ze = mZipEntries.get(packagePath); - if (ze == null) { - ze = new ZipEntry(packagePath); - ze.setMethod(DEFLATED); - mZipEntries.put(packagePath, ze); - } - if (!isFileCompressed(packagePath)) - ze.setMethod(STORED); - - entryUpdate(packagePath); - } catch (SAXException se) { - throw new Exception("SAXException:" + se.getMessage()); - } catch (ParserConfigurationException pce) { - throw new Exception("ParserConfigurationException:" - + pce.getMessage()); - } catch (TransformerConfigurationException tce) { - throw new Exception("TransformerConfigurationException:" - + tce.getMessage()); - } catch (TransformerException te) { - throw new Exception("TransformerException:" + te.getMessage()); - } - } - - /** - * returns true if a DOM tree has been requested for given sub-content of - * OdfPackage - * - * @param packagePath - * - a path inside the OdfPackage eg to a content.xml stream - * @return - wether the package class internally has a DOM representation - * for the given path - */ - public boolean hasDom(String packagePath) { - return (mContentDoms.get(packagePath) != null); - } - - /** - * Gets org.w3c.dom.Document for XML file contained in package. - * - * @param packagePath - * - a path inside the OdfPackage eg to a content.xml stream - * @return an org.w3c.dom.Document - * @throws SAXException - * @throws ParserConfigurationException - * @throws Exception - * @throws IllegalArgumentException - * @throws TransformerConfigurationException - * @throws TransformerException - */ - public Document getDom(String packagePath) throws SAXException, - ParserConfigurationException, Exception, IllegalArgumentException, - TransformerConfigurationException, TransformerException { - Document doc = mContentDoms.get(packagePath); - if (doc != null) - return doc; - - InputStream is = getInputStream(packagePath); - - DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); - factory.setNamespaceAware(true); - factory.setValidating(false); - - DocumentBuilder builder = factory.newDocumentBuilder(); - builder.setEntityResolver(getEntityResolver()); - - String uri = getBaseURI() + packagePath; - - // if (mErrorHandler != null) { - // builder.setErrorHandler(mErrorHandler); - // } - - InputSource ins = new InputSource(is); - ins.setSystemId(uri); - - doc = builder.parse(ins); - - if (doc != null) { - mContentDoms.put(packagePath, doc); - // mContentStreams.remove(packagePath); - } - return doc; - } - - /** - * Inserts InputStream into an OdfPackage. An existing file will be - * replaced. - * - * @param sourceURI - * - the source URI to the file to be inserted into the package. - * @param mediaType - * - media type of stream. Set to null if unknown - * @param packagePath - * - relative filePath where the tree should be inserted as XML - * file - * @throws java.lang.Exception - * In case the file could not be saved - */ - public void insert(URI sourceURI, String packagePath, String mediaType) - throws Exception { - InputStream is = null; - if (sourceURI.isAbsolute()) - // if the URI is absolute it can be converted to URL - is = sourceURI.toURL().openStream(); - else { - // otherwise create a file class to open the stream - is = new FileInputStream(sourceURI.toString()); - // TODO: error handling in this case! -> allow method insert(URI, - // ppath, mtype)? - } - insert(is, packagePath, mediaType); - } - - /** - * Inserts InputStream into an OdfPackage. An existing file will be - * replaced. - * - * @param fileStream - * - the stream of the file to be inserted into the ODF package. - * @param mediaType - * - media type of stream. Set to null if unknown - * @param packagePath - * - relative filePath where the tree should be inserted as XML - * file - * @throws java.lang.Exception - * In case the file could not be saved - */ - public void insert(InputStream fileStream, String packagePath, - String mediaType) throws Exception { - packagePath = ensureValidPackagePath(packagePath); - - if (fileStream == null) { - insert((byte[]) null, packagePath, mediaType); - return; - } - - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - BufferedInputStream bis = new BufferedInputStream(fileStream); - StreamHelper.stream(bis, baos); - byte[] data = baos.toByteArray(); - insert(data, packagePath, mediaType); - // image should not be stored in memory but on disc - if (!packagePath.endsWith(".xml") - && !packagePath.equals(OdfPackage.OdfFile.MEDIA_TYPE.getPath()) - && mUseTempFile) { - // insertOutputStream to filesystem - File tempFile = new File(getTempDir(), packagePath); - File parent = tempFile.getParentFile(); - parent.mkdirs(); - try (OutputStream fos = new BufferedOutputStream( - new FileOutputStream(tempFile))) { - fos.write(data); - } - mTempFiles.put(packagePath, tempFile); - mContentStreams.remove(packagePath); - } - } - - /** - * Insert byte array into OdfPackage. An existing file will be replaced. - * - * @param fileBytes - * - data of the file stream to be stored in package - * @param mediaType - * - media type of stream. Set to null if unknown - * @param packagePath - * - relative filePath where the DOM tree should be inserted as - * XML file - * @throws java.lang.Exception - * when the DOM tree could not be inserted - */ - public void insert(byte[] fileBytes, String packagePath, String mediaType) - throws Exception { - packagePath = ensureValidPackagePath(packagePath); - - String d = EMPTY_STRING; - // 2DO: Test tokenizer for whitespaces.. - StringTokenizer tok = new StringTokenizer(packagePath, SLASH); - while (tok.hasMoreTokens()) { - String s = tok.nextToken(); - d = (EMPTY_STRING.equals(d) ? s + SLASH : d + s + SLASH); - if (tok.hasMoreTokens() && !mPackageEntries.contains(d)) { - addDirectory(d); - /* - * add manifest entry for folder if not already existing media - * type for folder has to be set for embedded objects - */ - if (!OdfPackage.OdfFile.MANIFEST.packagePath.equals(d) - && mediaType != null - && getManifestEntries().get(d) == null) { - OdfFileEntry fileEntry = new OdfFileEntry(d, mediaType, -1); - getManifestEntries().put(d, fileEntry); - if (!mManifestList.contains(d)) - mManifestList.add(d); - } - } - } - try { - if (OdfPackage.OdfFile.MEDIA_TYPE.getPath().equals(packagePath)) { - try { - setMediaType(new String(fileBytes, "UTF-8")); - } catch (UnsupportedEncodingException useEx) { - mLog.log(WARNING, - "ODF file could not be created as string!", useEx); - } - return; - } - if (fileBytes == null) - mContentStreams.remove(packagePath); - else - mContentStreams.put(packagePath, fileBytes); - if (!mPackageEntries.contains(packagePath)) - mPackageEntries.add(packagePath); - if (!OdfPackage.OdfFile.MANIFEST.packagePath.equals(packagePath)) { - if (mediaType != null - && getManifestEntries().get(packagePath) == null) { - OdfFileEntry fileEntry = new OdfFileEntry(packagePath, - mediaType); - getManifestEntries().put(packagePath, fileEntry); - if (!mManifestList.contains(packagePath)) - mManifestList.add(packagePath); - } - } else - parseManifest(); - ZipEntry ze = mZipEntries.get(packagePath); - if (ze != null) { - ze = new ZipEntry(packagePath); - ze.setMethod(DEFLATED); - mZipEntries.put(packagePath, ze); - // 2DO Svante: No dependency to layer above! - if (isFileCompressed(packagePath) == false) - ze.setMethod(STORED); - } - entryUpdate(packagePath); - } catch (SAXException se) { - throw new Exception("SAXException:" + se.getMessage()); - } catch (ParserConfigurationException pce) { - throw new Exception("ParserConfigurationException:" - + pce.getMessage()); - } catch (TransformerConfigurationException tce) { - throw new Exception("TransformerConfigurationException:" - + tce.getMessage()); - } catch (TransformerException te) { - throw new Exception("TransformerException:" + te.getMessage()); - } - } - - @SuppressWarnings("unused") - private void insert(ZipEntry zipe, byte[] content) { - if (content != null) { - if (zipe.getName().equals(OdfPackage.OdfFile.MEDIA_TYPE.getPath())) { - try { - mMediaType = new String(content, 0, content.length, "UTF-8"); - } catch (UnsupportedEncodingException ex) { - mLog.log(Level.SEVERE, null, ex); - } - } else - mContentStreams.put(zipe.getName(), content); - } - if (!mPackageEntries.contains(zipe.getName())) - mPackageEntries.add(zipe.getName()); - mZipEntries.put(zipe.getName(), zipe); - } - - @SuppressWarnings("unused") - private void insert(ZipEntry zipe, File file) { - if (file != null) - mTempFiles.put(zipe.getName(), file); - if (!mPackageEntries.contains(zipe.getName())) - mPackageEntries.add(zipe.getName()); - mZipEntries.put(zipe.getName(), zipe); - } - - public HashMap<String, OdfFileEntry> getManifestEntries() { - if (mManifestEntries == null) - try { - parseManifest(); - if (mManifestEntries == null) - return null; - } catch (Exception e) { - throw new RuntimeException(e); - } - return mManifestEntries; - } - - /** - * Get Manifest as String NOTE: This functionality should better be moved to - * a DOM based Manifest class - * - * @return the /META-INF/manifest.xml as a String - */ - public String getManifestAsString() { - StringBuilder buf = new StringBuilder(); - - buf.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"); - buf.append("<manifest:manifest xmlns:manifest=\"urn:oasis:names:tc:opendocument:xmlns:manifest:1.0\">\n"); - - Iterator<String> it = mManifestList.iterator(); - while (it.hasNext()) { - String key = it.next(); - String s = null; - OdfFileEntry fileEntry = mManifestEntries.get(key); - if (fileEntry != null) { - buf.append(" <manifest:file-entry"); - s = fileEntry.getMediaType(); - if (s == null) - s = EMPTY_STRING; - buf.append(" manifest:media-type=\""); - buf.append(encodeXMLAttributes(s)); - buf.append("\""); - s = fileEntry.getPath(); - - if (s == null) - s = EMPTY_STRING; - buf.append(" manifest:full-path=\""); - buf.append(encodeXMLAttributes(s)); - buf.append("\""); - int i = fileEntry.getSize(); - if (i > 0) { - buf.append(" manifest:size=\""); - buf.append(i); - buf.append("\""); - } - if (fileEntry.getVersion() != null) { - buf.append(" manifest:version=\""); - buf.append(encodeXMLAttributes(fileEntry.getVersion())); - buf.append("\""); - } - - EncryptionData enc = fileEntry.getEncryptionData(); - - if (enc != null) { - buf.append(">\n"); - buf.append(" <manifest:encryption-data>\n"); - Algorithm alg = enc.getAlgorithm(); - if (alg != null) { - buf.append(" <manifest:algorithm"); - s = alg.getName(); - if (s == null) - s = EMPTY_STRING; - buf.append(" manifest:algorithm-name=\""); - buf.append(encodeXMLAttributes(s)); - buf.append("\""); - s = alg.getInitializationVector(); - if (s == null) - s = EMPTY_STRING; - buf.append(" manifest:initialization-vector=\""); - buf.append(encodeXMLAttributes(s)); - buf.append("\"/>\n"); - } - KeyDerivation keyDerivation = enc.getKeyDerivation(); - if (keyDerivation != null) { - buf.append(" <manifest:key-derivation"); - s = keyDerivation.getName(); - if (s == null) - s = EMPTY_STRING; - buf.append(" manifest:key-derivation-name=\""); - buf.append(encodeXMLAttributes(s)); - buf.append("\""); - s = keyDerivation.getSalt(); - if (s == null) - s = EMPTY_STRING; - buf.append(" manifest:salt=\""); - buf.append(encodeXMLAttributes(s)); - buf.append("\""); - - buf.append(" manifest:iteration-count=\""); - buf.append(keyDerivation.getIterationCount()); - buf.append("\"/>\n"); - } - buf.append(" </manifest:encryption-data>\n"); - buf.append(" </manifest:file-entry>\n"); - } else - buf.append("/>\n"); - } - } - buf.append("</manifest:manifest>"); - - return buf.toString(); - } - - /** - * Get package (sub-) content as byte array - * - * @param packagePath - * relative filePath to the package content - * @return the unzipped package content as byte array - * @throws java.lang.Exception - */ - public byte[] getBytes(String packagePath) throws Exception { - packagePath = ensureValidPackagePath(packagePath); - byte[] data = null; - - if (packagePath == null || packagePath.equals(EMPTY_STRING)) { - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - save(baos, mBaseURI); - return baos.toByteArray(); - } - if (packagePath.equals(OdfPackage.OdfFile.MEDIA_TYPE.getPath())) { - if (mMediaType == null) - return null; - try { - data = mMediaType.getBytes("UTF-8"); - } catch (UnsupportedEncodingException use) { - mLog.log(Level.SEVERE, null, use); - return null; - } - } else if (mPackageEntries.contains(packagePath) - && mContentDoms.get(packagePath) != null) { - Document doc = mContentDoms.get(packagePath); - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - - // DOMXSImplementationSourceImpl dis = new - // org.apache.xerces.dom.DOMXSImplementationSourceImpl(); - // DOMImplementationLS impl = (DOMImplementationLS) - // dis.getDOMImplementation("LS"); - DOMImplementationLS impl = (DOMImplementationLS) DOMImplementationRegistry - .newInstance().getDOMImplementation("LS"); - LSSerializer writer = impl.createLSSerializer(); - - LSOutput output = impl.createLSOutput(); - output.setByteStream(baos); - - writer.write(doc, output); - data = baos.toByteArray(); - } else if (mPackageEntries.contains(packagePath) - && mTempFiles.get(packagePath) != null) { - ByteArrayOutputStream os = new ByteArrayOutputStream(); - try (InputStream is = new BufferedInputStream(new FileInputStream( - mTempFiles.get(packagePath)))) { - StreamHelper.stream(is, os); - } - os.close(); - data = os.toByteArray(); - } else if (mPackageEntries.contains(packagePath) - && mContentStreams.get(packagePath) != null) - data = mContentStreams.get(packagePath); - else if (packagePath.equals(OdfPackage.OdfFile.MANIFEST.packagePath)) { - if (mManifestEntries == null) - // manifest was not present - return null; - String s = getManifestAsString(); - if (s == null) - return null; - data = s.getBytes("UTF-8"); - } - - if (data == null) { // not yet stored data; retrieve it. - ZipEntry entry = mZipEntries.get(packagePath); - if (entry != null) { - InputStream inputStream = mZipFile.getInputStream(entry); - if (inputStream != null) { - ByteArrayOutputStream out = new ByteArrayOutputStream(); - StreamHelper.stream(inputStream, out); - data = out.toByteArray(); - // store for further usage; do not care about manifest: that - // is handled exclusively - mContentStreams.put(packagePath, data); - if (!mPackageEntries.contains(packagePath)) - mPackageEntries.add(packagePath); - } - } - } - return data; - } - - /** - * Get subcontent as InputStream - * - * @param packagePath - * of the desired stream. - * @return Inputstream of the ODF file within the package for the given - * path. - * @throws Exception - */ - public InputStream getInputStream(String packagePath) throws Exception { - packagePath = ensureValidPackagePath(packagePath); - - if (packagePath.equals(OdfPackage.OdfFile.MANIFEST.packagePath) - && (mManifestEntries == null)) { - ZipEntry entry = null; - if ((entry = mZipEntries.get(packagePath)) != null) - return mZipFile.getInputStream(entry); - } - - if (mPackageEntries.contains(packagePath) - && mTempFiles.get(packagePath) != null) - return new BufferedInputStream(new FileInputStream( - mTempFiles.get(packagePath))); - - /* - * else we always cache here and return a ByteArrayInputStream because - * if we would return ZipFile getInputStream(entry) we would not be able - * to read 2 Entries at the same time. This is a limitation of the - * ZipFile class. - * - * As it would be quite a common thing to read the content.xml and the - * styles.xml simultaneously when using XSLT on OdfPackages we want to - * circumvent this limitation - */ - - byte[] data = getBytes(packagePath); - if (data != null && data.length != 0) - return new ByteArrayInputStream(data); - return null; - } - - /** - * Gets the InputStream containing whole OdfPackage. - * - * @return the ODF package as input stream - * @throws java.lang.Exception - * - if the package could not be read - */ - public InputStream getInputStream() throws Exception { - final PipedOutputStream os = new PipedOutputStream(); - final PipedInputStream is = new PipedInputStream(); - - is.connect(os); - - Thread thread1 = new Thread() { - @Override - public void run() { - try { - save(os, mBaseURI); - } catch (Exception e) { - } - } - }; - - Thread thread2 = new Thread() { - @Override - public void run() { - try { - BufferedInputStream bis = new BufferedInputStream(is, - PAGE_SIZE); - BufferedOutputStream bos = new BufferedOutputStream(os, - PAGE_SIZE); - StreamHelper.stream(bis, bos); - is.close(); - os.close(); - } catch (Exception ie) { - } - } - }; - - thread1.start(); - thread2.start(); - - return is; - } - - /** - * Insert the OutputStream for into OdfPackage. An existing file will be - * replaced. - * - * @param packagePath - * - relative filePath where the DOM tree should be inserted as - * XML file - * @return outputstream for the data of the file to be stored in package - * @throws java.lang.Exception - * when the DOM tree could not be inserted - */ - public OutputStream insertOutputStream(String packagePath) throws Exception { - return insertOutputStream(packagePath, null); - } - - /** - * Insert the OutputStream - to be filled after method - when stream is - * closed into OdfPackage. An existing file will be replaced. - * - * @param packagePath - * - relative filePath where the DOM tree should be inserted as - * XML file - * @param mediaType - * - media type of stream - * @return outputstream for the data of the file to be stored in package - * @throws java.lang.Exception - * when the DOM tree could not be inserted - */ - public OutputStream insertOutputStream(String packagePath, String mediaType) - throws Exception { - packagePath = ensureValidPackagePath(packagePath); - final String fPath = packagePath; - final OdfFileEntry fFileEntry = getFileEntry(packagePath); - final String fMediaType = mediaType; - - ByteArrayOutputStream baos = new ByteArrayOutputStream() { - @Override - public void close() { - try { - byte[] data = this.toByteArray(); - if (fMediaType == null || fMediaType.length() == 0) - insert(data, fPath, fFileEntry == null ? null - : fFileEntry.getMediaType()); - else - insert(data, fPath, fMediaType); - super.close(); - } catch (Exception ex) { - mLog.log(Level.SEVERE, null, ex); - } - } - }; - return baos; - } - - // /** - // * get an InputStream with a specific filePath from the package. - // * - // * @throws IllegalArgumentException if sub-content is not XML - // */ - // public InputStream getInputStream(String filePath) throws Exception { - // return mZipFile.getInputStream(mZipFile.getEntry(filePath)); - // // OdfPackageStream stream = new OdfPackageStream(this, filePath); - // // return stream; - // } - - public void remove(String packagePath) { - HashMap<String, OdfFileEntry> manifestEntries = getManifestEntries(); - if (mManifestList != null && mManifestList.contains(packagePath)) - mManifestList.remove(packagePath); - if (manifestEntries != null && manifestEntries.containsKey(packagePath)) - manifestEntries.remove(packagePath); - if (mZipEntries != null && mZipEntries.containsKey(packagePath)) - mZipEntries.remove(packagePath); - if (mTempFiles != null && mTempFiles.containsKey(packagePath)) - mTempFiles.remove(packagePath).delete(); - if (mPackageEntries != null && mPackageEntries.contains(packagePath)) - mPackageEntries.remove(packagePath); - } - - /** - * Checks if the given reference is a reference, which points outside the - * ODF package - * - * @param fileRef - * the file reference to be checked - * @return true if the reference is an package external reference - */ - public static boolean isExternalReference(String fileRef) { - // if the fileReference is... - return fileRef.startsWith(TWO_DOTS) // an external relative filePath - || fileRef.startsWith(SLASH) // or absolute filePath - || fileRef.contains(COLON); // or absolute IRI - } - - /** - * Get Temp Directory. Create new temp directory on demand and register it - * for removal by garbage collector - */ - private File getTempDir() throws Exception { - if (mTempDir == null) { - mTempDir = newTempOdfDirectory("ODF", mTempDirParent); - mFinalize = new OdfFinalizablePackage(mTempDir); - } - return mTempDir; - } - - /** - * Encoded XML Attributes - */ - private String encodeXMLAttributes(String s) { - return s.replaceAll("\"", """).replaceAll("'", "'"); - } - - private class ManifestContentHandler implements ContentHandler { - private OdfFileEntry fileEntry; - private EncryptionData encryptionData; - - /** - * Receive an object for locating the origin of SAX document events. - */ - @Override - public void setDocumentLocator(Locator locator) { - } - - /** - * Receive notification of the beginning of a document. - */ - @Override - public void startDocument() throws SAXException { - mManifestList = new LinkedList<>(); - mManifestEntries = new HashMap<>(); - } - - /** - * Receive notification of the end of a document. - */ - @Override - public void endDocument() throws SAXException { - } - - /** - * Begin the scope of a prefix-URI Namespace mapping. - */ - @Override - public void startPrefixMapping(String prefix, String uri) - throws SAXException { - } - - /** - * End the scope of a prefix-URI mapping. - */ - @Override - public void endPrefixMapping(String prefix) throws SAXException { - } - - /** - * Receive notification of the beginning of an element. - */ - @Override - public void startElement(String namespaceURI, String localName, - String qName, Attributes atts) throws SAXException { - switch (localName) { - case "file-entry": - fileEntry = new OdfFileEntry(); - fileEntry.setPath(atts.getValue("manifest:full-path")); - fileEntry.setMediaType(atts.getValue("manifest:media-type")); - try { - if (atts.getValue("manifest:size") != null) - fileEntry.setSize(Integer.parseInt(atts - .getValue("manifest:size"))); - } catch (NumberFormatException nfe) { - throw new SAXException("not a number: " - + atts.getValue("manifest:size")); - } - fileEntry.setVersion(atts.getValue("manifest:version")); - break; - case "encryption-data": - encryptionData = new EncryptionData(); - if (fileEntry != null) { - encryptionData.setChecksumType(atts - .getValue("manifest:checksum-type")); - encryptionData.setChecksum(atts - .getValue("manifest:checksum")); - fileEntry.setEncryptionData(encryptionData); - } - break; - case "algorithm": - Algorithm algorithm = new Algorithm(); - algorithm.setName(atts.getValue("manifest:algorithm-name")); - algorithm.setInitializationVector(atts - .getValue("manifest:initialization-vector")); - if (encryptionData != null) - encryptionData.setAlgorithm(algorithm); - break; - case "key-derivation": - KeyDerivation keyDerivation = new KeyDerivation(); - keyDerivation.setName(atts - .getValue("manifest:key-derivation-name")); - keyDerivation.setSalt(atts.getValue("manifest:salt")); - try { - if (atts.getValue("manifest:iteration-count") != null) - keyDerivation.setIterationCount(Integer.parseInt(atts - .getValue("manifest:iteration-count"))); - } catch (NumberFormatException nfe) { - throw new SAXException("not a number: " - + atts.getValue("manifest:iteration-count")); - } - if (encryptionData != null) - encryptionData.setKeyDerivation(keyDerivation); - break; - } - } - - /** - * Receive notification of the end of an element. - */ - @Override - public void endElement(String namespaceURI, String localName, - String qName) throws SAXException { - if (localName.equals("file-entry")) { - if (fileEntry.getPath() != null) - getManifestEntries().put(fileEntry.getPath(), - fileEntry); - mManifestList.add(fileEntry.getPath()); - fileEntry = null; - } else if (localName.equals("encryption-data")) - encryptionData = null; - } - - /** - * Receive notification of character data. - */ - @Override - public void characters(char[] ch, int start, int length) - throws SAXException { - } - - /** - * Receive notification of ignorable whitespace in element content. - */ - @Override - public void ignorableWhitespace(char[] ch, int start, int length) - throws SAXException { - } - - /** - * Receive notification of a processing instruction. - */ - @Override - public void processingInstruction(String target, String data) - throws SAXException { - } - - /** - * Receive notification of a skipped entity. - */ - @Override - public void skippedEntity(String name) throws SAXException { - } - } - - /** - * resolve external entities - */ - private class Resolver implements EntityResolver, URIResolver { - /** - * Resolver constructor. - */ - public Resolver() { - } - - /** - * Allow the application to resolve external entities. - * - * The Parser will call this method before opening any external entity - * except the top-level document entity (including the external DTD - * subset, external entities referenced within the DTD, and external - * entities referenced within the document element): the application may - * request that the parser resolve the entity itself, that it use an - * alternative URI, or that it use an entirely different input source. - */ - @Override - public InputSource resolveEntity(String publicId, String systemId) - throws SAXException { - // This deactivates the attempt to loadPackage the Math DTD - if (publicId != null - && publicId - .startsWith("-//OpenOffice.org//DTD Modified W3C MathML")) - return new InputSource(new ByteArrayInputStream( - "<?xml version='1.0' encoding='UTF-8'?>".getBytes())); - - if (systemId == null) - return null; - - if ((mBaseURI != null) && systemId.startsWith(mBaseURI)) { - if (systemId.equals(mBaseURI)) - try { - InputStream in = getInputStream(); - InputSource ins = new InputSource(in); - ins.setSystemId(systemId); - return ins; - } catch (Exception e) { - throw new SAXException(e); - } - else if (systemId.length() > mBaseURI.length() + 1) - try (InputStream in = getInputStream(systemId - .substring(mBaseURI.length() + 1))) { - InputSource ins = new InputSource(in); - ins.setSystemId(systemId); - return ins; - } catch (Exception ex) { - mLog.log(Level.SEVERE, null, ex); - } - } else if (systemId.startsWith("resource:/")) { - int i = systemId.indexOf('/'); - if ((i > 0) && systemId.length() > i + 1) { - String res = systemId.substring(i + 1); - ClassLoader cl = OdfPackage.class.getClassLoader(); - InputStream in = cl.getResourceAsStream(res); - if (in != null) { - InputSource ins = new InputSource(in); - ins.setSystemId(systemId); - return ins; - } - } - } else if (systemId.startsWith("jar:")) - try { - URL url = new URL(systemId); - JarURLConnection jarConn = (JarURLConnection) url - .openConnection(); - InputSource ins = new InputSource(jarConn.getInputStream()); - ins.setSystemId(systemId); - return ins; - } catch (IOException ex) { - mLog.log(Level.SEVERE, null, ex); - } - return null; - } - - @Override - public Source resolve(String href, String base) - throws TransformerException { - try { - URI uri; - if (base != null) { - URI baseuri = new URI(base); - uri = baseuri.resolve(href); - } else - uri = new URI(href); - - InputSource ins; - try { - ins = resolveEntity(null, uri.toString()); - if (ins == null) - return null; - } catch (Exception e) { - throw new TransformerException(e); - } - - InputStream in = ins.getByteStream(); - StreamSource src = new StreamSource(in); - src.setSystemId(uri.toString()); - return src; - } catch (URISyntaxException use) { - return null; - } - } - } - - /** - * Get EntityResolver to be used in XML Parsers which can resolve content - * inside the OdfPackage - * - * @return a SAX EntityResolver - */ - public EntityResolver getEntityResolver() { - if (mResolver == null) - mResolver = new Resolver(); - return mResolver; - } - - /** - * Get URIResolver to be used in XSL Transformations which can resolve - * content inside the OdfPackage - * - * @return a TraX Resolver - */ - public URIResolver getURIResolver() { - if (mResolver == null) - mResolver = new Resolver(); - return mResolver; - } - - private static String getBaseURIFromFile(File file) throws Exception { - String baseURI = file.getCanonicalFile().toURI().toString(); - if (File.separatorChar == '\\') - baseURI = baseURI.replaceAll("\\\\", SLASH); - return baseURI; - } - - private class ZipHelper implements AutoCloseable { - private ZipFile mZipFile = null; - private byte[] mZipBuffer = null; - - public ZipHelper(ZipFile zipFile) { - mZipFile = zipFile; - mZipBuffer = null; - } - - public ZipHelper(byte[] buffer) { - mZipBuffer = buffer; - mZipFile = null; - } - - public Enumeration<? extends ZipEntry> entries() throws IOException { - if (mZipFile != null) - return mZipFile.entries(); - - Vector<ZipEntry> list = new Vector<>(); - ZipInputStream inputStream = new ZipInputStream( - new ByteArrayInputStream(mZipBuffer)); - ZipEntry zipEntry = inputStream.getNextEntry(); - while (zipEntry != null) { - list.add(zipEntry); - zipEntry = inputStream.getNextEntry(); - } - inputStream.close(); - return list.elements(); - } - - @SuppressWarnings("resource") - public InputStream getInputStream(ZipEntry entry) throws IOException { - if (mZipFile != null) - return mZipFile.getInputStream(entry); - - ZipInputStream inputStream = new ZipInputStream( - new ByteArrayInputStream(mZipBuffer)); - ZipEntry zipEntry = inputStream.getNextEntry(); - while (zipEntry != null) { - if (zipEntry.getName().equalsIgnoreCase(entry.getName())) - return readAsInputStream(inputStream); - zipEntry = inputStream.getNextEntry(); - } - return null; - } - - private InputStream readAsInputStream(ZipInputStream inputStream) - throws IOException { - ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); - byte[] buf = new byte[4096]; - while (true) { - int r = inputStream.read(buf); - if (r < 0) - break; - outputStream.write(buf, 0, r); - } - inputStream.close(); - return new ByteArrayInputStream(outputStream.toByteArray()); - } - - @Override - public void close() throws IOException { - if (mZipFile != null) - mZipFile.close(); - else - mZipBuffer = null; - } - } -} http://git-wip-us.apache.org/repos/asf/incubator-taverna-language/blob/372aab83/taverna-scufl2-ucfpackage/src/main/java/org/apache/taverna/scufl2/ucfpackage/impl/odfdom/pkg/OdfPackageStream.java ---------------------------------------------------------------------- diff --git a/taverna-scufl2-ucfpackage/src/main/java/org/apache/taverna/scufl2/ucfpackage/impl/odfdom/pkg/OdfPackageStream.java b/taverna-scufl2-ucfpackage/src/main/java/org/apache/taverna/scufl2/ucfpackage/impl/odfdom/pkg/OdfPackageStream.java deleted file mode 100644 index 5b25929..0000000 --- a/taverna-scufl2-ucfpackage/src/main/java/org/apache/taverna/scufl2/ucfpackage/impl/odfdom/pkg/OdfPackageStream.java +++ /dev/null @@ -1,81 +0,0 @@ -/************************************************************************ - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER - * - * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved. - * - * Use is subject to license terms. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy - * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also - * obtain a copy of the License at http://odftoolkit.org/docs/license.txt - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * - * See the License for the specific language governing permissions and - * limitations under the License. - * - ************************************************************************/ - -package org.apache.taverna.scufl2.ucfpackage.impl.odfdom.pkg; - -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; - -import javax.xml.transform.stream.StreamSource; - -import org.apache.taverna.scufl2.ucfpackage.impl.odfdom.pkg.manifest.OdfFileEntry; - - -/** - * OdfPackageStream is a representation of a stream that is part of an ODF file. - * If a stream is written to through the output stream, this will be reflected - * when the output stream is closed - */ -class OdfPackageStream extends StreamSource { - private OdfPackage pkg; - private String name; - private InputStream inputStream; - private OutputStream outputStream = null; - private boolean bClosed; - - public OdfPackageStream(OdfPackage pkg, String name) throws Exception { - super(pkg.getInputStream(name), pkg.getBaseURI() + "/" + name); - this.pkg = pkg; - this.name = name; - } - - public boolean isOutput() { - // denote that the output stream has been requested - return outputStream != null; - } - - public OutputStream getOutputStream() throws Exception { - if (bClosed) - throw new IOException("stream already closed"); - outputStream = pkg.insertOutputStream(name); - return outputStream; - } - - public OdfFileEntry geFileEntry() { - return pkg.getFileEntry(name); - } - - public String getName() { - return name; - } - - public OdfPackage getPackage() { - return pkg; - } - - void close() throws IOException { - bClosed = true; - inputStream.close(); - outputStream.close(); - } -} http://git-wip-us.apache.org/repos/asf/incubator-taverna-language/blob/372aab83/taverna-scufl2-ucfpackage/src/main/java/org/apache/taverna/scufl2/ucfpackage/impl/odfdom/pkg/OdfXMLHelper.java ---------------------------------------------------------------------- diff --git a/taverna-scufl2-ucfpackage/src/main/java/org/apache/taverna/scufl2/ucfpackage/impl/odfdom/pkg/OdfXMLHelper.java b/taverna-scufl2-ucfpackage/src/main/java/org/apache/taverna/scufl2/ucfpackage/impl/odfdom/pkg/OdfXMLHelper.java deleted file mode 100644 index 9d4e152..0000000 --- a/taverna-scufl2-ucfpackage/src/main/java/org/apache/taverna/scufl2/ucfpackage/impl/odfdom/pkg/OdfXMLHelper.java +++ /dev/null @@ -1,370 +0,0 @@ -/************************************************************************ - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER - * - * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved. - * - * Use is subject to license terms. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy - * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also - * obtain a copy of the License at http://odftoolkit.org/docs/license.txt - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * - * See the License for the specific language governing permissions and - * limitations under the License. - * - ************************************************************************/ -package org.apache.taverna.scufl2.ucfpackage.impl.odfdom.pkg; - -import java.io.ByteArrayOutputStream; -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.util.logging.Level; -import java.util.logging.Logger; - -import javax.xml.parsers.ParserConfigurationException; -import javax.xml.parsers.SAXParser; -import javax.xml.parsers.SAXParserFactory; -import javax.xml.transform.Result; -import javax.xml.transform.Source; -import javax.xml.transform.Templates; -import javax.xml.transform.Transformer; -import javax.xml.transform.TransformerConfigurationException; -import javax.xml.transform.TransformerException; -import javax.xml.transform.TransformerFactory; -import javax.xml.transform.dom.DOMResult; -import javax.xml.transform.dom.DOMSource; -import javax.xml.transform.stream.StreamResult; -import javax.xml.transform.stream.StreamSource; - -import org.w3c.dom.Document; -import org.w3c.dom.DocumentType; -import org.xml.sax.ContentHandler; -import org.xml.sax.ErrorHandler; -import org.xml.sax.InputSource; -import org.xml.sax.SAXException; -import org.xml.sax.XMLReader; - -public class OdfXMLHelper { - /** - * create an XMLReader - * with a Resolver set to parse content in a ODF Package - * - * @param pkg the ODF Package - * @return a SAX XMLReader - * @throws SAXException - * @throws ParserConfigurationException - */ - public XMLReader newXMLReader(OdfPackage pkg) - throws SAXException, ParserConfigurationException { - // SAXParserFactory factory = new - // org.apache.xerces.jaxp.SAXParserFactoryImpl(); - - SAXParserFactory factory = SAXParserFactory.newInstance(); - factory.setNamespaceAware(true); - factory.setValidating(false); - - SAXParser parser = factory.newSAXParser(); - XMLReader xmlReader = parser.getXMLReader(); - // More details at http://xerces.apache.org/xerces2-j/features.html#namespaces - xmlReader.setFeature("http://xml.org/sax/features/namespaces", true); - // More details at http://xerces.apache.org/xerces2-j/features.html#namespace-prefixes - xmlReader.setFeature("http://xml.org/sax/features/namespace-prefixes", true); - // More details at http://xerces.apache.org/xerces2-j/features.html#xmlns-uris - xmlReader.setFeature("http://xml.org/sax/features/xmlns-uris", true); - xmlReader.setEntityResolver(pkg.getEntityResolver()); - - return xmlReader; - } - - /** - * use SAX parser to parse content of package - * @param pkg a OdfPackage - * @param path a path inside the OdfPackage, eg. to a contained content.xml stream - * @param contentHandler a SAX Content handler to receive SAX Events - * @param errorHandler a SAX Error handler to be called on errors during parsing - * @throws SAXException - * @throws ParserConfigurationException - * @throws IOException - * @throws IllegalArgumentException - * @throws TransformerConfigurationException - * @throws TransformerException - */ - public void parse(OdfPackage pkg, String path, ContentHandler contentHandler, ErrorHandler errorHandler) - throws SAXException, ParserConfigurationException, IOException, IllegalArgumentException, TransformerConfigurationException, TransformerException { - try (InputStream is = pkg.getInputStream(path)) { - XMLReader reader = newXMLReader(pkg); - - String uri = pkg.getBaseURI() + path; - - if (contentHandler != null) - reader.setContentHandler(contentHandler); - if (errorHandler != null) - reader.setErrorHandler(errorHandler); - - InputSource ins = new InputSource(is); - ins.setSystemId(uri); - - reader.parse(ins); - } catch (Exception ex) { - Logger.getLogger(OdfXMLHelper.class.getName()).log(Level.SEVERE, null, ex); - } - } - - /** - * Do XSL-Transformation on content contained in package - * @param pkg a OdfPackage - * @param path a path inside the OdfPackage, eg. to a contained content.xml stream - * @param templatePath a path to a file in the filesystem containing an XSL Template - * @param outPath a path in the filesystem for the output of the XSL Transformation - * @throws TransformerConfigurationException - * @throws TransformerException - * @throws IOException - * @throws IllegalArgumentException - * @throws SAXException - * @throws ParserConfigurationException - */ - public void transform(OdfPackage pkg, String path, String templatePath, String outPath) - throws TransformerConfigurationException, TransformerException, - IOException, IllegalArgumentException, SAXException, ParserConfigurationException { - transform(pkg, path, new File(templatePath), new File(outPath)); - } - - /** - * Do XSL-Transformation on content contained in package - * @param pkg a OdfPackage - * @param path a path inside the OdfPackage, eg. to a contained content.xml stream - * @param templateSource TraX Source of an XSL Transformation Template - * @param outPath path to an output file for the XSL Transformation - * @throws TransformerConfigurationException - * @throws TransformerException - * @throws IOException - * @throws IllegalArgumentException - * @throws SAXException - * @throws ParserConfigurationException - */ - public void transform(OdfPackage pkg, String path, Source templateSource, String outPath) - throws TransformerConfigurationException, TransformerException, - IOException, IllegalArgumentException, SAXException, ParserConfigurationException { - transform(pkg, path, templateSource, new File(outPath)); - } - - /** - * Do XSL-Transformation on content contained in package - * @param pkg a OdfPackage - * @param path a path inside the OdfPackage, eg. to a contained content.xml stream - * @param templateSource TraX Source of an XSL Transformation - * @param out an output File - * @throws TransformerConfigurationException - * @throws TransformerException - * @throws IOException - * @throws IllegalArgumentException - * @throws SAXException - * @throws ParserConfigurationException - */ - public void transform(OdfPackage pkg, String path, Source templateSource, File out) - throws TransformerConfigurationException, TransformerException, - IOException, IllegalArgumentException, SAXException, ParserConfigurationException { - transform(pkg, path, templateSource, new StreamResult(out)); - } - - /** - * Do XSL-Transformation on content contained in package - * insert result back to package - * @param pkg a OdfPackage - * @param path a path inside the OdfPackage, eg. to a contained content.xml stream - * @param templatePath path inside the filesystem to an XSL template file - * @throws TransformerConfigurationException - * @throws TransformerException - * @throws IOException - * @throws IllegalArgumentException - * @throws SAXException - * @throws ParserConfigurationException - */ - public void transform(OdfPackage pkg, String path, String templatePath) - throws TransformerConfigurationException, TransformerException, - IOException, IllegalArgumentException, SAXException, ParserConfigurationException { - transform(pkg, path, new File(templatePath)); - } - - /** - * Do XSL-Transformation on content contained in package - * @param pkg a OdfPackage - * @param path a path inside the OdfPackage, eg. to a contained content.xml stream - * @param template File containing an XSLT Template - * @param out File for the XSLT ouput - * @throws TransformerConfigurationException - * @throws TransformerException - * @throws IOException - * @throws IllegalArgumentException - * @throws SAXException - * @throws ParserConfigurationException - */ - public void transform(OdfPackage pkg, String path, File template, File out) - throws TransformerConfigurationException, TransformerException, - IOException, IllegalArgumentException, SAXException, ParserConfigurationException { - TransformerFactory transformerfactory = TransformerFactory.newInstance(); - - Templates templates = transformerfactory.newTemplates(new StreamSource(template)); - transform(pkg, path, templates, new StreamResult(out)); - } - - /** - * Do XSL-Transformation on content contained in package - * insert result back to package - * @param pkg a OdfPackage - * @param path a path inside the OdfPackage, eg. to a contained content.xml stream - * @param template a File containing an XSLT Template - * @throws TransformerConfigurationException - * @throws TransformerException - * @throws IOException - * @throws IllegalArgumentException - * @throws SAXException - * @throws ParserConfigurationException - */ - public void transform(OdfPackage pkg, String path, File template) - throws TransformerConfigurationException, TransformerException, - IOException, IllegalArgumentException, SAXException, ParserConfigurationException { - TransformerFactory transformerfactory = TransformerFactory.newInstance(); - - Templates templates = transformerfactory.newTemplates(new StreamSource(template)); - transform(pkg, path, templates); - } - - /** - * Do XSL-Transformation on content contained in package - * @param pkg a OdfPackage - * @param path a path inside the OdfPackage, eg. to a contained content.xml stream - * @param templateSource TraX Source of an XSLT Template - * @param result TraX Result of XSL-Tranformation - * @throws TransformerConfigurationException - * @throws TransformerException - * @throws IOException - * @throws IllegalArgumentException - * @throws SAXException - * @throws ParserConfigurationException - */ - public void transform(OdfPackage pkg, String path, Source templateSource, Result result) - throws TransformerConfigurationException, TransformerException, - IOException, IllegalArgumentException, SAXException, - ParserConfigurationException { - TransformerFactory transformerfactory = TransformerFactory.newInstance(); - transformerfactory.setURIResolver(pkg.getURIResolver()); - - Templates templates = transformerfactory.newTemplates(templateSource); - transform(pkg, path, templates, result); - } - - /** - * Does an XSL-Transformation on content contained in package.<br/><br/> - * - * There are three default parameteres provided to the transformation: - * There are three default parameteres provided to the transformation: - * <ol> - * <li><b>sourceURL:</b> the URL of the source directory </li> - * <li><b>sourceBaseURL:</b> baseURL of the source file (the package). - * This URL necessary to access any content within the package from the XSLT scripts. - * The relative package path will concatenated after the 'sourceBaseURL'.</li> - * <li><b>targetURL:</b> the URL of the target directory</li> - * <li><b>targetBaseURL:</b>the baseURL of the target file</li> - * </ol> - * - * @param pkg a OdfPackage - * @param path a path inside the OdfPackage, eg. to a contained content.xml stream - * @param templates TraX XSLT Template - * @param result TraX XSLT Result - * @throws TransformerConfigurationException - * @throws TransformerException - * @throws IOException - * @throws IllegalArgumentException - * @throws SAXException - * @throws ParserConfigurationException - */ - public void transform(OdfPackage pkg, String path, Templates templates, Result result) - throws TransformerConfigurationException, TransformerException, - IOException, IllegalArgumentException, SAXException, - ParserConfigurationException { - try { - Source source = null; - String uri = pkg.getBaseURI() + path; - Document doc = pkg.getDom(path); - source = new DOMSource(doc); - Transformer transformer = templates.newTransformer(); - transformer.setURIResolver(pkg.getURIResolver()); - - transformer.setParameter("sourceURL", uri); - transformer.setParameter("sourceBaseURL", pkg.getBaseURI() + "/"); - - uri = result.getSystemId(); - if (uri != null) { - transformer.setParameter("targetURL", uri); - int i = uri.lastIndexOf('/'); - if (i > 0) { - uri = uri.substring(0, i + 1); - transformer.setParameter("targetBaseURL", uri); - } - } - DocumentType doctype = doc.getDoctype(); - if (doctype != null) { - if (doctype.getPublicId() != null) - transformer.setParameter("publicType", doctype.getPublicId()); - if (doctype.getSystemId() != null) - transformer.setParameter("systemType", doctype.getSystemId()); - } - - transformer.transform(source, result); - } catch (Exception ex) { - Logger.getLogger(OdfXMLHelper.class.getName()).log(Level.SEVERE, null, ex); - ex.printStackTrace(); - } - } - - /** - * Do XSL-Transformation on content contained in package - * and insert result back to package - * @param pkg a OdfPackage - * @param path a path inside the OdfPackage, eg. to a contained content.xml stream - * @param templates Trax XSLT Template - * @throws TransformerConfigurationException - * @throws TransformerException - * @throws IOException - * @throws IllegalArgumentException - * @throws SAXException - * @throws ParserConfigurationException - */ - @SuppressWarnings("null") - public void transform(OdfPackage pkg, String path, Templates templates) - throws TransformerConfigurationException, TransformerException, - IOException, IllegalArgumentException, SAXException, - ParserConfigurationException { - final boolean useDom = pkg.hasDom(path); - Result result = null; - ByteArrayOutputStream baos = null; - - if (useDom) - result = new DOMResult(); - else { - baos = new ByteArrayOutputStream(); - result = new StreamResult(baos); - } - - transform(pkg, path, templates, result); - - try { - if (useDom) - pkg.insert((Document) ((DOMResult) result).getNode(), path, - null); - else - pkg.insert(baos.toByteArray(), path, "text/xml"); - } catch (Exception ex) { - Logger.getLogger(OdfXMLHelper.class.getName()).log(Level.SEVERE, - null, ex); - } - } -} http://git-wip-us.apache.org/repos/asf/incubator-taverna-language/blob/372aab83/taverna-scufl2-ucfpackage/src/main/java/org/apache/taverna/scufl2/ucfpackage/impl/odfdom/pkg/StreamHelper.java ---------------------------------------------------------------------- diff --git a/taverna-scufl2-ucfpackage/src/main/java/org/apache/taverna/scufl2/ucfpackage/impl/odfdom/pkg/StreamHelper.java b/taverna-scufl2-ucfpackage/src/main/java/org/apache/taverna/scufl2/ucfpackage/impl/odfdom/pkg/StreamHelper.java deleted file mode 100644 index 19b43dc..0000000 --- a/taverna-scufl2-ucfpackage/src/main/java/org/apache/taverna/scufl2/ucfpackage/impl/odfdom/pkg/StreamHelper.java +++ /dev/null @@ -1,81 +0,0 @@ -package org.apache.taverna.scufl2.ucfpackage.impl.odfdom.pkg; -/* - * - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - * -*/ - - -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; - -/** - * This class reads from an InputStream and writes to an OutputStream. - * No streams will be closed - calling classes must do this. - */ -class StreamHelper { - // 4096 is thought to be the minimum page size for most systems; - // change this for optimization - public static final int PAGE_SIZE = 4096; - private InputStream in; - private OutputStream out; - private boolean mStreamed; - - /** - * Read from the input stream and write to the output. This method - * does not close any stream; calling methods must take care of that. - * @throws IOException when io error happens - */ - static void stream(InputStream in, OutputStream out) throws IOException { - StreamHelper s = new StreamHelper(in, out); - s.stream(); - } - - /** - * Create a new StreamHelper - * @param in the input stream used for reading - * @param out the output stream written to - */ - StreamHelper(InputStream in, OutputStream out) { - this.in = in; - this.out = out; - mStreamed = false; - } - - /** - * Read from the input stream and write to the output. This method can only - * be called once. A second call will result in an IOException. This method - * does not close any stream; calling methods must take care of that. - * @throws IOException when io error happens - */ - void stream() throws IOException { - if (mStreamed) - throw new IOException(); - byte[] buf = new byte[PAGE_SIZE]; - int r = 0; - // let npe happen if one of the streams is null - while ((r = in.read(buf, 0, PAGE_SIZE)) > -1) { - out.write(buf, 0, r); - } - // free the references - in = null; - out = null; - mStreamed = true; - } -} http://git-wip-us.apache.org/repos/asf/incubator-taverna-language/blob/372aab83/taverna-scufl2-ucfpackage/src/main/java/org/apache/taverna/scufl2/ucfpackage/impl/odfdom/pkg/TempDir.java ---------------------------------------------------------------------- diff --git a/taverna-scufl2-ucfpackage/src/main/java/org/apache/taverna/scufl2/ucfpackage/impl/odfdom/pkg/TempDir.java b/taverna-scufl2-ucfpackage/src/main/java/org/apache/taverna/scufl2/ucfpackage/impl/odfdom/pkg/TempDir.java deleted file mode 100644 index 220b3aa..0000000 --- a/taverna-scufl2-ucfpackage/src/main/java/org/apache/taverna/scufl2/ucfpackage/impl/odfdom/pkg/TempDir.java +++ /dev/null @@ -1,57 +0,0 @@ -/************************************************************************ - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER - * - * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved. - * - * Use is subject to license terms. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy - * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also - * obtain a copy of the License at http://odftoolkit.org/docs/license.txt - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * - * See the License for the specific language governing permissions and - * limitations under the License. - * - ************************************************************************/ -package org.apache.taverna.scufl2.ucfpackage.impl.odfdom.pkg; - -import java.io.File; -import java.io.IOException; - -class TempDir { - /** - * Creates a temp directory with a generated name (given a certain prefix) - * in a given directory. - * @param prefix The prefix for the directory name; must be three characters - * or more. - * @param parentDir A directory where the new tmep directory is created; - * if this is null, the java,io.tmpdir will be used. - */ - static File newTempOdfDirectory(String prefix, File parentDir) - throws IOException { - File tempFile = File.createTempFile(prefix, "", parentDir); - if (!tempFile.delete()) - throw new IOException(); - if (!tempFile.mkdir()) - throw new IOException(); - TempDirDeleter.getInstance().add(tempFile); - return tempFile; - } - - /** - * Delete a temporary created directory. As a precaution, only directories - * created by this class can be deleted. To avoid memory leaks, this class - * should be used exclusively for deleting. - * @param odfDirectory the temp directory to delete. - */ - static void deleteTempOdfDirectory(File odfDirectory) { - if (TempDirDeleter.getInstance().remove(odfDirectory)) - TempDirDeleter.getInstance().deleteDirectory(odfDirectory); - } -}
