/**
  * Sets pin state for the input path.
  *
  * @param fs The {@link FileSystem} client
  * @param path The {@link AlluxioURI} path as the input of the command
  * @param pinned the state to be set
  * @throws IOException if a non-Alluxio related exception occurs
  */
 public static void setPinned(FileSystem fs, AlluxioURI path, boolean pinned) throws IOException {
   try {
     SetAttributeOptions options = SetAttributeOptions.defaults().setPinned(pinned);
     fs.setAttribute(path, options);
   } catch (AlluxioException e) {
     throw new IOException(e.getMessage());
   }
 }
 /**
  * Sets a new TTL value or unsets an existing TTL value for file at path.
  *
  * @param fs the file system for Alluxio
  * @param path the file path
  * @param ttlMs the TTL (time to live) value to use; it identifies duration (in milliseconds) the
  *     created file should be kept around before it is automatically deleted, irrespective of
  *     whether the file is pinned; {@link Constants#NO_TTL} means to unset the TTL value
  * @throws IOException when failing to set/unset the TTL
  */
 public static void setTtl(FileSystem fs, AlluxioURI path, long ttlMs) throws IOException {
   try {
     SetAttributeOptions options = SetAttributeOptions.defaults().setTtl(ttlMs);
     fs.setAttribute(path, options);
   } catch (AlluxioException e) {
     throw new IOException(e.getMessage());
   }
 }
 /**
  * Changes permission of a path.
  *
  * @param path path to set permission
  * @param permission permission set to path
  * @throws IOException if the path failed to be changed permission
  */
 @Override
 public void setPermission(Path path, FsPermission permission) throws IOException {
   LOG.info("setMode({},{})", path, permission.toString());
   AlluxioURI uri = new AlluxioURI(HadoopUtils.getPathWithoutScheme(path));
   SetAttributeOptions options =
       SetAttributeOptions.defaults().setMode(new Mode(permission.toShort())).setRecursive(false);
   try {
     mFileSystem.setAttribute(uri, options);
   } catch (AlluxioException e) {
     throw new IOException(e);
   }
 }
 /**
  * Changes owner or group of a path (i.e. a file or a directory). If username is null, the
  * original username remains unchanged. Same as groupname. If username and groupname are non-null,
  * both of them will be changed.
  *
  * @param path path to set owner or group
  * @param username username to be set
  * @param groupname groupname to be set
  * @throws IOException if changing owner or group of the path failed
  */
 @Override
 public void setOwner(Path path, final String username, final String groupname)
     throws IOException {
   LOG.info("setOwner({},{},{})", path, username, groupname);
   AlluxioURI uri = new AlluxioURI(HadoopUtils.getPathWithoutScheme(path));
   SetAttributeOptions options = SetAttributeOptions.defaults();
   boolean ownerOrGroupChanged = false;
   if (username != null && !username.isEmpty()) {
     options.setOwner(username).setRecursive(false);
     ownerOrGroupChanged = true;
   }
   if (groupname != null && !groupname.isEmpty()) {
     options.setGroup(groupname).setRecursive(false);
     ownerOrGroupChanged = true;
   }
   if (ownerOrGroupChanged) {
     try {
       mFileSystem.setAttribute(uri, options);
     } catch (AlluxioException e) {
       throw new IOException(e);
     }
   }
 }