From b4e9f613b6b4d3a3a27c93b2ff6accd2e0ebfd06 Mon Sep 17 00:00:00 2001 From: Yaroslav Lepenkin Date: Wed, 17 May 2017 15:19:11 +0300 Subject: [PATCH] [stats-collector] composition instead of inheritance, refactoring --- .../events/completion/EventStreamValidator.kt | 45 +++++++++++++------ .../completion/EventStreamValidatorTest.kt | 10 ++--- .../stats/events/completion/ValidatorTest.kt | 37 ++++++++------- 3 files changed, 55 insertions(+), 37 deletions(-) diff --git a/plugins/stats-collector/log-events/src/com/intellij/stats/events/completion/EventStreamValidator.kt b/plugins/stats-collector/log-events/src/com/intellij/stats/events/completion/EventStreamValidator.kt index 6547d595be20..1a3e9d8591c1 100644 --- a/plugins/stats-collector/log-events/src/com/intellij/stats/events/completion/EventStreamValidator.kt +++ b/plugins/stats-collector/log-events/src/com/intellij/stats/events/completion/EventStreamValidator.kt @@ -15,6 +15,7 @@ */ package com.intellij.stats.events.completion + data class EventLine(val event: LogEvent?, val unknownLogEventFields: Set, val absentLogEventFields: Set, @@ -29,21 +30,37 @@ data class EventLine(val event: LogEvent?, get() = event != null && unknownLogEventFields.isEmpty() && absentLogEventFields.isEmpty() } -open class SessionsFilter { - private val output = mutableListOf() +interface SessionValidationResult { + fun addErrorSession(errorSession: List) + fun addValidSession(validSession: List) +} + + +open class SimpleSessionValidationResult: SessionValidationResult { private val error = mutableListOf() - - val outputLines: List - get() = output + private val valid = mutableListOf() val errorLines: List get() = error + val validLines: List + get() = valid + + override fun addErrorSession(errorSession: List) { + error.addAll(errorSession.map { it.originalLine }) + } + + override fun addValidSession(validSession: List) { + valid.addAll(validSession.map { it.originalLine }) + } +} + + +class InputSessionValidator(private val sessionValidationResult: SessionValidationResult) { fun filter(input: Iterable) { - var currentSession: String? = null - + var currentSessionUid: String? = null val session = mutableListOf() for (line in input) { @@ -52,13 +69,13 @@ open class SessionsFilter { val event = LogEventSerializer.fromString(line) val eventLine = EventLine(event, line) - if (eventLine.sessionUid == currentSession) { + if (eventLine.sessionUid == currentSessionUid) { session.add(eventLine) } else { processCompletionSession(session) session.clear() - currentSession = eventLine.sessionUid + currentSessionUid = eventLine.sessionUid session.add(eventLine) } } @@ -85,10 +102,12 @@ open class SessionsFilter { dumpSession(session, isValidSession) } - open protected fun dumpSession(session: List, isValidSession: Boolean) { - val writer = if (isValidSession) output else error - session.forEach { - writer.add(it.originalLine) + private fun dumpSession(session: List, isValidSession: Boolean) { + if (isValidSession) { + sessionValidationResult.addValidSession(session) + } + else { + sessionValidationResult.addErrorSession(session) } } diff --git a/plugins/stats-collector/log-events/test/com/intellij/stats/events/completion/EventStreamValidatorTest.kt b/plugins/stats-collector/log-events/test/com/intellij/stats/events/completion/EventStreamValidatorTest.kt index 0ee007e009a8..0ddeaae2bc37 100644 --- a/plugins/stats-collector/log-events/test/com/intellij/stats/events/completion/EventStreamValidatorTest.kt +++ b/plugins/stats-collector/log-events/test/com/intellij/stats/events/completion/EventStreamValidatorTest.kt @@ -72,12 +72,12 @@ class EventStreamValidatorTest { expectedOut: List, expectedErr: List) { val input: List = list.map { LogEventSerializer.toString(it) } - val separator = SessionsFilter() + val result = SimpleSessionValidationResult() + val separator = InputSessionValidator(result) separator.filter(input) - assertThat(separator.errorLines).isEqualTo(expectedErr) - assertThat(separator.outputLines).isEqualTo(expectedOut) + assertThat(result.errorLines).isEqualTo(expectedErr) + assertThat(result.validLines).isEqualTo(expectedOut) } -} - +} \ No newline at end of file diff --git a/plugins/stats-collector/log-events/test/com/intellij/stats/events/completion/ValidatorTest.kt b/plugins/stats-collector/log-events/test/com/intellij/stats/events/completion/ValidatorTest.kt index d93a27bf39c6..e1331151289e 100644 --- a/plugins/stats-collector/log-events/test/com/intellij/stats/events/completion/ValidatorTest.kt +++ b/plugins/stats-collector/log-events/test/com/intellij/stats/events/completion/ValidatorTest.kt @@ -7,11 +7,24 @@ import java.io.File class ValidatorTest { - lateinit var separator: SessionsFilter + lateinit var separator: InputSessionValidator + val sessionStatuses = hashMapOf() @Before fun setup() { - separator = SessionsFilter() + sessionStatuses.clear() + val result = object : SessionValidationResult { + override fun addErrorSession(errorSession: List) { + val sessionUid = errorSession.first().sessionUid ?: return + sessionStatuses[sessionUid] = false + } + + override fun addValidSession(validSession: List) { + val sessionUid = validSession.first().sessionUid ?: return + sessionStatuses[sessionUid] = true + } + } + separator = InputSessionValidator(result) } private fun file(path: String): File { @@ -21,25 +34,11 @@ class ValidatorTest { @Test fun testDataWithDeserializationErrors() { val file = file("data/validation_data") - val separator = TestSessionSeparator() separator.filter(file.readLines()) - val statuses = separator.sessionsStatus - assertThat(statuses["520198a29326"]).isFalse() - assertThat(statuses["620198a29326"]).isTrue() - assertThat(statuses["720198a29326"]).isFalse() - } - -} - - -class TestSessionSeparator : SessionsFilter() { - - val sessionsStatus = mutableMapOf() - - override fun dumpSession(session: List, isValidSession: Boolean) { - val sessionUid = session.first().event!!.sessionUid - sessionsStatus[sessionUid] = isValidSession + assertThat(sessionStatuses["520198a29326"]).isFalse() + assertThat(sessionStatuses["620198a29326"]).isTrue() + assertThat(sessionStatuses["720198a29326"]).isFalse() } } \ No newline at end of file