| // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file |
| // for details. All rights reserved. Use of this source code is governed by a |
| // BSD-style license that can be found in the LICENSE file. |
| |
| import 'dart:convert'; |
| |
| import 'package:analyzer/exception/exception.dart'; |
| import 'package:logging/logging.dart'; |
| |
| import 'input_converter.dart'; |
| import 'operation.dart'; |
| |
| const CONNECTED_MSG_FRAGMENT = ' <= {"event":"server.connected"'; |
| const RECEIVED_FRAGMENT = ' <= {'; |
| const SENT_FRAGMENT = ' => {'; |
| final int NINE = '9'.codeUnitAt(0); |
| final int ZERO = '0'.codeUnitAt(0); |
| |
| /// [LogFileInputConverter] converts a log file stream |
| /// into a series of operations to be sent to the analysis server. |
| class LogFileInputConverter extends CommonInputConverter { |
| LogFileInputConverter(super.tmpSrcDirPath, super.srcPathMap); |
| |
| @override |
| Operation? convert(String line) { |
| try { |
| var timeStampString = _parseTimeStamp(line); |
| var data = line.substring(timeStampString.length); |
| if (data.startsWith(RECEIVED_FRAGMENT)) { |
| var jsonData = asMap(json.decode(data.substring(4))); |
| if (jsonData.containsKey('event')) { |
| return convertNotification(jsonData); |
| } else { |
| return convertResponse(jsonData); |
| } |
| } else if (data.startsWith(SENT_FRAGMENT)) { |
| var jsonData = asMap(json.decode(data.substring(4))); |
| if (jsonData.containsKey('method')) { |
| return convertRequest(jsonData); |
| } |
| return null; |
| } |
| logger.log(Level.INFO, 'unknown input line: $line'); |
| return null; |
| } catch (e, s) { |
| throw AnalysisException( |
| 'Failed to parse line\n $line', CaughtException(e, s)); |
| } |
| } |
| |
| /// Determine if the given line is from an instrumentation file. |
| /// For example: |
| /// `1428347977499 <= {"event":"server.connected","params":{"version":"1.6.0"}}` |
| static bool isFormat(String line) { |
| var timeStampString = _parseTimeStamp(line); |
| var start = timeStampString.length; |
| var end = start + CONNECTED_MSG_FRAGMENT.length; |
| return (10 < start && end < line.length) && |
| line.substring(start, end) == CONNECTED_MSG_FRAGMENT; |
| } |
| |
| /// Parse the given line and return the millisecond timestamp or `null` |
| /// if it cannot be determined. |
| static String _parseTimeStamp(String line) { |
| var index = 0; |
| while (index < line.length) { |
| var code = line.codeUnitAt(index); |
| if (code < ZERO || NINE < code) { |
| return line.substring(0, index); |
| } |
| ++index; |
| } |
| return line; |
| } |
| } |