View Javadoc

1   /*
2    *  Copyright (C) 2003-2005 SINTEF
3    *  Author:  Fredrik Vraalsen (fredrik dot vraalsen at sintef dot no)
4    *  Webpage: http://coras.sourceforge.net/
5    *
6    *  This program is free software; you can redistribute it and/or
7    *  modify it under the terms of the GNU Lesser General Public License
8    *  as published by the Free Software Foundation; either version 2.1
9    *  of the License, or (at your option) any later version.
10   *
11   *  This program is distributed in the hope that it will be useful,
12   *  but WITHOUT ANY WARRANTY; without even the implied warranty of
13   *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14   *  Lesser General Public License for more details.
15   *
16   *  You should have received a copy of the GNU Lesser General Public
17   *  License along with this program; if not, write to the Free
18   *  Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
19   *  02111-1307 USA
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 }