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 a6f2bda..c8827a2 100644 --- a/sci-publications/src/main/java/org/scientificcms/publications/PublicationRepository.java +++ b/sci-publications/src/main/java/org/scientificcms/publications/PublicationRepository.java @@ -11,9 +11,14 @@ import org.librecms.assets.Person; import java.util.List; import java.util.Optional; import java.util.UUID; +import java.util.stream.Stream; import javax.enterprise.context.RequestScoped; import javax.persistence.NoResultException; +import javax.persistence.TypedQuery; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Root; import javax.transaction.Transactional; /** @@ -56,14 +61,21 @@ public class PublicationRepository public Optional findByIdAndType( final long publicationId, final Class type ) { + final CriteriaBuilder criteriaBuilder = getEntityManager() + .getCriteriaBuilder(); + final CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(type); + final Root from = criteriaQuery.from(type); + + criteriaQuery.where( + criteriaBuilder.equal(from.get("publicationId"), publicationId) + ); + + final TypedQuery query = getEntityManager().createQuery( + criteriaQuery + ); + try { - return Optional.of( - getEntityManager() - .createNamedQuery("Publication.findByIdAndType", type) - .setParameter("publicationId", publicationId) - .setParameter("type", type) - .getSingleResult() - ); + return Optional.of(query.getSingleResult()); } catch (NoResultException ex) { return Optional.empty(); } @@ -109,7 +121,7 @@ public class PublicationRepository .setParameter("title", title) .getResultList(); } - + public List findByType(final Class type) { return getEntityManager() .createNamedQuery("Publication.findByType", type) diff --git a/sci-publications/src/main/java/org/scientificcms/publications/contenttypes/PublicationItem.java b/sci-publications/src/main/java/org/scientificcms/publications/contenttypes/PublicationItem.java index 6d59eb6..77b7a43 100644 --- a/sci-publications/src/main/java/org/scientificcms/publications/contenttypes/PublicationItem.java +++ b/sci-publications/src/main/java/org/scientificcms/publications/contenttypes/PublicationItem.java @@ -21,7 +21,7 @@ import static org.scientificcms.publications.SciPublicationsConstants.*; /** * Base Item for Publications. - * + * * @author Jens Pelzetter * @param */ @@ -31,19 +31,23 @@ import static org.scientificcms.publications.SciPublicationsConstants.*; @NamedQueries({ @NamedQuery( name = "PublicationItem.findForPublication", - query = "SELECT i FROM PublicationItem i WHERE i.publication = :publication" + query + = "SELECT i FROM PublicationItem i WHERE i.publication = :publication" ) }) public class PublicationItem extends ContentItem { private static final long serialVersionUID = 1L; - @OneToOne(cascade = {CascadeType.DETACH, - CascadeType.MERGE, - CascadeType.PERSIST, - CascadeType.REFRESH}, - fetch = FetchType.LAZY, - targetEntity = Publication.class + @OneToOne( + cascade = { + CascadeType.DETACH, + CascadeType.MERGE, + CascadeType.PERSIST, + CascadeType.REFRESH + }, + fetch = FetchType.LAZY, + targetEntity = Publication.class ) private T publication; diff --git a/sci-publications/src/main/java/org/scientificcms/publications/ui/contenttypes/AbstractPublicationPropertiesStep.java b/sci-publications/src/main/java/org/scientificcms/publications/ui/contenttypes/AbstractPublicationPropertiesStep.java index f0cbbd9..5e1aebf 100644 --- a/sci-publications/src/main/java/org/scientificcms/publications/ui/contenttypes/AbstractPublicationPropertiesStep.java +++ b/sci-publications/src/main/java/org/scientificcms/publications/ui/contenttypes/AbstractPublicationPropertiesStep.java @@ -97,8 +97,23 @@ public abstract class AbstractPublicationPropertiesStep getPublicationClass(); + protected P getPublication() { - return getPublicationItem().getPublication(); + final long publicationId = getPublicationItem() + .getPublication() + .getPublicationId(); + + return publicationRepo + .findByIdAndType(publicationId, getPublicationClass()) + .orElseThrow( + () -> new IllegalArgumentException( + String.format( + "PublicationItem %s has no associated publication", + getPublicationItem().getUuid() + ) + ) + ); } @Override @@ -156,7 +171,7 @@ public abstract class AbstractPublicationPropertiesStep param.isBlank()) + .filter(param -> !param.isBlank()) .filter(param -> param.matches("\\d*")) .map(param -> Integer.parseInt(param)) .orElse(null); @@ -324,9 +330,6 @@ public abstract class AbstractPublicationPropertiesStep publisherResult = Optional.ofNullable( + publication.getPublisher() + ); propertiesStepModel.setPublisherUuid(publication.getUuid()); - propertiesStepModel.setPublisherName(publisher.getName()); - propertiesStepModel.setPublisherPlace(publisher.getPlace()); + + publisherResult.ifPresent( + publisher -> propertiesStepModel.setPublisherName( + publisher.getName() + ) + ); + publisherResult.ifPresent( + publisher -> propertiesStepModel.setPublisherPlace( + publisher.getPlace() + ) + ); } + @Transactional(Transactional.TxType.REQUIRED) public String setPublisher( @PathParam(MvcAuthoringSteps.SECTION_IDENTIFIER_PATH_PARAM) final String sectionIdentifier, @@ -150,6 +164,7 @@ public abstract class AbstractPublicationWithPublisherPropertiesStep getStepClass() { return MonographPropertiesStep.class; } - + @Override protected String getEditStepUrlFragment() { return "monograph-basicproperties"; } + @Override + public Class getPublicationClass() { + return Monograph.class; + } + @Override @Transactional(Transactional.TxType.REQUIRED) protected void init() throws ContentSectionNotFoundException, @@ -67,13 +75,262 @@ public class MonographPropertiesStep extends AbstractPublicationWithPublisherPro super.init(); propertiesStepModel.setReviewed( - getPublication().getReviewed() + Optional + .ofNullable(getPublication().getReviewed()) + .orElse(false) ); } + @GET + @Path("/") + @AuthorizationRequired + @Transactional(Transactional.TxType.REQUIRED) + @Override + public String showStep( + @PathParam(MvcAuthoringSteps.SECTION_IDENTIFIER_PATH_PARAM) + final String sectionIdentifier, + @PathParam(MvcAuthoringSteps.DOCUMENT_PATH_PATH_PARAM_NAME) + final String documentPath + ) { + return super.showStep(sectionIdentifier, documentPath); + } + + @POST + @Path("/name") + @AuthorizationRequired + @Transactional(Transactional.TxType.REQUIRED) + @Override + public String updateName( + @PathParam(MvcAuthoringSteps.SECTION_IDENTIFIER_PATH_PARAM) + final String sectionIdentifier, + @PathParam(MvcAuthoringSteps.DOCUMENT_PATH_PATH_PARAM_NAME) + final String documentPath, + @FormParam("name") @DefaultValue("") + final String name + ) { + return super.updateName(sectionIdentifier, documentPath, name); + } + + + + @POST + @Path("/title/@add") + @AuthorizationRequired + @Transactional(Transactional.TxType.REQUIRED) + @Override + public String addTitle( + @PathParam(MvcAuthoringSteps.SECTION_IDENTIFIER_PATH_PARAM) + final String sectionIdentifier, + @PathParam(MvcAuthoringSteps.DOCUMENT_PATH_PATH_PARAM_NAME) + final String documentPath, + @FormParam("locale") final String localeParam, + @FormParam("value") final String value + ) { + return super.addTitle( + sectionIdentifier, + documentPath, + localeParam, + value + ); + } + + @POST + @Path("/title/@edit/{locale}") + @AuthorizationRequired + @Transactional(Transactional.TxType.REQUIRED) + @Override + public String editTitle( + @PathParam(MvcAuthoringSteps.SECTION_IDENTIFIER_PATH_PARAM) + final String sectionIdentifier, + @PathParam(MvcAuthoringSteps.DOCUMENT_PATH_PATH_PARAM_NAME) + final String documentPath, + @PathParam("locale") final String localeParam, + @FormParam("value") final String value + ) { + return super.editTitle( + sectionIdentifier, + documentPath, + localeParam, + value + ); + } + + @POST + @Path("/title/@remove/{locale}") + @AuthorizationRequired + @Transactional(Transactional.TxType.REQUIRED) + @Override + public String removeTitle( + @PathParam(MvcAuthoringSteps.SECTION_IDENTIFIER_PATH_PARAM) + final String sectionIdentifier, + @PathParam(MvcAuthoringSteps.DOCUMENT_PATH_PATH_PARAM_NAME) + final String documentPath, + @PathParam("locale") final String localeParam + ) { + return super.removeTitle(sectionIdentifier, documentPath, localeParam); + } + + @POST + @Path("/shortdescription/@add") + @Transactional(Transactional.TxType.REQUIRED) + @Override + public String addShortDescription( + @PathParam(MvcAuthoringSteps.SECTION_IDENTIFIER_PATH_PARAM) + final String sectionIdentifier, + @PathParam(MvcAuthoringSteps.DOCUMENT_PATH_PATH_PARAM_NAME) + final String documentPath, + @FormParam("locale") final String localeParam, + @FormParam("value") final String value + ) { + return super.addShortDescription( + sectionIdentifier, + documentPath, + localeParam, + value + ); + } + + @POST + @Path("/shortdescription/@edit/{locale}") + @Transactional(Transactional.TxType.REQUIRED) + @Override + public String editShortDescription( + @PathParam(MvcAuthoringSteps.SECTION_IDENTIFIER_PATH_PARAM) + final String sectionIdentifier, + @PathParam(MvcAuthoringSteps.DOCUMENT_PATH_PATH_PARAM_NAME) + final String documentPath, + @PathParam("locale") final String localeParam, + @FormParam("value") final String value + ) { + return super.editShortDescription( + sectionIdentifier, + documentPath, + localeParam, + value + ); + } + + @POST + @Path("/shortdescription/@remove/{locale}") + @Transactional(Transactional.TxType.REQUIRED) + @Override + public String removeShortDescription( + @PathParam(MvcAuthoringSteps.SECTION_IDENTIFIER_PATH_PARAM) + final String sectionIdentifier, + @PathParam(MvcAuthoringSteps.DOCUMENT_PATH_PATH_PARAM_NAME) + final String documentPath, + @PathParam("locale") final String localeParam + ) { + return super.removeShortDescription( + sectionIdentifier, + documentPath, + localeParam + ); + } + + @POST + @Path("/authors") + @AuthorizationRequired + @Transactional + @Override + public String addAuthor( + @PathParam(MvcAuthoringSteps.SECTION_IDENTIFIER_PATH_PARAM) + final String sectionIdentifier, + @PathParam(MvcAuthoringSteps.DOCUMENT_PATH_PATH_PARAM_NAME) + final String documentPath, + @FormParam("authorIdentifier") + final String authorIdentifier, + @FormParam("editor") + final String editorParam + ) { + return super.addAuthor( + sectionIdentifier, + documentPath, + authorIdentifier, + editorParam + ); + } + + @POST + @Path("/authors/{authorshipUuid}") + @AuthorizationRequired + @Transactional + @Override + public String editAuthorship( + @PathParam(MvcAuthoringSteps.SECTION_IDENTIFIER_PATH_PARAM) + final String sectionIdentifier, + @PathParam(MvcAuthoringSteps.DOCUMENT_PATH_PATH_PARAM_NAME) + final String documentPath, + @PathParam("authorshipUuid") + final String authorshipUuid, + @FormParam("editor") + final String editorParam + ) { + return super.editAuthorship( + sectionIdentifier, + documentPath, + authorshipUuid, + editorParam + ); + } + + @POST + @Path("/authors/{authorshipUuid}/remove") + @AuthorizationRequired + @Transactional + @Override + public String removeAuthorship( + @PathParam(MvcAuthoringSteps.SECTION_IDENTIFIER_PATH_PARAM) + final String sectionIdentifier, + @PathParam(MvcAuthoringSteps.DOCUMENT_PATH_PATH_PARAM_NAME) + final String documentPath, + @PathParam("authorshipUuid") + final String authorshipUuid + ) { + return super.removeAuthorship( + sectionIdentifier, + documentPath, + authorshipUuid + ); + } + + @POST + @Path("/publisher") + @AuthorizationRequired + @Transactional(Transactional.TxType.REQUIRED) + @Override + public String setPublisher( + @PathParam(MvcAuthoringSteps.SECTION_IDENTIFIER_PATH_PARAM) + final String sectionIdentifier, + @PathParam(MvcAuthoringSteps.DOCUMENT_PATH_PATH_PARAM_NAME) + final String documentPath, + @FormParam("publisherIdentifier") + final String publisherIdentifier + ) { + return super.setPublisher( + sectionIdentifier, + documentPath, + publisherIdentifier + ); + } + + @POST + @Path("/publisher/@remove") + @AuthorizationRequired + @Transactional(Transactional.TxType.REQUIRED) + @Override + public String removePublisher( + @PathParam(MvcAuthoringSteps.SECTION_IDENTIFIER_PATH_PARAM) + final String sectionIdentifier, + @PathParam(MvcAuthoringSteps.DOCUMENT_PATH_PATH_PARAM_NAME) + final String documentPath + ) { + return super.removePublisher(sectionIdentifier, documentPath); + } + @Override protected String getStepTemplatePath() { - return "/org/scientificcms/contenttypes/monograph/ui/edit-monograph.xhtml"; + return "org/scientificcms/contenttypes/ui/monograph/edit-monograph.xhtml"; } @POST() @@ -107,11 +364,11 @@ public class MonographPropertiesStep extends AbstractPublicationWithPublisherPro getPublication().setReviewed( Optional - .ofNullable(reviewedParam) - .map(param -> "true".equals(param) || "on".equals("param")) - .orElse(false) + .ofNullable(reviewedParam) + .map(param -> "true".equals(param) || "on".equals(param)) + .orElse(false) ); - + return buildRedirectPathForStep(); } else { return documentUi.showAccessDenied( diff --git a/sci-publications/src/main/java/org/scientificcms/publications/ui/contenttypes/PublicationPropertiesStepModel.java b/sci-publications/src/main/java/org/scientificcms/publications/ui/contenttypes/PublicationPropertiesStepModel.java index bc00411..b515c99 100644 --- a/sci-publications/src/main/java/org/scientificcms/publications/ui/contenttypes/PublicationPropertiesStepModel.java +++ b/sci-publications/src/main/java/org/scientificcms/publications/ui/contenttypes/PublicationPropertiesStepModel.java @@ -27,9 +27,9 @@ public class PublicationPropertiesStepModel { private List unusedTitleLocales; - private int yearOfPublication; + private Integer yearOfPublication; - private Map shortDecriptionValues; + private Map shortDescriptionValues; private List unusedShortDescriptionLocales; @@ -69,22 +69,22 @@ public class PublicationPropertiesStepModel { this.unusedTitleLocales = new ArrayList<>(unusedTitleLocales); } - public int getYearOfPublication() { + public Integer getYearOfPublication() { return yearOfPublication; } - public void setYearOfPublication(final int yearOfPublication) { + public void setYearOfPublication(final Integer yearOfPublication) { this.yearOfPublication = yearOfPublication; } - public Map getShortDecriptionValues() { - return Collections.unmodifiableMap(shortDecriptionValues); + public Map getShortDescriptionValues() { + return Collections.unmodifiableMap(shortDescriptionValues); } - public void setShortDecriptionValues( - final Map shortDecriptionValues + public void setShortDescriptionValues( + final Map shortDescriptionValues ) { - this.shortDecriptionValues = new HashMap<>(shortDecriptionValues); + this.shortDescriptionValues = new HashMap<>(shortDescriptionValues); } public List getUnusedShortDescriptionLocales() { diff --git a/sci-publications/src/main/java/org/scientificcms/publications/ui/contenttypes/PublicationWithPublisherPropertiesStepModel.java b/sci-publications/src/main/java/org/scientificcms/publications/ui/contenttypes/PublicationWithPublisherPropertiesStepModel.java index 6e274a9..d809752 100644 --- a/sci-publications/src/main/java/org/scientificcms/publications/ui/contenttypes/PublicationWithPublisherPropertiesStepModel.java +++ b/sci-publications/src/main/java/org/scientificcms/publications/ui/contenttypes/PublicationWithPublisherPropertiesStepModel.java @@ -1,5 +1,7 @@ package org.scientificcms.publications.ui.contenttypes; +import org.scientificcms.publications.assets.PublisherAsset; + import javax.enterprise.context.RequestScoped; import javax.inject.Named; @@ -16,6 +18,8 @@ public class PublicationWithPublisherPropertiesStepModel { private String publisherName; private String publisherPlace; + + public String getPublisherUuid() { return publisherUuid; @@ -40,5 +44,9 @@ public class PublicationWithPublisherPropertiesStepModel { public void setPublisherPlace(final String publisherPlace) { this.publisherPlace = publisherPlace; } + + public String getPublisherType() { + return PublisherAsset.class.getName(); + } } diff --git a/sci-publications/src/main/resources/WEB-INF/views/org/scientificcms/contenttypes/ui/create-publication.xhtml b/sci-publications/src/main/resources/WEB-INF/views/org/scientificcms/contenttypes/ui/create-publication.xhtml index 77b07f6..4ba6fe0 100644 --- a/sci-publications/src/main/resources/WEB-INF/views/org/scientificcms/contenttypes/ui/create-publication.xhtml +++ b/sci-publications/src/main/resources/WEB-INF/views/org/scientificcms/contenttypes/ui/create-publication.xhtml @@ -19,8 +19,7 @@
+ method="post"> + assetType="#{SciCmsPublicationWithPublisherPropertiesStepModel.publisherType}" + assetPickerId="publisher-picker" + baseUrl="#{SciCmsPublicationPropertiesStepModel.baseUrl}" + contentSection="#{ContentSectionModel.sectionName}" + dialogTitle="#{SciPublicationsUiMessageBundle['publicationwithpublisher.publisher.select.dialog.title']}" + formParamName="publisherIdentifier" + />

- - - #{SciCmsPublicationWithPublisherPropertiesStepModel.publisherName}, #{SciCmsPublicationWithPublisherPropertiesStepModel.publisherPlace} - - - #{SciCmsPublicationWithPublisherPropertiesStepModel.publisherName} - - - - - -

+ + + #{SciCmsPublicationWithPublisherPropertiesStepModel.publisherName}, #{SciCmsPublicationWithPublisherPropertiesStepModel.publisherPlace} + + + #{SciCmsPublicationWithPublisherPropertiesStepModel.publisherName} + + + + + +

- + diff --git a/sci-publications/src/main/resources/WEB-INF/views/org/scientificcms/contenttypes/ui/edit-publication.xhtml b/sci-publications/src/main/resources/WEB-INF/views/org/scientificcms/contenttypes/ui/edit-publication.xhtml index ed87891..953ce08 100644 --- a/sci-publications/src/main/resources/WEB-INF/views/org/scientificcms/contenttypes/ui/edit-publication.xhtml +++ b/sci-publications/src/main/resources/WEB-INF/views/org/scientificcms/contenttypes/ui/edit-publication.xhtml @@ -63,7 +63,7 @@ id="name-edit-dialog" tabindex="-1">