1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 package coras.structure;
22
23 import java.io.InvalidObjectException;
24 import java.io.ObjectStreamException;
25 import java.io.Serializable;
26 import java.util.ArrayList;
27 import java.util.Arrays;
28 import java.util.Collections;
29 import java.util.HashMap;
30 import java.util.Iterator;
31 import java.util.List;
32
33 /***
34 * CORAS concern enumeration and helper methods.
35 *
36 * @author Fredrik Vraalsen
37 */
38 public final class ConcernEnum implements Serializable {
39
40 public static final ConcernEnum SWOT = new ConcernEnum("SWOT", SubProcessEnum.CONTEXT_IDENTIFICATION);
41 public static final ConcernEnum ORGANISATIONAL = new ConcernEnum("Organisational", SubProcessEnum.CONTEXT_IDENTIFICATION);
42 public static final ConcernEnum SYSTEM = new ConcernEnum("System", SubProcessEnum.CONTEXT_IDENTIFICATION);
43 public static final ConcernEnum TARGET_OF_EVALUATION = new ConcernEnum("Target of evaluation", SubProcessEnum.CONTEXT_IDENTIFICATION);
44 public static final ConcernEnum RISK_MANAGEMENT = new ConcernEnum("Risk management", SubProcessEnum.CONTEXT_IDENTIFICATION);
45 public static final ConcernEnum ASSETS = new ConcernEnum("Assets", SubProcessEnum.CONTEXT_IDENTIFICATION);
46 public static final ConcernEnum SECURITY_POLICIES = new ConcernEnum("Security policies", SubProcessEnum.CONTEXT_IDENTIFICATION);
47 public static final ConcernEnum RISK_EVALUATION_CRITERIA = new ConcernEnum("Risk evaluation criteria", SubProcessEnum.CONTEXT_IDENTIFICATION);
48 public static final ConcernEnum APPROVAL = new ConcernEnum("Approval", SubProcessEnum.CONTEXT_IDENTIFICATION);
49
50 public static final ConcernEnum THREATS = new ConcernEnum("Threats", SubProcessEnum.RISK_IDENTIFICATION);
51 public static final ConcernEnum VULNERABILITIES = new ConcernEnum("Vulnerabilities", SubProcessEnum.RISK_IDENTIFICATION);
52 public static final ConcernEnum UNWANTED_INCIDENTS = new ConcernEnum("Unwanted incidents", SubProcessEnum.RISK_IDENTIFICATION);
53
54 public static final ConcernEnum CONSEQUENCE = new ConcernEnum("Consequence", SubProcessEnum.RISK_ANALYSIS);
55 public static final ConcernEnum FREQUENCY = new ConcernEnum("Frequency", SubProcessEnum.RISK_ANALYSIS);
56
57 public static final ConcernEnum RISK_ESTIMATES = new ConcernEnum("Risk estimates", SubProcessEnum.RISK_EVALUATION);
58 public static final ConcernEnum RISK_PRIORITY = new ConcernEnum("Risk priority", SubProcessEnum.RISK_EVALUATION);
59 public static final ConcernEnum RISK_THEMES = new ConcernEnum("Risk themes", SubProcessEnum.RISK_EVALUATION);
60 public static final ConcernEnum RISK_THEME_RELATIONSHIP = new ConcernEnum("Risk theme relationship", SubProcessEnum.RISK_EVALUATION);
61 public static final ConcernEnum RISK_THEME_PRIORITY = new ConcernEnum("Risk theme priority", SubProcessEnum.RISK_EVALUATION);
62
63 public static final ConcernEnum TREATMENT = new ConcernEnum("Treatment", SubProcessEnum.RISK_TREATMENT);
64 public static final ConcernEnum TREATMENT_ASSESSMENT = new ConcernEnum("Treatment assessment", SubProcessEnum.RISK_TREATMENT);
65 public static final ConcernEnum TREATMENT_PRIORITY = new ConcernEnum("Treatment priority", SubProcessEnum.RISK_TREATMENT);
66
67 private static final ConcernEnum[] VALS = {
68 SWOT,
69 ORGANISATIONAL,
70 SYSTEM,
71 TARGET_OF_EVALUATION,
72 RISK_MANAGEMENT,
73 ASSETS,
74 SECURITY_POLICIES,
75 RISK_EVALUATION_CRITERIA,
76 APPROVAL,
77 THREATS,
78 VULNERABILITIES,
79 UNWANTED_INCIDENTS,
80 CONSEQUENCE,
81 FREQUENCY,
82 RISK_ESTIMATES,
83 RISK_PRIORITY,
84 RISK_THEMES,
85 RISK_THEME_RELATIONSHIP,
86 RISK_THEME_PRIORITY,
87 TREATMENT,
88 TREATMENT_ASSESSMENT,
89 TREATMENT_PRIORITY };
90 public static final List VALUES = Collections.unmodifiableList(Arrays.asList(VALS));
91 private static final List NAMES = new ArrayList();
92 private static final HashMap SUBPROCESS_MAP = new HashMap();
93
94 private final String name;
95 private final SubProcessEnum subProcess;
96
97 static {
98 for (Iterator i = VALUES.iterator(); i.hasNext();) {
99 NAMES.add(i.next().toString());
100 }
101 SUBPROCESS_MAP.put(SubProcessEnum.CONTEXT_IDENTIFICATION,
102 VALUES.subList(VALUES.indexOf(SWOT), VALUES.indexOf(APPROVAL) + 1));
103 SUBPROCESS_MAP.put(SubProcessEnum.RISK_IDENTIFICATION,
104 VALUES.subList(VALUES.indexOf(THREATS), VALUES.indexOf(UNWANTED_INCIDENTS) + 1));
105 SUBPROCESS_MAP.put(SubProcessEnum.RISK_ANALYSIS,
106 VALUES.subList(VALUES.indexOf(CONSEQUENCE), VALUES.indexOf(FREQUENCY) + 1));
107 SUBPROCESS_MAP.put(SubProcessEnum.RISK_EVALUATION,
108 VALUES.subList(VALUES.indexOf(RISK_ESTIMATES), VALUES.indexOf(RISK_THEME_PRIORITY) + 1));
109 SUBPROCESS_MAP.put(SubProcessEnum.RISK_TREATMENT,
110 VALUES.subList(VALUES.indexOf(TREATMENT), VALUES.indexOf(TREATMENT_PRIORITY) + 1));
111 }
112
113 /***
114 * Private constructor.
115 *
116 * @param name
117 * the name of the Concern
118 * @param subProcess
119 * the subprocess the concern belongs to
120 */
121 private ConcernEnum(String name, SubProcessEnum subProcess) {
122 this.name = name;
123 this.subProcess = subProcess;
124 }
125
126 /***
127 * Get the ConcernEnum corresponding to the specified name.
128 *
129 * @param name
130 * the concern name
131 * @return the ConcernEnum, or null if not found
132 */
133 public static ConcernEnum forName(String name) {
134 int index = NAMES.indexOf(name);
135 if (index < 0 || index >= VALS.length) {
136 return null;
137 } else {
138 return VALS[index];
139 }
140 }
141
142 /***
143 * Get a List of Concerns belonging to the specified subprocess.
144 *
145 * @param subProcess the subprocess
146 * @return the List of Concerns
147 */
148 public static List forSubProcess(SubProcessEnum subProcess) {
149 if (subProcess == null) {
150 return Collections.EMPTY_LIST;
151 } else {
152 return (List) SUBPROCESS_MAP.get(subProcess);
153 }
154 }
155
156 /***
157 * Get String representation.
158 *
159 * @return the concern name
160 */
161 public String toString() {
162 return name;
163 }
164
165 /***
166 * Get the subprocess this concern belongs to.
167 *
168 * @return the subprocess
169 */
170 public SubProcessEnum getSubProcess() {
171 return subProcess;
172 }
173
174 /***
175 * Enumeration pattern: Ensure that a.equals(b) <=> (a == b) for all
176 * ConcernEnums a and b when deserializing.
177 *
178 * @return the ConcernEnum corresponding to the concern string
179 * @throws ObjectStreamException
180 * if no ConcernEnum can be found for that concern string
181 */
182 private Object readResolve() throws ObjectStreamException {
183 ConcernEnum result = forName(name);
184 if (result == null) {
185 throw new InvalidObjectException("Illegal ConcernEnum instance: " + name);
186 }
187 return result;
188 }
189
190 }