| OLD | NEW | 
|---|
| 1 // Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file | 1 // Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file | 
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a | 
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. | 
| 4 | 4 | 
| 5 library analysis_server.src.status.get_handler; | 5 library analysis_server.src.status.get_handler; | 
| 6 | 6 | 
| 7 import 'dart:async'; | 7 import 'dart:async'; | 
| 8 import 'dart:collection'; | 8 import 'dart:collection'; | 
| 9 import 'dart:convert'; | 9 import 'dart:convert'; | 
| 10 import 'dart:io'; | 10 import 'dart:io'; | 
| 11 import 'dart:math'; | 11 import 'dart:math'; | 
| 12 | 12 | 
| 13 import 'package:analysis_server/plugin/protocol/protocol.dart' hide Element; | 13 import 'package:analysis_server/plugin/protocol/protocol.dart' hide Element; | 
| 14 import 'package:analysis_server/src/analysis_server.dart'; | 14 import 'package:analysis_server/src/analysis_server.dart'; | 
| 15 import 'package:analysis_server/src/domain_completion.dart'; | 15 import 'package:analysis_server/src/domain_completion.dart'; | 
|  | 16 import 'package:analysis_server/src/domain_diagnostic.dart'; | 
| 16 import 'package:analysis_server/src/domain_execution.dart'; | 17 import 'package:analysis_server/src/domain_execution.dart'; | 
| 17 import 'package:analysis_server/src/operation/operation.dart'; | 18 import 'package:analysis_server/src/operation/operation.dart'; | 
| 18 import 'package:analysis_server/src/operation/operation_analysis.dart'; | 19 import 'package:analysis_server/src/operation/operation_analysis.dart'; | 
| 19 import 'package:analysis_server/src/operation/operation_queue.dart'; | 20 import 'package:analysis_server/src/operation/operation_queue.dart'; | 
| 20 import 'package:analysis_server/src/services/index/index.dart'; | 21 import 'package:analysis_server/src/services/index/index.dart'; | 
| 21 import 'package:analysis_server/src/services/index/local_index.dart'; | 22 import 'package:analysis_server/src/services/index/local_index.dart'; | 
| 22 import 'package:analysis_server/src/services/index/store/split_store.dart'; | 23 import 'package:analysis_server/src/services/index/store/split_store.dart'; | 
| 23 import 'package:analysis_server/src/socket_server.dart'; | 24 import 'package:analysis_server/src/socket_server.dart'; | 
| 24 import 'package:analysis_server/src/status/ast_writer.dart'; | 25 import 'package:analysis_server/src/status/ast_writer.dart'; | 
| 25 import 'package:analysis_server/src/status/element_writer.dart'; | 26 import 'package:analysis_server/src/status/element_writer.dart'; | 
|  | 27 import 'package:analysis_server/src/utilities/average.dart'; | 
| 26 import 'package:analyzer/file_system/file_system.dart'; | 28 import 'package:analyzer/file_system/file_system.dart'; | 
| 27 import 'package:analyzer/src/context/cache.dart'; | 29 import 'package:analyzer/src/context/cache.dart'; | 
| 28 import 'package:analyzer/src/context/context.dart' show AnalysisContextImpl; | 30 import 'package:analyzer/src/context/context.dart' show AnalysisContextImpl; | 
| 29 import 'package:analyzer/src/generated/ast.dart'; | 31 import 'package:analyzer/src/generated/ast.dart'; | 
| 30 import 'package:analyzer/src/generated/element.dart'; | 32 import 'package:analyzer/src/generated/element.dart'; | 
| 31 import 'package:analyzer/src/generated/engine.dart' | 33 import 'package:analyzer/src/generated/engine.dart' | 
| 32     hide AnalysisCache, AnalysisContextImpl, AnalysisTask; | 34     hide AnalysisCache, AnalysisContextImpl, AnalysisTask; | 
| 33 import 'package:analyzer/src/generated/java_engine.dart'; | 35 import 'package:analyzer/src/generated/java_engine.dart'; | 
| 34 import 'package:analyzer/src/generated/resolver.dart'; | 36 import 'package:analyzer/src/generated/resolver.dart'; | 
| 35 import 'package:analyzer/src/generated/source.dart'; | 37 import 'package:analyzer/src/generated/source.dart'; | 
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 87    * The path used to request communication performance information. | 89    * The path used to request communication performance information. | 
| 88    */ | 90    */ | 
| 89   static const String COMMUNICATION_PERFORMANCE_PATH = '/perf/communication'; | 91   static const String COMMUNICATION_PERFORMANCE_PATH = '/perf/communication'; | 
| 90 | 92 | 
| 91   /** | 93   /** | 
| 92    * The path used to request information about a specific context. | 94    * The path used to request information about a specific context. | 
| 93    */ | 95    */ | 
| 94   static const String CONTEXT_PATH = '/context'; | 96   static const String CONTEXT_PATH = '/context'; | 
| 95 | 97 | 
| 96   /** | 98   /** | 
|  | 99    * The path used to request diagnostic information. | 
|  | 100    */ | 
|  | 101   static const String DIAGNOSTIC_PATH = '/diagnostic'; | 
|  | 102 | 
|  | 103   /** | 
| 97    * The path used to request information about a element model. | 104    * The path used to request information about a element model. | 
| 98    */ | 105    */ | 
| 99   static const String ELEMENT_PATH = '/element'; | 106   static const String ELEMENT_PATH = '/element'; | 
| 100 | 107 | 
| 101   /** | 108   /** | 
| 102    * The path used to request information about elements with the given name. | 109    * The path used to request information about elements with the given name. | 
| 103    */ | 110    */ | 
| 104   static const String INDEX_ELEMENT_BY_NAME = '/index/element-by-name'; | 111   static const String INDEX_ELEMENT_BY_NAME = '/index/element-by-name'; | 
| 105 | 112 | 
| 106   /** | 113   /** | 
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 150   /** | 157   /** | 
| 151    * Query parameter used to represent the cache state to search for, when | 158    * Query parameter used to represent the cache state to search for, when | 
| 152    * accessing [CACHE_STATE_PATH]. | 159    * accessing [CACHE_STATE_PATH]. | 
| 153    */ | 160    */ | 
| 154   static const String STATE_QUERY_PARAM = 'state'; | 161   static const String STATE_QUERY_PARAM = 'state'; | 
| 155 | 162 | 
| 156   static final ContentType _htmlContent = | 163   static final ContentType _htmlContent = | 
| 157       new ContentType("text", "html", charset: "utf-8"); | 164       new ContentType("text", "html", charset: "utf-8"); | 
| 158 | 165 | 
| 159   /** | 166   /** | 
|  | 167    * Rolling average of calls to get diagnostics. | 
|  | 168    */ | 
|  | 169   Average _diagnosticCallAverage = new Average(); | 
|  | 170 | 
|  | 171   /** | 
| 160    * The socket server whose status is to be reported on. | 172    * The socket server whose status is to be reported on. | 
| 161    */ | 173    */ | 
| 162   SocketServer _server; | 174   SocketServer _server; | 
| 163 | 175 | 
| 164   /** | 176   /** | 
| 165    * Buffer containing strings printed by the analysis server. | 177    * Buffer containing strings printed by the analysis server. | 
| 166    */ | 178    */ | 
| 167   List<String> _printBuffer; | 179   List<String> _printBuffer; | 
| 168 | 180 | 
| 169   /** | 181   /** | 
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 204     } else if (path == CACHE_STATE_PATH) { | 216     } else if (path == CACHE_STATE_PATH) { | 
| 205       _returnCacheState(request); | 217       _returnCacheState(request); | 
| 206     } else if (path == CACHE_ENTRY_PATH) { | 218     } else if (path == CACHE_ENTRY_PATH) { | 
| 207       _returnCacheEntry(request); | 219       _returnCacheEntry(request); | 
| 208     } else if (path == COMPLETION_PATH) { | 220     } else if (path == COMPLETION_PATH) { | 
| 209       _returnCompletionInfo(request); | 221       _returnCompletionInfo(request); | 
| 210     } else if (path == COMMUNICATION_PERFORMANCE_PATH) { | 222     } else if (path == COMMUNICATION_PERFORMANCE_PATH) { | 
| 211       _returnCommunicationPerformance(request); | 223       _returnCommunicationPerformance(request); | 
| 212     } else if (path == CONTEXT_PATH) { | 224     } else if (path == CONTEXT_PATH) { | 
| 213       _returnContextInfo(request); | 225       _returnContextInfo(request); | 
|  | 226     } else if (path == DIAGNOSTIC_PATH) { | 
|  | 227       _returnDiagnosticInfo(request); | 
| 214     } else if (path == ELEMENT_PATH) { | 228     } else if (path == ELEMENT_PATH) { | 
| 215       _returnElement(request); | 229       _returnElement(request); | 
| 216     } else if (path == INDEX_ELEMENT_BY_NAME) { | 230     } else if (path == INDEX_ELEMENT_BY_NAME) { | 
| 217       _returnIndexElementByName(request); | 231       _returnIndexElementByName(request); | 
| 218     } else if (path == OVERLAY_PATH) { | 232     } else if (path == OVERLAY_PATH) { | 
| 219       _returnOverlayContents(request); | 233       _returnOverlayContents(request); | 
| 220     } else if (path == OVERLAYS_PATH) { | 234     } else if (path == OVERLAYS_PATH) { | 
| 221       _returnOverlaysInfo(request); | 235       _returnOverlaysInfo(request); | 
| 222     } else { | 236     } else { | 
| 223       _returnUnknownRequest(request); | 237       _returnUnknownRequest(request); | 
| (...skipping 830 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1054         } else { | 1068         } else { | 
| 1055           exceptions.forEach((CaughtException exception) { | 1069           exceptions.forEach((CaughtException exception) { | 
| 1056             _writeException(buffer, exception); | 1070             _writeException(buffer, exception); | 
| 1057           }); | 1071           }); | 
| 1058         } | 1072         } | 
| 1059       }); | 1073       }); | 
| 1060     }); | 1074     }); | 
| 1061   } | 1075   } | 
| 1062 | 1076 | 
| 1063   /** | 1077   /** | 
|  | 1078    * Return a response displaying diagnostic information. | 
|  | 1079    */ | 
|  | 1080   void _returnDiagnosticInfo(HttpRequest request) { | 
|  | 1081     String value = request.requestedUri.queryParameters['index']; | 
|  | 1082     int index = value != null ? int.parse(value, onError: (_) => 0) : 0; | 
|  | 1083     _writeResponse(request, (StringBuffer buffer) { | 
|  | 1084       _writePage(buffer, 'Analysis Server - Diagnostic info', [], | 
|  | 1085           (StringBuffer buffer) { | 
|  | 1086         _writeDiagnosticStatus(buffer); | 
|  | 1087       }); | 
|  | 1088     }); | 
|  | 1089   } | 
|  | 1090 | 
|  | 1091   /** | 
| 1064    * Return a response containing information about an element structure. | 1092    * Return a response containing information about an element structure. | 
| 1065    */ | 1093    */ | 
| 1066   void _returnElement(HttpRequest request) { | 1094   void _returnElement(HttpRequest request) { | 
| 1067     AnalysisServer analysisServer = _server.analysisServer; | 1095     AnalysisServer analysisServer = _server.analysisServer; | 
| 1068     if (analysisServer == null) { | 1096     if (analysisServer == null) { | 
| 1069       return _returnFailure(request, 'Analysis server not running'); | 1097       return _returnFailure(request, 'Analysis server not running'); | 
| 1070     } | 1098     } | 
| 1071     String contextFilter = request.uri.queryParameters[CONTEXT_QUERY_PARAM]; | 1099     String contextFilter = request.uri.queryParameters[CONTEXT_QUERY_PARAM]; | 
| 1072     if (contextFilter == null) { | 1100     if (contextFilter == null) { | 
| 1073       return _returnFailure( | 1101       return _returnFailure( | 
| (...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1210   } | 1238   } | 
| 1211 | 1239 | 
| 1212   /** | 1240   /** | 
| 1213    * Return a response indicating the status of the analysis server. | 1241    * Return a response indicating the status of the analysis server. | 
| 1214    */ | 1242    */ | 
| 1215   void _returnServerStatus(HttpRequest request) { | 1243   void _returnServerStatus(HttpRequest request) { | 
| 1216     _writeResponse(request, (StringBuffer buffer) { | 1244     _writeResponse(request, (StringBuffer buffer) { | 
| 1217       _writePage(buffer, 'Analysis Server - Status', [], (StringBuffer buffer) { | 1245       _writePage(buffer, 'Analysis Server - Status', [], (StringBuffer buffer) { | 
| 1218         if (_writeServerStatus(buffer)) { | 1246         if (_writeServerStatus(buffer)) { | 
| 1219           _writeAnalysisStatus(buffer); | 1247           _writeAnalysisStatus(buffer); | 
|  | 1248           _writeDiagnosticStatus(buffer); | 
| 1220           _writeEditStatus(buffer); | 1249           _writeEditStatus(buffer); | 
| 1221           _writeExecutionStatus(buffer); | 1250           _writeExecutionStatus(buffer); | 
| 1222           _writePluginStatus(buffer); | 1251           _writePluginStatus(buffer); | 
| 1223           _writeRecentOutput(buffer); | 1252           _writeRecentOutput(buffer); | 
| 1224         } | 1253         } | 
| 1225       }); | 1254       }); | 
| 1226     }); | 1255     }); | 
| 1227   } | 1256   } | 
| 1228 | 1257 | 
| 1229   /** | 1258   /** | 
| (...skipping 10 matching lines...) Expand all  Loading... | 
| 1240         buffer.write('<p>'); | 1269         buffer.write('<p>'); | 
| 1241         buffer | 1270         buffer | 
| 1242             .write(makeLink(COMMUNICATION_PERFORMANCE_PATH, {}, 'Performance')); | 1271             .write(makeLink(COMMUNICATION_PERFORMANCE_PATH, {}, 'Performance')); | 
| 1243         buffer.write('</p>'); | 1272         buffer.write('</p>'); | 
| 1244         buffer.write('<p>'); | 1273         buffer.write('<p>'); | 
| 1245         buffer.write(makeLink(STATUS_PATH, {}, 'Server status')); | 1274         buffer.write(makeLink(STATUS_PATH, {}, 'Server status')); | 
| 1246         buffer.write('</p>'); | 1275         buffer.write('</p>'); | 
| 1247         buffer.write('<p>'); | 1276         buffer.write('<p>'); | 
| 1248         buffer.write(makeLink(OVERLAYS_PATH, {}, 'File overlays')); | 1277         buffer.write(makeLink(OVERLAYS_PATH, {}, 'File overlays')); | 
| 1249         buffer.write('</p>'); | 1278         buffer.write('</p>'); | 
|  | 1279         buffer.write('<p>'); | 
|  | 1280         buffer.write(makeLink(DIAGNOSTIC_PATH, {}, 'Diagnostic info')); | 
|  | 1281         buffer.write('</p>'); | 
| 1250       }); | 1282       }); | 
| 1251     }); | 1283     }); | 
| 1252   } | 1284   } | 
| 1253 | 1285 | 
| 1254   /** | 1286   /** | 
| 1255    * Return a two digit decimal representation of the given non-negative integer | 1287    * Return a two digit decimal representation of the given non-negative integer | 
| 1256    * [value]. | 1288    * [value]. | 
| 1257    */ | 1289    */ | 
| 1258   String _twoDigit(int value) { | 1290   String _twoDigit(int value) { | 
| 1259     if (value < 10) { | 1291     if (value < 10) { | 
| (...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1442       <p><strong># Notifications</strong> - the total number of notifications | 1474       <p><strong># Notifications</strong> - the total number of notifications | 
| 1443         sent to the client with completion results for this request. | 1475         sent to the client with completion results for this request. | 
| 1444       <p><strong># Suggestions</strong> - the number of suggestions | 1476       <p><strong># Suggestions</strong> - the number of suggestions | 
| 1445         sent to the client in the first notification, followed by a comma, | 1477         sent to the client in the first notification, followed by a comma, | 
| 1446         followed by the number of suggestions send to the client | 1478         followed by the number of suggestions send to the client | 
| 1447         in the last notification. If there is only one notification, | 1479         in the last notification. If there is only one notification, | 
| 1448         then there will be only one number in this column.'''); | 1480         then there will be only one number in this column.'''); | 
| 1449   } | 1481   } | 
| 1450 | 1482 | 
| 1451   /** | 1483   /** | 
|  | 1484    * Write the status of the diagnostic domain to the given [buffer]. | 
|  | 1485    */ | 
|  | 1486   void _writeDiagnosticStatus(StringBuffer buffer) { | 
|  | 1487     DiagnosticDomainHandler handler = | 
|  | 1488         new DiagnosticDomainHandler(_server.analysisServer); | 
|  | 1489 | 
|  | 1490     var request = new DiagnosticGetDiagnosticsParams().toRequest('0'); | 
|  | 1491 | 
|  | 1492     var stopwatch = new Stopwatch(); | 
|  | 1493     stopwatch.start(); | 
|  | 1494     var response = handler.handleRequest(request); | 
|  | 1495     stopwatch.stop(); | 
|  | 1496 | 
|  | 1497     int elapsedMs = stopwatch.elapsedMilliseconds; | 
|  | 1498     _diagnosticCallAverage.addSample(elapsedMs); | 
|  | 1499 | 
|  | 1500     buffer.write('<h3>Timing</h3>'); | 
|  | 1501 | 
|  | 1502     buffer.write('<p>'); | 
|  | 1503     buffer.write('getDiagnostic (last call): $elapsedMs (ms)'); | 
|  | 1504     buffer.write('<p>'); | 
|  | 1505     buffer.write('getDiagnostic (rolling average): ' | 
|  | 1506         '${_diagnosticCallAverage.value} (ms)'); | 
|  | 1507     buffer.write('<p> '); | 
|  | 1508 | 
|  | 1509     var json = response.toJson()[Response.RESULT]; | 
|  | 1510     List contexts = json['contexts']; | 
|  | 1511     for (var context in contexts) { | 
|  | 1512       buffer.write('<p>'); | 
|  | 1513       buffer.write('<h3>${context["name"]}</h3>'); | 
|  | 1514       buffer.write('<p>'); | 
|  | 1515       buffer.write('explicitFileCount: ${context["explicitFileCount"]}'); | 
|  | 1516       buffer.write('<p>'); | 
|  | 1517       buffer.write('implicitFileCount: ${context["implicitFileCount"]}'); | 
|  | 1518       buffer.write('<p>'); | 
|  | 1519       buffer.write('workItemQueueLength: ${context["workItemQueueLength"]}'); | 
|  | 1520       buffer.write('<p>'); | 
|  | 1521       buffer.write('workItemQueueLengthAverage: ' | 
|  | 1522           '${context["workItemQueueLengthAverage"]}'); | 
|  | 1523       buffer.write('<p> '); | 
|  | 1524     } | 
|  | 1525   } | 
|  | 1526 | 
|  | 1527   /** | 
| 1452    * Write the status of the edit domain (on the main status page) to the given | 1528    * Write the status of the edit domain (on the main status page) to the given | 
| 1453    * [buffer]. | 1529    * [buffer]. | 
| 1454    */ | 1530    */ | 
| 1455   void _writeEditStatus(StringBuffer buffer) { | 1531   void _writeEditStatus(StringBuffer buffer) { | 
| 1456     buffer.write('<h3>Edit Domain</h3>'); | 1532     buffer.write('<h3>Edit Domain</h3>'); | 
| 1457     _writeTwoColumns(buffer, (StringBuffer buffer) { | 1533     _writeTwoColumns(buffer, (StringBuffer buffer) { | 
| 1458       buffer.write('<p><b>Performance Data</b></p>'); | 1534       buffer.write('<p><b>Performance Data</b></p>'); | 
| 1459       buffer.write('<p>'); | 1535       buffer.write('<p>'); | 
| 1460       buffer.write(makeLink(COMPLETION_PATH, {}, 'Completion data')); | 1536       buffer.write(makeLink(COMPLETION_PATH, {}, 'Completion data')); | 
| 1461       buffer.write('</p>'); | 1537       buffer.write('</p>'); | 
| (...skipping 483 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1945    */ | 2021    */ | 
| 1946   static String makeLink( | 2022   static String makeLink( | 
| 1947       String path, Map<String, String> params, String innerHtml, | 2023       String path, Map<String, String> params, String innerHtml, | 
| 1948       [bool hasError = false]) { | 2024       [bool hasError = false]) { | 
| 1949     Uri uri = new Uri(path: path, queryParameters: params); | 2025     Uri uri = new Uri(path: path, queryParameters: params); | 
| 1950     String href = HTML_ESCAPE.convert(uri.toString()); | 2026     String href = HTML_ESCAPE.convert(uri.toString()); | 
| 1951     String classAttribute = hasError ? ' class="error"' : ''; | 2027     String classAttribute = hasError ? ' class="error"' : ''; | 
| 1952     return '<a href="$href"$classAttribute>$innerHtml</a>'; | 2028     return '<a href="$href"$classAttribute>$innerHtml</a>'; | 
| 1953   } | 2029   } | 
| 1954 } | 2030 } | 
| OLD | NEW | 
|---|