View Javadoc
1   /*
2    * This file is part of Waarp Project (named also Waarp or GG).
3    *
4    *  Copyright (c) 2019, Waarp SAS, and individual contributors by the @author
5    *  tags. See the COPYRIGHT.txt in the distribution for a full listing of
6    * individual contributors.
7    *
8    *  All Waarp Project is free software: you can redistribute it and/or
9    * modify it under the terms of the GNU General Public License as published by
10   * the Free Software Foundation, either version 3 of the License, or (at your
11   * option) any later version.
12   *
13   * Waarp is distributed in the hope that it will be useful, but WITHOUT ANY
14   * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
15   * A PARTICULAR PURPOSE. See the GNU General Public License for more details.
16   *
17   *  You should have received a copy of the GNU General Public License along with
18   * Waarp . If not, see <http://www.gnu.org/licenses/>.
19   */
20  package org.waarp.common.role;
21  
22  /**
23   * Role to be used in Waarp projects
24   */
25  public class RoleDefault {
26    public enum ROLE {
27      /**
28       * No access to any function
29       */
30      NOACCESS(0),
31      /**
32       * Read only access, no action
33       */
34      READONLY(1),
35      /**
36       * Ability to starts transfer
37       */
38      TRANSFER(2),
39      /**
40       * Ability to control rules
41       */
42      RULE(4),
43      /**
44       * Ability to control hosts
45       */
46      HOST(8),
47      /**
48       * Ability to control bandwidth limitation
49       */
50      LIMIT(16),
51      /**
52       * Ability to control the system configuration and to control transfers
53       */
54      SYSTEM(32),
55      /**
56       * Ability to control the logging
57       */
58      LOGCONTROL(64),
59      /**
60       * Unused Role value
61       */
62      UNUSED(-128),
63      /**
64       * Default partner : ability to read and starts transfers
65       */
66      PARTNER(READONLY, TRANSFER),
67      /**
68       * Administrator on configuration (partner, rule, host)
69       */
70      CONFIGADMIN(PARTNER, RULE, HOST),
71      /**
72       * Administrator on all
73       */
74      FULLADMIN(CONFIGADMIN, LIMIT, SYSTEM, LOGCONTROL);
75  
76      private byte brole;
77  
78      ROLE(final int val) {
79        brole = (byte) val;
80      }
81  
82      ROLE(final ROLE... name) {
83        for (final ROLE role : name) {
84          this.brole |= role.brole;
85        }
86      }
87  
88      public final boolean isContained(final byte value) {
89        if (this == NOACCESS) {
90          return value == NOACCESS.brole;
91        }
92        return (value & brole) == brole;
93      }
94  
95      public final boolean isContained(final ROLE role) {
96        return isContained(role.brole);
97      }
98  
99      public final boolean contains(final ROLE role) {
100       return role.isContained(this);
101     }
102 
103     public final byte getAsByte() {
104       return brole;
105     }
106 
107     private static final ROLE[] READONLY_A = new ROLE[] { READONLY };
108     private static final ROLE[] TRANSFER_A = new ROLE[] { TRANSFER };
109     private static final ROLE[] RULE_A = new ROLE[] { RULE };
110     private static final ROLE[] HOST_A = new ROLE[] { HOST };
111     private static final ROLE[] LIMIT_A = new ROLE[] { LIMIT };
112     private static final ROLE[] SYSTEM_A = new ROLE[] { SYSTEM };
113     private static final ROLE[] LOGCONTROL_A = new ROLE[] { LOGCONTROL };
114     private static final ROLE[] UNUSED_A = new ROLE[] { UNUSED };
115     private static final ROLE[] NOACCESS_A = new ROLE[] { NOACCESS };
116     private static final ROLE[] PARTNER_A = new ROLE[] { READONLY, TRANSFER };
117     private static final ROLE[] CONFIGADMIN_A =
118         new ROLE[] { READONLY, TRANSFER, RULE, HOST };
119     private static final ROLE[] FULLADMIN_A =
120         new ROLE[] { READONLY, TRANSFER, RULE, LIMIT, SYSTEM, LOGCONTROL };
121 
122     public final ROLE[] getComposingRoles() {
123       switch (brole) {
124         case 1:
125           return READONLY_A;
126         case 2:
127           return TRANSFER_A;
128         case 3:
129           return PARTNER_A;
130         case 4:
131           return RULE_A;
132         case 8:
133           return HOST_A;
134         case 15:
135           return CONFIGADMIN_A;
136         case 16:
137           return LIMIT_A;
138         case 32:
139           return SYSTEM_A;
140         case 64:
141           return LOGCONTROL_A;
142         case 127:
143           return FULLADMIN_A;
144         case -128:
145           return UNUSED_A;
146         case 0:
147         default:
148           return NOACCESS_A;
149       }
150     }
151 
152     public static String toString(final byte fromRole) {
153       final StringBuilder result = new StringBuilder("[ ");
154       final ROLE[] values = ROLE.values();
155       for (final ROLE role : values) {
156         if (role.isContained(fromRole)) {
157           result.append(role.name()).append(' ');
158         }
159       }
160       result.append(']');
161       return result.toString();
162     }
163 
164     public static ROLE fromByte(final byte role) {
165       switch (role) {
166         case 1:
167           return READONLY;
168         case 2:
169           return TRANSFER;
170         case 3:
171           return PARTNER;
172         case 4:
173           return RULE;
174         case 8:
175           return HOST;
176         case 15:
177           return CONFIGADMIN;
178         case 16:
179           return LIMIT;
180         case 32:
181           return SYSTEM;
182         case 64:
183           return LOGCONTROL;
184         case 127:
185           return FULLADMIN;
186         case -128:
187           return UNUSED;
188         case 0:
189         default:
190           return NOACCESS;
191       }
192     }
193   }
194 
195   private byte role;
196 
197   public RoleDefault() {
198     role = ROLE.NOACCESS.brole;
199   }
200 
201   public RoleDefault(final ROLE role) {
202     this.role = role.brole;
203   }
204 
205   public final byte getRoleAsByte() {
206     return role;
207   }
208 
209   @Override
210   public String toString() {
211     return ROLE.toString(role);
212   }
213 
214   public final RoleDefault addRole(final ROLE newrole) {
215     role |= newrole.brole;
216     return this;
217   }
218 
219   public final RoleDefault setRole(final ROLE newrole) {
220     role = newrole.brole;
221     return this;
222   }
223 
224   public final RoleDefault setRoleDefault(final RoleDefault newrole) {
225     role = newrole.role;
226     return this;
227   }
228 
229   public final void clear() {
230     role = ROLE.NOACCESS.brole;
231   }
232 
233   public final boolean isContaining(final ROLE otherrole) {
234     return otherrole.isContained(role);
235   }
236 
237   public final boolean hasNoAccess() {
238     return role == ROLE.NOACCESS.brole;
239   }
240 
241   public final boolean hasReadOnly() {
242     return ROLE.READONLY.isContained(role);
243   }
244 
245   public final boolean hasTransfer() {
246     return ROLE.TRANSFER.isContained(role);
247   }
248 
249   public final boolean hasRule() {
250     return ROLE.RULE.isContained(role);
251   }
252 
253   public final boolean hasHost() {
254     return ROLE.HOST.isContained(role);
255   }
256 
257   public final boolean hasLimit() {
258     return ROLE.LIMIT.isContained(role);
259   }
260 
261   public final boolean hasSystem() {
262     return ROLE.SYSTEM.isContained(role);
263   }
264 
265   public final boolean hasUnused() {
266     return ROLE.UNUSED.isContained(role);
267   }
268 
269   public final boolean hasLogControl() {
270     return ROLE.LOGCONTROL.isContained(role);
271   }
272 
273   public static boolean hasNoAccess(final byte role) {
274     return role == ROLE.NOACCESS.brole;
275   }
276 
277   public static boolean hasReadOnly(final byte role) {
278     return ROLE.READONLY.isContained(role);
279   }
280 
281   public static boolean hasTransfer(final byte role) {
282     return ROLE.TRANSFER.isContained(role);
283   }
284 
285   public static boolean hasRule(final byte role) {
286     return ROLE.RULE.isContained(role);
287   }
288 
289   public static boolean hasHost(final byte role) {
290     return ROLE.HOST.isContained(role);
291   }
292 
293   public static boolean hasLimit(final byte role) {
294     return ROLE.LIMIT.isContained(role);
295   }
296 
297   public static boolean hasSystem(final byte role) {
298     return ROLE.SYSTEM.isContained(role);
299   }
300 
301   public static boolean hasUnused(final byte role) {
302     return ROLE.UNUSED.isContained(role);
303   }
304 
305   public static boolean hasLogControl(final byte role) {
306     return ROLE.LOGCONTROL.isContained(role);
307   }
308 
309 }