/** * 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.hdfs.server.namenode; import org.apache.hadoop.classification.InterfaceAudience; import org.apache.hadoop.fs.permission.FsPermission; import org.apache.hadoop.fs.permission.PermissionStatus; import org.apache.hadoop.hdfs.server.namenode.INodeWithAdditionalFields.PermissionStatusFormat; /** * The attributes of an inode. */ @InterfaceAudience.Private public interface INodeAttributes { /** * @return null if the local name is null; * otherwise, return the local name byte array. */ public byte[] getLocalNameBytes(); /** @return the user name. */ public String getUserName(); /** @return the group name. */ public String getGroupName(); /** @return the permission. */ public FsPermission getFsPermission(); /** @return the permission as a short. */ public short getFsPermissionShort(); /** @return the permission information as a long. */ public long getPermissionLong(); /** @return the ACL feature. */ public AclFeature getAclFeature(); /** @return the modification time. */ public long getModificationTime(); /** @return the access time. */ public long getAccessTime(); /** A read-only copy of the inode attributes. */ public static abstract class SnapshotCopy implements INodeAttributes { private final byte[] name; private final long permission; private final AclFeature aclFeature; private final long modificationTime; private final long accessTime; SnapshotCopy(byte[] name, PermissionStatus permissions, AclFeature aclFeature, long modificationTime, long accessTime) { this.name = name; this.permission = PermissionStatusFormat.toLong(permissions); this.aclFeature = aclFeature; this.modificationTime = modificationTime; this.accessTime = accessTime; } SnapshotCopy(INode inode) { this.name = inode.getLocalNameBytes(); this.permission = inode.getPermissionLong(); this.aclFeature = inode.getAclFeature(); this.modificationTime = inode.getModificationTime(); this.accessTime = inode.getAccessTime(); } @Override public final byte[] getLocalNameBytes() { return name; } @Override public final String getUserName() { final int n = (int)PermissionStatusFormat.USER.retrieve(permission); return SerialNumberManager.INSTANCE.getUser(n); } @Override public final String getGroupName() { final int n = (int)PermissionStatusFormat.GROUP.retrieve(permission); return SerialNumberManager.INSTANCE.getGroup(n); } @Override public final FsPermission getFsPermission() { return new FsPermission(getFsPermissionShort()); } @Override public final short getFsPermissionShort() { return (short)PermissionStatusFormat.MODE.retrieve(permission); } @Override public long getPermissionLong() { return permission; } @Override public AclFeature getAclFeature() { return aclFeature; } @Override public final long getModificationTime() { return modificationTime; } @Override public final long getAccessTime() { return accessTime; } } }