1 /*
   2  * Copyright (c) 2009, 2011, 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 
  42 package com.sun.nio.zipfs;
  43 
  44 import java.nio.file.attribute.BasicFileAttributes;
  45 import java.nio.file.attribute.FileTime;
  46 import java.util.Arrays;
  47 import java.util.Formatter;
  48 import static com.sun.nio.zipfs.ZipUtils.*;
  49 
  50 /**
  51  *
  52  * @author  Xueming Shen, Rajendra Gutupalli,Jaya Hangal
  53  */
  54 
  55 public class ZipFileAttributes implements BasicFileAttributes
  56 
  57 {
  58     private final ZipFileSystem.Entry e;
  59 
  60     ZipFileAttributes(ZipFileSystem.Entry e) {
  61         this.e = e;
  62     }
  63 
  64     ///////// basic attributes ///////////
  65     @Override
  66     public FileTime creationTime() {
  67         if (e.ctime != -1)
  68             return FileTime.fromMillis(e.ctime);
  69         return null;
  70     }
  71 
  72     @Override
  73     public boolean isDirectory() {
  74         return e.isDir();
  75     }
  76 
  77     @Override
  78     public boolean isOther() {
  79         return false;
  80     }
  81 
  82     @Override
  83     public boolean isRegularFile() {
  84         return !e.isDir();
  85     }
  86 
  87     @Override
  88     public FileTime lastAccessTime() {
  89         if (e.atime != -1)
  90             return FileTime.fromMillis(e.atime);
  91         return null;
  92     }
  93 
  94     @Override
  95     public FileTime lastModifiedTime() {
  96         return FileTime.fromMillis(e.mtime);
  97     }
  98 
  99     @Override
 100     public long size() {
 101         return e.size;
 102     }
 103 
 104     @Override
 105     public boolean isSymbolicLink() {
 106         return false;
 107     }
 108 
 109     @Override
 110     public Object fileKey() {
 111         return null;
 112     }
 113 
 114     ///////// zip entry attributes ///////////
 115     public long compressedSize() {
 116         return e.csize;
 117     }
 118 
 119     public long crc() {
 120         return e.crc;
 121     }
 122 
 123     public int method() {
 124         return e.method;
 125     }
 126 
 127     public byte[] extra() {
 128         if (e.extra != null)
 129             return Arrays.copyOf(e.extra, e.extra.length);
 130         return null;
 131     }
 132 
 133     public byte[] comment() {
 134         if (e.comment != null)
 135             return Arrays.copyOf(e.comment, e.comment.length);
 136         return null;
 137     }
 138 
 139     public String toString() {
 140         StringBuilder sb = new StringBuilder(1024);
 141         Formatter fm = new Formatter(sb);
 142         if (creationTime() != null)
 143             fm.format("    creationTime    : %tc%n", creationTime().toMillis());
 144         else
 145             fm.format("    creationTime    : null%n");
 146 
 147         if (lastAccessTime() != null)
 148             fm.format("    lastAccessTime  : %tc%n", lastAccessTime().toMillis());
 149         else
 150             fm.format("    lastAccessTime  : null%n");
 151         fm.format("    lastModifiedTime: %tc%n", lastModifiedTime().toMillis());
 152         fm.format("    isRegularFile   : %b%n", isRegularFile());
 153         fm.format("    isDirectory     : %b%n", isDirectory());
 154         fm.format("    isSymbolicLink  : %b%n", isSymbolicLink());
 155         fm.format("    isOther         : %b%n", isOther());
 156         fm.format("    fileKey         : %s%n", fileKey());
 157         fm.format("    size            : %d%n", size());
 158         fm.format("    compressedSize  : %d%n", compressedSize());
 159         fm.format("    crc             : %x%n", crc());
 160         fm.format("    method          : %d%n", method());
 161         fm.close();
 162         return sb.toString();
 163     }
 164 }