CCM NG/ccm-cms: Lifecycles tab

git-svn-id: https://svn.libreccm.org/ccm/ccm_ng@4634 8810af33-2d31-482b-a856-94f89814c4df

Former-commit-id: 965d6d3ce1
pull/2/head
jensp 2017-03-17 16:42:06 +00:00
parent 8318eca7cf
commit c0ffc3ccea
19 changed files with 1103 additions and 651 deletions

View File

@ -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.
@ -68,7 +63,6 @@ import java.util.Locale;
*/
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";
@ -80,19 +74,18 @@ class AddPhaseForm extends CMSForm {
private final static String SUBMIT = "submit";
private final static String CANCEL = "cancel";
private final LifecycleDefinitionRequestLocal m_cycle;
private final LifecycleDefinitionRequestLocal selectedLifecycle;
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 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,112 +94,98 @@ 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;
this.selectedLifecycle = selectedLifecycle;
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"));
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.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(
add(new Label(gz("cms.ui.lifecycle.phase.description")));
phaseDescription = new TextArea(new TrimmedStringParameter(DESCRIPTION));
phaseDescription.addValidationListener(
new StringLengthValidationListener(
4000));
m_description.setCols(40);
m_description.setRows(5);
m_description.setWrap(TextArea.SOFT);
add(m_description);
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");
delayDays.setSize(7);
delayHours.setSize(7);
delayMinutes.setSize(7);
delayDays.setClassAttr("DaysField");
delayHours.setClassAttr("HoursField");
delayMinutes.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);
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");
durationDays.setSize(7);
durationHours.setSize(7);
durationMinutes.setSize(7);
durationDays.setClassAttr("DaysField");
durationHours.setClassAttr("HoursField");
durationMinutes.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);
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);
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());
}
});
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));
@ -225,6 +204,7 @@ class AddPhaseForm extends CMSForm {
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,29 +278,36 @@ 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<PhaseDefinition> 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<PhaseDefinition> 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)) {
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));
}
}
}
/**
* Validate the phase duration. The duration cannot be 0.
@ -347,11 +316,12 @@ 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) {
@ -360,19 +330,19 @@ class AddPhaseForm extends CMSForm {
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;
}
@ -389,8 +359,4 @@ class AddPhaseForm extends CMSForm {
CmsConstants.CMS_BUNDLE);
}
private static String lz(final String key) {
return (String) gz(key).localize();
}
}

View File

@ -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 <a href="mailto:jross@redhat.com">Justin Ross</a>
@ -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<LifecycleDefinition> 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;
}
}

View File

@ -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);
}
}

View File

@ -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(
add(new Label(gz("cms.ui.lifecycle.phase.description")));
phaseDescription = new TextArea(new TrimmedStringParameter(DESCRIPTION));
phaseDescription.addValidationListener(
new StringLengthValidationListener(
4000));
m_description.setCols(40);
m_description.setRows(5);
m_description.setWrap(TextArea.SOFT);
add(m_description);
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,
delayDays = new TextField(new IntegerParameter(DELAY_DAYS));
delayDays.addValidationListener(new NumberInRangeValidationListener(0,
21900));
m_delayDays.setSize(7);
m_delayDays.setClassAttr("DaysField");
delayDays.setSize(7);
delayDays.setClassAttr("DaysField");
m_delayHours = new TextField(new IntegerParameter(DELAY_HOURS));
m_delayHours.addValidationListener(
delayHours = new TextField(new IntegerParameter(DELAY_HOURS));
delayHours.addValidationListener(
new NumberInRangeValidationListener(0, 168));
m_delayHours.setClassAttr("HoursField");
m_delayHours.setSize(7);
delayHours.setClassAttr("HoursField");
delayHours.setSize(7);
m_delayMinutes = new TextField(new IntegerParameter(DELAY_MINUTES));
m_delayMinutes.addValidationListener(
delayMinutes = new TextField(new IntegerParameter(DELAY_MINUTES));
delayMinutes.addValidationListener(
new NumberInRangeValidationListener(0, 1440));
m_delayMinutes.setSize(7);
m_delayMinutes.setClassAttr("MinutesField");
delayMinutes.setSize(7);
delayMinutes.setClassAttr("MinutesField");
add(new Label(new GlobalizedMessage("cms.ui.lifecycle.start_delay",
add(new Label(
new GlobalizedMessage("cms.ui.lifecycle.phase_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);
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
m_durDays = new TextField(new IntegerParameter(DURATION_DAYS));
m_durDays.addValidationListener(new NumberInRangeValidationListener(0,
durationDays = new TextField(new IntegerParameter(DURATION_DAYS));
durationDays.addValidationListener(
new NumberInRangeValidationListener(0,
21900));
m_durDays.setSize(7);
m_durDays.setClassAttr("DaysField");
durationDays.setSize(7);
durationDays.setClassAttr("DaysField");
m_durHours = new TextField(new IntegerParameter(DURATION_HOURS));
m_durHours.addValidationListener(new NumberInRangeValidationListener(0,
durationHours = new TextField(new IntegerParameter(DURATION_HOURS));
durationHours.addValidationListener(new NumberInRangeValidationListener(
0,
168));
m_durHours.setSize(7);
m_durHours.setClassAttr("HoursField");
durationHours.setSize(7);
durationHours.setClassAttr("HoursField");
m_durMinutes = new TextField(new IntegerParameter(DURATION_MINUTES));
m_durMinutes.addValidationListener(
durationMinutes = new TextField(new IntegerParameter(DURATION_MINUTES));
durationMinutes.addValidationListener(
new NumberInRangeValidationListener(0, 1440));
m_durMinutes.setSize(7);
m_durMinutes.setClassAttr("MinutesField");
durationMinutes.setSize(7);
durationMinutes.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(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<PhaseDefinition> 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();
}
}

View File

@ -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;

View File

@ -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<Long> selectedLifecycle;
private final SingleSelectionModel<Long> m_model;
LifecycleAddForm(final SingleSelectionModel<Long> model) {
LifecycleAddForm(final SingleSelectionModel<Long> 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,34 +53,21 @@ 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,
selectedLifecycle.setSelectedKey(state,
definition.getDefinitionId());
}

View File

@ -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 <a href="mailto:jross@redhat.com">Justin Ross</a>
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/
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);
}
}

View File

@ -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 <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/
@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<LifecycleDefinition> 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<PhaseDefinition> 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);
}
}

View File

@ -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<LifecycleDefinition> definition
= (Optional<LifecycleDefinition>) get(
state);
return definition.get();
}
}

View File

@ -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 &lt;xdmoon@redhat.com&gt;
* @author Justin Ross &lt;jross@redhat.com&gt;
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/
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));
}
}

View File

@ -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,
public LifecycleItemPane(
final LifecycleDefinitionRequestLocal selectedLifecycle,
final ActionLink editLink,
final ActionLink deleteLink) {
m_cycle = cycle;
m_phase = new SelectionRequestLocal();
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<Property> 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<Property> 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);
}
}

View File

@ -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.
@ -43,40 +53,43 @@ public final class LifecycleListModelBuilder extends LockableImpl
@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<LifecycleDefinition> m_cycles;
private int index = -1;
private final Iterator<LifecycleDefinition> iterator;
private LifecycleDefinition currentLifecycleDef;
private final Locale defaultLocale;
public Model(final PageState state) {
m_cycles = getCollection(state);
public Model(final List<LifecycleDefinition> lifecycles) {
iterator = lifecycles.iterator();
defaultLocale = KernelConfig.getConfig().getDefaultLocale();
}
private List<LifecycleDefinition> getCollection(final PageState state) {
final ContentSection section = CMS.getContext().getContentSection();
final List<LifecycleDefinition> cycles = section.getLifecycleDefinitions();
return cycles;
}
@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());
}
}
}

View File

@ -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 <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/
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<LifecycleDefinition> 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));
}
}
}
}

View File

@ -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<PhaseDefinition> phaseDef = (Optional<PhaseDefinition>) get(state);
return phaseDef.get();
}
}

View File

@ -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;
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<PhaseDefinition> phases;
private int index = -1;
private PhaseDefinition phase;
private final Iterator<PhaseDefinition> iterator;
private PhaseDefinition currentPhaseDef;
public PhaseTableModel(final LifecycleDefinition cycle) {
phases = cycle.getPhaseDefinitions();
public PhaseTableModel(final List<PhaseDefinition> 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,19 +86,23 @@ 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();
return currentPhaseDef
.getLabel()
.getValue(KernelConfig.getConfig().getDefaultLocale());
case 1:
return phase.getDescription();
return currentPhaseDef
.getDescription()
.getValue(KernelConfig.getConfig().getDefaultLocale());
case 2:
return Duration.formatDuration(phase.getDefaultDelay());
return Duration.formatDuration(currentPhaseDef
.getDefaultDelay());
case 3:
final Long duration = phase.getDefaultDuration();
final Long duration = currentPhaseDef.getDefaultDuration();
if (duration == null) {
if (duration == 0) {
return lz("cms.ui.lifecycle.forever");
} else {
return Duration.formatDuration(duration);
@ -107,13 +117,14 @@ class PhaseTableModelBuilder extends LockableImpl
}
@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();
}
}

View File

@ -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);
}

View File

@ -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

View File

@ -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

View File

@ -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