< prev index next >
src/jdk.zipfs/share/classes/jdk/nio/zipfs/ZipFileSystem.java
Print this page
rev 53034 : 8215472: Cleanups in implementation classes of jdk.zipfs and tests
*** 1,7 ****
/*
! * Copyright (c) 2009, 2017, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
--- 1,7 ----
/*
! * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
*** 23,75 ****
* questions.
*/
package jdk.nio.zipfs;
import java.io.BufferedOutputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.EOFException;
- import java.io.File;
import java.io.FilterOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.ByteBuffer;
import java.nio.MappedByteBuffer;
! import java.nio.channels.*;
import java.nio.file.*;
! import java.nio.file.attribute.*;
! import java.nio.file.spi.*;
import java.security.AccessController;
import java.security.PrivilegedAction;
import java.security.PrivilegedActionException;
import java.security.PrivilegedExceptionAction;
! import java.util.*;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
import java.util.regex.Pattern;
import java.util.zip.CRC32;
- import java.util.zip.Inflater;
import java.util.zip.Deflater;
- import java.util.zip.InflaterInputStream;
import java.util.zip.DeflaterOutputStream;
import java.util.zip.ZipException;
- import static java.lang.Boolean.*;
- import static jdk.nio.zipfs.ZipConstants.*;
- import static jdk.nio.zipfs.ZipUtils.*;
- import static java.nio.file.StandardOpenOption.*;
- import static java.nio.file.StandardCopyOption.*;
/**
* A FileSystem built on a zip file
*
* @author Xueming Shen
*/
-
class ZipFileSystem extends FileSystem {
-
private final ZipFileSystemProvider provider;
private final Path zfpath;
final ZipCoder zc;
private final ZipPath rootdir;
private boolean readOnly = false; // readonly file system
--- 23,89 ----
* questions.
*/
package jdk.nio.zipfs;
+ import static java.lang.Boolean.TRUE;
+ import static jdk.nio.zipfs.ZipConstants.*;
+ import static jdk.nio.zipfs.ZipUtils.*;
+ import static java.nio.file.StandardOpenOption.*;
+ import static java.nio.file.StandardCopyOption.*;
+
import java.io.BufferedOutputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.EOFException;
import java.io.FilterOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.ByteBuffer;
import java.nio.MappedByteBuffer;
! import java.nio.channels.FileChannel;
! import java.nio.channels.FileLock;
! import java.nio.channels.ReadableByteChannel;
! import java.nio.channels.SeekableByteChannel;
! import java.nio.channels.WritableByteChannel;
import java.nio.file.*;
! import java.nio.file.attribute.FileAttribute;
! import java.nio.file.attribute.FileTime;
! import java.nio.file.attribute.UserPrincipalLookupService;
! import java.nio.file.spi.FileSystemProvider;
import java.security.AccessController;
import java.security.PrivilegedAction;
import java.security.PrivilegedActionException;
import java.security.PrivilegedExceptionAction;
! import java.util.ArrayList;
! import java.util.Arrays;
! import java.util.Collections;
! import java.util.Formatter;
! import java.util.HashSet;
! import java.util.Iterator;
! import java.util.LinkedHashMap;
! import java.util.List;
! import java.util.Map;
! import java.util.Objects;
! import java.util.Set;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
import java.util.regex.Pattern;
import java.util.zip.CRC32;
import java.util.zip.Deflater;
import java.util.zip.DeflaterOutputStream;
+ import java.util.zip.Inflater;
+ import java.util.zip.InflaterInputStream;
import java.util.zip.ZipException;
/**
* A FileSystem built on a zip file
*
* @author Xueming Shen
*/
class ZipFileSystem extends FileSystem {
private final ZipFileSystemProvider provider;
private final Path zfpath;
final ZipCoder zc;
private final ZipPath rootdir;
private boolean readOnly = false; // readonly file system
*** 77,95 ****
// configurable by env map
private final boolean noExtt; // see readExtra()
private final boolean useTempFile; // use a temp file for newOS, default
// is to use BAOS for better performance
private static final boolean isWindows = AccessController.doPrivileged(
! (PrivilegedAction<Boolean>) () -> System.getProperty("os.name")
! .startsWith("Windows"));
private final boolean forceEnd64;
private final int defaultMethod; // METHOD_STORED if "noCompression=true"
// METHOD_DEFLATED otherwise
ZipFileSystem(ZipFileSystemProvider provider,
Path zfpath,
! Map<String, ?> env) throws IOException
{
// default encoding for name/comment
String nameEncoding = env.containsKey("encoding") ?
(String)env.get("encoding") : "UTF-8";
this.noExtt = "false".equals(env.get("zipinfo-time"));
--- 91,109 ----
// configurable by env map
private final boolean noExtt; // see readExtra()
private final boolean useTempFile; // use a temp file for newOS, default
// is to use BAOS for better performance
private static final boolean isWindows = AccessController.doPrivileged(
! (PrivilegedAction<Boolean>)() -> System.getProperty("os.name")
! .startsWith("Windows"));
private final boolean forceEnd64;
private final int defaultMethod; // METHOD_STORED if "noCompression=true"
// METHOD_DEFLATED otherwise
ZipFileSystem(ZipFileSystemProvider provider,
Path zfpath,
! Map<String, ?> env) throws IOException
{
// default encoding for name/comment
String nameEncoding = env.containsKey("encoding") ?
(String)env.get("encoding") : "UTF-8";
this.noExtt = "false".equals(env.get("zipinfo-time"));
*** 267,282 ****
} finally {
endWrite();
}
if (!streams.isEmpty()) { // unlock and close all remaining streams
Set<InputStream> copy = new HashSet<>(streams);
! for (InputStream is: copy)
is.close();
}
beginWrite(); // lock and sync
try {
! AccessController.doPrivileged((PrivilegedExceptionAction<Void>) () -> {
sync(); return null;
});
ch.close(); // close the ch just in case no update
// and sync didn't close the ch
} catch (PrivilegedActionException e) {
--- 281,296 ----
} finally {
endWrite();
}
if (!streams.isEmpty()) { // unlock and close all remaining streams
Set<InputStream> copy = new HashSet<>(streams);
! for (InputStream is : copy)
is.close();
}
beginWrite(); // lock and sync
try {
! AccessController.doPrivileged((PrivilegedExceptionAction<Void>)() -> {
sync(); return null;
});
ch.close(); // close the ch just in case no update
// and sync didn't close the ch
} catch (PrivilegedActionException e) {
*** 294,304 ****
def.end();
}
IOException ioe = null;
synchronized (tmppaths) {
! for (Path p: tmppaths) {
try {
AccessController.doPrivileged(
(PrivilegedExceptionAction<Boolean>)() -> Files.deleteIfExists(p));
} catch (PrivilegedActionException e) {
IOException x = (IOException)e.getException();
--- 308,318 ----
def.end();
}
IOException ioe = null;
synchronized (tmppaths) {
! for (Path p : tmppaths) {
try {
AccessController.doPrivileged(
(PrivilegedExceptionAction<Boolean>)() -> Files.deleteIfExists(p));
} catch (PrivilegedActionException e) {
IOException x = (IOException)e.getException();
*** 519,529 ****
checkWritable();
boolean hasCreateNew = false;
boolean hasCreate = false;
boolean hasAppend = false;
boolean hasTruncate = false;
! for (OpenOption opt: options) {
if (opt == READ)
throw new IllegalArgumentException("READ not allowed");
if (opt == CREATE_NEW)
hasCreateNew = true;
if (opt == CREATE)
--- 533,543 ----
checkWritable();
boolean hasCreateNew = false;
boolean hasCreate = false;
boolean hasAppend = false;
boolean hasTruncate = false;
! for (OpenOption opt : options) {
if (opt == READ)
throw new IllegalArgumentException("READ not allowed");
if (opt == CREATE_NEW)
hasCreateNew = true;
if (opt == CREATE)
*** 1475,1485 ****
// FILECH result is un-compressed.
eis = Files.newInputStream(e.file);
// TBD: wrap to hook close()
// streams.add(eis);
return eis;
! } else { // untouced CEN or COPY
eis = new EntryInputStream(e, ch);
}
if (e.method == METHOD_DEFLATED) {
// MORE: Compute good size for inflater stream:
long bufSize = e.size + 2; // Inflater likes a bit of slack
--- 1489,1499 ----
// FILECH result is un-compressed.
eis = Files.newInputStream(e.file);
// TBD: wrap to hook close()
// streams.add(eis);
return eis;
! } else { // untouched CEN or COPY
eis = new EntryInputStream(e, ch);
}
if (e.method == METHOD_DEFLATED) {
// MORE: Compute good size for inflater stream:
long bufSize = e.size + 2; // Inflater likes a bit of slack
*** 1537,1554 ****
private class EntryInputStream extends InputStream {
private final SeekableByteChannel zfch; // local ref to zipfs's "ch". zipfs.ch might
// point to a new channel after sync()
private long pos; // current position within entry data
protected long rem; // number of remaining bytes within entry
- protected final long size; // uncompressed size of this entry
EntryInputStream(Entry e, SeekableByteChannel zfch)
throws IOException
{
this.zfch = zfch;
rem = e.csize;
- size = e.size;
pos = e.locoff;
if (pos == -1) {
Entry e2 = getEntry(e.name);
if (e2 == null) {
throw new ZipException("invalid loc for entry <" + e.name + ">");
--- 1551,1566 ----
*** 1611,1624 ****
public int available() {
return rem > Integer.MAX_VALUE ? Integer.MAX_VALUE : (int) rem;
}
- public long size() {
- return size;
- }
-
public void close() {
rem = 0;
streams.remove(this);
}
--- 1623,1632 ----
*** 1670,1680 ****
}
// List of available Deflater objects for compression
private final List<Deflater> deflaters = new ArrayList<>();
! // Gets an deflater from the list of available deflaters or allocates
// a new one.
private Deflater getDeflater() {
synchronized (deflaters) {
int size = deflaters.size();
if (size > 0) {
--- 1678,1688 ----
}
// List of available Deflater objects for compression
private final List<Deflater> deflaters = new ArrayList<>();
! // Gets a deflater from the list of available deflaters or allocates
// a new one.
private Deflater getDeflater() {
synchronized (deflaters) {
int size = deflaters.size();
if (size > 0) {
*** 1684,1705 ****
return new Deflater(Deflater.DEFAULT_COMPRESSION, true);
}
}
}
- // Releases the specified inflater to the list of available inflaters.
- private void releaseDeflater(Deflater def) {
- synchronized (deflaters) {
- if (inflaters.size() < MAX_FLATER) {
- def.reset();
- deflaters.add(def);
- } else {
- def.end();
- }
- }
- }
-
// End of central directory record
static class END {
// these 2 fields are not used by anyone and write() uses "0"
// int disknum;
// int sdisknum;
--- 1692,1701 ----
*** 1983,1995 ****
comment = Arrays.copyOfRange(cen, pos, pos + clen);
}
return this;
}
! int writeCEN(OutputStream os) throws IOException
! {
! int written = CENHDR;
int version0 = version();
long csize0 = csize;
long size0 = size;
long locoff0 = locoff;
int elen64 = 0; // extra for ZIP64
--- 1979,1989 ----
comment = Arrays.copyOfRange(cen, pos, pos + clen);
}
return this;
}
! int writeCEN(OutputStream os) throws IOException {
int version0 = version();
long csize0 = csize;
long size0 = size;
long locoff0 = locoff;
int elen64 = 0; // extra for ZIP64
*** 2100,2111 ****
///////////////////// LOC //////////////////////
int writeLOC(OutputStream os) throws IOException {
writeInt(os, LOCSIG); // LOC header signature
- int version = version();
-
byte[] zname = isdir ? toDirectoryPath(name) : name;
int nlen = (zname != null) ? zname.length - 1 : 0; // [0] is slash
int elen = (extra != null) ? extra.length : 0;
boolean foundExtraTime = false; // if extra timestamp present
int eoff = 0;
--- 2094,2103 ----
*** 2428,2438 ****
// directory entry
// (2) all entries are not stored/organized in a "tree"
// structure.
// A possible solution is to build the node tree ourself as
// implemented below.
- private IndexNode root;
// default time stamp for pseudo entries
private long zfsDefaultTimeStamp = System.currentTimeMillis();
private void removeFromTree(IndexNode inode) {
--- 2420,2429 ----
< prev index next >