public MedlineGenerator(String seed) { String[] fields = seed.split("\\r?\\n"); for (String fieldData : fields) { if (fieldData.length() < 4) { continue; } final Scanner scanner = new Scanner(fieldData); scanner.useDelimiter("\\t"); String fieldName = scanner.next(); scanner.useDelimiter("; "); scanner.findInLine("\t"); MedlineFieldDefinition defn = MedlineFieldDefinitions.getDefinition(fieldName); MedlineFieldDefinition.FieldType fieldType = defn != null ? defn.type : MedlineFieldDefinition.FieldType.SINGLE_TEXT_VALUE; BaseFieldModel fieldModel = null; Iterable<Pair<Long, String>> scannerIterator = new Iterable<Pair<Long, String>>() { @Override public Iterator<Pair<Long, String>> iterator() { return new Iterator<Pair<Long, String>>() { @Override public boolean hasNext() { return scanner.hasNext(); } @Override public Pair<Long, String> next() { String value = ""; String[] data; do { String next = scanner.next(); data = next.split("\\t"); if (data.length > 2) { throw new IllegalStateException( String.format("Cannot parse word: '%s'", value + next)); } value += data[0]; } while (data.length < 2); return new Pair<>(Long.parseLong(data[1]), value); } @Override public void remove() { throw new NotImplementedException(); } }; } }; switch (fieldType) { case ARRAY_TEXT_VALUES: case SINGLE_TEXT_VALUE: case WORDS: SimpleFieldModel model = new SimpleFieldModel(fieldName, fieldType); for (Pair<Long, String> pair : scannerIterator) { model.addValue(pair.getKey(), pair.getValue()); } fieldModel = model; break; case SINGLE_OBJECT_VALUE: ObjectFieldModel objectModel = new ObjectFieldModel(fieldName); for (Pair<Long, String> pair : scannerIterator) { long weight = pair.getKey(); String propertyData = pair.getValue(); int firstColonIndex = propertyData.indexOf(':'); String propertyName = propertyData.substring(0, firstColonIndex); String propertyValue = propertyData.substring(firstColonIndex); objectModel.addValue(propertyName, weight, propertyValue); } fieldModel = objectModel; break; } fieldModels.put(fieldName, fieldModel); } }