1 /*
   2  * Copyright (c) 2009, 2012, 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 /*
  33  * This source code is provided to illustrate the usage of a given feature
  34  * or technique and has been deliberately simplified. Additional steps
  35  * required for a production-quality application, such as security checks,
  36  * input validation and proper error handling, might not be present in
  37  * this sample code.
  38  */
  39 
  40 
  41 package com.sun.nio.zipfs;
  42 
  43 import java.io.IOException;
  44 import java.nio.file.Files;
  45 import java.nio.file.FileStore;
  46 import java.nio.file.FileSystems;
  47 import java.nio.file.Path;
  48 import java.nio.file.attribute.BasicFileAttributes;
  49 import java.nio.file.attribute.FileAttributeView;
  50 import java.nio.file.attribute.FileStoreAttributeView;
  51 import java.nio.file.attribute.BasicFileAttributeView;
  52 import java.util.Formatter;
  53 
  54 /*
  55  *
  56  * @author  Xueming Shen, Rajendra Gutupalli, Jaya Hangal
  57  */
  58 
  59 public class ZipFileStore extends FileStore {
  60 
  61     private final ZipFileSystem zfs;
  62 
  63     ZipFileStore(ZipPath zpath) {
  64         this.zfs = zpath.getFileSystem();
  65     }
  66 
  67     @Override
  68     public String name() {
  69         return zfs.toString() + "/";
  70     }
  71 
  72     @Override
  73     public String type() {
  74         return "zipfs";
  75     }
  76 
  77     @Override
  78     public boolean isReadOnly() {
  79         return zfs.isReadOnly();
  80     }
  81 
  82     @Override
  83     public boolean supportsFileAttributeView(Class<? extends FileAttributeView> type) {
  84         return (type == BasicFileAttributeView.class ||
  85                 type == ZipFileAttributeView.class);
  86     }
  87 
  88     @Override
  89     public boolean supportsFileAttributeView(String name) {
  90         return name.equals("basic") || name.equals("zip");
  91     }
  92 
  93     @Override
  94     @SuppressWarnings("unchecked")
  95     public <V extends FileStoreAttributeView> V getFileStoreAttributeView(Class<V> type) {
  96         if (type == null)
  97             throw new NullPointerException();
  98         return (V)null;
  99     }
 100 
 101     @Override
 102     public long getTotalSpace() throws IOException {
 103          return new ZipFileStoreAttributes(this).totalSpace();
 104     }
 105 
 106     @Override
 107     public long getUsableSpace() throws IOException {
 108          return new ZipFileStoreAttributes(this).usableSpace();
 109     }
 110 
 111     @Override
 112     public long getUnallocatedSpace() throws IOException {
 113          return new ZipFileStoreAttributes(this).unallocatedSpace();
 114     }
 115 
 116     @Override
 117     public Object getAttribute(String attribute) throws IOException {
 118          if (attribute.equals("totalSpace"))
 119                return getTotalSpace();
 120          if (attribute.equals("usableSpace"))
 121                return getUsableSpace();
 122          if (attribute.equals("unallocatedSpace"))
 123                return getUnallocatedSpace();
 124          throw new UnsupportedOperationException("does not support the given attribute");
 125     }
 126 
 127     private static class ZipFileStoreAttributes {
 128         final FileStore fstore;
 129         final long size;
 130 
 131         public ZipFileStoreAttributes(ZipFileStore fileStore)
 132             throws IOException
 133         {
 134             Path path = FileSystems.getDefault().getPath(fileStore.name());
 135             this.size = Files.size(path);
 136             this.fstore = Files.getFileStore(path);
 137         }
 138 
 139         public long totalSpace() {
 140             return size;
 141         }
 142 
 143         public long usableSpace() throws IOException {
 144             if (!fstore.isReadOnly())
 145                 return fstore.getUsableSpace();
 146             return 0;
 147         }
 148 
 149         public long unallocatedSpace()  throws IOException {
 150             if (!fstore.isReadOnly())
 151                 return fstore.getUnallocatedSpace();
 152             return 0;
 153         }
 154     }
 155 }