1 | package de.uka.ipd.sdq.simucomframework.accuracy; |
2 | |
3 | import de.fzi.se.accuracy.issues.AccuracyIssueFactory; |
4 | import de.uka.ipd.sdq.pcm.seff.AbstractAction; |
5 | import de.uka.ipd.sdq.simucomframework.model.SimuComModel; |
6 | import de.uka.ipd.sdq.simucomframework.variables.EvaluationProxy; |
7 | import de.uka.ipd.sdq.simucomframework.variables.StackContext; |
8 | import de.uka.ipd.sdq.simucomframework.variables.exceptions.ValueNotInFrameException; |
9 | import de.uka.ipd.sdq.simucomframework.variables.stackframe.SimulatedStackframe; |
10 | |
11 | /**Tools which help to analyze the accuracy influence in the simucomframework. |
12 | * |
13 | * @author groenda |
14 | */ |
15 | public class AccuracyAnalysisHelper { |
16 | |
17 | /**Checks that the value for an ID in the stack frame is within the specified bounds. |
18 | * @param config Issues will be reported to this instance. |
19 | * @param stackframe The stack frame. |
20 | * @param simuComId The ID. |
21 | * @param rdseffId The UUID of the RD-SEFF in which the variable was accessed. |
22 | * @param actionId UUID of the {@link AbstractAction} for which a message was recorded. |
23 | * @param resourceName The location of the resource. |
24 | * @param from Lower bound (inclusive). |
25 | * @param to Upper bound (inclusive) |
26 | */ |
27 | public static void checkBoundsInterval(String partitionId, String partitionResourceName, SimuComModel config, |
28 | SimulatedStackframe<Object> stackframe, String simuComId, |
29 | String rdseffId, String actionId, String resourceName, String from, |
30 | String to) { |
31 | Object value; |
32 | try { |
33 | value = stackframe.getValue(simuComId); |
34 | if (value.getClass() == EvaluationProxy.class) { |
35 | value = StackContext.evaluateStatic(((EvaluationProxy)value).getStoEx()); |
36 | } |
37 | } catch (ValueNotInFrameException e) { |
38 | config |
39 | .addIssue(AccuracyIssueFactory |
40 | .createCharacterisedPCMParameterPartition( |
41 | "The partition referenced the variable " |
42 | + simuComId |
43 | + " which was not accessible during runtime. Correct the quality information or PCM model.", |
44 | partitionResourceName, partitionId)); |
45 | return; |
46 | } |
47 | if (value instanceof Byte) { |
48 | if ((Byte)value >= StackContext.evaluateStatic(from, Byte.class) |
49 | && (Byte)value <= StackContext.evaluateStatic(to, Byte.class)) { |
50 | // within bounds. do nothing. |
51 | } else { |
52 | config.addIssue(AccuracyIssueFactory.createParameterExtrapolationIssue(simuComId, rdseffId, resourceName, value, actionId)); |
53 | } |
54 | } else if (value instanceof Character) { |
55 | if ((Character)value >= StackContext.evaluateStatic(from, Character.class) |
56 | && (Character)value <= StackContext.evaluateStatic(to, Character.class)) { |
57 | // within bounds. do nothing. |
58 | } else { |
59 | config.addIssue(AccuracyIssueFactory.createParameterExtrapolationIssue(simuComId, rdseffId, resourceName, value, actionId)); |
60 | } |
61 | } else if (value instanceof Short) { |
62 | if ((Short)value >= StackContext.evaluateStatic(from, Short.class) |
63 | && (Short)value <= StackContext.evaluateStatic(to, Short.class)) { |
64 | // within bounds. do nothing. |
65 | } else { |
66 | config.addIssue(AccuracyIssueFactory.createParameterExtrapolationIssue(simuComId, rdseffId, resourceName, value, actionId)); |
67 | } |
68 | } else if (value instanceof Integer) { |
69 | if ((Integer)value >= StackContext.evaluateStatic(from, Integer.class) |
70 | && (Integer)value <= StackContext.evaluateStatic(to, Integer.class)) { |
71 | // within bounds. do nothing. |
72 | } else { |
73 | config.addIssue(AccuracyIssueFactory.createParameterExtrapolationIssue(simuComId, rdseffId, resourceName, value, actionId)); |
74 | } |
75 | } else if (value instanceof Long) { |
76 | if ((Long)value >= StackContext.evaluateStatic(from, Long.class) |
77 | && (Long)value <= StackContext.evaluateStatic(to, Long.class)) { |
78 | // within bounds. do nothing. |
79 | } else { |
80 | config.addIssue(AccuracyIssueFactory.createParameterExtrapolationIssue(simuComId, rdseffId, resourceName, value, actionId)); |
81 | } |
82 | } else if (value instanceof Float) { |
83 | if ((Float)value >= StackContext.evaluateStatic(from, Float.class) |
84 | && (Float)value <= StackContext.evaluateStatic(to, Float.class)) { |
85 | // within bounds. do nothing. |
86 | } else { |
87 | config.addIssue(AccuracyIssueFactory.createParameterExtrapolationIssue(simuComId, rdseffId, resourceName, value, actionId)); |
88 | } |
89 | } else if (value instanceof Double) { |
90 | if ((Double)value >= StackContext.evaluateStatic(from, Double.class) |
91 | && (Double)value <= StackContext.evaluateStatic(to, Double.class)) { |
92 | // within bounds. do nothing. |
93 | config.addIssue(AccuracyIssueFactory.createParameterExtrapolationIssue(simuComId, rdseffId, resourceName, value, actionId)); |
94 | } |
95 | } else { |
96 | String msg = "The dynamic type for " + simuComId + " was " + value.getClass().getCanonicalName() + " which is not supported for interval-typed checks in accuracy influence analysis. Use CharacterisedPCMParameterPartitionRange if the value is not a numeric type."; |
97 | config.addIssue(AccuracyIssueFactory.createTypeInferenceIssue(msg)); |
98 | } |
99 | } |
100 | |
101 | /**Checks that the value for an ID in the stack frame is within a provided list of values. |
102 | * @param config Issues will be reported to this instance. |
103 | * @param stackframe The stack frame. |
104 | * @param simuComId The ID. |
105 | * @param rdseffId The UUID of the RD-SEFF in which the variable was accessed. |
106 | * @param resourceName The location of the resource. |
107 | * @param actionId UUID of the {@link AbstractAction} in which the variable was accessed. |
108 | * @param specifications Valid values. |
109 | */ |
110 | public static void checkBoundsRange(String partitionId, String partitionResourceName, SimuComModel config, |
111 | SimulatedStackframe<Object> stackframe, String simuComId, |
112 | String rdseffId, String actionId, String resourceName, |
113 | String... specifications) { |
114 | Object value; |
115 | try { |
116 | value = stackframe.getValue(simuComId); |
117 | if (value.getClass() == EvaluationProxy.class) { |
118 | value = StackContext.evaluateStatic(((EvaluationProxy)value).getStoEx()); |
119 | } |
120 | } catch (ValueNotInFrameException e) { |
121 | config |
122 | .addIssue(AccuracyIssueFactory |
123 | .createCharacterisedPCMParameterPartition( |
124 | "The partition referenced the variable " |
125 | + simuComId |
126 | + " which was not accessible during runtime. Correct the quality information or PCM model.", |
127 | partitionResourceName, partitionId)); |
128 | return; |
129 | } |
130 | Class<?> clazz = value.getClass(); |
131 | boolean found = false; |
132 | // The value must match one of the provided specifications |
133 | for (String specification : specifications) { |
134 | if (StackContext.evaluateStatic(specification, clazz).equals(value)) { |
135 | found = true; |
136 | break; |
137 | } |
138 | } |
139 | if (found == false) { |
140 | config.addIssue(AccuracyIssueFactory.createParameterExtrapolationIssue(simuComId, rdseffId, resourceName, value, actionId)); |
141 | } |
142 | } |
143 | } |
144 | |