content: /*
   * 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
   * particular file as subject to the "Classpath" exception as provided
   * by Oracle in the LICENSE file that accompanied this code.
   *
   * This code is distributed in the hope that it will be useful, but WITHOUT
   * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
   * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
   * version 2 for more details (a copy is included in the LICENSE file that
   * accompanied this code).
   *
   * You should have received a copy of the GNU General Public License version
   * 2 along with this work; if not, write to the Free Software Foundation,
   * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
   *
   * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
   * or visit www.oracle.com if you need additional information or have any
   * questions.
   */
  
  package com.itsaky.androidide.zipfs2;
  
  import java.io.IOException;
  import java.nio.file.attribute.BasicFileAttributeView;
  import java.nio.file.attribute.FileAttributeView;
  import java.nio.file.attribute.FileTime;
  import java.util.LinkedHashMap;
  import java.util.Map;
  
  /**
   * @author Xueming Shen, Rajendra Gutupalli, Jaya Hangal
   */
  public class ZipFileAttributeView implements BasicFileAttributeView {
      private static enum AttrID {
          size,
          creationTime,
          lastAccessTime,
          lastModifiedTime,
          isDirectory,
          isRegularFile,
          isSymbolicLink,
          isOther,
          fileKey,
          compressedSize,
          crc,
          method
      };
  
      private final ZipPath path;
      private final boolean isZipView;
  
      private ZipFileAttributeView(ZipPath path, boolean isZipView) {
          this.path = path;
          this.isZipView = isZipView;
      }
  
      @SuppressWarnings("unchecked") // Cast to V
      static <V extends FileAttributeView> V get(ZipPath path, Class<V> type) {
          if (type == null)
              throw new NullPointerException();
          if (type == BasicFileAttributeView.class)
              return (V)new ZipFileAttributeView(path, false);
          if (type == ZipFileAttributeView.class)
              return (V)new ZipFileAttributeView(path, true);
          return null;
      }
  
      static ZipFileAttributeView get(ZipPath path, String type) {
          if (type == null)
              throw new NullPointerException();
          if (type.equals("basic"))
              return new ZipFileAttributeView(path, false);
          if (type.equals("zip"))
              return new ZipFileAttributeView(path, true);
          return null;
      }
  
      @Override
      public String name() {
          return isZipView ? "zip" : "basic";
      }
  
      public ZipFileAttributes readAttributes() throws IOException {
          return path.getAttributes();
      }
  
      @Override
      public void setTimes(FileTime lastModifiedTime,
                           FileTime lastAccessTime,
                           FileTime createTime)
          throws IOException
      {
          path.setTimes(lastModifiedTime, lastAccessTime, createTime);
      }
  
      void setAttribute(String attribute, Object value)
          throws IOException
      {
          try {
              if (AttrID.valueOf(attribute) == AttrID.lastModifiedTime)
                  setTimes((FileTime)value, null, null);
              if (AttrID.valueOf(attribute) == AttrID.lastAccessTime)
                  setTimes(null, (FileTime)value, null);
              if (AttrID.valueOf(attribute) == AttrID.creationTime)
                  setTimes(null, null, (FileTime)value);
              return;
          } catch (IllegalArgumentException x) {}
          throw new UnsupportedOperationException("'" + attribute +
              "' is unknown or read-only attribute");
      }
  
      Map<String, Object> readAttributes(String attributes)
          throws IOException
      {
          ZipFileAttributes zfas = readAttributes();
          LinkedHashMap<String, Object> map = new LinkedHashMap<>();
          if ("*".equals(attributes)) {
              for (AttrID id : AttrID.values()) {
                  try {
                      map.put(id.name(), attribute(id, zfas));
                  } catch (IllegalArgumentException x) {}
              }
          } else {
              String[] as = attributes.split(",");
              for (String a : as) {
                  try {
                      map.put(a, attribute(AttrID.valueOf(a), zfas));
                  } catch (IllegalArgumentException x) {}
              }
          }
          return map;
      }
  
      Object attribute(AttrID id, ZipFileAttributes zfas) {
          switch (id) {
          case size:
              return zfas.size();
          case creationTime:
              return zfas.creationTime();
          case lastAccessTime:
              return zfas.lastAccessTime();
          case lastModifiedTime:
              return zfas.lastModifiedTime();
          case isDirectory:
              return zfas.isDirectory();
          case isRegularFile:
              return zfas.isRegularFile();
          case isSymbolicLink:
              return zfas.isSymbolicLink();
          case isOther:
              return zfas.isOther();
          case fileKey:
              return zfas.fileKey();
          case compressedSize:
              if (isZipView)
                  return zfas.compressedSize();
              break;
          case crc:
              if (isZipView)
                  return zfas.crc();
              break;
          case method:
              if (isZipView)
                  return zfas.method();
              break;
          }
          return null;
      }
  }
  