Skip to content

Commit ef97acb

Browse files
Fix NPE when importing newspaper course with metadata
1 parent a1f461c commit ef97acb

File tree

8 files changed

+31
-12
lines changed

8 files changed

+31
-12
lines changed

Kitodo/src/main/java/org/kitodo/production/forms/CalendarForm.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@
2828
import java.util.Map;
2929
import java.util.NoSuchElementException;
3030
import java.util.Objects;
31+
import java.util.function.Function;
32+
import java.util.stream.Collectors;
3133

3234
import javax.faces.context.FacesContext;
3335
import javax.faces.view.ViewScoped;
@@ -48,6 +50,7 @@
4850
import org.kitodo.exceptions.DoctypeMissingException;
4951
import org.kitodo.exceptions.ProcessGenerationException;
5052
import org.kitodo.production.forms.createprocess.ProcessDetail;
53+
import org.kitodo.production.forms.createprocess.ProcessSimpleMetadata;
5154
import org.kitodo.production.forms.createprocess.ProcessTextMetadata;
5255
import org.kitodo.production.helper.Helper;
5356
import org.kitodo.production.helper.XMLUtils;
@@ -614,12 +617,17 @@ public void upload() {
614617
return;
615618
}
616619
Document xml = XMLUtils.load(uploadedFile.getInputStream());
617-
course = new Course(xml);
620+
List<ProcessDetail> processDetails = CalendarService
621+
.getAddableMetadataTable(ServiceManager.getProcessService().getById(parentId));
622+
Map<String, ProcessSimpleMetadata> processDetailsByMetadataID = processDetails.stream()
623+
.filter(ProcessSimpleMetadata.class::isInstance).map(ProcessSimpleMetadata.class::cast)
624+
.collect(Collectors.toMap(ProcessDetail::getMetadataID, Function.identity()));
625+
course = new Course(xml, processDetailsByMetadataID);
618626
Helper.removeManagedBean("GranularityForm");
619627
navigate(course.get(0));
620628
} catch (SAXException e) {
621629
Helper.setErrorMessage(UPLOAD_ERROR, "errorSAXException", logger, e);
622-
} catch (IOException e) {
630+
} catch (IOException | DataException | DAOException e) {
623631
Helper.setErrorMessage(UPLOAD_ERROR, e.getLocalizedMessage(), logger, e);
624632
} catch (IllegalArgumentException e) {
625633
Helper.setErrorMessage("calendar.upload.overlappingDateRanges", logger, e);

Kitodo/src/main/java/org/kitodo/production/forms/createprocess/ProcessBooleanMetadata.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ private ProcessBooleanMetadata(ProcessBooleanMetadata template) {
5757
}
5858

5959
@Override
60-
ProcessBooleanMetadata getClone() {
60+
public ProcessBooleanMetadata getClone() {
6161
return new ProcessBooleanMetadata(this);
6262
}
6363

Kitodo/src/main/java/org/kitodo/production/forms/createprocess/ProcessDateMetadata.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ private ProcessDateMetadata(ProcessDateMetadata template) {
4141
}
4242

4343
@Override
44-
ProcessTextMetadata getClone() {
44+
public ProcessTextMetadata getClone() {
4545
return new ProcessDateMetadata(this);
4646
}
4747

Kitodo/src/main/java/org/kitodo/production/forms/createprocess/ProcessSelectMetadata.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ private ProcessSelectMetadata(ProcessSelectMetadata template) {
9191
}
9292

9393
@Override
94-
ProcessSelectMetadata getClone() {
94+
public ProcessSelectMetadata getClone() {
9595
return new ProcessSelectMetadata(this);
9696
}
9797

Kitodo/src/main/java/org/kitodo/production/forms/createprocess/ProcessSimpleMetadata.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
import org.kitodo.api.dataformat.LogicalDivision;
2424
import org.kitodo.api.dataformat.PhysicalDivision;
2525

26-
abstract class ProcessSimpleMetadata extends ProcessDetail implements Serializable {
26+
public abstract class ProcessSimpleMetadata extends ProcessDetail implements Serializable {
2727

2828
static final List<Class<? extends Division<?>>> PARENT_CLASSES = Arrays.asList(LogicalDivision.class,
2929
PhysicalDivision.class);
@@ -50,7 +50,7 @@ protected ProcessSimpleMetadata(ProcessFieldedMetadata container, SimpleMetadata
5050
*
5151
* @return an independently mutable copy
5252
*/
53-
abstract ProcessSimpleMetadata getClone();
53+
public abstract ProcessSimpleMetadata getClone();
5454

5555
/**
5656
* Returns a simpler string representation of the Metadata.

Kitodo/src/main/java/org/kitodo/production/forms/createprocess/ProcessTextMetadata.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ private String addLeadingZeros(String value) {
4848
}
4949

5050
@Override
51-
ProcessTextMetadata getClone() {
51+
public ProcessTextMetadata getClone() {
5252
return new ProcessTextMetadata(this);
5353
}
5454

Kitodo/src/main/java/org/kitodo/production/model/bibliography/course/Course.java

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@
3434

3535
import org.apache.commons.lang3.StringUtils;
3636
import org.apache.commons.lang3.tuple.Pair;
37+
import org.kitodo.exceptions.MetadataException;
38+
import org.kitodo.production.forms.createprocess.ProcessSimpleMetadata;
3739
import org.kitodo.production.helper.XMLUtils;
3840
import org.kitodo.production.model.bibliography.course.metadata.CountableMetadata;
3941
import org.kitodo.production.model.bibliography.course.metadata.RecoveredMetadata;
@@ -279,14 +281,16 @@ public Course() {
279281
*
280282
* @param xml
281283
* XML document data structure
284+
* @param possibleProcessDetails
285+
* possible process details from the process creation form
282286
* @throws NoSuchElementException
283287
* if ELEMENT_COURSE or ELEMENT_PROCESSES cannot be found
284288
* @throws IllegalArgumentException
285289
* if the dates of two blocks do overlap
286290
* @throws NullPointerException
287291
* if a mandatory element is absent
288292
*/
289-
public Course(Document xml) {
293+
public Course(Document xml, Map<String, ProcessSimpleMetadata> possibleProcessDetails) {
290294
super();
291295
processesAreVolatile = false;
292296
Element rootNode = XMLUtils.getFirstChildWithTagName(xml, ELEMENT_COURSE);
@@ -308,7 +312,7 @@ public Course(Document xml) {
308312
}
309313
initialCapacity = processProcessNode(initialCapacity, lastIssueForDate, recoveredMetadata, processNode);
310314
}
311-
processRecoveredMetadata(recoveredMetadata);
315+
processRecoveredMetadata(recoveredMetadata, possibleProcessDetails);
312316
recalculateRegularityOfIssues();
313317
processesAreVolatile = true;
314318
}
@@ -362,7 +366,8 @@ private void processBlockNode(Map<LocalDate, IndividualIssue> lastIssueForDate,
362366
}
363367
}
364368

365-
private void processRecoveredMetadata(List<RecoveredMetadata> recoveredMetadata) {
369+
private void processRecoveredMetadata(List<RecoveredMetadata> recoveredMetadata,
370+
Map<String, ProcessSimpleMetadata> possibleProcessDetails) {
366371
Map<Pair<Block, String>, CountableMetadata> last = new HashMap<>();
367372
for (RecoveredMetadata metaDatum : recoveredMetadata) {
368373
Block foundBlock = null;
@@ -382,6 +387,12 @@ private void processRecoveredMetadata(List<RecoveredMetadata> recoveredMetadata)
382387
}
383388
CountableMetadata metadata = new CountableMetadata(foundBlock, Pair.of(metaDatum.getDate(), foundIssue));
384389
metadata.setMetadataType(metaDatum.getMetadataType());
390+
ProcessSimpleMetadata processSimpleMetadata = possibleProcessDetails.get(metaDatum.getMetadataType());
391+
if (Objects.isNull(processSimpleMetadata)) {
392+
throw new MetadataException("Cannot add metadata key " + metaDatum.getMetadataType(),
393+
new NoSuchElementException(metaDatum.getMetadataType()));
394+
}
395+
metadata.setMetadataDetail(processSimpleMetadata.getClone());
385396
metadata.setStartValue(metaDatum.getValue());
386397
metadata.setStepSize(metaDatum.getStepSize());
387398
foundBlock.addMetadata(metadata);

Kitodo/src/test/java/org/kitodo/production/model/bibliography/course/CourseTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ public class CourseTest {
3131
public void testCloneMethod() throws IOException, ParserConfigurationException, SAXException {
3232
String xmlString = new String(Files.readAllBytes(new File("src/test/resources/newspaper-course.xml").toPath()));
3333
Document xmlDocument = XMLUtils.parseXMLString(xmlString);
34-
Course course = new Course(xmlDocument);
34+
Course course = new Course(xmlDocument, null);
3535

3636
// assert / check some data from the xml file
3737
assertEquals(23L, course.getIndividualIssues().size());

0 commit comments

Comments
 (0)