/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.apache.hadoop.nfs.nfs3;


/**
 * Some constants for NFSv3
 */
public class Nfs3Constant {
  // The local rpcbind/portmapper port.
  public final static int SUN_RPCBIND = 111;

  // The RPC program number for NFS.
  public final static int PROGRAM = 100003;

  // The program version number that this server implements.
  public final static int VERSION = 3;
  
  // The procedures
  public static enum NFSPROC3 {
    // the order of the values below are significant.
    NULL,
    GETATTR,
    SETATTR,
    LOOKUP,
    ACCESS,
    READLINK,
    READ,
    WRITE,
    CREATE(false),
    MKDIR(false),
    SYMLINK(false),
    MKNOD(false),
    REMOVE(false),
    RMDIR(false),
    RENAME(false),
    LINK(false),
    READDIR,
    READDIRPLUS,
    FSSTAT,
    FSINFO,
    PATHCONF,
    COMMIT;

    private final boolean isIdempotent;

    private NFSPROC3(boolean isIdempotent) {
      this.isIdempotent = isIdempotent;
    }

    private NFSPROC3() {
      this(true);
    }

    public boolean isIdempotent() {
      return isIdempotent;
    }

    /** @return the int value representing the procedure. */
    public int getValue() {
      return ordinal();
    }

    /**
     * Convert to NFS procedure.
     * @param value specify the index of NFS procedure
     * @return the procedure corresponding to the value.
     */
    public static NFSPROC3 fromValue(int value) {
      if (value < 0 || value >= values().length) {
        return null;
      }
      return values()[value];
    }
  }
  
  // The maximum size in bytes of the opaque file handle.
  public final static int NFS3_FHSIZE = 64;

  // The byte size of cookie verifier passed by READDIR and READDIRPLUS.
  public final static int NFS3_COOKIEVERFSIZE = 8;

  // The size in bytes of the opaque verifier used for exclusive CREATE.
  public final static int NFS3_CREATEVERFSIZE = 8;

  // The size in bytes of the opaque verifier used for asynchronous WRITE.
  public final static int NFS3_WRITEVERFSIZE = 8;

  /** Access call request mode */
  // File access mode
  public static final int ACCESS_MODE_READ = 0x04;
  public static final int ACCESS_MODE_WRITE = 0x02;
  public static final int ACCESS_MODE_EXECUTE = 0x01;

  /** Access call response rights */
  // Read data from file or read a directory.
  public final static int ACCESS3_READ = 0x0001;
  // Look up a name in a directory (no meaning for non-directory objects).
  public final static int ACCESS3_LOOKUP = 0x0002;
  // Rewrite existing file data or modify existing directory entries.
  public final static int ACCESS3_MODIFY = 0x0004;
  // Write new data or add directory entries.
  public final static int ACCESS3_EXTEND = 0x0008;
  // Delete an existing directory entry.
  public final static int ACCESS3_DELETE = 0x0010;
  // Execute file (no meaning for a directory).
  public final static int ACCESS3_EXECUTE = 0x0020;

  /** File and directory attribute mode bits */
  // Set user ID on execution.
  public final static int MODE_S_ISUID = 0x00800;
  // Set group ID on execution.
  public final static int MODE_S_ISGID = 0x00400;
  // Save swapped text (not defined in POSIX).
  public final static int MODE_S_ISVTX = 0x00200;
  // Read permission for owner.
  public final static int MODE_S_IRUSR = 0x00100;
  // Write permission for owner.
  public final static int MODE_S_IWUSR = 0x00080;
  // Execute permission for owner on a file. Or lookup (search) permission for
  // owner in directory.
  public final static int MODE_S_IXUSR = 0x00040;
  // Read permission for group.
  public final static int MODE_S_IRGRP = 0x00020;
  // Write permission for group.
  public final static int MODE_S_IWGRP = 0x00010;
  // Execute permission for group on a file. Or lookup (search) permission for
  // group in directory.
  public final static int MODE_S_IXGRP = 0x00008;
  // Read permission for others.
  public final static int MODE_S_IROTH = 0x00004;
  // Write permission for others.
  public final static int MODE_S_IWOTH = 0x00002;
  // Execute permission for others on a file. Or lookup (search) permission for
  // others in directory.
  public final static int MODE_S_IXOTH = 0x00001;

  public final static int MODE_ALL = MODE_S_ISUID | MODE_S_ISGID | MODE_S_ISVTX
      | MODE_S_ISVTX | MODE_S_IRUSR | MODE_S_IRUSR | MODE_S_IWUSR
      | MODE_S_IXUSR | MODE_S_IRGRP | MODE_S_IWGRP | MODE_S_IXGRP
      | MODE_S_IROTH | MODE_S_IWOTH | MODE_S_IXOTH;

  /** Write call flavors */
  public enum WriteStableHow {
    // the order of the values below are significant.
    UNSTABLE,
    DATA_SYNC,
    FILE_SYNC;

    public int getValue() {
      return ordinal();
    }

    public static WriteStableHow fromValue(int id) {
      return values()[id];
    }
  }

  /**
   * This is a cookie that the client can use to determine whether the server
   * has changed state between a call to WRITE and a subsequent call to either
   * WRITE or COMMIT. This cookie must be consistent during a single instance of
   * the NFS version 3 protocol service and must be unique between instances of
   * the NFS version 3 protocol server, where uncommitted data may be lost.
   */
  public final static long WRITE_COMMIT_VERF = System.currentTimeMillis();
  
  /** FileSystemProperties */
  public final static int FSF3_LINK = 0x0001;
  public final static int FSF3_SYMLINK = 0x0002;
  public final static int FSF3_HOMOGENEOUS = 0x0008;
  public final static int FSF3_CANSETTIME = 0x0010;

  /** Create options */
  public final static int CREATE_UNCHECKED = 0;
  public final static int CREATE_GUARDED = 1;
  public final static int CREATE_EXCLUSIVE = 2;
  
  /** Size for nfs exports cache */
  public static final String NFS_EXPORTS_CACHE_SIZE_KEY = "nfs.exports.cache.size";
  public static final int NFS_EXPORTS_CACHE_SIZE_DEFAULT = 512;
  /** Expiration time for nfs exports cache entry */
  public static final String NFS_EXPORTS_CACHE_EXPIRYTIME_MILLIS_KEY = "nfs.exports.cache.expirytime.millis";
  public static final long NFS_EXPORTS_CACHE_EXPIRYTIME_MILLIS_DEFAULT = 15 * 60 * 1000; // 15 min
}
