diff --git a/src/main/java/no/bioforsk/vips/model/naerstadmodel/NaerstadModel.java b/src/main/java/no/bioforsk/vips/model/naerstadmodel/NaerstadModel.java index b5b6ddeff9eb451c205fbe1cadaa8ed194f46345..50a507d971c61da394b48ae616f999db13196ad2 100644 --- a/src/main/java/no/bioforsk/vips/model/naerstadmodel/NaerstadModel.java +++ b/src/main/java/no/bioforsk/vips/model/naerstadmodel/NaerstadModel.java @@ -7,12 +7,16 @@ import java.util.Collection; import java.util.Collections; import java.util.Date; import java.util.List; +import java.util.logging.Level; +import java.util.logging.Logger; import no.bioforsk.vips.i18n.I18nImpl; import no.bioforsk.vips.entity.ModelConfiguration; import no.bioforsk.vips.entity.Observation; import no.bioforsk.vips.entity.Result; import no.bioforsk.vips.entity.ResultImpl; +import no.bioforsk.vips.model.ConfigValidationException; import no.bioforsk.vips.model.Model; +import no.bioforsk.vips.model.ModelExcecutionException; import no.bioforsk.vips.model.ModelId; import no.bioforsk.vips.util.WeatherElements; import no.bioforsk.vips.util.WeatherUtil; @@ -50,46 +54,59 @@ public class NaerstadModel extends I18nImpl implements Model{ } @Override - public List<Result> getResult() { - this.calculateNaerstadModellBakgroundData(); - this.backgroundData.toString(); - List<Result> results = new ArrayList<>(); - Calendar cal = Calendar.getInstance(); - cal.setTime(this.calculationStart); - /* - * Results can only be inferred from 1 day after calculation start. - * Therefore we add one day before we begin iteration - */ - cal.add(Calendar.DATE, 1); - DecimalFormat dFormat = new DecimalFormat("###.##"); - for(int j=0;j<4;j++) + public List<Result> getResult() throws ModelExcecutionException + { + + try { - Date dateStart = cal.getTime(); + + this.calculateNaerstadModellBakgroundData(); + this.backgroundData.toString(); + List<Result> results = new ArrayList<>(); + Calendar cal = Calendar.getInstance(); + cal.setTime(this.calculationStart); + /* + * Results can only be inferred from 1 day after calculation start. + * Therefore we add one day before we begin iteration + */ cal.add(Calendar.DATE, 1); - Date dateEnd = cal.getTime(); - Date thePresent = dateStart; - while(thePresent.before(dateEnd)) + DecimalFormat dFormat = new DecimalFormat("###.##"); + for(int j=0;j<4;j++) { - Result result = new ResultImpl(); - result.setResultValidTime(thePresent); - Double RISK = this.backgroundData.getParamDoubleValueForDate(thePresent, NaerstadModelBackgroundDataMatrix.RISK); - // TODO: Find better way of terminating? - if(RISK == null) + Date dateStart = cal.getTime(); + cal.add(Calendar.DATE, 1); + Date dateEnd = cal.getTime(); + Date thePresent = dateStart; + while(thePresent.before(dateEnd)) { - break; + Result result = new ResultImpl(); + result.setResultValidTime(thePresent); + Double RISK = this.backgroundData.getParamDoubleValueForDate(thePresent, NaerstadModelBackgroundDataMatrix.RISK); + // TODO: Find better way of terminating? + if(RISK == null) + { + break; + } + if(this.DEBUG) + System.out.println("RISK(" + thePresent + ")=" + RISK); + result.setValue("RISK", dFormat.format(RISK)); + results.add(result); + + // Moving on + cal.setTime(thePresent); + cal.add(Calendar.HOUR_OF_DAY, 1); + thePresent = cal.getTime(); } - if(this.DEBUG) - System.out.println("RISK(" + thePresent + ")=" + RISK); - result.setValue("RISK", dFormat.format(RISK)); - results.add(result); - - // Moving on - cal.setTime(thePresent); - cal.add(Calendar.HOUR_OF_DAY, 1); - thePresent = cal.getTime(); } + + return results; + } catch(Exception e) { + if(e instanceof ModelExcecutionException) + throw e; + // Log the error + Logger.getLogger(NaerstadModel.class.getName()).log(Level.SEVERE, null, e); + throw new ModelExcecutionException("An exception occurred. Message is " + e.getMessage() + " See logs for details"); } - return results; } @Override @@ -176,7 +193,8 @@ public class NaerstadModel extends I18nImpl implements Model{ * @param config */ @Override - public void setConfiguration(ModelConfiguration config) { + public void setConfiguration(ModelConfiguration config) throws ConfigValidationException + { initCollections(); ObjectMapper mapper = new ObjectMapper(); @@ -204,16 +222,20 @@ public class NaerstadModel extends I18nImpl implements Model{ } } // TODO: Validate all input!!!! - /*for(Observation o:observations) + + if( this.RR.size() != this.TM.size() + || this.Q0.size() != this.TM.size() + || this.UM.size() != this.TM.size() + || this.BT.size() != this.BT.size()) { - System.out.println("o time Measured = " + o.getTimeMeasured()); + throw new ConfigValidationException("Incorrect number of weather data. TM.size() = " + this.TM.size() + ", BT.size()=" + this.BT.size() + ", UM.size()=" + this.UM.size() + ", RR.size()=" + this.RR.size() + ", Q0.size=" + this.Q0.size()); } - - catch(ArrayIndexOutOfBoundsException aioue) - { - throw new Exception("Feil med antall måledata. TMliste.length = " + TMliste.length + ", BTliste.length=" + BTliste.length + ", UMListe.length=" + UMliste.length + ", RRliste.length=" + RRliste.length + ", Q0liste.length=" + Q0liste.length); - }*/ + int minimumNumberOfWeatherData = 72; + if((this.TM.size() + this.RR.size() + this.Q0.size() + this.UM.size() + this.BT.size()) / 5 < minimumNumberOfWeatherData) + { + throw new ConfigValidationException("Minimum number of weather data = " + minimumNumberOfWeatherData); + } } diff --git a/src/test/java/no/bioforsk/vips/model/naerstadmodel/NaerstadModelTest.java b/src/test/java/no/bioforsk/vips/model/naerstadmodel/NaerstadModelTest.java index 9d52449e63b83bd8c797fb604f984baf4e361871..8ba9409d062142be70184c5829dc5fb6d89061cf 100644 --- a/src/test/java/no/bioforsk/vips/model/naerstadmodel/NaerstadModelTest.java +++ b/src/test/java/no/bioforsk/vips/model/naerstadmodel/NaerstadModelTest.java @@ -5,24 +5,22 @@ package no.bioforsk.vips.model.naerstadmodel; import java.io.BufferedInputStream; -import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; -import java.util.Calendar; import java.util.Date; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; +import static junit.framework.Assert.fail; import junit.framework.TestCase; import no.bioforsk.vips.entity.ModelConfiguration; import no.bioforsk.vips.entity.Observation; -import no.bioforsk.vips.model.ModelId; +import no.bioforsk.vips.model.ConfigValidationException; +import no.bioforsk.vips.model.ModelExcecutionException; import no.bioforsk.vips.util.JSONUtil; import org.codehaus.jackson.JsonFactory; import org.codehaus.jackson.JsonNode; -import org.codehaus.jackson.JsonParseException; import org.codehaus.jackson.JsonParser; -import org.codehaus.jackson.JsonToken; import org.codehaus.jackson.map.MappingJsonFactory; import org.codehaus.jackson.map.ObjectMapper; import org.codehaus.jackson.type.TypeReference; @@ -51,12 +49,18 @@ public class NaerstadModelTest extends TestCase { * Test of getResult method, of class NaerstadModel. */ public void testGetResult() { - System.out.println("getResult"); - NaerstadModel instance = new NaerstadModel(); - instance.setConfiguration(this.getConfiguration()); - List result = instance.getResult(); - //System.out.println("Result size=" + result.size()); - assertTrue(result.size() == 96); + try { + System.out.println("getResult"); + NaerstadModel instance = new NaerstadModel(); + instance.setConfiguration(this.getConfiguration()); + List result; + result = instance.getResult(); + + //System.out.println("Result size=" + result.size()); + assertTrue(result.size() == 96); + } catch (ConfigValidationException | ModelExcecutionException ex) { + fail("Exception: " + ex.getMessage()); + } } @@ -134,11 +138,14 @@ public class NaerstadModelTest extends TestCase { * Test of setConfiguration method, of class NaerstadModel. */ public void testSetConfiguration() { - + try { System.out.println("setConfiguration"); NaerstadModel instance = new NaerstadModel(); instance.setConfiguration(this.getConfiguration()); + } catch (ConfigValidationException ex) { + fail("Error in configuration:" + ex.getMessage()); + } }