001/** 002 * Licensed to the Apache Software Foundation (ASF) under one 003 * or more contributor license agreements. See the NOTICE file 004 * distributed with this work for additional information 005 * regarding copyright ownership. The ASF licenses this file 006 * to you under the Apache License, Version 2.0 (the 007 * "License"); you may not use this file except in compliance 008 * with the License. You may obtain a copy of the License at 009 * 010 * http://www.apache.org/licenses/LICENSE-2.0 011 * 012 * Unless required by applicable law or agreed to in writing, software 013 * distributed under the License is distributed on an "AS IS" BASIS, 014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 015 * See the License for the specific language governing permissions and 016 * limitations under the License. 017 */ 018package org.apache.hadoop.fs.permission; 019 020import java.util.List; 021 022import org.apache.hadoop.classification.InterfaceAudience; 023import org.apache.hadoop.classification.InterfaceStability; 024 025import com.google.common.base.Objects; 026import com.google.common.collect.Lists; 027 028/** 029 * An AclStatus contains the ACL information of a specific file. AclStatus 030 * instances are immutable. Use a {@link Builder} to create a new instance. 031 */ 032@InterfaceAudience.Public 033@InterfaceStability.Evolving 034public class AclStatus { 035 private final String owner; 036 private final String group; 037 private final boolean stickyBit; 038 private final List<AclEntry> entries; 039 040 /** 041 * Returns the file owner. 042 * 043 * @return String file owner 044 */ 045 public String getOwner() { 046 return owner; 047 } 048 049 /** 050 * Returns the file group. 051 * 052 * @return String file group 053 */ 054 public String getGroup() { 055 return group; 056 } 057 058 /** 059 * Returns the sticky bit. 060 * 061 * @return boolean sticky bit 062 */ 063 public boolean isStickyBit() { 064 return stickyBit; 065 } 066 067 /** 068 * Returns the list of all ACL entries, ordered by their natural ordering. 069 * 070 * @return List<AclEntry> unmodifiable ordered list of all ACL entries 071 */ 072 public List<AclEntry> getEntries() { 073 return entries; 074 } 075 076 @Override 077 public boolean equals(Object o) { 078 if (o == null) { 079 return false; 080 } 081 if (getClass() != o.getClass()) { 082 return false; 083 } 084 AclStatus other = (AclStatus)o; 085 return Objects.equal(owner, other.owner) 086 && Objects.equal(group, other.group) 087 && stickyBit == other.stickyBit 088 && Objects.equal(entries, other.entries); 089 } 090 091 @Override 092 public int hashCode() { 093 return Objects.hashCode(owner, group, stickyBit, entries); 094 } 095 096 @Override 097 public String toString() { 098 return new StringBuilder() 099 .append("owner: ").append(owner) 100 .append(", group: ").append(group) 101 .append(", acl: {") 102 .append("entries: ").append(entries) 103 .append(", stickyBit: ").append(stickyBit) 104 .append('}') 105 .toString(); 106 } 107 108 /** 109 * Builder for creating new Acl instances. 110 */ 111 public static class Builder { 112 private String owner; 113 private String group; 114 private boolean stickyBit; 115 private List<AclEntry> entries = Lists.newArrayList(); 116 117 /** 118 * Sets the file owner. 119 * 120 * @param owner String file owner 121 * @return Builder this builder, for call chaining 122 */ 123 public Builder owner(String owner) { 124 this.owner = owner; 125 return this; 126 } 127 128 /** 129 * Sets the file group. 130 * 131 * @param group String file group 132 * @return Builder this builder, for call chaining 133 */ 134 public Builder group(String group) { 135 this.group = group; 136 return this; 137 } 138 139 /** 140 * Adds an ACL entry. 141 * 142 * @param e AclEntry entry to add 143 * @return Builder this builder, for call chaining 144 */ 145 public Builder addEntry(AclEntry e) { 146 this.entries.add(e); 147 return this; 148 } 149 150 /** 151 * Adds a list of ACL entries. 152 * 153 * @param entries AclEntry entries to add 154 * @return Builder this builder, for call chaining 155 */ 156 public Builder addEntries(Iterable<AclEntry> entries) { 157 for (AclEntry e : entries) 158 this.entries.add(e); 159 return this; 160 } 161 162 /** 163 * Sets sticky bit. If this method is not called, then the builder assumes 164 * false. 165 * 166 * @param stickyBit 167 * boolean sticky bit 168 * @return Builder this builder, for call chaining 169 */ 170 public Builder stickyBit(boolean stickyBit) { 171 this.stickyBit = stickyBit; 172 return this; 173 } 174 175 /** 176 * Builds a new AclStatus populated with the set properties. 177 * 178 * @return AclStatus new AclStatus 179 */ 180 public AclStatus build() { 181 return new AclStatus(owner, group, stickyBit, entries); 182 } 183 } 184 185 /** 186 * Private constructor. 187 * 188 * @param file Path file associated to this ACL 189 * @param owner String file owner 190 * @param group String file group 191 * @param stickyBit the sticky bit 192 * @param entries the ACL entries 193 */ 194 private AclStatus(String owner, String group, boolean stickyBit, 195 Iterable<AclEntry> entries) { 196 this.owner = owner; 197 this.group = group; 198 this.stickyBit = stickyBit; 199 this.entries = Lists.newArrayList(entries); 200 } 201}