Properties step for CollectedVolume

pull/1/head
Jens Pelzetter 2022-07-18 20:31:10 +02:00
parent ec97dad42e
commit 03ac3cbd95
3 changed files with 381 additions and 0 deletions

View File

@ -0,0 +1,41 @@
package org.scientificcms.publications.ui.contenttypes;
import java.util.Comparator;
/**
*
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/
public class ArticleInCollectedVolumeRow
implements Comparable<ArticleInCollectedVolumeRow> {
private String title;
private String chapter;
public String getTitle() {
return title;
}
public void setTitle(final String title) {
this.title = title;
}
public String getChapter() {
return chapter;
}
public void setChapter(final String chapter) {
this.chapter = chapter;
}
@Override
public int compareTo(final ArticleInCollectedVolumeRow other) {
return Comparator
.nullsFirst(
Comparator.comparing(ArticleInCollectedVolumeRow::getChapter)
)
.compare(this, other);
}
}

View File

@ -0,0 +1,310 @@
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.ArticleInCollectedVolume;
import org.scientificcms.publications.CollectedVolume;
import org.scientificcms.publications.CollectedVolumeManager;
import org.scientificcms.publications.PublicationRepository;
import org.scientificcms.publications.contenttypes.CollectedVolumeItem;
import org.scientificcms.publications.contenttypes.MonographItem;
import org.scientificcms.publications.ui.SciPublicationsUiConstants;
import org.scientificcms.publications.ui.SciPublicationsUiMessageBundle;
import java.util.Objects;
import java.util.Optional;
import java.util.stream.Collectors;
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.FormParam;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
/**
*
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/
@RequestScoped
@Path(MvcAuthoringSteps.PATH_PREFIX
+ CollectedVolumePropertiesStep.EDIT_STEP_URL_FRAGMENT)
@Controller
@MvcAuthoringStepDef(
bundle = SciPublicationsUiConstants.BUNDLE,
descriptionKey = "authoringsteps.basicproperties.description",
labelKey = "authoringsteps.basicproperties.label",
supportedDocumentType = MonographItem.class
)
public class CollectedVolumePropertiesStep
extends AbstractPublicationWithPublisherPropertiesStep<CollectedVolumeItem, CollectedVolume> {
public static final String EDIT_STEP_URL_FRAGMENT
= "collectedvolume-basicproperties";
@Inject
private DocumentUi documentUi;
@Inject
private GlobalizationHelper globalizationHelper;
@Inject
private IdentifierParser identifierParser;
@Inject
private ItemPermissionChecker itemPermissionChecker;
@Inject
private CollectedVolumeManager collectedVolumeManager;
@Inject
private CollectedVolumePropertiesStepModel propertiesStepModel;
@Inject
private Models models;
@Inject
private PublicationRepository publicationRepo;
@Inject
private SciPublicationsUiMessageBundle messageBundle;
@Override
public Class<CollectedVolumePropertiesStep> getStepClass() {
return CollectedVolumePropertiesStep.class;
}
@Override
protected String getEditStepUrlFragment() {
return EDIT_STEP_URL_FRAGMENT;
}
@Override
public Class<CollectedVolume> getPublicationClass() {
return CollectedVolume.class;
}
@Override
protected String getStepTemplatePath() {
return "org/scientificcms/contenttypes/ui/collectedvolume/edit-collectedvolume.xhtml";
}
@Override
@Transactional(Transactional.TxType.REQUIRED)
protected void init() throws ContentSectionNotFoundException,
DocumentNotFoundException {
super.init();
propertiesStepModel.setArticles(
getPublication()
.getArticles()
.stream()
.map(this::buildArticleInCollectedVolumeRow)
.collect(Collectors.toList())
);
}
@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("/properties")
@AuthorizationRequired
@Transactional(Transactional.TxType.REQUIRED)
@Override
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
) {
return super.updateProperties(
sectionIdentifier,
documentPath,
yearOfPublicationParam
);
}
@POST
@Path("/articles")
@AuthorizationRequired
@Transactional(Transactional.TxType.REQUIRED)
public String addArticle(
@PathParam(MvcAuthoringSteps.SECTION_IDENTIFIER_PATH_PARAM)
final String sectionIdentifier,
@PathParam(MvcAuthoringSteps.DOCUMENT_PATH_PATH_PARAM_NAME)
final String documentPath,
@FormParam("articleIdentifier")
final String articleIdentifier
) {
try {
init();
} catch (ContentSectionNotFoundException ex) {
return ex.showErrorMessage();
} catch (DocumentNotFoundException ex) {
return ex.showErrorMessage();
}
if (itemPermissionChecker.canEditItem(getDocument())) {
final Identifier identifier = identifierParser.parseIdentifier(
articleIdentifier
);
final Optional<ArticleInCollectedVolume> articleResult;
switch (identifier.getType()) {
case ID:
articleResult = publicationRepo.findByIdAndType(
Long.parseLong(identifier.getIdentifier()),
ArticleInCollectedVolume.class
);
break;
case UUID:
articleResult = publicationRepo.findByUuidAndType(
identifier.getIdentifier(),
ArticleInCollectedVolume.class
);
break;
default:
articleResult = Optional.empty();
break;
}
if (articleResult.isEmpty()) {
return showArticleNotFound(
sectionIdentifier,
documentPath,
articleIdentifier
);
}
final ArticleInCollectedVolume article = articleResult.get();
collectedVolumeManager.addArticleToCollectedVolume(
article,
getPublication()
);
return buildRedirectPathForStep();
} else {
return documentUi.showAccessDenied(
getContentSection(),
getDocument(),
getLabel()
);
}
}
@POST
@Path("/articles/{articleUuid}/remove")
@AuthorizationRequired
@Transactional(Transactional.TxType.REQUIRED)
public String removeArticle(
@PathParam(MvcAuthoringSteps.SECTION_IDENTIFIER_PATH_PARAM)
final String sectionIdentifier,
@PathParam(MvcAuthoringSteps.DOCUMENT_PATH_PATH_PARAM_NAME)
final String documentPath,
@PathParam("articleUuid")
final String articleUuid
) {
try {
init();
} catch (ContentSectionNotFoundException ex) {
return ex.showErrorMessage();
} catch (DocumentNotFoundException ex) {
return ex.showErrorMessage();
}
if (itemPermissionChecker.canEditItem(getDocument())) {
final Optional<ArticleInCollectedVolume> articleResult
= getPublication()
.getArticles()
.stream()
.filter(
article -> Objects.equals(
article.getUuid(),
articleUuid
)
)
.findAny();
if (articleResult.isEmpty()) {
return showArticleNotPartOfCollectedVolume(
sectionIdentifier,
documentPath,
articleUuid
);
}
final ArticleInCollectedVolume article = articleResult.get();
collectedVolumeManager.removeArticleFromCollectedVolume(
article,
getPublication()
);
return buildRedirectPathForStep();
} else {
return documentUi.showAccessDenied(
getContentSection(),
getDocument(),
getLabel()
);
}
}
private ArticleInCollectedVolumeRow buildArticleInCollectedVolumeRow(
final ArticleInCollectedVolume article
) {
final ArticleInCollectedVolumeRow row
= new ArticleInCollectedVolumeRow();
row.setTitle(
globalizationHelper.getValueFromLocalizedString(
article.getTitle()
)
);
row.setChapter(article.getChapter());
return row;
}
private String showArticleNotFound(
final String sectionIdentifier,
final String documentPath,
final String articleIdentifier
) {
models.put("articleNotFound", articleIdentifier);
return showStep(sectionIdentifier, documentPath);
}
private String showArticleNotPartOfCollectedVolume(
final String sectionIdentifier,
final String documentPath,
final String articleIdentifier
) {
models.put("articleNotPartOfCollectedVolume", articleIdentifier);
return showStep(sectionIdentifier, documentPath);
}
}

View File

@ -0,0 +1,30 @@
package org.scientificcms.publications.ui.contenttypes;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import javax.enterprise.context.RequestScoped;
import javax.inject.Named;
/**
*
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/
@RequestScoped
@Named("SciCmsCollectedVolumePropertiesStepModel")
public class CollectedVolumePropertiesStepModel {
private List<ArticleInCollectedVolumeRow> articles;
public List<ArticleInCollectedVolumeRow> getArticles() {
return Collections.unmodifiableList(articles);
}
public void setArticles(final List<ArticleInCollectedVolumeRow> articles) {
this.articles = new ArrayList<>(articles);
}
}