Last part of Java classes for MVC-based UI for SciProject
parent
dafc69fa3d
commit
25aabab480
|
|
@ -0,0 +1,42 @@
|
||||||
|
package org.scientificcms.contenttypes.sciproject;
|
||||||
|
|
||||||
|
import org.libreccm.auditing.AbstractAuditedEntityRepository;
|
||||||
|
|
||||||
|
import javax.enterprise.context.RequestScoped;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||||
|
*/
|
||||||
|
@RequestScoped
|
||||||
|
public class ContactRepository
|
||||||
|
extends AbstractAuditedEntityRepository<Long, Contact> {
|
||||||
|
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Long getEntityId(final Contact contact) {
|
||||||
|
return contact.getContactId();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Class<Contact> getEntityClass() {
|
||||||
|
return Contact.class;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getIdAttributeName() {
|
||||||
|
return "contactId";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Long getIdOfEntity(final Contact contact) {
|
||||||
|
return contact.getContactId();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isNew(final Contact contact) {
|
||||||
|
return contact.getContactId() == 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,42 @@
|
||||||
|
package org.scientificcms.contenttypes.sciproject;
|
||||||
|
|
||||||
|
import org.libreccm.auditing.AbstractAuditedEntityRepository;
|
||||||
|
|
||||||
|
import javax.enterprise.context.RequestScoped;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||||
|
*/
|
||||||
|
@RequestScoped
|
||||||
|
public class MembershipRepository
|
||||||
|
extends AbstractAuditedEntityRepository<Long, Membership> {
|
||||||
|
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Long getEntityId(final Membership membership) {
|
||||||
|
return membership.getMembershipId();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Class<Membership> getEntityClass() {
|
||||||
|
return Membership.class;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getIdAttributeName() {
|
||||||
|
return "membershipId";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Long getIdOfEntity(final Membership membership) {
|
||||||
|
return membership.getMembershipId();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isNew(final Membership membership) {
|
||||||
|
return membership.getMembershipId() == 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -9,6 +9,7 @@ import org.librecms.assets.ContactableEntity;
|
||||||
import org.librecms.assets.Organization;
|
import org.librecms.assets.Organization;
|
||||||
import org.librecms.assets.Person;
|
import org.librecms.assets.Person;
|
||||||
import org.librecms.contentsection.ContentItemRepository;
|
import org.librecms.contentsection.ContentItemRepository;
|
||||||
|
import org.librecms.ui.contentsections.ContentSectionsUi;
|
||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
|
@ -28,10 +29,16 @@ public class SciProjectMananger implements Serializable {
|
||||||
private static final long serialVersionUID = 1L;
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
private ContentItemRepository contentItemRepository;
|
private ContactRepository contactRepo;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
private SciProjectRepository sciProjectRepository;
|
private ContentItemRepository itemRepo;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
private MembershipRepository membershipRepo;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
private SponsoringRepository sponsoringRepo;
|
||||||
|
|
||||||
@Transactional(Transactional.TxType.REQUIRED)
|
@Transactional(Transactional.TxType.REQUIRED)
|
||||||
public void addContact(final ContactableEntity contactable,
|
public void addContact(final ContactableEntity contactable,
|
||||||
|
|
@ -50,8 +57,9 @@ public class SciProjectMananger implements Serializable {
|
||||||
contact.setOrder(toProject.getContacts().size());
|
contact.setOrder(toProject.getContacts().size());
|
||||||
|
|
||||||
toProject.addContact(contact);
|
toProject.addContact(contact);
|
||||||
|
contactRepo.save(contact);
|
||||||
|
|
||||||
contentItemRepository.save(toProject);
|
itemRepo.save(toProject);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Transactional(Transactional.TxType.REQUIRED)
|
@Transactional(Transactional.TxType.REQUIRED)
|
||||||
|
|
@ -74,7 +82,8 @@ public class SciProjectMananger implements Serializable {
|
||||||
if (result.isPresent()) {
|
if (result.isPresent()) {
|
||||||
final Contact remove = result.get();
|
final Contact remove = result.get();
|
||||||
fromProject.removeContact(remove);
|
fromProject.removeContact(remove);
|
||||||
contentItemRepository.save(fromProject);
|
itemRepo.save(fromProject);
|
||||||
|
contactRepo.delete(remove);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -101,7 +110,8 @@ public class SciProjectMananger implements Serializable {
|
||||||
|
|
||||||
toProject.addMember(membership);
|
toProject.addMember(membership);
|
||||||
|
|
||||||
contentItemRepository.save(toProject);
|
membershipRepo.save(membership);
|
||||||
|
itemRepo.save(toProject);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Transactional(Transactional.TxType.REQUIRED)
|
@Transactional(Transactional.TxType.REQUIRED)
|
||||||
|
|
@ -128,7 +138,8 @@ public class SciProjectMananger implements Serializable {
|
||||||
if (result.isPresent()) {
|
if (result.isPresent()) {
|
||||||
final Membership remove = result.get();
|
final Membership remove = result.get();
|
||||||
fromProject.removeMembership(remove);
|
fromProject.removeMembership(remove);
|
||||||
contentItemRepository.save(fromProject);
|
itemRepo.save(fromProject);
|
||||||
|
membershipRepo.delete(remove);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -149,7 +160,8 @@ public class SciProjectMananger implements Serializable {
|
||||||
|
|
||||||
toProject.addSponsor(sponsoring);
|
toProject.addSponsor(sponsoring);
|
||||||
|
|
||||||
contentItemRepository.save(toProject);
|
sponsoringRepo.save(sponsoring);
|
||||||
|
itemRepo.save(toProject);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Transactional(Transactional.TxType.REQUIRED)
|
@Transactional(Transactional.TxType.REQUIRED)
|
||||||
|
|
@ -169,7 +181,8 @@ public class SciProjectMananger implements Serializable {
|
||||||
if (result.isPresent()) {
|
if (result.isPresent()) {
|
||||||
final Sponsoring sponsoring = result.get();
|
final Sponsoring sponsoring = result.get();
|
||||||
fromProject.removeSponsor(sponsoring);
|
fromProject.removeSponsor(sponsoring);
|
||||||
contentItemRepository.save(fromProject);
|
sponsoringRepo.delete(sponsoring);
|
||||||
|
itemRepo.save(fromProject);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,42 @@
|
||||||
|
package org.scientificcms.contenttypes.sciproject;
|
||||||
|
|
||||||
|
import org.libreccm.auditing.AbstractAuditedEntityRepository;
|
||||||
|
|
||||||
|
import javax.enterprise.context.RequestScoped;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||||
|
*/
|
||||||
|
@RequestScoped
|
||||||
|
public class SponsoringRepository
|
||||||
|
extends AbstractAuditedEntityRepository<Long, Sponsoring> {
|
||||||
|
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Long getEntityId(final Sponsoring sponsoring) {
|
||||||
|
return sponsoring.getSponsoringId();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Class<Sponsoring> getEntityClass() {
|
||||||
|
return Sponsoring.class;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getIdAttributeName() {
|
||||||
|
return "sponsoringId";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Long getIdOfEntity(final Sponsoring sponsoring) {
|
||||||
|
return sponsoring.getSponsoringId();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isNew(final Sponsoring sponsoring) {
|
||||||
|
return sponsoring.getSponsoringId() == 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -23,6 +23,10 @@ public class SciProjectDescriptionContactsModel {
|
||||||
return canEdit;
|
return canEdit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected void setCanEdit(final boolean canEdit) {
|
||||||
|
this.canEdit = canEdit;
|
||||||
|
}
|
||||||
|
|
||||||
public List<SciProjectContactModel> getContacts() {
|
public List<SciProjectContactModel> getContacts() {
|
||||||
return Collections.unmodifiableList(contacts);
|
return Collections.unmodifiableList(contacts);
|
||||||
}
|
}
|
||||||
|
|
@ -31,8 +35,4 @@ public class SciProjectDescriptionContactsModel {
|
||||||
this.contacts = new ArrayList<>(contacts);
|
this.contacts = new ArrayList<>(contacts);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void setCanEdit(final boolean canEdit) {
|
|
||||||
this.canEdit = canEdit;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -77,9 +77,6 @@ public class SciProjectDescriptionStep extends AbstractMvcAuthoringStep {
|
||||||
@Inject
|
@Inject
|
||||||
private AssetRepository assetRepo;
|
private AssetRepository assetRepo;
|
||||||
|
|
||||||
@Inject
|
|
||||||
private ContactableEntityRepository contactableRepo;
|
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
private ContentItemRepository itemRepo;
|
private ContentItemRepository itemRepo;
|
||||||
|
|
||||||
|
|
@ -135,7 +132,7 @@ public class SciProjectDescriptionStep extends AbstractMvcAuthoringStep {
|
||||||
return documentUi.showAccessDenied(
|
return documentUi.showAccessDenied(
|
||||||
getContentSection(),
|
getContentSection(),
|
||||||
getProject(),
|
getProject(),
|
||||||
sciProjectMessageBundle.getMessage("event.edit.denied")
|
sciProjectMessageBundle.getMessage("sciproject.edit.denied")
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -520,10 +517,12 @@ public class SciProjectDescriptionStep extends AbstractMvcAuthoringStep {
|
||||||
.getValues()
|
.getValues()
|
||||||
.entrySet()
|
.entrySet()
|
||||||
.stream()
|
.stream()
|
||||||
.collect(Collectors.toMap(
|
.collect(
|
||||||
|
Collectors.toMap(
|
||||||
entry -> entry.getKey().toString(),
|
entry -> entry.getKey().toString(),
|
||||||
Map.Entry::getValue
|
Map.Entry::getValue
|
||||||
))
|
)
|
||||||
|
)
|
||||||
);
|
);
|
||||||
descriptionModel.setVariants(
|
descriptionModel.setVariants(
|
||||||
getProject()
|
getProject()
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,132 @@
|
||||||
|
package org.scientificcms.contenttypes.sciproject.ui;
|
||||||
|
|
||||||
|
import org.librecms.contentsection.ContentItem;
|
||||||
|
import org.librecms.contentsection.ContentItemRepository;
|
||||||
|
import org.librecms.contentsection.ContentSection;
|
||||||
|
import org.librecms.ui.contentsections.ContentSectionsUi;
|
||||||
|
import org.librecms.ui.contentsections.documents.MvcAuthoringSteps;
|
||||||
|
import org.scientificcms.contenttypes.sciproject.Contact;
|
||||||
|
import org.scientificcms.contenttypes.sciproject.ContactRepository;
|
||||||
|
import org.scientificcms.contenttypes.sciproject.MembershipRepository;
|
||||||
|
import org.scientificcms.contenttypes.sciproject.SciProject;
|
||||||
|
import org.scientificcms.contenttypes.sciproject.SciProjectRepository;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import javax.enterprise.context.RequestScoped;
|
||||||
|
import javax.inject.Inject;
|
||||||
|
import javax.transaction.Transactional;
|
||||||
|
import javax.ws.rs.BadRequestException;
|
||||||
|
import javax.ws.rs.Consumes;
|
||||||
|
import javax.ws.rs.NotFoundException;
|
||||||
|
import javax.ws.rs.POST;
|
||||||
|
import javax.ws.rs.Path;
|
||||||
|
import javax.ws.rs.PathParam;
|
||||||
|
import javax.ws.rs.core.MediaType;
|
||||||
|
import javax.ws.rs.core.Response;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||||
|
*/
|
||||||
|
@RequestScoped
|
||||||
|
@Path(MvcAuthoringSteps.PATH_PREFIX + "sciproject-description-service")
|
||||||
|
public class SciProjectDescriptionStepService {
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
private ContactRepository contactRepo;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
private ContentItemRepository itemRepo;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
private ContentSectionsUi sectionsUi;
|
||||||
|
|
||||||
|
@POST
|
||||||
|
@Path("/contacts/save-order")
|
||||||
|
@Consumes(MediaType.APPLICATION_JSON)
|
||||||
|
@Transactional(Transactional.TxType.REQUIRED)
|
||||||
|
public Response saveContactsOrder(
|
||||||
|
@PathParam(MvcAuthoringSteps.SECTION_IDENTIFIER_PATH_PARAM)
|
||||||
|
final String sectionIdentifier,
|
||||||
|
@PathParam(MvcAuthoringSteps.DOCUMENT_PATH_PATH_PARAM_NAME)
|
||||||
|
final String documentPath,
|
||||||
|
final List<String> contactsOrder
|
||||||
|
) {
|
||||||
|
final ContentSection contentSection = sectionsUi
|
||||||
|
.findContentSection(sectionIdentifier)
|
||||||
|
.orElseThrow(
|
||||||
|
() -> new NotFoundException(
|
||||||
|
String.format(
|
||||||
|
"No content identifed by %s found.",
|
||||||
|
sectionIdentifier
|
||||||
|
)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
final ContentItem document = itemRepo
|
||||||
|
.findByPath(contentSection, documentPath)
|
||||||
|
.orElseThrow(
|
||||||
|
() -> new NotFoundException(
|
||||||
|
String.format(
|
||||||
|
"No document for path %s in section %s.",
|
||||||
|
documentPath,
|
||||||
|
contentSection.getLabel()
|
||||||
|
)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
if ((document instanceof SciProject)) {
|
||||||
|
throw new BadRequestException(
|
||||||
|
String.format(
|
||||||
|
"Document %s is not a %s.",
|
||||||
|
documentPath,
|
||||||
|
SciProject.class.getSimpleName()
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
final SciProject project = (SciProject) document;
|
||||||
|
|
||||||
|
final List<Contact> contacts = project.getContacts();
|
||||||
|
|
||||||
|
if (contactsOrder.size() != contacts.size()) {
|
||||||
|
throw new BadRequestException(
|
||||||
|
String.format(
|
||||||
|
"Number of contacts of the SciProject %s does "
|
||||||
|
+ "not match the number of values in the order "
|
||||||
|
+ "list. Number of contactas: %d, number of values in "
|
||||||
|
+ "the contacts order list: %d",
|
||||||
|
documentPath,
|
||||||
|
contacts.size(),
|
||||||
|
contactsOrder.size()
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < contactsOrder.size(); i++) {
|
||||||
|
final String contactIdParam = contactsOrder.get(i);
|
||||||
|
final long contactId = Long.parseLong(contactIdParam);
|
||||||
|
final Contact contact = contacts
|
||||||
|
.stream()
|
||||||
|
.filter(con -> con.getContactId() == contactId)
|
||||||
|
.findAny()
|
||||||
|
.orElseThrow(
|
||||||
|
() -> new BadRequestException(
|
||||||
|
String.format(
|
||||||
|
"contactsOrder has an entry for contact with "
|
||||||
|
+ "ID %d, but there is not contact with that "
|
||||||
|
+ "ID.",
|
||||||
|
contactId
|
||||||
|
)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
contact.setOrder(i);
|
||||||
|
contactRepo.save(contact);
|
||||||
|
}
|
||||||
|
|
||||||
|
return Response.ok().build();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,41 @@
|
||||||
|
package org.scientificcms.contenttypes.sciproject.ui;
|
||||||
|
|
||||||
|
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("SciProjectFundingSponsoring")
|
||||||
|
public class SciProjectFundingSponsoringModel {
|
||||||
|
|
||||||
|
private boolean canEdit;
|
||||||
|
|
||||||
|
private List<SciProjectSponsoringModel> sponsoring;
|
||||||
|
|
||||||
|
public boolean getCanEdit() {
|
||||||
|
return canEdit;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void setCanEdit(final boolean canEdit) {
|
||||||
|
this.canEdit = canEdit;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<SciProjectSponsoringModel> getSponsoring() {
|
||||||
|
return Collections.unmodifiableList(sponsoring);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void setSponsoring(
|
||||||
|
final List<SciProjectSponsoringModel> sponsoring
|
||||||
|
) {
|
||||||
|
this.sponsoring = new ArrayList<>(sponsoring);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,661 @@
|
||||||
|
package org.scientificcms.contenttypes.sciproject.ui;
|
||||||
|
|
||||||
|
import org.libreccm.l10n.GlobalizationHelper;
|
||||||
|
import org.librecms.assets.Organization;
|
||||||
|
import org.librecms.contentsection.AssetRepository;
|
||||||
|
import org.librecms.contentsection.ContentItemRepository;
|
||||||
|
import org.librecms.ui.contentsections.ContentSectionNotFoundException;
|
||||||
|
import org.librecms.ui.contentsections.ItemPermissionChecker;
|
||||||
|
import org.librecms.ui.contentsections.documents.AbstractMvcAuthoringStep;
|
||||||
|
import org.librecms.ui.contentsections.documents.CmsEditorUtil;
|
||||||
|
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.contenttypes.sciproject.SciProject;
|
||||||
|
import org.scientificcms.contenttypes.sciproject.SciProjectMananger;
|
||||||
|
import org.scientificcms.contenttypes.sciproject.Sponsoring;
|
||||||
|
|
||||||
|
import java.util.Locale;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Optional;
|
||||||
|
import java.util.Set;
|
||||||
|
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 + "sciproject-funding")
|
||||||
|
@Controller
|
||||||
|
@MvcAuthoringStepDef(
|
||||||
|
bundle = SciProjectStepsConstants.BUNDLE,
|
||||||
|
descriptionKey = "authoringsteps.projectfunding.description",
|
||||||
|
labelKey = "authoringsteps.projectfunding.label",
|
||||||
|
supportedDocumentType = SciProject.class
|
||||||
|
)
|
||||||
|
public class SciProjectFundingStep extends AbstractMvcAuthoringStep {
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
private SciProjectMessageBundle sciProjectMessageBundle;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
private AssetRepository assetRepo;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
private ContentItemRepository itemRepo;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
private DocumentUi documentUi;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
private GlobalizationHelper globalizationHelper;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
private ItemPermissionChecker itemPermissionChecker;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
private Models models;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
private SciProjectMananger projectManager;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
private SciProjectFundingTextModel fundingTextModel;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
private SciProjectFundingVolumeModel fundingVolumeModel;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
private SciProjectFundingSponsoringModel sponsoringModel;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Class<SciProjectFundingStep> getStepClass() {
|
||||||
|
return SciProjectFundingStep.class;
|
||||||
|
}
|
||||||
|
|
||||||
|
@GET
|
||||||
|
@Path("/")
|
||||||
|
@Transactional(Transactional.TxType.REQUIRED)
|
||||||
|
public String showStep(
|
||||||
|
@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(getProject())) {
|
||||||
|
return "org/scientificcms/contenttypes/sciproject/ui/sciproject-funding.xhtml";
|
||||||
|
} else {
|
||||||
|
return documentUi.showAccessDenied(
|
||||||
|
getContentSection(),
|
||||||
|
getProject(),
|
||||||
|
sciProjectMessageBundle.getMessage("event.edit.denied")
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@GET
|
||||||
|
@Path("/funding-text/view/{locale}")
|
||||||
|
@Transactional(Transactional.TxType.REQUIRED)
|
||||||
|
public String viewFundingText(
|
||||||
|
@PathParam(MvcAuthoringSteps.SECTION_IDENTIFIER_PATH_PARAM)
|
||||||
|
final String sectionIdentifier,
|
||||||
|
@PathParam(MvcAuthoringSteps.DOCUMENT_PATH_PATH_PARAM_NAME)
|
||||||
|
final String documentPath,
|
||||||
|
@PathParam("locale") final String localeParam
|
||||||
|
) {
|
||||||
|
try {
|
||||||
|
init();
|
||||||
|
} catch (ContentSectionNotFoundException ex) {
|
||||||
|
return ex.showErrorMessage();
|
||||||
|
} catch (DocumentNotFoundException ex) {
|
||||||
|
return ex.showErrorMessage();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (itemPermissionChecker.canEditItem(getProject())) {
|
||||||
|
fundingTextModel.setSelectedLocale(
|
||||||
|
new Locale(localeParam).toString()
|
||||||
|
);
|
||||||
|
|
||||||
|
return "org/scientificcms/contenttypes/sciproject/ui/sciproject-fundingtext/view.xhtml";
|
||||||
|
} else {
|
||||||
|
return documentUi.showAccessDenied(
|
||||||
|
getContentSection(),
|
||||||
|
getProject(),
|
||||||
|
sciProjectMessageBundle.getMessage("event.edit.denied")
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@POST
|
||||||
|
@Path("/funding-text/add")
|
||||||
|
@Transactional(Transactional.TxType.REQUIRED)
|
||||||
|
public String addFundingTextValue(
|
||||||
|
@PathParam(MvcAuthoringSteps.SECTION_IDENTIFIER_PATH_PARAM)
|
||||||
|
final String sectionIdentifier,
|
||||||
|
@PathParam(MvcAuthoringSteps.DOCUMENT_PATH_PATH_PARAM_NAME)
|
||||||
|
final String documentPath,
|
||||||
|
@FormParam("locale") final String localeParam
|
||||||
|
) {
|
||||||
|
try {
|
||||||
|
init();
|
||||||
|
} catch (ContentSectionNotFoundException ex) {
|
||||||
|
return ex.showErrorMessage();
|
||||||
|
} catch (DocumentNotFoundException ex) {
|
||||||
|
return ex.showErrorMessage();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (itemPermissionChecker.canEditItem(getProject())) {
|
||||||
|
final String value;
|
||||||
|
if (getProject().getFunding().getAvailableLocales().isEmpty()) {
|
||||||
|
value = "";
|
||||||
|
} else {
|
||||||
|
value = globalizationHelper.getValueFromLocalizedString(
|
||||||
|
getProject().getFunding()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
final Locale locale = new Locale(localeParam);
|
||||||
|
getProject().getFunding().putValue(locale, value);
|
||||||
|
itemRepo.save(getProject());
|
||||||
|
|
||||||
|
return buildRedirectPathForStep();
|
||||||
|
} else {
|
||||||
|
return documentUi.showAccessDenied(
|
||||||
|
getContentSection(),
|
||||||
|
getProject(),
|
||||||
|
sciProjectMessageBundle.getMessage("event.edit.denied")
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@GET
|
||||||
|
@Path("/funding-text/edit")
|
||||||
|
@Transactional(Transactional.TxType.REQUIRED)
|
||||||
|
public String editFundingTextValue(
|
||||||
|
@PathParam(MvcAuthoringSteps.SECTION_IDENTIFIER_PATH_PARAM)
|
||||||
|
final String sectionIdentifier,
|
||||||
|
@PathParam(MvcAuthoringSteps.DOCUMENT_PATH_PATH_PARAM_NAME)
|
||||||
|
final String documentPath,
|
||||||
|
@PathParam("locale") final String localeParam
|
||||||
|
) {
|
||||||
|
try {
|
||||||
|
init();
|
||||||
|
} catch (ContentSectionNotFoundException ex) {
|
||||||
|
return ex.showErrorMessage();
|
||||||
|
} catch (DocumentNotFoundException ex) {
|
||||||
|
return ex.showErrorMessage();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (itemPermissionChecker.canEditItem(getProject())) {
|
||||||
|
fundingTextModel.setSelectedLocale(
|
||||||
|
new Locale(localeParam).toString()
|
||||||
|
);
|
||||||
|
|
||||||
|
return "org/scientificcms/contenttypes/sciproject/ui/sciproject-fundingtext/edit.xhtml";
|
||||||
|
} else {
|
||||||
|
return documentUi.showAccessDenied(
|
||||||
|
getContentSection(),
|
||||||
|
getProject(),
|
||||||
|
sciProjectMessageBundle.getMessage("event.edit.denied")
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@POST
|
||||||
|
@Path("/funding-text/edit/{locale}")
|
||||||
|
@Transactional(Transactional.TxType.REQUIRED)
|
||||||
|
public String editFundingTextValue(
|
||||||
|
@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
|
||||||
|
) {
|
||||||
|
try {
|
||||||
|
init();
|
||||||
|
} catch (ContentSectionNotFoundException ex) {
|
||||||
|
return ex.showErrorMessage();
|
||||||
|
} catch (DocumentNotFoundException ex) {
|
||||||
|
return ex.showErrorMessage();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (itemPermissionChecker.canEditItem(getProject())) {
|
||||||
|
final Locale locale = new Locale(localeParam);
|
||||||
|
getProject().getFunding().putValue(locale, value);
|
||||||
|
itemRepo.save(getProject());
|
||||||
|
|
||||||
|
return buildRedirectPathForStep();
|
||||||
|
} else {
|
||||||
|
return documentUi.showAccessDenied(
|
||||||
|
getContentSection(),
|
||||||
|
getProject(),
|
||||||
|
sciProjectMessageBundle.getMessage("event.edit.denied")
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@POST
|
||||||
|
@Path("/funding-text/remove/{locale}")
|
||||||
|
@Transactional(Transactional.TxType.REQUIRED)
|
||||||
|
public String removeFundingTextValue(
|
||||||
|
@PathParam(MvcAuthoringSteps.SECTION_IDENTIFIER_PATH_PARAM)
|
||||||
|
final String sectionIdentifier,
|
||||||
|
@PathParam(MvcAuthoringSteps.DOCUMENT_PATH_PATH_PARAM_NAME)
|
||||||
|
final String documentPath,
|
||||||
|
@PathParam("locale") final String localeParam
|
||||||
|
) {
|
||||||
|
try {
|
||||||
|
init();
|
||||||
|
} catch (ContentSectionNotFoundException ex) {
|
||||||
|
return ex.showErrorMessage();
|
||||||
|
} catch (DocumentNotFoundException ex) {
|
||||||
|
return ex.showErrorMessage();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (itemPermissionChecker.canEditItem(getProject())) {
|
||||||
|
final Locale locale = new Locale(localeParam);
|
||||||
|
getProject().getFunding().removeValue(locale);
|
||||||
|
itemRepo.save(getProject());
|
||||||
|
|
||||||
|
return buildRedirectPathForStep();
|
||||||
|
} else {
|
||||||
|
return documentUi.showAccessDenied(
|
||||||
|
getContentSection(),
|
||||||
|
getProject(),
|
||||||
|
sciProjectMessageBundle.getMessage("event.edit.denied")
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@GET
|
||||||
|
@Path("/funding-volume/view/{locale}")
|
||||||
|
@Transactional(Transactional.TxType.REQUIRED)
|
||||||
|
public String viewFundingVolume(
|
||||||
|
@PathParam(MvcAuthoringSteps.SECTION_IDENTIFIER_PATH_PARAM)
|
||||||
|
final String sectionIdentifier,
|
||||||
|
@PathParam(MvcAuthoringSteps.DOCUMENT_PATH_PATH_PARAM_NAME)
|
||||||
|
final String documentPath,
|
||||||
|
@PathParam("locale") final String localeParam
|
||||||
|
) {
|
||||||
|
try {
|
||||||
|
init();
|
||||||
|
} catch (ContentSectionNotFoundException ex) {
|
||||||
|
return ex.showErrorMessage();
|
||||||
|
} catch (DocumentNotFoundException ex) {
|
||||||
|
return ex.showErrorMessage();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (itemPermissionChecker.canEditItem(getProject())) {
|
||||||
|
fundingVolumeModel.setSelectedLocale(
|
||||||
|
new Locale(localeParam).toString()
|
||||||
|
);
|
||||||
|
|
||||||
|
return "org/scientificcms/contenttypes/sciproject/ui/sciproject-fundingvolume/view.xhtml";
|
||||||
|
} else {
|
||||||
|
return documentUi.showAccessDenied(
|
||||||
|
getContentSection(),
|
||||||
|
getProject(),
|
||||||
|
sciProjectMessageBundle.getMessage("event.edit.denied")
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@POST
|
||||||
|
@Path("/funding-volume/add")
|
||||||
|
@Transactional(Transactional.TxType.REQUIRED)
|
||||||
|
public String addFundingVolumeValue(
|
||||||
|
@PathParam(MvcAuthoringSteps.SECTION_IDENTIFIER_PATH_PARAM)
|
||||||
|
final String sectionIdentifier,
|
||||||
|
@PathParam(MvcAuthoringSteps.DOCUMENT_PATH_PATH_PARAM_NAME)
|
||||||
|
final String documentPath,
|
||||||
|
@FormParam("locale") final String localeParam
|
||||||
|
) {
|
||||||
|
try {
|
||||||
|
init();
|
||||||
|
} catch (ContentSectionNotFoundException ex) {
|
||||||
|
return ex.showErrorMessage();
|
||||||
|
} catch (DocumentNotFoundException ex) {
|
||||||
|
return ex.showErrorMessage();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (itemPermissionChecker.canEditItem(getProject())) {
|
||||||
|
final String value;
|
||||||
|
if (getProject().getFundingVolume().getAvailableLocales().isEmpty()) {
|
||||||
|
value = "";
|
||||||
|
} else {
|
||||||
|
value = globalizationHelper.getValueFromLocalizedString(
|
||||||
|
getProject().getFundingVolume()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
final Locale locale = new Locale(localeParam);
|
||||||
|
getProject().getFundingVolume().putValue(locale, value);
|
||||||
|
itemRepo.save(getProject());
|
||||||
|
|
||||||
|
return buildRedirectPathForStep();
|
||||||
|
} else {
|
||||||
|
return documentUi.showAccessDenied(
|
||||||
|
getContentSection(),
|
||||||
|
getProject(),
|
||||||
|
sciProjectMessageBundle.getMessage("event.edit.denied")
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@GET
|
||||||
|
@Path("/funding-volume/edit")
|
||||||
|
@Transactional(Transactional.TxType.REQUIRED)
|
||||||
|
public String editFundingVolumeValue(
|
||||||
|
@PathParam(MvcAuthoringSteps.SECTION_IDENTIFIER_PATH_PARAM)
|
||||||
|
final String sectionIdentifier,
|
||||||
|
@PathParam(MvcAuthoringSteps.DOCUMENT_PATH_PATH_PARAM_NAME)
|
||||||
|
final String documentPath,
|
||||||
|
@PathParam("locale") final String localeParam
|
||||||
|
) {
|
||||||
|
try {
|
||||||
|
init();
|
||||||
|
} catch (ContentSectionNotFoundException ex) {
|
||||||
|
return ex.showErrorMessage();
|
||||||
|
} catch (DocumentNotFoundException ex) {
|
||||||
|
return ex.showErrorMessage();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (itemPermissionChecker.canEditItem(getProject())) {
|
||||||
|
fundingVolumeModel.setSelectedLocale(
|
||||||
|
new Locale(localeParam).toString()
|
||||||
|
);
|
||||||
|
|
||||||
|
return "org/scientificcms/contenttypes/sciproject/ui/sciproject-fundingtext/edit.xhtml";
|
||||||
|
} else {
|
||||||
|
return documentUi.showAccessDenied(
|
||||||
|
getContentSection(),
|
||||||
|
getProject(),
|
||||||
|
sciProjectMessageBundle.getMessage("event.edit.denied")
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@POST
|
||||||
|
@Path("/funding-volume/edit/{locale}")
|
||||||
|
@Transactional(Transactional.TxType.REQUIRED)
|
||||||
|
public String editFundingVolumeValue(
|
||||||
|
@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
|
||||||
|
) {
|
||||||
|
try {
|
||||||
|
init();
|
||||||
|
} catch (ContentSectionNotFoundException ex) {
|
||||||
|
return ex.showErrorMessage();
|
||||||
|
} catch (DocumentNotFoundException ex) {
|
||||||
|
return ex.showErrorMessage();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (itemPermissionChecker.canEditItem(getProject())) {
|
||||||
|
final Locale locale = new Locale(localeParam);
|
||||||
|
getProject().getFundingVolume().putValue(locale, value);
|
||||||
|
itemRepo.save(getProject());
|
||||||
|
|
||||||
|
return buildRedirectPathForStep();
|
||||||
|
} else {
|
||||||
|
return documentUi.showAccessDenied(
|
||||||
|
getContentSection(),
|
||||||
|
getProject(),
|
||||||
|
sciProjectMessageBundle.getMessage("event.edit.denied")
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@POST
|
||||||
|
@Path("/funding-volume/remove/{locale}")
|
||||||
|
@Transactional(Transactional.TxType.REQUIRED)
|
||||||
|
public String removeFundingVolumeValue(
|
||||||
|
@PathParam(MvcAuthoringSteps.SECTION_IDENTIFIER_PATH_PARAM)
|
||||||
|
final String sectionIdentifier,
|
||||||
|
@PathParam(MvcAuthoringSteps.DOCUMENT_PATH_PATH_PARAM_NAME)
|
||||||
|
final String documentPath,
|
||||||
|
@PathParam("locale") final String localeParam
|
||||||
|
) {
|
||||||
|
try {
|
||||||
|
init();
|
||||||
|
} catch (ContentSectionNotFoundException ex) {
|
||||||
|
return ex.showErrorMessage();
|
||||||
|
} catch (DocumentNotFoundException ex) {
|
||||||
|
return ex.showErrorMessage();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (itemPermissionChecker.canEditItem(getProject())) {
|
||||||
|
final Locale locale = new Locale(localeParam);
|
||||||
|
getProject().getFundingVolume().removeValue(locale);
|
||||||
|
itemRepo.save(getProject());
|
||||||
|
|
||||||
|
return buildRedirectPathForStep();
|
||||||
|
} else {
|
||||||
|
return documentUi.showAccessDenied(
|
||||||
|
getContentSection(),
|
||||||
|
getProject(),
|
||||||
|
sciProjectMessageBundle.getMessage("event.edit.denied")
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@POST
|
||||||
|
@Path("/sponsoring/add")
|
||||||
|
@Transactional(Transactional.TxType.REQUIRED)
|
||||||
|
public String addSponsoring(
|
||||||
|
@PathParam(MvcAuthoringSteps.SECTION_IDENTIFIER_PATH_PARAM)
|
||||||
|
final String sectionIdentifier,
|
||||||
|
@PathParam(MvcAuthoringSteps.DOCUMENT_PATH_PATH_PARAM_NAME)
|
||||||
|
final String documentPath,
|
||||||
|
@FormParam("sponsorUuid")
|
||||||
|
final String sponsorUuid,
|
||||||
|
@FormParam("fundingCode")
|
||||||
|
final String fundingCode
|
||||||
|
) {
|
||||||
|
try {
|
||||||
|
init();
|
||||||
|
} catch (ContentSectionNotFoundException ex) {
|
||||||
|
return ex.showErrorMessage();
|
||||||
|
} catch (DocumentNotFoundException ex) {
|
||||||
|
return ex.showErrorMessage();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (itemPermissionChecker.canEditItem(getProject())) {
|
||||||
|
final Optional<Organization> result = assetRepo
|
||||||
|
.findByUuidAndType(sponsorUuid, Organization.class);
|
||||||
|
|
||||||
|
if (!result.isPresent()) {
|
||||||
|
models.put("sponsorNotFound", sponsorUuid);
|
||||||
|
return showStep(sectionIdentifier, documentPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
final Organization sponsor = result.get();
|
||||||
|
projectManager.addSponsor(sponsor, getProject(), fundingCode);
|
||||||
|
|
||||||
|
return buildRedirectPathForStep();
|
||||||
|
} else {
|
||||||
|
return documentUi.showAccessDenied(
|
||||||
|
getContentSection(),
|
||||||
|
getProject(),
|
||||||
|
sciProjectMessageBundle.getMessage("event.edit.denied")
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@POST
|
||||||
|
@Path("/sponsoring/remove")
|
||||||
|
@Transactional(Transactional.TxType.REQUIRED)
|
||||||
|
public String removeSponsor(
|
||||||
|
@PathParam(MvcAuthoringSteps.SECTION_IDENTIFIER_PATH_PARAM)
|
||||||
|
final String sectionIdentifier,
|
||||||
|
@PathParam(MvcAuthoringSteps.DOCUMENT_PATH_PATH_PARAM_NAME)
|
||||||
|
final String documentPath,
|
||||||
|
@FormParam("sponsoringId")
|
||||||
|
final String sponsoringId
|
||||||
|
) {
|
||||||
|
try {
|
||||||
|
init();
|
||||||
|
} catch (ContentSectionNotFoundException ex) {
|
||||||
|
return ex.showErrorMessage();
|
||||||
|
} catch (DocumentNotFoundException ex) {
|
||||||
|
return ex.showErrorMessage();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (itemPermissionChecker.canEditItem(getProject())) {
|
||||||
|
final Optional<Sponsoring> result = getProject()
|
||||||
|
.getSponsoring()
|
||||||
|
.stream()
|
||||||
|
.filter(
|
||||||
|
sponsoring -> Long
|
||||||
|
.toString(sponsoring.getSponsoringId())
|
||||||
|
.equals(sponsoringId)
|
||||||
|
)
|
||||||
|
.findFirst();
|
||||||
|
|
||||||
|
if (result.isPresent()) {
|
||||||
|
projectManager.removeSponsor(
|
||||||
|
result.get().getSponsor(),
|
||||||
|
getProject()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return buildRedirectPathForStep();
|
||||||
|
} else {
|
||||||
|
return documentUi.showAccessDenied(
|
||||||
|
getContentSection(),
|
||||||
|
getProject(),
|
||||||
|
sciProjectMessageBundle.getMessage("event.edit.denied")
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void init() throws ContentSectionNotFoundException,
|
||||||
|
DocumentNotFoundException {
|
||||||
|
super.init();
|
||||||
|
|
||||||
|
final boolean canEdit = itemPermissionChecker.canEditItem(getProject());
|
||||||
|
if (canEdit) {
|
||||||
|
fundingTextModel.setCanEdit(canEdit);
|
||||||
|
fundingTextModel.setFundingTextValues(
|
||||||
|
getProject()
|
||||||
|
.getFunding()
|
||||||
|
.getValues()
|
||||||
|
.entrySet()
|
||||||
|
.stream()
|
||||||
|
.collect(
|
||||||
|
Collectors.toMap(
|
||||||
|
entry -> entry.getKey().toString(),
|
||||||
|
Map.Entry::getValue
|
||||||
|
)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
fundingTextModel.setVariants(
|
||||||
|
getProject()
|
||||||
|
.getFunding()
|
||||||
|
.getValues()
|
||||||
|
.entrySet()
|
||||||
|
.stream()
|
||||||
|
.map(CmsEditorUtil::buildVariantRow)
|
||||||
|
.collect(Collectors.toList())
|
||||||
|
);
|
||||||
|
final Set<Locale> fundingTextLocales = getProject()
|
||||||
|
.getFunding()
|
||||||
|
.getAvailableLocales();
|
||||||
|
fundingTextModel.setUnusedLocales(
|
||||||
|
globalizationHelper
|
||||||
|
.getAvailableLocales()
|
||||||
|
.stream()
|
||||||
|
.filter(locale -> !fundingTextLocales.contains(locale))
|
||||||
|
.map(Locale::toString)
|
||||||
|
.collect(Collectors.toList())
|
||||||
|
);
|
||||||
|
|
||||||
|
fundingVolumeModel.setCanEdit(canEdit);
|
||||||
|
fundingVolumeModel.setFundingVolumeValues(
|
||||||
|
getProject()
|
||||||
|
.getFundingVolume()
|
||||||
|
.getValues()
|
||||||
|
.entrySet()
|
||||||
|
.stream()
|
||||||
|
.collect(
|
||||||
|
Collectors.toMap(
|
||||||
|
entry -> entry.getKey().toString(),
|
||||||
|
Map.Entry::getValue
|
||||||
|
)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
fundingVolumeModel.setVariants(
|
||||||
|
getProject()
|
||||||
|
.getFundingVolume()
|
||||||
|
.getValues()
|
||||||
|
.entrySet()
|
||||||
|
.stream()
|
||||||
|
.map(CmsEditorUtil::buildVariantRow)
|
||||||
|
.collect(Collectors.toList())
|
||||||
|
);
|
||||||
|
final Set<Locale> fundingVolumeLocales = getProject()
|
||||||
|
.getProjectDescription()
|
||||||
|
.getAvailableLocales();
|
||||||
|
fundingVolumeModel.setUnusedLocales(
|
||||||
|
globalizationHelper
|
||||||
|
.getAvailableLocales()
|
||||||
|
.stream()
|
||||||
|
.filter(locale -> !fundingVolumeLocales.contains(locale))
|
||||||
|
.map(Locale::toString)
|
||||||
|
.collect(Collectors.toList())
|
||||||
|
);
|
||||||
|
|
||||||
|
sponsoringModel.setCanEdit(canEdit);
|
||||||
|
sponsoringModel.setSponsoring(
|
||||||
|
getProject()
|
||||||
|
.getSponsoring()
|
||||||
|
.stream()
|
||||||
|
.map(this::buildSponsoringModel)
|
||||||
|
.collect(Collectors.toList())
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private SciProject getProject() {
|
||||||
|
return (SciProject) getDocument();
|
||||||
|
}
|
||||||
|
|
||||||
|
private SciProjectSponsoringModel buildSponsoringModel(
|
||||||
|
final Sponsoring sponsoring
|
||||||
|
) {
|
||||||
|
final SciProjectSponsoringModel model = new SciProjectSponsoringModel();
|
||||||
|
model.setFundingCode(sponsoring.getFundingCode());
|
||||||
|
model.setOrder(sponsoring.getOrder());
|
||||||
|
model.setSponsor(sponsoring.getSponsor().getTitle().getValue(
|
||||||
|
globalizationHelper.getNegotiatedLocale()
|
||||||
|
));
|
||||||
|
model.setSponsoringId(sponsoring.getSponsoringId());
|
||||||
|
|
||||||
|
return model;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,127 @@
|
||||||
|
package org.scientificcms.contenttypes.sciproject.ui;
|
||||||
|
|
||||||
|
import org.librecms.contentsection.ContentItem;
|
||||||
|
import org.librecms.contentsection.ContentItemRepository;
|
||||||
|
import org.librecms.contentsection.ContentSection;
|
||||||
|
import org.librecms.ui.contentsections.ContentSectionsUi;
|
||||||
|
import org.librecms.ui.contentsections.documents.MvcAuthoringSteps;
|
||||||
|
import org.scientificcms.contenttypes.sciproject.SciProject;
|
||||||
|
import org.scientificcms.contenttypes.sciproject.Sponsoring;
|
||||||
|
import org.scientificcms.contenttypes.sciproject.SponsoringRepository;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import javax.enterprise.context.RequestScoped;
|
||||||
|
import javax.inject.Inject;
|
||||||
|
import javax.transaction.Transactional;
|
||||||
|
import javax.ws.rs.BadRequestException;
|
||||||
|
import javax.ws.rs.NotFoundException;
|
||||||
|
import javax.ws.rs.POST;
|
||||||
|
import javax.ws.rs.Path;
|
||||||
|
import javax.ws.rs.PathParam;
|
||||||
|
import javax.ws.rs.core.Response;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||||
|
*/
|
||||||
|
@RequestScoped
|
||||||
|
@Path(MvcAuthoringSteps.PATH_PREFIX + "sciproject-funding-service")
|
||||||
|
public class SciProjectFundingStepService {
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
private SponsoringRepository sponsoringRepo;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
private ContentItemRepository itemRepo;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
private ContentSectionsUi sectionsUi;
|
||||||
|
|
||||||
|
@POST
|
||||||
|
@Path("/sponsoring/save-order")
|
||||||
|
@Transactional(Transactional.TxType.REQUIRED)
|
||||||
|
public Response saveSponsoringOrder(
|
||||||
|
@PathParam(MvcAuthoringSteps.SECTION_IDENTIFIER_PATH_PARAM)
|
||||||
|
final String sectionIdentifier,
|
||||||
|
@PathParam(MvcAuthoringSteps.DOCUMENT_PATH_PATH_PARAM_NAME)
|
||||||
|
final String documentPath,
|
||||||
|
final List<String> sponsoringOrder
|
||||||
|
) {
|
||||||
|
final ContentSection contentSection = sectionsUi
|
||||||
|
.findContentSection(sectionIdentifier)
|
||||||
|
.orElseThrow(
|
||||||
|
() -> new NotFoundException(
|
||||||
|
String.format(
|
||||||
|
"No content identifed by %s found.",
|
||||||
|
sectionIdentifier
|
||||||
|
)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
final ContentItem document = itemRepo
|
||||||
|
.findByPath(contentSection, documentPath)
|
||||||
|
.orElseThrow(
|
||||||
|
() -> new NotFoundException(
|
||||||
|
String.format(
|
||||||
|
"No document for path %s in section %s.",
|
||||||
|
documentPath,
|
||||||
|
contentSection.getLabel()
|
||||||
|
)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
if ((document instanceof SciProject)) {
|
||||||
|
throw new BadRequestException(
|
||||||
|
String.format(
|
||||||
|
"Document %s is not a %s.",
|
||||||
|
documentPath,
|
||||||
|
SciProject.class.getSimpleName()
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
final SciProject project = (SciProject) document;
|
||||||
|
|
||||||
|
final List<Sponsoring> sponsorings = project.getSponsoring();
|
||||||
|
|
||||||
|
if (sponsoringOrder.size() != sponsorings.size()) {
|
||||||
|
throw new BadRequestException(
|
||||||
|
String.format(
|
||||||
|
"Number of sponsorings of the SciProject %s does "
|
||||||
|
+ "not match the number of values in the order "
|
||||||
|
+ "list. Number of sponsoringas: %d, number of values in "
|
||||||
|
+ "the sponsorings order list: %d",
|
||||||
|
documentPath,
|
||||||
|
sponsorings.size(),
|
||||||
|
sponsoringOrder.size()
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < sponsoringOrder.size(); i++) {
|
||||||
|
final String sponsoringIdParam = sponsoringOrder.get(i);
|
||||||
|
final long sponsoringId = Long.parseLong(sponsoringIdParam);
|
||||||
|
final Sponsoring sponsoring = sponsorings
|
||||||
|
.stream()
|
||||||
|
.filter(sponsor -> sponsor.getSponsoringId() == sponsoringId)
|
||||||
|
.findAny()
|
||||||
|
.orElseThrow(
|
||||||
|
() -> new BadRequestException(
|
||||||
|
String.format(
|
||||||
|
"sponsoringsOrder has an entry for sponsoring with "
|
||||||
|
+ "ID %d, but there is not sponsoring with that "
|
||||||
|
+ "ID.",
|
||||||
|
sponsoringId
|
||||||
|
)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
sponsoring.setOrder(i);
|
||||||
|
sponsoringRepo.save(sponsoring);
|
||||||
|
}
|
||||||
|
|
||||||
|
return Response.ok().build();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -37,7 +37,7 @@ public class SciProjectFundingTextModel {
|
||||||
.orElse(Collections.emptyMap());
|
.orElse(Collections.emptyMap());
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void setFundingValues(
|
protected void setFundingTextValues(
|
||||||
final Map<String, String> fundingValues
|
final Map<String, String> fundingValues
|
||||||
) {
|
) {
|
||||||
this.fundingValues = Optional
|
this.fundingValues = Optional
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,51 @@
|
||||||
|
package org.scientificcms.contenttypes.sciproject.ui;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* DTO providing the information about a {@link Sponsoring} of a
|
||||||
|
* {@link SciProject} in an form that easy usable from a MVC template.
|
||||||
|
*
|
||||||
|
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||||
|
*/
|
||||||
|
public class SciProjectSponsoringModel {
|
||||||
|
|
||||||
|
private long sponsoringId;
|
||||||
|
|
||||||
|
private String fundingCode;
|
||||||
|
|
||||||
|
private long order;
|
||||||
|
|
||||||
|
private String sponsor;
|
||||||
|
|
||||||
|
public long getSponsoringId() {
|
||||||
|
return sponsoringId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSponsoringId(final long sponsoringId) {
|
||||||
|
this.sponsoringId = sponsoringId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getFundingCode() {
|
||||||
|
return fundingCode;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setFundingCode(final String fundingCode) {
|
||||||
|
this.fundingCode = fundingCode;
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getOrder() {
|
||||||
|
return order;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setOrder(final long order) {
|
||||||
|
this.order = order;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getSponsor() {
|
||||||
|
return sponsor;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSponsor(final String sponsor) {
|
||||||
|
this.sponsor = sponsor;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue