Skip to content

Commit

Permalink
Merge common code and prepare for LCI/LCIA distinction in menu.
Browse files Browse the repository at this point in the history
  • Loading branch information
jedesroches committed Jul 25, 2023
1 parent 632aabb commit 31291c0
Show file tree
Hide file tree
Showing 12 changed files with 104 additions and 81 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,8 @@ import ch.kleis.lcaplugin.MyBundle
import ch.kleis.lcaplugin.ide.imports.ImportHandler
import ch.kleis.lcaplugin.ide.imports.LcaImportDialog
import ch.kleis.lcaplugin.imports.Importer
import ch.kleis.lcaplugin.imports.ecospold.lcia.EcospoldImporter
import ch.kleis.lcaplugin.imports.ecospold.EcospoldImporter
import ch.kleis.lcaplugin.imports.ecospold.EcospoldLibraryType
import com.intellij.BundleBase
import com.intellij.ide.IdeBundle
import com.intellij.openapi.diagnostic.Logger
Expand Down Expand Up @@ -40,6 +41,9 @@ class EcospoldImportSettingsPanel(private val settings: EcospoldImportSettings)
private val methodNameModel = DefaultComboBoxModel<String>()
private val warning = JBLabel()

// FIXME
private val libType: EcospoldLibraryType = EcospoldLibraryType.LCIA

init {
val builder = FormBuilder()
val locComp = createLocationComponent()
Expand All @@ -56,9 +60,21 @@ class EcospoldImportSettingsPanel(private val settings: EcospoldImportSettings)
BorderLayout.WEST
)
builder.addLabeledComponent(warningLabelled.label, warningLabelled.component)

val methodLabelled = createMethodComponent()
methodNameField = methodLabelled.component
builder.addLabeledComponent(methodLabelled.label, methodLabelled.component)

when (libType) {
EcospoldLibraryType.LCIA -> {
builder.addLabeledComponent(methodLabelled.label, methodLabelled.component)
}

EcospoldLibraryType.LCI -> {
// TODO: add component letting user choose the substance mapping
}
}


builder.addComponent(
CheckBoxWithDescription(
JBCheckBox(
Expand Down Expand Up @@ -91,7 +107,7 @@ class EcospoldImportSettingsPanel(private val settings: EcospoldImportSettings)

private fun updateMethodModelFromLib() {
val file = Path.of(settings.libraryFile)
if (file.isRegularFile() && file.exists()) {
if (file.exists() && file.isRegularFile()) {
val names = EcospoldImporter.getMethodNames(file.toString())
methodNameModel.removeAllElements()
methodNameModel.addAll(names)
Expand Down
2 changes: 1 addition & 1 deletion src/main/kotlin/ch/kleis/lcaplugin/imports/Importer.kt
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package ch.kleis.lcaplugin.imports

import ch.kleis.lcaplugin.imports.ecospold.lcia.EcospoldImporter
import ch.kleis.lcaplugin.imports.ecospold.EcospoldImporter
import ch.kleis.lcaplugin.imports.util.AsyncTaskController
import ch.kleis.lcaplugin.imports.util.AsynchronousWatcher
import ch.kleis.lcaplugin.imports.util.ImportInterruptedException
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ package ch.kleis.lcaplugin.imports.ecospold

import ch.kleis.lcaplugin.core.lang.expression.SubstanceType
import ch.kleis.lcaplugin.imports.ModelWriter
import ch.kleis.lcaplugin.imports.ecospold.lcia.EcospoldImporter.Companion.unitToStr
import ch.kleis.lcaplugin.imports.ecospold.EcospoldImporter.Companion.unitToStr
import ch.kleis.lcaplugin.imports.ecospold.model.ActivityDataset
import ch.kleis.lcaplugin.imports.ecospold.model.ElementaryExchange
import ch.kleis.lcaplugin.imports.ecospold.model.IntermediateExchange
Expand All @@ -14,7 +14,7 @@ import ch.kleis.lcaplugin.imports.model.ImportedProductExchange
import ch.kleis.lcaplugin.imports.simapro.sanitizeSymbol
import ch.kleis.lcaplugin.imports.util.ImportException

open class EcoSpold2ProcessMapper(val process: ActivityDataset) {
open class EcoSpoldProcessMapper(val process: ActivityDataset) {
val pUid = uid(process)
val result = ImportedProcess(pUid)

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package ch.kleis.lcaplugin.imports.ecospold.lcia
package ch.kleis.lcaplugin.imports.ecospold

import ch.kleis.lcaplugin.core.lang.evaluator.toUnitValue
import ch.kleis.lcaplugin.core.prelude.Prelude
Expand Down Expand Up @@ -51,7 +51,7 @@ class EcospoldImporter(private val settings: EcospoldImportSettings, private val

private var totalValue = 1
private var currentValue = 0
private val processRenderer = Ecospold2ProcessRenderer()
private val processRenderer = EcospoldProcessRenderer()
private val predefinedUnits = Prelude.unitMap.values
.map { it.toUnitValue() }
.associateBy { it.symbol.toString() }
Expand Down Expand Up @@ -136,10 +136,10 @@ class EcospoldImporter(private val settings: EcospoldImportSettings, private val

private fun renderMain(writer: ModelWriter, nbUnits: Int, nbProcess: Int, methodName: String, duration: Duration) {
val s = duration.seconds
val durAsStr = String.format("%02dm %02ds", s / 60, (s % 60));
val durAsStr = String.format("%02dm %02ds", s / 60, (s % 60))
val block = """
Import Method: $methodName
Date: ${ZonedDateTime.now().toString()}
Date: ${ZonedDateTime.now()}
Import Summary:
* $nbUnits units
* $nbProcess processes
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package ch.kleis.lcaplugin.imports.ecospold

enum class EcospoldLibraryType {
LCI, LCIA
}
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
package ch.kleis.lcaplugin.imports.ecospold.lcia
package ch.kleis.lcaplugin.imports.ecospold

import ch.kleis.lcaplugin.imports.ModelWriter
import ch.kleis.lcaplugin.imports.ecospold.EcoSpold2ProcessMapper
import ch.kleis.lcaplugin.imports.ecospold.lcia.EcospoldImporter.ProcessDictRecord
import ch.kleis.lcaplugin.imports.ecospold.EcospoldImporter.ProcessDictRecord
import ch.kleis.lcaplugin.imports.ecospold.lcia.EcoSpoldSubstanceMapper
import ch.kleis.lcaplugin.imports.ecospold.model.ActivityDataset
import ch.kleis.lcaplugin.imports.shared.serializer.ProcessSerializer
import ch.kleis.lcaplugin.imports.shared.serializer.SubstanceSerializer
import java.io.File

class Ecospold2ProcessRenderer {
class EcospoldProcessRenderer {

var nbProcesses: Int = 0
private set
Expand All @@ -20,28 +20,28 @@ class Ecospold2ProcessRenderer {
val category = category(data)

val subFolder = if (category == null) "" else "${category}${File.separatorChar}"
val process = EcoSpold2ProcessMapper(data).map()
val process = EcoSpoldProcessMapper(data).map()
process.comments.add(processComment)
val strProcess = ProcessSerializer.serialize(process)

w.write(
"processes${File.separatorChar}$subFolder${process.uid}.lca",
strProcess, index = false, closeAfterWrite = false
"processes${File.separatorChar}$subFolder${process.uid}.lca",
strProcess, index = false, closeAfterWrite = false
)
val substance = EcoSpold2SubstanceMapper.map(data, methodName)
val substance = EcoSpoldSubstanceMapper.map(data, methodName)
val strSubstance = SubstanceSerializer.serialize(substance)
w.write(
"processes${File.separatorChar}$subFolder${process.uid}.lca",
strSubstance, index = false, closeAfterWrite = true
"processes${File.separatorChar}$subFolder${process.uid}.lca",
strSubstance, index = false, closeAfterWrite = true
)


}

private fun category(data: ActivityDataset): String? {
val desc = data.description.classifications
.firstOrNull { it.system == "EcoSpold01Categories" }
?.value
.firstOrNull { it.system == "EcoSpold01Categories" }
?.value
return desc?.let { ModelWriter.sanitizeAndCompact(it) }
}

Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package ch.kleis.lcaplugin.imports.ecospold.lcia

import ch.kleis.lcaplugin.imports.ecospold.EcoSpoldProcessMapper
import ch.kleis.lcaplugin.imports.ecospold.model.ActivityDataset
import ch.kleis.lcaplugin.imports.model.ImportedImpact
import ch.kleis.lcaplugin.imports.model.ImportedSubstance

// Jo: AFAIK, this is only used because of the virtual substance required by #261. Remove after close.
class EcoSpoldSubstanceMapper {
companion object {
fun map(process: ActivityDataset, methodName: String): ImportedSubstance {

val pName = process.description.activity.name
val meta = mutableMapOf<String, String?>(
"methodName" to methodName,
"geography" to (process.description.geography?.shortName ?: "")
)
val pUid = EcoSpoldProcessMapper.uid(process)
val impacts = process.flowData.impactIndicators
.filter { it.methodName == methodName }
.map {
ImportedImpact(
it.amount,
it.unitName,
it.categoryName,
it.name
)
}.toMutableList()

return ImportedSubstance(pName, "Emission", "u", "", meta = meta, pUid = pUid, impacts = impacts)
}
}

}
6 changes: 3 additions & 3 deletions src/main/resources/messages/MyBundle.properties
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
name=My Plugin
applicationService=Application service
lca.dialog.import.simapro.title=Import Simapro Library
lca.dialog.import.ecospold.title=Import EcoSpold2 LCIA Library
lca.dialog.import.ecospold.warning=The file doesn't contain the string 'lcia', are you sure it's a valid LCIA file ?
lca.dialog.import.ecospold.title=Import EcoSpold2 LCI/LCIA Library
lca.dialog.import.ecospold.warning=The file doesn't contain the string 'lcia', are you sure it's a valid LCIA file ?
lca.dialog.import.ecospold.method=Method name
lca.dialog.import.root.folder.label=Root Folder
lca.dialog.import.root.folder.desc=Root folder to import all library files
Expand All @@ -11,7 +11,7 @@ lca.dialog.import.library.file.desc=Library file to import
lca.dialog.import.library.file.error=Invalid library file, please select a valid one
lca.dialog.import.field.mandatory.error=This field is mandatory, please select an option
lca.dialog.import.package.label=&Root package
lca.dialog.import.package.error=Invalid package name, please define a valid one ( letters and numbers only, not starting with a letter)
lca.dialog.import.package.error=Invalid package name, please define a valid one ( letters and numbers only, not starting with a letter)
lca.dialog.import.units.label=Import &Units
lca.dialog.import.units.desc=Create missing units in a dedicated file and package
lca.dialog.import.processes.label=Import &Processes
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
package ch.kleis.lcaplugin.imports.ecospold.lcia

import ch.kleis.lcaplugin.imports.ecospold.EcoSpold2ProcessMapper
import ch.kleis.lcaplugin.imports.ecospold.EcoSpoldProcessMapper
import ch.kleis.lcaplugin.imports.ecospold.model.ActivityDataset
import ch.kleis.lcaplugin.imports.util.ImportException
import com.intellij.testFramework.UsefulTestCase.assertThrows
import org.junit.Test
import kotlin.test.assertEquals
import kotlin.test.assertNull

class EcoSpold2ProcessMapperTest {
class EcoSpoldProcessMapperTest {

private val sub: ActivityDataset = EcoSpold2Fixture.buildData()

Expand All @@ -17,7 +17,7 @@ class EcoSpold2ProcessMapperTest {
// Given

// When
val result = EcoSpold2ProcessMapper(sub).map()
val result = EcoSpoldProcessMapper(sub).map()

// Then
assertEquals("aname_ch", result.uid)
Expand All @@ -36,7 +36,7 @@ class EcoSpold2ProcessMapperTest {
// Given

// When
val result = EcoSpold2ProcessMapper(sub).map()
val result = EcoSpoldProcessMapper(sub).map()

// Then
assertEquals(1, result.productBlocks.size)
Expand All @@ -48,12 +48,12 @@ class EcoSpold2ProcessMapperTest {
assertEquals("km", p.unit)
assertEquals(100.0, p.allocation)
assertEquals(
listOf(
"pName",
"PSystem = PValue",
"// uncertainty: logNormal mean=1.2, variance=2.3, mu=3.4",
"synonym_0 = p1"
), p.comments
listOf(
"pName",
"PSystem = PValue",
"// uncertainty: logNormal mean=1.2, variance=2.3, mu=3.4",
"synonym_0 = p1"
), p.comments
)

}
Expand All @@ -65,17 +65,17 @@ class EcoSpold2ProcessMapperTest {

// When
assertThrows(
ImportException::class.java,
"Invalid outputGroup for product, expected 0, found 1"
) { EcoSpold2ProcessMapper(falseSub).map() }
ImportException::class.java,
"Invalid outputGroup for product, expected 0, found 1"
) { EcoSpoldProcessMapper(falseSub).map() }
}

@Test
fun map_ShouldReturn_AnEmissionWithSameName() {
// Given

// When
val result = EcoSpold2ProcessMapper(sub).map()
val result = EcoSpoldProcessMapper(sub).map()

// Then
assertEquals(2, result.emissionBlocks.size)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,15 @@ import org.junit.Test
import kotlin.test.assertEquals
import kotlin.test.assertNull

class EcoSpold2SubstanceMapperTest {
class EcoSpoldSubstanceMapperTest {

@Test
fun map_ShouldMapSubstance_WithTheRightMethod() {
// Given
val sub = EcoSpold2Fixture.buildData()

// When
val result = EcoSpold2SubstanceMapper.map(sub, "EF v3.1")
val result = EcoSpoldSubstanceMapper.map(sub, "EF v3.1")

// Then
assertEquals("aName", result.name)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
package ch.kleis.lcaplugin.imports.ecospold.lcia

import ch.kleis.lcaplugin.imports.ModelWriter
import ch.kleis.lcaplugin.imports.ecospold.EcoSpold2ProcessMapper
import ch.kleis.lcaplugin.imports.ecospold.EcoSpoldProcessMapper
import ch.kleis.lcaplugin.imports.ecospold.EcospoldProcessRenderer
import ch.kleis.lcaplugin.imports.ecospold.model.ActivityDataset
import ch.kleis.lcaplugin.imports.ecospold.model.Classification
import ch.kleis.lcaplugin.imports.model.ImportedProcess
Expand All @@ -14,7 +15,7 @@ import org.junit.Before
import kotlin.test.assertEquals


class Ecospold2ProcessRendererTest {
class EcospoldProcessRendererTest {
private val writer = mockk<ModelWriter>()

@Before
Expand All @@ -34,21 +35,21 @@ class Ecospold2ProcessRendererTest {
every { activity.description.activity.name } returns "pName"
every { activity.description.geography?.shortName } returns "ch"
every { activity.description.classifications } returns listOf(Classification("EcoSpold01Categories", "cat"))
mockkObject(EcoSpold2ProcessMapper)
mockkObject(EcoSpoldProcessMapper)
val importedProcess = mockk<ImportedProcess>()
every { EcoSpold2ProcessMapper(activity).map() } returns importedProcess
every { EcoSpoldProcessMapper(activity).map() } returns importedProcess
val comments = mutableListOf<String>()
every { importedProcess.comments } returns comments
every { importedProcess.uid } returns "uid"
mockkObject(ProcessSerializer)
every { ProcessSerializer.serialize(importedProcess) } returns "serialized process"

mockkObject(EcoSpold2SubstanceMapper)
mockkObject(EcoSpoldSubstanceMapper)
val importedSubstance = mockk<ImportedSubstance>()
every { EcoSpold2SubstanceMapper.map(activity, "EF v3.1") } returns importedSubstance
every { EcoSpoldSubstanceMapper.map(activity, "EF v3.1") } returns importedSubstance
mockkObject(SubstanceSerializer)
every { SubstanceSerializer.serialize(importedSubstance) } returns "serialized substance"
val sut = Ecospold2ProcessRenderer()
val sut = EcospoldProcessRenderer()

// When
sut.render(activity, writer, "a comment", "EF v3.1")
Expand Down

0 comments on commit 31291c0

Please sign in to comment.