From 257fe86954adc84db285754eaba845479515f7f0 Mon Sep 17 00:00:00 2001 From: jensp Date: Wed, 12 Dec 2012 14:01:57 +0000 Subject: [PATCH] =?UTF-8?q?Grundstruktur=20f=C3=BCr=20den=20RIS=20Importer?= =?UTF-8?q?=20f=C3=BCr=20Publikationen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: https://svn.libreccm.org/ccm/trunk@1998 8810af33-2d31-482b-a856-94f89814c4df --- ...lications.importer.SciPublicationsImporter | 1 + .../exporter/ris/AbstractRisConverter.java | 53 +++++------ .../ArticleInCollectedVolumeConverter.java | 10 ++- .../ris/ArticleInJournalConverter.java | 16 ++-- .../ris/CollectedVolumeConverter.java | 3 +- .../exporter/ris/ExpertiseConverter.java | 3 +- .../exporter/ris/GreyLiteratureConverter.java | 10 ++- .../exporter/ris/InProceedingsConverter.java | 10 ++- .../ris/InternetArticleConverter.java | 8 +- .../exporter/ris/MonographConverter.java | 3 +- .../exporter/ris/ProceedingsConverter.java | 10 ++- .../exporter/ris/PublicationConverter.java | 3 +- .../PublicationWithPublisherConverter.java | 3 +- .../exporter/ris/RisBuilder.java | 11 ++- .../exporter/ris/RisExporter.java | 2 +- .../exporter/ris/WorkingPaperConverter.java | 3 +- .../ris/RisField.java} | 14 ++- .../ris/RisFieldValue.java | 10 +-- .../ris/RisType.java} | 6 +- .../importer/ris/RisConverter.java | 32 +++++++ .../importer/ris/RisConverters.java | 89 +++++++++++++++++++ .../importer/ris/RisDataset.java | 31 +++++++ .../importer/ris/RisImporter.java | 61 +++++++++++++ .../importer/ris/RisParser.java | 79 ++++++++++++++++ 24 files changed, 390 insertions(+), 81 deletions(-) create mode 100644 ccm-sci-publications/src/META-INF/services/com.arsdigita.cms.scipublications.importer.SciPublicationsImporter rename ccm-sci-publications/src/com/arsdigita/cms/scipublications/{exporter/ris/RisFields.java => imexporter/ris/RisField.java} (97%) rename ccm-sci-publications/src/com/arsdigita/cms/scipublications/{exporter => imexporter}/ris/RisFieldValue.java (63%) rename ccm-sci-publications/src/com/arsdigita/cms/scipublications/{exporter/ris/RisTypes.java => imexporter/ris/RisType.java} (96%) create mode 100644 ccm-sci-publications/src/com/arsdigita/cms/scipublications/importer/ris/RisConverter.java create mode 100644 ccm-sci-publications/src/com/arsdigita/cms/scipublications/importer/ris/RisConverters.java create mode 100644 ccm-sci-publications/src/com/arsdigita/cms/scipublications/importer/ris/RisDataset.java create mode 100644 ccm-sci-publications/src/com/arsdigita/cms/scipublications/importer/ris/RisImporter.java create mode 100644 ccm-sci-publications/src/com/arsdigita/cms/scipublications/importer/ris/RisParser.java diff --git a/ccm-sci-publications/src/META-INF/services/com.arsdigita.cms.scipublications.importer.SciPublicationsImporter b/ccm-sci-publications/src/META-INF/services/com.arsdigita.cms.scipublications.importer.SciPublicationsImporter new file mode 100644 index 000000000..dc6ffdd8c --- /dev/null +++ b/ccm-sci-publications/src/META-INF/services/com.arsdigita.cms.scipublications.importer.SciPublicationsImporter @@ -0,0 +1 @@ +com.arsdigita.cms.scipublications.importer.ris.RisImporter \ No newline at end of file diff --git a/ccm-sci-publications/src/com/arsdigita/cms/scipublications/exporter/ris/AbstractRisConverter.java b/ccm-sci-publications/src/com/arsdigita/cms/scipublications/exporter/ris/AbstractRisConverter.java index dde5c4c43..6c93e318f 100644 --- a/ccm-sci-publications/src/com/arsdigita/cms/scipublications/exporter/ris/AbstractRisConverter.java +++ b/ccm-sci-publications/src/com/arsdigita/cms/scipublications/exporter/ris/AbstractRisConverter.java @@ -19,6 +19,7 @@ */ package com.arsdigita.cms.scipublications.exporter.ris; +import com.arsdigita.cms.scipublications.imexporter.ris.RisField; import com.arsdigita.cms.contenttypes.AuthorshipCollection; import com.arsdigita.cms.contenttypes.Publication; import com.arsdigita.cms.contenttypes.PublicationWithPublisher; @@ -31,77 +32,63 @@ import com.arsdigita.cms.contenttypes.SeriesCollection; */ public abstract class AbstractRisConverter implements RisConverter { - private RisBuilder risBuilder = new RisBuilder(); + private final RisBuilder risBuilder = new RisBuilder(); protected void convertAuthors(final Publication publication) { - AuthorshipCollection authors; + final AuthorshipCollection authors = publication.getAuthors(); - authors = publication.getAuthors(); if (authors != null) { while (authors.next()) { if (authors.isEditor()) { - getRisBuilder().addField(RisFields.ED, - String.format("%s,%s", - authors.getAuthor(). - getSurname(), - authors.getAuthor(). - getGivenName())); + getRisBuilder().addField(RisField.ED, String.format("%s,%s", + authors.getAuthor().getSurname(), + authors.getAuthor().getGivenName())); } else { - getRisBuilder().addField(RisFields.AU, - String.format("%s,%s", - authors.getAuthor(). - getSurname(), - authors.getAuthor(). - getGivenName())); + getRisBuilder().addField(RisField.AU, String.format("%s,%s", + authors.getAuthor().getSurname(), + authors.getAuthor().getGivenName())); } } } } protected void convertTitle(final Publication publication) { - getRisBuilder().addField(RisFields.TI, - publication.getTitle()); + getRisBuilder().addField(RisField.TI, publication.getTitle()); } protected void convertYear(final Publication publication) { - getRisBuilder().addField(RisFields.PY, - String.format("%d///", publication.getYearOfPublication())); + getRisBuilder().addField(RisField.PY, String.format("%d///", publication.getYearOfPublication())); } protected void convertPublisher(final PublicationWithPublisher publication) { - convertPublisher(publication, RisFields.CY); + convertPublisher(publication, RisField.CY); } - protected void convertPublisher(final PublicationWithPublisher publication, final RisFields placeField) { + protected void convertPublisher(final PublicationWithPublisher publication, final RisField placeField) { if (publication.getPublisher() != null) { - if ((publication.getPublisher().getPlace() != null) - && !(publication.getPublisher().getPlace().isEmpty())) { + if ((publication.getPublisher().getPlace() != null) && !(publication.getPublisher().getPlace().isEmpty())) { getRisBuilder().addField(placeField, publication.getPublisher().getPlace()); } - getRisBuilder().addField(RisFields.PB, - publication.getPublisher().getTitle()); + getRisBuilder().addField(RisField.PB, publication.getPublisher().getTitle()); } } protected void convertISBN(final PublicationWithPublisher publication) { if (publication.getISBN() != null) { - getRisBuilder().addField(RisFields.SN, - publication.getISBN()); + getRisBuilder().addField(RisField.SN, publication.getISBN()); } } protected void convertVolume(final PublicationWithPublisher publication) { if (publication.getVolume() != null) { - getRisBuilder().addField(RisFields.VL, - publication.getVolume().toString()); + getRisBuilder().addField(RisField.VL, publication.getVolume().toString()); } } protected void convertEdition(final PublicationWithPublisher publication) { if (publication.getEdition() != null) { - getRisBuilder().addField(RisFields.ET, - publication.getEdition()); + getRisBuilder().addField(RisField.ET, publication.getEdition()); } } @@ -111,8 +98,7 @@ public abstract class AbstractRisConverter implements RisConverter { seriesColl.next(); - getRisBuilder().addField(RisFields.T3, - seriesColl.getSeries().getTitle()); + getRisBuilder().addField(RisField.T3, seriesColl.getSeries().getTitle()); seriesColl.close(); } @@ -121,4 +107,5 @@ public abstract class AbstractRisConverter implements RisConverter { protected RisBuilder getRisBuilder() { return risBuilder; } + } diff --git a/ccm-sci-publications/src/com/arsdigita/cms/scipublications/exporter/ris/ArticleInCollectedVolumeConverter.java b/ccm-sci-publications/src/com/arsdigita/cms/scipublications/exporter/ris/ArticleInCollectedVolumeConverter.java index b87a1faf3..0ce951ff3 100644 --- a/ccm-sci-publications/src/com/arsdigita/cms/scipublications/exporter/ris/ArticleInCollectedVolumeConverter.java +++ b/ccm-sci-publications/src/com/arsdigita/cms/scipublications/exporter/ris/ArticleInCollectedVolumeConverter.java @@ -19,6 +19,8 @@ */ package com.arsdigita.cms.scipublications.exporter.ris; +import com.arsdigita.cms.scipublications.imexporter.ris.RisType; +import com.arsdigita.cms.scipublications.imexporter.ris.RisField; import com.arsdigita.cms.contenttypes.ArticleInCollectedVolume; import com.arsdigita.cms.contenttypes.Publication; @@ -50,22 +52,22 @@ public class ArticleInCollectedVolumeConverter extends AbstractRisConverter { article = (ArticleInCollectedVolume) publication; - getRisBuilder().setType(RisTypes.CHAP); + getRisBuilder().setType(RisType.CHAP); convertAuthors(publication); convertTitle(publication); convertYear(publication); if (article.getCollectedVolume() != null) { - getRisBuilder().addField(RisFields.T2, + getRisBuilder().addField(RisField.T2, article.getCollectedVolume().getTitle()); } if (article.getPagesFrom() != null) { - getRisBuilder().addField(RisFields.SP, + getRisBuilder().addField(RisField.SP, String.format("%d - %d", article.getPagesFrom(), article.getPagesTo())); /*if (article.getPagesTo() != null) { - getRisBuilder().addField(RisFields.EP, + getRisBuilder().addField(RisField.EP, article.getPagesTo().toString()); }*/ } diff --git a/ccm-sci-publications/src/com/arsdigita/cms/scipublications/exporter/ris/ArticleInJournalConverter.java b/ccm-sci-publications/src/com/arsdigita/cms/scipublications/exporter/ris/ArticleInJournalConverter.java index 97b41a4eb..fd3cb117a 100644 --- a/ccm-sci-publications/src/com/arsdigita/cms/scipublications/exporter/ris/ArticleInJournalConverter.java +++ b/ccm-sci-publications/src/com/arsdigita/cms/scipublications/exporter/ris/ArticleInJournalConverter.java @@ -19,6 +19,8 @@ */ package com.arsdigita.cms.scipublications.exporter.ris; +import com.arsdigita.cms.scipublications.imexporter.ris.RisType; +import com.arsdigita.cms.scipublications.imexporter.ris.RisField; import com.arsdigita.cms.contenttypes.ArticleInJournal; import com.arsdigita.cms.contenttypes.Publication; @@ -50,36 +52,36 @@ public class ArticleInJournalConverter extends AbstractRisConverter { article = (ArticleInJournal) publication; - getRisBuilder().setType(RisTypes.JOUR); + getRisBuilder().setType(RisType.JOUR); convertAuthors(publication); convertTitle(publication); convertYear(publication); if (article.getJournal() != null) { - getRisBuilder().addField(RisFields.T2, + getRisBuilder().addField(RisField.T2, article.getJournal().getTitle()); } if (article.getIssue() != null) { - getRisBuilder().addField(RisFields.M1, article.getIssue()); + getRisBuilder().addField(RisField.M1, article.getIssue()); } if (article.getVolume() != null) { - getRisBuilder().addField(RisFields.VL, + getRisBuilder().addField(RisField.VL, article.getVolume().toString()); } if (article.getPagesFrom() != null) { - getRisBuilder().addField(RisFields.SP, + getRisBuilder().addField(RisField.SP, String.format("%d - %d", article.getPagesFrom(), article.getPagesTo())); /* - * getRisBuilder().addField(RisFields.EP, + * getRisBuilder().addField(RisField.EP, article.getPagesTo().toString()); */ } if (article.getReviewed()) { - getRisBuilder().addField(RisFields.RI, ""); + getRisBuilder().addField(RisField.RI, ""); } return getRisBuilder().toRis(); diff --git a/ccm-sci-publications/src/com/arsdigita/cms/scipublications/exporter/ris/CollectedVolumeConverter.java b/ccm-sci-publications/src/com/arsdigita/cms/scipublications/exporter/ris/CollectedVolumeConverter.java index ed19d7351..b00d8e0cf 100644 --- a/ccm-sci-publications/src/com/arsdigita/cms/scipublications/exporter/ris/CollectedVolumeConverter.java +++ b/ccm-sci-publications/src/com/arsdigita/cms/scipublications/exporter/ris/CollectedVolumeConverter.java @@ -19,6 +19,7 @@ */ package com.arsdigita.cms.scipublications.exporter.ris; +import com.arsdigita.cms.scipublications.imexporter.ris.RisType; import com.arsdigita.cms.contenttypes.CollectedVolume; import com.arsdigita.cms.contenttypes.Publication; @@ -47,7 +48,7 @@ public class CollectedVolumeConverter extends AbstractRisConverter { collectedVolume = (CollectedVolume) publication; - getRisBuilder().setType(RisTypes.EDBOOK); + getRisBuilder().setType(RisType.EDBOOK); convertAuthors(publication); convertTitle(publication); diff --git a/ccm-sci-publications/src/com/arsdigita/cms/scipublications/exporter/ris/ExpertiseConverter.java b/ccm-sci-publications/src/com/arsdigita/cms/scipublications/exporter/ris/ExpertiseConverter.java index 52da4565d..dc33ec962 100644 --- a/ccm-sci-publications/src/com/arsdigita/cms/scipublications/exporter/ris/ExpertiseConverter.java +++ b/ccm-sci-publications/src/com/arsdigita/cms/scipublications/exporter/ris/ExpertiseConverter.java @@ -19,6 +19,7 @@ */ package com.arsdigita.cms.scipublications.exporter.ris; +import com.arsdigita.cms.scipublications.imexporter.ris.RisType; import com.arsdigita.cms.contenttypes.Expertise; import com.arsdigita.cms.contenttypes.Publication; @@ -50,7 +51,7 @@ public class ExpertiseConverter extends AbstractRisConverter { expertise = (Expertise) publication; - getRisBuilder().setType(RisTypes.GEN); + getRisBuilder().setType(RisType.GEN); convertAuthors(publication); convertTitle(publication); convertYear(publication); diff --git a/ccm-sci-publications/src/com/arsdigita/cms/scipublications/exporter/ris/GreyLiteratureConverter.java b/ccm-sci-publications/src/com/arsdigita/cms/scipublications/exporter/ris/GreyLiteratureConverter.java index 9f2b84d12..6a6ffdaed 100644 --- a/ccm-sci-publications/src/com/arsdigita/cms/scipublications/exporter/ris/GreyLiteratureConverter.java +++ b/ccm-sci-publications/src/com/arsdigita/cms/scipublications/exporter/ris/GreyLiteratureConverter.java @@ -1,5 +1,7 @@ package com.arsdigita.cms.scipublications.exporter.ris; +import com.arsdigita.cms.scipublications.imexporter.ris.RisType; +import com.arsdigita.cms.scipublications.imexporter.ris.RisField; import com.arsdigita.cms.contenttypes.GreyLiterature; import com.arsdigita.cms.contenttypes.Publication; @@ -29,21 +31,21 @@ public class GreyLiteratureConverter extends AbstractRisConverter { greyLiterature = (GreyLiterature) publication; - getRisBuilder().setType(RisTypes.UNPB); + getRisBuilder().setType(RisType.UNPD); convertAuthors(publication); convertTitle(publication); convertYear(publication); if (greyLiterature.getPlace() != null) { - getRisBuilder().addField(RisFields.CY, greyLiterature.getPlace()); + getRisBuilder().addField(RisField.CY, greyLiterature.getPlace()); } if (greyLiterature.getNumber() != null) { - getRisBuilder().addField(RisFields.M1, greyLiterature.getNumber()); + getRisBuilder().addField(RisField.M1, greyLiterature.getNumber()); } if (greyLiterature.getOrganization() != null) { - getRisBuilder().addField(RisFields.PB, greyLiterature.getOrganization().getTitle()); + getRisBuilder().addField(RisField.PB, greyLiterature.getOrganization().getTitle()); } return getRisBuilder().toRis(); diff --git a/ccm-sci-publications/src/com/arsdigita/cms/scipublications/exporter/ris/InProceedingsConverter.java b/ccm-sci-publications/src/com/arsdigita/cms/scipublications/exporter/ris/InProceedingsConverter.java index f02aaa73d..bd27702ca 100644 --- a/ccm-sci-publications/src/com/arsdigita/cms/scipublications/exporter/ris/InProceedingsConverter.java +++ b/ccm-sci-publications/src/com/arsdigita/cms/scipublications/exporter/ris/InProceedingsConverter.java @@ -19,6 +19,8 @@ */ package com.arsdigita.cms.scipublications.exporter.ris; +import com.arsdigita.cms.scipublications.imexporter.ris.RisType; +import com.arsdigita.cms.scipublications.imexporter.ris.RisField; import com.arsdigita.cms.contenttypes.InProceedings; import com.arsdigita.cms.contenttypes.Proceedings; import com.arsdigita.cms.contenttypes.Publication; @@ -51,7 +53,7 @@ public class InProceedingsConverter extends AbstractRisConverter { inProceedings = (InProceedings) publication; - getRisBuilder().setType(RisTypes.CPAPER); + getRisBuilder().setType(RisType.CPAPER); convertAuthors(publication); convertTitle(publication); convertYear(publication); @@ -59,7 +61,7 @@ public class InProceedingsConverter extends AbstractRisConverter { if (inProceedings.getProceedings() != null) { final Proceedings proceedings = inProceedings.getProceedings(); if (proceedings.getPlaceOfConference() != null) { - getRisBuilder().addField(RisFields.CY, proceedings.getPlaceOfConference()); + getRisBuilder().addField(RisField.CY, proceedings.getPlaceOfConference()); } @@ -67,11 +69,11 @@ public class InProceedingsConverter extends AbstractRisConverter { } if (inProceedings.getPagesFrom() != null) { - getRisBuilder().addField(RisFields.SP, + getRisBuilder().addField(RisField.SP, String.format("%d - %d", inProceedings.getPagesFrom(), inProceedings.getPagesTo())); - /*getRisBuilder().addField(RisFields.EP, + /*getRisBuilder().addField(RisField.EP, inProceedings.getPagesTo().toString());*/ } diff --git a/ccm-sci-publications/src/com/arsdigita/cms/scipublications/exporter/ris/InternetArticleConverter.java b/ccm-sci-publications/src/com/arsdigita/cms/scipublications/exporter/ris/InternetArticleConverter.java index 61a5344fd..79072bbf2 100644 --- a/ccm-sci-publications/src/com/arsdigita/cms/scipublications/exporter/ris/InternetArticleConverter.java +++ b/ccm-sci-publications/src/com/arsdigita/cms/scipublications/exporter/ris/InternetArticleConverter.java @@ -19,6 +19,8 @@ */ package com.arsdigita.cms.scipublications.exporter.ris; +import com.arsdigita.cms.scipublications.imexporter.ris.RisType; +import com.arsdigita.cms.scipublications.imexporter.ris.RisField; import com.arsdigita.cms.contenttypes.InternetArticle; import com.arsdigita.cms.contenttypes.Publication; @@ -50,17 +52,17 @@ public class InternetArticleConverter extends AbstractRisConverter { article = (InternetArticle) publication; - getRisBuilder().setType(RisTypes.EJOUR); + getRisBuilder().setType(RisType.EJOUR); convertAuthors(publication); convertTitle(publication); convertYear(publication); if (article.getReviewed()) { - getRisBuilder().addField(RisFields.RI, ""); + getRisBuilder().addField(RisField.RI, ""); } if (article.getUrl() != null) { - getRisBuilder().addField(RisFields.UR, article.getUrl()); + getRisBuilder().addField(RisField.UR, article.getUrl()); } return getRisBuilder().toRis(); diff --git a/ccm-sci-publications/src/com/arsdigita/cms/scipublications/exporter/ris/MonographConverter.java b/ccm-sci-publications/src/com/arsdigita/cms/scipublications/exporter/ris/MonographConverter.java index e0f1c7c2e..4c2175f07 100644 --- a/ccm-sci-publications/src/com/arsdigita/cms/scipublications/exporter/ris/MonographConverter.java +++ b/ccm-sci-publications/src/com/arsdigita/cms/scipublications/exporter/ris/MonographConverter.java @@ -19,6 +19,7 @@ */ package com.arsdigita.cms.scipublications.exporter.ris; +import com.arsdigita.cms.scipublications.imexporter.ris.RisType; import com.arsdigita.cms.contenttypes.Monograph; import com.arsdigita.cms.contenttypes.Publication; @@ -48,7 +49,7 @@ public class MonographConverter extends AbstractRisConverter { monograph = (Monograph) publication; - getRisBuilder().setType(RisTypes.BOOK); + getRisBuilder().setType(RisType.BOOK); convertAuthors(publication); convertTitle(publication); convertYear(publication); diff --git a/ccm-sci-publications/src/com/arsdigita/cms/scipublications/exporter/ris/ProceedingsConverter.java b/ccm-sci-publications/src/com/arsdigita/cms/scipublications/exporter/ris/ProceedingsConverter.java index 79d87d5da..b9592e40e 100644 --- a/ccm-sci-publications/src/com/arsdigita/cms/scipublications/exporter/ris/ProceedingsConverter.java +++ b/ccm-sci-publications/src/com/arsdigita/cms/scipublications/exporter/ris/ProceedingsConverter.java @@ -19,6 +19,8 @@ */ package com.arsdigita.cms.scipublications.exporter.ris; +import com.arsdigita.cms.scipublications.imexporter.ris.RisType; +import com.arsdigita.cms.scipublications.imexporter.ris.RisField; import com.arsdigita.cms.contenttypes.Proceedings; import com.arsdigita.cms.contenttypes.Publication; @@ -50,21 +52,21 @@ public class ProceedingsConverter extends AbstractRisConverter { proceedings = (Proceedings) publication; - getRisBuilder().setType(RisTypes.CONF); + getRisBuilder().setType(RisType.CONF); convertAuthors(publication); convertTitle(publication); convertYear(publication); convertVolume(proceedings); convertSeries(publication); - convertPublisher(proceedings, RisFields.C1); + convertPublisher(proceedings, RisField.C1); if (proceedings.getPlaceOfConference() != null) { - getRisBuilder().addField(RisFields.CY, proceedings.getPlaceOfConference()); + getRisBuilder().addField(RisField.CY, proceedings.getPlaceOfConference()); } if (proceedings.getNameOfConference() != null) { - getRisBuilder().addField(RisFields.T2, proceedings.getNameOfConference()); + getRisBuilder().addField(RisField.T2, proceedings.getNameOfConference()); } diff --git a/ccm-sci-publications/src/com/arsdigita/cms/scipublications/exporter/ris/PublicationConverter.java b/ccm-sci-publications/src/com/arsdigita/cms/scipublications/exporter/ris/PublicationConverter.java index 8b3700c5b..19bcea3ed 100644 --- a/ccm-sci-publications/src/com/arsdigita/cms/scipublications/exporter/ris/PublicationConverter.java +++ b/ccm-sci-publications/src/com/arsdigita/cms/scipublications/exporter/ris/PublicationConverter.java @@ -19,6 +19,7 @@ */ package com.arsdigita.cms.scipublications.exporter.ris; +import com.arsdigita.cms.scipublications.imexporter.ris.RisType; import com.arsdigita.cms.contenttypes.Publication; import com.arsdigita.cms.contenttypes.PublicationWithPublisher; @@ -33,7 +34,7 @@ import com.arsdigita.cms.contenttypes.PublicationWithPublisher; public class PublicationConverter extends AbstractRisConverter { public String convert(final Publication publication) { - getRisBuilder().setType(RisTypes.GEN); + getRisBuilder().setType(RisType.GEN); convertAuthors(publication); convertTitle(publication); convertYear(publication); diff --git a/ccm-sci-publications/src/com/arsdigita/cms/scipublications/exporter/ris/PublicationWithPublisherConverter.java b/ccm-sci-publications/src/com/arsdigita/cms/scipublications/exporter/ris/PublicationWithPublisherConverter.java index 1857d69e5..85e5ff76b 100644 --- a/ccm-sci-publications/src/com/arsdigita/cms/scipublications/exporter/ris/PublicationWithPublisherConverter.java +++ b/ccm-sci-publications/src/com/arsdigita/cms/scipublications/exporter/ris/PublicationWithPublisherConverter.java @@ -19,6 +19,7 @@ */ package com.arsdigita.cms.scipublications.exporter.ris; +import com.arsdigita.cms.scipublications.imexporter.ris.RisType; import com.arsdigita.cms.contenttypes.Publication; import com.arsdigita.cms.contenttypes.PublicationWithPublisher; @@ -47,7 +48,7 @@ public class PublicationWithPublisherConverter extends AbstractRisConverter { _publication = (PublicationWithPublisher) publication; - getRisBuilder().setType(RisTypes.GEN); + getRisBuilder().setType(RisType.GEN); convertAuthors(publication); convertTitle(publication); convertYear(publication); diff --git a/ccm-sci-publications/src/com/arsdigita/cms/scipublications/exporter/ris/RisBuilder.java b/ccm-sci-publications/src/com/arsdigita/cms/scipublications/exporter/ris/RisBuilder.java index f3a9f56fd..0f599b6a2 100644 --- a/ccm-sci-publications/src/com/arsdigita/cms/scipublications/exporter/ris/RisBuilder.java +++ b/ccm-sci-publications/src/com/arsdigita/cms/scipublications/exporter/ris/RisBuilder.java @@ -19,6 +19,9 @@ */ package com.arsdigita.cms.scipublications.exporter.ris; +import com.arsdigita.cms.scipublications.imexporter.ris.RisFieldValue; +import com.arsdigita.cms.scipublications.imexporter.ris.RisType; +import com.arsdigita.cms.scipublications.imexporter.ris.RisField; import java.util.ArrayList; import java.util.List; @@ -33,13 +36,13 @@ public class RisBuilder { /** * Type of the reference */ - private RisTypes type; + private RisType type; /** * Fields of the reference. */ private List fields =new ArrayList(); //private Map fields = new EnumMap( - // RisFields.class); + // RisField.class); public RisBuilder() { } @@ -49,7 +52,7 @@ public class RisBuilder { * * @param type Valid RIS type */ - public void setType(final RisTypes type) { + public void setType(final RisType type) { this.type = type; } @@ -59,7 +62,7 @@ public class RisBuilder { * @param field The name of the field. * @param value The value of the field. */ - public void addField(final RisFields field, final String value) { + public void addField(final RisField field, final String value) { //fields.put(field, value); fields.add(new RisFieldValue(field, value)); } diff --git a/ccm-sci-publications/src/com/arsdigita/cms/scipublications/exporter/ris/RisExporter.java b/ccm-sci-publications/src/com/arsdigita/cms/scipublications/exporter/ris/RisExporter.java index 8b59c9fa7..dbcc15252 100644 --- a/ccm-sci-publications/src/com/arsdigita/cms/scipublications/exporter/ris/RisExporter.java +++ b/ccm-sci-publications/src/com/arsdigita/cms/scipublications/exporter/ris/RisExporter.java @@ -20,8 +20,8 @@ package com.arsdigita.cms.scipublications.exporter.ris; import com.arsdigita.cms.contenttypes.Publication; -import com.arsdigita.cms.scipublications.imexporter.PublicationFormat; import com.arsdigita.cms.scipublications.exporter.SciPublicationsExporter; +import com.arsdigita.cms.scipublications.imexporter.PublicationFormat; import javax.activation.MimeType; import javax.activation.MimeTypeParseException; import org.apache.log4j.Logger; diff --git a/ccm-sci-publications/src/com/arsdigita/cms/scipublications/exporter/ris/WorkingPaperConverter.java b/ccm-sci-publications/src/com/arsdigita/cms/scipublications/exporter/ris/WorkingPaperConverter.java index 3b8364b39..1e5eebf12 100644 --- a/ccm-sci-publications/src/com/arsdigita/cms/scipublications/exporter/ris/WorkingPaperConverter.java +++ b/ccm-sci-publications/src/com/arsdigita/cms/scipublications/exporter/ris/WorkingPaperConverter.java @@ -19,6 +19,7 @@ */ package com.arsdigita.cms.scipublications.exporter.ris; +import com.arsdigita.cms.scipublications.imexporter.ris.RisType; import com.arsdigita.cms.contenttypes.Publication; import com.arsdigita.cms.contenttypes.WorkingPaper; @@ -50,7 +51,7 @@ public class WorkingPaperConverter extends AbstractRisConverter { workingPaper = (WorkingPaper) publication; - getRisBuilder().setType(RisTypes.UNPB); + getRisBuilder().setType(RisType.UNPD); convertAuthors(publication); convertTitle(publication); diff --git a/ccm-sci-publications/src/com/arsdigita/cms/scipublications/exporter/ris/RisFields.java b/ccm-sci-publications/src/com/arsdigita/cms/scipublications/imexporter/ris/RisField.java similarity index 97% rename from ccm-sci-publications/src/com/arsdigita/cms/scipublications/exporter/ris/RisFields.java rename to ccm-sci-publications/src/com/arsdigita/cms/scipublications/imexporter/ris/RisField.java index bf64fd829..be28f6f15 100644 --- a/ccm-sci-publications/src/com/arsdigita/cms/scipublications/exporter/ris/RisFields.java +++ b/ccm-sci-publications/src/com/arsdigita/cms/scipublications/imexporter/ris/RisField.java @@ -17,7 +17,7 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ -package com.arsdigita.cms.scipublications.exporter.ris; +package com.arsdigita.cms.scipublications.imexporter.ris; /** *

@@ -32,7 +32,7 @@ package com.arsdigita.cms.scipublications.exporter.ris; * * @author Jens Pelzetter */ -public enum RisFields { +public enum RisField { /** * Reference ID. According to the specification not used by reference @@ -342,5 +342,13 @@ public enum RisFields { DA, C1, C2, - C3 + C3, + /** + * Begin of a new reference. Value is the type of the reference. + */ + TY, + /** + * End of reference. Last tag of a dataset. Has no value. + */ + ER, } diff --git a/ccm-sci-publications/src/com/arsdigita/cms/scipublications/exporter/ris/RisFieldValue.java b/ccm-sci-publications/src/com/arsdigita/cms/scipublications/imexporter/ris/RisFieldValue.java similarity index 63% rename from ccm-sci-publications/src/com/arsdigita/cms/scipublications/exporter/ris/RisFieldValue.java rename to ccm-sci-publications/src/com/arsdigita/cms/scipublications/imexporter/ris/RisFieldValue.java index aa06298e3..2ae14b8e4 100644 --- a/ccm-sci-publications/src/com/arsdigita/cms/scipublications/exporter/ris/RisFieldValue.java +++ b/ccm-sci-publications/src/com/arsdigita/cms/scipublications/imexporter/ris/RisFieldValue.java @@ -1,4 +1,4 @@ -package com.arsdigita.cms.scipublications.exporter.ris; +package com.arsdigita.cms.scipublications.imexporter.ris; /** * @@ -7,22 +7,22 @@ package com.arsdigita.cms.scipublications.exporter.ris; */ public class RisFieldValue { - private RisFields name; + private RisField name; private String value; public RisFieldValue() { } - public RisFieldValue(final RisFields name, final String value) { + public RisFieldValue(final RisField name, final String value) { this.name = name; this.value = value; } - public RisFields getName() { + public RisField getName() { return name; } - public void setName(final RisFields name) { + public void setName(final RisField name) { this.name = name; } diff --git a/ccm-sci-publications/src/com/arsdigita/cms/scipublications/exporter/ris/RisTypes.java b/ccm-sci-publications/src/com/arsdigita/cms/scipublications/imexporter/ris/RisType.java similarity index 96% rename from ccm-sci-publications/src/com/arsdigita/cms/scipublications/exporter/ris/RisTypes.java rename to ccm-sci-publications/src/com/arsdigita/cms/scipublications/imexporter/ris/RisType.java index 5642042f3..354f0a9a9 100644 --- a/ccm-sci-publications/src/com/arsdigita/cms/scipublications/exporter/ris/RisTypes.java +++ b/ccm-sci-publications/src/com/arsdigita/cms/scipublications/imexporter/ris/RisType.java @@ -17,14 +17,14 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ -package com.arsdigita.cms.scipublications.exporter.ris; +package com.arsdigita.cms.scipublications.imexporter.ris; /** * Reference types supported by the RIS format. * * @author Jens Pelzetter */ -public enum RisTypes { +public enum RisType { /** * Abstract @@ -173,7 +173,7 @@ public enum RisTypes { /** * Unpublished work */ - UNPB, + UNPD, /** * Video recording */ diff --git a/ccm-sci-publications/src/com/arsdigita/cms/scipublications/importer/ris/RisConverter.java b/ccm-sci-publications/src/com/arsdigita/cms/scipublications/importer/ris/RisConverter.java new file mode 100644 index 000000000..97ed6372f --- /dev/null +++ b/ccm-sci-publications/src/com/arsdigita/cms/scipublications/importer/ris/RisConverter.java @@ -0,0 +1,32 @@ +package com.arsdigita.cms.scipublications.importer.ris; + +import com.arsdigita.cms.contenttypes.Publication; +import com.arsdigita.cms.scipublications.imexporter.ris.RisType; +import com.arsdigita.cms.scipublications.importer.report.ImportReport; + +/** + * Interface for importing RisConverter. + * + * @author Jens Pelzetter + * @version $Id$ + */ +public interface RisConverter { + + /** + * Converts a RIS dataset for a publiction of the type supported by the converter to an instance of SciPublication. + * An implementation of this method is also responsible for publishing the publication item created (if + * {@code publishNewItems} is set to {@code true}. + * + * @param dataset + * @param report + * @return + */ + convert(RisDataset dataset, ImportReport report, boolean pretend, boolean publishNewItems); + + /** + * + * @return The RIS type supported by the converter implementation. + */ + RisType getRisType(); + +} diff --git a/ccm-sci-publications/src/com/arsdigita/cms/scipublications/importer/ris/RisConverters.java b/ccm-sci-publications/src/com/arsdigita/cms/scipublications/importer/ris/RisConverters.java new file mode 100644 index 000000000..cf8ea197f --- /dev/null +++ b/ccm-sci-publications/src/com/arsdigita/cms/scipublications/importer/ris/RisConverters.java @@ -0,0 +1,89 @@ +package com.arsdigita.cms.scipublications.importer.ris; + +import com.arsdigita.cms.contenttypes.Publication; +import com.arsdigita.cms.scipublications.imexporter.ris.RisType; +import com.arsdigita.cms.scipublications.importer.SciPublicationsImportException; +import com.arsdigita.cms.scipublications.importer.report.ImportReport; +import java.util.HashMap; +import java.util.Map; +import java.util.ServiceLoader; +import org.apache.log4j.Logger; + +/** + * Central access point to retrieve {@link RisConverter}s for importing publication data in the RIS format. + * + * @author Jens Pelzetter + * @version $Id$ + */ +public class RisConverters { + + private static final Logger LOGGER = Logger.getLogger(RisConverters.class); + private Map converters = new HashMap(); + + /** + * The constructor loads all available implementations of the + * {@link RisConverter} interface using the {@link ServiceLoader}. + */ + private RisConverts() { + LOGGER.debug("Loading RIS import converters..."); + final ServiceLoader converterServices = ServiceLoader.load(RisConverter.class); + + for (RisConverter converter : converterServices) { + LOGGER.debug(String.format("Found converter for RIS type '%s'.", converter.getRisType().toString())); + + converters.put(converter.getRisType(), converter); + } + LOGGER.debug(String.format("Found %d import converters.", converters.size())); + } + + /** + * Keeps the instance of this class. + */ + private static class Instance { + + private static RisConverters INSTANCE = new RisConverters(); + } + + /** + * + * @return The instance of this class. + */ + public static RisConverters getInstance() { + return Instance.INSTANCE; + } + + /** + * + * @param dataset + * @param report + * @param pretend + * @param publishNewItems + * @throws SciPublicationsImportException + */ + public void convert(final RisDataset dataset, + final ImportReport report, + final boolean pretend, + final boolean publishNewItems) + throws SciPublicationsImportException { + try { + LOGGER.debug(String.format("Trying to find converter for RIS type '%s'...", dataset.getType().toString())); + RisConverter converter = converters.get(dataset.getType()); + + if (converter == null) { + throw new SciPublicationsImportException(String.format("Failed to find a converter for RIS type '%s'.", + dataset.getType().toString())); + } + + converter = converter.getClass().newInstance(); + + converter.convert(dataset, report, pretend, publishNewItems); + } catch (InstantiationException ex) { + logger.warn("Failed to instaniate RIS converter.", ex); + return null; + } catch (IllegalAccessException ex) { + logger.warn("Failed to instaniate RIS converter.", ex); + return null; + } + } + +} diff --git a/ccm-sci-publications/src/com/arsdigita/cms/scipublications/importer/ris/RisDataset.java b/ccm-sci-publications/src/com/arsdigita/cms/scipublications/importer/ris/RisDataset.java new file mode 100644 index 000000000..f0ec5a5d0 --- /dev/null +++ b/ccm-sci-publications/src/com/arsdigita/cms/scipublications/importer/ris/RisDataset.java @@ -0,0 +1,31 @@ +package com.arsdigita.cms.scipublications.importer.ris; + +import com.arsdigita.cms.scipublications.imexporter.ris.RisField; +import com.arsdigita.cms.scipublications.imexporter.ris.RisType; +import java.util.Collections; +import java.util.EnumMap; +import java.util.Map; + +/** + * + * @author Jens Pelzetter + * @version $Id$ + */ +public class RisDataset { + + private final RisType type; + private final Map values = new EnumMap(RisField.class); + + public RisDataset(final RisType type) { + this.type = type; + } + + public RisType getType() { + return type; + } + + public Map getValues() { + return Collections.unmodifiableMap(values); + } + +} diff --git a/ccm-sci-publications/src/com/arsdigita/cms/scipublications/importer/ris/RisImporter.java b/ccm-sci-publications/src/com/arsdigita/cms/scipublications/importer/ris/RisImporter.java new file mode 100644 index 000000000..25bb93fa7 --- /dev/null +++ b/ccm-sci-publications/src/com/arsdigita/cms/scipublications/importer/ris/RisImporter.java @@ -0,0 +1,61 @@ +package com.arsdigita.cms.scipublications.importer.ris; + +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 java.util.List; +import javax.activation.MimeType; +import javax.activation.MimeTypeParseException; +import org.apache.log4j.Logger; + +/** + * + * @author Jens Pelzetter + * @version $Id$ + */ +public class RisImporter implements SciPublicationsImporter { + + private static final Logger LOGGER = Logger.getLogger(RisImporter.class); + private final RisConverters converters = RisConverters.getInstance(); + + public PublicationFormat getSupportedFormat() { + try { + return new PublicationFormat("RIS", new MimeType("application/x-research-info-systems"), "ris"); + } catch (MimeTypeParseException ex) { + LOGGER.warn("Failed to create MimeType for PublicationFormat." + + "Using null mimetype instead. Cause: ", ex); + return new PublicationFormat("RIS", + null, + "RIS"); + } + } + + public ImportReport importPublications(final String publications, + final boolean pretend, + final boolean publishNewItems) throws SciPublicationsImportException { + final String[] lines = publications.split("\r\n"); + + final RisParser parser = new RisParser(); + final List datasets = parser.parse(lines); + + final ImportReport report = new ImportReport(); + report.setImporter("RIS Importer"); + report.setPretend(pretend); + + + for (RisDataset dataset : datasets) { + converters.convert(dataset, importReport, pretend, publishNewItems); + } + + return ImportReport; + } + + private processPublication(final RisDataset dataset, + final ImportReport importReport, + final boolean pretend, + final boolean publishNewItems) { + + } + +} diff --git a/ccm-sci-publications/src/com/arsdigita/cms/scipublications/importer/ris/RisParser.java b/ccm-sci-publications/src/com/arsdigita/cms/scipublications/importer/ris/RisParser.java new file mode 100644 index 000000000..7ade39fc7 --- /dev/null +++ b/ccm-sci-publications/src/com/arsdigita/cms/scipublications/importer/ris/RisParser.java @@ -0,0 +1,79 @@ +package com.arsdigita.cms.scipublications.importer.ris; + +import com.arsdigita.cms.scipublications.imexporter.ris.RisFieldValue; +import com.arsdigita.cms.scipublications.imexporter.ris.RisField; +import com.arsdigita.cms.scipublications.imexporter.ris.RisType; +import com.arsdigita.cms.scipublications.importer.SciPublicationsImportException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/** + * + * @author Jens Pelzetter + * @version $Id$ + */ +public class RisParser { + + public RisParser() { + //Nothing + } + + public List parse(final String[] lines) throws SciPublicationsImportException { + final List entries = new ArrayList(); + boolean openDataset = false; + + RisFieldValue field; + for (int i = 0; i < lines.length; i++) { + field = parseRisLine(lines[i], i); + + if (RisField.TY.equals(field.getName())) { + if (openDataset) { + throw new SciPublicationsImportException( + String.format("Start of new reference before preceding reference was closed at line %d. " + + "Aborting import.", i + 1)); + } else { + try { + entries.add(startDataset(field.getValue())); + openDataset = true; + } catch (IllegalArgumentException ex) { + throw new SciPublicationsImportException(String.format("Invalid type at line %d.", i + 1), ex); + } + } + } else if (RisField.ER.equals(field.getName())) { + openDataset = false; + } else { + entries.get(entries.size() - 1).getValues().put(field.getName(), field.getValue()); + } + } + + return Collections.unmodifiableList(entries); + } + + private RisDataset startDataset(final String type) { + final RisType risType = RisType.valueOf(type); + return new RisDataset(risType); + } + + private RisFieldValue parseRisLine(final String line, final int index) throws SciPublicationsImportException { + final String[] tokens = line.split(" - "); + + if (tokens.length == 2) { + final RisField fieldName; + try { + fieldName = RisField.valueOf(tokens[0]); + } catch (IllegalArgumentException ex) { + throw new SciPublicationsImportException(String.format("Unkwown tag '%s' in line %d. Aborting import.", + tokens[0], index + 1), ex); + } + + return new RisFieldValue(fieldName, line); + } else if ((tokens.length == 1) && RisField.ER.toString().equals(tokens[0])) { + return new RisFieldValue(RisField.ER, ""); + } else { + throw new SciPublicationsImportException(String.format("Invalid RIS data in line %d. Aborting import.", + index + 1)); + } + } + +}