Grundstruktur für den RIS Importer für Publikationen

git-svn-id: https://svn.libreccm.org/ccm/trunk@1998 8810af33-2d31-482b-a856-94f89814c4df
master
jensp 2012-12-12 14:01:57 +00:00
parent 24d933ff6e
commit 257fe86954
24 changed files with 390 additions and 81 deletions

View File

@ -0,0 +1 @@
com.arsdigita.cms.scipublications.importer.ris.RisImporter

View File

@ -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;
}
}

View File

@ -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());
}*/
}

View File

@ -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();

View File

@ -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);

View File

@ -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);

View File

@ -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();

View File

@ -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());*/
}

View File

@ -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();

View File

@ -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);

View File

@ -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());
}

View File

@ -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);

View File

@ -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);

View File

@ -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<RisFieldValue> fields =new ArrayList<RisFieldValue>();
//private Map<RisFields, String> fields = new EnumMap<RisFields, String>(
// 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));
}

View File

@ -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;

View File

@ -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);

View File

@ -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;
/**
* <p>
@ -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,
}

View File

@ -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;
}

View File

@ -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
*/

View File

@ -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 <jens@jp-digital.de>
* @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();
}

View File

@ -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 <jens@jp-digital.de>
* @version $Id$
*/
public class RisConverters {
private static final Logger LOGGER = Logger.getLogger(RisConverters.class);
private Map<RisType, RisConverter> converters = new HashMap<RisType, RisConverter>();
/**
* 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<RisConverter> 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;
}
}
}

View File

@ -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 <jens@jp-digital.de>
* @version $Id$
*/
public class RisDataset {
private final RisType type;
private final Map<RisField, String> values = new EnumMap<RisField, String>(RisField.class);
public RisDataset(final RisType type) {
this.type = type;
}
public RisType getType() {
return type;
}
public Map<RisField, String> getValues() {
return Collections.unmodifiableMap(values);
}
}

View File

@ -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 <jens@jp-digital.de>
* @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<RisDataset> 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) {
}
}

View File

@ -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 <jens@jp-digital.de>
* @version $Id$
*/
public class RisParser {
public RisParser() {
//Nothing
}
public List<RisDataset> parse(final String[] lines) throws SciPublicationsImportException {
final List<RisDataset> entries = new ArrayList<RisDataset>();
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));
}
}
}