diff --git a/sci-publications/src/main/java/org/scientificcms/publications/ui/contenttypes/InProceedingsPropertiesStep.java b/sci-publications/src/main/java/org/scientificcms/publications/ui/contenttypes/InProceedingsPropertiesStep.java new file mode 100644 index 0000000..f27dc31 --- /dev/null +++ b/sci-publications/src/main/java/org/scientificcms/publications/ui/contenttypes/InProceedingsPropertiesStep.java @@ -0,0 +1,501 @@ +package org.scientificcms.publications.ui.contenttypes; + +import org.libreccm.api.Identifier; +import org.libreccm.api.IdentifierParser; +import org.libreccm.l10n.GlobalizationHelper; +import org.libreccm.security.AuthorizationRequired; +import org.librecms.ui.contentsections.ContentSectionNotFoundException; +import org.librecms.ui.contentsections.ItemPermissionChecker; +import org.librecms.ui.contentsections.documents.DocumentNotFoundException; +import org.librecms.ui.contentsections.documents.DocumentUi; +import org.librecms.ui.contentsections.documents.MvcAuthoringStepDef; +import org.librecms.ui.contentsections.documents.MvcAuthoringSteps; +import org.scientificcms.publications.InProceedings; +import org.scientificcms.publications.Proceedings; +import org.scientificcms.publications.ProceedingsManager; +import org.scientificcms.publications.PublicationRepository; +import org.scientificcms.publications.contenttypes.ArticleInCollectedVolumeItem; +import org.scientificcms.publications.contenttypes.InProceedingsItem; +import org.scientificcms.publications.ui.SciPublicationsUiConstants; +import org.scientificcms.publications.ui.SciPublicationsUiMessageBundle; + +import java.util.Optional; + +import javax.enterprise.context.RequestScoped; +import javax.inject.Inject; +import javax.mvc.Controller; +import javax.mvc.Models; +import javax.transaction.Transactional; +import javax.ws.rs.DefaultValue; +import javax.ws.rs.FormParam; +import javax.ws.rs.GET; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; + +/** + * + * @author Jens Pelzetter + */ +@RequestScoped +@Path( + MvcAuthoringSteps.PATH_PREFIX + + InProceedingsPropertiesStep.EDIT_STEP_URL_FRAGMENT +) +@Controller +@MvcAuthoringStepDef( + bundle = SciPublicationsUiConstants.BUNDLE, + descriptionKey = "authoringsteps.basicproperties.description", + labelKey = "authoringsteps.basicproperties.label", + supportedDocumentType = ArticleInCollectedVolumeItem.class +) +public class InProceedingsPropertiesStep + extends AbstractPublicationPropertiesStep { + + public static final String EDIT_STEP_URL_FRAGMENT + = "inproceedings-basicproperties"; + + @Inject + private ProceedingsManager proceedingsManager; + + @Inject + private DocumentUi documentUi; + + @Inject + private GlobalizationHelper globalizationHelper; + + @Inject + private IdentifierParser identifierParser; + + @Inject + private ItemPermissionChecker itemPermissionChecker; + + @Inject + private Models models; + + @Inject + private InProceedingsPropertiesStepModel propertiesStepModel; + + @Inject + private PublicationRepository publicationRepo; + + @Inject + private SciPublicationsUiMessageBundle messageBundle; + + @Override + public Class getStepClass() { + return InProceedingsPropertiesStep.class; + } + + @Override + public String getEditStepUrlFragment() { + return EDIT_STEP_URL_FRAGMENT; + } + + @Override + protected String getStepTemplatePath() { + return "org/scientificcms/contenttypes/ui/inproceedings/edit-inproceedings.xhtml"; + } + + @Override + public Class getPublicationClass() { + return InProceedings.class; + } + + @Override + @Transactional(Transactional.TxType.REQUIRED) + public void init() throws ContentSectionNotFoundException, + DocumentNotFoundException { + super.init(); + + propertiesStepModel.setEndPage(getPublication().getEndPage()); + + propertiesStepModel.setProceedingsTitle( + Optional + .ofNullable(getPublication().getProceedings()) + .map(Proceedings::getTitle) + .map(globalizationHelper::getValueFromLocalizedString) + .orElse(null) + ); + + propertiesStepModel.setStartPage(getPublication().getStartPage()); + } + + @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(Transactional.TxType.REQUIRED) + @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(Transactional.TxType.REQUIRED) + @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(Transactional.TxType.REQUIRED) + @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("/proceedings") + @AuthorizationRequired + @Transactional(Transactional.TxType.REQUIRED) + public String setProceedings( + @PathParam(MvcAuthoringSteps.SECTION_IDENTIFIER_PATH_PARAM) + final String sectionIdentifier, + @PathParam(MvcAuthoringSteps.DOCUMENT_PATH_PATH_PARAM_NAME) + final String documentPath, + @FormParam("proceedingsIdentifier") + final String proceedingsIdentifier + ) { + try { + init(); + } catch (ContentSectionNotFoundException ex) { + return ex.showErrorMessage(); + } catch (DocumentNotFoundException ex) { + return ex.showErrorMessage(); + } + + if (itemPermissionChecker.canEditItem(getDocument())) { + final Identifier identifier = identifierParser.parseIdentifier( + proceedingsIdentifier + ); + final Optional proceedingsResult; + switch (identifier.getType()) { + case ID: + proceedingsResult = publicationRepo.findByIdAndType( + Long.parseLong(identifier.getIdentifier()), + Proceedings.class + ); + break; + case UUID: + proceedingsResult = publicationRepo.findByUuidAndType( + identifier.getIdentifier(), + Proceedings.class + ); + break; + default: + proceedingsResult = Optional.empty(); + break; + } + + if (proceedingsResult.isEmpty()) { + return showProceedingsNotFound( + sectionIdentifier, + documentPath, + proceedingsIdentifier + ); + } + + final Proceedings proceedings = proceedingsResult.get(); + proceedingsManager.addPaperToProceedings( + getPublication(), + proceedings + ); + + return buildRedirectPathForStep(); + } else { + return documentUi.showAccessDenied( + getContentSection(), + getDocument(), + getLabel() + ); + } + } + + @POST + @Path("/proceedings/remove") + @AuthorizationRequired + @Transactional(Transactional.TxType.REQUIRED) + public String removeProceedings( + @PathParam(MvcAuthoringSteps.SECTION_IDENTIFIER_PATH_PARAM) + final String sectionIdentifier, + @PathParam(MvcAuthoringSteps.DOCUMENT_PATH_PATH_PARAM_NAME) + final String documentPath + ) { + try { + init(); + } catch (ContentSectionNotFoundException ex) { + return ex.showErrorMessage(); + } catch (DocumentNotFoundException ex) { + return ex.showErrorMessage(); + } + + if (itemPermissionChecker.canEditItem(getDocument())) { + if (getPublication().getProceedings() != null) { + proceedingsManager.removeArticleFromProceedings( + getPublication(), + getPublication().getProceedings() + ); + } + + return buildRedirectPathForStep(); + } else { + return documentUi.showAccessDenied( + getContentSection(), + getDocument(), + getLabel() + ); + } + } + + @POST + @Path("/properties") + @AuthorizationRequired + @Transactional(Transactional.TxType.REQUIRED) + public String updateProperties( + @PathParam(MvcAuthoringSteps.SECTION_IDENTIFIER_PATH_PARAM) + final String sectionIdentifier, + @PathParam(MvcAuthoringSteps.DOCUMENT_PATH_PATH_PARAM_NAME) + final String documentPath, + @FormParam("yearOfPublication") + final String yearOfPublicationParam, + @FormParam("startPage") + final String startPageParam, + @FormParam("endPage") + final String endPageParam + ) { + try { + init(); + } catch (ContentSectionNotFoundException ex) { + return ex.showErrorMessage(); + } catch (DocumentNotFoundException ex) { + return ex.showErrorMessage(); + } + + if (itemPermissionChecker.canEditItem(getDocument())) { + updateProperties( + sectionIdentifier, + documentPath, + yearOfPublicationParam + ); + + if (endPageParam.matches("\\d*")) { + getPublication().setEndPage( + Integer.parseInt(endPageParam) + ); + } + + if (startPageParam.matches("\\d*")) { + getPublication().setStartPage( + Integer.parseInt(startPageParam) + ); + } + + return buildRedirectPathForStep(); + } else { + return documentUi.showAccessDenied( + getContentSection(), + getDocument(), + messageBundle.getMessage("publication.edit.denied") + ); + } + } + + private String showProceedingsNotFound( + final String sectionIdentifier, + final String documentPath, + final String proceedingsIdentifier + ) { + models.put("proceedingsNotFound", proceedingsIdentifier); + return showStep(sectionIdentifier, documentPath); + } + + +}