Skip to content

Commit d6ff950

Browse files
committed
first version of section cache
1 parent 6c4fdb1 commit d6ff950

13 files changed

+133
-17
lines changed

core/src/main/java/com/bc/fiduceo/reader/insitu/sic_cci/ANTXXXISectionParser.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,11 @@ int getNumVariables() {
180180
return 33;
181181
}
182182

183+
@Override
184+
String getNamePrefix() {
185+
return "REF";
186+
}
187+
183188
@Override
184189
Section parse(String[] tokens, int offset) throws ParseException {
185190
final Section section = new Section();

core/src/main/java/com/bc/fiduceo/reader/insitu/sic_cci/AbstractSectionParser.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ abstract class AbstractSectionParser {
2323

2424
abstract int getNumVariables();
2525

26+
abstract String getNamePrefix();
27+
2628
abstract Section parse(String[] tokens, int offset) throws ParseException;
2729

2830
static void createCommonVariables(List<Variable> variables) {

core/src/main/java/com/bc/fiduceo/reader/insitu/sic_cci/DMISIC0SectionParser.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,11 @@ int getNumVariables() {
3333
return 5;
3434
}
3535

36+
@Override
37+
String getNamePrefix() {
38+
return "REF";
39+
}
40+
3641
Section parse(String[] tokens, int offset) throws ParseException {
3742
final Section section = new Section();
3843

core/src/main/java/com/bc/fiduceo/reader/insitu/sic_cci/DTUSIC1SectionParser.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,11 @@ int getNumVariables() {
3838
return 6;
3939
}
4040

41+
@Override
42+
String getNamePrefix() {
43+
return "REF";
44+
}
45+
4146
@Override
4247
Section parse(String[] tokens, int offset) throws ParseException {
4348
final Section section = new Section();

core/src/main/java/com/bc/fiduceo/reader/insitu/sic_cci/ERASectionParser.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,11 @@ int getNumVariables() {
176176
return 27;
177177
}
178178

179+
@Override
180+
String getNamePrefix() {
181+
return type;
182+
}
183+
179184
@Override
180185
Section parse(String[] tokens, int offset) throws ParseException {
181186
final Section section = new Section();
Lines changed: 42 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,67 @@
11
package com.bc.fiduceo.reader.insitu.sic_cci;
22

3+
import org.esa.snap.core.util.StringUtils;
34
import ucar.ma2.Array;
45

56
import java.text.ParseException;
67
import java.util.ArrayList;
8+
import java.util.HashMap;
79

810
// @todo 1 tb/tb write tests! 2022-11-08
911
class SectionCache {
1012

1113
private final ArrayList<String> lineList;
12-
private final AbstractSectionParser[] parser;
13-
private Section[] referenceSections;
14+
private final AbstractSectionParser[] sectionParsers;
15+
private HashMap<String, Section[]> sectionMap;
16+
private final ArrayList<String> additionalSectionKeys;
1417

15-
SectionCache(ArrayList<String> linelist, AbstractSectionParser[] parser) {
18+
SectionCache(ArrayList<String> linelist, AbstractSectionParser[] sectionParsers) {
1619
this.lineList = linelist;
17-
this.parser = parser;
20+
this.sectionParsers = sectionParsers;
1821

19-
referenceSections = new Section[linelist.size()];
22+
sectionMap = new HashMap<>();
23+
additionalSectionKeys = new ArrayList<>();
24+
for (final AbstractSectionParser parser : sectionParsers) {
25+
final String namePrefix = parser.getNamePrefix();
26+
sectionMap.put(namePrefix, new Section[linelist.size()]);
27+
if (!namePrefix.equals("REF")) {
28+
additionalSectionKeys.add(namePrefix);
29+
}
30+
}
2031
}
2132

2233
void close() {
23-
referenceSections = null;
34+
sectionMap.clear();
35+
sectionMap = null;
2436
}
2537

2638
Array get(String variableName, int y) throws ParseException {
27-
if (referenceSections[y] == null) {
39+
final int splitIdx = variableName.indexOf("_");
40+
String sectionKey;
41+
if (splitIdx < 0) {
42+
sectionKey = "REF";
43+
} else {
44+
sectionKey = variableName.substring(0, splitIdx);
45+
if (!additionalSectionKeys.contains(sectionKey)) {
46+
sectionKey = "REF";
47+
}
48+
}
49+
50+
final Section[] sections = sectionMap.get(sectionKey);
51+
if (sections[y] == null) {
2852
final String line = lineList.get(y);
29-
final String[] tokens = line.split(",");
30-
referenceSections[y] = parser[0].parse(tokens, 0);
31-
// @todo 1 tb/tb run over all parsers and store the sections
53+
final String[] tokens = StringUtils.split(line, new char[]{','}, true);
3254

55+
int tokenOffset = 0;
56+
for (final AbstractSectionParser parser : sectionParsers) {
57+
final Section section = parser.parse(tokens, tokenOffset);
58+
tokenOffset += parser.getNumVariables();
59+
60+
final Section[] fillSections = sectionMap.get(parser.getNamePrefix());
61+
fillSections[y] = section;
62+
}
3363
}
34-
return referenceSections[y].get(variableName);
64+
65+
return sections[y].get(variableName);
3566
}
3667
}

core/src/main/java/com/bc/fiduceo/reader/insitu/sic_cci/SicCciInsituReader.java

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -42,15 +42,29 @@ public void open(File file) throws IOException {
4242
readLines();
4343

4444
final String fileName = file.getName();
45+
referenceSectionParser = createReferenceParser(fileName);
46+
47+
final ArrayList<AbstractSectionParser> parsers = new ArrayList<>();
48+
parsers.add(referenceSectionParser);
49+
if (fileName.contains("ERA5")) {
50+
parsers.add(new ERASectionParser("ERA5"));
51+
} else if (fileName.contains("ERA")) {
52+
parsers.add(new ERASectionParser("ERA"));
53+
}
54+
55+
sectionCache = new SectionCache(linelist, parsers.toArray(new AbstractSectionParser[0]));
56+
}
57+
58+
static ReferenceSectionParser createReferenceParser(String fileName) throws IOException {
4559
if (fileName.contains("DMISIC0")) {
46-
referenceSectionParser = new DMISIC0SectionParser();
60+
return new DMISIC0SectionParser();
4761
} else if (fileName.contains("DTUSIC1")) {
48-
referenceSectionParser = new DTUSIC1SectionParser();
62+
return new DTUSIC1SectionParser();
4963
} else if (fileName.contains("ANTXXXI")) {
50-
referenceSectionParser = new ANTXXXISectionParser();
64+
return new ANTXXXISectionParser();
5165
}
5266

53-
sectionCache = new SectionCache(linelist, new AbstractSectionParser[]{referenceSectionParser});
67+
throw new IOException("Invalid format, no known reference section found");
5468
}
5569

5670
private void readLines() throws IOException {

core/src/test/java/com/bc/fiduceo/reader/insitu/sic_cci/ANTXXXISectionParserTest.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -208,4 +208,9 @@ public void testGetVariables() {
208208
assertEquals("Weather", variable.getShortName());
209209
assertEquals(DataType.BYTE, variable.getDataType());
210210
}
211+
212+
@Test
213+
public void testGetNamePrefix() {
214+
assertEquals("REF", parser.getNamePrefix());
215+
}
211216
}

core/src/test/java/com/bc/fiduceo/reader/insitu/sic_cci/DMISIC0SectionParserTest.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,4 +74,9 @@ public void testGetVariables() {
7474
assertEquals("SIC", variable.getShortName());
7575
assertEquals(DataType.FLOAT, variable.getDataType());
7676
}
77+
78+
@Test
79+
public void testGetNamePrefix() {
80+
assertEquals("REF", parser.getNamePrefix());
81+
}
7782
}

core/src/test/java/com/bc/fiduceo/reader/insitu/sic_cci/DTUSIC1SectionParserTest.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,4 +75,9 @@ public void testGetVariables() {
7575
assertEquals("SIC", variable.getShortName());
7676
assertEquals(DataType.FLOAT, variable.getDataType());
7777
}
78+
79+
@Test
80+
public void testGetNamePrefix() {
81+
assertEquals("REF", parser.getNamePrefix());
82+
}
7883
}

0 commit comments

Comments
 (0)