diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/type/ContentTypeAdminPane.java.off b/ccm-cms/src/main/java/com/arsdigita/cms/ui/type/ContentTypeAdminPane.java similarity index 57% rename from ccm-cms/src/main/java/com/arsdigita/cms/ui/type/ContentTypeAdminPane.java.off rename to ccm-cms/src/main/java/com/arsdigita/cms/ui/type/ContentTypeAdminPane.java index 80862a576..029f34598 100755 --- a/ccm-cms/src/main/java/com/arsdigita/cms/ui/type/ContentTypeAdminPane.java.off +++ b/ccm-cms/src/main/java/com/arsdigita/cms/ui/type/ContentTypeAdminPane.java @@ -30,24 +30,34 @@ import com.arsdigita.bebop.event.ActionListener; import com.arsdigita.bebop.event.FormProcessListener; import com.arsdigita.bebop.event.FormSubmissionListener; import com.arsdigita.cms.CMS; + import org.librecms.contentsection.ContentSection; import org.librecms.contentsection.ContentType; //ToDo import com.arsdigita.cms.SectionTemplateMapping; + import com.arsdigita.cms.ui.BaseAdminPane; import com.arsdigita.cms.ui.BaseDeleteForm; +import com.arsdigita.globalization.GlobalizedMessage; //ToDo insert later import com.arsdigita.cms.ui.ContentSectionPage; + import org.libreccm.core.CcmObject; + import com.arsdigita.kernel.ui.ACSObjectSelectionModel; import com.arsdigita.toolbox.ui.ActionGroup; import com.arsdigita.toolbox.ui.Section; import com.arsdigita.toolbox.ui.Cancellable; + import org.apache.log4j.Logger; +import org.libreccm.cdi.utils.CdiUtil; +import org.librecms.CmsConstants; +import org.librecms.contentsection.ContentSectionManager; +import org.librecms.contentsection.ContentTypeManager; import java.math.BigDecimal; /** - * This class contains the split pane for the ContentType - * administration interface. + * This class contains the split pane for the ContentType administration + * interface. * * @author Jens Pelzetter * @author Jack Chung @@ -57,45 +67,45 @@ import java.math.BigDecimal; */ public final class ContentTypeAdminPane extends BaseAdminPane { - private static final Logger s_log = Logger.getLogger(ContentTypeAdminPane.class); + private static final Logger s_log = Logger.getLogger( + ContentTypeAdminPane.class); private final ACSObjectSelectionModel m_model; private final ContentTypeRequestLocal m_type; /** - * Constructs an admin pane. It is containing - * (a) - * a list of available content types in a - * given content section and adds a link to make additional content types - * available (out of a list of installed, but available in a given content - * section). + * Constructs an admin pane. It is containing (a) a list of available + * content types in a given content section and adds a link to make + * additional content types available (out of a list of installed, but + * available in a given content section). */ public ContentTypeAdminPane() { - + // super(new Label(gz("cms.ui.types")), - new ContentTypeListModelBuilder() ); //list with all Types avail. + new ContentTypeListModelBuilder()); //list with all Types avail. m_model = new ACSObjectSelectionModel(getSelectionModel()); m_type = new SelectionRequestLocal(); - ActionLink addTypeLink = new ActionLink(new Label(gz("cms.ui.type.add"))); + ActionLink addTypeLink + = new ActionLink(new Label(gz("cms.ui.type.add"))); - AddTypeContainer addTypeContainer = new AddTypeContainer(); - getBody().add(addTypeContainer); - getBody().connect(addTypeLink, addTypeContainer); - addTypeLink.addActionListener(addTypeContainer); +// AddTypeContainer addTypeContainer = new AddTypeContainer(); +// getBody().add(addTypeContainer); +// getBody().connect(addTypeLink, addTypeContainer); +// addTypeLink.addActionListener(addTypeContainer); setEdit(new ActionLink(new Label(gz("cms.ui.type.edit"))), new EditType(m_model)); setDelete(new ActionLink(new Label(gz("cms.ui.type.delete"))), - new DeleteForm()); + new DeleteForm()); setIntroPane(new Label(gz("cms.ui.type.intro"))); setItemPane(new ContentTypeItemPane(m_model, - m_type, - getEditLink(), - getDeleteLink())); + m_type, + getEditLink(), + getDeleteLink())); addAction(new TypeSecurityContainer(addTypeLink), ActionGroup.ADD); } @@ -107,8 +117,8 @@ public final class ContentTypeAdminPane extends BaseAdminPane { page.addActionListener(new ActionListener() { /** - * - * @param event + * + * @param event */ @Override public void actionPerformed(final ActionEvent event) { @@ -154,115 +164,117 @@ public final class ContentTypeAdminPane extends BaseAdminPane { // // } } + }); } +// ToDo (?) User Definied Content Types +// private class AddTypeContainer extends GridPanel implements ActionListener, +// FormProcessListener { +// +// private Label m_noTypesAvailable = +// new Label(gz("cms.ui.type.select.none")); +// private SelectType m_selectType; +//// User Definied Content Types private CreateType m_createType; +// +// /** +// * +// */ +// AddTypeContainer() { +// super(1); +// Section selectSection = new Section(); +// selectSection.setHeading(new Label(gz("cms.ui.type.select"))); +// add(selectSection); +// +// GridPanel container = new GridPanel(1); +// container.add(m_noTypesAvailable); +// m_selectType = new SelectType(); +// m_selectType.addSubmissionListener(new CancelListener(m_selectType)); +// m_selectType.addProcessListener(this); +// container.add(m_selectType); +// selectSection.setBody(container); +// +// Section addSection = new Section() { +// +// @Override +// public final boolean isVisible(final PageState state) { +// return super.isVisible(state) +// && !ContentSection.getConfig().getHideUDCTUI(); +// } +// }; +// addSection.setHeading(new Label(gz("cms.ui.type.define"))); +// m_createType = new CreateType(m_model); +// m_createType.addSubmissionListener(new CancelListener(m_createType)); +// m_createType.addProcessListener(this); +// addSection.setBody(m_createType); +// add(addSection); +// } +// +// /** +// * +// * @param e +// */ +// @Override +// public void actionPerformed(ActionEvent e) { +// PageState s = e.getPageState(); +// ContentSection section = CMS.getContext().getContentSection(); +// ContentTypeCollection contentTypes = +// section.getNotAssociatedContentTypes(); +// boolean hasAvailableTypes = !contentTypes.isEmpty(); +// m_selectType.setVisible(s, hasAvailableTypes); +// m_noTypesAvailable.setVisible(s, !hasAvailableTypes); +// } +// +// public final void process(final FormSectionEvent e) +// throws FormProcessException { +// final PageState state = e.getPageState(); +// resetPane(state); +// } +// } /** - * - */ - private class AddTypeContainer extends GridPanel implements ActionListener, - FormProcessListener { - - private Label m_noTypesAvailable = - new Label(gz("cms.ui.type.select.none")); - private SelectType m_selectType; - private CreateType m_createType; - - /** - * - */ - AddTypeContainer() { - super(1); - Section selectSection = new Section(); - selectSection.setHeading(new Label(gz("cms.ui.type.select"))); - add(selectSection); - - GridPanel container = new GridPanel(1); - container.add(m_noTypesAvailable); - m_selectType = new SelectType(); - m_selectType.addSubmissionListener(new CancelListener(m_selectType)); - m_selectType.addProcessListener(this); - container.add(m_selectType); - selectSection.setBody(container); - - Section addSection = new Section() { - - @Override - public final boolean isVisible(final PageState state) { - return super.isVisible(state) - && !ContentSection.getConfig().getHideUDCTUI(); - } - }; - addSection.setHeading(new Label(gz("cms.ui.type.define"))); - m_createType = new CreateType(m_model); - m_createType.addSubmissionListener(new CancelListener(m_createType)); - m_createType.addProcessListener(this); - addSection.setBody(m_createType); - add(addSection); - } - - /** - * - * @param e - */ - @Override - public void actionPerformed(ActionEvent e) { - PageState s = e.getPageState(); - ContentSection section = CMS.getContext().getContentSection(); - ContentTypeCollection contentTypes = - section.getNotAssociatedContentTypes(); - boolean hasAvailableTypes = !contentTypes.isEmpty(); - m_selectType.setVisible(s, hasAvailableTypes); - m_noTypesAvailable.setVisible(s, !hasAvailableTypes); - } - - public final void process(final FormSectionEvent e) - throws FormProcessException { - final PageState state = e.getPageState(); - resetPane(state); - } - } - - /** - * This class is essentially a copy of the CancelListener inside of - * ModalPanel. We could not use the one in ModalPanel because it was - * protected + * This class is essentially a copy of the CancelListener inside of + * ModalPanel. We could not use the one in ModalPanel because it was + * protected */ private final class CancelListener implements FormSubmissionListener { Cancellable m_form; - CancelListener(Cancellable form) { + CancelListener(final Cancellable form) { m_form = form; } @Override public void submitted(FormSectionEvent event) - throws FormProcessException { + throws FormProcessException { PageState state = event.getPageState(); if (m_form.isCancelled(state)) { getBody().pop(state); - throw new FormProcessException(GlobalizationUtil.globalize( - "cms.ui.type.cancelled")); + throw new FormProcessException(new GlobalizedMessage( + "cms.ui.type.cancelled", CmsConstants.CMS_BUNDLE)); } } + } // end private class - private void resetPane(PageState state) { + private void resetPane(final PageState state) { getBody().reset(state); if (getSelectionModel().isSelected(state)) { s_log.debug("The selection model is selected; displaying " - + "the item pane"); + + "the item pane"); getBody().push(state, getItemPane()); } } private class SelectionRequestLocal extends ContentTypeRequestLocal { + @Override protected final Object initialValue(final PageState state) { - ContentType contentType = (ContentType) m_model.getSelectedObject(state); + ContentType contentType = (ContentType) m_model.getSelectedObject( + state); return contentType; } + } private class DeleteForm extends BaseDeleteForm { @@ -273,16 +285,28 @@ public final class ContentTypeAdminPane extends BaseAdminPane { addSubmissionListener(new TypeSecurityListener()); } + @Override public final void process(final FormSectionEvent e) - throws FormProcessException { + throws FormProcessException { final PageState state = e.getPageState(); - final ContentSection section = - CMS.getContext().getContentSection(); + final ContentSection section = CMS.getContext().getContentSection(); - section.removeContentType(m_type.getContentType(state)); - section.save(); + final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); + final ContentSectionManager sectionManager = cdiUtil.findBean( + ContentSectionManager.class); + final ContentTypeManager typeManager = cdiUtil.findBean( + ContentTypeManager.class); + + m_type.getContentType(state).getContentItemClass(); + + sectionManager.removeContentTypeFromSection( + typeManager.classNameToClass(m_type.getContentType(state) + .getContentItemClass()), + section); getSelectionModel().clearSelection(state); } + } + } diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/type/SelectType.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/type/SelectType.java new file mode 100755 index 000000000..d6ddb8c48 --- /dev/null +++ b/ccm-cms/src/main/java/com/arsdigita/cms/ui/type/SelectType.java @@ -0,0 +1,209 @@ +/* + * Copyright (C) 2001-2004 Red Hat Inc. All Rights Reserved. + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +package com.arsdigita.cms.ui.type; + +import com.arsdigita.bebop.ColumnPanel; +import com.arsdigita.bebop.FormData; +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.FormProcessListener; +import com.arsdigita.bebop.event.FormSectionEvent; +import com.arsdigita.bebop.event.FormSubmissionListener; +import com.arsdigita.bebop.event.PrintEvent; +import com.arsdigita.bebop.event.PrintListener; +import com.arsdigita.bebop.form.CheckboxGroup; +import com.arsdigita.bebop.form.Option; +import com.arsdigita.bebop.form.Submit; +import com.arsdigita.cms.CMS; + +import org.librecms.contentsection.ContentSection; +import org.librecms.contentsection.ContentType; + +import com.arsdigita.cms.ui.CMSForm; +import com.arsdigita.globalization.GlobalizedMessage; +import com.arsdigita.ui.admin.GlobalizationUtil; +import com.arsdigita.util.UncheckedWrapperException; + +import org.libreccm.cdi.utils.CdiUtil; +import org.libreccm.l10n.GlobalizationHelper; +import org.librecms.CmsConstants; +import org.librecms.contentsection.ContentItem; +import org.librecms.contentsection.ContentSectionManager; +import org.librecms.contentsection.ContentTypeManager; +import org.librecms.contenttypes.ContentTypeInfo; +import org.librecms.contenttypes.ContentTypesManager; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; +import java.util.ResourceBundle; +import java.util.TooManyListenersException; +import java.util.stream.Collectors; + +/** + * This class contains a form component to that allows adding already-existing + * content type to a content section. + * + * @author Jens Pelzetter + * @author Jack Chung + * @author Michael Pih + */ +public class SelectType extends CMSForm implements PrintListener, + FormSubmissionListener, + FormProcessListener { + + private final static String TYPES = "types"; + private CheckboxGroup m_typesCheckbox; + private Submit m_submit; + private Submit m_cancel; + + public SelectType() { + super("ContentTypeSelect"); + + m_typesCheckbox = new CheckboxGroup(TYPES); + try { + m_typesCheckbox.addPrintListener(this); + } catch (TooManyListenersException e) { + throw new UncheckedWrapperException("TooManyListeners: " + e + .getMessage()); + } + + add(new Label(new GlobalizedMessage("cms.ui.type.available_types", + CmsConstants.CMS_BUNDLE))); + add(m_typesCheckbox); + + SimpleContainer s = new SimpleContainer(); + m_submit = new Submit("submit"); + m_submit.setButtonLabel("Add Selected Content Types"); + s.add(m_submit); + m_cancel = new Submit("cancel"); + m_cancel.setButtonLabel("Cancel"); + s.add(m_cancel); + add(s, ColumnPanel.FULL_WIDTH | ColumnPanel.CENTER); + + addProcessListener(this); + addSubmissionListener(new TypeSecurityListener()); + addSubmissionListener(this); + } + + /** + * Generate a checkbox list of all content type not associated with the + * current content section + */ + @Override + public void prepare(final PrintEvent event) { + + final CheckboxGroup target = (CheckboxGroup) event.getTarget(); + + // Get the current content section + final ContentSection section = CMS.getContext().getContentSection(); + + final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); + final ContentTypesManager typesManager = cdiUtil.findBean( + ContentTypesManager.class); + + final List availableTypes = typesManager + .getAvailableContentTypes(); + final List assignedTypes = section.getContentTypes() + .stream() + .map(contentType -> contentType.getContentItemClass()) + .collect(Collectors.toList()); + + final List notAssignedTypes = availableTypes.stream() + .filter(type -> assignedTypes.contains(type.getContentItemClass() + .getName())) + .collect(Collectors.toList()); + + for (final ContentTypeInfo typeInfo : notAssignedTypes) { + addOption(target, typeInfo); + } + } + + private void addOption(final CheckboxGroup target, + final ContentTypeInfo typeInfo) { + final Label label = new Label(new GlobalizedMessage(typeInfo + .getLabelKey(), typeInfo.getLabelBundle())); + target.addOption(new Option(typeInfo.getContentItemClass().getName(), + label)); + } + + /** + * Form submission listener. If the cancel button was pressed, do not + * process the form. + * + * @param event The submit event + * + * @throws com.arsdigita.bebop.FormProcessException + */ + @Override + public void submitted(final FormSectionEvent event) throws + FormProcessException { + PageState state = event.getPageState(); + if (isCancelled(state)) { + throw new FormProcessException(GlobalizationUtil.globalize( + "cms.ui.cancelled")); + } + } + + /** + * Returns true if this form was cancelled. + * + * @return true if the form was cancelled, false otherwise + */ + @Override + public boolean isCancelled(final PageState state) { + return m_cancel.isSelected(state); + } + + /** + * Processes form listener which updates a life cycle + * + * @param event + * + * @throws com.arsdigita.bebop.FormProcessException + */ + @Override + public void process(final FormSectionEvent event) + throws FormProcessException { + + final ContentSection section = CMS.getContext().getContentSection(); + + final FormData data = event.getFormData(); + final String[] types = (String[]) data.get(TYPES); + + final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); + final ContentTypeManager typeManager = cdiUtil.findBean( + ContentTypeManager.class); + final ContentSectionManager sectionManager = cdiUtil.findBean( + ContentSectionManager.class); + + if (types != null) { + for (String type : types) { + sectionManager.addContentTypeToSection( + typeManager.classNameToClass(type), + section, + section.getLifecycleDefinitions().get(0), + section.getWorkflowTemplates().get(0)); + } + } + } + +} diff --git a/ccm-cms/src/main/java/org/librecms/contentsection/ContentTypeManager.java b/ccm-cms/src/main/java/org/librecms/contentsection/ContentTypeManager.java index f639e1609..a58010cf5 100644 --- a/ccm-cms/src/main/java/org/librecms/contentsection/ContentTypeManager.java +++ b/ccm-cms/src/main/java/org/librecms/contentsection/ContentTypeManager.java @@ -24,6 +24,9 @@ import org.libreccm.workflow.WorkflowTemplate; import org.librecms.contentsection.privileges.AdminPrivileges; import org.librecms.lifecycle.LifecycleDefinition; +import java.util.logging.Level; +import java.util.logging.Logger; + import javax.enterprise.context.RequestScoped; import javax.inject.Inject; import javax.transaction.Transactional; @@ -39,6 +42,25 @@ public class ContentTypeManager { @Inject private ContentTypeRepository typeRepo; + @SuppressWarnings("unchecked") + public Class classNameToClass(final String className) { + final Class clazz; + try { + clazz = Class.forName(className); + } catch (ClassNotFoundException ex) { + throw new IllegalArgumentException(String.format( + "No class with the name \"%s\" exists.", className), + ex); + } + + if (clazz.isAssignableFrom(ContentItem.class)) { + return (Class) clazz; + } else { + throw new IllegalArgumentException(String.format( + "Class \"%s\" is not a content type.", className)); + } + } + @Transactional(Transactional.TxType.REQUIRED) @AuthorizationRequired public void setDefaultLifecycle(