gedcom-api/src/main/java/de/nth/chronicle/gedcom/parser/HeaderParser.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());
}
}