Files
loongoffice/scripting/java/org/openoffice/idesupport/zip/ParcelZipper.java
Noel Grandin 60f152caee java: avoid unnecessary comparisons in boolean expressions
i.e. stuff like "x == true"

Change-Id: Ib82a4a30e736df392405332fa197b588482cffcf
2014-08-20 10:35:53 +02:00

163 lines
5.0 KiB
Java

/*
* This file is part of the LibreOffice project.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
* This file incorporates work covered by the following license notice:
*
* 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 .
*/
package org.openoffice.idesupport.zip;
import java.io.*;
import java.util.zip.*;
import org.openoffice.idesupport.filter.FileFilter;
import org.openoffice.idesupport.filter.BinaryOnlyFilter;
import org.openoffice.idesupport.xml.Manifest;
public class ParcelZipper
{
public static final String PARCEL_PREFIX_DIR = "Scripts/";
private static final String PARCEL_EXTENSION = "sxp";
public static final String CONTENTS_DIRNAME = "Contents";
public static final String PARCEL_DESCRIPTOR_XML = "parcel-descriptor.xml";
private static ParcelZipper zipper = null;
private static final FileFilter DEFAULT_FILTER =
BinaryOnlyFilter.getInstance();
private ParcelZipper() {
}
public static synchronized ParcelZipper getParcelZipper() {
if (zipper == null)
zipper = new ParcelZipper();
return zipper;
}
public String removeParcel(File document, String parcelName)
throws IOException {
ZipInputStream documentStream = null;
ZipOutputStream outStream = null;
Manifest manifest = null;
if (!parcelName.startsWith(PARCEL_PREFIX_DIR))
parcelName = PARCEL_PREFIX_DIR + parcelName;
manifest = removeParcelFromManifest(document, parcelName);
// first write contents of document to tmpfile
File tmpfile = new File(document.getAbsolutePath() + ".tmp");
try {
ZipEntry outEntry;
ZipEntry inEntry;
byte[] bytes = new byte[1024];
int len;
documentStream = new ZipInputStream(new FileInputStream(document));
outStream = new ZipOutputStream(new FileOutputStream(tmpfile));
while ((inEntry = documentStream.getNextEntry()) != null) {
if(inEntry.getName().startsWith(parcelName))
continue;
outEntry = new ZipEntry(inEntry);
outStream.putNextEntry(outEntry);
if(inEntry.getName().equals("META-INF/manifest.xml") &&
manifest != null) {
InputStream manifestStream = null;
try {
manifestStream = manifest.getInputStream();
while ((len = manifestStream.read(bytes)) != -1)
outStream.write(bytes, 0, len);
}
finally {
if (manifestStream != null)
manifestStream.close();
}
}
else if (!inEntry.isDirectory()) {
while ((len = documentStream.read(bytes)) != -1)
outStream.write(bytes, 0, len);
}
outStream.closeEntry();
}
}
catch (IOException ioe) {
tmpfile.delete();
throw ioe;
}
finally {
if (documentStream != null)
documentStream.close();
if (outStream != null)
outStream.close();
}
if (!document.delete()) {
tmpfile.delete();
throw new IOException("Could not overwrite " + document);
}
else
tmpfile.renameTo(document);
return document.getAbsolutePath();
}
private Manifest getManifestFromDocument(File document) {
ZipFile documentZip = null;
Manifest result = null;
try {
documentZip = new ZipFile(document);
ZipEntry original = documentZip.getEntry("META-INF/manifest.xml");
if (original != null) {
result = new Manifest(documentZip.getInputStream(original));
}
}
catch (IOException ioe) {
}
finally {
try {
if (documentZip != null)
documentZip.close();
}
catch (IOException ioe) {}
}
return result;
}
private Manifest removeParcelFromManifest(File document, String name) {
Manifest result = null;
result = getManifestFromDocument(document);
if (result == null)
return null;
result.remove(name);
return result;
}
}