From af612dc774f196a3fdce8f280906c71540bbbd7f Mon Sep 17 00:00:00 2001 From: jensp Date: Sat, 29 Apr 2017 14:53:14 +0000 Subject: [PATCH] CCM NG/ccm-cms: Creating content items works now git-svn-id: https://svn.libreccm.org/ccm/ccm_ng@4695 8810af33-2d31-482b-a856-94f89814c4df Former-commit-id: 0153f108332ced829e3d5872c0731db89494c8db --- .../src/main/resources/log4j2.xml | 5 + .../mparticle/MultiPartArticleCreateForm.java | 3 +- .../ui/authoring/ApplyWorkflowController.java | 150 +++++ .../authoring/ApplyWorkflowFormSection.java | 119 ++-- .../cms/ui/authoring/CreationSelector.java | 52 +- .../authoring/CreationSelectorController.java | 61 +++ .../cms/ui/authoring/PageCreateForm.java | 71 ++- .../WorkflowsOptionPrintListener.java | 13 +- ...orkflowsOptionPrintListenerController.java | 59 ++ .../contentsection/ContentSection.java | 1 - .../contenttypes/ContentTypesManager.java | 19 +- .../contenttypes/MultiPartArticle.java | 2 +- .../com/arsdigita/cms/util/CMSGlobalized.java | 40 ++ .../arsdigita/cms/util/CMSResourceBundle.java | 52 ++ .../cms/util/ContentItemNameFix.java | 516 ++++++++++++++++++ .../arsdigita/cms/util/GlobalizationUtil.java | 73 +++ .../cms/util/GlobalizationUtilOld.java | 81 +++ .../com/arsdigita/cms/util/LanguageUtil.java | 238 ++++++++ .../cms/util/PageClassConfigHandler.java | 82 +++ .../arsdigita/cms/util/SecurityConstants.java | 68 +++ .../com/arsdigita/cms/util/Util.java | 44 ++ .../arsdigita/cms/util/iso639full.properties | 141 +++++ .../arsdigita/cms/util/iso639rev.properties | 138 +++++ .../org/librecms/CmsResources.properties | 7 + .../org/librecms/CmsResources_de.properties | 7 + .../org/librecms/CmsResources_fr.properties | 7 + .../java/org/libreccm/admin/ui/AdminView.java | 131 ++--- .../ui/usersgroupsroles/UsersGroupsRoles.java | 105 ++++ .../UsersTableDataProvider.java | 90 +++ .../core/CcmObjectRepositoryTest.java | 4 +- .../security/GroupRepositoryTest.java | 4 +- .../security/PartyRepositoryTest.java | 4 +- .../libreccm/security/RoleRepositoryTest.java | 4 +- .../libreccm/security/UserRepositoryTest.java | 4 +- .../scripts/create_ccm_core_schema.sql | 2 +- 35 files changed, 2195 insertions(+), 202 deletions(-) create mode 100644 ccm-cms/src/main/java/com/arsdigita/cms/ui/authoring/ApplyWorkflowController.java create mode 100644 ccm-cms/src/main/java/com/arsdigita/cms/ui/authoring/CreationSelectorController.java create mode 100644 ccm-cms/src/main/java/com/arsdigita/cms/ui/workflow/WorkflowsOptionPrintListenerController.java create mode 100755 ccm-cms/src/main/resources/com/arsdigita/cms/util/CMSGlobalized.java create mode 100755 ccm-cms/src/main/resources/com/arsdigita/cms/util/CMSResourceBundle.java create mode 100644 ccm-cms/src/main/resources/com/arsdigita/cms/util/ContentItemNameFix.java create mode 100755 ccm-cms/src/main/resources/com/arsdigita/cms/util/GlobalizationUtil.java create mode 100755 ccm-cms/src/main/resources/com/arsdigita/cms/util/GlobalizationUtilOld.java create mode 100755 ccm-cms/src/main/resources/com/arsdigita/cms/util/LanguageUtil.java create mode 100755 ccm-cms/src/main/resources/com/arsdigita/cms/util/PageClassConfigHandler.java create mode 100755 ccm-cms/src/main/resources/com/arsdigita/cms/util/SecurityConstants.java create mode 100755 ccm-cms/src/main/resources/com/arsdigita/cms/util/Util.java create mode 100755 ccm-cms/src/main/resources/com/arsdigita/cms/util/iso639full.properties create mode 100755 ccm-cms/src/main/resources/com/arsdigita/cms/util/iso639rev.properties create mode 100644 ccm-core/src/main/java/org/libreccm/admin/ui/usersgroupsroles/UsersGroupsRoles.java create mode 100644 ccm-core/src/main/java/org/libreccm/admin/ui/usersgroupsroles/UsersTableDataProvider.java diff --git a/ccm-bundle-devel-wildfly-web/src/main/resources/log4j2.xml b/ccm-bundle-devel-wildfly-web/src/main/resources/log4j2.xml index 7d5188738..849d8d913 100644 --- a/ccm-bundle-devel-wildfly-web/src/main/resources/log4j2.xml +++ b/ccm-bundle-devel-wildfly-web/src/main/resources/log4j2.xml @@ -22,6 +22,11 @@ --> + + + diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/contenttypes/ui/mparticle/MultiPartArticleCreateForm.java b/ccm-cms/src/main/java/com/arsdigita/cms/contenttypes/ui/mparticle/MultiPartArticleCreateForm.java index ee8c9d343..f507aa559 100644 --- a/ccm-cms/src/main/java/com/arsdigita/cms/contenttypes/ui/mparticle/MultiPartArticleCreateForm.java +++ b/ccm-cms/src/main/java/com/arsdigita/cms/contenttypes/ui/mparticle/MultiPartArticleCreateForm.java @@ -21,7 +21,6 @@ package com.arsdigita.cms.contenttypes.ui.mparticle; import com.arsdigita.bebop.ColumnPanel; import com.arsdigita.bebop.FormData; import com.arsdigita.bebop.FormProcessException; -import com.arsdigita.bebop.FormSection; import com.arsdigita.bebop.Label; import com.arsdigita.bebop.PageState; import com.arsdigita.bebop.event.FormInitListener; @@ -36,7 +35,9 @@ import com.arsdigita.cms.ui.authoring.CreationSelector; import com.arsdigita.cms.ui.authoring.LanguageWidget; import com.arsdigita.globalization.GlobalizedMessage; import com.arsdigita.kernel.KernelConfig; + import java.util.Date; + import org.arsdigita.cms.CMSConfig; import org.librecms.CmsConstants; import org.librecms.contentsection.ContentSection; diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/authoring/ApplyWorkflowController.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/authoring/ApplyWorkflowController.java new file mode 100644 index 000000000..ed4dd573b --- /dev/null +++ b/ccm-cms/src/main/java/com/arsdigita/cms/ui/authoring/ApplyWorkflowController.java @@ -0,0 +1,150 @@ +/* + * 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.authoring; + +import org.libreccm.security.PermissionChecker; +import org.libreccm.workflow.AssignableTask; +import org.libreccm.workflow.AssignableTaskManager; +import org.libreccm.workflow.Workflow; +import org.libreccm.workflow.WorkflowManager; +import org.libreccm.workflow.WorkflowTemplate; +import org.libreccm.workflow.WorkflowTemplateRepository; +import org.librecms.contentsection.ContentItem; +import org.librecms.contentsection.ContentSection; +import org.librecms.contentsection.ContentSectionRepository; +import org.librecms.contentsection.ContentType; +import org.librecms.contentsection.ContentTypeRepository; +import org.librecms.contentsection.Folder; +import org.librecms.contentsection.privileges.ItemPrivileges; + +import java.nio.charset.IllegalCharsetNameException; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +import javax.enterprise.context.RequestScoped; +import javax.inject.Inject; +import javax.transaction.Transactional; + +/** + * + * @author Jens Pelzetter + */ +@RequestScoped +class ApplyWorkflowController { + + @Inject + private ContentTypeRepository typeRepo; + + @Inject + private ContentSectionRepository sectionRepo; + + @Inject + private WorkflowTemplateRepository templateRepo; + + @Inject + private WorkflowManager workflowManager; + + @Inject + private AssignableTaskManager assignableTaskManager; + + @Inject + private PermissionChecker permissionChecker; + + @Transactional(Transactional.TxType.REQUIRED) + protected WorkflowTemplate getDefaultWorkflow(final ContentType contentType) { + + Objects.requireNonNull(contentType); + + final ContentType type = typeRepo + .findById(contentType.getObjectId()) + .orElseThrow(() -> new IllegalCharsetNameException(String.format( + "No ContentType with ID %d in the database. Where did that ID come from?", + contentType.getObjectId()))); + + return type.getDefaultWorkflow(); + } + + @Transactional(Transactional.TxType.REQUIRED) + Long getDefaultWorkflowId(final ContentType contentType) { + final WorkflowTemplate workflowTemplate + = getDefaultWorkflow(contentType); + if (workflowTemplate == null) { + return null; + } else { + return workflowTemplate.getWorkflowId(); + } + } + + @Transactional(Transactional.TxType.REQUIRED) + protected List getWorkflowTemplates( + 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.getWorkflowTemplates()); + } + + @Transactional(Transactional.TxType.REQUIRED) + protected void applyWorkflow(final ContentItem item, + final Folder folder, + final Long workflowTemplateId) { + + final WorkflowTemplate workflowTemplate; + if (workflowTemplateId == null + && permissionChecker + .isPermitted(ItemPrivileges.APPLY_ALTERNATE_WORKFLOW, folder)) { + + workflowTemplate = templateRepo + .findById(workflowTemplateId) + .orElseThrow(() -> new IllegalArgumentException(String.format( + "No WorkflowTemplate with ID %d in database. " + + "Where did that ID come from?", + workflowTemplateId))); + } else { + workflowTemplate = item.getContentType().getDefaultWorkflow(); + } + + if (workflowTemplate != null) { + + final Workflow workflow = workflowManager + .createWorkflow(workflowTemplate, item); + workflowManager.start(workflow); + + if (!workflow.getTasks().isEmpty()) { + + if (workflow.getTasks().get(0) instanceof AssignableTask) { + + final AssignableTask task = (AssignableTask) workflow + .getTasks() + .get(0); + assignableTaskManager.lockTask(task); + } + } + + } + + } + +} diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/authoring/ApplyWorkflowFormSection.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/authoring/ApplyWorkflowFormSection.java index 456382509..da6b8cc88 100755 --- a/ccm-cms/src/main/java/com/arsdigita/cms/ui/authoring/ApplyWorkflowFormSection.java +++ b/ccm-cms/src/main/java/com/arsdigita/cms/ui/authoring/ApplyWorkflowFormSection.java @@ -52,6 +52,7 @@ import org.libreccm.workflow.WorkflowTemplateRepository; import org.librecms.CmsConstants; import org.librecms.contentsection.privileges.ItemPrivileges; +import java.util.ArrayList; import java.util.List; import java.util.TooManyListenersException; @@ -146,11 +147,13 @@ public class ApplyWorkflowFormSection public void init(final FormSectionEvent event) throws FormProcessException { final PageState state = event.getPageState(); - final ContentSection section = creationSelector.getContentSection( - state); - final WorkflowTemplate template = contentType.getDefaultWorkflow(); - if (template != null) { - radioGroup.setValue(state, template.getWorkflowId()); + final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); + final ApplyWorkflowController controller = cdiUtil + .findBean(ApplyWorkflowController.class); + final Long workflowTemplateId = controller + .getDefaultWorkflowId(contentType); + if (workflowTemplateId != null) { + radioGroup.setValue(state, workflowTemplateId); } } @@ -192,13 +195,12 @@ public class ApplyWorkflowFormSection final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); final PermissionChecker permissionChecker = cdiUtil .findBean(PermissionChecker.class); - ; if (super.isVisible(state) && permissionChecker .isPermitted(ItemPrivileges.APPLY_ALTERNATE_WORKFLOW, creationSelector.getFolder(state))) { - + return !printListener.getCollection(state).isEmpty(); } return result; @@ -215,52 +217,57 @@ public class ApplyWorkflowFormSection */ public void applyWorkflow(final PageState state, final ContentItem item) { - final Long flowId = (Long) radioGroup.getValue(state); - final ContentSection section = creationSelector.getContentSection( - state); + final Long workflowTemplateId = (Long) radioGroup.getValue(state); final Folder folder = creationSelector.getFolder(state); - final WorkflowTemplate template; - + final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); - final PermissionChecker permissionChecker = cdiUtil - .findBean(PermissionChecker.class); - final WorkflowTemplateRepository templateRepo = cdiUtil - .findBean(WorkflowTemplateRepository.class); - - if (flowId != null - && permissionChecker.isPermitted( - ItemPrivileges.APPLY_ALTERNATE_WORKFLOW, folder)) { - template = templateRepo - .findById(flowId) - .orElseThrow(() -> new IllegalArgumentException(String.format( - "No WorkflowTemplate with ID %d in database. " - + "Where did that ID come from?"))); - } else { - template = item.getContentType().getDefaultWorkflow(); - } - - if (template != null) { - - final WorkflowManager workflowManager = cdiUtil - .findBean(WorkflowManager.class); - - final Workflow workflow = workflowManager.createWorkflow(template, - item); - workflowManager.start(workflow); - - if (!workflow.getTasks().isEmpty()) { - - if (workflow.getTasks().get(0) instanceof AssignableTask) { - - final AssignableTaskManager taskManager = cdiUtil - .findBean(AssignableTaskManager.class); - final AssignableTask task = (AssignableTask) workflow - .getTasks() - .get(0); - taskManager.lockTask(task); - } - } - } + final ApplyWorkflowController controller = cdiUtil + .findBean(ApplyWorkflowController.class); + + controller.applyWorkflow(item, folder, workflowTemplateId); + +// final WorkflowTemplate template; +// +// final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); +// final PermissionChecker permissionChecker = cdiUtil +// .findBean(PermissionChecker.class); +// final WorkflowTemplateRepository templateRepo = cdiUtil +// .findBean(WorkflowTemplateRepository.class); +// +// if (flowId != null +// && permissionChecker.isPermitted( +// ItemPrivileges.APPLY_ALTERNATE_WORKFLOW, folder)) { +// template = templateRepo +// .findById(flowId) +// .orElseThrow(() -> new IllegalArgumentException(String.format( +// "No WorkflowTemplate with ID %d in database. " +// + "Where did that ID come from?"))); +// } else { +// template = item.getContentType().getDefaultWorkflow(); +// } +// +// if (template != null) { +// +// final WorkflowManager workflowManager = cdiUtil +// .findBean(WorkflowManager.class); +// +// final Workflow workflow = workflowManager.createWorkflow(template, +// item); +// workflowManager.start(workflow); +// +// if (!workflow.getTasks().isEmpty()) { +// +// if (workflow.getTasks().get(0) instanceof AssignableTask) { +// +// final AssignableTaskManager taskManager = cdiUtil +// .findBean(AssignableTaskManager.class); +// final AssignableTask task = (AssignableTask) workflow +// .getTasks() +// .get(0); +// taskManager.lockTask(task); +// } +// } +// } } @@ -269,12 +276,20 @@ public class ApplyWorkflowFormSection @Override protected ContentSection getContentSection(final PageState state) { + return creationSelector.getContentSection(state); } @Override protected List getCollection(final PageState state) { - return super.getCollection(state); + final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); + final ApplyWorkflowController controller = cdiUtil + .findBean(ApplyWorkflowController.class); + + final ContentSection section = creationSelector + .getContentSection(state); + + return controller.getWorkflowTemplates(section); } } diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/authoring/CreationSelector.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/authoring/CreationSelector.java index 485b13dca..9f530b86d 100755 --- a/ccm-cms/src/main/java/com/arsdigita/cms/ui/authoring/CreationSelector.java +++ b/ccm-cms/src/main/java/com/arsdigita/cms/ui/authoring/CreationSelector.java @@ -31,7 +31,6 @@ import com.arsdigita.bebop.parameters.LongParameter; import com.arsdigita.cms.ItemSelectionModel; import com.arsdigita.cms.ui.ContentItemPage; import com.arsdigita.cms.ui.folder.FolderSelectionModel; -import com.arsdigita.cms.ui.item.ItemCreateForm; import com.arsdigita.util.UncheckedWrapperException; import com.arsdigita.web.RedirectSignal; import com.arsdigita.web.URL; @@ -45,6 +44,7 @@ import org.librecms.contentsection.ContentType; import org.librecms.contentsection.ContentTypeManager; import org.librecms.contentsection.ContentTypeRepository; import org.librecms.contentsection.Folder; +import org.librecms.contentsection.FolderRepository; import org.librecms.contenttypes.AuthoringKitInfo; import org.librecms.contenttypes.ContentTypeInfo; import org.librecms.contenttypes.ContentTypesManager; @@ -92,7 +92,7 @@ public class CreationSelector extends MetaForm { private final FolderSelectionModel folderSelectionModel; private final SingleSelectionModel typeSelectionModel; - private static Class[] arguments = new Class[]{ + private static final Class[] ARGUMENTS = new Class[]{ ItemSelectionModel.class, CreationSelector.class }; @@ -108,11 +108,13 @@ public class CreationSelector extends MetaForm { * Constructs a new CreationSelector. Load all the possible * creation components from the database and stick them in the Map. * - * @param typeSelectionModel the {@link SingleSelectionModel} which will - * supply a BigDecimal ID of the content type to instantiate + * @param typeSelectionModel the {@link SingleSelectionModel} which will + * supply a BigDecimal ID of the content type to + * instantiate * * @param folderSelectionModel the {@link FolderSelectionModel} containing - * the folder in which new items are to be created + * the folder in which new items are to be + * created */ public CreationSelector(final SingleSelectionModel typeSelectionModel, final FolderSelectionModel folderSelectionModel) { @@ -156,8 +158,8 @@ public class CreationSelector extends MetaForm { throw new UncheckedWrapperException(String.format( "Type with id %d not found.", typeId)); } - final ContentTypeInfo typeInfo = typesManager.getContentTypeInfo( - type.get()); + final ContentTypeInfo typeInfo = typesManager + .getContentTypeInfo(type.get()); final AuthoringKitInfo kit = typeInfo.getAuthoringKit(); component = instantiateKitComponent(kit, type.get()); if (component != null) { @@ -195,24 +197,25 @@ public class CreationSelector extends MetaForm { final Object[] vals; try { - final ItemSelectionModel itemModel = new ItemSelectionModel(type, - itemIdParameter); - vals = new Object[]{itemModel, this}; + final ItemSelectionModel itemSelectionModel + = new ItemSelectionModel( + type, itemIdParameter); + vals = new Object[]{itemSelectionModel, this}; final Constructor constructor = createClass - .getConstructor(arguments); + .getConstructor(ARGUMENTS); final Component component = (Component) constructor .newInstance(vals); return component; } catch (IllegalAccessException - | IllegalArgumentException - | InstantiationException - | NoSuchMethodException - | SecurityException - | InvocationTargetException ex) { - LOGGER.error("\"Failed to instantiate creation component \"{}\".", + | IllegalArgumentException + | InstantiationException + | NoSuchMethodException + | SecurityException + | InvocationTargetException ex) { + LOGGER.error("Failed to instantiate creation component \"{}\".", kit.getCreateComponent().getName()); - LOGGER.error(ex); + LOGGER.error("Exception: ", ex); throw new UncheckedWrapperException(String.format( "Failed to instantiate creation component \"%s\".", kit.getCreateComponent().getName()), @@ -227,10 +230,10 @@ public class CreationSelector extends MetaForm { * @param state represents the current request * * @return the currently selected folder, in which new items should be - * placed. + * placed. */ public final Folder getFolder(final PageState state) { - return (Folder) folderSelectionModel.getSelectedObject(state); + return folderSelectionModel.getSelectedObject(state); } /** @@ -244,9 +247,12 @@ public class CreationSelector extends MetaForm { * @return the currently selected content section. */ public final ContentSection getContentSection(final PageState state) { - final ContentSection section = getFolder(state).getSection(); - return section; + final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); + final CreationSelectorController controller = cdiUtil + .findBean(CreationSelectorController.class); + + return controller.getContentSectionForFolder(getFolder(state)); } /** @@ -255,7 +261,7 @@ public class CreationSelector extends MetaForm { * complete. * * @param state the page state - * @param item the newly created item + * @param item the newly created item */ public void editItem(final PageState state, final ContentItem item) { final ContentSection section = getContentSection(state); diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/authoring/CreationSelectorController.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/authoring/CreationSelectorController.java new file mode 100644 index 000000000..60974a12c --- /dev/null +++ b/ccm-cms/src/main/java/com/arsdigita/cms/ui/authoring/CreationSelectorController.java @@ -0,0 +1,61 @@ +/* + * 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.authoring; + +import org.librecms.contentsection.ContentSection; +import org.librecms.contentsection.ContentSectionRepository; +import org.librecms.contentsection.Folder; +import org.librecms.contentsection.FolderRepository; + +import javax.enterprise.context.RequestScoped; +import javax.inject.Inject; +import javax.transaction.Transactional; + +/** + * + * @author Jens Pelzetter + */ +@RequestScoped +class CreationSelectorController { + + @Inject + private FolderRepository folderRepo; + + @Inject + private ContentSectionRepository sectionRepo; + + @Transactional(Transactional.TxType.REQUIRED) + protected ContentSection getContentSectionForFolder(final Folder folder) { + + final Folder theFolder = folderRepo + .findById(folder.getObjectId()) + .orElseThrow(() -> new IllegalArgumentException(String.format( + "No Folder with ID %d in the database. Where did that ID come from?", + folder.getObjectId()))); + + final ContentSection section = theFolder.getSection(); + + return sectionRepo + .findById(section.getObjectId()) + .orElseThrow(() -> new IllegalArgumentException(String.format( + "No ContentSection with ID %d in the database.", + section.getObjectId()))); + } + +} diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/authoring/PageCreateForm.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/authoring/PageCreateForm.java index 13d09dd0d..b6d5606b1 100755 --- a/ccm-cms/src/main/java/com/arsdigita/cms/ui/authoring/PageCreateForm.java +++ b/ccm-cms/src/main/java/com/arsdigita/cms/ui/authoring/PageCreateForm.java @@ -23,8 +23,11 @@ import com.arsdigita.bebop.FormData; import com.arsdigita.bebop.FormProcessException; import com.arsdigita.bebop.Label; import com.arsdigita.bebop.PageState; +import com.arsdigita.bebop.Text; 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 org.librecms.contentsection.ContentSection; import org.librecms.contentsection.ContentType; @@ -35,10 +38,15 @@ import com.arsdigita.globalization.GlobalizedMessage; import com.arsdigita.kernel.KernelConfig; import com.arsdigita.util.Assert; +import org.libreccm.cdi.utils.CdiUtil; +import org.libreccm.l10n.GlobalizationHelper; import org.librecms.CmsConstants; import org.librecms.contentsection.ContentItem; +import org.librecms.contenttypes.ContentTypeInfo; +import org.librecms.contenttypes.ContentTypesManager; import java.util.Locale; +import java.util.ResourceBundle; /** * A form which will create a new document (that is subclasses of class @@ -59,7 +67,7 @@ public class PageCreateForm implements FormSubmissionListener, CreationComponent { private final CreationSelector creationSelector; - private final ApplyWorkflowFormSection workflowSection; + private ApplyWorkflowFormSection workflowSection; /** * The state parameter which specifies the content section @@ -78,17 +86,12 @@ public class PageCreateForm * eventually */ public PageCreateForm(final ItemSelectionModel itemModel, - final CreationSelector creationSelector) { + final CreationSelector creationSelector) { super("PageCreate", itemModel); this.creationSelector = creationSelector; - /* Retrieve Content Type */ - final ContentType type = getItemSelectionModel().getContentType(); - /* Add workflow selection based on configured Content Type */ - workflowSection = new ApplyWorkflowFormSection(type); - workflowSection.setCreationSelector(creationSelector); addSubmissionListener(this); @@ -104,15 +107,21 @@ public class PageCreateForm @Override protected void addWidgets() { + /* Retrieve Content Type */ + final ContentType type = getItemSelectionModel().getContentType(); + final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); + final ContentTypesManager typesManager = cdiUtil + .findBean(ContentTypesManager.class); + final ContentTypeInfo typeInfo = typesManager.getContentTypeInfo(type); + + /* Add workflow selection based on configured Content Type */ + workflowSection = new ApplyWorkflowFormSection(type); add(workflowSection, ColumnPanel.INSERT); /* content type */ add(new Label(new GlobalizedMessage("cms.ui.authoring.content_type", CmsConstants.CMS_BUNDLE))); - /* Retrieve Content Type */ - final ContentType type = getItemSelectionModel().getContentType(); - add(new Label(type.getLabel().getValue(KernelConfig - .getConfig() - .getDefaultLocale()))); + final Label typeOutput = new Label(new ContentTypePrintListener(typeInfo)); + add(typeOutput); /* language selection */ add(new Label(new GlobalizedMessage("cms.ui.language.field", CmsConstants.CMS_BUNDLE))); @@ -138,6 +147,7 @@ public class PageCreateForm * Create a new item id. * * @param event + * * @throws com.arsdigita.bebop.FormProcessException */ @Override @@ -150,6 +160,7 @@ public class PageCreateForm * component. * * @param event + * * @throws com.arsdigita.bebop.FormProcessException */ @Override @@ -180,7 +191,7 @@ public class PageCreateForm @Override public void validate(final FormSectionEvent event) throws FormProcessException { - + final Folder folder = creationSelector.getFolder(event.getPageState()); validateNameUniqueness(folder, event); } @@ -194,9 +205,9 @@ public class PageCreateForm * @throws FormProcessException */ @Override - public void process(final FormSectionEvent event) + public void process(final FormSectionEvent event) throws FormProcessException { - + final FormData data = event.getFormData(); final PageState state = event.getPageState(); final ContentSection section = creationSelector.getContentSection(state); @@ -204,17 +215,43 @@ public class PageCreateForm Assert.exists(section, ContentSection.class); - final ContentItem item = createContentPage(state, + final ContentItem item = createContentPage(state, (String) data.get(NAME), section, folder); final Locale locale = new Locale((String) data.get(LANGUAGE)); item.getName().addValue(locale, (String) data.get(NAME)); item.getTitle().addValue(locale, (String) data.get(TITLE)); - + workflowSection.applyWorkflow(state, item); creationSelector.editItem(state, item); } + private class ContentTypePrintListener implements PrintListener { + + private final ContentTypeInfo typeInfo; + + public ContentTypePrintListener(final ContentTypeInfo typeInfo) { + this.typeInfo = typeInfo; + } + + @Override + public void prepare(final PrintEvent event) { + + final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); + final GlobalizationHelper globalizationHelper = cdiUtil + .findBean(GlobalizationHelper.class); + final ResourceBundle bundle = ResourceBundle + .getBundle(typeInfo.getLabelBundle(), + globalizationHelper.getNegotiatedLocale()); + + final String typeLabel = bundle.getString(typeInfo.getLabelKey()); + + final Label target = (Label) event.getTarget(); + target.setLabel(typeLabel); + } + + } + } diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/workflow/WorkflowsOptionPrintListener.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/workflow/WorkflowsOptionPrintListener.java index 06c146ef9..6b3bd9a86 100755 --- a/ccm-cms/src/main/java/com/arsdigita/cms/ui/workflow/WorkflowsOptionPrintListener.java +++ b/ccm-cms/src/main/java/com/arsdigita/cms/ui/workflow/WorkflowsOptionPrintListener.java @@ -25,10 +25,11 @@ import com.arsdigita.bebop.form.Option; import com.arsdigita.bebop.form.OptionGroup; import com.arsdigita.cms.CMS; import com.arsdigita.kernel.KernelConfig; + import java.util.List; + import org.libreccm.cdi.utils.CdiUtil; import org.librecms.contentsection.ContentSection; -import org.libreccm.workflow.Task; import org.libreccm.workflow.WorkflowTemplate; /** @@ -41,9 +42,12 @@ import org.libreccm.workflow.WorkflowTemplate; public class WorkflowsOptionPrintListener implements PrintListener { protected List getCollection(final PageState state) { - final ContentSection section = getContentSection(state); - - return section.getWorkflowTemplates(); + + final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); + final WorkflowsOptionPrintListenerController controller = cdiUtil + .findBean(WorkflowsOptionPrintListenerController.class); + + return controller.getWorkflowTemplates(getContentSection(state)); } protected ContentSection getContentSection(final PageState state) { @@ -52,6 +56,7 @@ public class WorkflowsOptionPrintListener implements PrintListener { @Override public void prepare(final PrintEvent event) { + final PageState state = event.getPageState(); final OptionGroup target = (OptionGroup) event.getTarget(); diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/workflow/WorkflowsOptionPrintListenerController.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/workflow/WorkflowsOptionPrintListenerController.java new file mode 100644 index 000000000..ef1541a5c --- /dev/null +++ b/ccm-cms/src/main/java/com/arsdigita/cms/ui/workflow/WorkflowsOptionPrintListenerController.java @@ -0,0 +1,59 @@ +/* + * 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.workflow; + + +import org.libreccm.workflow.WorkflowTemplate; +import org.librecms.contentsection.ContentSection; +import org.librecms.contentsection.ContentSectionRepository; + +import java.util.List; +import java.util.Objects; + +import javax.enterprise.context.RequestScoped; +import javax.inject.Inject; +import javax.transaction.Transactional; + +/** + * + * @author Jens Pelzetter + */ +@RequestScoped +class WorkflowsOptionPrintListenerController { + + @Inject + private ContentSectionRepository sectionRepo; + + @Transactional(Transactional.TxType.REQUIRED) + protected List getWorkflowTemplates( + final ContentSection section) { + + Objects.requireNonNull(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 contentSection.getWorkflowTemplates(); + } + +} diff --git a/ccm-cms/src/main/java/org/librecms/contentsection/ContentSection.java b/ccm-cms/src/main/java/org/librecms/contentsection/ContentSection.java index cccabe23d..710e1d3e3 100644 --- a/ccm-cms/src/main/java/org/librecms/contentsection/ContentSection.java +++ b/ccm-cms/src/main/java/org/librecms/contentsection/ContentSection.java @@ -41,7 +41,6 @@ import java.util.ArrayList; import javax.persistence.NamedQueries; import javax.persistence.NamedQuery; import javax.persistence.OneToMany; -import org.libreccm.core.CoreConstants; import org.libreccm.workflow.WorkflowTemplate; import org.librecms.contentsection.privileges.AssetPrivileges; diff --git a/ccm-cms/src/main/java/org/librecms/contenttypes/ContentTypesManager.java b/ccm-cms/src/main/java/org/librecms/contenttypes/ContentTypesManager.java index 351ed5818..56574a1f9 100644 --- a/ccm-cms/src/main/java/org/librecms/contenttypes/ContentTypesManager.java +++ b/ccm-cms/src/main/java/org/librecms/contenttypes/ContentTypesManager.java @@ -98,7 +98,7 @@ public class ContentTypesManager { final Class contentTypeClass) { Objects.requireNonNull(contentTypeClass); - + final ContentTypeInfo contentTypeInfo = new ContentTypeInfo(); contentTypeInfo.setContentItemClass(contentTypeClass); @@ -140,21 +140,22 @@ public class ContentTypesManager { } } - final AuthoringKit authoringKit = contentTypeClass.getAnnotation( - AuthoringKit.class); + final AuthoringKit authoringKit = contentTypeClass + .getAnnotation(AuthoringKit.class); if (authoringKit != null) { final AuthoringKitInfo authoringKitInfo = new AuthoringKitInfo(); authoringKitInfo.setCreateComponent(authoringKit.createComponent()); - final List steps = Arrays.stream(authoringKit - .steps()) + final List steps = Arrays + .stream(authoringKit.steps()) .map(step -> createAuthoringStepInfo(contentTypeClass, step)) .collect(Collectors.toList()); authoringKitInfo.setAuthoringSteps(steps); steps.sort((step1, step2) -> Integer.compare(step1.getOrder(), step2.getOrder())); + contentTypeInfo.setAuthoringKit(authoringKitInfo); } - + return contentTypeInfo; } @@ -176,7 +177,7 @@ public class ContentTypesManager { Objects.requireNonNull(contentTypeClass); Objects.requireNonNull(authoringStep); - + final AuthoringStepInfo stepInfo = new AuthoringStepInfo(); stepInfo.setComponent(authoringStep.component()); @@ -240,7 +241,7 @@ public class ContentTypesManager { final Class contentTypeClass) { Objects.requireNonNull(contentTypeClass); - + return createContentTypeInfo(contentTypeClass); } @@ -261,7 +262,7 @@ public class ContentTypesManager { public ContentTypeInfo getContentTypeInfo(final String contentTypeClass) { Objects.requireNonNull(contentTypeClass); - + final Class clazz; try { clazz = Class.forName(contentTypeClass); diff --git a/ccm-cms/src/main/java/org/librecms/contenttypes/MultiPartArticle.java b/ccm-cms/src/main/java/org/librecms/contenttypes/MultiPartArticle.java index 6b6b2e356..5e2df87f6 100644 --- a/ccm-cms/src/main/java/org/librecms/contenttypes/MultiPartArticle.java +++ b/ccm-cms/src/main/java/org/librecms/contenttypes/MultiPartArticle.java @@ -62,7 +62,7 @@ public class MultiPartArticle extends ContentItem implements Serializable { joinColumns = { @JoinColumn(name = "OBJECT_ID")} )) - private LocalizedString summary; + private LocalizedString summary = new LocalizedString(); @OneToMany @JoinColumn(name = "MULTIPART_ARTICLE_ID") diff --git a/ccm-cms/src/main/resources/com/arsdigita/cms/util/CMSGlobalized.java b/ccm-cms/src/main/resources/com/arsdigita/cms/util/CMSGlobalized.java new file mode 100755 index 000000000..859c50cc1 --- /dev/null +++ b/ccm-cms/src/main/resources/com/arsdigita/cms/util/CMSGlobalized.java @@ -0,0 +1,40 @@ +/* + * Copyright (C) 2002-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.util; +import com.arsdigita.globalization.Globalized; + +/** + * Modules which depend on CMS should implement this interface instead of + * com.arsdigita.globalization.Globalized to gain access to CMS globalization + * resource file (specifically important for content type packages). + * + * @author yon@arsdigita.com + * @version $Revision: #5 $ $Date: 2004/08/17 $ + */ +public interface CMSGlobalized extends Globalized { + + /* + * The central CMS resource file (per language) which may be used by + * all of CMS specific modules. + * It overwrites the file provided by globalization package as a generic + * default/fall back! + */ + public static final String BUNDLE_NAME = "com.arsdigita.cms.CMSResources"; + +} diff --git a/ccm-cms/src/main/resources/com/arsdigita/cms/util/CMSResourceBundle.java b/ccm-cms/src/main/resources/com/arsdigita/cms/util/CMSResourceBundle.java new file mode 100755 index 000000000..3d434d6be --- /dev/null +++ b/ccm-cms/src/main/resources/com/arsdigita/cms/util/CMSResourceBundle.java @@ -0,0 +1,52 @@ +/* + * Copyright (C) 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.util; + +import com.arsdigita.globalization.ChainedResourceBundle; + +import java.util.PropertyResourceBundle; +import java.util.ResourceBundle; + + +// Developers Note (2013-04): +// No longer used because we found no way to make localization work properly. +// Back to use plain property files as of 2013-04 (version 6.6.8) +// Retained for easy reference to further develop localization infrastructure. + + +/** + * Main ResourceBundle for CMS UI. + * Can be extended using: + * - addBundle - to add new keys + * - putBundle - to override keys already in CMSResources e.g. to customize + * notification email text + */ +public class CMSResourceBundle extends ChainedResourceBundle implements CMSGlobalized { + + public CMSResourceBundle() { + super(); + // addBundle((PropertyResourceBundle) getBundle(BUNDLE_NAME)); + + // try to make proper localisation work, no success, ne regression either + addBundle((PropertyResourceBundle) getBundle(BUNDLE_NAME, + ResourceBundle.Control.getNoFallbackControl( + ResourceBundle.Control.FORMAT_DEFAULT))); + } + +} diff --git a/ccm-cms/src/main/resources/com/arsdigita/cms/util/ContentItemNameFix.java b/ccm-cms/src/main/resources/com/arsdigita/cms/util/ContentItemNameFix.java new file mode 100644 index 000000000..b5f33b721 --- /dev/null +++ b/ccm-cms/src/main/resources/com/arsdigita/cms/util/ContentItemNameFix.java @@ -0,0 +1,516 @@ +/* + * Copyright (C) 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.util; + +import com.arsdigita.cms.ContentBundle; +import com.arsdigita.cms.ContentItem; +import com.arsdigita.cms.ItemCollection; +import com.arsdigita.cms.Folder; +import com.arsdigita.cms.TextAsset; +import com.arsdigita.cms.contenttypes.GenericArticle; +import com.arsdigita.kernel.Kernel; +import com.arsdigita.kernel.KernelExcursion; +import com.arsdigita.persistence.DataCollection; +import com.arsdigita.persistence.DataObject; +import com.arsdigita.persistence.Session; +import com.arsdigita.persistence.SessionManager; +import com.arsdigita.persistence.TransactionContext; +import com.arsdigita.util.cmd.Program; + +import org.apache.commons.cli.CommandLine; +import org.apache.commons.cli.OptionBuilder; +import org.jsoup.Jsoup; +import org.jsoup.nodes.Document; +import org.jsoup.nodes.Element; +import org.jsoup.select.Elements; + +import java.util.HashSet; +import java.util.Set; + +/** + * + * @author Jens Pelzetter + */ +@SuppressWarnings("PMD.SystemPrintln") +public class ContentItemNameFix extends Program { + + private boolean pretend = false; + + public ContentItemNameFix() { + super("ContentItemNameFix", "1.0.0", ""); + + getOptions().addOption( + OptionBuilder + .hasArg(false) + .withLongOpt("pretend") + .withDescription("Only show what would be done") + .create("p")); + } + + public static final void main(final String[] args) { + new ContentItemNameFix().run(args); + } + + @Override + protected void doRun(final CommandLine cmdLine) { + + System.out.printf("Running ContentItemNameFix...\n"); + + pretend = cmdLine.hasOption("p"); + + if (pretend) { + System.out.printf("Pretend option is on, only showing what would be done...\n\n"); + } else { + System.out.print("\n"); + } + + new KernelExcursion() { + + @Override + protected void excurse() { + setEffectiveParty(Kernel.getSystemParty()); + + final Set linksToCheck = new HashSet(); + + final Session session = SessionManager.getSession(); + final TransactionContext transactionContext = session.getTransactionContext(); + + transactionContext.beginTxn(); + + final DataCollection draftFolders = session.retrieve(Folder.BASE_DATA_OBJECT_TYPE); + draftFolders.addEqualsFilter(ContentItem.VERSION, "draft"); + + while (draftFolders.next()) { + checkFolder(draftFolders.getDataObject(), linksToCheck); + } + + final DataCollection draftBundles = session.retrieve( + ContentBundle.BASE_DATA_OBJECT_TYPE); + draftBundles.addEqualsFilter(ContentItem.VERSION, "draft"); + + while (draftBundles.next()) { + checkBundle(draftBundles.getDataObject(), linksToCheck); + + } + + transactionContext.commitTxn(); + + System.out.println("-------------------------------------------------------------"); + + System.out.println("Checking for potentially brocken links..."); + System.out.println("GenericArticle (ccm-cms-types-article, ccm-cms-types-news, ..."); + System.out.println(""); + + final DataCollection articles = session.retrieve( + GenericArticle.BASE_DATA_OBJECT_TYPE); + articles.addEqualsFilter(ContentItem.VERSION, "draft"); + while (articles.next()) { + checkArticle(articles.getDataObject(), linksToCheck); + } + + System.out.println(""); + System.out.println("MultiPartArticles..."); + System.out.println(""); + + final DataCollection mpArticles = session.retrieve( + "com.arsdigita.cms.contenttypes.MultiPartArticle"); + mpArticles.addEqualsFilter(ContentItem.VERSION, "draft"); + while (mpArticles.next()) { + checkMpArticle(mpArticles.getDataObject(), linksToCheck); + } + + } + + }.run(); + + } + + private void checkFolder(final DataObject folderObj, final Set linksToCheck) { + + final Folder draftFolder = new Folder(folderObj); + final Folder liveFolder = (Folder) draftFolder.getLiveVersion(); + + if (liveFolder != null && !draftFolder.getName().equals(liveFolder.getName())) { + System.out.printf("Problems with folder %s:/%s (id: %s):\n", + draftFolder.getContentSection().getName(), + draftFolder.getPath(), + draftFolder.getID().toString()); + System.out.printf("\t Live Folder has wrong name: Is '%s' but should be '%s'.", + liveFolder.getName(), + draftFolder.getName()); + + linksToCheck.add(new LinkToCheck(liveFolder.getName(), + draftFolder.getName(), + String.format("%s:/%s", + liveFolder.getContentSection().getName(), + liveFolder.getPath()), + String.format("%s:/%s", + draftFolder.getContentSection().getName(), + draftFolder.getPath()))); + + if (pretend) { + System.out.print("\n\n"); + } else { + + liveFolder.setName(draftFolder.getName()); + System.out.print(" Corrected.\n\n"); + } + + } + } + + private void checkBundle(final DataObject bundleObj, final Set linksToCheck) { + + final ContentBundle draftBundle = new ContentBundle(bundleObj); + final ContentItem primaryDraftItem = draftBundle.getPrimaryInstance(); + + final String itemId = primaryDraftItem.getID().toString(); + final String itemPath = String.format("%s:/%s", + primaryDraftItem.getContentSection().getName(), + primaryDraftItem.getPath()); + + final HeaderStatus headerStatus = new HeaderStatus(); + + //This is our reference, all bundles, instances etc belonging to the item sould have this + //name + final String itemName = primaryDraftItem.getName(); + + if (!draftBundle.getName().equals(itemName)) { + printItemHeaderLine(itemId, itemPath, headerStatus); + + System.out.printf( + "\t Draft ContentBundle has wrong name: Is '%s' but should be '%s'.", + itemName, + draftBundle.getName()); + + linksToCheck.add(new LinkToCheck(draftBundle.getName(), + itemName, + String.format("%s:/%s", + draftBundle.getContentSection().getName(), + draftBundle.getPath()), + itemPath)); + + if (pretend) { + System.out.print("\n"); + } else { + draftBundle.setName(itemName); + System.out.printf(" Corrected.\n"); + } + } + + checkInstances(draftBundle, itemName, itemId, itemPath, headerStatus, linksToCheck); + + final ContentBundle liveBundle = (ContentBundle) draftBundle.getLiveVersion(); + if (liveBundle != null) { + if (!liveBundle.getName().equals(itemName)) { + printItemHeaderLine(itemId, itemPath, headerStatus); + + System.out.printf( + "\tLive ContentBundle has wrong name. Should be '%s' but is '%s'", + itemName, + liveBundle.getName()); + + linksToCheck.add(new LinkToCheck(liveBundle.getName(), + itemName, + String.format("%s:/%s", + liveBundle.getContentSection() + .getName(), + liveBundle.getPath()), + itemPath)); + + if (pretend) { + System.out.print("\n"); + } else { + liveBundle.setName(itemName); + System.out.printf(" Corrected.\n"); + } + } + + checkInstances(liveBundle, itemName, itemId, itemPath, headerStatus, linksToCheck); + } + + if (headerStatus.isHeaderPrinted()) { + System.out.print("\n"); + } + + } + + private void checkInstances(final ContentBundle draftBundle, + final String itemName, + final String itemId, + final String itemPath, + final HeaderStatus headerStatus, + final Set linksToCheck) { + final ItemCollection instances = draftBundle.getInstances(); + ContentItem current; + while (instances.next()) { + current = instances.getContentItem(); + + if (!itemName.equals(current.getName())) { + printItemHeaderLine(itemId, itemPath, headerStatus); + System.out.printf( + "\t%s instance %s (language: %s has wrong name. Should be '%s', but is '%s'.", + current.getVersion(), + current.getID().toString(), + current.getLanguage(), + itemName, + current.getName()); + + linksToCheck.add(new LinkToCheck(current.getName(), + itemName, + String.format("%s:/%s", + current.getContentSection().getName(), + current.getPath()), + itemPath)); + + if (pretend) { + System.out.print("\n"); + } else { + current.setName(itemName); + System.out.printf(" Corrected.\n"); + } + } + } + + } + + private class HeaderStatus { + + private boolean headerPrinted = false; + + public HeaderStatus() { + //Nothing + } + + public boolean isHeaderPrinted() { + return headerPrinted; + } + + public void setHeaderPrinted(final boolean headerPrinted) { + this.headerPrinted = headerPrinted; + } + + } + + private void printItemHeaderLine(final String itemId, + final String itemPath, + final HeaderStatus headerStatus) { + if (!headerStatus.isHeaderPrinted()) { + System.out.printf("Problems with item %s (id: %s):\n", itemPath, itemId); + headerStatus.setHeaderPrinted(true); + } + } + + private class LinkToCheck { + + private String wrongName; + private String correctName; + private String wrongPath; + private String correctPath; + + public LinkToCheck() { + //Nothing + } + + public LinkToCheck(final String wrongName, + final String correctName, + final String wrongPath, + final String correctPath) { + this.wrongName = wrongName; + this.correctName = correctName; + this.wrongPath = wrongPath; + this.correctPath = correctPath; + } + + public String getWrongName() { + return wrongName; + } + + public void setWrongName(final String wrongName) { + this.wrongName = wrongName; + } + + public String getCorrectName() { + return correctName; + } + + public void setCorrectName(final String correctName) { + this.correctName = correctName; + } + + public String getWrongPath() { + return wrongPath; + } + + public void setWrongPath(final String wrongPath) { + this.wrongPath = wrongPath; + } + + public String getCorrectPath() { + return correctPath; + } + + public void setCorrectPath(final String correctPath) { + this.correctPath = correctPath; + } + + @Override + public int hashCode() { + int hash = 7; + if (wrongName == null) { + hash = 47 * hash; + } else { + hash = 47 * hash + wrongName.hashCode(); + } + + if (correctName == null) { + hash = 47 * hash; + } else { + hash = 47 * hash + correctName.hashCode(); + } + + return hash; + } + + @Override + public boolean equals(final Object obj) { + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + final LinkToCheck other = (LinkToCheck) obj; + if (wrongName == null && other.getWrongName() != null) { + return false; + } + + if (wrongName != null && other.getWrongName() == null) { + return false; + } + + if (correctName == null && other.getCorrectName() != null) { + return false; + } + + if (correctName != null && other.getCorrectName() == null) { + return false; + } + + return ((correctName.equals(other.getCorrectName())) + && (wrongName.equals(other.getWrongName()))); + } + + } + + private void checkArticle(final DataObject articleObj, + final Set linksToCheck) { + final GenericArticle article = new GenericArticle(articleObj); + + final TextAsset textAsset = article.getTextAsset(); + + if (textAsset == null) { + return; + } + + final String text = textAsset.getText(); + + if (text == null) { + return; + } + + for (LinkToCheck linkToCheck : linksToCheck) { + //if (text.contains(linkToCheck.getWrongName())) { + + /*if (text.matches(String.format("^(.*)href=\"(.*)%s(.*)\"(.*)$" + linkToCheck.getWrongName()))) {*/ + if (checkForPotentialBrockenLink(text, linkToCheck.getWrongName())) { + System.out.printf("Found a potenially brocken link in article item %s:/%s:\n", + article.getContentSection().getName(), + article.getPath()); + System.out.printf("\tLook for a link containing to path '%s' and replace it with " + + "the stable link to the target item %s.\n\n", + linkToCheck.getWrongPath(), + linkToCheck.getCorrectPath()); + } + } + } + + private void checkMpArticle(final DataObject mpArticleObj, + final Set linksToCheck) { + final ContentItem mpItem = new ContentItem(mpArticleObj); + final DataCollection sections = (DataCollection) mpArticleObj.get("sections"); + + while (sections.next()) { + checkMpSection(mpItem, sections.getDataObject(), linksToCheck); + } + } + + private void checkMpSection(final ContentItem mpItem, + final DataObject sectionObj, + final Set linksToCheck) { + final DataObject textAssetObj = (DataObject) sectionObj.get("text"); + + if (textAssetObj == null) { + return; + } + + final String text = (String) textAssetObj.get(TextAsset.CONTENT); + + if (text == null) { + return; + } + + for (LinkToCheck linkToCheck : linksToCheck) { + //if (text.contains(linkToCheck.getWrongName())) { + /*if (text.matches(String.format("^(.*)href=\"(.*)%s(.*)\"(.*)$", + linkToCheck.getWrongName()))) {*/ + if(checkForPotentialBrockenLink(text, linkToCheck.getWrongName())) { + System.out.printf("Found a potenially brocken link in section '%s' of " + + "MultiPartArticle %s:/%s.\n", + (String) sectionObj.get("title"), + mpItem.getContentSection().getName(), + mpItem.getPath()); + System.out.printf("\tLook for a link containing to path '%s' and replace it with " + + "the stable link to the target item %s.\n\n", + linkToCheck.getWrongPath(), + linkToCheck.getCorrectPath()); + } + } + } + + /** + * Returns {@code true} if a match for {@code checkFor} is found in the links of {@code text}. + * @param text + * @param checkFor + * @return + */ + private boolean checkForPotentialBrockenLink(final String text, final String checkFor) { + final Document document = Jsoup.parseBodyFragment(text); + + final Elements links = document.select("a"); + boolean result = false; + for(Element link : links) { + result = (link.attr("href").contains(checkFor)); + } + + return result; + + } +} diff --git a/ccm-cms/src/main/resources/com/arsdigita/cms/util/GlobalizationUtil.java b/ccm-cms/src/main/resources/com/arsdigita/cms/util/GlobalizationUtil.java new file mode 100755 index 000000000..02e5b58e7 --- /dev/null +++ b/ccm-cms/src/main/resources/com/arsdigita/cms/util/GlobalizationUtil.java @@ -0,0 +1,73 @@ +/* + * Copyright (C) 2002-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.util; + +import com.arsdigita.globalization.Globalized; +import com.arsdigita.globalization.GlobalizedMessage; + +/** + * Compilation of methods to simplify the handling of globalizing keys. + * Basically it adds the name of package's resource bundle files to the + * globalize methods and forwards to GlobalizedMessage, shortening the + * method invocation in the various application classes. + * + * @author yon@arsdigita.com + * @version $Revision: #7 $ $Date: 2004/08/17 $ + */ +public class GlobalizationUtil implements Globalized { + + /** Name of Java resource files to handle CMS's globalisation. */ + private static final String BUNDLE_NAME = "com.arsdigita.cms.CMSResources"; + + /** + * Returns a globalized message using the package specific bundle, + * provided by BUNDLE_NAME. + * @param key + * @return + */ + public static GlobalizedMessage globalize(String key) { + return new GlobalizedMessage(key, BUNDLE_NAME); + } + + /** + * Returns a globalized message object, using the package specific bundle, + * as specified by BUNDLE_NAME. Also takes in an Object[] of arguments to + * interpolate into the retrieved message using the MessageFormat class. + * @param key + * @param args + * @return + */ + public static GlobalizedMessage globalize(String key, Object[] args) { + return new GlobalizedMessage(key, BUNDLE_NAME, args); + } + + /** + * Returns the name of the package specific resource bundle. + * + * Used e.g. by com.arsdigita.cms.ui.item.ItemLanguageTable to get the + * bundle tp pass to DataTable. + * + * @return Name of resource bundle as String + */ + public static String getBundleName() { + return BUNDLE_NAME; + } + +} diff --git a/ccm-cms/src/main/resources/com/arsdigita/cms/util/GlobalizationUtilOld.java b/ccm-cms/src/main/resources/com/arsdigita/cms/util/GlobalizationUtilOld.java new file mode 100755 index 000000000..09ca063fc --- /dev/null +++ b/ccm-cms/src/main/resources/com/arsdigita/cms/util/GlobalizationUtilOld.java @@ -0,0 +1,81 @@ +/* + * Copyright (C) 2002-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.util; + +import com.arsdigita.globalization.GlobalizedMessage; + + +// Developers Note: +// Counterpart to CMSResourceBundle java class. +// No longer used because we couldn't find a way to make proper localization +// work. +// Retained for easy reference to further develop localization infrastructure. + + +/** + *

+ * . + * Contains methods to simplify globalizing keys + *

+ * + * @author yon@arsdigita.com + * @version $Revision: #7 $ $Date: 2004/08/17 $ + */ +public class GlobalizationUtilOld { + + /** Name of the Java class to handle CMS's globalisation. */ + //public static String s_bundleName = "com.arsdigita.cms.util.CMSResourceBundle"; + public static String s_bundleName = "com.arsdigita.cms.CMSResources"; + + /** + * This returns a globalized message using the package specific bundle, + * provided by method getBundleName() + */ + public static GlobalizedMessage globalize(String key) { + return new GlobalizedMessage(key, getBundleName()); + } + + /** + * Returns a globalized message object, using the package specific bundle, + * provided by method getBundleName(). Also takes in an Object[] of + * arguments to interpolate into the retrieved message using the + * MessageFormat class. + */ + public static GlobalizedMessage globalize(String key, Object[] args) { + return new GlobalizedMessage(key, getBundleName(), args); + } + + /** + * Returns the name of the package specific resource bundle. + * @return + */ + public static String getBundleName() { + return s_bundleName; + } + + /* + * Not a part of API. Otherwise it would need to be properly synchronized. + * Only meant be used to override resource keys in CMSResources + * by a custom application, in Initializer. + */ + public static void internalSetBundleName(String bundleName) { + s_bundleName = bundleName; + } + +} diff --git a/ccm-cms/src/main/resources/com/arsdigita/cms/util/LanguageUtil.java b/ccm-cms/src/main/resources/com/arsdigita/cms/util/LanguageUtil.java new file mode 100755 index 000000000..b5b3632a5 --- /dev/null +++ b/ccm-cms/src/main/resources/com/arsdigita/cms/util/LanguageUtil.java @@ -0,0 +1,238 @@ +/* + * Copyright (C) 2003-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.util; + +import com.arsdigita.cms.ContentBundle; +import com.arsdigita.cms.ContentPage; +import com.arsdigita.globalization.GlobalizationHelper; +import com.arsdigita.globalization.GlobalizedMessage; +import com.arsdigita.kernel.Kernel; +import com.arsdigita.util.Assert; +import com.arsdigita.util.Pair; + +import java.util.Collection; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.Locale; +import java.util.MissingResourceException; +import java.util.ResourceBundle; +import java.util.StringTokenizer; + +/** + * Utility methods for dealing with the multilingual items. + * + * @author Shashin Shinde (sshinde@redhat.com) + * @author Sören Bernstein + */ +public class LanguageUtil { + + private static org.apache.log4j.Logger s_log = org.apache.log4j.Logger.getLogger( + LanguageUtil.class); + private static String s_languages = null; + private static String[] s_languagesArray = null; + /** + * Mapping from the ISO639-1 2-letter codes to the ISO639-2 3-letter codes + */ + private static final String ISO639_2LA_3LA = "com.arsdigita.cms.util.iso639rev"; + private static ResourceBundle s_lang3LA = ResourceBundle.getBundle(ISO639_2LA_3LA); + /** + * Mapping from the ISO639-1 2-letter codes to the full descriptive name + */ + private static final String ISO639_2LA_FULL = "com.arsdigita.cms.util.iso639full"; + private static ResourceBundle s_langFull = ResourceBundle.getBundle(ISO639_2LA_FULL); + + public static GlobalizedMessage globalize(String key) { + return new LanguageGlobalizedMessage(key); + } + + /** + * Sets the supported languages, eliminates all spaces and trims + * + * @param comma separated list of langages initialized from initializer at the server startup + */ + public static void setSupportedLanguages(String languages) { + s_languages = languages.replace(" ", "").trim(); + } + + /** + * Get the comma separated list of all supported languages + */ + public static String getSupportedLanguages() { + Assert.exists(s_languages, "supported languages not set"); + return s_languages; + } + + /** + * Returns the collection of all supported languages. + * + * @return all supported languages + */ + public static Collection getSupportedLanguages2LA() { + String allLanguages = getSupportedLanguages(); + StringTokenizer tokenizer = new StringTokenizer(allLanguages, ","); + Collection langList = new LinkedList(); + while (tokenizer.hasMoreElements()) { + String language = tokenizer.nextToken(); + langList.add(language); + } + return langList; + } + + /** + * Returns the collection of all supported languages. Each entry is a pair of 2 letter code as + * key and three letter code as value. + * + * @return all supported languages + */ + public static Collection getSupportedLanguages3LA() { + String allLanguages = getSupportedLanguages(); + StringTokenizer tokenizer = new StringTokenizer(allLanguages, ","); + Collection langList = new LinkedList(); + while (tokenizer.hasMoreElements()) { + String language = tokenizer.nextToken(); + langList.add(new Pair(language, getLang3LA(language))); + } + return langList; + } + + /** + * Returns the collection of all supported languages. Each entry is a pair of 2 letter code as + * key and full language name as a value. + * + * @return all supported languages + */ + public static Collection getSupportedLanguagesFull() { + String allLanguages = getSupportedLanguages(); + StringTokenizer tokenizer = new StringTokenizer(allLanguages, ","); + Collection langList = new LinkedList(); + while (tokenizer.hasMoreElements()) { + String language = tokenizer.nextToken(); + langList.add(new Pair(language, getLangFull(language))); + } + return langList; + } + + /** + * Get the List of languages in which this item can be created. Usefull on UI where we need to + * display the list of languages in which this Item can be created. + */ + public static Collection getCreatableLanguages(ContentPage item) { + ContentBundle bundle = item.getContentBundle(); + Collection allList = getSupportedLanguages2LA(); + allList.removeAll(bundle.getLanguages()); + return allList; + } + + /** + * Returns three letter acronym for language code mapped from two letter code. + * + * @return three letter code for the two letter code. If the resource is not found then the key + * itself is returned. + */ + public static String getLang3LA(String lang) { + String threeLA; + try { + // Lookup 3-letter language code via java.util.Locale + threeLA = (new Locale(lang)).getISO3Language(); + } catch (MissingResourceException mre) { + // If there is none + try { + // Lookup 3-letter code via ressource bundle + threeLA = s_lang3LA.getString(lang); + } catch (MissingResourceException mexc) { + // if there is still no match, log a warning and return the 2-letter code + s_log.warn("Three letter language code for key '" + lang + "' not found: " + mexc); + threeLA = lang; + } + } + return threeLA; + } + + /** + * Returns the full language name mapped from the two letter acronym. + * + * @param lang 2 letter language code + * + * @return full language name for the given two letter code If the resource is not found then + * the key itself is returned. + */ + public static String getLangFull(String lang) { + // Lookup language name via java.util.Locale + String fullName = (new Locale(lang)).getDisplayLanguage(GlobalizationHelper. + getNegotiatedLocale()); + + if (lang.equals(fullName)) { + // If that fails + try { + // Lookup language name vie ressource bundle + fullName = s_langFull.getString(lang); + } catch (MissingResourceException mexc) { + // If there is still nomatch, log a warning and return 2-letter code + s_log.warn("Full language name for key '" + lang + "' not found " + mexc); + fullName = lang; + } + } + return fullName; + } + + /** + * Takes in a list of 2 letter codes and converts into 3 letter codes. Each entry is pair of 2 + * letter code as key and 3 letter code as value. + */ + public static Collection convertTo3LA(Collection list) { + Collection conList = new LinkedList(); + for (Iterator iter = list.iterator(); iter.hasNext();) { + String lang2Code = (String) iter.next(); + conList.add(new Pair(lang2Code, getLang3LA(lang2Code))); + } + return conList; + } + + public static Collection convertToFull(Collection list) { + Collection conList = new LinkedList(); + for (Iterator iter = list.iterator(); iter.hasNext();) { + String lang2Code = (String) iter.next(); + conList.add(new Pair(lang2Code, getLangFull(lang2Code))); + } + return conList; + } + + public static Collection convertToG11N(Collection list) { + Collection conList = new LinkedList(); + for (Iterator iter = list.iterator(); iter.hasNext();) { + String lang2Code = (String) iter.next(); + conList.add(new Pair(lang2Code, globalize(lang2Code))); + } + return conList; + } + + // Special GlobalizedMessage for use with the LanguageUtil#globalize method + private static class LanguageGlobalizedMessage extends GlobalizedMessage { + + public LanguageGlobalizedMessage(String key) { + super(key); + } + + @Override + public Object localize(Locale locale) { + return LanguageUtil.getLangFull(this.getKey()); + } + + } +} diff --git a/ccm-cms/src/main/resources/com/arsdigita/cms/util/PageClassConfigHandler.java b/ccm-cms/src/main/resources/com/arsdigita/cms/util/PageClassConfigHandler.java new file mode 100755 index 000000000..118c10bd6 --- /dev/null +++ b/ccm-cms/src/main/resources/com/arsdigita/cms/util/PageClassConfigHandler.java @@ -0,0 +1,82 @@ +/* + * Copyright (C) 2003-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.util; + + +import org.xml.sax.helpers.DefaultHandler; + +import java.util.Map; + +/** + * + * SAX event handler class for parsing configuration file. + * + * Parse URL-to-Page/Dispatcher/Servlet mappings from a file. + * + * Format of the file is XML: + *
+ * <dispatcher-configuration>
+ *   <url-mapping
+ *     <url>my-page</url>
+ *     OR <page-class>com.arsdigita.Page.class</page-class>
+ *   <url-mapping
+ * </dispatcher-configuration>
+ * 
+ */ +public class PageClassConfigHandler extends DefaultHandler { + + private Map m_map; + private Map m_rmap; + private StringBuffer m_buffer; + private String m_url; + private String m_className; + + /** + * @param map A map to configure (pages-> classes) + * @param rmap A map to configure (classes-> pages) + * + * @pre md.m_map != null + */ + public PageClassConfigHandler(Map map, Map rmap) { + m_map = map; + // reverse map + m_rmap = rmap; + m_buffer = new StringBuffer(); + } + + @Override + public void characters(char[] ch, int start, int len) { + for (int i = 0; i < len; i++) { + m_buffer.append(ch[start + i]); + } + } + + @Override + public void endElement(String uri, String localName, String qn) { + if ( qn.equals("url") ) { + m_url = m_buffer.toString().trim(); + } else if ( qn.equals("page-class") ) { + m_className = m_buffer.toString().trim(); + } else if ( qn.equals("url-mapping") ) { + m_map.put(m_url, m_className); + m_rmap.put(m_className, m_url); + } + m_buffer = new StringBuffer(); + } +} diff --git a/ccm-cms/src/main/resources/com/arsdigita/cms/util/SecurityConstants.java b/ccm-cms/src/main/resources/com/arsdigita/cms/util/SecurityConstants.java new file mode 100755 index 000000000..dde69fd2c --- /dev/null +++ b/ccm-cms/src/main/resources/com/arsdigita/cms/util/SecurityConstants.java @@ -0,0 +1,68 @@ +/* + * Copyright (C) 2003-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.util; + + + +/** + *

Security class used for checking and granting privileges in + * CMS.

+ * + * @author Michael Pih + * @version $Revision: #7 $ $DateTime: 2004/08/17 23:15:09 $ + * @version $Id: SecurityConstants.java 2090 2010-04-17 08:04:14Z pboy $ + */ +public interface SecurityConstants { + + // CMS Actions + public final static String STAFF_ADMIN = "staff_admin"; + public final static String WORKFLOW_ADMIN = "workflow_admin"; + public final static String CATEGORY_ADMIN = "category_admin"; + public final static String LIFECYCLE_ADMIN = "lifecycle_admin"; + public final static String CONTENT_TYPE_ADMIN = "content_type_admin"; + public final static String PUBLISH = "publish"; + public final static String NEW_ITEM = "new_item"; + public final static String PUBLIC_PAGES = "public_pages"; + public final static String PREVIEW_PAGES = "preview_pages"; + public final static String ADMIN_PAGES = "admin_pages"; + public final static String EDIT_ITEM = "edit_item"; + public final static String SCHEDULE_PUBLICATION = "schedule_publication"; + public final static String DELETE_ITEM = "delete_item"; + public final static String APPLY_WORKFLOW = "apply_workflow"; + public final static String CATEGORIZE_ITEMS = "categorize_items"; + public final static String DELETE_IMAGES = "delete_images"; + public final static String APPLY_ALTERNATE_WORKFLOWS = "apply_alternate_workflows"; + + // CMS Privileges + public final static String CMS_APPLY_ALTERNATE_WORKFLOWS = "cms_apply_alternate_workflows"; + public final static String CMS_CATEGORIZE_ITEMS = "cms_categorize_items"; + public final static String CMS_CATEGORY_ADMIN = "cms_category_admin"; + public final static String CMS_CONTENT_TYPE_ADMIN = "cms_content_type_admin"; + public final static String CMS_DELETE_ITEM = "cms_delete_item"; + public final static String CMS_EDIT_ITEM = "cms_edit_item"; + public final static String CMS_ITEM_ADMIN = "cms_item_admin"; + public final static String CMS_LIFECYCLE_ADMIN = "cms_lifecycle_admin"; + public final static String CMS_NEW_ITEM = "cms_new_item"; + public final static String CMS_PREVIEW_ITEM = "cms_preview_item"; + public final static String CMS_PUBLISH = "cms_publish"; + public final static String CMS_APPROVE_ITEM = "cms_approve_item"; + public final static String CMS_READ_ITEM = "cms_read_item"; + public final static String CMS_STAFF_ADMIN = "cms_staff_admin"; + public final static String CMS_WORKFLOW_ADMIN = "cms_workflow_admin"; +} diff --git a/ccm-cms/src/main/resources/com/arsdigita/cms/util/Util.java b/ccm-cms/src/main/resources/com/arsdigita/cms/util/Util.java new file mode 100755 index 000000000..fd90026ce --- /dev/null +++ b/ccm-cms/src/main/resources/com/arsdigita/cms/util/Util.java @@ -0,0 +1,44 @@ +/* + * Copyright (C) 2003-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.util; + +import com.arsdigita.runtime.ConfigError; +import org.apache.oro.text.perl.Perl5Util; + +/** + * Utility functions for use by installer classes. + * + * @author Jon Orris (jorris@redhat.com) + * @version $Revision: #6 $ $DateTime: 2004/08/17 23:15:09 $ + */ + +public class Util { + public static void validateURLParameter(String name, String value) + throws ConfigError { + + final String pattern = "/[^A-Za-z_0-9\\-]+/"; + Perl5Util util = new Perl5Util(); + if ( util.match(pattern, value) ) { + throw new ConfigError + ("The \"" + name + "\" parameter must contain only " + + " alpha-numeric characters, underscores, and/or hyphens."); + } + } + +} diff --git a/ccm-cms/src/main/resources/com/arsdigita/cms/util/iso639full.properties b/ccm-cms/src/main/resources/com/arsdigita/cms/util/iso639full.properties new file mode 100755 index 000000000..56d1e2d1a --- /dev/null +++ b/ccm-cms/src/main/resources/com/arsdigita/cms/util/iso639full.properties @@ -0,0 +1,141 @@ +aa=Afar +ab=Abkhazian +af=Afrikaans +am=Amharic +ar=Arabic +as=Assamese +ay=Aymara +az=Azerbaijani +ba=Bashkir +be=Byelorussian +bg=Bulgarian +bh=Bihari +bi=Bislama +bn=Bengali;=Bangla +bo=Tibetan +br=Breton +ca=Catalan +co=Corsican +cs=Czech +cy=Welsh +da=Danish +de=German +dz=Bhutani +el=Greek +en=English +eo=Esperanto +es=Spanish +et=Estonian +eu=Basque +fa=Persian +fi=Finnish +fj=Fiji +fo=Faroese +fr=French +fy=Frisian +ga=Irish +gd=Scots=Gaelic +gl=Galician +gn=Guarani +gu=Gujarati +ha=Hausa +he=Hebrew +hi=Hindi +hr=Croatian +hu=Hungarian +hy=Armenian +ia=Interlingua +id=Indonesian +ie=Interlingue +ik=Inupiak +is=Icelandic +it=Italian +iu=Inuktitut +iw=Hebrew +ja=Japanese +jw=Javanese +ka=Georgian +kk=Kazakh +kl=Greenlandic +km=Cambodian +kn=Kannada +ko=Korean +ks=Kashmiri +ku=Kurdish +ky=Kirghiz +la=Latin +ln=Lingala +lo=Laothian +lt=Lithuanian +lv=Latvian +mg=Malagasy +mi=Maori +mk=Macedonian +ml=Malayalam +mn=Mongolian +mo=Moldavian +mr=Marathi +ms=Malay +mt=Maltese +my=Burmese +na=Nauru +ne=Nepali +nl=Dutch +no=Norwegian +oc=Occitan +om==Oromo +or=Oriya +pa=Punjabi +pl=Polish +ps=Pashto,=Pushto +pt=Portuguese +qu=Quechua +rm=Rhaeto-Romance +rn=Kirundi +ro=Romanian +ru=Russian +rw=Kinyarwanda +sa=Sanskrit +sd=Sindhi +sg=Sangho +sh=Serbo-Croatian +si=Sinhalese +sk=Slovak +sl=Slovenian +sm=Samoan +sn=Shona +so=Somali +sq=Albanian +sr=Serbian +ss=Siswati +st=Sesotho +su=Sundanese +sv=Swedish +sw=Swahili +ta=Tamil +te=Telugu +tg=Tajik +th=Thai +ti=Tigrinya +tk=Turkmen +tl=Tagalog +tn=Setswana +to=Tonga +tr=Turkish +ts=Tsonga +tt=Tatar +tw=Twi +ug=Uighur +uk=Ukrainian +ur=Urdu +uz=Uzbek +vi=Vietnamese +vo=Volapuk +wo=Wolof +xh=Xhosa +yi=Yiddish +yo=Yoruba +za=Zhuang +zh=Chinese +zu=Zulu +--=Undefined diff --git a/ccm-cms/src/main/resources/com/arsdigita/cms/util/iso639rev.properties b/ccm-cms/src/main/resources/com/arsdigita/cms/util/iso639rev.properties new file mode 100755 index 000000000..3cb40744c --- /dev/null +++ b/ccm-cms/src/main/resources/com/arsdigita/cms/util/iso639rev.properties @@ -0,0 +1,138 @@ +aa=aar +ab=abk +af=afr +am=amh +ar=ara +as=asm +ay=aym +az=aze +ba=bak +be=bel +be=bre +bg=bul +bh=bih +bi=bis +bn=ben +bo=bod +ca=cat +co=cos +cs=ces +cy=cym +da=dan +de=deu +dz=dzo +el=ell +en=eng +eo=epo +es=spa +et=est +eu=baq +fa=fas +fi=fin +fj=fij +fo=fao +fr=fra +fy=fry +ga=gai +gl=glg +gn=grn +gu=guj +ha=hau +he=heb +hi=hin +hr=hrv +hu=hun +hy=arm +ia=ina +id=ind +ik=ipk +is=ice +it=ita +iu=iku +iw=heb +ja=jpn +jv=jav +jw=jaw +ka=kat +kk=kaz +kl=kal +km=khm +kn=kan +ko=kor +ks=kas +ku=kur +ky=kir +la=lat +ln=lin +lo=lao +lt=lit +lv=lav +mg=mlg +mi=mri +mk=mak +ml=mlt +mn=mon +mo=mol +mr=mar +ms=msa +my=mya +na=nau +ne=nep +nl=dut +no=nor +oc=oci +om=orm +or=ori +pa=pan +pl=pol +ps=pus +pt=por +qu=que +rm=roh +rn=run +ro=ron +ru=rus +rw=kin +sa=san +sd=snd +sg=sag +sh=scr +si=sin +sk=slk +sl=slv +sm=smo +sn=sna +so=som +sq=sqi +sr=ser +ss=ssw +st=sot +su=sun +sv=sve +sw=swa +ta=tam +te=tel +tg=tgk +th=tha +ti=tir +tk=tuk +tl=tgl +tn=tsn +to=tog +tr=tur +ts=tso +tt=tat +tw=twi +ug=uig +uk=ukr +ur=urd +uz=uzb +vi=vie +vo=vol +wo=wol +xh=xho +yi=yid +yo=yor +za=zha +zh=zho +zu=zul diff --git a/ccm-cms/src/main/resources/org/librecms/CmsResources.properties b/ccm-cms/src/main/resources/org/librecms/CmsResources.properties index 1c840d69c..d6aea8ed4 100644 --- a/ccm-cms/src/main/resources/org/librecms/CmsResources.properties +++ b/ccm-cms/src/main/resources/org/librecms/CmsResources.properties @@ -272,3 +272,10 @@ cms.ui.assets.binaryasset.filename=File name cms.ui.assets.binaryasset.mimetype=Type cms.ui.assets.binaryasset.size=Size (bytes) cms.ui.categories=Categories +cms.ui.new_item=Create new content item +cms.ui.authoring.content_type=Content Type: +#Language +cms.ui.language.field=Sprache +cms.ui.authoring.workflow=Select a workflow +cms.ui.create=Create +cms.contenttypes.ui.summary=Summary diff --git a/ccm-cms/src/main/resources/org/librecms/CmsResources_de.properties b/ccm-cms/src/main/resources/org/librecms/CmsResources_de.properties index 2681f5da3..487f1da76 100644 --- a/ccm-cms/src/main/resources/org/librecms/CmsResources_de.properties +++ b/ccm-cms/src/main/resources/org/librecms/CmsResources_de.properties @@ -270,3 +270,10 @@ cms.ui.assets.binaryasset.filename=Dateiname cms.ui.assets.binaryasset.mimetype=Typ cms.ui.assets.binaryasset.size=Gr\u00f6\u00dfe (Bytes) cms.ui.categories=Kategorien +cms.ui.new_item=Neues Content Item angelegen +cms.ui.authoring.content_type=Content Typ: +#Language +cms.ui.language.field=Sprache +cms.ui.authoring.workflow=Arbeitsablauf ausw\u00e4hlen +cms.ui.create=Anlegen +cms.contenttypes.ui.summary=Zusammenfassung diff --git a/ccm-cms/src/main/resources/org/librecms/CmsResources_fr.properties b/ccm-cms/src/main/resources/org/librecms/CmsResources_fr.properties index c147f5d3c..798c94e3b 100644 --- a/ccm-cms/src/main/resources/org/librecms/CmsResources_fr.properties +++ b/ccm-cms/src/main/resources/org/librecms/CmsResources_fr.properties @@ -229,3 +229,10 @@ cms.ui.assets.binaryasset.filename=File name cms.ui.assets.binaryasset.mimetype=Type cms.ui.assets.binaryasset.size=Size (bytes) cms.ui.categories=Categories +cms.ui.new_item=New item +cms.ui.authoring.content_type=Content Type: +#Language +cms.ui.language.field=Sprache +cms.ui.authoring.workflow=Select a workflow +cms.ui.create=Create +cms.contenttypes.ui.summary=Summary diff --git a/ccm-core/src/main/java/org/libreccm/admin/ui/AdminView.java b/ccm-core/src/main/java/org/libreccm/admin/ui/AdminView.java index 850bed7e9..61c53b6bf 100644 --- a/ccm-core/src/main/java/org/libreccm/admin/ui/AdminView.java +++ b/ccm-core/src/main/java/org/libreccm/admin/ui/AdminView.java @@ -36,6 +36,8 @@ import com.vaadin.ui.Label; import com.vaadin.ui.TabSheet; import com.vaadin.ui.VerticalLayout; import org.apache.shiro.subject.Subject; +import org.libreccm.admin.ui.usersgroupsroles.UsersGroupsRoles; +import org.libreccm.admin.ui.usersgroupsroles.UsersTableDataProvider; import org.libreccm.l10n.GlobalizationHelper; import org.libreccm.security.PermissionChecker; import org.libreccm.security.User; @@ -72,7 +74,7 @@ public class AdminView extends CustomComponent implements View { @Inject private JpqlConsoleController jpqlConsoleController; - + @Inject private Subject subject; @@ -81,6 +83,9 @@ public class AdminView extends CustomComponent implements View { @Inject private GlobalizationHelper globalizationHelper; + + @Inject + private UsersTableDataProvider usersTableDataProvider; private ResourceBundle bundle; @@ -88,46 +93,49 @@ public class AdminView extends CustomComponent implements View { private UserRepository userRepo; private final TabSheet tabSheet; - private final Grid usersTable; - +// private final Grid usersTable; + private final UsersGroupsRoles usersGroupsRoles; + private final JpqlConsole jpqlConsole; public AdminView() { tabSheet = new TabSheet(); - final TabSheet userGroupsRoles = new TabSheet(); - usersTable = new Grid<>(); - usersTable.setWidth("100%"); -// usersTable.setItems(userRepo.findAll()); - usersTable.addColumn(User::getName) - .setId(COL_USER_NAME) - .setCaption("User name"); - usersTable - .addColumn(User::getGivenName) - .setId(COL_GIVEN_NAME) - .setCaption("Given name"); - usersTable - .addColumn(User::getFamilyName) - .setId(COL_FAMILY_NAME) - .setCaption("Family name"); - usersTable - .addColumn(user -> user.getPrimaryEmailAddress().getAddress()) - .setId(COL_EMAIL) - .setCaption("E-Mail"); - usersTable - .addColumn(user -> { - if (user.isBanned()) { - return bundle.getString("ui.admin.user.banned_yes"); - } else { - return bundle.getString("ui.admin.user.banned_no"); - } - }) - .setId(COL_BANNED) - .setCaption("Banned?"); - userGroupsRoles.addTab(usersTable, "Users"); - - tabSheet.addTab(userGroupsRoles, "Users/Groups/Roles"); +// final TabSheet userGroupsRoles = new TabSheet(); +// usersTable = new Grid<>(); +// usersTable.setWidth("100%"); +//// usersTable.setItems(userRepo.findAll()); +// usersTable.addColumn(User::getName) +// .setId(COL_USER_NAME) +// .setCaption("User name"); +// usersTable +// .addColumn(User::getGivenName) +// .setId(COL_GIVEN_NAME) +// .setCaption("Given name"); +// usersTable +// .addColumn(User::getFamilyName) +// .setId(COL_FAMILY_NAME) +// .setCaption("Family name"); +// usersTable +// .addColumn(user -> user.getPrimaryEmailAddress().getAddress()) +// .setId(COL_EMAIL) +// .setCaption("E-Mail"); +// usersTable +// .addColumn(user -> { +// if (user.isBanned()) { +// return bundle.getString("ui.admin.user.banned_yes"); +// } else { +// return bundle.getString("ui.admin.user.banned_no"); +// } +// }) +// .setId(COL_BANNED) +// .setCaption("Banned?"); +// userGroupsRoles.addTab(usersTable, "Users"); +// +// tabSheet.addTab(userGroupsRoles, "Users/Groups/Roles"); + usersGroupsRoles = new UsersGroupsRoles(this); + tabSheet.addTab(usersGroupsRoles, "Users/Groups/Roles"); final ServletContext servletContext = VaadinServlet .getCurrent() @@ -139,54 +147,12 @@ public class AdminView extends CustomComponent implements View { jpqlConsole = null; } -// final CssLayout header = new CssLayout() { -// -// private static final long serialVersionUID = -4372147161604688854L; -// -// @Override -// protected String getCss(final Component component) { -// /*if ((component instanceof Image) -// && "libreccm-logo".equals(component.getId())) { -// -// return "position: absolute; top: 10px; left: 10px;"; -// -// } else if ((component instanceof Label) -// && "libreccm-headerinfoline".equals(component -// .getId())) { -// return "background-color: #8b8e8a; width: 100%; position: absolute; top:120px; left: 0"; -// }*/ -// return ""; -// -//// return ".v-csslayout {\n" -//// + "background-color: #56a1bd;\n" -//// + "background-image: -ie-linear-gradient(top , #56a1db 5%, #024c68 95%\n" -//// + "background-image: -moz-linear-gradient(top , #56a1db 5%, #024c68 95%\n" -//// + "background-image: -webkit-linear-gradient(top , #56a1db 5%, #024c68 95%\n" -//// + "background-image: linear-gradient(top , #56a1db 5%, #024c68 95%\n" -//// + "}\n" -//// + "\n" -//// + ".libreccm-logo {\n" -//// + "border-left: 10px solid #0f0;\n" -//// + "}\n"; -// } -// -// }; -// header.setWidth("100%"); -// header.setHeight("5em"); final GridLayout header = new GridLayout(5, 1); header.setWidth("100%"); header.addStyleName("libreccm-header"); -// final Image logo = new Image( -// "", -// new ClassResource("/themes/libreccm-default/images/libreccm.png")); -// logo.setId("libreccm-logo"); -// logo.addStyleName("libreccm-logo"); -// header.addComponent(logo, 0, 0); -// header.setComponentAlignment(logo, Alignment.MIDDLE_LEFT); final Label headerInfoLine = new Label("LibreCCM"); headerInfoLine.setId("libreccm-headerinfoline"); -// headerInfoLine.setWidth("100%"); header.addComponent(headerInfoLine, 3, 0, 4, 0); header.setComponentAlignment(headerInfoLine, Alignment.TOP_RIGHT); @@ -216,20 +182,19 @@ public class AdminView extends CustomComponent implements View { bundle = ResourceBundle .getBundle(AdminUiConstants.ADMIN_BUNDLE, globalizationHelper.getNegotiatedLocale()); + + usersGroupsRoles.setDataProvider(usersTableDataProvider); } @Override public void enter(final ViewChangeListener.ViewChangeEvent event) { -// if (!subject.isAuthenticated()) { -// getUI().getNavigator().navigateTo(LoginView.VIEWNAME); -// } - usersTable.setItems(userRepo.findAll()); +// usersGroupsRoles.setUsers(userRepo.findAll()); } - + protected JpqlConsoleController getJpqlConsoleController() { return jpqlConsoleController; } - + } diff --git a/ccm-core/src/main/java/org/libreccm/admin/ui/usersgroupsroles/UsersGroupsRoles.java b/ccm-core/src/main/java/org/libreccm/admin/ui/usersgroupsroles/UsersGroupsRoles.java new file mode 100644 index 000000000..18118cdfc --- /dev/null +++ b/ccm-core/src/main/java/org/libreccm/admin/ui/usersgroupsroles/UsersGroupsRoles.java @@ -0,0 +1,105 @@ +/* + * 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.libreccm.admin.ui.usersgroupsroles; + +import com.arsdigita.ui.admin.AdminUiConstants; + +import com.vaadin.ui.CustomComponent; +import com.vaadin.ui.Grid; +import com.vaadin.ui.TabSheet; +import com.vaadin.ui.UI; +import org.libreccm.admin.ui.AdminView; +import org.libreccm.security.User; + +import java.util.List; +import java.util.ResourceBundle; + +/** + * + * @author Jens Pelzetter + */ +public class UsersGroupsRoles extends CustomComponent { + + private static final long serialVersionUID = 7280416743018127366L; + + private static final String COL_USER_NAME = "username"; + private static final String COL_GIVEN_NAME = "given_name"; + private static final String COL_FAMILY_NAME = "family_name"; + private static final String COL_EMAIL = "email"; + private static final String COL_BANNED = "banned"; + + private final AdminView view; + + private final TabSheet tabSheet; + + private final Grid usersTable; + + public UsersGroupsRoles(final AdminView view) { + + this.view = view; + + final ResourceBundle bundle = ResourceBundle.getBundle( + AdminUiConstants.ADMIN_BUNDLE, UI.getCurrent().getLocale()); + + tabSheet = new TabSheet(); + usersTable = new Grid<>(); + usersTable.setWidth("100%"); +// usersTable.setItems(userRepo.findAll()); + usersTable.addColumn(User::getName) + .setId(COL_USER_NAME) + .setCaption("User name"); + usersTable + .addColumn(User::getGivenName) + .setId(COL_GIVEN_NAME) + .setCaption("Given name"); + usersTable + .addColumn(User::getFamilyName) + .setId(COL_FAMILY_NAME) + .setCaption("Family name"); + usersTable + .addColumn(user -> user.getPrimaryEmailAddress().getAddress()) + .setId(COL_EMAIL) + .setCaption("E-Mail"); + usersTable + .addColumn(user -> { + if (user.isBanned()) { + return bundle.getString("ui.admin.user.banned_yes"); + } else { + return bundle.getString("ui.admin.user.banned_no"); + } + }) + .setId(COL_BANNED) + .setCaption("Banned?"); + + + tabSheet.addTab(usersTable, "Users"); + + setCompositionRoot(tabSheet); + + } + +// public void setUsers(final List users) { +// usersTable.setItems(users); +// } + + public void setDataProvider(final UsersTableDataProvider dataProvider) { + usersTable.setDataProvider(dataProvider); + } + +} diff --git a/ccm-core/src/main/java/org/libreccm/admin/ui/usersgroupsroles/UsersTableDataProvider.java b/ccm-core/src/main/java/org/libreccm/admin/ui/usersgroupsroles/UsersTableDataProvider.java new file mode 100644 index 000000000..7693a72d8 --- /dev/null +++ b/ccm-core/src/main/java/org/libreccm/admin/ui/usersgroupsroles/UsersTableDataProvider.java @@ -0,0 +1,90 @@ +/* + * 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.libreccm.admin.ui.usersgroupsroles; + +import com.vaadin.cdi.ViewScoped; +import com.vaadin.data.provider.AbstractDataProvider; +import com.vaadin.data.provider.Query; +import org.libreccm.security.User; + +import java.util.stream.Stream; + +import javax.enterprise.context.RequestScoped; +import javax.inject.Inject; +import javax.persistence.EntityManager; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Root; +import javax.transaction.Transactional; + +/** + * + * @author Jens Pelzetter + */ +@ViewScoped +public class UsersTableDataProvider extends AbstractDataProvider { + + private static final long serialVersionUID = 8849235775786370772L; + + @Inject + private EntityManager entityManager; + + @Override + public boolean isInMemory() { + return false; + } + + @Transactional(Transactional.TxType.REQUIRED) + @Override + public int size(final Query query) { + final CriteriaBuilder builder = entityManager + .getCriteriaBuilder(); + CriteriaQuery criteriaQuery = builder + .createQuery(Long.class); + final Root from = criteriaQuery.from(User.class); + + criteriaQuery = criteriaQuery.select(builder.count(from)); + + + + return entityManager + .createQuery(criteriaQuery) + .getSingleResult() + .intValue(); + } + + @Transactional(Transactional.TxType.REQUIRED) + @Override + public Stream fetch(final Query query) { + final CriteriaBuilder builder = entityManager + .getCriteriaBuilder(); + final CriteriaQuery criteriaQuery = builder + .createQuery(User.class); + final Root from = criteriaQuery.from(User.class); + + + return entityManager + .createQuery(criteriaQuery) + .setMaxResults(query.getLimit()) + .setFirstResult(query.getOffset()) + .getResultList() + .stream(); + } + +} diff --git a/ccm-core/src/test/java/org/libreccm/core/CcmObjectRepositoryTest.java b/ccm-core/src/test/java/org/libreccm/core/CcmObjectRepositoryTest.java index e589945cc..d9b43679a 100644 --- a/ccm-core/src/test/java/org/libreccm/core/CcmObjectRepositoryTest.java +++ b/ccm-core/src/test/java/org/libreccm/core/CcmObjectRepositoryTest.java @@ -323,8 +323,8 @@ public class CcmObjectRepositoryTest { * {@link IllegalArgumentException} if called with {@code null} as the * object to save. */ - @Test(expected = IllegalArgumentException.class) - @ShouldThrowException(IllegalArgumentException.class) + @Test(expected = NullPointerException.class) + @ShouldThrowException(NullPointerException.class) @InSequence(500) public void saveNullValue() { ccmObjectRepository.save(null); diff --git a/ccm-core/src/test/java/org/libreccm/security/GroupRepositoryTest.java b/ccm-core/src/test/java/org/libreccm/security/GroupRepositoryTest.java index 26a72ad01..57e83946e 100644 --- a/ccm-core/src/test/java/org/libreccm/security/GroupRepositoryTest.java +++ b/ccm-core/src/test/java/org/libreccm/security/GroupRepositoryTest.java @@ -222,8 +222,8 @@ public class GroupRepositoryTest { groupRepository.save(group); } - @Test(expected = IllegalArgumentException.class) - @ShouldThrowException(IllegalArgumentException.class) + @Test(expected = NullPointerException.class) + @ShouldThrowException(NullPointerException.class) @InSequence(600) public void saveNullValue() { groupRepository.save(null); diff --git a/ccm-core/src/test/java/org/libreccm/security/PartyRepositoryTest.java b/ccm-core/src/test/java/org/libreccm/security/PartyRepositoryTest.java index 05bebdd5f..db18f7805 100644 --- a/ccm-core/src/test/java/org/libreccm/security/PartyRepositoryTest.java +++ b/ccm-core/src/test/java/org/libreccm/security/PartyRepositoryTest.java @@ -250,8 +250,8 @@ public class PartyRepositoryTest { }); } - @Test(expected = IllegalArgumentException.class) - @ShouldThrowException(IllegalArgumentException.class) + @Test(expected = NullPointerException.class) + @ShouldThrowException(NullPointerException.class) @InSequence(500) public void saveNullValue() { shiro.getSystemUser().execute(() -> partyRepository.save(null)); diff --git a/ccm-core/src/test/java/org/libreccm/security/RoleRepositoryTest.java b/ccm-core/src/test/java/org/libreccm/security/RoleRepositoryTest.java index 30c6a1579..b25a0dcb1 100644 --- a/ccm-core/src/test/java/org/libreccm/security/RoleRepositoryTest.java +++ b/ccm-core/src/test/java/org/libreccm/security/RoleRepositoryTest.java @@ -320,8 +320,8 @@ public class RoleRepositoryTest { * throws a {@link IllegalArgumentException} is called with {@code null} for * the {@link Role} to save. */ - @Test(expected = IllegalArgumentException.class) - @ShouldThrowException(IllegalArgumentException.class) + @Test(expected = NullPointerException.class) + @ShouldThrowException(NullPointerException.class) @InSequence(600) public void saveNullValue() { roleRepository.save(null); diff --git a/ccm-core/src/test/java/org/libreccm/security/UserRepositoryTest.java b/ccm-core/src/test/java/org/libreccm/security/UserRepositoryTest.java index 763f16052..377fc5c1a 100644 --- a/ccm-core/src/test/java/org/libreccm/security/UserRepositoryTest.java +++ b/ccm-core/src/test/java/org/libreccm/security/UserRepositoryTest.java @@ -289,8 +289,8 @@ public class UserRepositoryTest { shiro.getSystemUser().execute(() -> userRepository.save(user)); } - @Test(expected = IllegalArgumentException.class) - @ShouldThrowException(IllegalArgumentException.class) + @Test(expected = NullPointerException.class) + @ShouldThrowException(NullPointerException.class) @InSequence(700) public void saveNullValue() { shiro.getSystemUser().execute(() -> userRepository.save(null)); diff --git a/ccm-core/src/test/resources-wildfly-remote-h2-mem/scripts/create_ccm_core_schema.sql b/ccm-core/src/test/resources-wildfly-remote-h2-mem/scripts/create_ccm_core_schema.sql index 17314a655..95f8fc561 100644 --- a/ccm-core/src/test/resources-wildfly-remote-h2-mem/scripts/create_ccm_core_schema.sql +++ b/ccm-core/src/test/resources-wildfly-remote-h2-mem/scripts/create_ccm_core_schema.sql @@ -282,7 +282,7 @@ create schema CCM_CORE; DEFAULT_VALUE varchar(255), PARAMETER_MODEL varchar(255), PARAMETER_NAME varchar(255), - OBJECT_ID bigint not null,s + OBJECT_ID bigint not null, primary key (OBJECT_ID) );