diff --git a/.scalafmt.conf b/.scalafmt.conf new file mode 100644 index 00000000..feca38af --- /dev/null +++ b/.scalafmt.conf @@ -0,0 +1,7 @@ +version = 3.8.1 +runner.dialect = scala3 + +rewrite.scala3.convertToNewSyntax = true +rewrite.scala3.removeOptionalBraces = no + +rewrite.rules = [] diff --git a/CHANGELOG.md b/CHANGELOG.md index 48347d22..47956f7c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Fixed Version Check logic for Dependabot PRs [#330](https://github.com/ie3-institute/simBench2psdm/issues/330) - Removed Jenkins Pipeline. Now using GitHub Actions [#328](https://github.com/ie3-institute/simBench2psdm/issues/328) - Switch to Java 21 [#343](https://github.com/ie3-institute/simBench2psdm/issues/343) +- Updated to `scala3` [#313](https://github.com/ie3-institute/simBench2psdm/issues/313) ## [1.0.0] - 2021-08-03 ### Added diff --git a/build.gradle b/build.gradle index 875f4420..cf36eae6 100644 --- a/build.gradle +++ b/build.gradle @@ -17,8 +17,8 @@ ext { //version (changing these should be considered thoroughly!) javaVersion = JavaVersion.VERSION_21 - scalaVersion = '2.13' - scalaBinaryVersion = '2.13.17' + scalaVersion = '3' + scalaBinaryVersion = '3.7.0' tscfgVersion = '1.2.5' slf4jVersion = '2.0.17' @@ -57,7 +57,7 @@ dependencies { } /* util functions */ - implementation('com.github.ie3-institute:PowerSystemUtils:2.2.1') { + implementation('com.github.ie3-institute:PowerSystemUtils:3.1.0') { exclude group: 'org.apache.logging.log4j' exclude group: 'org.slf4j' /* Exclude our own nested dependencies */ @@ -80,8 +80,8 @@ dependencies { // NEW scala libs // // CORE Scala // - implementation "org.scala-lang:scala-library:$scalaBinaryVersion" - implementation 'org.scala-lang.modules:scala-parallel-collections_2.13:1.2.0' + implementation "org.scala-lang:scala3-library_3:$scalaBinaryVersion" + implementation "org.scala-lang.modules:scala-parallel-collections_$scalaVersion:1.2.0" // TEST Scala // testImplementation "org.scalatest:scalatest_${scalaVersion}:3.2.19" @@ -91,7 +91,7 @@ dependencies { // config // implementation 'com.typesafe:config:+' - implementation "com.github.carueda:tscfg_2.13:${tscfgVersion}" + implementation "com.github.carueda:tscfg_$scalaVersion:${tscfgVersion}" // cmd args parser // implementation "com.github.scopt:scopt_${scalaVersion}:+" diff --git a/gradle/scripts/spotless.gradle b/gradle/scripts/spotless.gradle index 605bca39..76efe7e6 100644 --- a/gradle/scripts/spotless.gradle +++ b/gradle/scripts/spotless.gradle @@ -14,7 +14,7 @@ spotless { //sets a license header, removes unused imports and formats conforming to the scala fmt formatter scala { - scalafmt() + scalafmt().configFile('.scalafmt.conf') } /* cf. https://github.com/diffplug/spotless/tree/master/plugin-gradle */ diff --git a/src/main/scala/edu/ie3/simbench/config/ArgsParser.scala b/src/main/scala/edu/ie3/simbench/config/ArgsParser.scala index 063d9350..9337306a 100644 --- a/src/main/scala/edu/ie3/simbench/config/ArgsParser.scala +++ b/src/main/scala/edu/ie3/simbench/config/ArgsParser.scala @@ -3,8 +3,8 @@ package edu.ie3.simbench.config import java.io.File import java.nio.file.Paths -import com.typesafe.config.{ConfigFactory, Config => TypesafeConfig} -import scopt.{OptionParser => scoptOptionParser} +import com.typesafe.config.{ConfigFactory, Config as TypesafeConfig} +import scopt.OptionParser as scoptOptionParser object ArgsParser { // case class for allowed arguments @@ -24,11 +24,11 @@ object ArgsParser { ) }) .validate(value => - if (value.trim.isEmpty) failure("config location cannot be empty") + if value.trim.isEmpty then failure("config location cannot be empty") else success ) .validate(value => - if (value.contains("\\")) + if value.contains("\\") then failure("wrong config path, expected: /, found: \\") else success ) @@ -48,7 +48,7 @@ object ArgsParser { private def parseTypesafeConfig(fileName: String): TypesafeConfig = { val file = Paths.get(fileName).toFile - if (!file.exists()) + if !file.exists() then throw new Exception(s"Missing config file on path $fileName") parseTypesafeConfig(file) } diff --git a/src/main/scala/edu/ie3/simbench/config/ConfigValidator.scala b/src/main/scala/edu/ie3/simbench/config/ConfigValidator.scala index 9ce76698..7eb2554c 100644 --- a/src/main/scala/edu/ie3/simbench/config/ConfigValidator.scala +++ b/src/main/scala/edu/ie3/simbench/config/ConfigValidator.scala @@ -47,7 +47,7 @@ case object ConfigValidator { */ @throws[CodeValidationException] private def checkSimbenchCodes(codes: List[java.lang.String]): Unit = { - for (code <- codes) { + for code <- codes do { SimbenchCode.isValid(code) match { case Success(_) => case Failure(exception) => throw exception diff --git a/src/main/scala/edu/ie3/simbench/config/SimbenchConfig.scala b/src/main/scala/edu/ie3/simbench/config/SimbenchConfig.scala index 19b59cf6..15b81754 100644 --- a/src/main/scala/edu/ie3/simbench/config/SimbenchConfig.scala +++ b/src/main/scala/edu/ie3/simbench/config/SimbenchConfig.scala @@ -26,13 +26,13 @@ object SimbenchConfig { "directoryHierarchy" ), fileEncoding = - if (c.hasPathOrNull("fileEncoding")) c.getString("fileEncoding") + if c.hasPathOrNull("fileEncoding") then c.getString("fileEncoding") else "UTF-8", fileEnding = - if (c.hasPathOrNull("fileEnding")) c.getString("fileEnding") + if c.hasPathOrNull("fileEnding") then c.getString("fileEnding") else ".csv", separator = - if (c.hasPathOrNull("separator")) c.getString("separator") else ";" + if c.hasPathOrNull("separator") then c.getString("separator") else ";" ) } } @@ -78,14 +78,14 @@ object SimbenchConfig { ): SimbenchConfig.Io.Input.Download = { SimbenchConfig.Io.Input.Download( baseUrl = - if (c.hasPathOrNull("baseUrl")) c.getString("baseUrl") + if c.hasPathOrNull("baseUrl") then c.getString("baseUrl") else "https://daks.uni-kassel.de/bitstreams", failOnExistingFiles = c.hasPathOrNull("failOnExistingFiles") && c.getBoolean( "failOnExistingFiles" ), directory = - if (c.hasPathOrNull("folder")) c.getString("folder") + if c.hasPathOrNull("folder") then c.getString("folder") else "inputData/download/" ) } @@ -98,13 +98,13 @@ object SimbenchConfig { ): SimbenchConfig.Io.Input = { SimbenchConfig.Io.Input( csv = SimbenchConfig.CsvConfig( - if (c.hasPathOrNull("csv")) c.getConfig("csv") + if c.hasPathOrNull("csv") then c.getConfig("csv") else com.typesafe.config.ConfigFactory.parseString("csv{}"), parentPath + "csv.", $tsCfgValidator ), download = SimbenchConfig.Io.Input.Download( - if (c.hasPathOrNull("download")) c.getConfig("download") + if c.hasPathOrNull("download") then c.getConfig("download") else com.typesafe.config.ConfigFactory.parseString("download{}"), parentPath + "download.", $tsCfgValidator @@ -127,13 +127,13 @@ object SimbenchConfig { SimbenchConfig.Io.Output( compress = !c.hasPathOrNull("compress") || c.getBoolean("compress"), csv = SimbenchConfig.CsvConfig( - if (c.hasPathOrNull("csv")) c.getConfig("csv") + if c.hasPathOrNull("csv") then c.getConfig("csv") else com.typesafe.config.ConfigFactory.parseString("csv{}"), parentPath + "csv.", $tsCfgValidator ), targetDir = - if (c.hasPathOrNull("targetFolder")) c.getString("targetFolder") + if c.hasPathOrNull("targetFolder") then c.getString("targetFolder") else "convertedData" ) } @@ -146,13 +146,13 @@ object SimbenchConfig { ): SimbenchConfig.Io = { SimbenchConfig.Io( input = SimbenchConfig.Io.Input( - if (c.hasPathOrNull("input")) c.getConfig("input") + if c.hasPathOrNull("input") then c.getConfig("input") else com.typesafe.config.ConfigFactory.parseString("input{}"), parentPath + "input.", $tsCfgValidator ), output = SimbenchConfig.Io.Output( - if (c.hasPathOrNull("output")) c.getConfig("output") + if c.hasPathOrNull("output") then c.getConfig("output") else com.typesafe.config.ConfigFactory.parseString("output{}"), parentPath + "output.", $tsCfgValidator @@ -168,13 +168,13 @@ object SimbenchConfig { val parentPath: java.lang.String = "" val $result = SimbenchConfig( conversion = SimbenchConfig.Conversion( - if (c.hasPathOrNull("conversion")) c.getConfig("conversion") + if c.hasPathOrNull("conversion") then c.getConfig("conversion") else com.typesafe.config.ConfigFactory.parseString("conversion{}"), parentPath + "conversion.", $tsCfgValidator ), io = SimbenchConfig.Io( - if (c.hasPathOrNull("io")) c.getConfig("io") + if c.hasPathOrNull("io") then c.getConfig("io") else com.typesafe.config.ConfigFactory.parseString("io{}"), parentPath + "io.", $tsCfgValidator @@ -189,7 +189,7 @@ object SimbenchConfig { parentPath: java.lang.String, $tsCfgValidator: $TsCfgValidator ): scala.List[java.lang.String] = { - import scala.jdk.CollectionConverters._ + import scala.jdk.CollectionConverters.* cl.asScala.map(cv => $_str(cv)).toList } private def $_expE( @@ -200,7 +200,7 @@ object SimbenchConfig { new java.lang.RuntimeException( s"${cv.origin.lineNumber}: " + "expecting: " + exp + " got: " + - (if (u.isInstanceOf[java.lang.String]) "\"" + u + "\"" else u) + (if u.isInstanceOf[java.lang.String] then "\"" + u + "\"" else u) ) } @@ -208,7 +208,7 @@ object SimbenchConfig { java.lang.String.valueOf(cv.unwrapped()) } - private final class $TsCfgValidator { + final class $TsCfgValidator { private val badPaths = scala.collection.mutable.ArrayBuffer[java.lang.String]() @@ -228,7 +228,7 @@ object SimbenchConfig { } def validate(): Unit = { - if (badPaths.nonEmpty) { + if badPaths.nonEmpty then { throw new com.typesafe.config.ConfigException( badPaths.mkString("Invalid configuration:\n ", "\n ", "") ) {} diff --git a/src/main/scala/edu/ie3/simbench/convert/CoordinateConverter.scala b/src/main/scala/edu/ie3/simbench/convert/CoordinateConverter.scala index f136644f..37e96a45 100644 --- a/src/main/scala/edu/ie3/simbench/convert/CoordinateConverter.scala +++ b/src/main/scala/edu/ie3/simbench/convert/CoordinateConverter.scala @@ -3,7 +3,7 @@ package edu.ie3.simbench.convert import edu.ie3.datamodel.models.input.NodeInput import edu.ie3.simbench.model.datamodel.Coordinate import edu.ie3.util.geo.GeoUtils -import org.locationtech.jts.geom.{Point, Coordinate => JTSCoordinate} +import org.locationtech.jts.geom.{Point, Coordinate as JTSCoordinate} /** Converts a SimBench coordinate to the needed geometry position of * PowerSystemDataModel diff --git a/src/main/scala/edu/ie3/simbench/convert/GridConverter.scala b/src/main/scala/edu/ie3/simbench/convert/GridConverter.scala index c8be6f83..3e180c44 100644 --- a/src/main/scala/edu/ie3/simbench/convert/GridConverter.scala +++ b/src/main/scala/edu/ie3/simbench/convert/GridConverter.scala @@ -20,7 +20,7 @@ import edu.ie3.datamodel.models.input.graphics.{ LineGraphicInput, NodeGraphicInput } -import edu.ie3.datamodel.models.input.system._ +import edu.ie3.datamodel.models.input.system.* import edu.ie3.datamodel.models.result.NodeResult import edu.ie3.datamodel.models.timeseries.individual.IndividualTimeSeries import edu.ie3.datamodel.models.value.{PValue, SValue} @@ -33,11 +33,11 @@ import edu.ie3.simbench.convert.types.{ Transformer2wTypeConverter } import edu.ie3.simbench.exception.ConversionException -import edu.ie3.simbench.model.datamodel._ +import edu.ie3.simbench.model.datamodel.* import scala.annotation.tailrec -import scala.collection.parallel.CollectionConverters._ -import scala.jdk.CollectionConverters._ +import scala.collection.parallel.CollectionConverters.* +import scala.jdk.CollectionConverters.* case object GridConverter extends LazyLogging { @@ -61,7 +61,7 @@ case object GridConverter extends LazyLogging { removeSwitches: Boolean ): ( JointGridContainer, - Set[IndividualTimeSeries[_ <: PValue]], + Set[IndividualTimeSeries[? <: PValue]], Seq[MappingEntry], Vector[NodeResult] ) = { @@ -130,11 +130,10 @@ case object GridConverter extends LazyLogging { gridInput.lines, subnetConverter ) - val joinOverrides = if (removeSwitches) { + val joinOverrides = if removeSwitches then { /* If switches are meant to be removed, join all nodes at closed switches */ determineJoinOverrides(gridInput.switches, slackNodeKeys) - } else - Vector.empty + } else Vector.empty val nodeConversion = convertNodes( @@ -156,10 +155,9 @@ case object GridConverter extends LazyLogging { "Creation of three winding transformers is not yet implemented." ) val switches = - if (!removeSwitches) + if !removeSwitches then SwitchConverter.convert(gridInput.switches, nodeConversion).toSet.asJava - else - Set.empty[SwitchInput].asJava + else Set.empty[SwitchInput].asJava val measurements = MeasurementConverter .convert(gridInput.measurements, nodeConversion) .toSet @@ -284,8 +282,7 @@ case object GridConverter extends LazyLogging { ): Vector[SubnetOverride] = { /* If the start node is among the junctions, do not travel further (Attention: Start node should not be among * junctions when the traversing starts, otherwise nothing will happen at all.) */ - if (junctions.contains(startNode)) - return overrides + if junctions.contains(startNode) then return overrides /* Get all switches, that are connected to the current starting point. If the other end of the switch is a junction, * don't follow this path, as the other side wouldn't be touched anyways. */ @@ -297,7 +294,7 @@ case object GridConverter extends LazyLogging { case _ => false } - if (nextSwitches.isEmpty) { + if nextSwitches.isEmpty then { /* There is no further switch, therefore the end is reached -> return the new mapping. Please note, as the subnet * of the current node is only altered, if there is a next switch available, dead end nodes are not altered. */ overrides @@ -585,7 +582,7 @@ case object GridConverter extends LazyLogging { branchNodes.contains(convertedNode) } match { case (connectedNodes, unconnectedNodes) => - if (unconnectedNodes.nonEmpty) + if unconnectedNodes.nonEmpty then logger.warn( "The nodes with following keys are not part of any branch (aka. isolated) and will be neglected in the sequel.\n\t{}", unconnectedNodes.map(_._1.getKey).mkString("\n\t") @@ -610,7 +607,7 @@ case object GridConverter extends LazyLogging { nodeConversion: Map[Node, NodeInput] ): ( SystemParticipants, - Set[IndividualTimeSeries[_ <: PValue]], + Set[IndividualTimeSeries[? <: PValue]], Seq[MappingEntry] ) = { /* Convert all participant groups */ @@ -640,7 +637,7 @@ case object GridConverter extends LazyLogging { timeSeries.getUuid ) }.toSeq - val timeSeries: Set[IndividualTimeSeries[_ <: PValue]] = + val timeSeries: Set[IndividualTimeSeries[? <: PValue]] = participantsToTimeSeries.map(_._2).toSet ( diff --git a/src/main/scala/edu/ie3/simbench/convert/LineConverter.scala b/src/main/scala/edu/ie3/simbench/convert/LineConverter.scala index d0c45260..3c1bcde7 100644 --- a/src/main/scala/edu/ie3/simbench/convert/LineConverter.scala +++ b/src/main/scala/edu/ie3/simbench/convert/LineConverter.scala @@ -15,7 +15,7 @@ import edu.ie3.simbench.model.datamodel.{Line, Node} import edu.ie3.util.quantities.PowerSystemUnits.KILOMETRE import tech.units.indriya.quantity.Quantities -import scala.collection.parallel.CollectionConverters._ +import scala.collection.parallel.CollectionConverters.* case object LineConverter extends LazyLogging { @@ -31,7 +31,7 @@ case object LineConverter extends LazyLogging { * A [[Vector]] of [[LineInput]]s */ def convert( - inputs: Vector[Line[_ <: LineType]], + inputs: Vector[Line[? <: LineType]], types: Map[LineType, LineTypeInput], nodes: Map[Node, NodeInput] ): Vector[LineInput] = @@ -67,7 +67,7 @@ case object LineConverter extends LazyLogging { * A [[LineInput]] model */ def convert( - input: Line[_ <: LineType], + input: Line[? <: LineType], lineType: LineTypeInput, nodeA: NodeInput, nodeB: NodeInput, diff --git a/src/main/scala/edu/ie3/simbench/convert/LoadConverter.scala b/src/main/scala/edu/ie3/simbench/convert/LoadConverter.scala index 2bd4b7f3..40fe9e86 100644 --- a/src/main/scala/edu/ie3/simbench/convert/LoadConverter.scala +++ b/src/main/scala/edu/ie3/simbench/convert/LoadConverter.scala @@ -15,7 +15,7 @@ import edu.ie3.util.quantities.PowerSystemUnits.{KILOWATTHOUR, MEGAVOLTAMPERE} import tech.units.indriya.quantity.Quantities import java.util.{Locale, UUID} -import scala.collection.parallel.CollectionConverters._ +import scala.collection.parallel.CollectionConverters.* case object LoadConverter extends ShuntConverter with LazyLogging { def convert( diff --git a/src/main/scala/edu/ie3/simbench/convert/MeasurementConverter.scala b/src/main/scala/edu/ie3/simbench/convert/MeasurementConverter.scala index 3a8db8de..317bd88d 100644 --- a/src/main/scala/edu/ie3/simbench/convert/MeasurementConverter.scala +++ b/src/main/scala/edu/ie3/simbench/convert/MeasurementConverter.scala @@ -64,16 +64,14 @@ case object MeasurementConverter extends LazyLogging { ) ) /* If there are at least two measurements, check if both together serve for functions, that can be joined */ - if (measurementGroup.size > 1) { + if measurementGroup.size > 1 then { val coveredVariables = measurementGroup.map(_.variable).toSet /* If both current and voltage are measured, power can be measured, too */ val voltageMeasured = coveredVariables.contains(Voltage) val (pMeasured, qMeasured) = { - if ( - coveredVariables + if coveredVariables .contains(Current) && coveredVariables.contains(Voltage) - ) - (true, true) + then (true, true) else ( coveredVariables.contains(ActivePower), diff --git a/src/main/scala/edu/ie3/simbench/convert/NodeConverter.scala b/src/main/scala/edu/ie3/simbench/convert/NodeConverter.scala index 43ee9717..302bf794 100644 --- a/src/main/scala/edu/ie3/simbench/convert/NodeConverter.scala +++ b/src/main/scala/edu/ie3/simbench/convert/NodeConverter.scala @@ -12,7 +12,7 @@ import edu.ie3.simbench.model.datamodel.enums.CalculationType.{ Ward, WardExtended } -import edu.ie3.simbench.model.datamodel._ +import edu.ie3.simbench.model.datamodel.* import edu.ie3.util.quantities.PowerSystemUnits.{KILOVOLT, PU} import tech.units.indriya.quantity.Quantities diff --git a/src/main/scala/edu/ie3/simbench/convert/PowerPlantConverter.scala b/src/main/scala/edu/ie3/simbench/convert/PowerPlantConverter.scala index b0d350ff..6bd47b82 100644 --- a/src/main/scala/edu/ie3/simbench/convert/PowerPlantConverter.scala +++ b/src/main/scala/edu/ie3/simbench/convert/PowerPlantConverter.scala @@ -22,7 +22,7 @@ import edu.ie3.util.quantities.PowerSystemUnits.{ } import tech.units.indriya.quantity.Quantities -import scala.collection.parallel.CollectionConverters._ +import scala.collection.parallel.CollectionConverters.* case object PowerPlantConverter extends ShuntConverter with LazyLogging { diff --git a/src/main/scala/edu/ie3/simbench/convert/ResConverter.scala b/src/main/scala/edu/ie3/simbench/convert/ResConverter.scala index aa687c83..eb17b70b 100644 --- a/src/main/scala/edu/ie3/simbench/convert/ResConverter.scala +++ b/src/main/scala/edu/ie3/simbench/convert/ResConverter.scala @@ -18,7 +18,7 @@ import edu.ie3.util.quantities.PowerSystemUnits.{ import tech.units.indriya.quantity.Quantities import java.util.{Locale, UUID} -import scala.collection.parallel.CollectionConverters._ +import scala.collection.parallel.CollectionConverters.* case object ResConverter extends ShuntConverter with LazyLogging { diff --git a/src/main/scala/edu/ie3/simbench/convert/ShuntConverter.scala b/src/main/scala/edu/ie3/simbench/convert/ShuntConverter.scala index 2cc1469a..a64fecac 100644 --- a/src/main/scala/edu/ie3/simbench/convert/ShuntConverter.scala +++ b/src/main/scala/edu/ie3/simbench/convert/ShuntConverter.scala @@ -16,11 +16,9 @@ trait ShuntConverter { */ def cosPhi(p: BigDecimal, q: BigDecimal): Double = { round({ - if (p == BigDecimal("0.0")) { - if (q == BigDecimal("0.0")) - 1d - else - signum(q.doubleValue) * Double.MaxValue + if p == BigDecimal("0.0") then { + if q == BigDecimal("0.0") then 1d + else signum(q.doubleValue) * Double.MaxValue } else { cos(atan((q / p).doubleValue)) diff --git a/src/main/scala/edu/ie3/simbench/convert/SwitchConverter.scala b/src/main/scala/edu/ie3/simbench/convert/SwitchConverter.scala index eba33872..29933faa 100644 --- a/src/main/scala/edu/ie3/simbench/convert/SwitchConverter.scala +++ b/src/main/scala/edu/ie3/simbench/convert/SwitchConverter.scala @@ -7,7 +7,7 @@ import edu.ie3.datamodel.models.input.connector.SwitchInput import edu.ie3.datamodel.models.input.{NodeInput, OperatorInput} import edu.ie3.simbench.model.datamodel.{Node, Switch} -import scala.collection.parallel.CollectionConverters._ +import scala.collection.parallel.CollectionConverters.* case object SwitchConverter { diff --git a/src/main/scala/edu/ie3/simbench/convert/Transformer2wConverter.scala b/src/main/scala/edu/ie3/simbench/convert/Transformer2wConverter.scala index c16bf8ae..f79262a4 100644 --- a/src/main/scala/edu/ie3/simbench/convert/Transformer2wConverter.scala +++ b/src/main/scala/edu/ie3/simbench/convert/Transformer2wConverter.scala @@ -10,7 +10,7 @@ import edu.ie3.simbench.exception.ConversionException import edu.ie3.simbench.model.datamodel.types.Transformer2WType import edu.ie3.simbench.model.datamodel.{Node, Transformer2W} -import scala.collection.parallel.CollectionConverters._ +import scala.collection.parallel.CollectionConverters.* case object Transformer2wConverter { diff --git a/src/main/scala/edu/ie3/simbench/convert/profiles/PowerProfileConverter.scala b/src/main/scala/edu/ie3/simbench/convert/profiles/PowerProfileConverter.scala index 63787d68..db21874f 100644 --- a/src/main/scala/edu/ie3/simbench/convert/profiles/PowerProfileConverter.scala +++ b/src/main/scala/edu/ie3/simbench/convert/profiles/PowerProfileConverter.scala @@ -14,7 +14,7 @@ import tech.units.indriya.quantity.Quantities import java.util.UUID import javax.measure.quantity.Power import scala.collection.parallel.CollectionConverters.ImmutableIterableIsParallelizable -import scala.jdk.CollectionConverters._ +import scala.jdk.CollectionConverters.* case object PowerProfileConverter { @@ -67,7 +67,7 @@ case object PowerProfileConverter { * for each time step */ def convert( - profileModel: ProfileModel[_ <: ProfileType, (BigDecimal, BigDecimal)], + profileModel: ProfileModel[? <: ProfileType, (BigDecimal, BigDecimal)], pRated: ComparableQuantity[Power], qRated: ComparableQuantity[Power] ): IndividualTimeSeries[SValue] = { @@ -125,7 +125,7 @@ case object PowerProfileConverter { * A [[IndividualTimeSeries]] with active power for each time step */ def convert( - profileModel: ProfileModel[_ <: ProfileType, BigDecimal], + profileModel: ProfileModel[? <: ProfileType, BigDecimal], pRated: ComparableQuantity[Power] ): IndividualTimeSeries[PValue] = { val values = profileModel.profile.map { case (zdt, pScaling) => diff --git a/src/main/scala/edu/ie3/simbench/convert/types/LineTypeConverter.scala b/src/main/scala/edu/ie3/simbench/convert/types/LineTypeConverter.scala index 62996882..dc3325cf 100644 --- a/src/main/scala/edu/ie3/simbench/convert/types/LineTypeConverter.scala +++ b/src/main/scala/edu/ie3/simbench/convert/types/LineTypeConverter.scala @@ -32,7 +32,7 @@ case object LineTypeConverter extends LazyLogging { * A [[Vector]] of [[LineTypeInput]]s */ def convert( - lines: Vector[Line[_ <: LineType]] + lines: Vector[Line[? <: LineType]] ): Map[LineType, LineTypeInput] = { val ratedVoltageMapping = getRatedVoltages(lines) val lineTypes = lines.map(line => line.lineType).distinct @@ -44,7 +44,7 @@ case object LineTypeConverter extends LazyLogging { ratedVoltageMapping.getOrElse( lineType, throw SimbenchDataModelException( - s"Cannot find the rated voltage vor line type ${lineType}" + s"Cannot find the rated voltage vor line type $lineType" ) ) ) @@ -99,7 +99,7 @@ case object LineTypeConverter extends LazyLogging { * [[ElectricPotential]] */ def getRatedVoltages( - lines: Vector[Line[_ <: LineType]] + lines: Vector[Line[? <: LineType]] ): Map[LineType, ComparableQuantity[ElectricPotential]] = { val rawMapping = lines .distinctBy(line => line.lineType) @@ -143,11 +143,11 @@ case object LineTypeConverter extends LazyLogging { * The rated voltage of the used line type */ private def determineRatedVoltage( - line: Line[_ <: LineType] + line: Line[? <: LineType] ): (LineType, ComparableQuantity[ElectricPotential]) = { val vRatedA = Quantities.getQuantity(line.nodeA.vmR, KILOVOLT) val vRatedB = Quantities.getQuantity(line.nodeB.vmR, KILOVOLT) - if (vRatedA != vRatedB) + if vRatedA != vRatedB then throw SimbenchDataModelException( s"The line ${line.id} connects two nodes with different rated voltages, which physically is not possible" ) diff --git a/src/main/scala/edu/ie3/simbench/convert/types/Transformer2wTypeConverter.scala b/src/main/scala/edu/ie3/simbench/convert/types/Transformer2wTypeConverter.scala index 81d86973..d89e9432 100644 --- a/src/main/scala/edu/ie3/simbench/convert/types/Transformer2wTypeConverter.scala +++ b/src/main/scala/edu/ie3/simbench/convert/types/Transformer2wTypeConverter.scala @@ -68,7 +68,7 @@ case object Transformer2wTypeConverter { 3 )) // Short circuit impedance of the total branch in Ohm val rSc = pCu / (3 * iRated * iRated) // Short circuit resistance in Ohm - if (rSc > zSc) + if rSc > zSc then throw ConversionException( s"Cannot convert two winding transformer type $id into ie3 type, as the conversion of short circuit parameters is not possible." ) @@ -81,7 +81,7 @@ case object Transformer2wTypeConverter { val vM = vmHV / sqrt(3) // Voltage at the main field admittance in V val yNoLoad = iNoLoad / vM // No load admittance in Ohm val gNoLoad = pFe / (3 * vM * vM) // No load conductance in Ohm - if (gNoLoad > yNoLoad) + if gNoLoad > yNoLoad then throw ConversionException( s"Cannot convert two winding transformer type $id into ie3 type, as the conversion of no load parameters is not possible." ) diff --git a/src/main/scala/edu/ie3/simbench/io/CsvReader.scala b/src/main/scala/edu/ie3/simbench/io/CsvReader.scala index e0ba6f41..74ae7cf9 100644 --- a/src/main/scala/edu/ie3/simbench/io/CsvReader.scala +++ b/src/main/scala/edu/ie3/simbench/io/CsvReader.scala @@ -72,7 +72,7 @@ final case class CsvReader[T]( */ private def mapFields( headLine: String, - desiredFields: Array[_ <: HeadLineField] + desiredFields: Array[? <: HeadLineField] ): Map[String, Int] = { /* Split for the single apparent fields in the file and map it to their indices */ val headLineFields = headLine.split(separator).map(_.trim).zipWithIndex @@ -120,7 +120,7 @@ final case class CsvReader[T]( fieldMapping: Map[String, Int] ): Map[String, String] = { val fields = line.split(separator).map(_.trim) - if (fields.length < fieldMapping.values.max + 1) + if fields.length < fieldMapping.values.max + 1 then throw IoException( s"The line of the file $filePath does not contain the correct amount of fields (apparent = ${fields.length}, " + s"needed = ${fieldMapping.values.max + 1}).\nLine affected: $line" diff --git a/src/main/scala/edu/ie3/simbench/io/Downloader.scala b/src/main/scala/edu/ie3/simbench/io/Downloader.scala index 7ef9344c..96789357 100644 --- a/src/main/scala/edu/ie3/simbench/io/Downloader.scala +++ b/src/main/scala/edu/ie3/simbench/io/Downloader.scala @@ -9,7 +9,7 @@ import edu.ie3.simbench.exception.io.DownloaderException import edu.ie3.simbench.model.SimbenchCode import scala.language.postfixOps -import scala.sys.process._ +import scala.sys.process.* final case class Downloader( downloadDir: String, @@ -31,15 +31,15 @@ final case class Downloader( s"${downloadDirPath.getAbsolutePath}/${simbenchCode.code}.zip" ) val downloadFile = downloadPath.toFile - if (downloadDirPath.mkdirs()) { + if downloadDirPath.mkdirs() then { logger.debug("Created all non existing folders") } - if (failOnExistingFiles && downloadFile.exists()) + if failOnExistingFiles && downloadFile.exists() then throw DownloaderException( s"Cannot download to file '${downloadFile.getName}', as it already exists" ) - else if (downloadFile.createNewFile()) { + else if downloadFile.createNewFile() then { logger.debug(s"Created new empty file ${downloadFile.getName}") } else { logger.debug(s"Overwrite existing file ${downloadFile.getName}") diff --git a/src/main/scala/edu/ie3/simbench/io/Extractor.scala b/src/main/scala/edu/ie3/simbench/io/Extractor.scala index 68e555ce..e803ee8a 100644 --- a/src/main/scala/edu/ie3/simbench/io/Extractor.scala +++ b/src/main/scala/edu/ie3/simbench/io/Extractor.scala @@ -44,7 +44,7 @@ class Extractor(simbenchConfig: SimbenchConfig) extends LazyLogging { val codeIndex = header.indexOf("code") val csvIndex = header.indexOf("csv") - if (codeIndex == -1 || csvIndex == -1) { + if codeIndex == -1 || csvIndex == -1 then { throw new IllegalArgumentException( "The required columns ('code', 'csv') are missing." ) @@ -53,7 +53,7 @@ class Extractor(simbenchConfig: SimbenchConfig) extends LazyLogging { // Extract the map val dataMap: Map[String, String] = data.flatMap { line => val columns = line.split(",").map(_.trim) - if (columns.length > csvIndex) { + if columns.length > csvIndex then { val code = columns(codeIndex) val csv = columns(csvIndex) val uuidOpt = uuidPattern.findFirstIn(csv) diff --git a/src/main/scala/edu/ie3/simbench/io/IoUtils.scala b/src/main/scala/edu/ie3/simbench/io/IoUtils.scala index be1b90e4..06c78001 100644 --- a/src/main/scala/edu/ie3/simbench/io/IoUtils.scala +++ b/src/main/scala/edu/ie3/simbench/io/IoUtils.scala @@ -42,10 +42,8 @@ trait IoUtils { val ensureHarmonizedAndTerminatingFileSeparator: String => String = (path: String) => { val harmonizedInput = harmonizeFileSeparator(path) - if (harmonizedInput.endsWith("/")) - harmonizedInput - else - harmonizedInput + "/" + if harmonizedInput.endsWith("/") then harmonizedInput + else harmonizedInput + "/" } /** Removes the dot from a file provided file ending string @@ -124,7 +122,7 @@ trait IoUtils { val checkedFolderPath = harmonizeFileSeparator( trimFirstSeparatorInWindowsPath(trimLastSeparator(folderPath)) ) - if (!folderPathWithoutLastSeparator.matches(checkedFolderPath)) + if !folderPathWithoutLastSeparator.matches(checkedFolderPath) then throw IoException( s"Cannot determine correct fully qualified folder path from $folderPath" ) @@ -166,7 +164,7 @@ object IoUtils extends IoUtils { val fullyQualifiedPath = checkedFolderPath + "/" + checkedFileName + "." + checkedExtension - if (!fullyQualifiedPathRegex.matches(fullyQualifiedPath)) + if !fullyQualifiedPathRegex.matches(fullyQualifiedPath) then throw IoException( s"The composed fully qualified path ($fullyQualifiedPath) is not an actual qualified path..." ) @@ -197,13 +195,13 @@ object IoUtils extends IoUtils { def checkFileExists(filePath: Path, ending: String): Unit = { val checkedEnding = "." + getFileExtensionWithoutDot(ending) - if (!Files.exists(filePath)) { + if !Files.exists(filePath) then { throw IoException(s"The file $filePath does not exist.") } - if (Files.isDirectory(filePath)) { + if Files.isDirectory(filePath) then { throw IoException(s"The file $filePath is a directory.") } - if (!filePath.toAbsolutePath.toString.endsWith(checkedEnding)) { + if !filePath.toAbsolutePath.toString.endsWith(checkedEnding) then { throw IoException( s"The file $filePath is of wrong file type. Only $checkedEnding is supported (case sensitive)." ) diff --git a/src/main/scala/edu/ie3/simbench/io/SimbenchFileNamingStrategy.scala b/src/main/scala/edu/ie3/simbench/io/SimbenchFileNamingStrategy.scala index 15870713..583d076b 100644 --- a/src/main/scala/edu/ie3/simbench/io/SimbenchFileNamingStrategy.scala +++ b/src/main/scala/edu/ie3/simbench/io/SimbenchFileNamingStrategy.scala @@ -3,7 +3,7 @@ package edu.ie3.simbench.io import edu.ie3.simbench.exception.io.SimbenchFileNamingException import edu.ie3.simbench.model.datamodel.ExternalNet.{Simple, Ward, WardExtended} import edu.ie3.simbench.model.datamodel.Line.{ACLine, DCLine} -import edu.ie3.simbench.model.datamodel._ +import edu.ie3.simbench.model.datamodel.* import edu.ie3.simbench.model.datamodel.profiles.{ LoadProfile, PowerPlantProfile, @@ -22,14 +22,14 @@ import scala.util.{Failure, Success, Try} * files */ case object SimbenchFileNamingStrategy { - private def fileMapping: Map[Class[_], String] = + private def fileMapping: Map[Class[?], String] = Map( classOf[Coordinate] -> "Coordinates", classOf[ExternalNet] -> "ExternalNet", classOf[Simple] -> "ExternalNet", classOf[Ward] -> "ExternalNet", classOf[WardExtended] -> "ExternalNet", - classOf[Line[_]] -> "Line", + classOf[Line[?]] -> "Line", classOf[ACLine] -> "Line", classOf[DCLine] -> "Line", classOf[LineType] -> "LineType", @@ -58,7 +58,7 @@ case object SimbenchFileNamingStrategy { * [[scala.util.Success]], if the file name can be determine, * [[scala.util.Failure]], if not */ - def getFileName(clazz: Class[_]): Try[String] = { + def getFileName(clazz: Class[?]): Try[String] = { fileMapping.get(clazz) match { case Some(filename) => Success(filename) case None => diff --git a/src/main/scala/edu/ie3/simbench/io/SimbenchReader.scala b/src/main/scala/edu/ie3/simbench/io/SimbenchReader.scala index 65156240..84f38581 100644 --- a/src/main/scala/edu/ie3/simbench/io/SimbenchReader.scala +++ b/src/main/scala/edu/ie3/simbench/io/SimbenchReader.scala @@ -6,7 +6,7 @@ import com.typesafe.scalalogging.LazyLogging import edu.ie3.simbench.exception.io.{IoException, SimbenchDataModelException} import edu.ie3.simbench.model.RawModelData import edu.ie3.simbench.model.datamodel.SimbenchModel.SimbenchCompanionObject -import edu.ie3.simbench.model.datamodel._ +import edu.ie3.simbench.model.datamodel.* import edu.ie3.simbench.model.datamodel.profiles.{ LoadProfile, PowerPlantProfile, @@ -53,7 +53,7 @@ final case class SimbenchReader( val checkedFileExtension: String = IoUtils.getFileExtensionWithoutDot(fileExtension) - implicit val ec: ExecutionContextExecutor = ExecutionContext.global + given ec: ExecutionContextExecutor = ExecutionContext.global /* Define the classes to read */ private val classesToRead = Vector( @@ -65,7 +65,7 @@ final case class SimbenchReader( (classOf[ExternalNet], ExternalNet.getFields), (classOf[ACLineType], ACLineType.getFields), (classOf[DCLineType], DCLineType.getFields), - (classOf[Line[_ <: LineType]], Line.getFields), + (classOf[Line[? <: LineType]], Line.getFields), (classOf[Load], Load.getFields), (classOf[Node], Node.getFields), (classOf[NodePFResult], NodePFResult.getFields), @@ -135,7 +135,7 @@ final case class SimbenchReader( "Cannot build nodes, as no raw data has been received." ) } - val lines = modelClassToRawData.getOrElse(classOf[Line[_]], None) match { + val lines = modelClassToRawData.getOrElse(classOf[Line[?]], None) match { case Some(rawData) => Line.buildModels(rawData, nodes, lineTypes) case None => throw IoException( @@ -321,7 +321,7 @@ final case class SimbenchReader( * A map of model class to a vector of maps from field to value */ private def getFieldToValueMaps - : Map[Class[_], Option[Vector[RawModelData]]] = { + : Map[Class[?], Option[Vector[RawModelData]]] = { Await .result( Future.sequence( @@ -344,7 +344,7 @@ final case class SimbenchReader( * @param cls * Companion object to use for model generation * @param tag - * Implicitly given class tag of the model class to build + * Given class tag of the model class to build * @param optional * true, if the models may or not be apparent (Default: true) * @tparam C @@ -353,14 +353,14 @@ final case class SimbenchReader( * A [[Vector]] of models */ private def buildModels[C <: SimbenchModel]( - modelClassToRawData: Map[Class[_], Option[Vector[RawModelData]]], + modelClassToRawData: Map[Class[?], Option[Vector[RawModelData]]], cls: SimbenchCompanionObject[C], optional: Boolean = true - )(implicit tag: ClassTag[C]): Vector[C] = { + )(using tag: ClassTag[C]): Vector[C] = { modelClassToRawData.getOrElse(tag.runtimeClass, None) match { case Some(rawData) => cls.buildModels(rawData) case None => - if (optional) { + if optional then { logger.debug( s"No information available for ${tag.runtimeClass.getSimpleName}" ) diff --git a/src/main/scala/edu/ie3/simbench/io/Zipper.scala b/src/main/scala/edu/ie3/simbench/io/Zipper.scala index 4ad38c7d..933ffaa3 100644 --- a/src/main/scala/edu/ie3/simbench/io/Zipper.scala +++ b/src/main/scala/edu/ie3/simbench/io/Zipper.scala @@ -48,7 +48,7 @@ case object Zipper extends IoUtils with LazyLogging { val zipFile = new ZipFile(zipArchive.toFile) val entries = zipFile.getEntries() - while (entries.hasMoreElements) { + while entries.hasMoreElements do { handleZipEntry( entries.nextElement(), zipFile, @@ -74,9 +74,9 @@ case object Zipper extends IoUtils with LazyLogging { folderPath: Path, failOnNonEmptyFolder: Boolean ): Unit = { - if (!Files.exists(folderPath)) { + if !Files.exists(folderPath) then { Files.createDirectories(folderPath) - } else if (!Files.isDirectory(folderPath)) { + } else if !Files.isDirectory(folderPath) then { throw ZipperException( s"'$folderPath' already exists, but is not a directory" ) @@ -84,8 +84,8 @@ case object Zipper extends IoUtils with LazyLogging { /* Check if the folder is not empty */ val folderStream = Files.newDirectoryStream(folderPath.toAbsolutePath) val folderEntryIterator = folderStream.iterator() - if (folderEntryIterator.hasNext) { - if (failOnNonEmptyFolder) + if folderEntryIterator.hasNext then { + if failOnNonEmptyFolder then throw ZipperException( s"Directory '$folderPath' is not empty" ) @@ -131,7 +131,7 @@ case object Zipper extends IoUtils with LazyLogging { ) Files.createDirectories(subfolder) case (false, _) => - val entryName = if (flattenDirectories) { + val entryName = if flattenDirectories then { fileNameRegexWithAnyEnding .findFirstIn(entry.getName) .getOrElse( @@ -144,7 +144,7 @@ case object Zipper extends IoUtils with LazyLogging { } val forseenTagetFilePath = Paths.get(s"${targetFolder.toAbsolutePath.toString}/$entryName") - if (Files.exists(forseenTagetFilePath)) { + if Files.exists(forseenTagetFilePath) then { logger.warn(s"Target file $forseenTagetFilePath already exists") } val targetFilePath = Files.createFile(forseenTagetFilePath) diff --git a/src/main/scala/edu/ie3/simbench/main/RunSimbench.scala b/src/main/scala/edu/ie3/simbench/main/RunSimbench.scala index 81772c83..31a2d5f3 100644 --- a/src/main/scala/edu/ie3/simbench/main/RunSimbench.scala +++ b/src/main/scala/edu/ie3/simbench/main/RunSimbench.scala @@ -24,7 +24,7 @@ import org.apache.commons.io.FilenameUtils import scala.concurrent.Await import scala.concurrent.ExecutionContext.Implicits.global import scala.concurrent.duration.Duration -import scala.jdk.CollectionConverters._ +import scala.jdk.CollectionConverters.* import scala.jdk.FutureConverters.CompletionStageOps import scala.util.{Failure, Success} @@ -48,10 +48,10 @@ object RunSimbench extends SimbenchHelper { simbenchConfig.io.simbenchCodes.foreach { simbenchCode => // todo: replace these two if statements with a proper handling of switches - if (!simbenchConfig.conversion.removeSwitches) { + if !simbenchConfig.conversion.removeSwitches then { logger.warn(s"Currently, removing switches might be necessary.") } - if (simbenchCode.contains("-sw")) { + if simbenchCode.contains("-sw") then { logger.warn(s"Using a simbench grid with '-sw' might not work.") } @@ -108,7 +108,7 @@ object RunSimbench extends SimbenchHelper { IoUtils.ensureHarmonizedAndTerminatingFileSeparator( simbenchConfig.io.output.targetDir ) - val csvSink = if (simbenchConfig.io.output.csv.directoryHierarchy) { + val csvSink = if simbenchConfig.io.output.csv.directoryHierarchy then { new CsvFileSink( Path.of(baseTargetDirectory), new FileNamingStrategy( @@ -133,7 +133,7 @@ object RunSimbench extends SimbenchHelper { csvSink.persistAllIgnoreNested(timeSeriesMapping.asJava) csvSink.persistAll(powerFlowResults.asJava) - if (simbenchConfig.io.output.compress) { + if simbenchConfig.io.output.compress then { logger.info(s"$simbenchCode - Adding files to compressed archive") val rawOutputPath = Paths.get(baseTargetDirectory + simbenchCode) val archivePath = Paths.get( diff --git a/src/main/scala/edu/ie3/simbench/main/SimbenchHelper.scala b/src/main/scala/edu/ie3/simbench/main/SimbenchHelper.scala index ad2e0a7f..499d499f 100644 --- a/src/main/scala/edu/ie3/simbench/main/SimbenchHelper.scala +++ b/src/main/scala/edu/ie3/simbench/main/SimbenchHelper.scala @@ -1,6 +1,6 @@ package edu.ie3.simbench.main -import com.typesafe.config.{ConfigFactory, Config => TypesafeConfig} +import com.typesafe.config.{ConfigFactory, Config as TypesafeConfig} import com.typesafe.scalalogging.LazyLogging import edu.ie3.simbench.config.ArgsParser import edu.ie3.simbench.config.ArgsParser.Arguments diff --git a/src/main/scala/edu/ie3/simbench/model/RawModelData.scala b/src/main/scala/edu/ie3/simbench/model/RawModelData.scala index 1bbe81d2..5a96df70 100644 --- a/src/main/scala/edu/ie3/simbench/model/RawModelData.scala +++ b/src/main/scala/edu/ie3/simbench/model/RawModelData.scala @@ -5,7 +5,7 @@ import edu.ie3.simbench.exception.io.IoException import scala.util.{Failure, Success, Try} final case class RawModelData( - modelClass: Class[_], + modelClass: Class[?], fieldToValues: Map[String, String] ) { diff --git a/src/main/scala/edu/ie3/simbench/model/SimbenchCode.scala b/src/main/scala/edu/ie3/simbench/model/SimbenchCode.scala index 737cdc31..f24523dd 100644 --- a/src/main/scala/edu/ie3/simbench/model/SimbenchCode.scala +++ b/src/main/scala/edu/ie3/simbench/model/SimbenchCode.scala @@ -293,9 +293,7 @@ case object SimbenchCode { * True, if it is a valid SimBench code, false if not. */ def isValid(code: String): Try[Boolean] = { - if (validSimbenchCodes.contains(code)) - Success(true) - else - Failure(CodeValidationException(s"$code is no valid SimbenchCode")) + if validSimbenchCodes.contains(code) then Success(true) + else Failure(CodeValidationException(s"$code is no valid SimbenchCode")) } } diff --git a/src/main/scala/edu/ie3/simbench/model/datamodel/GridModel.scala b/src/main/scala/edu/ie3/simbench/model/datamodel/GridModel.scala index d6cb275b..e749f989 100644 --- a/src/main/scala/edu/ie3/simbench/model/datamodel/GridModel.scala +++ b/src/main/scala/edu/ie3/simbench/model/datamodel/GridModel.scala @@ -11,7 +11,7 @@ import edu.ie3.simbench.model.datamodel.types.LineType final case class GridModel( simbenchCode: String, externalNets: Vector[ExternalNet], - lines: Vector[Line[_ <: LineType]], + lines: Vector[Line[? <: LineType]], loads: Vector[Load], loadProfiles: Vector[LoadProfile], measurements: Vector[Measurement], diff --git a/src/main/scala/edu/ie3/simbench/model/datamodel/Line.scala b/src/main/scala/edu/ie3/simbench/model/datamodel/Line.scala index d5c82370..a91c1593 100644 --- a/src/main/scala/edu/ie3/simbench/model/datamodel/Line.scala +++ b/src/main/scala/edu/ie3/simbench/model/datamodel/Line.scala @@ -16,7 +16,7 @@ sealed trait Line[T <: LineType] extends EntityModel { val loadingMax: BigDecimal } -object Line extends EntityModelCompanionObject[Line[_ <: LineType]] { +object Line extends EntityModelCompanionObject[Line[? <: LineType]] { /** AC line model * @@ -101,7 +101,7 @@ object Line extends EntityModelCompanionObject[Line[_ <: LineType]] { * @return * A model */ - override def apply(rawData: RawModelData): Line[_ <: LineType] = + override def apply(rawData: RawModelData): Line[? <: LineType] = throw SimbenchDataModelException( s"No basic implementation of model creation available for ${this.getClass.getSimpleName}" ) @@ -122,7 +122,7 @@ object Line extends EntityModelCompanionObject[Line[_ <: LineType]] { rawData: Vector[RawModelData], nodes: Map[String, Node], lineTypes: Map[String, LineType] - ): Vector[Line[_ <: LineType]] = + ): Vector[Line[? <: LineType]] = for (entry <- rawData) yield { val (nodeA, nodeB) = getNodes(entry.get(NODE_A), entry.get(NODE_B), nodes) @@ -154,7 +154,7 @@ object Line extends EntityModelCompanionObject[Line[_ <: LineType]] { nodeA: Node, nodeB: Node, lineType: LineType - ): Line[_ <: LineType] = { + ): Line[? <: LineType] = { val (id, subnet, voltLvl) = getBaseInformation(rawData) val length = rawData.getBigDecimal(LENGTH) val loadingMax = rawData.getBigDecimal(LOADING_MAX) diff --git a/src/main/scala/edu/ie3/simbench/model/datamodel/Measurement.scala b/src/main/scala/edu/ie3/simbench/model/datamodel/Measurement.scala index ebec594c..8799f888 100644 --- a/src/main/scala/edu/ie3/simbench/model/datamodel/Measurement.scala +++ b/src/main/scala/edu/ie3/simbench/model/datamodel/Measurement.scala @@ -52,7 +52,7 @@ object Measurement extends EntityModelCompanionObject[Measurement] { */ final case class LineMeasurement( id: String, - line: Line[_ <: LineType], + line: Line[? <: LineType], node: Node, variable: MeasurementVariable, subnet: String, @@ -126,7 +126,7 @@ object Measurement extends EntityModelCompanionObject[Measurement] { def buildModels( rawData: Vector[RawModelData], nodes: Map[String, Node], - lines: Map[String, Line[_ <: LineType]], + lines: Map[String, Line[? <: LineType]], transformers2W: Map[String, Transformer2W] ): Vector[Measurement] = for (entry <- rawData) yield { @@ -134,7 +134,7 @@ object Measurement extends EntityModelCompanionObject[Measurement] { val node = getNode(entry.get(ELEMENT_1), nodes) val variable = MeasurementVariable(entry.get(VARIABLE)) val element2 = entry.get(ELEMENT_2) - if (element2.toLowerCase == "null" || element2.isEmpty) + if element2.toLowerCase == "null" || element2.isEmpty then NodeMeasurement(id, node, variable, subnet, voltLvl) else lines.get(element2) match { diff --git a/src/main/scala/edu/ie3/simbench/model/datamodel/Node.scala b/src/main/scala/edu/ie3/simbench/model/datamodel/Node.scala index 813bf6f0..a5bf8eed 100644 --- a/src/main/scala/edu/ie3/simbench/model/datamodel/Node.scala +++ b/src/main/scala/edu/ie3/simbench/model/datamodel/Node.scala @@ -6,7 +6,6 @@ import edu.ie3.simbench.io.HeadLineField.MandatoryField import edu.ie3.simbench.model.RawModelData import edu.ie3.simbench.model.datamodel.Node.NodeKey import edu.ie3.simbench.model.datamodel.EntityModel.EntityModelCompanionObject -import edu.ie3.simbench.model.datamodel.SimbenchModel.SimbenchCompanionObject import edu.ie3.simbench.model.datamodel.enums.NodeType /** Electrical node diff --git a/src/main/scala/edu/ie3/simbench/model/datamodel/profiles/ProfileModel.scala b/src/main/scala/edu/ie3/simbench/model/datamodel/profiles/ProfileModel.scala index 8879926f..f6ea9092 100644 --- a/src/main/scala/edu/ie3/simbench/model/datamodel/profiles/ProfileModel.scala +++ b/src/main/scala/edu/ie3/simbench/model/datamodel/profiles/ProfileModel.scala @@ -28,7 +28,7 @@ trait ProfileModel[T <: ProfileType, D] extends SimbenchModel { object ProfileModel { abstract class ProfileCompanionObject[C <: ProfileModel[ - _ <: ProfileType, + ? <: ProfileType, D ], D] extends SimbenchCompanionObject[C] { diff --git a/src/test/scala/edu/ie3/simbench/convert/CoordinateConverterSpec.scala b/src/test/scala/edu/ie3/simbench/convert/CoordinateConverterSpec.scala index ad83a5f3..92cda426 100644 --- a/src/test/scala/edu/ie3/simbench/convert/CoordinateConverterSpec.scala +++ b/src/test/scala/edu/ie3/simbench/convert/CoordinateConverterSpec.scala @@ -3,7 +3,7 @@ package edu.ie3.simbench.convert import edu.ie3.datamodel.models.input.NodeInput import edu.ie3.simbench.model.datamodel.Coordinate import edu.ie3.test.common.UnitSpec -import org.locationtech.jts.geom.{GeometryFactory, Coordinate => JTSCoordinate} +import org.locationtech.jts.geom.{GeometryFactory, Coordinate as JTSCoordinate} class CoordinateConverterSpec extends UnitSpec { "The coordinate converter" should { diff --git a/src/test/scala/edu/ie3/simbench/convert/GridConverterSpec.scala b/src/test/scala/edu/ie3/simbench/convert/GridConverterSpec.scala index 5d7921c4..48bef159 100644 --- a/src/test/scala/edu/ie3/simbench/convert/GridConverterSpec.scala +++ b/src/test/scala/edu/ie3/simbench/convert/GridConverterSpec.scala @@ -10,9 +10,9 @@ import edu.ie3.simbench.convert.NodeConverter.AttributeOverride.JoinOverride import edu.ie3.simbench.io.SimbenchReader import edu.ie3.simbench.model.datamodel.{GridModel, Node, Switch} import edu.ie3.test.common.{SwitchTestingData, UnitSpec} -import org.scalatest.Inside._ +import org.scalatest.Inside.* -import scala.jdk.CollectionConverters._ +import scala.jdk.CollectionConverters.* class GridConverterSpec extends UnitSpec with SwitchTestingData { val simbenchReader: SimbenchReader = SimbenchReader( @@ -94,9 +94,9 @@ class GridConverterSpec extends UnitSpec with SwitchTestingData { actual.flatten.distinct.size shouldBe 6 actual.sortBy(_.size).foreach { group => - if (group.contains(switchAB)) { + if group.contains(switchAB) then { group.contains(switchBC) shouldBe true - } else if (group.contains(switchDE)) { + } else if group.contains(switchDE) then { group.contains(switchDF) shouldBe true group.contains(switchDG) shouldBe true } else { @@ -173,7 +173,7 @@ class GridConverterSpec extends UnitSpec with SwitchTestingData { countClassOccurrences( gridContainer.getGraphics.allEntitiesAsList() ) shouldBe Map - .empty[Class[_ <: UniqueEntity], Int] + .empty[Class[? <: UniqueEntity], Int] /* Evaluate the correctness of the time series by counting the occurrence of models */ timeSeries.size shouldBe 16 @@ -198,8 +198,8 @@ class GridConverterSpec extends UnitSpec with SwitchTestingData { } def countClassOccurrences( - entities: util.List[_ <: UniqueEntity] - ): Map[Class[_ <: UniqueEntity], Int] = + entities: util.List[? <: UniqueEntity] + ): Map[Class[? <: UniqueEntity], Int] = entities.asScala .groupBy(_.getClass) .map(classToOccurrences => diff --git a/src/test/scala/edu/ie3/simbench/convert/ResConverterSpec.scala b/src/test/scala/edu/ie3/simbench/convert/ResConverterSpec.scala index 27b7c909..b741b1d6 100644 --- a/src/test/scala/edu/ie3/simbench/convert/ResConverterSpec.scala +++ b/src/test/scala/edu/ie3/simbench/convert/ResConverterSpec.scala @@ -1,8 +1,6 @@ package edu.ie3.simbench.convert import edu.ie3.datamodel.models.StandardUnits -import edu.ie3.simbench.model.datamodel.enums.ResType -import edu.ie3.simbench.model.datamodel.enums.ResType.LvRural1 import java.util.Objects import edu.ie3.simbench.model.datamodel.profiles.{ResProfile, ResProfileType} @@ -16,7 +14,7 @@ class ResConverterSpec extends UnitSpec with QuantityMatchers with ConverterTestData { - implicit val quantityMatchingTolerance: Double = 1e-4 + given quantityMatchingTolerance: Double = 1e-4 "The RES converter" should { val (node, nodeInput) = getNodePair("MV1.101 Bus 4") diff --git a/src/test/scala/edu/ie3/simbench/convert/profiles/PowerProfileConverterSpec.scala b/src/test/scala/edu/ie3/simbench/convert/profiles/PowerProfileConverterSpec.scala index 4fd64844..3d0298c8 100644 --- a/src/test/scala/edu/ie3/simbench/convert/profiles/PowerProfileConverterSpec.scala +++ b/src/test/scala/edu/ie3/simbench/convert/profiles/PowerProfileConverterSpec.scala @@ -12,7 +12,7 @@ import edu.ie3.test.common.{TestTimeUtils, UnitSpec} import edu.ie3.util.quantities.PowerSystemUnits.{KILOVAR, KILOWATT} import tech.units.indriya.quantity.Quantities -import scala.jdk.OptionConverters._ +import scala.jdk.OptionConverters.* import scala.math.abs class PowerProfileConverterSpec extends UnitSpec { diff --git a/src/test/scala/edu/ie3/simbench/io/ExtractorSpec.scala b/src/test/scala/edu/ie3/simbench/io/ExtractorSpec.scala index eb0cbbe7..d85370b7 100644 --- a/src/test/scala/edu/ie3/simbench/io/ExtractorSpec.scala +++ b/src/test/scala/edu/ie3/simbench/io/ExtractorSpec.scala @@ -85,8 +85,8 @@ class ExtractorSpec private def deleteRecursively(path: Path): Unit = { val file = path.toFile - if (file.exists()) { - if (file.isDirectory) { + if file.exists() then { + if file.isDirectory then { file.listFiles().foreach(child => deleteRecursively(child.toPath)) } file.delete() diff --git a/src/test/scala/edu/ie3/simbench/io/SimbenchNamingStrategySpec.scala b/src/test/scala/edu/ie3/simbench/io/SimbenchNamingStrategySpec.scala index 86ea4d64..0267abd4 100644 --- a/src/test/scala/edu/ie3/simbench/io/SimbenchNamingStrategySpec.scala +++ b/src/test/scala/edu/ie3/simbench/io/SimbenchNamingStrategySpec.scala @@ -3,7 +3,7 @@ package edu.ie3.simbench.io import edu.ie3.simbench.exception.io.SimbenchFileNamingException import edu.ie3.simbench.model.datamodel.ExternalNet.{Simple, Ward, WardExtended} import edu.ie3.simbench.model.datamodel.Line.{ACLine, DCLine} -import edu.ie3.simbench.model.datamodel._ +import edu.ie3.simbench.model.datamodel.* import edu.ie3.simbench.model.datamodel.profiles.{ LoadProfile, PowerPlantProfile, @@ -15,8 +15,8 @@ import edu.ie3.simbench.model.datamodel.types.{ Transformer3WType } import edu.ie3.test.common.UnitSpec -import org.scalatest.Inside._ -import org.scalatest.prop.TableDrivenPropertyChecks._ +import org.scalatest.Inside.* +import org.scalatest.prop.TableDrivenPropertyChecks.* import scala.util.{Failure, Success} @@ -47,7 +47,7 @@ class SimbenchNamingStrategySpec extends UnitSpec { ) "provide correct file namings" in { - forAll(validNamings)((clazz: Class[_], expectedFileName: String) => + forAll(validNamings)((clazz: Class[?], expectedFileName: String) => SimbenchFileNamingStrategy .getFileName(clazz) shouldBe Success(expectedFileName) ) diff --git a/src/test/scala/edu/ie3/simbench/io/SimbenchReaderSpec.scala b/src/test/scala/edu/ie3/simbench/io/SimbenchReaderSpec.scala index fb7d795a..211faaf1 100644 --- a/src/test/scala/edu/ie3/simbench/io/SimbenchReaderSpec.scala +++ b/src/test/scala/edu/ie3/simbench/io/SimbenchReaderSpec.scala @@ -4,7 +4,7 @@ import java.nio.file.Paths import edu.ie3.simbench.exception.io.IoException import edu.ie3.simbench.model.RawModelData -import edu.ie3.simbench.model.datamodel._ +import edu.ie3.simbench.model.datamodel.* import edu.ie3.simbench.model.datamodel.profiles.{ LoadProfile, PowerPlantProfile, @@ -13,13 +13,13 @@ import edu.ie3.simbench.model.datamodel.profiles.{ import edu.ie3.simbench.model.datamodel.types.LineType.{ACLineType, DCLineType} import edu.ie3.simbench.model.datamodel.types.{LineType, Transformer2WType} import edu.ie3.test.common.{SimbenchReaderTestData, UnitSpec} -import org.scalatest.Inside._ +import org.scalatest.Inside.* import scala.concurrent.{ExecutionContext, ExecutionContextExecutor, Future} import scala.util.{Failure, Success} class SimbenchReaderSpec extends UnitSpec with SimbenchReaderTestData { - implicit val ec: ExecutionContextExecutor = ExecutionContext.global + given ec: ExecutionContextExecutor = ExecutionContext.global val classLoader: ClassLoader = this.getClass.getClassLoader /* Replace leading file separator, if it is a Windows-Folderpath (/C: etc.) */ @@ -29,10 +29,10 @@ class SimbenchReaderSpec extends UnitSpec with SimbenchReaderTestData { val reader: SimbenchReader = SimbenchReader("simpleDataset", Paths.get(checkedFolderPath)) val readModelClassMethod: PrivateMethod[ - Future[(Class[_ <: SimbenchModel], Vector[Map[String, String]])] + Future[(Class[? <: SimbenchModel], Vector[Map[String, String]])] ] = PrivateMethod[Future[ - (Class[_ <: SimbenchModel], Vector[Map[String, String]]) + (Class[? <: SimbenchModel], Vector[Map[String, String]]) ]](Symbol("read")) "The SimBench data set reader" should { @@ -164,7 +164,7 @@ class SimbenchReaderSpec extends UnitSpec with SimbenchReaderTestData { "get the field to value maps correctly" in { val fieldToValuesMethod = PrivateMethod[ - Map[Class[_], Option[Vector[RawModelData]]] + Map[Class[?], Option[Vector[RawModelData]]] ](Symbol("getFieldToValueMaps")) val fieldToValuesMap = reader invokePrivate fieldToValuesMethod() @@ -225,11 +225,11 @@ class SimbenchReaderSpec extends UnitSpec with SimbenchReaderTestData { .length shouldBe 21 fieldToValuesMap .getOrElse( - classOf[Line[_ <: LineType]], - fail(s"No entry available for class ${classOf[Line[_ <: LineType]]}") + classOf[Line[? <: LineType]], + fail(s"No entry available for class ${classOf[Line[? <: LineType]]}") ) .getOrElse( - fail(s"Entry for class ${classOf[Line[_ <: LineType]]} is empty.") + fail(s"Entry for class ${classOf[Line[? <: LineType]]} is empty.") ) .length shouldBe 1 fieldToValuesMap diff --git a/src/test/scala/edu/ie3/simbench/io/UnzippingSpec.scala b/src/test/scala/edu/ie3/simbench/io/UnzippingSpec.scala index 749ab1ce..ef9201a9 100644 --- a/src/test/scala/edu/ie3/simbench/io/UnzippingSpec.scala +++ b/src/test/scala/edu/ie3/simbench/io/UnzippingSpec.scala @@ -7,7 +7,7 @@ import edu.ie3.test.common.UnitSpec import edu.ie3.util.io.FileIOUtils import org.scalatest.BeforeAndAfterEach -import scala.jdk.StreamConverters._ +import scala.jdk.StreamConverters.* import scala.language.{existentials, postfixOps} import scala.util.{Failure, Success, Try} diff --git a/src/test/scala/edu/ie3/simbench/model/LineSpec.scala b/src/test/scala/edu/ie3/simbench/model/LineSpec.scala index e7573dfe..5bd0ebc1 100644 --- a/src/test/scala/edu/ie3/simbench/model/LineSpec.scala +++ b/src/test/scala/edu/ie3/simbench/model/LineSpec.scala @@ -18,7 +18,7 @@ class LineSpec extends UnitSpec with ConverterTestData { val rawData = Vector( RawModelData( - classOf[Line[_]], + classOf[Line[?]], Map( "id" -> "LV1.101 Line 10", "nodeA" -> "LV1.101 Bus 4", @@ -31,7 +31,7 @@ class LineSpec extends UnitSpec with ConverterTestData { ) ), RawModelData( - classOf[Line[_]], + classOf[Line[?]], Map( "id" -> "LV1.101 Line 10", "nodeA" -> "LV1.101 Bus 1", diff --git a/src/test/scala/edu/ie3/simbench/model/profile/LoadProfileSpec.scala b/src/test/scala/edu/ie3/simbench/model/profile/LoadProfileSpec.scala index c40f8d17..60eb2876 100644 --- a/src/test/scala/edu/ie3/simbench/model/profile/LoadProfileSpec.scala +++ b/src/test/scala/edu/ie3/simbench/model/profile/LoadProfileSpec.scala @@ -3,7 +3,7 @@ package edu.ie3.simbench.model.profile import edu.ie3.simbench.exception.io.SimbenchDataModelException import edu.ie3.simbench.model.RawModelData import edu.ie3.simbench.model.datamodel.profiles.LoadProfile -import edu.ie3.simbench.model.datamodel.profiles.LoadProfileType._ +import edu.ie3.simbench.model.datamodel.profiles.LoadProfileType.* import edu.ie3.test.common.{TestTimeUtils, UnitSpec} class LoadProfileSpec extends UnitSpec { diff --git a/src/test/scala/edu/ie3/test/common/ConverterTestData.scala b/src/test/scala/edu/ie3/test/common/ConverterTestData.scala index cf025ee0..4ff450ac 100644 --- a/src/test/scala/edu/ie3/test/common/ConverterTestData.scala +++ b/src/test/scala/edu/ie3/test/common/ConverterTestData.scala @@ -42,13 +42,13 @@ import edu.ie3.simbench.model.datamodel.Measurement.{ NodeMeasurement, TransformerMeasurement } -import edu.ie3.simbench.model.datamodel._ +import edu.ie3.simbench.model.datamodel.* import edu.ie3.simbench.model.datamodel.enums.BranchElementPort.HV import edu.ie3.simbench.model.datamodel.enums.CalculationType.PVm import edu.ie3.simbench.model.datamodel.enums.MeasurementVariable.Voltage import edu.ie3.simbench.model.datamodel.enums.NodeType.{BusBar, DoubleBusBar} import edu.ie3.simbench.model.datamodel.enums.PowerPlantType.Lignite -import edu.ie3.simbench.model.datamodel.enums._ +import edu.ie3.simbench.model.datamodel.enums.* import edu.ie3.simbench.model.datamodel.profiles.PowerPlantProfileType.PowerPlantProfile1 import edu.ie3.simbench.model.datamodel.profiles.{ LoadProfile, @@ -57,14 +57,14 @@ import edu.ie3.simbench.model.datamodel.profiles.{ } import edu.ie3.simbench.model.datamodel.types.LineType.{ACLineType, DCLineType} import edu.ie3.simbench.model.datamodel.types.{LineType, Transformer2WType} -import edu.ie3.util.quantities.PowerSystemUnits._ +import edu.ie3.util.quantities.PowerSystemUnits.* import org.locationtech.jts.geom.{ GeometryFactory, Point, - Coordinate => JTSCoordinate + Coordinate as JTSCoordinate } import tech.units.indriya.quantity.Quantities -import tech.units.indriya.unit.Units._ +import tech.units.indriya.unit.Units.* import java.time.ZonedDateTime import java.util.UUID @@ -560,7 +560,7 @@ trait ConverterTestData { ) ) - def getLinePair(key: String): (Line[_ <: LineType], LineInput) = + def getLinePair(key: String): (Line[? <: LineType], LineInput) = lines .getOrElse( key, diff --git a/src/test/scala/edu/ie3/test/common/SimbenchReaderTestData.scala b/src/test/scala/edu/ie3/test/common/SimbenchReaderTestData.scala index d9a0ed0c..e5731bc7 100644 --- a/src/test/scala/edu/ie3/test/common/SimbenchReaderTestData.scala +++ b/src/test/scala/edu/ie3/test/common/SimbenchReaderTestData.scala @@ -2,10 +2,10 @@ package edu.ie3.test.common import edu.ie3.simbench.model.datamodel.ExternalNet.Simple import edu.ie3.simbench.model.datamodel.Line.ACLine -import edu.ie3.simbench.model.datamodel._ -import edu.ie3.simbench.model.datamodel.enums._ -import edu.ie3.simbench.model.datamodel.profiles.LoadProfileType._ -import edu.ie3.simbench.model.datamodel.profiles._ +import edu.ie3.simbench.model.datamodel.* +import edu.ie3.simbench.model.datamodel.enums.* +import edu.ie3.simbench.model.datamodel.profiles.LoadProfileType.* +import edu.ie3.simbench.model.datamodel.profiles.* import edu.ie3.simbench.model.datamodel.types.LineType.ACLineType import edu.ie3.simbench.model.datamodel.types.Transformer2WType diff --git a/src/test/scala/edu/ie3/test/matchers/QuantityMatchers.scala b/src/test/scala/edu/ie3/test/matchers/QuantityMatchers.scala index 49ba702f..34ede369 100644 --- a/src/test/scala/edu/ie3/test/matchers/QuantityMatchers.scala +++ b/src/test/scala/edu/ie3/test/matchers/QuantityMatchers.scala @@ -17,7 +17,7 @@ trait QuantityMatchers { ) } - def equalWithTolerance[Q <: Quantity[Q]](right: Quantity[Q])(implicit + def equalWithTolerance[Q <: Quantity[Q]](right: Quantity[Q])(using quantityMatchingTolerance: Double = 1e-10 ) = new QuantityMatcher(right, quantityMatchingTolerance) }