From 76ec1913ae77a2fee032f56dbbb5822d9b395d76 Mon Sep 17 00:00:00 2001 From: Jens Pelzetter Date: Sun, 27 Oct 2019 11:11:16 +0100 Subject: [PATCH] REST Endpoints for SciPublications --- .../publications/Publication.java | 4 + .../publications/PublicationRepository.java | 7 + .../publications/rs/Journals.java | 78 +++++++++ .../publications/rs/Publications.java | 162 ++++++++++++++++++ .../publications/rs/Publishers.java | 77 +++++++++ .../rs/SciPublicationsApplication.java | 36 ++++ .../publications/rs/SeriesRs.java | 85 +++++++++ 7 files changed, 449 insertions(+) create mode 100644 sci-publications/src/main/java/org/scientificcms/publications/rs/Journals.java create mode 100644 sci-publications/src/main/java/org/scientificcms/publications/rs/Publications.java create mode 100644 sci-publications/src/main/java/org/scientificcms/publications/rs/Publishers.java create mode 100644 sci-publications/src/main/java/org/scientificcms/publications/rs/SciPublicationsApplication.java create mode 100644 sci-publications/src/main/java/org/scientificcms/publications/rs/SeriesRs.java diff --git a/sci-publications/src/main/java/org/scientificcms/publications/Publication.java b/sci-publications/src/main/java/org/scientificcms/publications/Publication.java index c4ba257..e1d3232 100644 --- a/sci-publications/src/main/java/org/scientificcms/publications/Publication.java +++ b/sci-publications/src/main/java/org/scientificcms/publications/Publication.java @@ -75,6 +75,10 @@ import static org.scientificcms.publications.SciPublicationsConstants.*; + "WHERE LOWER(t) LIKE CONCAT('%', :title, '%') " + "AND TYPE(p) = :type" ), + @NamedQuery( + name = "Publication.findByType", + query = "SELECT DISTINCT p FROM Publication p WHERE TYPE(p) = :type" + ), @NamedQuery( name = "Publication.findByAuthor", query = "SELECT DISTINCT p " diff --git a/sci-publications/src/main/java/org/scientificcms/publications/PublicationRepository.java b/sci-publications/src/main/java/org/scientificcms/publications/PublicationRepository.java index 6072c21..a6f2bda 100644 --- a/sci-publications/src/main/java/org/scientificcms/publications/PublicationRepository.java +++ b/sci-publications/src/main/java/org/scientificcms/publications/PublicationRepository.java @@ -109,6 +109,13 @@ public class PublicationRepository .setParameter("title", title) .getResultList(); } + + public List findByType(final Class type) { + return getEntityManager() + .createNamedQuery("Publication.findByType", type) + .setParameter("type", type) + .getResultList(); + } public List findByTitleAndType( final String title, final Class type diff --git a/sci-publications/src/main/java/org/scientificcms/publications/rs/Journals.java b/sci-publications/src/main/java/org/scientificcms/publications/rs/Journals.java new file mode 100644 index 0000000..9a82a02 --- /dev/null +++ b/sci-publications/src/main/java/org/scientificcms/publications/rs/Journals.java @@ -0,0 +1,78 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package org.scientificcms.publications.rs; + +import org.scientificcms.publications.Journal; +import org.scientificcms.publications.JournalRepository; + +import java.io.StringWriter; +import java.util.List; + +import javax.enterprise.context.RequestScoped; +import javax.inject.Inject; +import javax.json.Json; +import javax.json.JsonArrayBuilder; +import javax.json.JsonObject; +import javax.json.JsonWriter; +import javax.transaction.Transactional; +import javax.ws.rs.GET; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import javax.ws.rs.QueryParam; +import javax.ws.rs.core.MediaType; + +/** + * + * @author Jens Pelzetter + */ +@RequestScoped +@Path("/journals") +public class Journals { + + @Inject + private JournalRepository journalRepository; + + @GET + @Path("/") + @Produces(MediaType.APPLICATION_JSON) + @Transactional(Transactional.TxType.REQUIRED) + public String findJournals(@QueryParam("query") final String query) { + + + final List journals; + if ((query == null) || query.trim().isEmpty()) { + journals = journalRepository.findAll(); + } else { + journals = journalRepository.findByTitle(query); + } + + final JsonArrayBuilder arrayBuilder = Json.createArrayBuilder(); + + journals + .stream() + .map(this::journalToJson) + .forEach(arrayBuilder::add); + + final StringWriter writer = new StringWriter(); + final JsonWriter jsonWriter = Json.createWriter(writer); + jsonWriter.writeArray(arrayBuilder.build()); + + return writer.toString(); + } + + private JsonObject journalToJson(final Journal journal) { + + return Json + .createObjectBuilder() + .add("journalId", journal.getJournalId()) + .add("title", journal.getTitle()) + .add("symbol", journal.getSymbol()) + .add("issn", journal.getIssn()) + .build(); + + } + +} diff --git a/sci-publications/src/main/java/org/scientificcms/publications/rs/Publications.java b/sci-publications/src/main/java/org/scientificcms/publications/rs/Publications.java new file mode 100644 index 0000000..33b9c98 --- /dev/null +++ b/sci-publications/src/main/java/org/scientificcms/publications/rs/Publications.java @@ -0,0 +1,162 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package org.scientificcms.publications.rs; + +import com.arsdigita.cms.contenttypes.ui.PublicationSeriesTable; + +import org.libreccm.l10n.GlobalizationHelper; +import org.librecms.assets.Person; +import org.scientificcms.publications.Authorship; +import org.scientificcms.publications.Publication; +import org.scientificcms.publications.PublicationRepository; +import org.scientificcms.publications.PublicationWithPublisher; +import org.scientificcms.publications.Publisher; + +import java.io.StringWriter; +import java.util.List; +import java.util.stream.Collectors; + +import javax.enterprise.context.RequestScoped; +import javax.inject.Inject; +import javax.json.Json; +import javax.json.JsonArrayBuilder; +import javax.json.JsonObject; +import javax.json.JsonObjectBuilder; +import javax.json.JsonValue; +import javax.json.JsonWriter; +import javax.transaction.Transactional; +import javax.ws.rs.GET; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import javax.ws.rs.QueryParam; +import javax.ws.rs.core.MediaType; + +/** + * + * @author Jens Pelzetter + */ +@RequestScoped +@Path("/publications") +public class Publications { + + @Inject + private PublicationRepository publicationRepository; + + @Inject + private GlobalizationHelper globalizationHelper; + + @GET + @Path("/") + @Produces(MediaType.APPLICATION_JSON) + @Transactional(Transactional.TxType.REQUIRED) + public String findPublications( + @QueryParam("query") final String query, + @QueryParam("type") final String type + ) { + + final List publications; + if ((query == null || query.trim().isEmpty()) + && (type == null || type.trim().isEmpty())) { + publications = publicationRepository.findAll(); + } else if ((query != null && !query.trim().isEmpty()) + && (type == null || type.trim().isEmpty())) { + publications = publicationRepository.findByTitle(query); + } else if ((query == null || query.trim().isEmpty()) + && (type != null && !type.trim().isEmpty())) { + publications = publicationRepository.findByType( + toPublicationClass(type) + ); + } else { + publications = publicationRepository.findByTitleAndType( + query, toPublicationClass(type) + ); + } + + final JsonArrayBuilder arrayBuilder = Json.createArrayBuilder(); + publications + .stream() + .map(this::publicationToJson) + .forEach(arrayBuilder::add); + + final StringWriter writer = new StringWriter(); + final JsonWriter jsonWriter = Json.createWriter(writer); + jsonWriter.writeArray(arrayBuilder.build()); + + return writer.toString(); + } + + private Class toPublicationClass(final String type) { + + final Class clazz; + try { + clazz = Class.forName(type); + } catch (ClassNotFoundException ex) { + throw new IllegalArgumentException(String.format( + "Type '%s' is not a valid class.", + type)); + } + + if (Publication.class.isAssignableFrom(clazz)) { + @SuppressWarnings("unchecked") + final Class typeClass + = (Class) clazz; + return typeClass; + } else { + throw new IllegalArgumentException(String.format( + "Type '%s is not a subclass of '%s'.", + type, + Publication.class.getName())); + } + } + + private JsonObject publicationToJson(final Publication publication) { + + final JsonObjectBuilder objectBuilder = Json + .createObjectBuilder() + .add("publicationId", publication.getPublicationId()) + .add( + "authors", + publication + .getAuthorships() + .stream() + .sorted() + .map(Authorship::getAuthor) + .map(Person::getPersonName) + .map( + name -> String.format( + "%s, %s", name.getSurname(), name.getGivenName() + ) + ) + .collect(Collectors.joining("; ")) + ) + .add( + "title", + globalizationHelper.getValueFromLocalizedString( + publication.getTitle() + ) + ) + .add("year", publication.getYearOfPublication()); + + if (publication instanceof PublicationWithPublisher) { + + final Publisher publisher = ((PublicationWithPublisher) publication) + .getPublisher(); + if (publisher != null) { + objectBuilder.add( + "publisher", + String.format( + "%s: %s", publisher.getPlace(), publisher.getName() + ) + ); + } + + } + + return objectBuilder.build(); + + } + +} diff --git a/sci-publications/src/main/java/org/scientificcms/publications/rs/Publishers.java b/sci-publications/src/main/java/org/scientificcms/publications/rs/Publishers.java new file mode 100644 index 0000000..729fada --- /dev/null +++ b/sci-publications/src/main/java/org/scientificcms/publications/rs/Publishers.java @@ -0,0 +1,77 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package org.scientificcms.publications.rs; + +import org.scientificcms.publications.Journal; +import org.scientificcms.publications.Publisher; +import org.scientificcms.publications.PublisherRepository; + +import java.io.StringWriter; +import java.util.List; + +import javax.enterprise.context.RequestScoped; +import javax.inject.Inject; +import javax.json.Json; +import javax.json.JsonArrayBuilder; +import javax.json.JsonObject; +import javax.json.JsonWriter; +import javax.transaction.Transactional; +import javax.ws.rs.GET; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import javax.ws.rs.QueryParam; +import javax.ws.rs.core.MediaType; + +/** + * + * @author Jens Pelzetter + */ +@RequestScoped +@Path("/publishers") +public class Publishers { + + @Inject + private PublisherRepository publisherRepository; + + @GET + @Path("/") + @Produces(MediaType.APPLICATION_JSON) + @Transactional(Transactional.TxType.REQUIRED) + public String findJournals(@QueryParam("query") final String query) { + + final List publisher; + if ((query == null) || query.trim().isEmpty()) { + publisher = publisherRepository.findAll(); + } else { + publisher = publisherRepository.findByName(query); + } + + final JsonArrayBuilder arrayBuilder = Json.createArrayBuilder(); + + publisher + .stream() + .map(this::publisherToJson) + .forEach(arrayBuilder::add); + + final StringWriter writer = new StringWriter(); + final JsonWriter jsonWriter = Json.createWriter(writer); + jsonWriter.writeArray(arrayBuilder.build()); + + return writer.toString(); + } + + private JsonObject publisherToJson(final Publisher publisher) { + + return Json + .createObjectBuilder() + .add("publisherId", publisher.getPublisherId()) + .add("name", publisher.getName()) + .add("place", publisher.getPlace()) + .build(); + + } + +} diff --git a/sci-publications/src/main/java/org/scientificcms/publications/rs/SciPublicationsApplication.java b/sci-publications/src/main/java/org/scientificcms/publications/rs/SciPublicationsApplication.java new file mode 100644 index 0000000..575bd87 --- /dev/null +++ b/sci-publications/src/main/java/org/scientificcms/publications/rs/SciPublicationsApplication.java @@ -0,0 +1,36 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package org.scientificcms.publications.rs; + +import java.util.HashSet; +import java.util.Set; + +import javax.ws.rs.ApplicationPath; +import javax.ws.rs.core.Application; + +/** + * + * @author Jens Pelzetter + */ +@ApplicationPath("/scipublications") +public class SciPublicationsApplication extends Application { + + @Override + public Set> getClasses() { + + final Set> classes = new HashSet<>(); + + classes.add(Journals.class); + classes.add(Publishers.class); + classes.add(Publications.class); + classes.add(SeriesRs.class); + + return classes; + + } + + +} diff --git a/sci-publications/src/main/java/org/scientificcms/publications/rs/SeriesRs.java b/sci-publications/src/main/java/org/scientificcms/publications/rs/SeriesRs.java new file mode 100644 index 0000000..63c953c --- /dev/null +++ b/sci-publications/src/main/java/org/scientificcms/publications/rs/SeriesRs.java @@ -0,0 +1,85 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package org.scientificcms.publications.rs; + +import org.libreccm.l10n.GlobalizationHelper; +import org.scientificcms.publications.Journal; +import org.scientificcms.publications.Series; +import org.scientificcms.publications.SeriesRepository; + +import java.io.StringWriter; +import java.util.List; + +import javax.enterprise.context.RequestScoped; +import javax.inject.Inject; +import javax.json.Json; +import javax.json.JsonArrayBuilder; +import javax.json.JsonObject; +import javax.json.JsonWriter; +import javax.transaction.Transactional; +import javax.ws.rs.GET; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import javax.ws.rs.QueryParam; +import javax.ws.rs.core.MediaType; + +/** + * + * @author Jens Pelzetter + */ +@RequestScoped +@Path("/series") +public class SeriesRs { + + @Inject + private SeriesRepository seriesRepository; + + @Inject + private GlobalizationHelper globalizationHelper; + + @GET + @Path("/") + @Produces(MediaType.APPLICATION_JSON) + @Transactional(Transactional.TxType.REQUIRED) + public String findJournals(@QueryParam("query") final String query) { + + final List series; + if ((query == null) || query.trim().isEmpty()) { + series = seriesRepository.findAll(); + } else { + series = seriesRepository.findByTitle(query); + } + + final JsonArrayBuilder arrayBuilder = Json.createArrayBuilder(); + + series + .stream() + .map(this::seriesToJson) + .forEach(arrayBuilder::add); + + final StringWriter writer = new StringWriter(); + final JsonWriter jsonWriter = Json.createWriter(writer); + jsonWriter.writeArray(arrayBuilder.build()); + + return writer.toString(); + } + + private JsonObject seriesToJson(final Series series) { + + return Json + .createObjectBuilder() + .add("seriesId", series.getSeriesId()) + .add( + "title", + globalizationHelper.getValueFromLocalizedString( + series.getTitle() + ) + ) + .build(); + + } + +}