81 lines
3.1 KiB
Java
81 lines
3.1 KiB
Java
package de.nth.chronicle.gedcom.parser;
|
|
|
|
import de.nth.chronicle.gedcom.exception.GedcomException;
|
|
import de.nth.chronicle.gedcom.exception.MissingRecordException;
|
|
import de.nth.chronicle.gedcom.exception.UnrecognisedGedcomForm;
|
|
import de.nth.chronicle.gedcom.type.GedcomFormType;
|
|
import de.nth.chronicle.gedcom.type.Header;
|
|
|
|
public class HeaderParser implements RecordParser<Header> {
|
|
|
|
@Override
|
|
public Header parse(RecordChunk chunk) throws GedcomException {
|
|
|
|
Header.HeaderBuilder builder = Header.builder();
|
|
|
|
for(RecordChunk subChunk : chunk.getSubRecords()) {
|
|
|
|
switch(subChunk.getTag()) {
|
|
case "GEDC":
|
|
parseGedcomMeta(subChunk, builder);
|
|
break;
|
|
case "CHAR":
|
|
builder.encoding(subChunk.getValue());
|
|
break;
|
|
case "SOUR":
|
|
parseGedcomSource(subChunk, builder);
|
|
break;
|
|
case "DATE":
|
|
break;
|
|
case "FILE":
|
|
builder.fileName(subChunk.getValue());
|
|
break;
|
|
case "LANG":
|
|
builder.language(subChunk.getValue());
|
|
break;
|
|
case "COPR":
|
|
builder.copyright(subChunk.getValue());
|
|
break;
|
|
case "PLAC":
|
|
break;
|
|
case "NOTE":
|
|
builder.contentDescription(subChunk.getValue());
|
|
break;
|
|
}
|
|
}
|
|
|
|
return builder.build();
|
|
}
|
|
|
|
private void parseGedcomMeta(RecordChunk chunk, Header.HeaderBuilder builder) {
|
|
|
|
GedcomFormType formType = GedcomFormType.forKey(chunk.findFirstValue("FORM")
|
|
.orElseThrow(() -> new MissingRecordException("HEAD.GEDC.FORM")));
|
|
|
|
if(formType == null) {
|
|
throw new UnrecognisedGedcomForm(chunk.findFirstValue("FORM").orElse(null));
|
|
}
|
|
|
|
builder.gedcomMeta(Header.Meta.builder()
|
|
.version(chunk.findFirstValue("VERS")
|
|
.orElseThrow(() -> new MissingRecordException("HEAD.GEDC.VERS")))
|
|
.formType(formType)
|
|
.formVersion(chunk.findFirstValue("FORM.VERS")
|
|
.orElse(null))
|
|
.build());
|
|
}
|
|
|
|
private void parseGedcomSource(RecordChunk chunk, Header.HeaderBuilder builder) {
|
|
|
|
|
|
builder.source(Header.Source.builder()
|
|
.systemId(chunk.getValue())
|
|
.version(chunk.findFirstValue("VERS").orElse(null))
|
|
.productName(chunk.findFirstValue("NAME").orElse(null))
|
|
.businessName(chunk.findFirstValue("CORP").orElse(null))
|
|
.address(chunk.findFirst("CORP.ADDR").map(RecordParser.ADDRESS::parse).orElse(null))
|
|
.build());
|
|
}
|
|
|
|
}
|