Added CLI command to print summary of the intents:
"intents -s" or "intents --summary" Change-Id: If6ec11b1425cb2a4c93fdd910808065419af14b5
Showing
1 changed file
with
243 additions
and
2 deletions
... | @@ -45,14 +45,32 @@ import java.util.Set; | ... | @@ -45,14 +45,32 @@ import java.util.Set; |
45 | description = "Lists the inventory of intents and their states") | 45 | description = "Lists the inventory of intents and their states") |
46 | public class IntentsListCommand extends AbstractShellCommand { | 46 | public class IntentsListCommand extends AbstractShellCommand { |
47 | 47 | ||
48 | - @Option(name = "-i", aliases = "--installable", description = "Output Installable Intents", | 48 | + @Option(name = "-i", aliases = "--installable", |
49 | + description = "Output Installable Intents", | ||
49 | required = false, multiValued = false) | 50 | required = false, multiValued = false) |
50 | private boolean showInstallable = false; | 51 | private boolean showInstallable = false; |
51 | 52 | ||
53 | + @Option(name = "-s", aliases = "--summary", | ||
54 | + description = "Intents summary", | ||
55 | + required = false, multiValued = false) | ||
56 | + private boolean intentsSummary = false; | ||
52 | 57 | ||
53 | @Override | 58 | @Override |
54 | protected void execute() { | 59 | protected void execute() { |
55 | IntentService service = get(IntentService.class); | 60 | IntentService service = get(IntentService.class); |
61 | + | ||
62 | + if (intentsSummary) { | ||
63 | + IntentSummaries intentSummaries = new IntentSummaries(); | ||
64 | + intentSummaries.collectIntentSummary(service, | ||
65 | + service.getIntents()); | ||
66 | + if (outputJson()) { | ||
67 | + print("%s", intentSummaries.json()); | ||
68 | + } else { | ||
69 | + intentSummaries.printSummary(); | ||
70 | + } | ||
71 | + return; | ||
72 | + } | ||
73 | + | ||
56 | if (outputJson()) { | 74 | if (outputJson()) { |
57 | print("%s", json(service, service.getIntents())); | 75 | print("%s", json(service, service.getIntents())); |
58 | } else { | 76 | } else { |
... | @@ -66,6 +84,230 @@ public class IntentsListCommand extends AbstractShellCommand { | ... | @@ -66,6 +84,230 @@ public class IntentsListCommand extends AbstractShellCommand { |
66 | } | 84 | } |
67 | } | 85 | } |
68 | 86 | ||
87 | + /** | ||
88 | + * Internal local class to keep track of all intent summaries. | ||
89 | + */ | ||
90 | + private class IntentSummaries { | ||
91 | + private IntentSummary summaryAll; | ||
92 | + private IntentSummary summaryConnectivity; | ||
93 | + private IntentSummary summaryPointToPoint; | ||
94 | + private IntentSummary summaryMultiPointToSinglePoint; | ||
95 | + private IntentSummary summarySinglePointToMultiPoint; | ||
96 | + private IntentSummary summaryPath; | ||
97 | + private IntentSummary summaryLinkCollection; | ||
98 | + private IntentSummary summaryUnknownType; | ||
99 | + | ||
100 | + /** | ||
101 | + * Initializes the internal state. | ||
102 | + */ | ||
103 | + private void init() { | ||
104 | + summaryAll = new IntentSummary("All"); | ||
105 | + summaryConnectivity = new IntentSummary("Connectivity"); | ||
106 | + summaryPointToPoint = new IntentSummary("PointToPoint"); | ||
107 | + summaryMultiPointToSinglePoint = | ||
108 | + new IntentSummary("MultiPointToSinglePoint"); | ||
109 | + summarySinglePointToMultiPoint = | ||
110 | + new IntentSummary("SinglePointToMultiPoint"); | ||
111 | + summaryPath = new IntentSummary("Path"); | ||
112 | + summaryLinkCollection = new IntentSummary("LinkCollection"); | ||
113 | + summaryUnknownType = new IntentSummary("UnknownType"); | ||
114 | + } | ||
115 | + | ||
116 | + /** | ||
117 | + * Collects summary of all intents. | ||
118 | + * | ||
119 | + * @param service the Intent Service to use | ||
120 | + * @param intents the intents | ||
121 | + */ | ||
122 | + private void collectIntentSummary(IntentService service, | ||
123 | + Iterable<Intent> intents) { | ||
124 | + init(); | ||
125 | + | ||
126 | + // Collect the summary for each intent type intents | ||
127 | + for (Intent intent : intents) { | ||
128 | + IntentState intentState = service.getIntentState(intent.id()); | ||
129 | + | ||
130 | + // Update the summary for all Intents | ||
131 | + summaryAll.update(intentState); | ||
132 | + | ||
133 | + if (intent instanceof ConnectivityIntent) { | ||
134 | + summaryConnectivity.update(intentState); | ||
135 | + // NOTE: ConnectivityIntent is a base type Intent | ||
136 | + // continue; | ||
137 | + } | ||
138 | + if (intent instanceof PointToPointIntent) { | ||
139 | + summaryPointToPoint.update(intentState); | ||
140 | + continue; | ||
141 | + } | ||
142 | + if (intent instanceof MultiPointToSinglePointIntent) { | ||
143 | + summaryMultiPointToSinglePoint.update(intentState); | ||
144 | + continue; | ||
145 | + } | ||
146 | + if (intent instanceof SinglePointToMultiPointIntent) { | ||
147 | + summarySinglePointToMultiPoint.update(intentState); | ||
148 | + continue; | ||
149 | + } | ||
150 | + if (intent instanceof PathIntent) { | ||
151 | + summaryPath.update(intentState); | ||
152 | + continue; | ||
153 | + } | ||
154 | + if (intent instanceof LinkCollectionIntent) { | ||
155 | + summaryLinkCollection.update(intentState); | ||
156 | + continue; | ||
157 | + } | ||
158 | + | ||
159 | + summaryUnknownType.update(intentState); | ||
160 | + } | ||
161 | + } | ||
162 | + | ||
163 | + /** | ||
164 | + * Gets JSON representation of all Intents summary. | ||
165 | + * | ||
166 | + * @return JSON representation of all Intents summary | ||
167 | + */ | ||
168 | + ObjectNode json() { | ||
169 | + ObjectMapper mapper = new ObjectMapper(); | ||
170 | + ObjectNode result = mapper.createObjectNode(); | ||
171 | + result.put("connectivity", summaryConnectivity.json(mapper)); | ||
172 | + result.put("pointToPoint", summaryPointToPoint.json(mapper)); | ||
173 | + result.put("multiPointToSinglePoint", | ||
174 | + summaryMultiPointToSinglePoint.json(mapper)); | ||
175 | + result.put("singlePointToMultiPoint", | ||
176 | + summarySinglePointToMultiPoint.json(mapper)); | ||
177 | + result.put("path", summaryPath.json(mapper)); | ||
178 | + result.put("linkCollection", summaryLinkCollection.json(mapper)); | ||
179 | + result.put("unknownType", summaryUnknownType.json(mapper)); | ||
180 | + result.put("all", summaryAll.json(mapper)); | ||
181 | + return result; | ||
182 | + } | ||
183 | + | ||
184 | + /** | ||
185 | + * Prints summary of the intents. | ||
186 | + */ | ||
187 | + private void printSummary() { | ||
188 | + summaryConnectivity.printState(); | ||
189 | + summaryPointToPoint.printState(); | ||
190 | + summaryMultiPointToSinglePoint.printState(); | ||
191 | + summarySinglePointToMultiPoint.printState(); | ||
192 | + summaryPath.printState(); | ||
193 | + summaryLinkCollection.printState(); | ||
194 | + summaryUnknownType.printState(); | ||
195 | + summaryAll.printState(); | ||
196 | + } | ||
197 | + | ||
198 | + /** | ||
199 | + * Internal local class to keep track of a single type Intent summary. | ||
200 | + */ | ||
201 | + private class IntentSummary { | ||
202 | + private final String intentType; | ||
203 | + private int total = 0; | ||
204 | + private int submitted = 0; | ||
205 | + private int compiling = 0; | ||
206 | + private int installing = 0; | ||
207 | + private int installed = 0; | ||
208 | + private int recompiling = 0; | ||
209 | + private int withdrawing = 0; | ||
210 | + private int withdrawn = 0; | ||
211 | + private int failed = 0; | ||
212 | + private int unknownState = 0; | ||
213 | + | ||
214 | + private static final String FORMAT_SUMMARY_LINE1 = | ||
215 | + "%-23s total= %7d installed= %7d"; | ||
216 | + private static final String FORMAT_SUMMARY_LINE2 = | ||
217 | + "%-23s withdrawn= %7d failed= %7d"; | ||
218 | + private static final String FORMAT_SUMMARY_LINE3 = | ||
219 | + "%-23s submitted= %7d compiling= %7d"; | ||
220 | + private static final String FORMAT_SUMMARY_LINE4 = | ||
221 | + "%-23s installing= %7d recompiling= %7d"; | ||
222 | + private static final String FORMAT_SUMMARY_LINE5 = | ||
223 | + "%-23s withdrawing= %7d"; | ||
224 | + private static final String FORMAT_SUMMARY_LINE6 = | ||
225 | + "%-23s unknownState= %7d"; | ||
226 | + | ||
227 | + /** | ||
228 | + * Constructor. | ||
229 | + * | ||
230 | + * @param intentType the scring describing the Intent type | ||
231 | + */ | ||
232 | + IntentSummary(String intentType) { | ||
233 | + this.intentType = intentType; | ||
234 | + } | ||
235 | + | ||
236 | + /** | ||
237 | + * Updates the Intent Summary. | ||
238 | + * | ||
239 | + * @param intentState the state of the Intent | ||
240 | + */ | ||
241 | + void update(IntentState intentState) { | ||
242 | + total++; | ||
243 | + switch (intentState) { | ||
244 | + case SUBMITTED: | ||
245 | + submitted++; | ||
246 | + break; | ||
247 | + case COMPILING: | ||
248 | + compiling++; | ||
249 | + break; | ||
250 | + case INSTALLING: | ||
251 | + installing++; | ||
252 | + break; | ||
253 | + case INSTALLED: | ||
254 | + installed++; | ||
255 | + break; | ||
256 | + case RECOMPILING: | ||
257 | + recompiling++; | ||
258 | + break; | ||
259 | + case WITHDRAWING: | ||
260 | + withdrawing++; | ||
261 | + break; | ||
262 | + case WITHDRAWN: | ||
263 | + withdrawn++; | ||
264 | + break; | ||
265 | + case FAILED: | ||
266 | + failed++; | ||
267 | + break; | ||
268 | + default: | ||
269 | + unknownState++; | ||
270 | + break; | ||
271 | + } | ||
272 | + } | ||
273 | + | ||
274 | + /** | ||
275 | + * Prints the Intent Summary. | ||
276 | + */ | ||
277 | + void printState() { | ||
278 | + print(FORMAT_SUMMARY_LINE1, intentType, total, installed); | ||
279 | + print(FORMAT_SUMMARY_LINE2, intentType, withdrawn, failed); | ||
280 | + print(FORMAT_SUMMARY_LINE3, intentType, submitted, compiling); | ||
281 | + print(FORMAT_SUMMARY_LINE4, intentType, installing, recompiling); | ||
282 | + print(FORMAT_SUMMARY_LINE5, intentType, withdrawing); | ||
283 | + if (unknownState != 0) { | ||
284 | + print(FORMAT_SUMMARY_LINE6, intentType, unknownState); | ||
285 | + } | ||
286 | + } | ||
287 | + | ||
288 | + /** | ||
289 | + * Gets the JSON representation of the Intent Summary. | ||
290 | + * | ||
291 | + * @return the JSON representation of the Intent Summary | ||
292 | + */ | ||
293 | + JsonNode json(ObjectMapper mapper) { | ||
294 | + ObjectNode result = mapper.createObjectNode() | ||
295 | + .put("total", total) | ||
296 | + .put("installed", installed) | ||
297 | + .put("failed", failed) | ||
298 | + .put("submitted", submitted) | ||
299 | + .put("compiling", compiling) | ||
300 | + .put("installing", installing) | ||
301 | + .put("recompiling", recompiling) | ||
302 | + .put("withdrawing", withdrawing) | ||
303 | + .put("withdrawn", withdrawn) | ||
304 | + .put("unknownState", unknownState); | ||
305 | + | ||
306 | + return result; | ||
307 | + } | ||
308 | + } | ||
309 | + } | ||
310 | + | ||
69 | private void printDetails(IntentService service, Intent intent) { | 311 | private void printDetails(IntentService service, Intent intent) { |
70 | if (intent.resources() != null && !intent.resources().isEmpty()) { | 312 | if (intent.resources() != null && !intent.resources().isEmpty()) { |
71 | print(" resources=%s", intent.resources()); | 313 | print(" resources=%s", intent.resources()); |
... | @@ -188,5 +430,4 @@ public class IntentsListCommand extends AbstractShellCommand { | ... | @@ -188,5 +430,4 @@ public class IntentsListCommand extends AbstractShellCommand { |
188 | } | 430 | } |
189 | return result; | 431 | return result; |
190 | } | 432 | } |
191 | - | ||
192 | } | 433 | } | ... | ... |
-
Please register or login to post a comment