From 325c862ef2b2dba7ae2aa3821e16e08c8d0cf687 Mon Sep 17 00:00:00 2001 From: Kostas Stamatis Date: Tue, 15 Oct 2013 15:46:56 +0300 Subject: [PATCH] bte in submission workflow --- dspace-api/pom.xml | 12 +- .../submit/lookup/ArXivLookupProvider.java | 45 ++--- .../lookup/ConfigurableLookupProvider.java | 175 +++++++++++++++++- .../submit/lookup/CrossRefLookupProvider.java | 42 +---- .../MultipleSubmissionLookupDataLoader.java | 91 +++++++++ .../submit/lookup/PubmedLookupProvider.java | 82 ++++---- .../lookup/SubmissionLookupProvider.java | 12 +- .../lookup/SubmissionLookupService.java | 15 +- .../submit/lookup/SubmissionLookupUtils.java | 112 ----------- .../EnhancedSubmissionLookupPublication.java | 22 ++- .../submit/util/ItemSubmissionLookupDTO.java | 8 +- .../util/RepeatableToSingleValueEnhancer.java | 4 +- .../util/SubmissionLookupPublication.java | 117 +++++++++++- ...dspace-addon-submissionlookup-services.xml | 96 +++++++++- .../json/SubmissionLookupJSONRequest.java | 41 +++- 15 files changed, 609 insertions(+), 265 deletions(-) create mode 100644 dspace-api/src/main/java/org/dspace/submit/lookup/MultipleSubmissionLookupDataLoader.java diff --git a/dspace-api/pom.xml b/dspace-api/pom.xml index 5779b5b3098f..49fb9609152b 100644 --- a/dspace-api/pom.xml +++ b/dspace-api/pom.xml @@ -444,14 +444,14 @@ 0.82 - net.sf.opencsv - opencsv - 2.3 + gr.ekt.bte + bte-core + 0.9.1 - org.jbibtex - jbibtex - 1.0.0 + gr.ekt.bte + bte-io + 0.9.1 org.apache.solr diff --git a/dspace-api/src/main/java/org/dspace/submit/lookup/ArXivLookupProvider.java b/dspace-api/src/main/java/org/dspace/submit/lookup/ArXivLookupProvider.java index 6148660f6bf8..b2e4cf933b14 100644 --- a/dspace-api/src/main/java/org/dspace/submit/lookup/ArXivLookupProvider.java +++ b/dspace-api/src/main/java/org/dspace/submit/lookup/ArXivLookupProvider.java @@ -7,19 +7,18 @@ */ package org.dspace.submit.lookup; +import gr.ekt.bte.core.Record; + import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; -import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import org.apache.commons.httpclient.HttpException; -import org.apache.commons.lang.StringUtils; import org.dspace.core.Context; import org.dspace.submit.importer.arxiv.ArXivItem; -import org.dspace.submit.util.SubmissionLookupPublication; public class ArXivLookupProvider extends ConfigurableLookupProvider { private ArXivService arXivService; @@ -45,20 +44,20 @@ public boolean isSearchProvider() { } @Override - public List getByIdentifier( - Context context, Map keys) throws HttpException, IOException { - List results = new ArrayList(); + public List getByIdentifier( + Context context, Map> keys) throws HttpException, IOException { + List results = new ArrayList(); if (keys != null) { - String doi = keys.get(DOI); - String arxivid = keys.get(ARXIV); + Set dois = keys.get(DOI); + Set arxivids = keys.get(ARXIV); List items = new ArrayList(); - if (StringUtils.isNotBlank(doi)) { - Set dois = new HashSet(); - dois.add(doi); + if (dois!=null && dois.size()>0) { items.addAll(arXivService.getByDOIs(dois)); } - if (StringUtils.isNotBlank(arxivid)) { - items.add(arXivService.getByArXivIDs(arxivid)); + if (arxivids!=null && arxivids.size()>0) { + for (String arxivid : arxivids){ + items.add(arXivService.getByArXivIDs(arxivid)); + } } for (ArXivItem item : items) { @@ -69,9 +68,9 @@ public List getByIdentifier( } @Override - public List search(Context context, String title, + public List search(Context context, String title, String author, int year) throws HttpException, IOException { - List results = new ArrayList(); + List results = new ArrayList(); List items = arXivService.searchByTerm(title, author, year); for (ArXivItem item : items) { results.add(convert(item)); @@ -82,19 +81,5 @@ public List search(Context context, String title, @Override public String getShortName() { return "arxiv"; - } - - @Override - public List getByDOIs(Context context, Set doiToSearch) - throws HttpException, IOException { - List results = new ArrayList(); - if (doiToSearch != null && doiToSearch.size() > 0) { - List items = arXivService.getByDOIs(doiToSearch); - - for (ArXivItem item : items) { - results.add(convert(item)); - } - } - return results; - } + } } diff --git a/dspace-api/src/main/java/org/dspace/submit/lookup/ConfigurableLookupProvider.java b/dspace-api/src/main/java/org/dspace/submit/lookup/ConfigurableLookupProvider.java index 888551c58765..d3e015455f04 100644 --- a/dspace-api/src/main/java/org/dspace/submit/lookup/ConfigurableLookupProvider.java +++ b/dspace-api/src/main/java/org/dspace/submit/lookup/ConfigurableLookupProvider.java @@ -7,15 +7,186 @@ */ package org.dspace.submit.lookup; +import gr.ekt.bte.core.DataLoadingSpec; +import gr.ekt.bte.core.Record; +import gr.ekt.bte.core.RecordSet; +import gr.ekt.bte.core.StringValue; +import gr.ekt.bte.exceptions.MalformedSourceException; + +import java.io.IOException; +import java.lang.reflect.Field; +import java.lang.reflect.GenericArrayType; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.lang.reflect.ParameterizedType; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import org.apache.commons.httpclient.HttpException; +import org.apache.commons.lang.StringUtils; +import org.dspace.core.Context; import org.dspace.submit.util.SubmissionLookupPublication; public abstract class ConfigurableLookupProvider implements SubmissionLookupProvider { - protected SubmissionLookupPublication convert(Object bean) { + + Map> identifiers; //Searching by identifiers (DOI ...) + Map> searchTerms; //Searching by author, title, date + + Map fieldMap; //mapping between service fields and local intermediate fields + + protected Record convert(Object bean) { try { - return SubmissionLookupUtils.convert(getShortName(), bean); + return convert(getShortName(), bean); } catch (Exception e) { throw new RuntimeException(e.getMessage(), e); } } + + @Override + public List getByDOIs(Context context, Set doiToSearch) + throws HttpException, IOException { + + Map> keys = new HashMap>(); + keys.put(DOI, doiToSearch); + + return getByIdentifier(context, keys); + } + + //BTE Data Loader interface methods + @Override + public RecordSet getRecords() throws MalformedSourceException { + + RecordSet recordSet = new RecordSet(); + + List results = null; + + try { + if (getIdentifiers()!=null){ //Search by identifiers + results = getByIdentifier(null, getIdentifiers()); + } + else { + String title = getIdentifiers().get("title")!=null?getIdentifiers().get("title").iterator().next():null; + String authors = getIdentifiers().get("authors")!=null?getIdentifiers().get("authors").iterator().next():null; + String year = getIdentifiers().get("year")!=null?getIdentifiers().get("year").iterator().next():null; + int yearInt = Integer.parseInt(year); + results = search(null, title, authors, yearInt); + } + } catch (HttpException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + + if (results != null){ + for (Record record : results){ + recordSet.addRecord(record); + } + } + + return recordSet; + } + + @Override + public RecordSet getRecords(DataLoadingSpec arg0) + throws MalformedSourceException { + + return getRecords(); + } + + public Map> getIdentifiers() { + return identifiers; + } + + public void setIdentifiers(Map> identifiers) { + this.identifiers = identifiers; + } + + public Map> getSearchTerms() { + return searchTerms; + } + + public void setSearchTerms(Map> searchTerms) { + this.searchTerms = searchTerms; + } + + public Map getFieldMap() { + return fieldMap; + } + + public void setFieldMap(Map fieldMap) { + this.fieldMap = fieldMap; + } + + public Record convert(String shortName, + Object bean) throws SecurityException, NoSuchMethodException, + IllegalArgumentException, IllegalAccessException, + InvocationTargetException { + Record publication = new SubmissionLookupPublication( + shortName); + Field[] fields = bean.getClass().getDeclaredFields(); + for (Field field : fields) { + if (field.getType() == String.class) { + Method getter = bean.getClass().getMethod( + "get" + field.getName().substring(0, 1).toUpperCase() + + field.getName().substring(1)); + + String value = (String) getter.invoke(bean); + + addMetadata(shortName, publication, field.getName(), value); + + } else if (field.getType() == List.class) { + ParameterizedType pt = (ParameterizedType) field + .getGenericType(); + + Method getter = bean.getClass().getMethod( + "get" + field.getName().substring(0, 1).toUpperCase() + + field.getName().substring(1)); + + if (pt.getActualTypeArguments()[0] instanceof GenericArrayType) { // nomi + // di + // persone + List values = (List) getter.invoke(bean); + if (values != null) { + for (String[] nvalue : values) { + String value = nvalue[1] + ", " + nvalue[0]; + addMetadata(shortName, publication, + field.getName(), value); + } + } + } else { // metadati ripetibili + List values = (List) getter.invoke(bean); + if (values != null) { + for (String value : values) { + addMetadata(shortName, publication, + field.getName(), value); + } + } + } + } + } + return publication; + } + + private void addMetadata(String config, Record publication, String name, String value) { + if (StringUtils.isBlank(value)) + return; + + String md = null; + if (fieldMap!=null){ + md = this.fieldMap.get(name); + } + + if (StringUtils.isBlank(md)) { + return; + } else { + md = md.trim(); + } + + if (publication.isMutable()){ + publication.makeMutable().addValue(md, new StringValue(value)); + } + } } diff --git a/dspace-api/src/main/java/org/dspace/submit/lookup/CrossRefLookupProvider.java b/dspace-api/src/main/java/org/dspace/submit/lookup/CrossRefLookupProvider.java index bf737a788d48..618221827543 100644 --- a/dspace-api/src/main/java/org/dspace/submit/lookup/CrossRefLookupProvider.java +++ b/dspace-api/src/main/java/org/dspace/submit/lookup/CrossRefLookupProvider.java @@ -7,10 +7,11 @@ */ package org.dspace.submit.lookup; +import gr.ekt.bte.core.Record; + import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; -import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; @@ -20,7 +21,6 @@ import org.apache.commons.httpclient.HttpException; import org.dspace.core.Context; import org.dspace.submit.importer.crossref.CrossrefItem; -import org.dspace.submit.util.SubmissionLookupPublication; import org.jdom.JDOMException; import org.xml.sax.SAXException; @@ -44,12 +44,11 @@ public List getSupportedIdentifiers() { } @Override - public List getByIdentifier(Context context, - Map keys) throws HttpException, IOException { + public List getByIdentifier(Context context, + Map> keys) throws HttpException, IOException { if (keys != null && keys.containsKey(DOI)) { - Set dois = new HashSet(); - dois.add(keys.get(DOI)); - List results = new ArrayList(); + Set dois = keys.get(DOI); + List results = new ArrayList(); List items = null; try { items = crossrefService.search(context, dois); @@ -71,9 +70,9 @@ public List getByIdentifier(Context context, } @Override - public List search(Context context, String title, + public List search(Context context, String title, String author, int year) throws HttpException, IOException { - List results = new ArrayList(); + List results = new ArrayList(); List items = null; items = crossrefService.search(context, title, author, year, 10); if (items != null) { @@ -94,29 +93,4 @@ public boolean isSearchProvider() { public String getShortName() { return "crossref"; } - - @Override - public List getByDOIs(Context context, Set doiToSearch) - throws HttpException, IOException { - if (doiToSearch != null) { - List results = new ArrayList(); - List items = null; - try { - items = crossrefService.search(context, doiToSearch); - } catch (JDOMException e) { - throw new RuntimeException(e.getMessage(), e); - } catch (ParserConfigurationException e) { - throw new RuntimeException(e.getMessage(), e); - } catch (SAXException e) { - throw new RuntimeException(e.getMessage(), e); - } - if (items != null) { - for (CrossrefItem p : items) { - results.add(convert(p)); - } - return results; - } - } - return null; - } } diff --git a/dspace-api/src/main/java/org/dspace/submit/lookup/MultipleSubmissionLookupDataLoader.java b/dspace-api/src/main/java/org/dspace/submit/lookup/MultipleSubmissionLookupDataLoader.java new file mode 100644 index 000000000000..02d12bedf55c --- /dev/null +++ b/dspace-api/src/main/java/org/dspace/submit/lookup/MultipleSubmissionLookupDataLoader.java @@ -0,0 +1,91 @@ +/** + * + */ +package org.dspace.submit.lookup; + +import java.util.List; +import java.util.Map; +import java.util.Set; + + +import gr.ekt.bte.core.DataLoader; +import gr.ekt.bte.core.DataLoadingSpec; +import gr.ekt.bte.core.Record; +import gr.ekt.bte.core.RecordSet; +import gr.ekt.bte.exceptions.MalformedSourceException; + +/** + * @author Kostas Stamatis + * + */ +public class MultipleSubmissionLookupDataLoader implements DataLoader { + + List providers; + + Map> identifiers; //Searching by identifiers (DOI ...) + Map> searchTerms; //Searching by author, title, date + + /** + * + */ + public MultipleSubmissionLookupDataLoader() { + } + + /* (non-Javadoc) + * @see gr.ekt.bte.core.DataLoader#getRecords() + */ + @Override + public RecordSet getRecords() throws MalformedSourceException { + + RecordSet recordSet = new RecordSet(); + + //List timeoutProviders = new ArrayList(); + for (DataLoader dataLoader : providers) { + RecordSet subRecordSet = dataLoader.getRecords(); + recordSet.addAll(subRecordSet); + } + + //for each publication in the record set, if it has a DOI, try to find extra pubs from the other providers + if (searchTerms!=null || !identifiers.containsKey(SubmissionLookupProvider.DOI)){ //Extend + for (Record record : recordSet.getRecords()){ + + } + } + + return recordSet; + } + + /* (non-Javadoc) + * @see gr.ekt.bte.core.DataLoader#getRecords(gr.ekt.bte.core.DataLoadingSpec) + */ + @Override + public RecordSet getRecords(DataLoadingSpec arg0) + throws MalformedSourceException { + + return getRecords(); + } + + public void setProviders(List providers) { + this.providers = providers; + } + + public void setIdentifiers(Map> identifiers) { + this.identifiers = identifiers; + + if (providers!=null){ + for (ConfigurableLookupProvider provider : providers){ + provider.setIdentifiers(identifiers); + } + } + } + + public void setSearchTerms(Map> searchTerms) { + this.searchTerms = searchTerms; + + if (providers!=null){ + for (ConfigurableLookupProvider provider : providers){ + provider.setSearchTerms(searchTerms); + } + } + } +} diff --git a/dspace-api/src/main/java/org/dspace/submit/lookup/PubmedLookupProvider.java b/dspace-api/src/main/java/org/dspace/submit/lookup/PubmedLookupProvider.java index 1bfda2c96820..c8b659b53956 100644 --- a/dspace-api/src/main/java/org/dspace/submit/lookup/PubmedLookupProvider.java +++ b/dspace-api/src/main/java/org/dspace/submit/lookup/PubmedLookupProvider.java @@ -7,6 +7,8 @@ */ package org.dspace.submit.lookup; +import gr.ekt.bte.core.Record; + import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; @@ -19,7 +21,6 @@ import org.dspace.core.Context; import org.dspace.core.LogManager; import org.dspace.submit.importer.pubmed.PubmedItem; -import org.dspace.submit.util.SubmissionLookupPublication; public class PubmedLookupProvider extends ConfigurableLookupProvider { private boolean searchProvider = true; @@ -52,27 +53,44 @@ public String getShortName() { } @Override - public List getByIdentifier(Context context, - Map keys) throws HttpException, IOException { - String pmid = keys != null ? keys.get(PUBMED) : null; - String doi = keys != null ? keys.get(DOI) : null; - SubmissionLookupPublication publication = null; - List results = new ArrayList(); - if (pmid != null && doi == null) { - try - { - publication = convert(pubmedService.getByPubmedID(pmid)); - } - catch (Exception e) - { - log.error(LogManager.getHeader(context, "getByIdentifier", "pmid="+pmid), e); - } - if (publication != null) - results.add(publication); + public List getByIdentifier(Context context, + Map> keys) throws HttpException, IOException { + Set pmids = keys != null ? keys.get(PUBMED) : null; + Set dois = keys != null ? keys.get(DOI) : null; + List results = new ArrayList(); + if (pmids != null && pmids.size()>0 && dois == null) { + for (String pmid : pmids){ + PubmedItem p = null; + try + { + p = pubmedService.getByPubmedID(pmid); + } + catch (Exception e) + { + log.error(LogManager.getHeader(context, "getByIdentifier", "pmid="+pmid), e); + } + if (p != null) + results.add(convert(p)); + } + } + else if (dois != null && dois.size()>0 && pmids == null) { + StringBuffer query = new StringBuffer(); + for (String d : dois) { + if (query.length() > 0) { + query.append(" OR "); + } + query.append(d).append("[AI]"); + } + + List pubmedResults = pubmedService.search(query.toString()); + for (PubmedItem p : pubmedResults) { + results.add(convert(p)); + } } else { - List pubmedResults = pubmedService.search(doi, pmid); + //EKT:ToDo: support list of dois and pmids in the search method of pubmedService + List pubmedResults = pubmedService.search(dois.iterator().next(), pmids.iterator().next()); if (pubmedResults != null) { for (PubmedItem p : pubmedResults) { results.add(convert(p)); @@ -84,33 +102,11 @@ public List getByIdentifier(Context context, } @Override - public List search(Context context, String title, + public List search(Context context, String title, String author, int year) throws HttpException, IOException { List pubmedResults = pubmedService.search(title, author, year); - List results = new ArrayList(); - if (pubmedResults != null) { - for (PubmedItem p : pubmedResults) { - results.add(convert(p)); - } - } - return results; - } - - @Override - public List getByDOIs(Context context, - Set doiToSearch) - throws HttpException, IOException { - StringBuffer query = new StringBuffer(); - for (String d : doiToSearch) { - if (query.length() > 0) { - query.append(" OR "); - } - query.append(d).append("[AI]"); - } - - List pubmedResults = pubmedService.search(query.toString()); - List results = new ArrayList(); + List results = new ArrayList(); if (pubmedResults != null) { for (PubmedItem p : pubmedResults) { results.add(convert(p)); diff --git a/dspace-api/src/main/java/org/dspace/submit/lookup/SubmissionLookupProvider.java b/dspace-api/src/main/java/org/dspace/submit/lookup/SubmissionLookupProvider.java index 7634bfe6399c..4818c49df7d1 100644 --- a/dspace-api/src/main/java/org/dspace/submit/lookup/SubmissionLookupProvider.java +++ b/dspace-api/src/main/java/org/dspace/submit/lookup/SubmissionLookupProvider.java @@ -7,6 +7,9 @@ */ package org.dspace.submit.lookup; +import gr.ekt.bte.core.DataLoader; +import gr.ekt.bte.core.Record; + import java.io.IOException; import java.util.List; import java.util.Map; @@ -14,9 +17,8 @@ import org.apache.commons.httpclient.HttpException; import org.dspace.core.Context; -import org.dspace.submit.util.SubmissionLookupPublication; -public interface SubmissionLookupProvider { +public interface SubmissionLookupProvider extends DataLoader { public final static String DOI = "doi"; public final static String PUBMED = "pubmed"; public final static String ARXIV = "arxiv"; @@ -30,12 +32,12 @@ public interface SubmissionLookupProvider { String getShortName(); - List search(Context context, String title, String author, + List search(Context context, String title, String author, int year) throws HttpException, IOException; - List getByIdentifier(Context context, Map keys) + List getByIdentifier(Context context, Map> keys) throws HttpException, IOException; - List getByDOIs(Context context, Set doiToSearch) throws HttpException, IOException; + List getByDOIs(Context context, Set doiToSearch) throws HttpException, IOException; } diff --git a/dspace-api/src/main/java/org/dspace/submit/lookup/SubmissionLookupService.java b/dspace-api/src/main/java/org/dspace/submit/lookup/SubmissionLookupService.java index debcb95f6da7..f0b4323b41a5 100644 --- a/dspace-api/src/main/java/org/dspace/submit/lookup/SubmissionLookupService.java +++ b/dspace-api/src/main/java/org/dspace/submit/lookup/SubmissionLookupService.java @@ -39,6 +39,7 @@ import org.dspace.submit.util.SubmissionLookupPublication; import edu.emory.mathcs.backport.java.util.Arrays; +import gr.ekt.bte.core.Value; public class SubmissionLookupService { @@ -170,15 +171,15 @@ public void merge(String formName, Item item, ItemSubmissionLookupDTO dto) { String[] md = splitMetadata(metadata); if (isValidMetadata(formName, md)) { if (isRepeatableMetadata(formName, md)) { - for (String value : itemLookup.getValues(field)) { - String[] splitValue = splitValue(value); + for (Value value : itemLookup.getValues(field)) { + String[] splitValue = splitValue(value.getAsString()); if (splitValue[3] != null) { item.addMetadata(md[0], md[1], md[2], md[3], splitValue[0], splitValue[1], Integer.parseInt(splitValue[2])); } else { item.addMetadata(md[0], md[1], md[2], md[3], - value); + value.getAsString()); } } } else { @@ -214,8 +215,8 @@ public void merge(String formName, Item item, ItemSubmissionLookupDTO dto) { makeSureMetadataExist(context, providerName, md[1], md[2]); if (isRepeatableMetadata(formName, md)) { - for (String value : pub.getValues(field)) { - String[] splitValue = splitValue(value); + for (Value value : pub.getValues(field)) { + String[] splitValue = splitValue(value.getAsString()); item.addMetadata(providerName, md[1], md[2], md[3], splitValue[0], splitValue[1], @@ -421,7 +422,7 @@ public List getSearchProviders() { return searchProviders; } - public List searchByTerms(Context context, + /*public List searchByTerms(Context context, String title, String author, int year) { List publications = new ArrayList(); List timeoutProviders = new ArrayList(); @@ -568,7 +569,7 @@ private List buildItemSubmissionLookupDTO( } } return result; - } + }*/ public List getProviders() { return providers; diff --git a/dspace-api/src/main/java/org/dspace/submit/lookup/SubmissionLookupUtils.java b/dspace-api/src/main/java/org/dspace/submit/lookup/SubmissionLookupUtils.java index 66f308695720..89d883fd5a77 100644 --- a/dspace-api/src/main/java/org/dspace/submit/lookup/SubmissionLookupUtils.java +++ b/dspace-api/src/main/java/org/dspace/submit/lookup/SubmissionLookupUtils.java @@ -43,8 +43,6 @@ public class SubmissionLookupUtils { + "config" + File.separator + "crosswalks" + File.separator; - private static final Map importerProps = new HashMap(); - // Patter to extract the converter name if any private static final Pattern converterPattern = Pattern .compile(".*\\((.*)\\)"); @@ -102,116 +100,6 @@ public static LookupProvidersCheck getProvidersCheck(Context context, } - public static SubmissionLookupPublication convert(String shortName, - Object bean) throws SecurityException, NoSuchMethodException, - IllegalArgumentException, IllegalAccessException, - InvocationTargetException { - SubmissionLookupPublication publication = new SubmissionLookupPublication( - shortName); - Field[] fields = bean.getClass().getDeclaredFields(); - for (Field field : fields) { - if (field.getType() == String.class) { - Method getter = bean.getClass().getMethod( - "get" + field.getName().substring(0, 1).toUpperCase() - + field.getName().substring(1)); - - String value = (String) getter.invoke(bean); - - addMetadata(shortName, publication, field.getName(), value); - - } else if (field.getType() == List.class) { - ParameterizedType pt = (ParameterizedType) field - .getGenericType(); - - Method getter = bean.getClass().getMethod( - "get" + field.getName().substring(0, 1).toUpperCase() - + field.getName().substring(1)); - - if (pt.getActualTypeArguments()[0] instanceof GenericArrayType) { // nomi - // di - // persone - List values = (List) getter - .invoke(bean); - if (values != null) { - for (String[] nvalue : values) { - String value = nvalue[1] + ", " + nvalue[0]; - addMetadata(shortName, publication, - field.getName(), value); - } - } - } else { // metadati ripetibili - List values = (List) getter.invoke(bean); - if (values != null) { - for (String value : values) { - addMetadata(shortName, publication, - field.getName(), value); - } - } - } - } - } - return publication; - } - - private static void addMetadata(String config, - SubmissionLookupPublication publication, String name, String value) { - String md = getSubmissionLoookupConfiguration(config).getProperty(name); - - if (StringUtils.isBlank(md)) { - return; - } else { - md = md.trim(); - } - - Matcher converterMatcher = converterPattern.matcher(md); - String converterName = null; - if (converterMatcher.matches()) { - converterName = converterMatcher.group(1); - md = md.replaceAll("\\(" + converterName + "\\)", ""); - } - IConverter converter = (IConverter) PluginManager.getNamedPlugin( - IConverter.class, converterName); - - String nValue; - if (converter != null) { - nValue = converter.makeConversion(value); - } else { - nValue = value; - } - publication.add(md, nValue); - } - - private static synchronized Properties getSubmissionLoookupConfiguration( - String config) { - Properties properties = importerProps.get(config); - if (properties != null) { - return properties; - } - // Read in configuration - properties = new Properties(); - importerProps.put(config, properties); - FileInputStream fis = null; - try { - fis = new FileInputStream(configFilePath + config - + "-submission.properties"); - properties.load(fis); - } catch (Exception notfound) { - throw new IllegalArgumentException( - "Impossibile leggere la configurazione per il SubmissionLookupProvider " - + config, notfound); - } finally { - if (fis != null) { - try { - fis.close(); - } catch (IOException ioe) { - log.error(ioe.getMessage(), ioe); - } - } - } - - return properties; - } - public static String normalizeDOI(String doi) { if (doi != null) { diff --git a/dspace-api/src/main/java/org/dspace/submit/util/EnhancedSubmissionLookupPublication.java b/dspace-api/src/main/java/org/dspace/submit/util/EnhancedSubmissionLookupPublication.java index 7c882a89a23a..ead7ee44a139 100644 --- a/dspace-api/src/main/java/org/dspace/submit/util/EnhancedSubmissionLookupPublication.java +++ b/dspace-api/src/main/java/org/dspace/submit/util/EnhancedSubmissionLookupPublication.java @@ -7,6 +7,10 @@ */ package org.dspace.submit.util; +import gr.ekt.bte.core.StringValue; +import gr.ekt.bte.core.Value; + +import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -53,28 +57,36 @@ public Set getFields() { @Override public String getFirstValue(String md) { - List values = getValues(md); + List values = getValues(md); if (values != null && values.size() > 0) { - return values.get(0); + return values.get(0).getAsString(); } return null; } @Override - public List getValues(String md) { + public List getValues(String md) { if (enhancedMetadata != null && enhancedMetadata.keySet().contains(md)) { if (cacheEnhanched != null && cacheEnhanched.keySet().contains(md)) { - return cacheEnhanched.get(md); + List values = new ArrayList(); + for (String s : cacheEnhanched.get(md)){ + values.add(new StringValue(s)); + } + return values; } else { EnhancerSubmissionLookup enhancer = enhancedMetadata.get(md); List values = enhancer.getValues(this); + List valuesvalues = new ArrayList(); + for (String s : values){ + valuesvalues.add(new StringValue(s)); + } cacheEnhanched.put(md, values); - return values; + return valuesvalues; } } else diff --git a/dspace-api/src/main/java/org/dspace/submit/util/ItemSubmissionLookupDTO.java b/dspace-api/src/main/java/org/dspace/submit/util/ItemSubmissionLookupDTO.java index 9736c35f00ec..a07d9fa5ef57 100644 --- a/dspace-api/src/main/java/org/dspace/submit/util/ItemSubmissionLookupDTO.java +++ b/dspace-api/src/main/java/org/dspace/submit/util/ItemSubmissionLookupDTO.java @@ -7,6 +7,8 @@ */ package org.dspace.submit.util; +import gr.ekt.bte.core.Value; + import java.io.Serializable; import java.util.LinkedHashSet; import java.util.List; @@ -69,14 +71,14 @@ else if (publications.size() == 1) } for (String field : p.getFields()) { - List values = p.getValues(field); + List values = p.getValues(field); if (values != null && values.size() > 0) { if (!pub.getFields().contains(field)) { - for (String v : values) + for (Value v : values) { - pub.add(field, v); + pub.add(field, v.getAsString()); } } } diff --git a/dspace-api/src/main/java/org/dspace/submit/util/RepeatableToSingleValueEnhancer.java b/dspace-api/src/main/java/org/dspace/submit/util/RepeatableToSingleValueEnhancer.java index 7968799ad4fb..0372b77eebde 100644 --- a/dspace-api/src/main/java/org/dspace/submit/util/RepeatableToSingleValueEnhancer.java +++ b/dspace-api/src/main/java/org/dspace/submit/util/RepeatableToSingleValueEnhancer.java @@ -7,6 +7,8 @@ */ package org.dspace.submit.util; +import gr.ekt.bte.core.Value; + import java.util.ArrayList; import java.util.List; @@ -21,7 +23,7 @@ public class RepeatableToSingleValueEnhancer implements @Override public List getValues(SubmissionLookupPublication publication) { - List values = new ArrayList(); + List values = new ArrayList(); for (String s : singleValues) { if (publication.getValues(s) != null) { values.addAll(publication.getValues(s)); diff --git a/dspace-api/src/main/java/org/dspace/submit/util/SubmissionLookupPublication.java b/dspace-api/src/main/java/org/dspace/submit/util/SubmissionLookupPublication.java index 6f0ce6a71885..1281f53f7357 100644 --- a/dspace-api/src/main/java/org/dspace/submit/util/SubmissionLookupPublication.java +++ b/dspace-api/src/main/java/org/dspace/submit/util/SubmissionLookupPublication.java @@ -7,6 +7,10 @@ */ package org.dspace.submit.util; +import gr.ekt.bte.core.MutableRecord; +import gr.ekt.bte.core.StringValue; +import gr.ekt.bte.core.Value; + import java.io.Serializable; import java.util.ArrayList; import java.util.HashMap; @@ -17,7 +21,7 @@ import org.apache.commons.lang.StringUtils; import org.dspace.submit.lookup.SubmissionLookupProvider; -public class SubmissionLookupPublication implements Serializable { +public class SubmissionLookupPublication implements MutableRecord, Serializable { private String providerName; private Map> storage = new HashMap>(); @@ -59,10 +63,6 @@ public String getFirstValue(String md) { return tmp.get(0); } - public List getValues(String md) { - return storage.get(md); - } - public String getProviderName() { return providerName; } @@ -70,4 +70,111 @@ public String getProviderName() { public String getType() { return getFirstValue(SubmissionLookupProvider.TYPE); } + + //BTE Record interface methods + @Override + public boolean hasField(String md) { + return storage.containsKey(md); + } + + @Override + public List getValues(String md) { + List stringValues = storage.get(md); + List values = new ArrayList(); + for (String value : stringValues){ + values.add(new StringValue(value)); + } + return values; + } + + @Override + public boolean isMutable() { + return true; + } + + @Override + public MutableRecord makeMutable() { + return this; + } + + @Override + public boolean addField(String md, List values) { + if (storage.containsKey(md)){ + List stringValues = storage.get(md); + for (Value value : values){ + stringValues.add(value.getAsString()); + } + } + else { + List tmp = new ArrayList(); + for (Value value : values){ + tmp.add(value.getAsString()); + } + storage.put(md, tmp); + } + + return true; + } + + @Override + public boolean addValue(String md, Value value) { + if (storage.containsKey(md)){ + List stringValues = storage.get(md); + stringValues.add(value.getAsString()); + } + else { + List tmp = new ArrayList(); + tmp.add(value.getAsString()); + + storage.put(md, tmp); + } + + return true; + } + + @Override + public boolean removeField(String md) { + if (storage.containsKey(md)){ + storage.remove(md); + } + return false; + } + + @Override + public boolean removeValue(String md, Value value) { + if (storage.containsKey(md)){ + List stringValues = storage.get(md); + stringValues.remove(value.getAsString()); + } + return true; + } + + @Override + public boolean updateField(String md, List values) { + List stringValues = new ArrayList(); + for (Value value : values){ + stringValues.add(value.getAsString()); + } + storage.put(md, stringValues); + + return true; + } + + @Override + public boolean updateValue(String md, Value valueOld, Value valueNew) { + if (storage.containsKey(md)){ + List stringValues = storage.get(md); + List newStringValues = storage.get(md); + for (String s : stringValues){ + if (s.equals(valueOld.getAsString())){ + newStringValues.add(valueNew.getAsString()); + } + else { + newStringValues.add(s); + } + } + storage.put(md, newStringValues); + } + return true; + } } diff --git a/dspace-api/src/main/resources/spring/spring-dspace-addon-submissionlookup-services.xml b/dspace-api/src/main/resources/spring/spring-dspace-addon-submissionlookup-services.xml index 4945a92dd78a..35288ef71759 100644 --- a/dspace-api/src/main/resources/spring/spring-dspace-addon-submissionlookup-services.xml +++ b/dspace-api/src/main/resources/spring/spring-dspace-addon-submissionlookup-services.xml @@ -15,6 +15,31 @@ http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd"> + + + + + + + + + + + + + + + + + + + + + + + + + @@ -65,10 +90,34 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -76,13 +125,52 @@ name="arxivLookupProvider"> + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + - \ No newline at end of file diff --git a/dspace-jspui/src/main/java/org/dspace/app/webui/json/SubmissionLookupJSONRequest.java b/dspace-jspui/src/main/java/org/dspace/app/webui/json/SubmissionLookupJSONRequest.java index 65f5711135ed..995756333290 100644 --- a/dspace-jspui/src/main/java/org/dspace/app/webui/json/SubmissionLookupJSONRequest.java +++ b/dspace-jspui/src/main/java/org/dspace/app/webui/json/SubmissionLookupJSONRequest.java @@ -11,6 +11,7 @@ import java.util.ArrayList; import java.util.Enumeration; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.MissingResourceException; @@ -26,6 +27,7 @@ import org.dspace.core.ConfigurationManager; import org.dspace.core.Context; import org.dspace.core.I18nUtil; +import org.dspace.submit.lookup.MultipleSubmissionLookupDataLoader; import org.dspace.submit.lookup.SubmissionLookupService; import org.dspace.submit.util.ItemSubmissionLookupDTO; import org.dspace.submit.util.SubmissionLookupDTO; @@ -33,6 +35,10 @@ import org.dspace.utils.DSpace; import flexjson.JSONSerializer; +import gr.ekt.bte.core.TransformationEngine; +import gr.ekt.bte.core.TransformationSpec; +import gr.ekt.bte.exceptions.BadTransformationSpec; +import gr.ekt.bte.exceptions.MalformedSourceException; public class SubmissionLookupJSONRequest extends JSONRequest { @@ -40,6 +46,10 @@ public class SubmissionLookupJSONRequest extends JSONRequest { .getServiceByName(SubmissionLookupService.class.getName(), SubmissionLookupService.class); + private TransformationEngine bteService = new DSpace().getServiceManager() + .getServiceByName(TransformationEngine.class.getName(), + TransformationEngine.class); + private static Logger log = Logger .getLogger(SubmissionLookupJSONRequest.class); @@ -50,7 +60,7 @@ public void doJSONRequest(Context context, HttpServletRequest req, String suuid = req.getParameter("s_uuid"); SubmissionLookupDTO subDTO = service.getSubmissionLookupDTO(req, suuid); if ("identifiers".equalsIgnoreCase(req.getParameter("type"))) { - Map identifiers = new HashMap(); + Map> identifiers = new HashMap>(); Enumeration e = req.getParameterNames(); while (e.hasMoreElements()) { @@ -59,17 +69,32 @@ public void doJSONRequest(Context context, HttpServletRequest req, if (parameterName.startsWith("identifier_") && StringUtils.isNotBlank(parameterValue)) { + Set set = new HashSet(); + set.add(parameterValue); identifiers.put( parameterName.substring("identifier_".length()), - parameterValue); + set); } } - List result = service + MultipleSubmissionLookupDataLoader dataLoader = (MultipleSubmissionLookupDataLoader)bteService.getDataLoader(); + dataLoader.setIdentifiers(identifiers); + + try { + bteService.transform(new TransformationSpec()); + } catch (BadTransformationSpec e1) { + // TODO Auto-generated catch block + e1.printStackTrace(); + } catch (MalformedSourceException e1) { + // TODO Auto-generated catch block + e1.printStackTrace(); + } + + /*List result = service .searchByIdentifiers(context, identifiers); - subDTO.setItems(result); + subDTO.setItems(result);*/ service.storeDTOs(req, suuid, subDTO); - List> dto = getLightResultList(result); + List> dto = null;//getLightResultList(result); JSONSerializer serializer = new JSONSerializer(); serializer.rootName("result"); serializer.deepSerialize(dto, resp.getWriter()); @@ -78,12 +103,12 @@ public void doJSONRequest(Context context, HttpServletRequest req, String author = req.getParameter("authors"); int year = UIUtil.getIntParameter(req, "year"); - List result = service.searchByTerms(context, title, + /*List result = service.searchByTerms(context, title, author, year); - subDTO.setItems(result); + subDTO.setItems(result);*/ service.storeDTOs(req, suuid, subDTO); - List> dto = getLightResultList(result); + List> dto = null;// getLightResultList(result); JSONSerializer serializer = new JSONSerializer(); serializer.rootName("result"); serializer.deepSerialize(dto, resp.getWriter());