/** * Copyright © 2002 Instituto Superior Técnico * * This file is part of FenixEdu Academic. * * FenixEdu Academic is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * FenixEdu Academic is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with FenixEdu Academic. If not, see <http://www.gnu.org/licenses/>. */ /* * Created on Jan 26, 2006 */ package org.fenixedu.academic.domain.degreeStructure; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.apache.commons.lang.StringUtils; import org.fenixedu.academic.domain.degreeStructure.BibliographicReferences.BibliographicReference; import org.fenixedu.academic.domain.degreeStructure.BibliographicReferences.BibliographicReferenceType; public class Externalization { public static String externalizeBibliographicReferences(BibliographicReferences source) { return write(source); } public static BibliographicReferences internalizeBibliographicReferences(String source) { if ((source != null) && (source.length() > 0)) { return read(source); } else { return new BibliographicReferences(); } } private static final String NEW_LINE = "\r\n"; private static final String ELEMENT_SEPARATOR = "||"; private static String write(final BibliographicReferences bibliographicReferences) { final StringBuilder stringBuilder = new StringBuilder(); final Iterator<BibliographicReference> references = bibliographicReferences.getBibliographicReferencesList().iterator(); while (references.hasNext()) { write(stringBuilder, references.next()); if (references.hasNext()) { stringBuilder.append(NEW_LINE); } } return stringBuilder.toString(); } private static void write(final StringBuilder stringBuilder, final BibliographicReference reference) { stringBuilder.append(reference.getYear()).append(ELEMENT_SEPARATOR); stringBuilder.append(reference.getTitle()).append(ELEMENT_SEPARATOR); stringBuilder.append(reference.getAuthors()).append(ELEMENT_SEPARATOR); stringBuilder.append(reference.getReference()).append(ELEMENT_SEPARATOR); stringBuilder.append(StringUtils.isEmpty(reference.getUrl()) ? "" : reference.getUrl()).append(ELEMENT_SEPARATOR); stringBuilder.append(reference.getType()).append(ELEMENT_SEPARATOR); stringBuilder.append(reference.getOrder()); } private static BibliographicReferences read(String source) { List<BibliographicReference> refs = new ArrayList<>(); fillBibliographicReferences(refs, source); return new BibliographicReferences(refs); } private static void fillBibliographicReferences(List<BibliographicReference> refs, final String source) { final int indexOfSep1 = source.indexOf(ELEMENT_SEPARATOR); final int indexOfSep2 = source.indexOf(ELEMENT_SEPARATOR, indexOfSep1 + ELEMENT_SEPARATOR.length()); final int indexOfSep3 = source.indexOf(ELEMENT_SEPARATOR, indexOfSep2 + ELEMENT_SEPARATOR.length()); final int indexOfSep4 = source.indexOf(ELEMENT_SEPARATOR, indexOfSep3 + ELEMENT_SEPARATOR.length()); final int indexOfSep5 = source.indexOf(ELEMENT_SEPARATOR, indexOfSep4 + ELEMENT_SEPARATOR.length()); final int indexOfSep6 = source.indexOf(ELEMENT_SEPARATOR, indexOfSep5 + ELEMENT_SEPARATOR.length()); final int temp = source.indexOf(NEW_LINE, indexOfSep6 + ELEMENT_SEPARATOR.length()); final int indexOfSep7 = temp < 0 ? source.length() : temp; refs.add(new BibliographicReference( source.substring(0, indexOfSep1), source.substring(indexOfSep1 + ELEMENT_SEPARATOR.length(), indexOfSep2), source.substring(indexOfSep2 + ELEMENT_SEPARATOR.length(), indexOfSep3), source.substring(indexOfSep3 + ELEMENT_SEPARATOR.length(), indexOfSep4), source.substring(indexOfSep4 + ELEMENT_SEPARATOR.length(), indexOfSep5), source.substring(indexOfSep5 + ELEMENT_SEPARATOR.length(), indexOfSep6).equals("null") ? BibliographicReferenceType.MAIN : BibliographicReferenceType .valueOf(source.substring(indexOfSep5 + ELEMENT_SEPARATOR.length(), indexOfSep6)), Integer.valueOf(source .substring(indexOfSep6 + ELEMENT_SEPARATOR.length(), indexOfSep7)))); if (indexOfSep7 + NEW_LINE.length() < source.length()) { fillBibliographicReferences(refs, source.substring(indexOfSep7 + NEW_LINE.length())); } } }