Skip to content

Commit 8ad6d09

Browse files
committed
Update pom and code to glob v5 to managed removal of GlobTypeLoader (introspection) and GlobTypeBuilder init change (no more incomplete GlobType)
1 parent 6f1b7c0 commit 8ad6d09

24 files changed

Lines changed: 428 additions & 258 deletions

pom.xml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
<packaging>jar</packaging>
88
<artifactId>globs-csv</artifactId>
99
<name>Generic Lightweight ObjectS text file import/export</name>
10-
<version>4.3-SNAPSHOT</version>
10+
<version>5.0-SNAPSHOT</version>
1111

1212
<developers>
1313
<developer>
@@ -133,12 +133,12 @@
133133
<dependency>
134134
<groupId>org.globsframework</groupId>
135135
<artifactId>globs</artifactId>
136-
<version>4.12.0</version>
136+
<version>5.0-SNAPSHOT</version>
137137
</dependency>
138138
<dependency>
139139
<groupId>org.globsframework</groupId>
140140
<artifactId>globs-gson</artifactId>
141-
<version>4.2.0</version>
141+
<version>5.0-SNAPSHOT</version>
142142
</dependency>
143143
<dependency>
144144
<groupId>org.apache.commons</groupId>
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package org.globsframework.csv;
2+
3+
import org.globsframework.core.metamodel.fields.Field;
4+
5+
public interface HeaderToField {
6+
Field getField(String headerName);
7+
}

src/main/java/org/globsframework/csv/ImportFile.java

Lines changed: 28 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ public class ImportFile {
4949
private boolean isExcel;
5050
private Pattern filterLine;
5151
private String defaultGlobTypeName = "DefaultCsv";
52+
private HeaderToField headerResolver;
5253

5354
public static InputStreamReader createReaderWithBomCheck(InputStream inputStream, Charset defaultCharset) throws IOException {
5455
BOMInputStream in = new BOMInputStream(inputStream, ByteOrderMark.UTF_8, ByteOrderMark.UTF_16LE, ByteOrderMark.UTF_16BE,
@@ -147,7 +148,7 @@ static public GlobType extractHeader(InputStream inputStream, Character separato
147148
for (String s1 : headerMap.keySet()) {
148149
globTypeBuilder.declareStringField(s1);
149150
}
150-
return globTypeBuilder.get();
151+
return globTypeBuilder.build();
151152
}
152153

153154
private static String getValue(CsvLine record, int index, boolean trim) {
@@ -206,6 +207,11 @@ public ImportFile withNameFrom(String name) {
206207
return this;
207208
}
208209

210+
public ImportFile withHeaderResolver(HeaderToField headerResolver){
211+
this.headerResolver = headerResolver;
212+
return this;
213+
}
214+
209215
public ImportFile withCharSet(Charset charSet) {
210216
this.charSet = charSet;
211217
return this;
@@ -262,7 +268,7 @@ interface CsvDocument {
262268

263269

264270
public Importer createExcel(InputStream inputStream, GlobType globType) throws IOException {
265-
final DefaultDataRead dataRead = new DefaultDataRead(loadExcel(inputStream), trim, reNameFrom);
271+
final DefaultDataRead dataRead = new DefaultDataRead(loadExcel(inputStream), trim, reNameFrom, headerResolver);
266272
if (globType == null) {
267273
globType = dataRead.createDefault(defaultGlobTypeName);
268274
}
@@ -281,7 +287,7 @@ public Importer create(Reader reader, GlobType globType) throws IOException {
281287
} else {
282288
parse = readFix(reader, globType);
283289
}
284-
DefaultDataRead dataRead = new DefaultDataRead(parse, trim, reNameFrom);
290+
DefaultDataRead dataRead = new DefaultDataRead(parse, trim, reNameFrom, headerResolver);
285291
if (globType == null) {
286292
globType = dataRead.createDefault(defaultGlobTypeName);
287293
}
@@ -543,7 +549,7 @@ public void importContentExcel(InputStream inputStream, Consumer<Glob> consumer,
543549
}
544550

545551
public DataRead getDataReader(InputStream inputStream) throws IOException {
546-
return new DefaultDataRead(load(createReaderFromStream(inputStream)), trim, reNameFrom);
552+
return new DefaultDataRead(load(createReaderFromStream(inputStream)), trim, reNameFrom, headerResolver);
547553
}
548554

549555
private CsvDocument loadExcel(InputStream inputStream) {
@@ -650,14 +656,16 @@ interface FieldReader {
650656

651657
static class DefaultDataRead implements DataRead {
652658
private final String reNameFrom;
659+
private final HeaderToField headerResolver;
653660
private CsvDocument parse;
654661
private boolean trim;
655662
private int countLine = 0;
656663

657-
public DefaultDataRead(CsvDocument parse, boolean trim, String reNameFrom) {
664+
public DefaultDataRead(CsvDocument parse, boolean trim, String reNameFrom, HeaderToField headerResolver) {
658665
this.parse = parse;
659666
this.trim = trim;
660667
this.reNameFrom = reNameFrom;
668+
this.headerResolver = headerResolver;
661669
}
662670

663671
GlobType createDefault(String defaultGlobTypeName) {
@@ -666,15 +674,21 @@ GlobType createDefault(String defaultGlobTypeName) {
666674
for (String s1 : headerMap.keySet()) {
667675
globTypeBuilder.declareStringField(s1);
668676
}
669-
return globTypeBuilder.get();
677+
return globTypeBuilder.build();
670678
}
671679

672680
public void read(Consumer<Glob> consumer, GlobType globType) {
673681
ImportReaderBuilder readerBuilder = new ImportReaderBuilder(globType, trim, parse);
674682
RemapName remapName = new RemapName(globType, reNameFrom);
675683
Map<String, Integer> headerMap = parse.getHeader();
676684
for (Map.Entry<String, Integer> stringIntegerEntry : headerMap.entrySet()) {
677-
Field field = remapName.headNameToField.get(stringIntegerEntry.getKey());
685+
Field field = null;
686+
if (headerResolver != null) {
687+
field = headerResolver.getField(stringIntegerEntry.getKey());
688+
}
689+
if (field == null) {
690+
field = remapName.headNameToField.get(stringIntegerEntry.getKey());
691+
}
678692
if (field == null) {
679693
field = findField(globType, stringIntegerEntry.getKey());
680694
}
@@ -1303,7 +1317,13 @@ private ImportReader initImportReader(GlobType targetType, Glob csvHeader, CsvLi
13031317
DefaultDataRead.RemapName remapName = new DefaultDataRead.RemapName(targetType, reNameFrom);
13041318
for (int i = 1; i < record.size(); i++) {
13051319
String key = record.getAt(i);
1306-
Field field = remapName.headNameToField.get(key);
1320+
Field field = null;
1321+
if (headerResolver != null) {
1322+
field = headerResolver.getField(key);
1323+
}
1324+
if (field == null) {
1325+
field = remapName.headNameToField.get(key);
1326+
}
13071327
if (field == null) {
13081328
field = findField(targetType, key);
13091329
}

src/main/java/org/globsframework/csv/RealReformater.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ public void apply(Glob from, MutableGlob to) {
7272
onSum(fromType, from, str);
7373
}
7474
}
75-
resultType = outTypeBuilder.get();
75+
resultType = outTypeBuilder.build();
7676
}
7777

7878
private void onFrom(GlobType fromType, Glob from, StringField str) {

src/main/java/org/globsframework/csv/annotation/CsvHeader.java

Lines changed: 22 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,10 @@
77
import org.globsframework.core.metamodel.fields.BooleanField;
88
import org.globsframework.core.metamodel.fields.StringField;
99
import org.globsframework.core.metamodel.impl.DefaultGlobTypeBuilder;
10+
import org.globsframework.core.model.Glob;
1011
import org.globsframework.core.model.Key;
1112
import org.globsframework.core.model.KeyBuilder;
13+
import org.globsframework.core.model.MutableGlob;
1214

1315
public class CsvHeader {
1416
public static final GlobType TYPE;
@@ -26,24 +28,28 @@ public class CsvHeader {
2628

2729
static {
2830
GlobTypeBuilder typeBuilder = new DefaultGlobTypeBuilder("CsvHeader");
29-
TYPE = typeBuilder.unCompleteType();
3031
name = typeBuilder.declareStringField("name");
3132
firstLineIsHeader = typeBuilder.declareBooleanField("firstLineIsHeader");
32-
typeBuilder.complete();
33+
typeBuilder.register(GlobCreateFromAnnotation.class, annotation -> getMutableGlob((CsvHeader_) annotation));
34+
TYPE = typeBuilder.build();
3335
KEY = KeyBuilder.newEmptyKey(TYPE);
34-
typeBuilder
35-
.register(GlobCreateFromAnnotation.class, annotation -> TYPE.instantiate()
36-
.set(name, ((CsvHeader_) annotation).value())
37-
.set(firstLineIsHeader, ((CsvHeader_) annotation).firstLineIsHeader()));
38-
39-
40-
// GlobTypeLoaderFactory.create(CsvHeader.class, "CsvHeader")
41-
// .register(GlobCreateFromAnnotation.class, annotation -> TYPE.instantiate()
42-
// .set(name, ((CsvHeader_) annotation).value())
43-
// .set(firstLineIsHeader, ((CsvHeader_) annotation).firstLineIsHeader())
44-
// .set(noHeader, ((CsvHeader_) annotation).noHeader())
45-
// .set(header, ((CsvHeader_) annotation).header())
46-
// )
47-
// .load();
36+
}
37+
38+
private static MutableGlob getMutableGlob(CsvHeader_ annotation) {
39+
return TYPE.instantiate()
40+
.set(name, annotation.value())
41+
.set(firstLineIsHeader, annotation.firstLineIsHeader());
42+
}
43+
44+
public static Glob create(String name) {
45+
return TYPE.instantiate()
46+
.set(CsvHeader.name, name)
47+
.set(CsvHeader.firstLineIsHeader, false);
48+
}
49+
50+
public static Glob create(String name, boolean firstLineIsHeader) {
51+
return TYPE.instantiate()
52+
.set(CsvHeader.name, name)
53+
.set(CsvHeader.firstLineIsHeader, firstLineIsHeader);
4854
}
4955
}

src/main/java/org/globsframework/csv/annotation/CsvSeparator.java

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import org.globsframework.core.metamodel.impl.DefaultGlobTypeBuilder;
99
import org.globsframework.core.model.Key;
1010
import org.globsframework.core.model.KeyBuilder;
11+
import org.globsframework.core.model.MutableGlob;
1112

1213
public class CsvSeparator {
1314
public static final GlobType TYPE;
@@ -20,16 +21,14 @@ public class CsvSeparator {
2021

2122
static {
2223
GlobTypeBuilder typeBuilder = new DefaultGlobTypeBuilder("CsvSeparator");
23-
TYPE = typeBuilder.unCompleteType();
2424
SEPARATOR = typeBuilder.declareStringField("separator");
25-
typeBuilder.register(GlobCreateFromAnnotation.class, annotation -> TYPE.instantiate()
26-
.set(SEPARATOR, new String(new char[]{((CsvSeparator_) annotation).value()})));
27-
typeBuilder.complete();
25+
typeBuilder.register(GlobCreateFromAnnotation.class, annotation -> getMutableGlob((CsvSeparator_) annotation));
26+
TYPE = typeBuilder.build();
2827
KEY = KeyBuilder.newEmptyKey(TYPE);
28+
}
2929

30-
// GlobTypeLoaderFactory.create(CsvSeparator.class, "CsvSeparator")
31-
// .register(GlobCreateFromAnnotation.class, annotation -> TYPE.instantiate()
32-
// .set(SEPARATOR, new String(new char[]{((CsvSeparator_) annotation).value()})))
33-
// .load();
30+
private static MutableGlob getMutableGlob(CsvSeparator_ annotation) {
31+
return TYPE.instantiate()
32+
.set(SEPARATOR, new String(new char[]{annotation.value()}));
3433
}
3534
}

src/main/java/org/globsframework/csv/annotation/CsvValueSeparator.java

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import org.globsframework.core.metamodel.impl.DefaultGlobTypeBuilder;
99
import org.globsframework.core.model.Key;
1010
import org.globsframework.core.model.KeyBuilder;
11+
import org.globsframework.core.model.MutableGlob;
1112

1213
public class CsvValueSeparator {
1314
public static final GlobType TYPE;
@@ -19,15 +20,14 @@ public class CsvValueSeparator {
1920

2021
static {
2122
GlobTypeBuilder typeBuilder = new DefaultGlobTypeBuilder("ValueSeparator");
22-
TYPE = typeBuilder.unCompleteType();
2323
SEPARATOR = typeBuilder.declareStringField("separator");
24-
typeBuilder.register(GlobCreateFromAnnotation.class, annotation -> TYPE.instantiate()
25-
.set(SEPARATOR, String.valueOf(((CsvValueSeparator_) annotation).value())));
26-
typeBuilder.complete();
24+
typeBuilder.register(GlobCreateFromAnnotation.class, annotation -> getMutableGlob((CsvValueSeparator_) annotation));
25+
TYPE = typeBuilder.build();
2726
KEY = KeyBuilder.newEmptyKey(TYPE);
28-
// GlobTypeLoaderFactory.create(CsvValueSeparator.class, "ValueSeparator")
29-
// .register(GlobCreateFromAnnotation.class, annotation -> TYPE.instantiate()
30-
// .set(SEPARATOR, String.valueOf(((CsvValueSeparator_) annotation).value())))
31-
// .load();
27+
}
28+
29+
private static MutableGlob getMutableGlob(CsvValueSeparator_ annotation) {
30+
return TYPE.instantiate()
31+
.set(SEPARATOR, String.valueOf(annotation.value()));
3232
}
3333
}

src/main/java/org/globsframework/csv/annotation/ExportBooleanFormat.java

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import org.globsframework.core.metamodel.impl.DefaultGlobTypeBuilder;
99
import org.globsframework.core.model.Key;
1010
import org.globsframework.core.model.KeyBuilder;
11+
import org.globsframework.core.model.MutableGlob;
1112

1213
public class ExportBooleanFormat {
1314
public static final GlobType TYPE;
@@ -21,22 +22,18 @@ public class ExportBooleanFormat {
2122

2223
static {
2324
GlobTypeBuilder typeBuilder = new DefaultGlobTypeBuilder("ExportBooleanFormat");
24-
TYPE = typeBuilder.unCompleteType();
2525
TRUE_ = typeBuilder.declareStringField("true");
2626
FALSE_ = typeBuilder.declareStringField("false");
27-
typeBuilder.register(GlobCreateFromAnnotation.class, annotation -> TYPE.instantiate()
28-
.set(TRUE_, ((ExportBooleanFormat_) annotation).true_())
29-
.set(FALSE_, ((ExportBooleanFormat_) annotation).false_())
30-
);
31-
typeBuilder.complete();
27+
typeBuilder.register(GlobCreateFromAnnotation.class,
28+
annotation -> getMutableGlob((ExportBooleanFormat_) annotation));
29+
TYPE = typeBuilder.build();
3230

3331
KEY = KeyBuilder.newEmptyKey(TYPE);
32+
}
3433

35-
// GlobTypeLoaderFactory.create(ExportBooleanFormat.class, "ExportBooleanFormat")
36-
// .register(GlobCreateFromAnnotation.class, annotation -> TYPE.instantiate()
37-
// .set(TRUE_, ((ExportBooleanFormat_) annotation).true_())
38-
// .set(FALSE_, ((ExportBooleanFormat_) annotation).false_())
39-
// )
40-
// .load();
34+
private static MutableGlob getMutableGlob(ExportBooleanFormat_ annotation) {
35+
return TYPE.instantiate()
36+
.set(TRUE_, annotation.true_())
37+
.set(FALSE_, annotation.false_());
4138
}
4239
}

src/main/java/org/globsframework/csv/annotation/ExportColumnSize.java

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,10 @@
66
import org.globsframework.core.metamodel.annotations.InitUniqueKey;
77
import org.globsframework.core.metamodel.fields.IntegerField;
88
import org.globsframework.core.metamodel.impl.DefaultGlobTypeBuilder;
9+
import org.globsframework.core.model.Glob;
910
import org.globsframework.core.model.Key;
1011
import org.globsframework.core.model.KeyBuilder;
12+
import org.globsframework.core.model.MutableGlob;
1113

1214
public class ExportColumnSize {
1315
public static final GlobType TYPE;
@@ -20,17 +22,19 @@ public class ExportColumnSize {
2022

2123
static {
2224
GlobTypeBuilder typeBuilder = new DefaultGlobTypeBuilder("ExportColumnSize");
23-
TYPE = typeBuilder.unCompleteType();
2425
SIZE = typeBuilder.declareIntegerField("size");
25-
typeBuilder.register(GlobCreateFromAnnotation.class, annotation -> TYPE.instantiate()
26-
.set(SIZE, ((ExportColumnSize_) annotation).value()));
27-
typeBuilder.complete();
26+
typeBuilder.register(GlobCreateFromAnnotation.class, annotation -> getMutableGlob((ExportColumnSize_) annotation));
27+
TYPE = typeBuilder.build();
2828

2929
KEY = KeyBuilder.newEmptyKey(TYPE);
30+
}
31+
32+
private static MutableGlob getMutableGlob(ExportColumnSize_ annotation) {
33+
return TYPE.instantiate()
34+
.set(SIZE, annotation.value());
35+
}
3036

31-
// GlobTypeLoaderFactory.create(ExportColumnSize.class, "ExportColumnSize")
32-
// .register(GlobCreateFromAnnotation.class, annotation -> TYPE.instantiate()
33-
// .set(SIZE, ((ExportColumnSize_) annotation).value()))
34-
// .load();
37+
public static Glob create(int size) {
38+
return TYPE.instantiate().set(SIZE, size);
3539
}
3640
}

0 commit comments

Comments
 (0)