REST Endpoints for SciPublications

pull/1/head
Jens Pelzetter 2019-10-27 11:11:16 +01:00
parent f10a3fda1e
commit 76ec1913ae
7 changed files with 449 additions and 0 deletions

View File

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

View File

@ -109,6 +109,13 @@ public class PublicationRepository
.setParameter("title", title)
.getResultList();
}
public <T extends Publication> List<T> findByType(final Class<T> type) {
return getEntityManager()
.createNamedQuery("Publication.findByType", type)
.setParameter("type", type)
.getResultList();
}
public <T extends Publication> List<T> findByTitleAndType(
final String title, final Class<T> type

View File

@ -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 <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/
@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<Journal> 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();
}
}

View File

@ -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 <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/
@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<Publication> 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<Publication> 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<Publication> typeClass
= (Class<Publication>) 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();
}
}

View File

@ -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 <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/
@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> 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();
}
}

View File

@ -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 <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/
@ApplicationPath("/scipublications")
public class SciPublicationsApplication extends Application {
@Override
public Set<Class<?>> getClasses() {
final Set<Class<?>> classes = new HashSet<>();
classes.add(Journals.class);
classes.add(Publishers.class);
classes.add(Publications.class);
classes.add(SeriesRs.class);
return classes;
}
}

View File

@ -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 <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/
@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> 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();
}
}