Closed
Description
When we have a coordinate source with invalid column names we don't get a useful error message but a NullPointerException
. We should be able to give more sensible feedback by first checking if these columns exist or throwing a more useful exception.
java.lang.NullPointerException: Cannot invoke "String.concat(String)" because the return value of "java.util.Map.get(Object)" is null
at edu.ie3.datamodel.io.source.csv.CsvIdCoordinateSource.lambda$buildStreamWithFieldsToAttributesMap$2(CsvIdCoordinateSource.java:123)
at edu.ie3.datamodel.utils.validation.ValidationUtils.lambda$distinctByKey$5(ValidationUtils.java:245)
at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:178)
at java.base/java.util.HashMap$KeySpliterator.forEachRemaining(HashMap.java:1707)
at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
at java.base/java.util.stream.ReduceOps$ReduceTask.doLeaf(ReduceOps.java:960)
at java.base/java.util.stream.ReduceOps$ReduceTask.doLeaf(ReduceOps.java:934)
at java.base/java.util.stream.AbstractTask.compute(AbstractTask.java:327)
at java.base/java.util.concurrent.CountedCompleter.exec(CountedCompleter.java:754)
at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:373)
at java.base/java.util.concurrent.ForkJoinTask.invoke(ForkJoinTask.java:686)
at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateParallel(ReduceOps.java:927)
at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:233)
at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:682)
at edu.ie3.datamodel.io.source.csv.CsvDataSource.distinctRowsWithLog(CsvDataSource.java:454)
at edu.ie3.datamodel.io.source.csv.CsvIdCoordinateSource.buildStreamWithFieldsToAttributesMap(CsvIdCoordinateSource.java:124)
at edu.ie3.datamodel.io.source.csv.CsvIdCoordinateSource.setupIdToCoordinateMap(CsvIdCoordinateSource.java:52)
at edu.ie3.datamodel.io.source.csv.CsvIdCoordinateSource.<init>(CsvIdCoordinateSource.java:42)
at edu.ie3.simona.service.weather.WeatherSource$.$anonfun$checkCoordinateSource$3(WeatherSource.scala:460)
at edu.ie3.simona.service.weather.WeatherSourceWrapper$.apply(WeatherSourceWrapper.scala:321)
at edu.ie3.simona.service.weather.WeatherSource$.$anonfun$checkConfig$6(WeatherSource.scala:390)
at edu.ie3.simona.service.weather.WeatherSource$.apply(WeatherSource.scala:295)
at edu.ie3.simona.service.weather.WeatherService.init(WeatherService.scala:136)
at edu.ie3.simona.service.SimonaService$$anonfun$uninitialized$1.applyOrElse(SimonaService.scala:64)
at akka.actor.Actor.aroundReceive(Actor.scala:537)
at akka.actor.Actor.aroundReceive$(Actor.scala:535)
at edu.ie3.simona.service.SimonaService.aroundReceive(SimonaService.scala:36)
at akka.actor.ActorCell.receiveMessage(ActorCell.scala:579)
at akka.actor.ActorCell.invoke(ActorCell.scala:547)
at akka.dispatch.Mailbox.processMailbox(Mailbox.scala:270)
at akka.dispatch.Mailbox.run(Mailbox.scala:231)
at akka.dispatch.Mailbox.exec(Mailbox.scala:243)