public java.util.Optional<Narrative> fromFile(File narrativeFile, String defaultType) { try (BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(narrativeFile), StandardCharsets.UTF_8))) { List<String> lines = readPreambleFrom(reader); String title = null; String type = defaultType; String cardNumber = findCardNumberIn(lines); List<String> versionNumbers = findVersionNumberIn(lines); Optional<String> titleLine = readOptionalTitleFrom(lines); if (titleLine.isPresent()) { title = titleFrom(titleLine.get()); type = typeFrom(titleLine.get()).orElse(defaultType); } String text = readNarrativeFrom(lines); reader.close(); List<TestTag> tags = (StringUtils.isEmpty(title)) ? new ArrayList<>() : Collections.singletonList(TestTag.withName(title).andType("story")); return java.util.Optional.of(new Narrative(Optional.ofNullable(title), Optional.of(narrativeFile.getPath()), Optional.ofNullable(cardNumber), versionNumbers, type, text, tags)); } catch (IOException ex) { ex.printStackTrace(); } return java.util.Optional.empty(); }