Type of item.
+ * @param Type of publication
+ */
+@Dependent
+public abstract class AbstractPublicationItemCreateStep, P extends Publication>
+ extends AbstractMvcDocumentCreateStep {
+
+ private static final String FORM_PARAM_NAME = "name";
+
+ private static final String FORM_PARAM_TITLE = "title";
+
+ private static final String FORM_PARAM_SHORT_DESCRIPTION
+ = "shortDescription";
+
+ private static final String FORM_PARAM_INITIAL_LOCALE = "locale";
+
+ private static final String FORM_PARAM_SELECTED_WORKFLOW = "workflow";
+
+ @Inject
+ private GlobalizationHelper globalizationHelper;
+
+ @Inject
+ private ContentItemManager itemManager;
+
+ @Inject
+ private ContentItemRepository itemRepo;
+
+ @Inject
+ private PublicationRepository publicationRepo;
+
+ /**
+ * The name of the publication item.
+ */
+ private String name;
+
+ /**
+ * The title of the publication.
+ */
+ private String title;
+
+ /**
+ * Short description of the publication.
+ */
+ private String shortDescription;
+
+ /**
+ * The initial local of the monograph item.
+ */
+ private String initialLocale;
+
+ /**
+ * The workflow to use for the new monograph item.
+ */
+ private String selectedWorkflow;
+
+ @Override
+ public String getBundle() {
+ return SciPublicationsUiConstants.BUNDLE;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public String getTitle() {
+ return title;
+ }
+
+ public String getShortDescription() {
+ return shortDescription;
+ }
+
+ public String getInitialLocale() {
+ return initialLocale;
+ }
+
+ @Transactional(Transactional.TxType.REQUIRED)
+ public String getSelectedWorkflow() {
+ if (selectedWorkflow == null || selectedWorkflow.isEmpty()) {
+ return getContentSection()
+ .getContentTypes()
+ .stream()
+ .filter(
+ type -> type.getContentItemClass().equals(
+ Event.class.getName()
+ )
+ )
+ .findAny()
+ .map(type -> type.getDefaultWorkflow())
+ .map(
+ workflow -> globalizationHelper.getValueFromLocalizedString(
+ workflow.getName()
+ )
+ )
+ .orElse("");
+ } else {
+ return selectedWorkflow;
+ }
+ }
+
+ /**
+ * The subclass of the {@link PublicationItem} to use.
+ *
+ * @return The subclass of the {@link PublicationItem} to use.
+ */
+ protected abstract Class getPublicationItemClass();
+
+ /**
+ * Creates the publication entity to use.
+ *
+ * @return The publication entity to use.
+ */
+ protected abstract P createPublication();
+
+ /**
+ * The name of the edit step to show after the publication item was created
+ * successfully, without the leading @.
+ *
+ * @return The name of the edit step to show after the item was created
+ * successfully.
+ */
+ protected abstract String getEditStepName();
+
+ @AuthorizationRequired
+ @Transactional(Transactional.TxType.REQUIRED)
+ @Override
+ public String createItem(final Map formParams) {
+ if (!formParams.containsKey(FORM_PARAM_NAME)
+ || formParams.get(FORM_PARAM_NAME) == null
+ || formParams.get(FORM_PARAM_NAME).length == 0) {
+ addMessage(
+ "danger",
+ globalizationHelper
+ .getLocalizedTextsUtil(getBundle())
+ .getText("createstep.name.error.missing")
+ );
+ return showCreateStep();
+ }
+
+ name = formParams.get(FORM_PARAM_NAME)[0];
+ if (!name.matches("^([a-zA-Z0-9_-]*)$")) {
+ addMessage(
+ "danger",
+ globalizationHelper
+ .getLocalizedTextsUtil(getBundle())
+ .getText("createstep.name.error.invalid")
+ );
+ return showCreateStep();
+ }
+
+ if (!formParams.containsKey(FORM_PARAM_TITLE)
+ || formParams.get(FORM_PARAM_TITLE) == null
+ || formParams.get(FORM_PARAM_TITLE).length == 0) {
+ addMessage(
+ "danger",
+ globalizationHelper
+ .getLocalizedTextsUtil(getBundle())
+ .getText("createstep.title.error.missing")
+ );
+ return showCreateStep();
+ }
+ title = formParams.get(FORM_PARAM_TITLE)[0];
+
+ if (formParams.containsKey(FORM_PARAM_SHORT_DESCRIPTION)
+ && formParams.get(FORM_PARAM_SHORT_DESCRIPTION) != null
+ && formParams.get(FORM_PARAM_SHORT_DESCRIPTION).length > 0) {
+ shortDescription = formParams.get(FORM_PARAM_SHORT_DESCRIPTION)[0];
+ }
+
+ if (!formParams.containsKey(FORM_PARAM_INITIAL_LOCALE)
+ || formParams.get(FORM_PARAM_INITIAL_LOCALE) == null
+ || formParams.get(FORM_PARAM_INITIAL_LOCALE).length == 0) {
+ addMessage(
+ "danger",
+ globalizationHelper.getLocalizedTextsUtil(
+ getBundle()
+ ).getText("createstep.initial_locale.error.missing")
+ );
+ return showCreateStep();
+ }
+ final Locale locale = new Locale(
+ formParams.get(FORM_PARAM_INITIAL_LOCALE)[0]
+ );
+
+ if (!formParams.containsKey(FORM_PARAM_SELECTED_WORKFLOW)
+ || formParams.get(FORM_PARAM_SELECTED_WORKFLOW) == null
+ || formParams.get(FORM_PARAM_SELECTED_WORKFLOW).length == 0) {
+ addMessage(
+ "danger",
+ globalizationHelper.getLocalizedTextsUtil(
+ getBundle()
+ ).getText("createstep.workflow.none_selected")
+ );
+ return showCreateStep();
+ }
+ selectedWorkflow = formParams.get(FORM_PARAM_SELECTED_WORKFLOW)[0];
+
+ final Optional workflowResult = getContentSection()
+ .getWorkflowTemplates()
+ .stream()
+ .filter(template -> template.getUuid().equals(selectedWorkflow))
+ .findAny();
+
+ if (!workflowResult.isPresent()) {
+ addMessage(
+ "danger",
+ globalizationHelper.getLocalizedTextsUtil(
+ getBundle()
+ ).getText("createstep.workflow.error.not_available")
+ );
+ return showCreateStep();
+ }
+
+ if (!getMessages().isEmpty()) {
+ return showCreateStep();
+ }
+
+ final T item = itemManager.createContentItem(
+ name,
+ getContentSection(),
+ getFolder(),
+ workflowResult.get(),
+ getPublicationItemClass(),
+ locale
+ );
+
+ final P publication = createPublication();
+
+ publication.getTitle().putValue(locale, title);
+ if (shortDescription != null) {
+ publication
+ .getShortDescription()
+ .putValue(locale, shortDescription);
+ }
+
+ publicationRepo.save(publication);
+
+ item.getTitle().putValue(locale, title);
+ item.getDescription().putValue(locale, shortDescription);
+ item.setPublication(publication);
+
+ itemRepo.save(item);
+
+ return String.format(
+ "redirect:/%s/documents/%s/%s/@%s",
+ getContentSectionLabel(),
+ getFolderPath(),
+ name,
+ getEditStepName()
+ );
+ }
+
+}
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
new file mode 100644
index 0000000..2f76f74
--- /dev/null
+++ b/sci-publications/src/main/java/org/scientificcms/publications/ui/contenttypes/AbstractPublicationPropertiesStep.java
@@ -0,0 +1,16 @@
+package org.scientificcms.publications.ui.contenttypes;
+
+import org.librecms.ui.contentsections.documents.AbstractMvcAuthoringStep;
+import org.scientificcms.publications.Publication;
+import org.scientificcms.publications.contenttypes.PublicationItem;
+
+/**
+ *
+ * @author Jens Pelzetter
+ * @param Subtype of {@link PublicationAsset}.
+ * @param Subtype of {@link Publication}
+ */
+public abstract class AbstractPublicationPropertiesStep, P extends Publication>
+ extends AbstractMvcAuthoringStep {
+
+}
diff --git a/sci-publications/src/main/java/org/scientificcms/publications/ui/contenttypes/AbstractPublicationWithPublisherItemCreateStep.java b/sci-publications/src/main/java/org/scientificcms/publications/ui/contenttypes/AbstractPublicationWithPublisherItemCreateStep.java
new file mode 100644
index 0000000..90ec239
--- /dev/null
+++ b/sci-publications/src/main/java/org/scientificcms/publications/ui/contenttypes/AbstractPublicationWithPublisherItemCreateStep.java
@@ -0,0 +1,17 @@
+package org.scientificcms.publications.ui.contenttypes;
+
+import org.scientificcms.publications.PublicationWithPublisher;
+import org.scientificcms.publications.contenttypes.PublicationWithPublisherItem;
+
+/**
+ *
+ * @author Jens Pelzetter
+ * @param Subclass of {@link PublicationWithPublisherItem}
+ * @param Subclass of {@link PublicationWithPublisher}
+ */
+public abstract class AbstractPublicationWithPublisherItemCreateStep, P extends PublicationWithPublisher>
+extends AbstractPublicationItemCreateStep {
+
+
+
+}
diff --git a/sci-publications/src/main/java/org/scientificcms/publications/ui/contenttypes/AbstractPublicationWithPublisherPropertiesStep.java b/sci-publications/src/main/java/org/scientificcms/publications/ui/contenttypes/AbstractPublicationWithPublisherPropertiesStep.java
new file mode 100644
index 0000000..998f70c
--- /dev/null
+++ b/sci-publications/src/main/java/org/scientificcms/publications/ui/contenttypes/AbstractPublicationWithPublisherPropertiesStep.java
@@ -0,0 +1,16 @@
+package org.scientificcms.publications.ui.contenttypes;
+
+import org.librecms.ui.contentsections.documents.AbstractMvcAuthoringStep;
+import org.scientificcms.publications.Publication;
+import org.scientificcms.publications.contenttypes.PublicationItem;
+
+/**
+ *
+ * @author Jens Pelzetter
+ * @param Subtype of {@link PublicationWithPublisherItem}
+ * @param Subtype of {@link PublicationWithPublisher}.
+ */
+public abstract class AbstractPublicationWithPublisherPropertiesStep, P extends Publication>
+ extends AbstractMvcAuthoringStep {
+
+}
diff --git a/sci-publications/src/main/java/org/scientificcms/publications/ui/contenttypes/EditionStepModel.java b/sci-publications/src/main/java/org/scientificcms/publications/ui/contenttypes/EditionStepModel.java
new file mode 100644
index 0000000..bab3034
--- /dev/null
+++ b/sci-publications/src/main/java/org/scientificcms/publications/ui/contenttypes/EditionStepModel.java
@@ -0,0 +1,72 @@
+package org.scientificcms.publications.ui.contenttypes;
+
+import org.librecms.ui.contentsections.documents.CmsEditorLocaleVariantRow;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.enterprise.context.RequestScoped;
+import javax.inject.Named;
+
+/**
+ *
+ * @author Jens Pelzetter
+ */
+@RequestScoped
+@Named("SciCmsEditionStepModel")
+public class EditionStepModel {
+
+ private boolean canEdit;
+
+ private Map editionValues;
+
+ private List variants;
+
+ private List unusedLocales;
+
+ private String selectedLocale;
+
+ public Map getEditionValues() {
+ return Collections.unmodifiableMap(editionValues);
+ }
+
+ protected void setEditionValues(final Map editionValues) {
+ this.editionValues = new HashMap<>(editionValues);
+ }
+
+ public List getVariants() {
+ return Collections.unmodifiableList(variants);
+ }
+
+ protected void setVariants(final List variants) {
+ this.variants = new ArrayList<>(variants);
+ }
+
+ public List getUnusedLocales() {
+ return Collections.unmodifiableList(unusedLocales);
+ }
+
+ protected void setUnusedLocales(final List unusedLocales) {
+ this.unusedLocales = new ArrayList<>(unusedLocales);
+ }
+
+ public String getSelectedLocale() {
+ return selectedLocale;
+ }
+
+ protected void setSelectedLocale(final String selectedLocale) {
+ this.selectedLocale = selectedLocale;
+ }
+
+ public boolean getCanEdit() {
+ return canEdit;
+ }
+
+ protected void setCanEdit(final boolean canEdit) {
+ this.canEdit = canEdit;
+ }
+
+}
diff --git a/sci-publications/src/main/java/org/scientificcms/publications/ui/contenttypes/MonographItemCreateStep.java b/sci-publications/src/main/java/org/scientificcms/publications/ui/contenttypes/MonographItemCreateStep.java
new file mode 100644
index 0000000..2ed9568
--- /dev/null
+++ b/sci-publications/src/main/java/org/scientificcms/publications/ui/contenttypes/MonographItemCreateStep.java
@@ -0,0 +1,51 @@
+package org.scientificcms.publications.ui.contenttypes;
+
+import org.libreccm.l10n.GlobalizationHelper;
+import org.scientificcms.publications.Monograph;
+import org.scientificcms.publications.contenttypes.MonographItem;
+
+import javax.inject.Inject;
+
+/**
+ *
+ * @author Jens Pelzetter
+ */
+public class MonographItemCreateStep extends AbstractPublicationItemCreateStep {
+
+ @Inject
+ private GlobalizationHelper globalizationHelper;
+
+ @Override
+ public String getDocumentType() {
+ return MonographItem.class.getName();
+ }
+
+ @Override
+ public String getDescription() {
+ return globalizationHelper
+ .getLocalizedTextsUtil(getBundle())
+ .getText("monographitem.createstep.description");
+ }
+
+ @Override
+ public String showCreateStep() {
+ return "org/scientificccms/contenttypes/ui/monograph/create-monograph.xhtml";
+ }
+
+ @Override
+ public Class getPublicationItemClass() {
+ return MonographItem.class;
+ }
+
+ @Override
+ public Monograph createPublication() {
+ return new Monograph();
+ }
+
+ @Override
+ protected String getEditStepName() {
+ return "monograph-basicproperties";
+ }
+
+
+}
diff --git a/sci-publications/src/main/java/org/scientificcms/publications/ui/contenttypes/MonographPropertiesStep.java b/sci-publications/src/main/java/org/scientificcms/publications/ui/contenttypes/MonographPropertiesStep.java
new file mode 100644
index 0000000..f2b981d
--- /dev/null
+++ b/sci-publications/src/main/java/org/scientificcms/publications/ui/contenttypes/MonographPropertiesStep.java
@@ -0,0 +1,37 @@
+package org.scientificcms.publications.ui.contenttypes;
+
+import org.librecms.contenttypes.Event;
+import org.librecms.ui.contentsections.documents.MvcAuthoringStepDef;
+import org.librecms.ui.contentsections.documents.MvcAuthoringSteps;
+import org.librecms.ui.contenttypes.event.EventStepsConstants;
+import org.scientificcms.publications.Monograph;
+import org.scientificcms.publications.contenttypes.MonographItem;
+
+import javax.enterprise.context.RequestScoped;
+import javax.mvc.Controller;
+import javax.ws.rs.Path;
+
+/**
+ *
+ * @author Jens Pelzetter
+ */
+@RequestScoped
+@Path(MvcAuthoringSteps.PATH_PREFIX + "monograph-basicproperties")
+@Controller
+@MvcAuthoringStepDef(
+ bundle = EventStepsConstants.BUNDLE,
+ descriptionKey = "monograph.authoringsteps.basicproperties.description",
+ labelKey = "monograph.authoringsteps.basicproperties.label",
+ supportedDocumentType = MonographItem.class
+)
+
+public class MonographPropertiesStep extends AbstractPublicationWithPublisherPropertiesStep{
+
+ @Override
+ public Class getStepClass() {
+ return MonographPropertiesStep.class;
+ }
+
+
+
+}
diff --git a/sci-publications/src/main/java/org/scientificcms/publications/ui/contenttypes/MonographPropertiesStepModel.java b/sci-publications/src/main/java/org/scientificcms/publications/ui/contenttypes/MonographPropertiesStepModel.java
new file mode 100644
index 0000000..a75805f
--- /dev/null
+++ b/sci-publications/src/main/java/org/scientificcms/publications/ui/contenttypes/MonographPropertiesStepModel.java
@@ -0,0 +1,24 @@
+package org.scientificcms.publications.ui.contenttypes;
+
+import javax.enterprise.context.RequestScoped;
+import javax.inject.Named;
+
+/**
+ *
+ * @author Jens Pelzetter
+ */
+@RequestScoped
+@Named("SciCmsMonographPropertiesStepModel")
+public class MonographPropertiesStepModel {
+
+ private boolean reviewed;
+
+ public boolean isReviewed() {
+ return reviewed;
+ }
+
+ public void setReviewed(final boolean reviewed) {
+ this.reviewed = reviewed;
+ }
+
+}
diff --git a/sci-publications/src/main/java/org/scientificcms/publications/ui/contenttypes/PublicationAbstractStepModel.java b/sci-publications/src/main/java/org/scientificcms/publications/ui/contenttypes/PublicationAbstractStepModel.java
new file mode 100644
index 0000000..a8d7618
--- /dev/null
+++ b/sci-publications/src/main/java/org/scientificcms/publications/ui/contenttypes/PublicationAbstractStepModel.java
@@ -0,0 +1,72 @@
+package org.scientificcms.publications.ui.contenttypes;
+
+import org.librecms.ui.contentsections.documents.CmsEditorLocaleVariantRow;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.enterprise.context.RequestScoped;
+import javax.inject.Named;
+
+/**
+ *
+ * @author Jens Pelzetter
+ */
+@RequestScoped
+@Named("SciCmsPublicationAbstractStepModel")
+public class PublicationAbstractStepModel {
+
+ private boolean canEdit;
+
+ private Map abstractValues;
+
+ private List variants;
+
+ private List unusedLocales;
+
+ private String selectedLocale;
+
+ public Map getAbstractValues() {
+ return Collections.unmodifiableMap(abstractValues);
+ }
+
+ protected void setAbstractValues(final Map abstractValues) {
+ this.abstractValues = new HashMap<>(abstractValues);
+ }
+
+ public List getVariants() {
+ return Collections.unmodifiableList(variants);
+ }
+
+ protected void setVariants(final List variants) {
+ this.variants = new ArrayList<>(variants);
+ }
+
+ public List getUnusedLocales() {
+ return Collections.unmodifiableList(unusedLocales);
+ }
+
+ protected void setUnusedLocales(final List unusedLocales) {
+ this.unusedLocales = new ArrayList<>(unusedLocales);
+ }
+
+ public String getSelectedLocales() {
+ return selectedLocale;
+ }
+
+ protected void setSelectedLocale(final String selectedLocale) {
+ this.selectedLocale = selectedLocale;
+ }
+
+ public boolean getCanEdit() {
+ return canEdit;
+ }
+
+ protected void setCanEdit(final boolean canEdit) {
+ this.canEdit = canEdit;
+ }
+
+}
diff --git a/sci-publications/src/main/java/org/scientificcms/publications/ui/contenttypes/PublicationAbstractStepResources.java b/sci-publications/src/main/java/org/scientificcms/publications/ui/contenttypes/PublicationAbstractStepResources.java
new file mode 100644
index 0000000..d333cc8
--- /dev/null
+++ b/sci-publications/src/main/java/org/scientificcms/publications/ui/contenttypes/PublicationAbstractStepResources.java
@@ -0,0 +1,132 @@
+package org.scientificcms.publications.ui.contenttypes;
+
+import org.jsoup.Jsoup;
+import org.jsoup.nodes.Document;
+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.ItemPermissionChecker;
+import org.librecms.ui.contentsections.documents.MvcAuthoringSteps;
+import org.scientificcms.publications.Publication;
+import org.scientificcms.publications.contenttypes.PublicationItem;
+
+import java.util.Locale;
+import java.util.StringTokenizer;
+
+import javax.enterprise.context.RequestScoped;
+import javax.inject.Inject;
+import javax.transaction.Transactional;
+import javax.ws.rs.ForbiddenException;
+import javax.ws.rs.GET;
+import javax.ws.rs.NotFoundException;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+
+/**
+ *
+ * @author Jens Pelzetter
+ */
+@RequestScoped
+@Path(MvcAuthoringSteps.PATH_PREFIX + "publication-abstract-resources")
+public class PublicationAbstractStepResources {
+
+ @Inject
+ private ContentItemRepository itemRepo;
+
+ @Inject
+ private ContentSectionsUi sectionsUi;
+
+ @Inject
+ private ItemPermissionChecker itemPermissionChecker;
+
+ @GET
+ @Path("/variants/wordcount/{locale}")
+ @Produces(MediaType.TEXT_HTML)
+ @Transactional(Transactional.TxType.REQUIRED)
+ public String getWordCount(
+ @PathParam(MvcAuthoringSteps.SECTION_IDENTIFIER_PATH_PARAM)
+ final String sectionIdentifier,
+ @PathParam(MvcAuthoringSteps.DOCUMENT_PATH_PATH_PARAM_NAME)
+ final String documentPathParam,
+ @PathParam("locale") final String localeParam
+ ) {
+ final ContentSection contentSection = sectionsUi
+ .findContentSection(sectionIdentifier)
+ .orElseThrow(
+ () -> new NotFoundException()
+ );
+
+ final ContentItem document = itemRepo
+ .findByPath(contentSection, documentPathParam)
+ .orElseThrow(
+ () -> new NotFoundException()
+ );
+
+ if (!(document instanceof PublicationItem)) {
+ throw new NotFoundException();
+ }
+
+ final PublicationItem> item = (PublicationItem>) document;
+ if (itemPermissionChecker.canEditItem(item)) {
+ final Publication publication = item.getPublication();
+
+ final String text = publication
+ .getPublicationAbstract()
+ .getValue(new Locale(localeParam));
+ final Document jsoupDoc = Jsoup.parseBodyFragment(text);
+ final long result = new StringTokenizer(
+ jsoupDoc.body().text()
+ ).countTokens();
+ return Long.toString(result);
+ } else {
+ throw new ForbiddenException();
+ }
+ }
+
+ @GET
+ @Path("/variants/{locale}")
+ @Produces(MediaType.TEXT_HTML)
+ @Transactional(Transactional.TxType.REQUIRED)
+ public String viewAbstractValue(
+ @PathParam(MvcAuthoringSteps.SECTION_IDENTIFIER_PATH_PARAM)
+ final String sectionIdentifier,
+ @PathParam(MvcAuthoringSteps.DOCUMENT_PATH_PATH_PARAM_NAME)
+ final String documentPathParam,
+ @PathParam("locale") final String localeParam
+ ) {
+ final ContentSection contentSection = sectionsUi
+ .findContentSection(sectionIdentifier)
+ .orElseThrow(
+ () -> new NotFoundException()
+ );
+
+ final ContentItem document = itemRepo
+ .findByPath(contentSection, documentPathParam)
+ .orElseThrow(
+ () -> new NotFoundException()
+ );
+
+ if (!(document instanceof PublicationItem)) {
+ throw new NotFoundException();
+ }
+
+ if (!(document instanceof PublicationItem)) {
+ throw new NotFoundException();
+ }
+
+ final PublicationItem> item = (PublicationItem>) document;
+ if (itemPermissionChecker.canEditItem(item)) {
+ final Publication publication = item.getPublication();
+
+ return publication
+ .getPublicationAbstract()
+ .getValue(new Locale(localeParam));
+ } else {
+ throw new ForbiddenException();
+ }
+ }
+
+}
diff --git a/sci-publications/src/main/java/org/scientificcms/publications/ui/contenttypes/PublicationExtendedPropertiesStepModel.java b/sci-publications/src/main/java/org/scientificcms/publications/ui/contenttypes/PublicationExtendedPropertiesStepModel.java
new file mode 100644
index 0000000..32e3f9a
--- /dev/null
+++ b/sci-publications/src/main/java/org/scientificcms/publications/ui/contenttypes/PublicationExtendedPropertiesStepModel.java
@@ -0,0 +1,58 @@
+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 Jens Pelzetter
+ */
+@RequestScoped
+@Named("SciCmsPublicationExtendedPropertiesStepModel")
+public class PublicationExtendedPropertiesStepModel {
+
+ private boolean peerReviewed;
+
+ private int yearFirstPublished;
+
+ private String languageOfPublication;
+
+ private List volumeInSeries;
+
+ public boolean isPeerReviewed() {
+ return peerReviewed;
+ }
+
+ public void setPeerReviewed(final boolean peerReviewed) {
+ this.peerReviewed = peerReviewed;
+ }
+
+ public int getYearFirstPublished() {
+ return yearFirstPublished;
+ }
+
+ public void setYearFirstPublished(final int yearFirstPublished) {
+ this.yearFirstPublished = yearFirstPublished;
+ }
+
+ public String getLanguageOfPublication() {
+ return languageOfPublication;
+ }
+
+ public void setLanguageOfPublication(final String languageOfPublication) {
+ this.languageOfPublication = languageOfPublication;
+ }
+
+ public List getVolumeInSeries() {
+ return Collections.unmodifiableList(volumeInSeries);
+ }
+
+ public void setVolumeInSeries(final List volumeInSeries) {
+ this.volumeInSeries = new ArrayList<>(volumeInSeries);
+ }
+
+}
diff --git a/sci-publications/src/main/java/org/scientificcms/publications/ui/contenttypes/PublicationMiscStepModel.java b/sci-publications/src/main/java/org/scientificcms/publications/ui/contenttypes/PublicationMiscStepModel.java
new file mode 100644
index 0000000..0fed410
--- /dev/null
+++ b/sci-publications/src/main/java/org/scientificcms/publications/ui/contenttypes/PublicationMiscStepModel.java
@@ -0,0 +1,71 @@
+package org.scientificcms.publications.ui.contenttypes;
+
+import org.librecms.ui.contentsections.documents.CmsEditorLocaleVariantRow;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+
+import javax.enterprise.context.RequestScoped;
+import javax.inject.Named;
+
+/**
+ *
+ * @author Jens Pelzetter
+ */
+@RequestScoped
+@Named("SciCmsPublicationMiscStepModel")
+public class PublicationMiscStepModel {
+
+ private boolean canEdit;
+
+ private Map miscValues;
+
+ private List variants;
+
+ private List unusedLocales;
+
+ private String selectedLocale;
+
+ public Map getMiscValues() {
+ return Collections.unmodifiableMap(miscValues);
+ }
+
+ protected void setMiscValues(final Map miscValues) {
+ this.miscValues = miscValues;
+ }
+
+ public List getVariants() {
+ return Collections.unmodifiableList(variants);
+ }
+
+ protected void setVariants(final List variants) {
+ this.variants = variants;
+ }
+
+ public List getUnusedLocales() {
+ return Collections.unmodifiableList(unusedLocales);
+ }
+
+ protected void setUnusedLocales(final List unusedLocales) {
+ this.unusedLocales = new ArrayList<>(unusedLocales);
+ }
+
+ public String getSelectedLocale() {
+ return selectedLocale;
+ }
+
+ protected void setSelectedLocale(final String selectedLocale) {
+ this.selectedLocale = selectedLocale;
+ }
+
+ public boolean getCanEdit() {
+ return canEdit;
+ }
+
+ protected void setCanEdit(final boolean canEdit) {
+ this.canEdit = canEdit;
+ }
+
+}
diff --git a/sci-publications/src/main/java/org/scientificcms/publications/ui/contenttypes/PublicationMiscStepResources.java b/sci-publications/src/main/java/org/scientificcms/publications/ui/contenttypes/PublicationMiscStepResources.java
new file mode 100644
index 0000000..0812041
--- /dev/null
+++ b/sci-publications/src/main/java/org/scientificcms/publications/ui/contenttypes/PublicationMiscStepResources.java
@@ -0,0 +1,124 @@
+package org.scientificcms.publications.ui.contenttypes;
+
+import org.jsoup.Jsoup;
+import org.jsoup.nodes.Document;
+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.ItemPermissionChecker;
+import org.librecms.ui.contentsections.documents.MvcAuthoringSteps;
+import org.scientificcms.publications.Publication;
+import org.scientificcms.publications.contenttypes.PublicationItem;
+
+import java.util.Locale;
+import java.util.StringTokenizer;
+
+import javax.enterprise.context.RequestScoped;
+import javax.inject.Inject;
+import javax.transaction.Transactional;
+import javax.ws.rs.ForbiddenException;
+import javax.ws.rs.GET;
+import javax.ws.rs.NotFoundException;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+
+/**
+ *
+ * @author Jens Pelzetter
+ */
+@RequestScoped
+@Path(MvcAuthoringSteps.PATH_PREFIX + "publication-misc-resources")
+public class PublicationMiscStepResources {
+
+ @Inject
+ private ContentItemRepository itemRepo;
+
+ @Inject
+ private ContentSectionsUi sectionsUi;
+
+ @Inject
+ private ItemPermissionChecker itemPermissionChecker;
+
+ @GET
+ @Path("/variants/wordcount/{locale}")
+ @Produces(MediaType.TEXT_HTML)
+ @Transactional(Transactional.TxType.REQUIRED)
+ public String getWordCount(
+ @PathParam(MvcAuthoringSteps.SECTION_IDENTIFIER_PATH_PARAM)
+ final String sectionIdentifier,
+ @PathParam(MvcAuthoringSteps.DOCUMENT_PATH_PATH_PARAM_NAME)
+ final String documentPathParam,
+ @PathParam("locale") final String localeParam
+ ) {
+ final ContentSection contentSection = sectionsUi
+ .findContentSection(sectionIdentifier)
+ .orElseThrow(
+ () -> new NotFoundException()
+ );
+
+ final ContentItem document = itemRepo
+ .findByPath(contentSection, documentPathParam)
+ .orElseThrow(
+ () -> new NotFoundException()
+ );
+
+ if (!(document instanceof PublicationItem)) {
+ throw new NotFoundException();
+ }
+
+ final PublicationItem> item = (PublicationItem>) document;
+ if (itemPermissionChecker.canEditItem(item)) {
+ final Publication publication = item.getPublication();
+ final String misc = publication
+ .getMisc()
+ .getValue(new Locale(localeParam));
+ final Document jsoupDoc = Jsoup.parseBodyFragment(misc);
+ final long result = new StringTokenizer(
+ jsoupDoc.body().text()
+ ).countTokens();
+ return Long.toString(result);
+ } else {
+ throw new ForbiddenException();
+ }
+ }
+
+ @GET
+ @Path("/variants/{locale}")
+ @Produces(MediaType.TEXT_HTML)
+ @Transactional(Transactional.TxType.REQUIRED)
+ public String viewTextValue(
+ @PathParam(MvcAuthoringSteps.SECTION_IDENTIFIER_PATH_PARAM)
+ final String sectionIdentifier,
+ @PathParam(MvcAuthoringSteps.DOCUMENT_PATH_PATH_PARAM_NAME)
+ final String documentPathParam,
+ @PathParam("locale") final String localeParam
+ ) {
+ final ContentSection contentSection = sectionsUi
+ .findContentSection(sectionIdentifier)
+ .orElseThrow(
+ () -> new NotFoundException()
+ );
+
+ final ContentItem document = itemRepo
+ .findByPath(contentSection, documentPathParam)
+ .orElseThrow(
+ () -> new NotFoundException()
+ );
+
+ if (!(document instanceof PublicationItem)) {
+ throw new NotFoundException();
+ }
+
+ final PublicationItem> item = (PublicationItem>) document;
+ if (itemPermissionChecker.canEditItem(item)) {
+ final Publication publication = item.getPublication();
+ return publication.getMisc().getValue(new Locale(localeParam));
+ } else {
+ throw new ForbiddenException();
+ }
+ }
+
+}
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
new file mode 100644
index 0000000..3621683
--- /dev/null
+++ b/sci-publications/src/main/java/org/scientificcms/publications/ui/contenttypes/PublicationPropertiesStepModel.java
@@ -0,0 +1,88 @@
+package org.scientificcms.publications.ui.contenttypes;
+
+import org.scientificcms.publications.ui.AuthorsTableRow;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.enterprise.context.RequestScoped;
+import javax.inject.Named;
+
+/**
+ *
+ * @author Jens Pelzetter
+ */
+@RequestScoped
+@Named("SciCmsPublicationPropertiesStepModel")
+public class PublicationPropertiesStepModel {
+
+ private String name;
+
+ private Map titleValues;
+
+ private List unusedTitleLocales;
+
+ private Map shortDecriptionValues;
+
+ private List unusedShortDescriptionLocales;
+
+ private List authors;
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(final String name) {
+ this.name = name;
+ }
+
+ public Map getTitleValues() {
+ return Collections.unmodifiableMap(titleValues);
+ }
+
+ public void setTitleValues(final Map titleValues) {
+ this.titleValues = new HashMap<>(titleValues);
+ }
+
+ public List getUnusedTitleLocales() {
+ return Collections.unmodifiableList(unusedTitleLocales);
+ }
+
+ public void setUnusedTitleLocales(final List unusedTitleLocales) {
+ this.unusedTitleLocales = new ArrayList<>(unusedTitleLocales);
+ }
+
+ public Map getShortDecriptionValues() {
+ return Collections.unmodifiableMap(shortDecriptionValues);
+ }
+
+ public void setShortDecriptionValues(
+ final Map shortDecriptionValues
+ ) {
+ this.shortDecriptionValues = new HashMap<>(shortDecriptionValues);
+ }
+
+ public List getUnusedShortDescriptionLocales() {
+ return Collections.unmodifiableList(unusedShortDescriptionLocales);
+ }
+
+ public void setUnusedShortDescriptionLocales(
+ final List unusedShortDescriptionLocales
+ ) {
+ this.unusedShortDescriptionLocales = new ArrayList<>(
+ unusedShortDescriptionLocales
+ );
+ }
+
+ public List getAuthors() {
+ return Collections.unmodifiableList(authors);
+ }
+
+ public void setAuthors(final List authors) {
+ this.authors = new ArrayList<>(authors);
+ }
+
+}
diff --git a/sci-publications/src/main/java/org/scientificcms/publications/ui/contenttypes/PublicationWithPublisherExtentedPropertiesStep.java b/sci-publications/src/main/java/org/scientificcms/publications/ui/contenttypes/PublicationWithPublisherExtentedPropertiesStep.java
new file mode 100644
index 0000000..0f4e80c
--- /dev/null
+++ b/sci-publications/src/main/java/org/scientificcms/publications/ui/contenttypes/PublicationWithPublisherExtentedPropertiesStep.java
@@ -0,0 +1,64 @@
+package org.scientificcms.publications.ui.contenttypes;
+
+import javax.enterprise.context.RequestScoped;
+import javax.inject.Named;
+
+/**
+ *
+ * @author Jens Pelzetter
+ */
+@RequestScoped
+@Named("SciCmsPublicationWithPublisherExtendedPropertiesStep")
+public class PublicationWithPublisherExtentedPropertiesStep {
+
+ private String isbn10;
+
+ private String isbn13;
+
+ private int volume;
+
+ private int numberOfVolumes;
+
+ private int numberOfPages;
+
+ public String getIsbn10() {
+ return isbn10;
+ }
+
+ public void setIsbn10(final String isbn10) {
+ this.isbn10 = isbn10;
+ }
+
+ public String getIsbn13() {
+ return isbn13;
+ }
+
+ public void setIsbn13(final String isbn13) {
+ this.isbn13 = isbn13;
+ }
+
+ public int getVolume() {
+ return volume;
+ }
+
+ public void setVolume(final int volume) {
+ this.volume = volume;
+ }
+
+ public int getNumberOfVolumes() {
+ return numberOfVolumes;
+ }
+
+ public void setNumberOfVolumes(final int numberOfVolumes) {
+ this.numberOfVolumes = numberOfVolumes;
+ }
+
+ public int getNumberOfPages() {
+ return numberOfPages;
+ }
+
+ public void setNumberOfPages(final int numberOfPages) {
+ this.numberOfPages = numberOfPages;
+ }
+
+}
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
new file mode 100644
index 0000000..6e274a9
--- /dev/null
+++ b/sci-publications/src/main/java/org/scientificcms/publications/ui/contenttypes/PublicationWithPublisherPropertiesStepModel.java
@@ -0,0 +1,44 @@
+package org.scientificcms.publications.ui.contenttypes;
+
+import javax.enterprise.context.RequestScoped;
+import javax.inject.Named;
+
+/**
+ *
+ * @author Jens Pelzetter
+ */
+@RequestScoped
+@Named("SciCmsPublicationWithPublisherPropertiesStepModel")
+public class PublicationWithPublisherPropertiesStepModel {
+
+ private String publisherUuid;
+
+ private String publisherName;
+
+ private String publisherPlace;
+
+ public String getPublisherUuid() {
+ return publisherUuid;
+ }
+
+ public void setPublisherUuid(final String publisherUuid) {
+ this.publisherUuid = publisherUuid;
+ }
+
+ public String getPublisherName() {
+ return publisherName;
+ }
+
+ public void setPublisherName(final String publisherName) {
+ this.publisherName = publisherName;
+ }
+
+ public String getPublisherPlace() {
+ return publisherPlace;
+ }
+
+ public void setPublisherPlace(final String publisherPlace) {
+ this.publisherPlace = publisherPlace;
+ }
+
+}
diff --git a/sci-publications/src/main/java/org/scientificcms/publications/ui/contenttypes/VolumeInSeriesRow.java b/sci-publications/src/main/java/org/scientificcms/publications/ui/contenttypes/VolumeInSeriesRow.java
new file mode 100644
index 0000000..920287b
--- /dev/null
+++ b/sci-publications/src/main/java/org/scientificcms/publications/ui/contenttypes/VolumeInSeriesRow.java
@@ -0,0 +1,49 @@
+package org.scientificcms.publications.ui.contenttypes;
+
+/**
+ *
+ * @author Jens Pelzetter
+ */
+public class VolumeInSeriesRow {
+
+ private String volumeInSeriesUuid;
+
+ private String seriesUuid;
+
+ private String volumeInSeries;
+
+ private String seriesTitle;
+
+ public String getVolumeInSeriesUuid() {
+ return volumeInSeriesUuid;
+ }
+
+ public void setVolumeInSeriesUuid(final String volumeInSeriesUuid) {
+ this.volumeInSeriesUuid = volumeInSeriesUuid;
+ }
+
+ public String getSeriesUuid() {
+ return seriesUuid;
+ }
+
+ public void setSeriesUuid(final String seriesUuid) {
+ this.seriesUuid = seriesUuid;
+ }
+
+ public String getVolumeInSeries() {
+ return volumeInSeries;
+ }
+
+ public void setVolumeInSeries(final String volumeInSeries) {
+ this.volumeInSeries = volumeInSeries;
+ }
+
+ public String getSeriesTitle() {
+ return seriesTitle;
+ }
+
+ public void setSeriesTitle(final String seriesTitle) {
+ this.seriesTitle = seriesTitle;
+ }
+
+}
diff --git a/sci-publications/src/main/resources/org/scientificcms/publications/ui/SciPublicationsBundle.properties b/sci-publications/src/main/resources/org/scientificcms/publications/ui/SciPublicationsBundle.properties
index c91d00c..e6fdd29 100644
--- a/sci-publications/src/main/resources/org/scientificcms/publications/ui/SciPublicationsBundle.properties
+++ b/sci-publications/src/main/resources/org/scientificcms/publications/ui/SciPublicationsBundle.properties
@@ -253,3 +253,4 @@ proceedings.editstep.shortdescription.remove.text=Are you sure to remove the fol
proceedings.editstep.shortdescription.remove.title=Confirm removal of localized description
proceedings.editstep.shortdescription.title=Description
proceedings.editstep.properties.edit.submit=Save
+monographitem.createstep.description=Create new monograph item.
diff --git a/sci-publications/src/main/resources/org/scientificcms/publications/ui/SciPublicationsBundle_de.properties b/sci-publications/src/main/resources/org/scientificcms/publications/ui/SciPublicationsBundle_de.properties
index 2de251d..aeaf5df 100644
--- a/sci-publications/src/main/resources/org/scientificcms/publications/ui/SciPublicationsBundle_de.properties
+++ b/sci-publications/src/main/resources/org/scientificcms/publications/ui/SciPublicationsBundle_de.properties
@@ -253,3 +253,4 @@ proceedings.editstep.shortdescription.remove.text=Sind Sie sicher, dass Sie die
proceedings.editstep.shortdescription.remove.title=Entfernen einer lokalisierten Beschreibung best\u00e4tigen
proceedings.editstep.shortdescription.title=Beschreibung
proceedings.editstep.properties.edit.submit=Speichern
+monographitem.createstep.description=Legt ein neues Item f\u00fcr eine Monographie an.