1 /** 2 * Portions of this software was developed by employees of the National Institute 3 * of Standards and Technology (NIST), an agency of the Federal Government and is 4 * being made available as a public service. Pursuant to title 17 United States 5 * Code Section 105, works of NIST employees are not subject to copyright 6 * protection in the United States. This software may be subject to foreign 7 * copyright. Permission in the United States and in foreign countries, to the 8 * extent that NIST may hold copyright, to use, copy, modify, create derivative 9 * works, and distribute this software and its documentation without fee is hereby 10 * granted on a non-exclusive basis, provided that this notice and disclaimer 11 * of warranty appears in all copies. 12 * 13 * THE SOFTWARE IS PROVIDED 'AS IS' WITHOUT ANY WARRANTY OF ANY KIND, EITHER 14 * EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, ANY WARRANTY 15 * THAT THE SOFTWARE WILL CONFORM TO SPECIFICATIONS, ANY IMPLIED WARRANTIES OF 16 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND FREEDOM FROM 17 * INFRINGEMENT, AND ANY WARRANTY THAT THE DOCUMENTATION WILL CONFORM TO THE 18 * SOFTWARE, OR ANY WARRANTY THAT THE SOFTWARE WILL BE ERROR FREE. IN NO EVENT 19 * SHALL NIST BE LIABLE FOR ANY DAMAGES, INCLUDING, BUT NOT LIMITED TO, DIRECT, 20 * INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES, ARISING OUT OF, RESULTING FROM, 21 * OR IN ANY WAY CONNECTED WITH THIS SOFTWARE, WHETHER OR NOT BASED UPON WARRANTY, 22 * CONTRACT, TORT, OR OTHERWISE, WHETHER OR NOT INJURY WAS SUSTAINED BY PERSONS OR 23 * PROPERTY OR OTHERWISE, AND WHETHER OR NOT LOSS WAS SUSTAINED FROM, OR AROSE OUT 24 * OF THE RESULTS OF, OR USE OF, THE SOFTWARE OR SERVICES PROVIDED HEREUNDER. 25 */ 26 27 package gov.nist.secauto.swid.builder; 28 29 import java.util.HashMap; 30 import java.util.Map; 31 32 public interface Role { 33 Integer getIndex(); 34 35 String getName(); 36 37 static final Map<String, Role> byValueMap = new HashMap<>(); 38 39 static final Map<Integer, Role> byIndexMap = new HashMap<>(); 40 41 /** 42 * Initialize the mapping of role index and text values. 43 * 44 * @param index 45 * the index position 46 * @param value 47 * the human-readable value 48 */ 49 default void init(Integer index, String value) { 50 if (index != null) { 51 synchronized (byIndexMap) { 52 byIndexMap.put(index, this); 53 } 54 } 55 synchronized (byValueMap) { 56 byValueMap.put(value, this); 57 } 58 } 59 60 /** 61 * Assign a new role to the private id space. 62 * 63 * @param indexValue 64 * the index value to use 65 * @param name 66 * the human-readable name 67 * @return the new role 68 */ 69 public static Role assignPrivateRole(int indexValue, String name) { 70 // force initialization of the known roles 71 KnownRole.values(); 72 Role retval = null; 73 synchronized (byValueMap) { 74 @SuppressWarnings("unlikely-arg-type") 75 Role value = byValueMap.get(indexValue); 76 retval = value; 77 } 78 if (retval == null) { 79 retval = new UnknownRole(indexValue, name); 80 } else if (retval.getName().equals(name)) { 81 // return the current role 82 } else { 83 throw new IllegalStateException("the role with the name '" + retval.getName() 84 + "' is already assigned to the index value '" + indexValue + "'"); 85 } 86 return retval; 87 } 88 89 /** 90 * Lookup a role by the provided index value. 91 * 92 * @param value 93 * the index value to lookup the role for 94 * @return the matching role or {@code null} if no matching role was not found. 95 */ 96 public static Role lookupByIndex(int value) { 97 // force initialization of the known roles 98 KnownRole.values(); 99 Role retval = null; 100 synchronized (byIndexMap) { 101 retval = byIndexMap.get(value); 102 } 103 return retval; 104 } 105 106 /** 107 * Lookup a role by the provided human-readable name. 108 * 109 * @param name 110 * the name to lookup the role by 111 * @return the matching role or {@code null} if no matching role was not found. 112 */ 113 public static Role lookupByName(String name) { 114 // force initialization of the known roles 115 KnownRole.values(); 116 Role retval = null; 117 synchronized (byValueMap) { 118 retval = byValueMap.get(name); 119 } 120 121 if (retval == null) { 122 retval = new UnknownRole(name); 123 } 124 return retval; 125 } 126 }