diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/lifecycle/AddPhaseForm.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/lifecycle/AddPhaseForm.java
index 2b1d35526..556a6e210 100755
--- a/ccm-cms/src/main/java/com/arsdigita/cms/ui/lifecycle/AddPhaseForm.java
+++ b/ccm-cms/src/main/java/com/arsdigita/cms/ui/lifecycle/AddPhaseForm.java
@@ -23,19 +23,15 @@ import com.arsdigita.bebop.FormProcessException;
import com.arsdigita.bebop.Label;
import com.arsdigita.bebop.PageState;
import com.arsdigita.bebop.SimpleContainer;
-import com.arsdigita.bebop.event.FormInitListener;
import com.arsdigita.bebop.event.FormProcessListener;
import com.arsdigita.bebop.event.FormSectionEvent;
import com.arsdigita.bebop.event.FormValidationListener;
import com.arsdigita.bebop.form.FormErrorDisplay;
-import com.arsdigita.bebop.form.Hidden;
import com.arsdigita.bebop.form.Submit;
import com.arsdigita.bebop.form.TextArea;
import com.arsdigita.bebop.form.TextField;
-import com.arsdigita.bebop.parameters.BigDecimalParameter;
import com.arsdigita.bebop.parameters.IntegerParameter;
import com.arsdigita.bebop.parameters.NotEmptyValidationListener;
-import com.arsdigita.bebop.parameters.NotNullValidationListener;
import com.arsdigita.bebop.parameters.NumberInRangeValidationListener;
import com.arsdigita.bebop.parameters.StringLengthValidationListener;
import com.arsdigita.bebop.parameters.TrimmedStringParameter;
@@ -52,11 +48,10 @@ import org.libreccm.cdi.utils.CdiUtil;
import org.libreccm.configuration.ConfigurationManager;
import org.librecms.CmsConstants;
import org.librecms.contentsection.privileges.AdminPrivileges;
-import org.librecms.lifecycle.LifecycleDefinitionRepository;
-import org.librecms.lifecycle.PhaseDefinititionRepository;
import java.util.List;
import java.util.Locale;
+import java.util.Optional;
/**
* This class contains a form component to add a lifecycle phase definition.
@@ -67,8 +62,7 @@ import java.util.Locale;
* @author Jens Pelzetter
*/
class AddPhaseForm extends CMSForm {
-
- private final static String PHASE_ID = "id";
+
private final static String LABEL = "label";
private final static String DESCRIPTION = "description";
private final static String DELAY_DAYS = "delay_days";
@@ -79,20 +73,19 @@ class AddPhaseForm extends CMSForm {
private final static String DURATION_MINUTES = "duration_minutes";
private final static String SUBMIT = "submit";
private final static String CANCEL = "cancel";
-
- private final LifecycleDefinitionRequestLocal m_cycle;
-
- private final Hidden m_id;
- private final TextField m_label;
- private final TextArea m_description;
- private final TextField m_delay_days;
- private final TextField m_delay_hours;
- private final TextField m_delay_minutes;
- private final TextField m_duration_days;
- private final TextField m_duration_hours;
- private final TextField m_duration_minutes;
- private final Submit m_submit;
- private final Submit m_cancel;
+
+ private final LifecycleDefinitionRequestLocal selectedLifecycle;
+
+ private final TextField phaseLabel;
+ private final TextArea phaseDescription;
+ private final TextField delayDays;
+ private final TextField delayHours;
+ private final TextField delayMinutes;
+ private final TextField durationDays;
+ private final TextField durationHours;
+ private final TextField durationMinutes;
+ private final Submit submit;
+ private final Submit cancel;
/**
* Constructor.
@@ -101,118 +94,104 @@ class AddPhaseForm extends CMSForm {
* cycle definition is selected since phase definitions are
* associated to cycle definitions
*/
- public AddPhaseForm(final LifecycleDefinitionRequestLocal cycle) {
+ public AddPhaseForm(final LifecycleDefinitionRequestLocal selectedLifecycle) {
super("LifecyclePhaseDefinition");
-
- m_cycle = cycle;
-
- m_id = new Hidden(new BigDecimalParameter(PHASE_ID));
- add(m_id);
- m_id.addValidationListener(new NotNullValidationListener());
-
- Label heading = new Label(gz("cms.ui.lifecycle.phase_add"));
+
+ this.selectedLifecycle = selectedLifecycle;
+
+ final Label heading = new Label(gz("cms.ui.lifecycle.phase_add"));
heading.setFontWeight(Label.BOLD);
add(heading, ColumnPanel.FULL_WIDTH);
add(new FormErrorDisplay(this), ColumnPanel.FULL_WIDTH);
-
- add(new Label(gz("cms.ui.name")));
- m_label = new TextField(new TrimmedStringParameter(LABEL));
- m_label.addValidationListener(new NotEmptyValidationListener());
- m_label.setSize(40);
- m_label.setMaxLength(1000);
- add(m_label);
-
- add(new Label(gz("cms.ui.description")));
- m_description = new TextArea(new TrimmedStringParameter(DESCRIPTION));
- m_description.addValidationListener(new StringLengthValidationListener(
- 4000));
- m_description.setCols(40);
- m_description.setRows(5);
- m_description.setWrap(TextArea.SOFT);
- add(m_description);
+
+ add(new Label(gz("cms.ui.lifecycle.phase.name")));
+ phaseLabel = new TextField(new TrimmedStringParameter(LABEL));
+ phaseLabel.addValidationListener(new NotEmptyValidationListener());
+ phaseLabel.setSize(40);
+ phaseLabel.setMaxLength(1000);
+ add(phaseLabel);
+
+ add(new Label(gz("cms.ui.lifecycle.phase.description")));
+ phaseDescription = new TextArea(new TrimmedStringParameter(DESCRIPTION));
+ phaseDescription.addValidationListener(
+ new StringLengthValidationListener(
+ 4000));
+ phaseDescription.setCols(40);
+ phaseDescription.setRows(5);
+ phaseDescription.setWrap(TextArea.SOFT);
+ add(phaseDescription);
// phase delay
add(new Label(gz("cms.ui.lifecycle.phase_start_delay")));
- m_delay_days = new TextField(new IntegerParameter(DELAY_DAYS));
- m_delay_hours = new TextField(new IntegerParameter(DELAY_HOURS));
- m_delay_minutes = new TextField(new IntegerParameter(DELAY_MINUTES));
+ delayDays = new TextField(new IntegerParameter(DELAY_DAYS));
+ delayHours = new TextField(new IntegerParameter(DELAY_HOURS));
+ delayMinutes = new TextField(new IntegerParameter(DELAY_MINUTES));
//max value: days: 60 years, hours: 7 days, minutes: 1 day
- m_delay_days.addValidationListener(
+ delayDays.addValidationListener(
new NumberInRangeValidationListener(0, 21900));
- m_delay_hours.addValidationListener(new NumberInRangeValidationListener(
+ delayHours.addValidationListener(new NumberInRangeValidationListener(
0, 168));
- m_delay_minutes.addValidationListener(
+ delayMinutes.addValidationListener(
new NumberInRangeValidationListener(0, 1440));
- m_delay_days.setSize(7);
- m_delay_hours.setSize(7);
- m_delay_minutes.setSize(7);
- m_delay_days.setClassAttr("DaysField");
- m_delay_hours.setClassAttr("HoursField");
- m_delay_minutes.setClassAttr("MinutesField");
-
- SimpleContainer de = new SimpleContainer();
- de.add(new Label(gz("cms.ui.lifecycle.phase_days")));
- de.add(m_delay_days);
- de.add(new Label(gz("cms.ui.lifecycle.phase_hours")));
- de.add(m_delay_hours);
- de.add(new Label(gz("cms.ui.lifecycle.phase_mins")));
- de.add(m_delay_minutes);
- add(de);
+ delayDays.setSize(7);
+ delayHours.setSize(7);
+ delayMinutes.setSize(7);
+ delayDays.setClassAttr("DaysField");
+ delayHours.setClassAttr("HoursField");
+ delayMinutes.setClassAttr("MinutesField");
+
+ final SimpleContainer delayContainer = new SimpleContainer();
+ delayContainer.add(new Label(gz("cms.ui.lifecycle.phase_days")));
+ delayContainer.add(delayDays);
+ delayContainer.add(new Label(gz("cms.ui.lifecycle.phase_hours")));
+ delayContainer.add(delayHours);
+ delayContainer.add(new Label(gz("cms.ui.lifecycle.phase_minutes")));
+ delayContainer.add(delayMinutes);
+ add(delayContainer);
// phase duration
add(new Label(gz("cms.ui.lifecycle.phase_duration")));
- m_duration_days = new TextField(new IntegerParameter(DURATION_DAYS));
- m_duration_hours = new TextField(new IntegerParameter(DURATION_HOURS));
- m_duration_minutes = new TextField(
+ durationDays = new TextField(new IntegerParameter(DURATION_DAYS));
+ durationHours = new TextField(new IntegerParameter(DURATION_HOURS));
+ durationMinutes = new TextField(
new IntegerParameter(DURATION_MINUTES));
//max value: days: 60 years, hours: 7 days, minutes: 1 day
- m_duration_days.addValidationListener(
+ durationDays.addValidationListener(
new NumberInRangeValidationListener(0, 21900));
- m_duration_hours.addValidationListener(
+ durationHours.addValidationListener(
new NumberInRangeValidationListener(0, 168));
- m_duration_minutes.addValidationListener(
+ durationMinutes.addValidationListener(
new NumberInRangeValidationListener(0, 1440));
- m_duration_days.setSize(7);
- m_duration_hours.setSize(7);
- m_duration_minutes.setSize(7);
- m_duration_days.setClassAttr("DaysField");
- m_duration_hours.setClassAttr("HoursField");
- m_duration_minutes.setClassAttr("MinutesField");
-
- SimpleContainer du = new SimpleContainer();
- du.add(new Label(gz("cms.ui.lifecycle.phase_days")));
- du.add(m_duration_days);
- du.add(new Label(gz("cms.ui.lifecycle.phase_hours")));
- du.add(m_duration_hours);
- du.add(new Label(gz("cms.ui.lifecycle.phase_mins")));
- du.add(m_duration_minutes);
- add(du);
-
- SimpleContainer s = new SimpleContainer();
- m_submit = new Submit(SUBMIT);
- m_submit.setButtonLabel("Add Phase");
- s.add(m_submit);
- m_cancel = new Submit(CANCEL);
- m_cancel.setButtonLabel("Cancel");
- s.add(m_cancel);
- add(s, ColumnPanel.FULL_WIDTH | ColumnPanel.CENTER);
-
- addInitListener(new FormInitListener() {
-
- public final void init(final FormSectionEvent event)
- throws FormProcessException {
- initializePhase(event.getPageState());
- }
-
- });
-
+ durationDays.setSize(7);
+ durationHours.setSize(7);
+ durationMinutes.setSize(7);
+ durationDays.setClassAttr("DaysField");
+ durationHours.setClassAttr("HoursField");
+ durationMinutes.setClassAttr("MinutesField");
+
+ final SimpleContainer durationContainer = new SimpleContainer();
+ durationContainer.add(new Label(gz("cms.ui.lifecycle.phase_days")));
+ durationContainer.add(durationDays);
+ durationContainer.add(new Label(gz("cms.ui.lifecycle.phase_hours")));
+ durationContainer.add(durationHours);
+ durationContainer.add(new Label(gz("cms.ui.lifecycle.phase_minutes")));
+ durationContainer.add(durationMinutes);
+ add(durationContainer);
+
+ final SimpleContainer submitCancel = new SimpleContainer();
+ submit = new Submit(SUBMIT, gz("cms.ui.lifecycle.phase.add_submit"));
+ submitCancel.add(submit);
+ cancel = new Submit(CANCEL, gz("cms.ui.lifecycle.phase.add_cancel"));
+ submitCancel.add(cancel);
+ add(submitCancel, ColumnPanel.FULL_WIDTH | ColumnPanel.CENTER);
+
addSubmissionListener(new FormSecurityListener(
AdminPrivileges.ADMINISTER_LIFECYLES));
-
+
addValidationListener(new FormValidationListener() {
-
+
@Override
public final void validate(final FormSectionEvent event)
throws FormProcessException {
@@ -220,16 +199,17 @@ class AddPhaseForm extends CMSForm {
validateDuration(state);
validateUniqueName(state);
}
-
+
});
-
+
addProcessListener(new FormProcessListener() {
-
+
+ @Override
public final void process(final FormSectionEvent event)
throws FormProcessException {
addPhase(event.getPageState());
}
-
+
});
}
@@ -244,26 +224,7 @@ class AddPhaseForm extends CMSForm {
*/
@Override
public boolean isCancelled(final PageState state) {
- return m_cancel.isSelected(state);
- }
-
- /**
- * Generate a unique ID for the new phase.
- *
- * @param state The page state
- *
- * @pre state != null
- */
- protected void initializePhase(final PageState state)
- throws FormProcessException {
- // Not neccessary with JPA
-// if (m_id.getValue(state) == null) {
-// try {
-// m_id.setValue(state, Sequences.getNextValue());
-// } catch (SQLException e) {
-// throw new UncheckedWrapperException(e);
-// }
-// }
+ return cancel.isSelected(state);
}
/**
@@ -274,39 +235,40 @@ class AddPhaseForm extends CMSForm {
* @pre state != null
*/
protected void addPhase(final PageState state) throws FormProcessException {
- final String label = (String) m_label.getValue(state);
- final String description = (String) m_description.getValue(state);
- final Integer delDays = (Integer) m_delay_days.getValue(state);
- final Integer delHours = (Integer) m_delay_hours.getValue(state);
- final Integer delMinutes = (Integer) m_delay_minutes.getValue(state);
- final Integer durDays = (Integer) m_duration_days.getValue(state);
- final Integer durHours = (Integer) m_duration_hours.getValue(state);
- final Integer durMinutes = (Integer) m_duration_minutes.getValue(state);
-
+ final String label = (String) phaseLabel.getValue(state);
+ final String description = (String) phaseDescription.getValue(state);
+ final int delDays = (int) Optional
+ .ofNullable(delayDays.getValue(state))
+ .orElseGet(() -> 0);
+ final int delHours = (int) Optional
+ .ofNullable(delayHours.getValue(state))
+ .orElseGet(() -> 0);
+ final int delMinutes = (int) Optional
+ .ofNullable(delayMinutes.getValue(state))
+ .orElseGet(() -> 0);
+ final int durDays = (int) Optional
+ .ofNullable(durationDays.getValue(state))
+ .orElseGet(() -> 0);
+ final int durHours = (int) Optional
+ .ofNullable(durationHours.getValue(state))
+ .orElseGet(() -> 0);
+ final int durMinutes = (int) Optional
+ .ofNullable(durationMinutes.getValue(state))
+ .orElseGet(() -> 0);
+
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
- final LifecycleDefinitionRepository lifecycleDefRepo = cdiUtil.findBean(
- LifecycleDefinitionRepository.class);
- final PhaseDefinititionRepository phaseDefRepo = cdiUtil.findBean(
- PhaseDefinititionRepository.class);
- final ConfigurationManager confManager = cdiUtil.findBean(
- ConfigurationManager.class);
- final KernelConfig kernelConfig = confManager.findConfiguration(
- KernelConfig.class);
- final Locale defaultLocale = kernelConfig.getDefaultLocale();
-
- // Check if the object already exists for double click protection.
- final PhaseDefinition phaseDef = new PhaseDefinition();
- final LifecycleDefinition cycleDef = m_cycle.getLifecycleDefinition(
- state);
- cycleDef.addPhaseDefinition(phaseDef);
-
- phaseDef.getLabel().addValue(defaultLocale, label);
- phaseDef.getDescription().addValue(defaultLocale, description);
- phaseDef.setDefaultDelay(delDays * delHours * delMinutes * 60);
- phaseDef.setDefaultDuration(durDays * durHours * durMinutes * 60);
-
- phaseDefRepo.save(phaseDef);
- lifecycleDefRepo.save(cycleDef);
+ final LifecycleAdminPaneController controller = cdiUtil
+ .findBean(LifecycleAdminPaneController.class);
+ controller.addPhaseDefinition(
+ selectedLifecycle.getLifecycleDefinition(state),
+ label,
+ description,
+ delDays,
+ delHours,
+ delMinutes,
+ durDays,
+ durHours,
+ durMinutes);
}
/**
@@ -316,27 +278,34 @@ class AddPhaseForm extends CMSForm {
*
* @pre state != null
*/
- protected void validateUniqueName(PageState state)
+ protected void validateUniqueName(final PageState state)
throws FormProcessException {
- String label = (String) m_label.getValue(state);
-
- final LifecycleDefinition cycleDef = m_cycle.getLifecycleDefinition(
- state);
- final List phaseDefs = cycleDef.getPhaseDefinitions();
+
+ final String label = (String) phaseLabel.getValue(state);
+
+ final LifecycleDefinition cycleDef = selectedLifecycle
+ .getLifecycleDefinition(state);
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
+ final LifecycleAdminPaneController controller = cdiUtil
+ .findBean(LifecycleAdminPaneController.class);
+ final List phaseDefs = controller
+ .getPhaseDefinitions(cycleDef);
+
final ConfigurationManager confManager = cdiUtil.findBean(
ConfigurationManager.class);
final KernelConfig kernelConfig = confManager.findConfiguration(
KernelConfig.class);
final Locale defaultLocale = kernelConfig.getDefaultLocale();
-
- for (final PhaseDefinition phaseDef : phaseDefs) {
- if (phaseDef.getLabel().getValue(defaultLocale).equalsIgnoreCase(
- label)) {
- throw new FormProcessException(new GlobalizedMessage(
- "cms.ui.lifecycle.phase_name_not_unique",
- CmsConstants.CMS_BUNDLE));
- }
+
+ final boolean duplicateLabel = phaseDefs
+ .stream()
+ .map(phaseDef -> phaseDef.getLabel().getValue(defaultLocale))
+ .anyMatch(phaseDefLabel -> phaseDefLabel.equalsIgnoreCase(label));
+
+ if (duplicateLabel) {
+ throw new FormProcessException(new GlobalizedMessage(
+ "cms.ui.lifecycle.phase_name_not_unique",
+ CmsConstants.CMS_BUNDLE));
}
}
@@ -347,50 +316,47 @@ class AddPhaseForm extends CMSForm {
*
* @pre state != null
*/
- protected void validateDuration(PageState state)
+ protected void validateDuration(final PageState state)
throws FormProcessException {
- Integer durDays = (Integer) m_duration_days.getValue(state);
- Integer durHours = (Integer) m_duration_hours.getValue(state);
- Integer durMinutes = (Integer) m_duration_minutes.getValue(state);
+
+ final Integer durDays = (Integer) durationDays.getValue(state);
+ final Integer durHours = (Integer) durationHours.getValue(state);
+ final Integer durMinutes = (Integer) durationMinutes.getValue(state);
// Phase duration is infinite, so the duration is valid.
if (durDays == null && durHours == null && durMinutes == null) {
return;
}
-
+
int days, hours, minutes;
if (durDays != null) {
- days = durDays.intValue();
+ days = durDays;
} else {
days = 0;
}
-
+
if (durHours != null) {
- hours = durHours.intValue();
+ hours = durHours;
} else {
hours = 0;
}
-
+
if (durMinutes != null) {
- minutes = durMinutes.intValue();
+ minutes = durMinutes;
} else {
minutes = 0;
}
-
+
if ((days + hours + minutes) == 0) {
throw new FormProcessException(new GlobalizedMessage(
"cms.ui.lifecycle.phase_duration_negative",
CmsConstants.CMS_BUNDLE));
}
}
-
+
private static GlobalizedMessage gz(final String key) {
return new GlobalizedMessage(key,
CmsConstants.CMS_BUNDLE);
}
-
- private static String lz(final String key) {
- return (String) gz(key).localize();
- }
-
+
}
diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/lifecycle/BaseLifecycleForm.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/lifecycle/BaseLifecycleForm.java
index 03291b516..cf22948df 100755
--- a/ccm-cms/src/main/java/com/arsdigita/cms/ui/lifecycle/BaseLifecycleForm.java
+++ b/ccm-cms/src/main/java/com/arsdigita/cms/ui/lifecycle/BaseLifecycleForm.java
@@ -18,29 +18,17 @@
*/
package com.arsdigita.cms.ui.lifecycle;
-import com.arsdigita.bebop.FormProcessException;
-import com.arsdigita.bebop.PageState;
-import com.arsdigita.bebop.event.ParameterEvent;
-import com.arsdigita.bebop.event.ParameterListener;
import com.arsdigita.bebop.form.TextArea;
import com.arsdigita.bebop.form.TextField;
import com.arsdigita.bebop.parameters.NotEmptyValidationListener;
import com.arsdigita.bebop.parameters.StringLengthValidationListener;
import com.arsdigita.bebop.parameters.TrimmedStringParameter;
-import com.arsdigita.cms.CMS;
import com.arsdigita.cms.ui.BaseForm;
import com.arsdigita.cms.ui.FormSecurityListener;
import com.arsdigita.globalization.GlobalizedMessage;
-import com.arsdigita.kernel.KernelConfig;
-import org.libreccm.cdi.utils.CdiUtil;
-import org.libreccm.configuration.ConfigurationManager;
-import org.librecms.CmsConstants;
import org.librecms.contentsection.privileges.AdminPrivileges;
-import org.librecms.lifecycle.LifecycleDefinition;
-
-import java.util.Locale;
/**
* @author Justin Ross
@@ -48,27 +36,28 @@ import java.util.Locale;
*/
class BaseLifecycleForm extends BaseForm {
- final TextField m_name;
- final TextArea m_description;
+ private final TextField lifecycleName;
+ private final TextArea lifecycleDescription;
BaseLifecycleForm(final String key, final GlobalizedMessage message) {
super(key, message);
- m_name = new TextField(new TrimmedStringParameter("label"));
- addField(gz("cms.ui.name"), m_name);
+ lifecycleName = new TextField(new TrimmedStringParameter("label"));
+ addField(gz("cms.ui.lifecycle.name"), lifecycleName);
- m_name.addValidationListener(new NotEmptyValidationListener());
- m_name.setSize(40);
- m_name.setMaxLength(1000);
+ lifecycleName.addValidationListener(new NotEmptyValidationListener());
+ lifecycleName.setSize(40);
+ lifecycleName.setMaxLength(1000);
- m_description = new TextArea(new TrimmedStringParameter("description"));
- addField(gz("cms.ui.description"), m_description);
+ lifecycleDescription = new TextArea(
+ new TrimmedStringParameter("description"));
+ addField(gz("cms.ui.lifecycle.description"), lifecycleDescription);
- m_description.addValidationListener(new StringLengthValidationListener(
- 4000));
- m_description.setCols(40);
- m_description.setRows(5);
- m_description.setWrap(TextArea.SOFT);
+ lifecycleDescription.addValidationListener(
+ new StringLengthValidationListener(4000));
+ lifecycleDescription.setCols(40);
+ lifecycleDescription.setRows(5);
+ lifecycleDescription.setWrap(TextArea.SOFT);
addAction(new Finish());
addAction(new Cancel());
@@ -77,43 +66,12 @@ class BaseLifecycleForm extends BaseForm {
AdminPrivileges.ADMINISTER_LIFECYLES));
}
- class NameUniqueListener implements ParameterListener {
-
- private final LifecycleDefinitionRequestLocal m_definition;
-
- NameUniqueListener(final LifecycleDefinitionRequestLocal definition) {
- m_definition = definition;
- }
-
- @Override
- public final void validate(final ParameterEvent e)
- throws FormProcessException {
-
- final PageState state = e.getPageState();
- final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
- final ConfigurationManager confManager = cdiUtil.findBean(
- ConfigurationManager.class);
- final KernelConfig kernelConfig = confManager.findConfiguration(
- KernelConfig.class);
- final Locale defaultLocale = kernelConfig.getDefaultLocale();
- final String label = (String) m_name.getValue(state);
-
- final java.util.List definitions = CMS
- .getContext().getContentSection().getLifecycleDefinitions();
-
- for (final LifecycleDefinition definition : definitions) {
- if (definition.getLabel().getValue(defaultLocale)
- .equalsIgnoreCase(label)
- && (m_definition == null
- || !m_definition.getLifecycleDefinition(state)
- .equals(definition))) {
- throw new FormProcessException(new GlobalizedMessage(
- "cms.ui.lifecycle.name_not_unique",
- CmsConstants.CMS_BUNDLE));
- }
- }
- }
+ protected TextField getLifecycleName() {
+ return lifecycleName;
+ }
+ protected TextArea getLifecycleDescription() {
+ return lifecycleDescription;
}
}
diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/lifecycle/DeletePhaseForm.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/lifecycle/DeletePhaseForm.java
index ba67aa161..1014ea905 100755
--- a/ccm-cms/src/main/java/com/arsdigita/cms/ui/lifecycle/DeletePhaseForm.java
+++ b/ccm-cms/src/main/java/com/arsdigita/cms/ui/lifecycle/DeletePhaseForm.java
@@ -28,19 +28,20 @@ import com.arsdigita.bebop.event.FormProcessListener;
import com.arsdigita.bebop.event.FormSectionEvent;
import com.arsdigita.bebop.form.Hidden;
import com.arsdigita.bebop.form.Submit;
-import com.arsdigita.bebop.parameters.BigDecimalParameter;
+import com.arsdigita.bebop.parameters.LongParameter;
import com.arsdigita.bebop.parameters.NotNullValidationListener;
import org.librecms.lifecycle.PhaseDefinition;
import com.arsdigita.cms.ui.CMSForm;
import com.arsdigita.cms.ui.FormSecurityListener;
+import com.arsdigita.globalization.GlobalizedMessage;
import org.libreccm.cdi.utils.CdiUtil;
+import org.librecms.CmsConstants;
import org.librecms.contentsection.privileges.AdminPrivileges;
import org.librecms.lifecycle.PhaseDefinititionRepository;
-
/**
* This class handles the deleting of a phase definition.
*
@@ -50,35 +51,40 @@ import org.librecms.lifecycle.PhaseDefinititionRepository;
class DeletePhaseForm extends CMSForm
implements FormProcessListener, FormInitListener {
- private final PhaseRequestLocal m_phase;
+ private final PhaseRequestLocal selectedPhaseDef;
- private final Hidden m_id;
- private final Submit m_deleteWidget;
- private final Submit m_cancelWidget;
+ private final Hidden selectedPhaseDefId;
+ private final Submit deleteWidget;
+ private final Submit cancelWidget;
/**
* @param m The phase selection model. This tells the form which phase
* definition is selected.
*/
- public DeletePhaseForm(final PhaseRequestLocal phase) {
+ public DeletePhaseForm(final PhaseRequestLocal selectedPhaseDef) {
super("PhaseDefinitionDelete");
- m_phase = phase;
+ this.selectedPhaseDef = selectedPhaseDef;
- m_id = new Hidden(new BigDecimalParameter("id"));
- add(m_id);
- m_id.addValidationListener(new NotNullValidationListener());
+ selectedPhaseDefId = new Hidden(new LongParameter("id"));
+ add(selectedPhaseDefId);
+ selectedPhaseDefId
+ .addValidationListener(new NotNullValidationListener());
final BoxPanel buttons = new BoxPanel(BoxPanel.HORIZONTAL);
- m_deleteWidget = new Submit("delete");
- m_deleteWidget.setButtonLabel("Delete");
- m_deleteWidget.setClassAttr("deletePhase");
- buttons.add(m_deleteWidget);
+ deleteWidget = new Submit("delete",
+ new GlobalizedMessage(
+ "cms.ui.lifecycle.phase.delete_submit",
+ CmsConstants.CMS_BUNDLE));
+ deleteWidget.setClassAttr("deletePhase");
+ buttons.add(deleteWidget);
- m_cancelWidget = new Submit("cancel");
- m_cancelWidget.setButtonLabel("Cancel");
- m_cancelWidget.setClassAttr("canceldeletePhase");
- buttons.add(m_cancelWidget);
+ cancelWidget = new Submit("cancel",
+ new GlobalizedMessage(
+ "cms.ui.lifecycle.phase.delete_cancel",
+ CmsConstants.CMS_BUNDLE));
+ cancelWidget.setClassAttr("canceldeletePhase");
+ buttons.add(cancelWidget);
add(buttons, ColumnPanel.CENTER | ColumnPanel.FULL_WIDTH);
@@ -99,7 +105,7 @@ class DeletePhaseForm extends CMSForm
*/
@Override
public boolean isCancelled(final PageState state) {
- return m_cancelWidget.isSelected(state);
+ return cancelWidget.isSelected(state);
}
/**
@@ -112,8 +118,9 @@ class DeletePhaseForm extends CMSForm
@Override
public final void process(final FormSectionEvent event)
throws FormProcessException {
+
final FormData data = event.getFormData();
- final Long key = (Long) data.get(m_id.getName());
+ final Long key = (Long) data.get(selectedPhaseDefId.getName());
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
final PhaseDefinititionRepository phaseDefRepo = cdiUtil.findBean(
@@ -138,9 +145,10 @@ class DeletePhaseForm extends CMSForm
final FormData data = event.getFormData();
final PageState state = event.getPageState();
- final Long id = m_phase.getPhase(state).getDefinitionId();
+ final Long phaseDefId = selectedPhaseDef.getPhase(state)
+ .getDefinitionId();
- data.put(m_id.getName(), id);
+ data.put(selectedPhaseDefId.getName(), phaseDefId);
}
}
diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/lifecycle/EditPhaseForm.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/lifecycle/EditPhaseForm.java
index 2271e199c..d92fd7ef7 100755
--- a/ccm-cms/src/main/java/com/arsdigita/cms/ui/lifecycle/EditPhaseForm.java
+++ b/ccm-cms/src/main/java/com/arsdigita/cms/ui/lifecycle/EditPhaseForm.java
@@ -49,9 +49,11 @@ import org.libreccm.cdi.utils.CdiUtil;
import org.libreccm.configuration.ConfigurationManager;
import org.librecms.CmsConstants;
import org.librecms.contentsection.privileges.AdminPrivileges;
-import org.librecms.lifecycle.PhaseDefinititionRepository;
+import org.librecms.lifecycle.LifecycleDefinition;
+import java.util.List;
import java.util.Locale;
+import java.util.Optional;
/**
* This class contains a form component to edit a lifecycle phase definition.
@@ -63,7 +65,6 @@ import java.util.Locale;
*/
class EditPhaseForm extends CMSForm {
- private final static String PHASE_ID = "id";
private final static String LABEL = "label";
private final static String DESCRIPTION = "description";
private final static String DELAY_DAYS = "delay_days";
@@ -75,18 +76,19 @@ class EditPhaseForm extends CMSForm {
private final static String SUBMIT = "submit";
private final static String CANCEL = "cancel";
- private final PhaseRequestLocal m_phase;
+ private final LifecycleDefinitionRequestLocal selectedLifecycle;
+ private final PhaseRequestLocal selectedPhase;
- private final TextField m_label;
- private final TextArea m_description;
- private final TextField m_delayDays;
- private final TextField m_delayHours;
- private final TextField m_delayMinutes;
- private final TextField m_durDays;
- private final TextField m_durHours;
- private final TextField m_durMinutes;
- private final Submit m_submit;
- private final Submit m_cancel;
+ private final TextField phaseLabel;
+ private final TextArea phaseDescription;
+ private final TextField delayDays;
+ private final TextField delayHours;
+ private final TextField delayMinutes;
+ private final TextField durationDays;
+ private final TextField durationHours;
+ private final TextField durationMinutes;
+ private final Submit submit;
+ private final Submit cancel;
/**
* Constructor.
@@ -96,100 +98,106 @@ class EditPhaseForm extends CMSForm {
*
* @pre phases != null
*/
- public EditPhaseForm(final PhaseRequestLocal phase) {
+ public EditPhaseForm(
+ final LifecycleDefinitionRequestLocal selectedLifecycle,
+ final PhaseRequestLocal selectedPhase) {
+
super("EditPhaseDefinition");
- m_phase = phase;
+ this.selectedLifecycle = selectedLifecycle;
+ this.selectedPhase = selectedPhase;
add(new Label());
add(new FormErrorDisplay(this));
- add(new Label(gz("cms.ui.name")));
- m_label = new TextField(new TrimmedStringParameter(LABEL));
- m_label.addValidationListener(new NotEmptyValidationListener());
- m_label.setSize(40);
- m_label.setMaxLength(1000);
- add(m_label);
+ add(new Label(gz("cms.ui.lifecycle.phase.name")));
+ phaseLabel = new TextField(new TrimmedStringParameter(LABEL));
+ phaseLabel.addValidationListener(new NotEmptyValidationListener());
+ phaseLabel.setSize(40);
+ phaseLabel.setMaxLength(1000);
+ add(phaseLabel);
- add(new Label(gz("cms.ui.description")));
- m_description = new TextArea(new TrimmedStringParameter(DESCRIPTION));
- m_description.addValidationListener(new StringLengthValidationListener(
- 4000));
- m_description.setCols(40);
- m_description.setRows(5);
- m_description.setWrap(TextArea.SOFT);
- add(m_description);
+ add(new Label(gz("cms.ui.lifecycle.phase.description")));
+ phaseDescription = new TextArea(new TrimmedStringParameter(DESCRIPTION));
+ phaseDescription.addValidationListener(
+ new StringLengthValidationListener(
+ 4000));
+ phaseDescription.setCols(40);
+ phaseDescription.setRows(5);
+ phaseDescription.setWrap(TextArea.SOFT);
+ add(phaseDescription);
// Phase duration
// Max value: days: 60 years, hours: 7 days, minutes: 1 day
- m_delayDays = new TextField(new IntegerParameter(DELAY_DAYS));
- m_delayDays.addValidationListener(new NumberInRangeValidationListener(0,
- 21900));
- m_delayDays.setSize(7);
- m_delayDays.setClassAttr("DaysField");
-
- m_delayHours = new TextField(new IntegerParameter(DELAY_HOURS));
- m_delayHours.addValidationListener(
- new NumberInRangeValidationListener(0, 168));
- m_delayHours.setClassAttr("HoursField");
- m_delayHours.setSize(7);
-
- m_delayMinutes = new TextField(new IntegerParameter(DELAY_MINUTES));
- m_delayMinutes.addValidationListener(
- new NumberInRangeValidationListener(0, 1440));
- m_delayMinutes.setSize(7);
- m_delayMinutes.setClassAttr("MinutesField");
-
- add(new Label(new GlobalizedMessage("cms.ui.lifecycle.start_delay",
- CmsConstants.CMS_BUNDLE)));
- SimpleContainer de = new SimpleContainer();
- de.add(new Label(gz("cms.ui.lifecycle.phase_days")));
- de.add(m_delayDays);
- de.add(new Label(gz("cms.ui.lifecycle.phase_hours")));
- de.add(m_delayHours);
- de.add(new Label(gz("cms.ui.lifecycle.phase_mins")));
- de.add(m_delayMinutes);
- add(de);
-
- // Phase duration
- // Max value: days: 60 years, hours: 7 days, minutes: 1 day
- m_durDays = new TextField(new IntegerParameter(DURATION_DAYS));
- m_durDays.addValidationListener(new NumberInRangeValidationListener(0,
+ delayDays = new TextField(new IntegerParameter(DELAY_DAYS));
+ delayDays.addValidationListener(new NumberInRangeValidationListener(0,
21900));
- m_durDays.setSize(7);
- m_durDays.setClassAttr("DaysField");
+ delayDays.setSize(7);
+ delayDays.setClassAttr("DaysField");
- m_durHours = new TextField(new IntegerParameter(DURATION_HOURS));
- m_durHours.addValidationListener(new NumberInRangeValidationListener(0,
- 168));
- m_durHours.setSize(7);
- m_durHours.setClassAttr("HoursField");
+ delayHours = new TextField(new IntegerParameter(DELAY_HOURS));
+ delayHours.addValidationListener(
+ new NumberInRangeValidationListener(0, 168));
+ delayHours.setClassAttr("HoursField");
+ delayHours.setSize(7);
- m_durMinutes = new TextField(new IntegerParameter(DURATION_MINUTES));
- m_durMinutes.addValidationListener(
+ delayMinutes = new TextField(new IntegerParameter(DELAY_MINUTES));
+ delayMinutes.addValidationListener(
new NumberInRangeValidationListener(0, 1440));
- m_durMinutes.setSize(7);
- m_durMinutes.setClassAttr("MinutesField");
+ delayMinutes.setSize(7);
+ delayMinutes.setClassAttr("MinutesField");
- add(new Label(gz("cms.ui.lifecycle.duration")));
- SimpleContainer du = new SimpleContainer();
- du.add(new Label(gz("cms.ui.lifecycle.phase_days")));
- du.add(m_durDays);
- du.add(new Label(gz("cms.ui.lifecycle.phase_hours")));
- du.add(m_durHours);
- du.add(new Label(gz("cms.ui.lifecycle.phase_mins")));
- du.add(m_durMinutes);
- add(du);
+ add(new Label(
+ new GlobalizedMessage("cms.ui.lifecycle.phase_start_delay",
+ CmsConstants.CMS_BUNDLE)));
+ final SimpleContainer delayContainer = new SimpleContainer();
+ delayContainer.add(new Label(gz("cms.ui.lifecycle.phase_days")));
+ delayContainer.add(delayDays);
+ delayContainer.add(new Label(gz("cms.ui.lifecycle.phase_hours")));
+ delayContainer.add(delayHours);
+ delayContainer.add(new Label(gz("cms.ui.lifecycle.phase_minutes")));
+ delayContainer.add(delayMinutes);
+ add(delayContainer);
+
+ // Phase duration
+ // Max value: days: 60 years, hours: 7 days, minutes: 1 day
+ durationDays = new TextField(new IntegerParameter(DURATION_DAYS));
+ durationDays.addValidationListener(
+ new NumberInRangeValidationListener(0,
+ 21900));
+ durationDays.setSize(7);
+ durationDays.setClassAttr("DaysField");
+
+ durationHours = new TextField(new IntegerParameter(DURATION_HOURS));
+ durationHours.addValidationListener(new NumberInRangeValidationListener(
+ 0,
+ 168));
+ durationHours.setSize(7);
+ durationHours.setClassAttr("HoursField");
+
+ durationMinutes = new TextField(new IntegerParameter(DURATION_MINUTES));
+ durationMinutes.addValidationListener(
+ new NumberInRangeValidationListener(0, 1440));
+ durationMinutes.setSize(7);
+ durationMinutes.setClassAttr("MinutesField");
+
+ add(new Label(gz("cms.ui.lifecycle.phase_duration")));
+ final SimpleContainer durationContainer = new SimpleContainer();
+ durationContainer.add(new Label(gz("cms.ui.lifecycle.phase_days")));
+ durationContainer.add(durationDays);
+ durationContainer.add(new Label(gz("cms.ui.lifecycle.phase_hours")));
+ durationContainer.add(durationHours);
+ durationContainer.add(new Label(gz("cms.ui.lifecycle.phase_minutes")));
+ durationContainer.add(durationMinutes);
+ add(durationContainer);
// Submit and cancel buttons
- SimpleContainer s = new SimpleContainer();
- m_submit = new Submit(SUBMIT);
- m_submit.setButtonLabel("Edit Phase");
- s.add(m_submit);
- m_cancel = new Submit(CANCEL);
- m_cancel.setButtonLabel("Cancel");
- s.add(m_cancel);
- add(s, ColumnPanel.FULL_WIDTH | ColumnPanel.CENTER);
+ final SimpleContainer submitCancelContainer = new SimpleContainer();
+ submit = new Submit(SUBMIT, gz("cms.ui.lifecycle.phase.edit_submit"));
+ submitCancelContainer.add(submit);
+ cancel = new Submit(CANCEL, gz("cms.ui.lifecycle.phase.edit_cancel"));
+ submitCancelContainer.add(cancel);
+ add(submitCancelContainer, ColumnPanel.FULL_WIDTH | ColumnPanel.CENTER);
// Add form listeners.
addInitListener(new FormInitListener() {
@@ -240,7 +248,7 @@ class EditPhaseForm extends CMSForm {
*/
@Override
public boolean isCancelled(final PageState state) {
- return m_cancel.isSelected(state);
+ return cancel.isSelected(state);
}
/**
@@ -253,21 +261,27 @@ class EditPhaseForm extends CMSForm {
*/
private void initializePhaseDefinition(final PageState state)
throws FormProcessException {
- PhaseDefinition pd = m_phase.getPhase(state);
- m_label.setValue(state, pd.getLabel());
- m_description.setValue(state, pd.getDescription());
- long[] delay = Duration.formatDHM(pd.getDefaultDelay());
- m_delayDays.setValue(state, delay[0]);
- m_delayHours.setValue(state, delay[1]);
- m_delayMinutes.setValue(state, delay[2]);
+ final Locale defaultLocale = KernelConfig.getConfig().getDefaultLocale();
- Long duration = pd.getDefaultDuration();
- if (duration != null) {
- Long[] dhm = Duration.formatDHM(duration);
- m_durDays.setValue(state, dhm[0]);
- m_durHours.setValue(state, dhm[1]);
- m_durMinutes.setValue(state, dhm[2]);
+ final PhaseDefinition phaseDef = selectedPhase.getPhase(state);
+ phaseLabel.setValue(state, phaseDef.getLabel().getValue(defaultLocale));
+ phaseDescription.setValue(state,
+ phaseDef
+ .getDescription()
+ .getValue(defaultLocale));
+
+ final long[] delay = Duration.formatDHM(phaseDef.getDefaultDelay());
+ delayDays.setValue(state, delay[0]);
+ delayHours.setValue(state, delay[1]);
+ delayMinutes.setValue(state, delay[2]);
+
+ final Long duration = phaseDef.getDefaultDuration();
+ if (duration != 0) {
+ final Long[] dhm = Duration.formatDHM(duration);
+ durationDays.setValue(state, dhm[0]);
+ durationHours.setValue(state, dhm[1]);
+ durationMinutes.setValue(state, dhm[2]);
}
}
@@ -281,31 +295,40 @@ class EditPhaseForm extends CMSForm {
private void updatePhaseDefinition(final PageState state)
throws FormProcessException {
- final String label = (String) m_label.getValue(state);
- final String description = (String) m_description.getValue(state);
- final Integer delayDays = (Integer) m_delayDays.getValue(state);
- final Integer delayHours = (Integer) m_delayHours.getValue(state);
- final Integer delayMinutes = (Integer) m_delayMinutes.getValue(state);
- final Integer durDays = (Integer) m_durDays.getValue(state);
- final Integer durHours = (Integer) m_durHours.getValue(state);
- final Integer durMinutes = (Integer) m_durMinutes.getValue(state);
+ final String label = (String) phaseLabel.getValue(state);
+ final String description = (String) phaseDescription.getValue(state);
+ final int delDays = (int) Optional
+ .ofNullable(delayDays.getValue(state))
+ .orElseGet(() -> 0);
+ final int delHours = (int) Optional
+ .ofNullable(delayHours.getValue(state))
+ .orElseGet(() -> 0);;
+ final int delMinutes = (int) Optional
+ .ofNullable(delayMinutes.getValue(state))
+ .orElseGet(() -> 0);;
+ final int durDays = (int) Optional
+ .ofNullable(durationDays.getValue(state))
+ .orElseGet(() -> 0);;
+ final int durHours = (int) Optional
+ .ofNullable(durationHours.getValue(state))
+ .orElseGet(() -> 0);;
+ final int durMinutes = (int) Optional
+ .ofNullable(durationMinutes.getValue(state))
+ .orElseGet(() -> 0);;
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
- final ConfigurationManager confManager = cdiUtil.findBean(
- ConfigurationManager.class);
- final PhaseDefinititionRepository phaseDefRepo = cdiUtil.findBean(
- PhaseDefinititionRepository.class);
- final KernelConfig kernelConfig = confManager.findConfiguration(
- KernelConfig.class);
- final Locale defaultLocale = kernelConfig.getDefaultLocale();
+ final LifecycleAdminPaneController controller = cdiUtil
+ .findBean(LifecycleAdminPaneController.class);
- final PhaseDefinition phaseDefinition = m_phase.getPhase(state);
- phaseDefinition.getLabel().addValue(defaultLocale, label);
- phaseDefinition.getDescription().addValue(defaultLocale, description);
- phaseDefinition.setDefaultDelay(delayDays * delayHours * delayMinutes
- * 60);
- phaseDefinition.setDefaultDuration(durDays * durHours * durMinutes * 60);
- phaseDefRepo.save(phaseDefinition);
+ controller.updatePhaseDefinition(selectedPhase.getPhase(state),
+ label,
+ description,
+ delDays,
+ delHours,
+ delMinutes,
+ durDays,
+ durHours,
+ durMinutes);
}
/**
@@ -318,24 +341,46 @@ class EditPhaseForm extends CMSForm {
*/
private void validateUniqueName(final PageState state)
throws FormProcessException {
- final String newLabel = (String) m_label.getValue(state);
-// PhaseDefinition pd = m_phase.getPhase(state);
-// PhaseDefinitionCollection phaseDefs = pd.getLifecycleDefinition()
-// .getPhaseDefinitions();
-//
-// // If the name has changed, check for uniqueness.
-// if (!pd.getLabel().equalsIgnoreCase(newLabel)) {
-// while (phaseDefs.next()) {
-// PhaseDefinition phaseDef = phaseDefs.getPhaseDefinition();
-//
-// if (phaseDef.getLabel().equalsIgnoreCase(newLabel)) {
-// phaseDefs.close();
-// throw new FormProcessException(GlobalizationUtil.globalize(
-// "cms.ui.lifecycle.phase_name_not_unique"));
-// }
-// }
-// }
+ final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
+ final ConfigurationManager confManager = cdiUtil.findBean(
+ ConfigurationManager.class);
+ final KernelConfig kernelConfig = confManager.findConfiguration(
+ KernelConfig.class);
+ final Locale defaultLocale = kernelConfig.getDefaultLocale();
+
+ final String oldLabel = selectedPhase
+ .getPhase(state)
+ .getLabel()
+ .getValue(defaultLocale);
+ final String newLabel = (String) phaseLabel.getValue(state);
+
+ if (oldLabel.equals(newLabel)) {
+ //Label has node changed, no validation required.
+ return;
+ }
+
+ final LifecycleDefinition cycleDef = selectedLifecycle
+ .getLifecycleDefinition(state);
+ final LifecycleAdminPaneController controller = cdiUtil
+ .findBean(LifecycleAdminPaneController.class);
+ final List phaseDefs = controller
+ .getPhaseDefinitions(cycleDef);
+
+
+
+ final boolean duplicateLabel = phaseDefs
+ .stream()
+ .map(phaseDef -> phaseDef.getLabel().getValue(defaultLocale))
+ .anyMatch(phaseDefLabel -> {
+ return phaseDefLabel.equalsIgnoreCase(newLabel);
+ });
+
+ if (duplicateLabel) {
+ throw new FormProcessException(new GlobalizedMessage(
+ "cms.ui.lifecycle.phase_name_not_unique",
+ CmsConstants.CMS_BUNDLE));
+ }
}
/**
@@ -343,13 +388,14 @@ class EditPhaseForm extends CMSForm {
*
* @param state The page state
*
- * @pre state != null
+ *
*/
private void validateDuration(final PageState state)
throws FormProcessException {
- final Integer durDays = (Integer) m_durDays.getValue(state);
- final Integer durHours = (Integer) m_durHours.getValue(state);
- final Integer durMinutes = (Integer) m_durMinutes.getValue(state);
+
+ final Integer durDays = (Integer) durationDays.getValue(state);
+ final Integer durHours = (Integer) durationHours.getValue(state);
+ final Integer durMinutes = (Integer) durationMinutes.getValue(state);
// Phase duration is infinite, so the duration is valid.
if (durDays == null && durHours == null && durMinutes == null) {
@@ -357,22 +403,22 @@ class EditPhaseForm extends CMSForm {
}
int days, hours, minutes;
- if (durDays != null) {
- days = durDays.intValue();
- } else {
+ if (durDays == null) {
days = 0;
+ } else {
+ days = durDays;
}
- if (durHours != null) {
- hours = durHours.intValue();
- } else {
+ if (durHours == null) {
hours = 0;
+ } else {
+ hours = durHours;
}
- if (durMinutes != null) {
- minutes = durMinutes.intValue();
- } else {
+ if (durMinutes == null) {
minutes = 0;
+ } else {
+ minutes = durMinutes;
}
if ((days + hours + minutes) == 0) {
@@ -386,8 +432,4 @@ class EditPhaseForm extends CMSForm {
return new GlobalizedMessage(key, CmsConstants.CMS_BUNDLE);
}
- private static String lz(final String key) {
- return (String) gz(key).localize();
- }
-
}
diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/lifecycle/ItemLifecycleSelectForm.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/lifecycle/ItemLifecycleSelectForm.java
index a5ed7f146..0b85fe247 100755
--- a/ccm-cms/src/main/java/com/arsdigita/cms/ui/lifecycle/ItemLifecycleSelectForm.java
+++ b/ccm-cms/src/main/java/com/arsdigita/cms/ui/lifecycle/ItemLifecycleSelectForm.java
@@ -40,7 +40,6 @@ import com.arsdigita.bebop.parameters.DateParameter;
import com.arsdigita.bebop.parameters.IntegerParameter;
import com.arsdigita.bebop.parameters.NumberInRangeValidationListener;
import com.arsdigita.cms.CMS;
-import com.arsdigita.cms.ContentCenter;
import com.arsdigita.cms.ui.BaseForm;
import com.arsdigita.cms.ui.ContentItemPage;
import com.arsdigita.cms.ui.item.ContentItemRequestLocal;
@@ -51,15 +50,12 @@ import com.arsdigita.mail.Mail;
import com.arsdigita.util.UncheckedWrapperException;
import com.arsdigita.web.RedirectSignal;
import com.arsdigita.web.URL;
-import com.arsdigita.web.Web;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.arsdigita.cms.CMSConfig;
import org.libreccm.cdi.utils.CdiUtil;
import org.libreccm.l10n.GlobalizationHelper;
-import org.libreccm.notification.Notification;
-import org.libreccm.security.Party;
import org.libreccm.security.Shiro;
import org.libreccm.security.User;
import org.libreccm.security.UserRepository;
@@ -74,13 +70,11 @@ import org.librecms.contentsection.ContentItem;
import org.librecms.contentsection.ContentItemManager;
import org.librecms.contentsection.ContentItemRepository;
import org.librecms.contentsection.ContentSection;
-import org.librecms.contentsection.ContentSectionConfig;
import org.librecms.contentsection.privileges.ItemPrivileges;
import org.librecms.lifecycle.Lifecycle;
import org.librecms.lifecycle.LifecycleDefinition;
import org.librecms.lifecycle.LifecycleDefinitionRepository;
import org.librecms.lifecycle.LifecycleManager;
-import org.librecms.lifecycle.LifecycleRepository;
import org.librecms.lifecycle.Phase;
import org.librecms.lifecycle.PhaseDefinition;
import org.librecms.lifecycle.PhaseRepository;
@@ -91,10 +85,7 @@ import org.librecms.workflow.CmsTaskType;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.io.Writer;
-import java.math.BigDecimal;
-import java.math.BigInteger;
import java.util.Calendar;
-import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.TimeZone;
diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/lifecycle/LifecycleAddForm.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/lifecycle/LifecycleAddForm.java
index 4b06c44be..85dd00c5e 100755
--- a/ccm-cms/src/main/java/com/arsdigita/cms/ui/lifecycle/LifecycleAddForm.java
+++ b/ccm-cms/src/main/java/com/arsdigita/cms/ui/lifecycle/LifecycleAddForm.java
@@ -24,18 +24,9 @@ import com.arsdigita.bebop.SingleSelectionModel;
import com.arsdigita.bebop.event.FormProcessListener;
import com.arsdigita.bebop.event.FormSectionEvent;
import com.arsdigita.cms.CMS;
-import com.arsdigita.kernel.KernelConfig;
-import org.apache.logging.log4j.LogManager;
-import org.librecms.contentsection.ContentSection;
import org.librecms.lifecycle.LifecycleDefinition;
-import org.apache.logging.log4j.Logger;
import org.libreccm.cdi.utils.CdiUtil;
-import org.libreccm.configuration.ConfigurationManager;
-import org.librecms.contentsection.ContentSectionManager;
-import org.librecms.lifecycle.LifecycleDefinitionRepository;
-
-import java.util.Locale;
/**
* @author Michael Pih
@@ -46,16 +37,15 @@ import java.util.Locale;
*/
class LifecycleAddForm extends BaseLifecycleForm {
- private static final Logger LOGGER = LogManager.getLogger(LifecycleAddForm.class);
+ private final SingleSelectionModel selectedLifecycle;
- private final SingleSelectionModel m_model;
-
- LifecycleAddForm(final SingleSelectionModel model) {
+ LifecycleAddForm(final SingleSelectionModel selectedLifecycle) {
super("LifecycleDefinition", gz("cms.ui.lifecycle.add"));
- m_model = model;
+ this.selectedLifecycle = selectedLifecycle;
- m_name.addValidationListener(new NameUniqueListener(null));
+ getLifecycleName().addValidationListener(
+ new LifecycleNameUniqueListener(this));
addProcessListener(new ProcessListener());
}
@@ -63,35 +53,22 @@ class LifecycleAddForm extends BaseLifecycleForm {
private class ProcessListener implements FormProcessListener {
@Override
- public final void process(final FormSectionEvent e)
+ public final void process(final FormSectionEvent event)
throws FormProcessException {
- final PageState state = e.getPageState();
+
+ final PageState state = event.getPageState();
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
- final ConfigurationManager confManager = cdiUtil.findBean(
- ConfigurationManager.class);
- final LifecycleDefinitionRepository lifecycleDefRepo = cdiUtil.findBean(
- LifecycleDefinitionRepository.class);
- final ContentSectionManager sectionManager = cdiUtil.findBean(
- ContentSectionManager.class);
- final KernelConfig kernelConfig = confManager.findConfiguration(
- KernelConfig.class);
- final Locale defaultLocale = kernelConfig.getDefaultLocale();
+ final LifecycleAdminPaneController controller = cdiUtil
+ .findBean(LifecycleAdminPaneController.class);
- final LifecycleDefinition definition = new LifecycleDefinition();
+ final LifecycleDefinition definition = controller
+ .createLifecycleDefinition(
+ CMS.getContext().getContentSection(),
+ (String) getLifecycleName().getValue(state),
+ (String) getLifecycleDescription().getValue(state));
- definition.getLabel().addValue(defaultLocale,
- (String) m_name.getValue(state));
- definition.getDescription().addValue(
- defaultLocale,
- (String) m_description.getValue(state));
- lifecycleDefRepo.save(definition);
-
- final ContentSection section = CMS.getContext().getContentSection();
- sectionManager.addLifecycleDefinitionToContentSection(definition,
- section);
-
- m_model.setSelectedKey(state,
- definition.getDefinitionId());
+ selectedLifecycle.setSelectedKey(state,
+ definition.getDefinitionId());
}
}
diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/lifecycle/LifecycleAdminPane.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/lifecycle/LifecycleAdminPane.java
index 76b758bf1..7f67c82b9 100755
--- a/ccm-cms/src/main/java/com/arsdigita/cms/ui/lifecycle/LifecycleAdminPane.java
+++ b/ccm-cms/src/main/java/com/arsdigita/cms/ui/lifecycle/LifecycleAdminPane.java
@@ -32,48 +32,42 @@ import com.arsdigita.cms.ui.BaseAdminPane;
import com.arsdigita.cms.ui.BaseDeleteForm;
import com.arsdigita.cms.ui.FormSecurityListener;
-import org.apache.logging.log4j.LogManager;
-import org.apache.logging.log4j.Logger;
import org.libreccm.cdi.utils.CdiUtil;
-import org.librecms.contentsection.ContentSectionManager;
import org.librecms.contentsection.privileges.AdminPrivileges;
import org.librecms.lifecycle.LifecycleDefinitionRepository;
-
/**
* This class contains the split pane for the lifecycle administration
* interface.
*
-
+ *
* @author Michael Pih
* @author Jack Chung
* @author Justin Ross
-* @author Jens Pelzetter
+ * @author Jens Pelzetter
*/
public class LifecycleAdminPane extends BaseAdminPane {
- private static Logger LOGGER = LogManager.getLogger(LifecycleAdminPane.class);
-
- private final SingleSelectionModel m_model;
- private final LifecycleDefinitionRequestLocal m_definition;
+ private final SingleSelectionModel selectionModel;
+ private final LifecycleDefinitionRequestLocal selectionLifecycleDefinition;
public LifecycleAdminPane() {
super(new Label(gz("cms.ui.lifecycles")),
new LifecycleListModelBuilder());
- m_model = getSelectionModel();
- m_definition = new SelectionRequestLocal();
+ selectionModel = getSelectionModel();
+ selectionLifecycleDefinition = new SelectionRequestLocal();
// XXX secvis
//add(new LifecycleAdminContainer(m_addLink));
setAdd(gz("cms.ui.lifecycle.add"),
- new LifecycleAddForm(m_model));
+ new LifecycleAddForm(selectionModel));
setEdit(gz("cms.ui.lifecycle.edit"),
- new LifecycleEditForm(m_definition));
+ new LifecycleEditForm(selectionLifecycleDefinition));
setDelete(gz("cms.ui.lifecycle.delete"), new DeleteForm());
setIntroPane(new Label(gz("cms.ui.lifecycle.intro")));
- setItemPane(new LifecycleItemPane(m_definition,
+ setItemPane(new LifecycleItemPane(selectionLifecycleDefinition,
getEditLink(),
getDeleteLink()));
@@ -85,7 +79,7 @@ public class LifecycleAdminPane extends BaseAdminPane {
@Override
protected final Object initialValue(final PageState state) {
- final String id = m_model.getSelectedKey(state).toString();
+ final String id = selectionModel.getSelectedKey(state).toString();
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
final LifecycleDefinitionRepository lifecycleDefRepo = cdiUtil
@@ -105,24 +99,21 @@ public class LifecycleAdminPane extends BaseAdminPane {
AdminPrivileges.ADMINISTER_LIFECYLES));
}
+ @Override
public final void process(final FormSectionEvent event)
throws FormProcessException {
+
final PageState state = event.getPageState();
final ContentSection section = CMS.getContext().getContentSection();
- final LifecycleDefinition definition = m_definition
+ final LifecycleDefinition definition = selectionLifecycleDefinition
.getLifecycleDefinition(state);
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
- final ContentSectionManager sectionManager = cdiUtil.findBean(
- ContentSectionManager.class);
- final LifecycleDefinitionRepository lifecycleDefRepo = cdiUtil
- .findBean(LifecycleDefinitionRepository.class);
+ final LifecycleAdminPaneController controller = cdiUtil
+ .findBean(LifecycleAdminPaneController.class);
+ controller.deleteLifecycleDefinition(definition, section);
- sectionManager.removeLifecycleDefinitionFromContentSection(
- definition, section);
- lifecycleDefRepo.delete(definition);
-
- m_model.clearSelection(state);
+ selectionModel.clearSelection(state);
}
}
diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/lifecycle/LifecycleAdminPaneController.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/lifecycle/LifecycleAdminPaneController.java
new file mode 100644
index 000000000..89353fdfc
--- /dev/null
+++ b/ccm-cms/src/main/java/com/arsdigita/cms/ui/lifecycle/LifecycleAdminPaneController.java
@@ -0,0 +1,296 @@
+/*
+ * Copyright (C) 2017 LibreCCM Foundation.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ * MA 02110-1301 USA
+ */
+package com.arsdigita.cms.ui.lifecycle;
+
+import com.arsdigita.kernel.KernelConfig;
+
+import org.libreccm.configuration.ConfigurationManager;
+import org.librecms.contentsection.ContentSection;
+import org.librecms.contentsection.ContentSectionManager;
+import org.librecms.contentsection.ContentSectionRepository;
+import org.librecms.lifecycle.LifecycleDefinition;
+import org.librecms.lifecycle.LifecycleDefinitionRepository;
+import org.librecms.lifecycle.PhaseDefinition;
+import org.librecms.lifecycle.PhaseDefinititionRepository;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Locale;
+import java.util.Objects;
+
+import javax.enterprise.context.RequestScoped;
+import javax.inject.Inject;
+import javax.transaction.Transactional;
+
+/**
+ *
+ * @author Jens Pelzetter
+ */
+@RequestScoped
+class LifecycleAdminPaneController {
+
+ @Inject
+ private ConfigurationManager confManager;
+
+ @Inject
+ private ContentSectionRepository sectionRepo;
+
+ @Inject
+ private ContentSectionManager sectionManager;
+
+ @Inject
+ private LifecycleDefinitionRepository lifecycleDefRepo;
+
+ @Inject
+ private PhaseDefinititionRepository phaseDefRepo;
+
+ @Transactional(Transactional.TxType.REQUIRED)
+ public List getLifecyclesForContentSection(
+ final ContentSection section) {
+
+ final ContentSection contentSection = sectionRepo
+ .findById(section.getObjectId())
+ .orElseThrow(() -> new IllegalArgumentException(String.format(
+ "No ContentSection with ID %d in the database. "
+ + "Where did that ID come from?",
+ section.getObjectId())));
+
+ return new ArrayList<>(contentSection.getLifecycleDefinitions());
+
+ }
+
+ /**
+ * Create a new lifecycle definition
+ *
+ * @param section The content section which the
+ * {@link LifecycleDefinition} is created.
+ * @param name The name of the new lifecycle definition.
+ * @param description The description of the new lifecycle definition.
+ */
+ @Transactional(Transactional.TxType.REQUIRED)
+ public LifecycleDefinition createLifecycleDefinition(
+ final ContentSection section,
+ final String name,
+ final String description) {
+
+ Objects.requireNonNull(section, "ContentSection can't be null.");
+ Objects.requireNonNull(name, "Name can't be null");
+ if (name.trim().isEmpty()) {
+ throw new IllegalArgumentException("Name can't be empty.");
+ }
+
+ final KernelConfig kernelConfig = confManager
+ .findConfiguration(KernelConfig.class);
+ final Locale defaultLocale = kernelConfig.getDefaultLocale();
+
+ final ContentSection contentSection = sectionRepo
+ .findById(section.getObjectId())
+ .orElseThrow(() -> new IllegalArgumentException(String.format(
+ "No ContentSection with ID %d in the database. "
+ + "Where did that ID come from?",
+ section.getObjectId())));
+
+ final LifecycleDefinition definition = new LifecycleDefinition();
+
+ definition.getLabel().addValue(defaultLocale, name);
+ definition.getDescription().addValue(defaultLocale, description);
+ lifecycleDefRepo.save(definition);
+
+ sectionManager.addLifecycleDefinitionToContentSection(definition,
+ contentSection);
+
+ return definition;
+ }
+
+ /**
+ * Update the name and/or description of a {@link LifecycleDefinition}.
+ *
+ * @param definition The definition to update.
+ * @param name The new name.
+ * @param description The new description.
+ */
+ @Transactional(Transactional.TxType.REQUIRED)
+ public void updateLifecycleDefinition(final LifecycleDefinition definition,
+ final String name,
+ final String description) {
+
+ Objects.requireNonNull(definition, "definition can't be null.");
+ Objects.requireNonNull(name, "name can't be null");
+ if (name.trim().isEmpty()) {
+ throw new IllegalArgumentException("Name can't be empty.");
+ }
+
+ final LifecycleDefinition lifecycleDefinition = lifecycleDefRepo
+ .findById(definition.getDefinitionId())
+ .orElseThrow(() -> new IllegalArgumentException(String.format(
+ "No LifecycleDefinition with ID %d in the database. "
+ + "Where did that ID come from?",
+ definition.getDefinitionId())));
+
+ final KernelConfig kernelConfig = confManager
+ .findConfiguration(KernelConfig.class);
+ final Locale defaultLocale = kernelConfig.getDefaultLocale();
+
+ if (!lifecycleDefinition.getLabel().getValue(defaultLocale).equals(name)) {
+ lifecycleDefinition.getLabel().addValue(defaultLocale, name);
+ }
+
+ if (!lifecycleDefinition.getDescription().getValue(defaultLocale)
+ .equals(description)) {
+ lifecycleDefinition.getDescription().addValue(defaultLocale,
+ description);
+ }
+
+ lifecycleDefRepo.save(lifecycleDefinition);
+ }
+
+ @Transactional(Transactional.TxType.REQUIRED)
+ public void deleteLifecycleDefinition(
+ final LifecycleDefinition definition,
+ final ContentSection section) {
+
+ Objects.requireNonNull(definition, "definition can't be null.");
+
+ final LifecycleDefinition lifecycleDefinition = lifecycleDefRepo
+ .findById(definition.getDefinitionId())
+ .orElseThrow(() -> new IllegalArgumentException(String.format(
+ "No LifecycleDefinition with ID %d in the database. "
+ + "Where did that ID come from?",
+ definition.getDefinitionId())));
+ final ContentSection contentSection = sectionRepo
+ .findById(section.getObjectId())
+ .orElseThrow(() -> new IllegalArgumentException(String.format(
+ "No ContentSection with ID %d in the database. "
+ + "Where did that ID come from?",
+ section.getObjectId())));
+
+ sectionManager.removeLifecycleDefinitionFromContentSection(
+ lifecycleDefinition,
+ contentSection);
+ lifecycleDefRepo.delete(lifecycleDefinition);
+ }
+
+ @Transactional(Transactional.TxType.REQUIRED)
+ public List getPhaseDefinitions(
+ final LifecycleDefinition definition) {
+
+ Objects.requireNonNull(definition);
+
+ final LifecycleDefinition lifecycleDefinition = lifecycleDefRepo
+ .findById(definition.getDefinitionId())
+ .orElseThrow(() -> new IllegalArgumentException(String.format(
+ "No LifecycleDefinition with ID %d in the database. "
+ + "Where did that ID come from?",
+ definition.getDefinitionId())));
+
+ return new ArrayList<>(lifecycleDefinition.getPhaseDefinitions());
+ }
+
+ @Transactional(Transactional.TxType.REQUIRED)
+ public void addPhaseDefinition(final LifecycleDefinition definition,
+ final String label,
+ final String description,
+ final int delayDays,
+ final int delayHours,
+ final int delayMinutes,
+ final int durationDays,
+ final int durationHours,
+ final int durationMinutes) {
+
+ Objects.requireNonNull(definition, "definition can't be null");
+ Objects.requireNonNull(label, "label can't be null");
+ if (label.trim().isEmpty()) {
+ throw new IllegalArgumentException(String.format(
+ "label can't be empty."));
+ }
+
+ final LifecycleDefinition lifecycleDefinition = lifecycleDefRepo
+ .findById(definition.getDefinitionId())
+ .orElseThrow(() -> new IllegalArgumentException(String.format(
+ "No LifecycleDefinition with ID %d in the database. "
+ + "Where did that ID come from?",
+ definition.getDefinitionId())));
+
+ final KernelConfig kernelConfig = confManager
+ .findConfiguration(KernelConfig.class);
+ final Locale defaultLocale = kernelConfig.getDefaultLocale();
+
+ final PhaseDefinition phaseDefinition = new PhaseDefinition();
+ lifecycleDefinition.addPhaseDefinition(phaseDefinition);
+
+ phaseDefinition.getLabel().addValue(defaultLocale, label);
+ phaseDefinition.getDescription().addValue(defaultLocale, description);
+ int delay = delayDays * 24 * 60 * 60;
+ delay += delayHours * 60 * 60;
+ delay += delayMinutes * 60;
+ phaseDefinition.setDefaultDelay(delay);
+ int duration = durationDays * 24 * 60 * 60;
+ duration += durationHours * 60 * 60;
+ duration += durationMinutes * 60;
+ phaseDefinition.setDefaultDuration(duration);
+
+ phaseDefRepo.save(phaseDefinition);
+ lifecycleDefRepo.save(lifecycleDefinition);
+ }
+
+ @Transactional(Transactional.TxType.REQUIRED)
+ public void updatePhaseDefinition(final PhaseDefinition definition,
+ final String label,
+ final String description,
+ final int delayDays,
+ final int delayHours,
+ final int delayMinutes,
+ final int durationDays,
+ final int durationHours,
+ final int durationMinutes) {
+
+ Objects.requireNonNull(definition, "definition can't be null");
+ Objects.requireNonNull(label, "label can't be null");
+ if (label.trim().isEmpty()) {
+ throw new IllegalArgumentException(String.format(
+ "label can't be empty."));
+ }
+
+ final PhaseDefinition phaseDefinition = phaseDefRepo
+ .findById(definition.getDefinitionId())
+ .orElseThrow(() -> new IllegalArgumentException(String.format(
+ "No PhaseDefinition with ID %d in the database. "
+ + "Where did that ID come from?",
+ definition.getDefinitionId())));
+
+ final KernelConfig kernelConfig = confManager
+ .findConfiguration(KernelConfig.class);
+ final Locale defaultLocale = kernelConfig.getDefaultLocale();
+
+ phaseDefinition.getLabel().addValue(defaultLocale, label);
+ phaseDefinition.getDescription().addValue(defaultLocale, description);
+ int delay = delayDays * 24 * 60 * 60;
+ delay += delayHours * 60 * 60;
+ delay += delayMinutes * 60;
+ phaseDefinition.setDefaultDelay(delay);
+ int duration = durationDays * 24 * 60 * 60;
+ duration += durationHours * 60 * 60;
+ duration += durationMinutes * 60;
+ phaseDefinition.setDefaultDuration(duration);
+
+ phaseDefRepo.save(phaseDefinition);
+
+ }
+
+}
diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/lifecycle/LifecycleDefinitionRequestLocal.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/lifecycle/LifecycleDefinitionRequestLocal.java
index 74ab0d03b..4f4a6c91a 100755
--- a/ccm-cms/src/main/java/com/arsdigita/cms/ui/lifecycle/LifecycleDefinitionRequestLocal.java
+++ b/ccm-cms/src/main/java/com/arsdigita/cms/ui/lifecycle/LifecycleDefinitionRequestLocal.java
@@ -23,11 +23,19 @@ import com.arsdigita.bebop.RequestLocal;
import org.librecms.lifecycle.LifecycleDefinition;
+import java.util.Optional;
+
public abstract class LifecycleDefinitionRequestLocal extends RequestLocal {
public final LifecycleDefinition getLifecycleDefinition(
final PageState state) {
- return (LifecycleDefinition) get(state);
+
+ @SuppressWarnings("unchecked")
+ final Optional definition
+ = (Optional) get(
+ state);
+
+ return definition.get();
}
}
diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/lifecycle/LifecycleEditForm.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/lifecycle/LifecycleEditForm.java
index 45f1c3ad1..325a56b11 100755
--- a/ccm-cms/src/main/java/com/arsdigita/cms/ui/lifecycle/LifecycleEditForm.java
+++ b/ccm-cms/src/main/java/com/arsdigita/cms/ui/lifecycle/LifecycleEditForm.java
@@ -23,16 +23,9 @@ import com.arsdigita.bebop.PageState;
import com.arsdigita.bebop.event.FormInitListener;
import com.arsdigita.bebop.event.FormProcessListener;
import com.arsdigita.bebop.event.FormSectionEvent;
-import com.arsdigita.kernel.KernelConfig;
-import org.apache.logging.log4j.LogManager;
import org.librecms.lifecycle.LifecycleDefinition;
-import org.apache.logging.log4j.Logger;
import org.libreccm.cdi.utils.CdiUtil;
-import org.libreccm.configuration.ConfigurationManager;
-import org.librecms.lifecycle.LifecycleDefinitionRepository;
-
-import java.util.Locale;
/**
* This class contains a form component to edit a lifecycle definition.
@@ -40,20 +33,19 @@ import java.util.Locale;
* @author Jack Chung
* @author Xixi D'Moon <xdmoon@redhat.com>
* @author Justin Ross <jross@redhat.com>
+ * @author Jens Pelzetter
*/
class LifecycleEditForm extends BaseLifecycleForm {
- private static final Logger LOGGER = LogManager.getLogger(
- LifecycleEditForm.class);
+ private final LifecycleDefinitionRequestLocal selectedDefinition;
- private final LifecycleDefinitionRequestLocal m_definition;
-
- LifecycleEditForm(final LifecycleDefinitionRequestLocal definition) {
+ LifecycleEditForm(final LifecycleDefinitionRequestLocal selectedDefinition) {
super("LifecycleEdit", gz("cms.ui.lifecycle.edit"));
- m_definition = definition;
+ this.selectedDefinition = selectedDefinition;
- m_name.addValidationListener(new NameUniqueListener(m_definition));
+ getLifecycleName().addValidationListener(
+ new LifecycleNameUniqueListener(this, selectedDefinition));
addInitListener(new InitListener());
addProcessListener(new ProcessListener());
@@ -61,13 +53,14 @@ class LifecycleEditForm extends BaseLifecycleForm {
private class InitListener implements FormInitListener {
- public final void init(final FormSectionEvent e) {
- final PageState state = e.getPageState();
- final LifecycleDefinition cycle = m_definition
+ @Override
+ public final void init(final FormSectionEvent event) {
+ final PageState state = event.getPageState();
+ final LifecycleDefinition cycle = selectedDefinition
.getLifecycleDefinition(state);
- m_name.setValue(state, cycle.getLabel());
- m_description.setValue(state, cycle.getDescription());
+ getLifecycleName().setValue(state, cycle.getLabel());
+ getLifecycleDescription().setValue(state, cycle.getDescription());
}
}
@@ -78,24 +71,17 @@ class LifecycleEditForm extends BaseLifecycleForm {
public final void process(final FormSectionEvent event)
throws FormProcessException {
final PageState state = event.getPageState();
- final LifecycleDefinition definition = m_definition
+ final LifecycleDefinition definition = selectedDefinition
.getLifecycleDefinition(state);
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
- final ConfigurationManager confManager = cdiUtil.findBean(
- ConfigurationManager.class);
- final LifecycleDefinitionRepository lifecycleDefRepo = cdiUtil
- .findBean(LifecycleDefinitionRepository.class);
- final KernelConfig kernelConfig = confManager.findConfiguration(
- KernelConfig.class);
- final Locale defaultLocale = kernelConfig.getDefaultLocale();
+ final LifecycleAdminPaneController controller = cdiUtil
+ .findBean(LifecycleAdminPaneController.class);
- definition.getLabel().addValue(defaultLocale,
- (String) m_name.getValue(state));
- definition.getDescription().addValue(
- defaultLocale,
- (String) m_description.getValue(state));
- lifecycleDefRepo.save(definition);
+ controller.updateLifecycleDefinition(
+ definition,
+ (String) getLifecycleName().getValue(state),
+ (String) getLifecycleDescription().getValue(state));
}
}
diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/lifecycle/LifecycleItemPane.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/lifecycle/LifecycleItemPane.java
index 03bc1acd8..39b5e4976 100755
--- a/ccm-cms/src/main/java/com/arsdigita/cms/ui/lifecycle/LifecycleItemPane.java
+++ b/ccm-cms/src/main/java/com/arsdigita/cms/ui/lifecycle/LifecycleItemPane.java
@@ -60,34 +60,38 @@ import java.util.Locale;
*/
class LifecycleItemPane extends BaseItemPane {
- private final LifecycleDefinitionRequestLocal m_cycle;
- private final PhaseRequestLocal m_phase;
+ private final LifecycleDefinitionRequestLocal selectedLifecycle;
+ private final PhaseRequestLocal selectedPhase;
- private final Container m_detailPane;
- private final Table m_phases;
+ private final Container detailPane;
+ private final Table phasesTable;
- public LifecycleItemPane(final LifecycleDefinitionRequestLocal cycle,
- final ActionLink editLink,
- final ActionLink deleteLink) {
- m_cycle = cycle;
- m_phase = new SelectionRequestLocal();
+ public LifecycleItemPane(
+ final LifecycleDefinitionRequestLocal selectedLifecycle,
+ final ActionLink editLink,
+ final ActionLink deleteLink) {
- m_phases = new PhaseTable();
+ this.selectedLifecycle = selectedLifecycle;
+ selectedPhase = new SelectionRequestLocal();
- m_detailPane = new SimpleContainer();
- add(m_detailPane);
- setDefault(m_detailPane);
+ phasesTable = new PhaseTable();
- m_detailPane.add(new SummarySection(editLink, deleteLink));
+ detailPane = new SimpleContainer();
+ add(detailPane);
+ setDefault(detailPane);
+
+ detailPane.add(new SummarySection(editLink, deleteLink));
final ActionLink phaseAddLink = new ActionLink(new Label(gz(
"cms.ui.lifecycle.phase_add")));
- m_detailPane.add(new PhaseSection(phaseAddLink));
+ detailPane.add(new PhaseSection(phaseAddLink));
- final AddPhaseForm phaseAddForm = new AddPhaseForm(m_cycle);
- final EditPhaseForm phaseEditForm = new EditPhaseForm(m_phase);
- final DeletePhaseForm phaseDeleteForm = new DeletePhaseForm(m_phase);
+ final AddPhaseForm phaseAddForm = new AddPhaseForm(selectedLifecycle);
+ final EditPhaseForm phaseEditForm = new EditPhaseForm(selectedLifecycle,
+ selectedPhase);
+ final DeletePhaseForm phaseDeleteForm = new DeletePhaseForm(
+ selectedPhase);
add(phaseAddForm);
add(phaseEditForm);
@@ -95,17 +99,17 @@ class LifecycleItemPane extends BaseItemPane {
connect(phaseAddLink, phaseAddForm);
connect(phaseAddForm);
- connect(m_phases, 4, phaseEditForm);
- connect(phaseEditForm, m_phases.getRowSelectionModel());
- connect(m_phases, 5, phaseDeleteForm);
- connect(phaseDeleteForm, m_phases.getRowSelectionModel());
+ connect(phasesTable, 4, phaseEditForm);
+ connect(phaseEditForm, phasesTable.getRowSelectionModel());
+ connect(phasesTable, 5, phaseDeleteForm);
+ connect(phaseDeleteForm, phasesTable.getRowSelectionModel());
}
private class SelectionRequestLocal extends PhaseRequestLocal {
@Override
protected final Object initialValue(final PageState state) {
- final String id = m_phases.getRowSelectionModel().getSelectedKey(
+ final String id = phasesTable.getRowSelectionModel().getSelectedKey(
state).toString();
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
@@ -136,7 +140,8 @@ class LifecycleItemPane extends BaseItemPane {
private class Properties extends PropertyList {
@Override
- protected final java.util.List properties(final PageState state) {
+ protected final java.util.List properties(
+ final PageState state) {
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
final ConfigurationManager confManager = cdiUtil.findBean(
@@ -145,15 +150,15 @@ class LifecycleItemPane extends BaseItemPane {
KernelConfig.class);
final Locale defaultLocale = kernelConfig.getDefaultLocale();
- final java.util.List props = super.properties(state);
- final LifecycleDefinition cycle = m_cycle
+ final java.util.List props = super.properties(state);
+ final LifecycleDefinition cycle = selectedLifecycle
.getLifecycleDefinition(state);
props.add(new Property(
- gz("cms.ui.name"),
+ gz("cms.ui.lifecycle.name"),
cycle.getLabel().getValue(defaultLocale)));
props.add(new Property(
- gz("cms.ui.description"),
+ gz("cms.ui.lifecycle.description"),
cycle.getDescription().getValue(defaultLocale)));
return props;
@@ -171,7 +176,7 @@ class LifecycleItemPane extends BaseItemPane {
final ActionGroup group = new ActionGroup();
setBody(group);
- group.setSubject(m_phases);
+ group.setSubject(phasesTable);
group.addAction(new LifecycleAdminContainer(addLink),
ActionGroup.ADD);
}
@@ -179,9 +184,9 @@ class LifecycleItemPane extends BaseItemPane {
}
// XXX fix this
- private static final String[] s_headers = {
- lz("cms.ui.name"),
- lz("cms.ui.description"),
+ private static final String[] HEADERS = {
+ lz("cms.ui.lifecycle.phase.name"),
+ lz("cms.ui.lifecycle.phase.description"),
lz("cms.ui.lifecycle.phase_delay"),
lz("cms.ui.lifecycle.phase_duration"),
"",
@@ -191,7 +196,7 @@ class LifecycleItemPane extends BaseItemPane {
private class PhaseTable extends Table {
public PhaseTable() {
- super(new PhaseTableModelBuilder(m_cycle), s_headers);
+ super(new PhaseTableModelBuilder(selectedLifecycle), HEADERS);
setEmptyView(new Label(gz("cms.ui.lifecycle.phase_none")));
@@ -235,7 +240,7 @@ class LifecycleItemPane extends BaseItemPane {
public final void reset(final PageState state) {
super.reset(state);
- m_phases.clearSelection(state);
+ phasesTable.clearSelection(state);
}
}
diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/lifecycle/LifecycleListModelBuilder.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/lifecycle/LifecycleListModelBuilder.java
index e8fc8763e..c247ce148 100755
--- a/ccm-cms/src/main/java/com/arsdigita/cms/ui/lifecycle/LifecycleListModelBuilder.java
+++ b/ccm-cms/src/main/java/com/arsdigita/cms/ui/lifecycle/LifecycleListModelBuilder.java
@@ -22,13 +22,23 @@ import com.arsdigita.bebop.PageState;
import com.arsdigita.bebop.list.ListModel;
import com.arsdigita.bebop.list.ListModelBuilder;
import com.arsdigita.cms.CMS;
+import com.arsdigita.kernel.KernelConfig;
+
import org.librecms.contentsection.ContentSection;
+
import com.arsdigita.util.LockableImpl;
+
+import org.libreccm.cdi.utils.CdiUtil;
+
import java.util.List;
import java.util.NoSuchElementException;
+
import org.librecms.lifecycle.LifecycleDefinition;
+import java.util.Iterator;
+import java.util.Locale;
+
/**
* Loads all the current lifecycles from the database so that they may be
* displayed in a list.
@@ -38,45 +48,48 @@ import org.librecms.lifecycle.LifecycleDefinition;
* @author Jens Pelzetter
*/
public final class LifecycleListModelBuilder extends LockableImpl
- implements ListModelBuilder {
+ implements ListModelBuilder {
@Override
public final ListModel makeModel(final com.arsdigita.bebop.List list,
final PageState state) {
- return new Model(state);
+ final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
+ final LifecycleAdminPaneController controller = cdiUtil
+ .findBean(LifecycleAdminPaneController.class);
+ final ContentSection section = CMS.getContext().getContentSection();
+ return new Model(controller.getLifecyclesForContentSection(section));
}
private class Model implements ListModel {
- private final List m_cycles;
- private int index = -1;
+ private final Iterator iterator;
+ private LifecycleDefinition currentLifecycleDef;
+ private final Locale defaultLocale;
- public Model(final PageState state) {
- m_cycles = getCollection(state);
+ public Model(final List lifecycles) {
+ iterator = lifecycles.iterator();
+ defaultLocale = KernelConfig.getConfig().getDefaultLocale();
}
-
- private List getCollection(final PageState state) {
- final ContentSection section = CMS.getContext().getContentSection();
-
- final List cycles = section.getLifecycleDefinitions();
-
- return cycles;
- }
-
- @Override
+ @Override
public boolean next() throws NoSuchElementException {
- index++;
- return index < m_cycles.size();
+ if (iterator.hasNext()) {
+ currentLifecycleDef = iterator.next();
+ return true;
+ } else {
+ return false;
+ }
}
@Override
public Object getElement() {
- return m_cycles.get(index).getLabel();
+ return currentLifecycleDef.getLabel().getValue(defaultLocale);
}
@Override
public String getKey() {
- return Long.toString(m_cycles.get(index).getDefinitionId());
+ return Long.toString(currentLifecycleDef.getDefinitionId());
}
+
}
+
}
diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/lifecycle/LifecycleNameUniqueListener.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/lifecycle/LifecycleNameUniqueListener.java
new file mode 100644
index 000000000..68f98a238
--- /dev/null
+++ b/ccm-cms/src/main/java/com/arsdigita/cms/ui/lifecycle/LifecycleNameUniqueListener.java
@@ -0,0 +1,89 @@
+/*
+ * Copyright (C) 2017 LibreCCM Foundation.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ * MA 02110-1301 USA
+ */
+package com.arsdigita.cms.ui.lifecycle;
+
+import com.arsdigita.bebop.FormProcessException;
+import com.arsdigita.bebop.PageState;
+import com.arsdigita.bebop.event.ParameterEvent;
+import com.arsdigita.bebop.event.ParameterListener;
+import com.arsdigita.cms.CMS;
+import com.arsdigita.globalization.GlobalizedMessage;
+import com.arsdigita.kernel.KernelConfig;
+
+import org.libreccm.cdi.utils.CdiUtil;
+import org.libreccm.configuration.ConfigurationManager;
+import org.librecms.CmsConstants;
+import org.librecms.lifecycle.LifecycleDefinition;
+
+import java.util.Locale;
+
+/**
+ *
+ * @author Jens Pelzetter
+ */
+class LifecycleNameUniqueListener implements ParameterListener {
+
+ private final BaseLifecycleForm form;
+ private final LifecycleDefinitionRequestLocal selectedDefinition;
+
+ protected LifecycleNameUniqueListener(final BaseLifecycleForm form) {
+ this.form = form;
+ selectedDefinition = null;
+ }
+
+ protected LifecycleNameUniqueListener(
+ final BaseLifecycleForm form,
+ final LifecycleDefinitionRequestLocal selectedDefinition) {
+
+ this.form = form;
+ this.selectedDefinition = selectedDefinition;
+ }
+
+ @Override
+ public final void validate(final ParameterEvent event)
+ throws FormProcessException {
+
+ final PageState state = event.getPageState();
+ final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
+ final ConfigurationManager confManager = cdiUtil
+ .findBean(ConfigurationManager.class);
+ final LifecycleAdminPaneController controller = cdiUtil
+ .findBean(LifecycleAdminPaneController.class);
+ final KernelConfig kernelConfig = confManager
+ .findConfiguration(KernelConfig.class);
+ final Locale defaultLocale = kernelConfig.getDefaultLocale();
+ final String label = (String) form.getLifecycleName().getValue(state);
+
+ final java.util.List definitions = controller
+ .getLifecyclesForContentSection(CMS.getContext().getContentSection());
+
+ for (final LifecycleDefinition definition : definitions) {
+ if (definition.getLabel().getValue(defaultLocale)
+ .equalsIgnoreCase(label)
+ && (selectedDefinition == null
+ || !selectedDefinition.getLifecycleDefinition(state)
+ .equals(definition))) {
+ throw new FormProcessException(new GlobalizedMessage(
+ "cms.ui.lifecycle.name_not_unique",
+ CmsConstants.CMS_BUNDLE));
+ }
+ }
+ }
+
+}
diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/lifecycle/PhaseRequestLocal.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/lifecycle/PhaseRequestLocal.java
index f3bd3da6d..94179a569 100755
--- a/ccm-cms/src/main/java/com/arsdigita/cms/ui/lifecycle/PhaseRequestLocal.java
+++ b/ccm-cms/src/main/java/com/arsdigita/cms/ui/lifecycle/PhaseRequestLocal.java
@@ -23,10 +23,14 @@ import com.arsdigita.bebop.RequestLocal;
import org.librecms.lifecycle.PhaseDefinition;
+import java.util.Optional;
+
public abstract class PhaseRequestLocal extends RequestLocal {
public final PhaseDefinition getPhase(final PageState state) {
- return (PhaseDefinition) get(state);
+ @SuppressWarnings("unchecked")
+ final Optional phaseDef = (Optional) get(state);
+ return phaseDef.get();
}
}
diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/lifecycle/PhaseTableModelBuilder.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/lifecycle/PhaseTableModelBuilder.java
index c899f6230..9a09655e1 100755
--- a/ccm-cms/src/main/java/com/arsdigita/cms/ui/lifecycle/PhaseTableModelBuilder.java
+++ b/ccm-cms/src/main/java/com/arsdigita/cms/ui/lifecycle/PhaseTableModelBuilder.java
@@ -28,37 +28,45 @@ import org.librecms.lifecycle.LifecycleDefinition;
import org.librecms.lifecycle.PhaseDefinition;
import com.arsdigita.globalization.GlobalizedMessage;
-import com.arsdigita.util.Assert;
+import com.arsdigita.kernel.KernelConfig;
import com.arsdigita.util.LockableImpl;
-import org.arsdigita.cms.CMSConfig;
+import org.libreccm.cdi.utils.CdiUtil;
import org.librecms.CmsConstants;
+import java.util.Iterator;
import java.util.List;
class PhaseTableModelBuilder extends LockableImpl
- implements TableModelBuilder {
- private final LifecycleDefinitionRequestLocal cycle;
+ implements TableModelBuilder {
- public PhaseTableModelBuilder
- (final LifecycleDefinitionRequestLocal cycle) {
- this.cycle = cycle;
+ private final LifecycleDefinitionRequestLocal selectedLifecycle;
+
+ public PhaseTableModelBuilder(
+ final LifecycleDefinitionRequestLocal selectedLifecycle) {
+ this.selectedLifecycle = selectedLifecycle;
}
@Override
public final TableModel makeModel(final Table table,
final PageState state) {
- return new PhaseTableModel(cycle.getLifecycleDefinition(state));
+
+ final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
+ final LifecycleAdminPaneController controller = cdiUtil
+ .findBean(LifecycleAdminPaneController.class);
+ final LifecycleDefinition definition = selectedLifecycle
+ .getLifecycleDefinition(state);
+
+ return new PhaseTableModel(controller.getPhaseDefinitions(definition));
}
private static class PhaseTableModel implements TableModel {
-
- private final List phases;
- private int index = -1;
- private PhaseDefinition phase;
- public PhaseTableModel(final LifecycleDefinition cycle) {
- phases = cycle.getPhaseDefinitions();
+ private final Iterator iterator;
+ private PhaseDefinition currentPhaseDef;
+
+ public PhaseTableModel(final List phaseDefinitions) {
+ iterator = phaseDefinitions.iterator();
}
@Override
@@ -68,10 +76,8 @@ class PhaseTableModelBuilder extends LockableImpl
@Override
public final boolean nextRow() {
- index++;
- if (index < phases.size()) {
- phase = phases.get(index);
-
+ if (iterator.hasNext()) {
+ currentPhaseDef = iterator.next();
return true;
} else {
return false;
@@ -80,40 +86,45 @@ class PhaseTableModelBuilder extends LockableImpl
@Override
public final Object getElementAt(final int column) {
- Assert.exists(phase, "PhaseDefinition m_phase");
switch (column) {
- case 0:
- return phase.getLabel();
- case 1:
- return phase.getDescription();
- case 2:
- return Duration.formatDuration(phase.getDefaultDelay());
- case 3:
- final Long duration = phase.getDefaultDuration();
+ case 0:
+ return currentPhaseDef
+ .getLabel()
+ .getValue(KernelConfig.getConfig().getDefaultLocale());
+ case 1:
+ return currentPhaseDef
+ .getDescription()
+ .getValue(KernelConfig.getConfig().getDefaultLocale());
+ case 2:
+ return Duration.formatDuration(currentPhaseDef
+ .getDefaultDelay());
+ case 3:
+ final Long duration = currentPhaseDef.getDefaultDuration();
- if (duration == null) {
- return lz("cms.ui.lifecycle.forever");
- } else {
- return Duration.formatDuration(duration);
- }
- case 4:
- return lz("cms.ui.lifecycle.phase_edit");
- case 5:
- return lz("cms.ui.lifecycle.phase_delete");
- default:
- throw new IllegalStateException();
+ if (duration == 0) {
+ return lz("cms.ui.lifecycle.forever");
+ } else {
+ return Duration.formatDuration(duration);
+ }
+ case 4:
+ return lz("cms.ui.lifecycle.phase_edit");
+ case 5:
+ return lz("cms.ui.lifecycle.phase_delete");
+ default:
+ throw new IllegalStateException();
}
}
@Override
- public Object getKeyAt(int columnIndex) {
- if (phase == null) {
+ public Object getKeyAt(final int columnIndex) {
+ if (currentPhaseDef == null) {
throw new IllegalStateException();
} else {
- return phase.getDefinitionId();
+ return currentPhaseDef.getDefinitionId();
}
}
+
}
private static GlobalizedMessage gz(final String key) {
@@ -123,4 +134,5 @@ class PhaseTableModelBuilder extends LockableImpl
private static String lz(final String key) {
return (String) gz(key).localize();
}
+
}
diff --git a/ccm-cms/src/main/java/org/librecms/lifecycle/LifecycleDefinition.java b/ccm-cms/src/main/java/org/librecms/lifecycle/LifecycleDefinition.java
index f8ffc5ebe..35c931de6 100644
--- a/ccm-cms/src/main/java/org/librecms/lifecycle/LifecycleDefinition.java
+++ b/ccm-cms/src/main/java/org/librecms/lifecycle/LifecycleDefinition.java
@@ -195,15 +195,11 @@ public class LifecycleDefinition implements Serializable {
+ "definitionId = %d, "
+ "label = %s, "
+ "description = %s, "
- + "defaultListener = \"%s\", "
- + "phaseDefinitions = { %s }%s"
+ " }",
super.toString(),
definitionId,
Objects.toString(label),
Objects.toString(description),
- defaultListener,
- Objects.toString(phaseDefinitions),
data);
}
diff --git a/ccm-cms/src/main/resources/org/librecms/CmsResources.properties b/ccm-cms/src/main/resources/org/librecms/CmsResources.properties
index 9bb64435e..9d30b13d6 100644
--- a/ccm-cms/src/main/resources/org/librecms/CmsResources.properties
+++ b/ccm-cms/src/main/resources/org/librecms/CmsResources.properties
@@ -181,3 +181,43 @@ cms.ui.workflow.task.role.none=This task has not been assigned to any roles
cms.ui.workflow.task.role.add=Assign this task to a role
cms.ui.workflow.task.role.delete=Remove
cms.ui.workflow.task.role.name=Role
+cms.ui.lifecycle.intro=Select an existing lifecycle or create a new one
+cms.ui.lifecycle.add=Create new lifecycle
+cms.ui.lifecycle.name=Name
+cms.ui.lifecycle.description=Description
+cms.ui.lifecycle.details=Lifecycle details
+cms.ui.category.delete_category=Delete category
+cms.ui.category.edit_links=Edit links
+cms.ui.category.add_a_subcategory=Add a subcategory
+cms.ui.category.current_category=Current category
+cms.ui.category.extreme_actions=Delete
+cms.ui.category.category_purposes=Category purpose
+cms.ui.category.category_information=Details
+cms.ui.category.linked_categories=Linked categories
+cms.ui.category.restore_default_permissions=Restore default permissions
+cms.ui.category.return_to_category_info=Back to category info
+cms.ui.lifecycle.edit=Edit lifecycle
+cms.ui.lifecycle.delete=Delete lifecycle
+cms.ui.lifecycle.delete_prompt=Are you sure to delete this lifecycle?
+cms.ui.lifecycle.phases=Phases
+cms.ui.lifecycle.phase_none=This lifecycle has no phases
+cms.ui.lifecycle.phase_add=Add phase
+cms.ui.lifecycle.phase.name=Name
+cms.ui.lifecycle.phase.description=Description
+cms.ui.lifecycle.phase_start_delay=Start delay
+cms.ui.lifecycle.phase_days=Days
+cms.ui.lifecycle.phase_hours=Hours
+cms.ui.lifecycle.phase_minutes=Minutes
+cms.ui.lifecycle.phase_duration=Duration
+cms.ui.lifecycle.phase.add_submit=Add phase
+cms.ui.lifecycle.phase.add_cancel=Cancel
+cms.ui.lifecycle.phase_duration_negative=The duration must be greater than zero
+cms.ui.lifecycle.phase_name_not_unique=There is already a phase with this name
+cms.ui.lifecycle.phase_delay=Delay
+cms.ui.lifecycle.phase_edit=Edit
+cms.ui.lifecycle.phase_delete=Delete
+cms.ui.lifecycle.forever=Forever
+cms.ui.lifecycle.phase.edit_submit=Save
+cms.ui.lifecycle.phase.edit_cancel=Cancel
+cms.ui.lifecycle.phase.delete_submit=Delete
+cms.ui.lifecycle.phase.delete_cancel=Cancel
diff --git a/ccm-cms/src/main/resources/org/librecms/CmsResources_de.properties b/ccm-cms/src/main/resources/org/librecms/CmsResources_de.properties
index 680816bbf..8854ccd0d 100644
--- a/ccm-cms/src/main/resources/org/librecms/CmsResources_de.properties
+++ b/ccm-cms/src/main/resources/org/librecms/CmsResources_de.properties
@@ -180,3 +180,43 @@ cms.ui.workflow.task.role.none=Diese Aufgabe ist keiner Rolle zugeordnet
cms.ui.workflow.task.role.add=Diese Aufgabe einer Rolle zuordnen
cms.ui.workflow.task.role.delete=Entfernen
cms.ui.workflow.task.role.name=Rolle
+cms.ui.lifecycle.intro=Einen Ver\u00f6ffentlichungszyklus ausw\u00e4hlen oder neu erstellen
+cms.ui.lifecycle.add=Neuen Ver\u00f6ffentlichungszyklus erstellen
+cms.ui.lifecycle.name=Name
+cms.ui.lifecycle.description=Beschreibung
+cms.ui.lifecycle.details=Ver\u00f6ffentlichungszyklus Details
+cms.ui.category.delete_category=Kategorie l\u00f6schen
+cms.ui.category.edit_links=Links bearbeiten
+cms.ui.category.add_a_subcategory=Unterkateogorie hinzuf\u00fcgen
+cms.ui.category.current_category=Aktuelle Kategorie
+cms.ui.category.extreme_actions=L\u00f6schen
+cms.ui.category.category_purposes=Category purpose
+cms.ui.category.category_information=Details
+cms.ui.category.linked_categories=Verlinkte Kategorien
+cms.ui.category.restore_default_permissions=Berechtigungen zur\u00fccksetzen
+cms.ui.category.return_to_category_info=Zur\u00fcck zu den Details
+cms.ui.lifecycle.edit=Ver\u00f6ffentlichungszyklus bearbeiten
+cms.ui.lifecycle.delete=Ver\u00f6ffentlichungszyklus l\u00f6schen
+cms.ui.lifecycle.delete_prompt=Sind Sie sicher, dass Sie den ausgew\u00e4hlten Ver\u00f6ffentlichungszyklus l\u00f6schen wollen?
+cms.ui.lifecycle.phases=Phasen
+cms.ui.lifecycle.phase_none=Dieser Ver\u00f6ffentlichungszyklus hat keine Phasen
+cms.ui.lifecycle.phase_add=Phase hinzuf\u00fcgen
+cms.ui.lifecycle.phase.name=Name
+cms.ui.lifecycle.phase.description=Beschreibung
+cms.ui.lifecycle.phase_start_delay=Beginn verz\u00f6gert um
+cms.ui.lifecycle.phase_days=Tage
+cms.ui.lifecycle.phase_hours=Stunden
+cms.ui.lifecycle.phase_minutes=Minuten
+cms.ui.lifecycle.phase_duration=Dauer
+cms.ui.lifecycle.phase.add_submit=Phase hinzuf\u00fcgen
+cms.ui.lifecycle.phase.add_cancel=Abbrechen
+cms.ui.lifecycle.phase_duration_negative=Die Dauer muss gr\u00f6\u00dfer als Null sein
+cms.ui.lifecycle.phase_name_not_unique=Es gibt bereits eine Phase mit diesem Namen
+cms.ui.lifecycle.phase_delay=Verz\u00f6gerung
+cms.ui.lifecycle.phase_edit=Bearbeiten
+cms.ui.lifecycle.phase_delete=L\u00f6schen
+cms.ui.lifecycle.forever=Unbegrenzt
+cms.ui.lifecycle.phase.edit_submit=Speichern
+cms.ui.lifecycle.phase.edit_cancel=Abbrechen
+cms.ui.lifecycle.phase.delete_submit=L\u00f6schen
+cms.ui.lifecycle.phase.delete_cancel=Abbrechen
diff --git a/ccm-cms/src/main/resources/org/librecms/CmsResources_fr.properties b/ccm-cms/src/main/resources/org/librecms/CmsResources_fr.properties
index 5f8ac4f3f..b5d264211 100644
--- a/ccm-cms/src/main/resources/org/librecms/CmsResources_fr.properties
+++ b/ccm-cms/src/main/resources/org/librecms/CmsResources_fr.properties
@@ -149,3 +149,33 @@ cms.ui.workflow.task.role.none=This task has not been assigned to any roles
cms.ui.workflow.task.role.add=Assign this task to a role
cms.ui.workflow.task.role.delete=Remove
cms.ui.workflow.task.role.name=Role
+cms.ui.lifecycle.intro=Select an existing lifecycle or create a new one
+cms.ui.lifecycle.add=Create new lifecycle
+cms.ui.lifecycle.name=Name
+cms.ui.lifecycle.description=Description
+cms.ui.lifecycle.details=Lifecycle details
+cms.ui.lifecycle.edit=Edit lifecycle
+cms.ui.lifecycle.delete=Delete lifecycle
+cms.ui.lifecycle.delete_prompt=Are you sure to delete this lifecycle?
+cms.ui.lifecycle.phases=Phases
+cms.ui.lifecycle.phase_none=This lifecycle has no phases
+cms.ui.lifecycle.phase_add=Add phase
+cms.ui.lifecycle.phase.name=Name
+cms.ui.lifecycle.phase.description=Description
+cms.ui.lifecycle.phase_start_delay=Start delay
+cms.ui.lifecycle.phase_days=Days
+cms.ui.lifecycle.phase_hours=Hours
+cms.ui.lifecycle.phase_minutes=Minutes
+cms.ui.lifecycle.phase_duration=Duration
+cms.ui.lifecycle.phase.add_submit=Add phase
+cms.ui.lifecycle.phase.add_cancel=Cancel
+cms.ui.lifecycle.phase_duration_negative=The duration must be greater than zero
+cms.ui.lifecycle.phase_name_not_unique=There is already a phase with this name
+cms.ui.lifecycle.phase_delay=Delay
+cms.ui.lifecycle.phase_edit=Edit
+cms.ui.lifecycle.phase_delete=Delete
+cms.ui.lifecycle.forever=Forever
+cms.ui.lifecycle.phase.edit_submit=Save
+cms.ui.lifecycle.phase.edit_cancel=Cancel
+cms.ui.lifecycle.phase.delete_submit=Delete
+cms.ui.lifecycle.phase.delete_cancel=Cancel