CCM NG/ccm-cms: CreateForm for NewsItem

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

Former-commit-id: 5885bea3be
pull/2/head
jensp 2017-05-01 15:33:07 +00:00
parent 36703ed468
commit 861ed62ba3
8 changed files with 162 additions and 19 deletions

View File

@ -43,6 +43,7 @@ import com.arsdigita.util.Assert;
import org.arsdigita.cms.CMSConfig; import org.arsdigita.cms.CMSConfig;
import org.libreccm.cdi.utils.CdiUtil; import org.libreccm.cdi.utils.CdiUtil;
import org.librecms.CmsConstants; import org.librecms.CmsConstants;
import org.librecms.contentsection.ContentItemInitializer;
import org.librecms.contentsection.ContentItemManager; import org.librecms.contentsection.ContentItemManager;
import org.librecms.contentsection.ContentType; import org.librecms.contentsection.ContentType;
@ -240,16 +241,18 @@ public abstract class BasicPageForm extends BasicItemForm {
* @param name * @param name
* @param section * @param section
* @param folder * @param folder
* @param initializer
* *
* @return the new content item (or a proper subclass thereof) * @return the new content item (or a proper subclass thereof)
* *
* @throws com.arsdigita.bebop.FormProcessException * @throws com.arsdigita.bebop.FormProcessException
*/ */
public ContentItem createContentPage(final PageState state, public ContentItem createContentPage(
final PageState state,
final String name, final String name,
final ContentSection section, final ContentSection section,
final Folder folder) final Folder folder,
throws FormProcessException { final ContentItemInitializer initializer) throws FormProcessException {
final ItemSelectionModel selectionModel = getItemSelectionModel(); final ItemSelectionModel selectionModel = getItemSelectionModel();
final ContentType contentType = selectionModel.getContentType(); final ContentType contentType = selectionModel.getContentType();
@ -265,7 +268,11 @@ public abstract class BasicPageForm extends BasicItemForm {
final Class<? extends ContentItem> clazz final Class<? extends ContentItem> clazz
= (Class<? extends ContentItem>) Class = (Class<? extends ContentItem>) Class
.forName(contentType.getContentItemClass()); .forName(contentType.getContentItemClass());
item = itemManager.createContentItem(name, section, folder, clazz); item = itemManager.createContentItem(name,
section,
folder,
clazz,
initializer);
} catch (ClassNotFoundException ex) { } catch (ClassNotFoundException ex) {
throw new FormProcessException( throw new FormProcessException(
"Couldn't create contentpage", "Couldn't create contentpage",
@ -276,7 +283,6 @@ public abstract class BasicPageForm extends BasicItemForm {
} }
// Create new item // Create new item
// Make sure the item will be remembered across requests // Make sure the item will be remembered across requests
selectionModel.setSelectedKey(state, item.getObjectId()); selectionModel.setSelectedKey(state, item.getObjectId());

View File

@ -23,7 +23,6 @@ import com.arsdigita.bebop.FormData;
import com.arsdigita.bebop.FormProcessException; import com.arsdigita.bebop.FormProcessException;
import com.arsdigita.bebop.Label; import com.arsdigita.bebop.Label;
import com.arsdigita.bebop.PageState; import com.arsdigita.bebop.PageState;
import com.arsdigita.bebop.Text;
import com.arsdigita.bebop.event.FormSectionEvent; import com.arsdigita.bebop.event.FormSectionEvent;
import com.arsdigita.bebop.event.FormSubmissionListener; import com.arsdigita.bebop.event.FormSubmissionListener;
import com.arsdigita.bebop.event.PrintEvent; import com.arsdigita.bebop.event.PrintEvent;
@ -35,13 +34,13 @@ import org.librecms.contentsection.Folder;
import com.arsdigita.cms.ItemSelectionModel; import com.arsdigita.cms.ItemSelectionModel;
import com.arsdigita.globalization.GlobalizedMessage; import com.arsdigita.globalization.GlobalizedMessage;
import com.arsdigita.kernel.KernelConfig;
import com.arsdigita.util.Assert; import com.arsdigita.util.Assert;
import org.libreccm.cdi.utils.CdiUtil; import org.libreccm.cdi.utils.CdiUtil;
import org.libreccm.l10n.GlobalizationHelper; import org.libreccm.l10n.GlobalizationHelper;
import org.librecms.CmsConstants; import org.librecms.CmsConstants;
import org.librecms.contentsection.ContentItem; import org.librecms.contentsection.ContentItem;
import org.librecms.contentsection.ContentItemInitializer;
import org.librecms.contenttypes.ContentTypeInfo; import org.librecms.contenttypes.ContentTypeInfo;
import org.librecms.contenttypes.ContentTypesManager; import org.librecms.contenttypes.ContentTypesManager;
@ -120,7 +119,8 @@ public class PageCreateForm
/* content type */ /* content type */
add(new Label(new GlobalizedMessage("cms.ui.authoring.content_type", add(new Label(new GlobalizedMessage("cms.ui.authoring.content_type",
CmsConstants.CMS_BUNDLE))); CmsConstants.CMS_BUNDLE)));
final Label typeOutput = new Label(new ContentTypePrintListener(typeInfo)); final Label typeOutput = new Label(
new ContentTypePrintListener(typeInfo));
add(typeOutput); add(typeOutput);
/* language selection */ /* language selection */
add(new Label(new GlobalizedMessage("cms.ui.language.field", add(new Label(new GlobalizedMessage("cms.ui.language.field",
@ -205,7 +205,7 @@ public class PageCreateForm
* @throws FormProcessException * @throws FormProcessException
*/ */
@Override @Override
public void process(final FormSectionEvent event) public final void process(final FormSectionEvent event)
throws FormProcessException { throws FormProcessException {
final FormData data = event.getFormData(); final FormData data = event.getFormData();
@ -218,7 +218,9 @@ public class PageCreateForm
final ContentItem item = createContentPage(state, final ContentItem item = createContentPage(state,
(String) data.get(NAME), (String) data.get(NAME),
section, section,
folder); folder,
getItemInitializer(data,
state));
final Locale locale = new Locale((String) data.get(LANGUAGE)); final Locale locale = new Locale((String) data.get(LANGUAGE));
item.getName().addValue(locale, (String) data.get(NAME)); item.getName().addValue(locale, (String) data.get(NAME));
item.getTitle().addValue(locale, (String) data.get(TITLE)); item.getTitle().addValue(locale, (String) data.get(TITLE));
@ -228,6 +230,12 @@ public class PageCreateForm
creationSelector.editItem(state, item); creationSelector.editItem(state, item);
} }
protected ContentItemInitializer<?> getItemInitializer(
final FormData data, final PageState state) {
return item -> {};
}
private class ContentTypePrintListener implements PrintListener { private class ContentTypePrintListener implements PrintListener {
private final ContentTypeInfo typeInfo; private final ContentTypeInfo typeInfo;

View File

@ -0,0 +1,36 @@
/*
* 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 org.librecms.contentsection;
/**
*
*
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
* @param <T>
*/
public interface ContentItemInitializer<T extends ContentItem> {
/**
* Initialise the provided item.
*
* @param item The item to initialise.
*/
void initializeValues(T item);
}

View File

@ -123,7 +123,7 @@ public class ContentItemManager {
/** /**
* Creates a new content item in the provided content section and folder * Creates a new content item in the provided content section and folder
* with the workflow. * with the default workflow for the content type of the item.
* *
* The folder must be a subfolder of the * The folder must be a subfolder of the
* {@link ContentSection#rootDocumentsFolder} of the provided content * {@link ContentSection#rootDocumentsFolder} of the provided content
@ -146,6 +146,43 @@ public class ContentItemManager {
final Folder folder, final Folder folder,
final Class<T> type) { final Class<T> type) {
return createContentItem(name,
section,
folder,
type,
item -> {
});
}
/**
* Creates a new content item in the provided content section and folder
* with the default workflow for the content type of the item.
*
* The folder must be a subfolder of the
* {@link ContentSection#rootDocumentsFolder} of the provided content
* section. Otherwise an {@link IllegalArgumentException} is thrown.
*
* @param <T> The type of the content item.
* @param name The name (URL stub) of the new content item.
* @param section The content section in which the item is generated.
* @param folder The folder in which in the item is stored.
* @param type The type of the new content item.
* @param initalizer A {@link ContentItemInitializer} for setting mandatory
* values
*
* @return The new content item.
*/
@AuthorizationRequired
@Transactional(Transactional.TxType.REQUIRED)
public <T extends ContentItem> T createContentItem(
final String name,
final ContentSection section,
@RequiresPrivilege(ItemPrivileges.CREATE_NEW)
final Folder folder,
final Class<T> type,
final ContentItemInitializer<T> initalizer) {
final Optional<ContentType> contentType = typeRepo final Optional<ContentType> contentType = typeRepo
.findByContentSectionAndClass(section, type); .findByContentSectionAndClass(section, type);
@ -160,7 +197,8 @@ public class ContentItemManager {
section, section,
folder, folder,
contentType.get().getDefaultWorkflow(), contentType.get().getDefaultWorkflow(),
type); type,
initalizer);
} }
/** /**
@ -196,6 +234,52 @@ public class ContentItemManager {
final WorkflowTemplate workflowTemplate, final WorkflowTemplate workflowTemplate,
final Class<T> type) { final Class<T> type) {
return createContentItem(name,
section,
folder,
workflowTemplate,
type,
item -> {
});
}
/**
* Creates a new content item in the provided content section and folder
* with specific workflow.
*
* The folder must be a subfolder of the
* {@link ContentSection#rootDocumentsFolder} of the provided content
* section. Otherwise an {@link IllegalArgumentException} is thrown.
*
* Likewise the provided {@link WorkflowTemplate} must be defined in the
* provided content section. Otherwise an {@link IllegalArgumentException}
* is thrown.
*
* @param <T> The type of the content item.
* @param name The name (URL stub) of the new content item.
* @param section The content section in which the item is
* generated.
* @param folder The folder in which in the item is stored.
* @param workflowTemplate The template for the workflow to apply to the new
* item.
* @param type The type of the new content item.
* @param initializer Initialiser implementation for setting mandatory
* properties of the new item.
*
* @return The new content item.
*/
@AuthorizationRequired
@Transactional(Transactional.TxType.REQUIRED)
public <T extends ContentItem> T createContentItem(
final String name,
final ContentSection section,
@RequiresPrivilege(ItemPrivileges.CREATE_NEW)
final Folder folder,
final WorkflowTemplate workflowTemplate,
final Class<T> type,
final ContentItemInitializer<T> initializer) {
final Optional<ContentType> contentType = typeRepo final Optional<ContentType> contentType = typeRepo
.findByContentSectionAndClass(section, type); .findByContentSectionAndClass(section, type);
@ -242,6 +326,10 @@ public class ContentItemManager {
item.setWorkflow(workflow); item.setWorkflow(workflow);
} }
if (initializer != null) {
initializer.initializeValues(item);
}
contentItemRepo.save(item); contentItemRepo.save(item);
categoryManager.addObjectToCategory( categoryManager.addObjectToCategory(

View File

@ -18,7 +18,8 @@
*/ */
package org.librecms.contenttypes; package org.librecms.contenttypes;
import com.arsdigita.cms.ui.authoring.PageCreateForm; import com.arsdigita.cms.ui.contenttypes.NewsCreateForm;
import org.hibernate.envers.Audited; import org.hibernate.envers.Audited;
import org.hibernate.validator.constraints.NotEmpty; import org.hibernate.validator.constraints.NotEmpty;
import org.libreccm.l10n.LocalizedString; import org.libreccm.l10n.LocalizedString;
@ -37,6 +38,7 @@ import javax.persistence.JoinTable;
import javax.persistence.Table; import javax.persistence.Table;
import javax.persistence.Temporal; import javax.persistence.Temporal;
import javax.persistence.TemporalType; import javax.persistence.TemporalType;
import javax.validation.constraints.NotNull;
import static org.librecms.CmsConstants.*; import static org.librecms.CmsConstants.*;
@ -49,7 +51,7 @@ import static org.librecms.CmsConstants.*;
@Table(name = "NEWS", schema = DB_SCHEMA) @Table(name = "NEWS", schema = DB_SCHEMA)
@ContentTypeDescription(labelBundle = "org.librecms.contenttypes.News", @ContentTypeDescription(labelBundle = "org.librecms.contenttypes.News",
descriptionBundle = "org.librecms.contenttypes.News") descriptionBundle = "org.librecms.contenttypes.News")
@AuthoringKit(createComponent = PageCreateForm.class, @AuthoringKit(createComponent = NewsCreateForm.class,
steps = {}) steps = {})
public class News extends ContentItem implements Serializable { public class News extends ContentItem implements Serializable {
@ -72,7 +74,7 @@ public class News extends ContentItem implements Serializable {
* Release date of the news * Release date of the news
*/ */
@Column(name = "NEWS_DATE", nullable = false) @Column(name = "NEWS_DATE", nullable = false)
@NotEmpty @NotNull
@Temporal(TemporalType.DATE) @Temporal(TemporalType.DATE)
private Date releaseDate; private Date releaseDate;

View File

@ -279,3 +279,4 @@ cms.ui.language.field=Sprache
cms.ui.authoring.workflow=Select a workflow cms.ui.authoring.workflow=Select a workflow
cms.ui.create=Create cms.ui.create=Create
cms.contenttypes.ui.summary=Summary cms.contenttypes.ui.summary=Summary
cms.contenttypes.ui.newsitem.date\ =Release date

View File

@ -277,3 +277,4 @@ cms.ui.language.field=Sprache
cms.ui.authoring.workflow=Arbeitsablauf ausw\u00e4hlen cms.ui.authoring.workflow=Arbeitsablauf ausw\u00e4hlen
cms.ui.create=Anlegen cms.ui.create=Anlegen
cms.contenttypes.ui.summary=Zusammenfassung cms.contenttypes.ui.summary=Zusammenfassung
cms.contenttypes.ui.newsitem.date\ =Erscheinungsdatum

View File

@ -236,3 +236,4 @@ cms.ui.language.field=Sprache
cms.ui.authoring.workflow=Select a workflow cms.ui.authoring.workflow=Select a workflow
cms.ui.create=Create cms.ui.create=Create
cms.contenttypes.ui.summary=Summary cms.contenttypes.ui.summary=Summary
cms.contenttypes.ui.newsitem.date\ =Release date