diff --git a/ccm-sci-publications/lib/jbibtex-1.0.2.jar b/ccm-sci-publications/lib/jbibtex-1.0.2.jar new file mode 100644 index 000000000..185d2cd6c Binary files /dev/null and b/ccm-sci-publications/lib/jbibtex-1.0.2.jar differ diff --git a/ccm-sci-publications/src/META-INF/services/com.arsdigita.cms.scipublications.importer.bibtex.BibTeXConverter b/ccm-sci-publications/src/META-INF/services/com.arsdigita.cms.scipublications.importer.bibtex.BibTeXConverter new file mode 100644 index 000000000..e69de29bb diff --git a/ccm-sci-publications/src/com/arsdigita/cms/scipublications/importer/bibtex/BibTeXConverter.java b/ccm-sci-publications/src/com/arsdigita/cms/scipublications/importer/bibtex/BibTeXConverter.java new file mode 100644 index 000000000..e2cfed1f8 --- /dev/null +++ b/ccm-sci-publications/src/com/arsdigita/cms/scipublications/importer/bibtex/BibTeXConverter.java @@ -0,0 +1,35 @@ +package com.arsdigita.cms.scipublications.importer.bibtex; + +import com.arsdigita.cms.contenttypes.Publication; +import com.arsdigita.cms.contenttypes.PublicationBundle; +import com.arsdigita.cms.scipublications.importer.report.PublicationImportReport; +import com.arsdigita.cms.scipublications.importer.util.ImporterUtil; +import org.jbibtex.BibTeXEntry; + +/** + * + * @param + * @param + * @author Jens Pelzetter + * @version $Id$ + */ +public interface BibTeXConverter { + + T createPublication(boolean pretend); + + B createBundle(T publication, boolean pretend); + + void processFields(final BibTeXEntry bibTeXEntry, + final T publication, + final ImporterUtil importerUtil, + final PublicationImportReport importReport, + final boolean pretend); + + /** + * Returns the supported BibTeX type. + * + * @return + */ + String getBibTeXType(); + +} diff --git a/ccm-sci-publications/src/com/arsdigita/cms/scipublications/importer/bibtex/BibTeXConverters.java b/ccm-sci-publications/src/com/arsdigita/cms/scipublications/importer/bibtex/BibTeXConverters.java new file mode 100644 index 000000000..1408c5780 --- /dev/null +++ b/ccm-sci-publications/src/com/arsdigita/cms/scipublications/importer/bibtex/BibTeXConverters.java @@ -0,0 +1,56 @@ +package com.arsdigita.cms.scipublications.importer.bibtex; + +import com.arsdigita.cms.scipublications.importer.report.PublicationImportReport; +import com.arsdigita.cms.scipublications.importer.util.ImporterUtil; +import java.util.HashMap; +import java.util.Map; +import java.util.ServiceLoader; +import org.apache.log4j.Logger; +import org.jbibtex.BibTeXEntry; + +/** + * Central access point for retrieving {@link BibTeXConverter}s for importing publication data in the BibTeX format. + * + * @author Jens Pelzetter + * @version $Id$ + */ +public class BibTeXConverters { + + private final static Logger LOGGER = Logger.getLogger(BibTeXConverters.class); + private final Map> converters = new HashMap>(); + + @SuppressWarnings("rawtypes") + private BibTeXConverters() { + LOGGER.debug("Loading BibTeX converters..."); + final ServiceLoader converterServices = ServiceLoader.load(BibTeXConverter.class); + + for(BibTeXConverter converter : converterServices) { + LOGGER.debug(String.format("Found converter for BibTeX type '%s'.", converter.getBibTeXType())); + + converters.put(converter.getBibTeXType(), converter); + } + LOGGER.debug(String.format("Found %d BibTeX converters.", converters.size())); + } + + private static class Instance { + + private static BibTeXConverters INSTANCE = new BibTeXConverters(); + + } + + public static BibTeXConverters getInstance() { + return Instance.INSTANCE; + } + + public PublicationImportReport convert(final BibTeXEntry bibTeXEntry, + final ImporterUtil importerUtil, + final boolean pretend, + final boolean publishNewItems) { + final PublicationImportReport report = new PublicationImportReport(); + + + + return report; + } + +} diff --git a/ccm-sci-publications/src/com/arsdigita/cms/scipublications/importer/bibtex/BibTeXPublicationsImporter.java b/ccm-sci-publications/src/com/arsdigita/cms/scipublications/importer/bibtex/BibTeXPublicationsImporter.java index d21cdb1e6..a868c1a6d 100644 --- a/ccm-sci-publications/src/com/arsdigita/cms/scipublications/importer/bibtex/BibTeXPublicationsImporter.java +++ b/ccm-sci-publications/src/com/arsdigita/cms/scipublications/importer/bibtex/BibTeXPublicationsImporter.java @@ -4,10 +4,16 @@ import com.arsdigita.cms.scipublications.imexporter.PublicationFormat; import com.arsdigita.cms.scipublications.importer.SciPublicationsImportException; import com.arsdigita.cms.scipublications.importer.SciPublicationsImporter; import com.arsdigita.cms.scipublications.importer.report.ImportReport; +import com.arsdigita.cms.scipublications.importer.util.ImporterUtil; +import java.io.StringReader; import java.util.Map; import javax.activation.MimeType; import javax.activation.MimeTypeParseException; import org.apache.log4j.Logger; +import org.jbibtex.BibTeXDatabase; +import org.jbibtex.BibTeXEntry; +import org.jbibtex.BibTeXParser; +import org.jbibtex.Key; /** * @@ -27,15 +33,27 @@ public class BibTeXPublicationsImporter implements SciPublicationsImporter { return new PublicationFormat("BibTeX", null, "bib"); } } - + public ImportReport importPublications(final String publications, final Map importerParams, final boolean pretend, final boolean publishNewItems) throws SciPublicationsImportException { + final ImportReport report = new ImportReport(); + final ImporterUtil importerUtil = new ImporterUtil(publishNewItems); + final BibTeXConverters converters = BibTeXConverters.getInstance(); - throw new UnsupportedOperationException(); + final StringReader reader = new StringReader(publications); + final BibTeXParser parser = new BibTeXParser(reader); + final BibTeXDatabase database = parser.getDatabase(); + final Map entries = database.getEntries(); + + for(BibTeXEntry entry : entries.values()) { + report.addPublication(converters.convert(entry, importerUtil, pretend, publishNewItems)); + } + + return report; } }