Skip to content

Commit

Permalink
Merge pull request #33 from JetBrains-Research/store-survey
Browse files Browse the repository at this point in the history
Store activity tracker key and survey info
  • Loading branch information
elena-lyulina authored Jul 30, 2020
2 parents f16d1d1 + c348788 commit 7f2414f
Show file tree
Hide file tree
Showing 11 changed files with 252 additions and 86 deletions.
1 change: 1 addition & 0 deletions build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ dependencies {
implementation("org.controlsfx:controlsfx:11.0.2")
compile("com.google.auto.service:auto-service:1.0-rc7")
implementation("org.eclipse.mylyn.github", "org.eclipse.egit.github.core", "2.1.5")
implementation("org.jetbrains.kotlinx:kotlinx-serialization-runtime-native:0.9.1")

testCompile("junit", "junit", "4.12")
}
Expand Down
19 changes: 2 additions & 17 deletions src/main/kotlin/org/jetbrains/research/ml/codetracker/Plugin.kt
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package org.jetbrains.research.ml.codetracker

import com.intellij.openapi.application.PathManager
import com.intellij.openapi.diagnostic.Logger
import org.jetbrains.research.ml.codetracker.server.TrackerQueryExecutor
import org.jetbrains.research.ml.codetracker.tracking.DocumentLogger
Expand All @@ -8,28 +9,12 @@ import org.jetbrains.research.ml.codetracker.tracking.TaskFileHandler

object Plugin {
const val PLUGIN_ID = "codetracker"
val codeTrackerFolderPath = "${PathManager.getPluginsPath()}/${PLUGIN_ID}"

private val logger: Logger = Logger.getInstance(javaClass)

init {
logger.info("$PLUGIN_ID: init plugin")
}

// fun stopTracking(): Boolean {
// logger.info("$PLUGIN_ID: close IDE")
// logger.info("$PLUGIN_ID: prepare fo sending ${DocumentLogger.getFiles().size} files")
// if (DocumentLogger.getFiles().isNotEmpty()) {
// DocumentLogger.logCurrentDocuments()
// DocumentLogger.flush()
// DocumentLogger.documentsToPrinters.forEach { (d, p) ->
// TrackerQueryExecutor.sendCodeTrackerData(
// p.file,
// { TrackerQueryExecutor.isLastSuccessful }
// ) { DocumentLogger.close(d, p) }
// }
// }
//// TaskFileHandler.stopTracking()
// return TrackerQueryExecutor.isLastSuccessful
// }

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package org.jetbrains.research.ml.codetracker.models

import kotlinx.serialization.Serializable

@Serializable
data class StoredInfo(
var loggedUIData: Map<String, String> = mapOf(),
var activityTrackerKey: String? = null
)
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,8 @@ data class TaskInfo(

@Serializable
data class Task(
val key: String,
override val key: String,
val id: Int = -1,
val infoTranslation: Map<PaneLanguage, TaskInfo>,
val examples: List<Example> = emptyList()
)
) : Keyed
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,21 @@ package org.jetbrains.research.ml.codetracker.models

import kotlinx.serialization.Serializable

interface Keyed {
val key: String
}

@Serializable
data class PaneLanguage(val key: String)
data class PaneLanguage(override val key: String) : Keyed

@Serializable
data class Gender(
val key: String,
override val key: String,
val translation: Map<PaneLanguage, String>
)
) : Keyed

@Serializable
data class Country(
val key: String,
override val key: String,
val translation: Map<PaneLanguage, String>
)
) : Keyed
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import okhttp3.Request
import okhttp3.RequestBody.Companion.asRequestBody
import okhttp3.RequestBody.Companion.toRequestBody
import okhttp3.Response
import org.jetbrains.research.ml.codetracker.tracking.StoredInfoWrapper
import java.io.File
import java.lang.IllegalStateException
import java.net.URL
Expand All @@ -24,7 +25,12 @@ object TrackerQueryExecutor : QueryExecutor() {
var activityTrackerKey: String? = null

init {
initActivityTrackerInfo()
StoredInfoWrapper.info.activityTrackerKey?.let {
activityTrackerKey = it
} ?: run {
initActivityTrackerInfo()
StoredInfoWrapper.updateStoredInfo(activityTrackerKey = activityTrackerKey)
}
}

private fun initActivityTrackerInfo() {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package org.jetbrains.research.ml.codetracker.tracking

import com.intellij.openapi.application.ApplicationManager
import com.intellij.openapi.application.PathManager
import com.intellij.openapi.diagnostic.Logger
import com.intellij.openapi.editor.Document
import com.intellij.openapi.fileEditor.FileDocumentManager
Expand All @@ -13,6 +12,7 @@ import com.intellij.util.messages.Topic
import org.apache.commons.csv.CSVFormat
import org.apache.commons.csv.CSVPrinter
import org.jetbrains.research.ml.codetracker.Plugin
import org.jetbrains.research.ml.codetracker.Plugin.codeTrackerFolderPath
import org.jetbrains.research.ml.codetracker.models.Task
import com.intellij.openapi.progress.Task as IntellijTask
import org.jetbrains.research.ml.codetracker.server.TrackerQueryExecutor
Expand Down Expand Up @@ -44,7 +44,6 @@ object DocumentLogger {
private val logger: Logger = Logger.getInstance(javaClass)
private val myDocumentsToPrinters: HashMap<Document, Printer> = HashMap()

private val folderPath = "${PathManager.getPluginsPath()}/codetracker/"
private const val MAX_FILE_SIZE = 50 * 1024 * 1024
private const val MAX_DIF_SIZE = 300

Expand Down Expand Up @@ -73,10 +72,10 @@ object DocumentLogger {


private fun createLogFile(document: Document): File {
File(folderPath).mkdirs()
File(codeTrackerFolderPath).mkdirs()
val file = FileDocumentManager.getInstance().getFile(document)
logger.info("${Plugin.PLUGIN_ID}: create log file for file ${file?.name}")
val logFile = File("$folderPath${file?.nameWithoutExtension}_${file.hashCode()}_${document.hashCode()}.csv")
val logFile = File("$codeTrackerFolderPath${file?.nameWithoutExtension}_${file.hashCode()}_${document.hashCode()}.csv")
FileUtil.createIfDoesntExist(logFile)
return logFile
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,11 +20,20 @@ abstract class LoggedData<T, S> {
}
}

enum class UiLoggedDataHeader(val header: String) {
AGE("age"),
GENDER("gender"),
PROGRAM_EXPERIENCE_YEARS("programExperienceYears"),
PROGRAM_EXPERIENCE_MONTHS("programExperienceMonths"),
COUNTRY("country"),
CHOSEN_TASK("chosenTask")
}

object UiLoggedData : LoggedData<Unit, String>() {

override val loggedDataGetters: List<LoggedDataGetter<Unit, String>> = arrayListOf(
LoggedDataGetter("age") { SurveyUiData.age.uiValue.toString() },
LoggedDataGetter("gender") {
LoggedDataGetter(UiLoggedDataHeader.AGE.header) { SurveyUiData.age.uiValue.toString() },
LoggedDataGetter(UiLoggedDataHeader.GENDER.header) {
// Todo: make it better: delete duplicates of code
val currentValue = SurveyUiData.gender.uiValue
if (!isDefaultValue(currentValue)) {
Expand All @@ -33,17 +42,17 @@ object UiLoggedData : LoggedData<Unit, String>() {
currentValue.toString()
}
},
LoggedDataGetter("programExperienceYears") { SurveyUiData.peYears.uiValue.toString() },
LoggedDataGetter("programExperienceMonths") { SurveyUiData.peMonths.uiValue.toString() },
LoggedDataGetter("country") {
LoggedDataGetter(UiLoggedDataHeader.PROGRAM_EXPERIENCE_YEARS.header) { SurveyUiData.peYears.uiValue.toString() },
LoggedDataGetter(UiLoggedDataHeader.PROGRAM_EXPERIENCE_MONTHS.header) { SurveyUiData.peMonths.uiValue.toString() },
LoggedDataGetter(UiLoggedDataHeader.COUNTRY.header) {
val currentValue = SurveyUiData.country.uiValue
if (!isDefaultValue(currentValue)) {
SurveyUiData.country.dataList[currentValue].key
} else {
currentValue.toString()
}
},
LoggedDataGetter("chosenTask") {
LoggedDataGetter(UiLoggedDataHeader.CHOSEN_TASK.header) {
val currentValue = TaskChoosingUiData.chosenTask.uiValue
if (!isDefaultValue(currentValue)) {
TaskChoosingUiData.chosenTask.dataList[currentValue].key
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
package org.jetbrains.research.ml.codetracker.tracking

import com.intellij.openapi.diagnostic.Logger
import kotlinx.serialization.json.Json
import kotlinx.serialization.json.JsonConfiguration
import org.jetbrains.research.ml.codetracker.Plugin.codeTrackerFolderPath
import org.jetbrains.research.ml.codetracker.models.Keyed
import org.jetbrains.research.ml.codetracker.models.StoredInfo
import java.io.File
import java.io.PrintWriter


object StoredInfoHandler{

val logger: Logger = Logger.getInstance(javaClass)

fun getIntStoredField(field: UiLoggedDataHeader, defaultValue: Int): Int {
return run{
val storedField = StoredInfoWrapper.info.loggedUIData[field.header]?.toIntOrNull()
logger.info("Stored field $storedField for the ${field.header} value has been received successfully")
storedField
} ?: run {
logger.info("Default value $defaultValue for the ${field.header} value has been received successfully")
defaultValue
}
}

fun <T : Keyed> getIndexByStoredKey(field: UiLoggedDataHeader, list: List<T>, defaultValue: Int): Int {
StoredInfoWrapper.info.loggedUIData[field.header]?.let { storedKey ->
val storedKeyIndex = list.indexOfFirst { it.key == storedKey }
logger.info("Stored index $storedKeyIndex for the ${field.header} value has been received successfully")
return storedKeyIndex
}
logger.info("Default value $defaultValue for the ${field.header} value has been received successfully")
return defaultValue
}
}

/*
This class provides storing survey info and activity tracker key
*/
object StoredInfoWrapper {

private const val storedInfoFileName = "storedInfo.txt"
private val storedInfoFilePath = "${codeTrackerFolderPath}/$storedInfoFileName"
private val json by lazy {
Json(JsonConfiguration.Stable)
}
private val serializer = StoredInfo.serializer()

var info: StoredInfo = readStoredInfo()

private fun readStoredInfo(): StoredInfo {
val file = File(storedInfoFilePath)
if (!file.exists()) {
return StoredInfo()
}
return json.parse(serializer, file.readText())
}

fun updateStoredInfo(surveyInfo: Map<String, String>? = null,
activityTrackerKey: String? = null) {
surveyInfo?.let{ info.loggedUIData = it }
activityTrackerKey?.let{ info.activityTrackerKey = it }
writeStoredInfo()
}

private fun writeStoredInfo() {
val file = File(storedInfoFilePath)
val writer = PrintWriter(file)
writer.print(json.stringify(serializer, info))
writer.close()
}
}
Loading

0 comments on commit 7f2414f

Please sign in to comment.