REST Endpoints for SciPublications
parent
f10a3fda1e
commit
76ec1913ae
|
|
@ -75,6 +75,10 @@ import static org.scientificcms.publications.SciPublicationsConstants.*;
|
||||||
+ "WHERE LOWER(t) LIKE CONCAT('%', :title, '%') "
|
+ "WHERE LOWER(t) LIKE CONCAT('%', :title, '%') "
|
||||||
+ "AND TYPE(p) = :type"
|
+ "AND TYPE(p) = :type"
|
||||||
),
|
),
|
||||||
|
@NamedQuery(
|
||||||
|
name = "Publication.findByType",
|
||||||
|
query = "SELECT DISTINCT p FROM Publication p WHERE TYPE(p) = :type"
|
||||||
|
),
|
||||||
@NamedQuery(
|
@NamedQuery(
|
||||||
name = "Publication.findByAuthor",
|
name = "Publication.findByAuthor",
|
||||||
query = "SELECT DISTINCT p "
|
query = "SELECT DISTINCT p "
|
||||||
|
|
|
||||||
|
|
@ -109,6 +109,13 @@ public class PublicationRepository
|
||||||
.setParameter("title", title)
|
.setParameter("title", title)
|
||||||
.getResultList();
|
.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(
|
public <T extends Publication> List<T> findByTitleAndType(
|
||||||
final String title, final Class<T> type
|
final String title, final Class<T> type
|
||||||
|
|
|
||||||
|
|
@ -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();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -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();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -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();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -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;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -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();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue