|
3 | 3 | import java.io.IOException;
|
4 | 4 | import java.io.StringWriter;
|
5 | 5 | import java.io.Writer;
|
| 6 | +import java.util.Collection; |
6 | 7 | import java.util.Comparator;
|
| 8 | +import java.util.HashSet; |
7 | 9 | import java.util.List;
|
8 | 10 | import java.util.Locale;
|
9 | 11 | import java.util.Optional;
|
| 12 | +import java.util.Set; |
10 | 13 | import java.util.SortedSet;
|
11 | 14 | import java.util.TreeSet;
|
12 | 15 | import java.util.function.Predicate;
|
|
21 | 24 | import org.jabref.model.entry.field.BibField;
|
22 | 25 | import org.jabref.model.entry.field.Field;
|
23 | 26 | import org.jabref.model.entry.field.InternalField;
|
24 |
| -import org.jabref.model.entry.field.OrFields; |
25 | 27 | import org.jabref.model.strings.StringUtil;
|
26 | 28 |
|
27 | 29 | public class BibEntryWriter {
|
@@ -91,30 +93,44 @@ public void writeWithoutPrependedNewlines(BibEntry entry, Writer out, BibDatabas
|
91 | 93 | */
|
92 | 94 | private void writeRequiredFieldsFirstRemainingFieldsSecond(BibEntry entry, Writer out,
|
93 | 95 | BibDatabaseMode bibDatabaseMode) throws IOException {
|
94 |
| - // Write header with type and bibtex-key. |
| 96 | + // Write header with type and bibtex-key |
95 | 97 | TypedBibEntry typedEntry = new TypedBibEntry(entry, bibDatabaseMode);
|
96 | 98 | out.write('@' + typedEntry.getTypeForDisplay() + '{');
|
97 | 99 |
|
98 | 100 | writeKeyField(entry, out);
|
99 | 101 |
|
100 |
| - TreeSet<Field> written = new TreeSet<>(Comparator.comparing(Field::getName)); |
| 102 | + Set<Field> written = new HashSet<>(); |
101 | 103 | written.add(InternalField.KEY_FIELD);
|
102 | 104 | int indentation = getLengthOfLongestFieldName(entry);
|
103 | 105 |
|
104 | 106 | Optional<BibEntryType> type = entryTypesManager.enrich(entry.getType(), bibDatabaseMode);
|
105 | 107 | if (type.isPresent()) {
|
106 |
| - // Write required fields first. |
107 |
| - for (OrFields value : type.get().getRequiredFields()) { |
108 |
| - for (Field field : value) { |
109 |
| - writeField(entry, out, field, indentation); |
110 |
| - written.add(field); |
111 |
| - } |
| 108 | + // Write required fields first |
| 109 | + List<Field> requiredFields = type.get() |
| 110 | + .getRequiredFields() |
| 111 | + .stream() |
| 112 | + .flatMap(Collection::stream) |
| 113 | + .sorted(Comparator.comparing(Field::getName)) |
| 114 | + .collect(Collectors.toList()); |
| 115 | + |
| 116 | + for (Field field : requiredFields) { |
| 117 | + writeField(entry, out, field, indentation); |
112 | 118 | }
|
113 |
| - // Then optional fields. |
114 |
| - for (BibField field : type.get().getOptionalFields()) { |
115 |
| - writeField(entry, out, field.getField(), indentation); |
116 |
| - written.add(field.getField()); |
| 119 | + |
| 120 | + // Then optional fields |
| 121 | + List<Field> optionalFields = type.get() |
| 122 | + .getOptionalFields() |
| 123 | + .stream() |
| 124 | + .map(BibField::getField) |
| 125 | + .sorted(Comparator.comparing(Field::getName)) |
| 126 | + .collect(Collectors.toList()); |
| 127 | + |
| 128 | + for (Field field : optionalFields) { |
| 129 | + writeField(entry, out, field, indentation); |
117 | 130 | }
|
| 131 | + |
| 132 | + written.addAll(requiredFields); |
| 133 | + written.addAll(optionalFields); |
118 | 134 | }
|
119 | 135 | // Then write remaining fields in alphabetic order.
|
120 | 136 | SortedSet<Field> remainingFields = entry.getFields()
|
|
0 commit comments