1 /*
   2  * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
   3  *
   4  * Redistribution and use in source and binary forms, with or without
   5  * modification, are permitted provided that the following conditions
   6  * are met:
   7  *
   8  *   - Redistributions of source code must retain the above copyright
   9  *     notice, this list of conditions and the following disclaimer.
  10  *
  11  *   - Redistributions in binary form must reproduce the above copyright
  12  *     notice, this list of conditions and the following disclaimer in the
  13  *     documentation and/or other materials provided with the distribution.
  14  *
  15  *   - Neither the name of Oracle nor the names of its
  16  *     contributors may be used to endorse or promote products derived
  17  *     from this software without specific prior written permission.
  18  *
  19  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
  20  * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
  21  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
  22  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
  23  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
  24  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
  25  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
  26  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
  27  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
  28  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
  29  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  30  */
  31 
  32 package com.sun.nio.zipfs;
  33 
  34 import java.io.IOException;
  35 import java.nio.file.Files;
  36 import java.nio.file.FileStore;
  37 import java.nio.file.FileSystems;
  38 import java.nio.file.Path;
  39 import java.nio.file.attribute.BasicFileAttributes;
  40 import java.nio.file.attribute.FileAttributeView;
  41 import java.nio.file.attribute.FileStoreAttributeView;
  42 import java.nio.file.attribute.BasicFileAttributeView;
  43 import java.util.Formatter;
  44 
  45 /*
  46  *
  47  * @author  Xueming Shen, Rajendra Gutupalli, Jaya Hangal
  48  */
  49 
  50 public class ZipFileStore extends FileStore {
  51 
  52     private final ZipFileSystem zfs;
  53 
  54     ZipFileStore(ZipPath zpath) {
  55         this.zfs = (ZipFileSystem)zpath.getFileSystem();
  56     }
  57 
  58     @Override
  59     public String name() {
  60         return zfs.toString() + "/";
  61     }
  62 
  63     @Override
  64     public String type() {
  65         return "zipfs";
  66     }
  67 
  68     @Override
  69     public boolean isReadOnly() {
  70         return zfs.isReadOnly();
  71     }
  72 
  73     @Override
  74     public boolean supportsFileAttributeView(Class<? extends FileAttributeView> type) {
  75         return (type == BasicFileAttributeView.class ||
  76                 type == ZipFileAttributeView.class);
  77     }
  78 
  79     @Override
  80     public boolean supportsFileAttributeView(String name) {
  81         return name.equals("basic") || name.equals("zip");
  82     }
  83 
  84     @Override
  85     @SuppressWarnings("unchecked")
  86     public <V extends FileStoreAttributeView> V getFileStoreAttributeView(Class<V> type) {
  87         if (type == null)
  88             throw new NullPointerException();
  89         return (V)null;
  90     }
  91 
  92     @Override
  93     public long getTotalSpace() throws IOException {
  94          return new ZipFileStoreAttributes(this).totalSpace();
  95     }
  96 
  97     @Override
  98     public long getUsableSpace() throws IOException {
  99          return new ZipFileStoreAttributes(this).usableSpace();
 100     }
 101 
 102     @Override
 103     public long getUnallocatedSpace() throws IOException {
 104          return new ZipFileStoreAttributes(this).unallocatedSpace();
 105     }
 106 
 107     @Override
 108     public Object getAttribute(String attribute) throws IOException {
 109          if (attribute.equals("totalSpace"))
 110                return getTotalSpace();
 111          if (attribute.equals("usableSpace"))
 112                return getUsableSpace();
 113          if (attribute.equals("unallocatedSpace"))
 114                return getUnallocatedSpace();
 115          throw new UnsupportedOperationException("does not support the given attribute");
 116     }
 117 
 118     private static class ZipFileStoreAttributes {
 119         final FileStore fstore;
 120         final long size;
 121 
 122         public ZipFileStoreAttributes(ZipFileStore fileStore)
 123             throws IOException
 124         {
 125             Path path = FileSystems.getDefault().getPath(fileStore.name());
 126             this.size = Files.size(path);
 127             this.fstore = Files.getFileStore(path);
 128         }
 129 
 130         public long totalSpace() {
 131             return size;
 132         }
 133 
 134         public long usableSpace() throws IOException {
 135             if (!fstore.isReadOnly())
 136                 return fstore.getUsableSpace();
 137             return 0;
 138         }
 139 
 140         public long unallocatedSpace()  throws IOException {
 141             if (!fstore.isReadOnly())
 142                 return fstore.getUnallocatedSpace();
 143             return 0;
 144         }
 145     }
 146 }