diff --git a/dotCMS/src/main/enterprise b/dotCMS/src/main/enterprise index 4ccfa3991dc7..e32972b461ef 160000 --- a/dotCMS/src/main/enterprise +++ b/dotCMS/src/main/enterprise @@ -1 +1 @@ -Subproject commit 4ccfa3991dc78c015fa5688bdda2e90b49bf24d5 +Subproject commit e32972b461ef32f937fb8ff2d335e69377221904 diff --git a/dotCMS/src/main/java/com/dotcms/util/ConversionUtils.java b/dotCMS/src/main/java/com/dotcms/util/ConversionUtils.java index 282ac08761eb..1d79716aa427 100644 --- a/dotCMS/src/main/java/com/dotcms/util/ConversionUtils.java +++ b/dotCMS/src/main/java/com/dotcms/util/ConversionUtils.java @@ -4,6 +4,7 @@ import java.util.List; import java.util.Map; +import com.dotmarketing.db.DbConnectionFactory; import com.dotmarketing.util.UtilMethods; /** @@ -213,4 +214,17 @@ public static boolean toBoolean(final String strBool, final boolean defaultBool) } } + /** + * Based on a value obtained from database, if it is a boolean will return a cast. + * Otherwise will use the {@link DbConnectionFactory} to determine the boolean value cross-db + * @param objectBoolean {@link Object} + * @return boolean + */ + public static boolean toBooleanFromDb(final Object objectBoolean) { + + return (objectBoolean instanceof Boolean)? + Boolean.class.cast(objectBoolean): + DbConnectionFactory.isDBTrue(objectBoolean.toString()); + } + } diff --git a/dotCMS/src/main/java/com/dotcms/workflow/helper/WorkflowHelper.java b/dotCMS/src/main/java/com/dotcms/workflow/helper/WorkflowHelper.java index 00c2c74167fc..47a9d19f2ce2 100644 --- a/dotCMS/src/main/java/com/dotcms/workflow/helper/WorkflowHelper.java +++ b/dotCMS/src/main/java/com/dotcms/workflow/helper/WorkflowHelper.java @@ -36,8 +36,6 @@ */ public class WorkflowHelper { - private static final Set DEFAULT_SHOW_ON = EnumSet.of(WorkflowStatus.LOCKED, WorkflowStatus.UNLOCKED); - private final WorkflowAPI workflowAPI; private final RoleAPI roleAPI; @@ -472,7 +470,7 @@ public WorkflowAction save (final WorkflowActionForm workflowActionForm, final U newAction.setCondition (workflowActionForm.getActionCondition()); newAction.setRequiresCheckout(workflowActionForm.isRequiresCheckout()); newAction.setShowOn((null != workflowActionForm.getShowOn() && !workflowActionForm.getShowOn().isEmpty())? - workflowActionForm.getShowOn():DEFAULT_SHOW_ON); + workflowActionForm.getShowOn():WorkflowAPI.DEFAULT_SHOW_ON); newAction.setRoleHierarchyForAssign(workflowActionForm.isRoleHierarchyForAssign()); try { diff --git a/dotCMS/src/main/java/com/dotmarketing/portlets/templates/transform/FolderTransformer.java b/dotCMS/src/main/java/com/dotmarketing/portlets/templates/transform/FolderTransformer.java index 139197dd93bf..a977fcba0bf4 100644 --- a/dotCMS/src/main/java/com/dotmarketing/portlets/templates/transform/FolderTransformer.java +++ b/dotCMS/src/main/java/com/dotmarketing/portlets/templates/transform/FolderTransformer.java @@ -1,5 +1,6 @@ package com.dotmarketing.portlets.templates.transform; +import com.dotcms.util.ConversionUtils; import com.dotcms.util.transform.DBTransformer; import com.dotmarketing.portlets.folders.model.Folder; import java.util.ArrayList; @@ -40,7 +41,7 @@ private static Folder transform(Map map) { folder.setIDate((Date) map.get("idate")); folder.setName((String) map.get("name")); folder.setTitle((String) map.get("title")); - folder.setShowOnMenu((Boolean) map.getOrDefault("show_on_menu",false)); + folder.setShowOnMenu(ConversionUtils.toBooleanFromDb(map.getOrDefault("show_on_menu",false))); folder.setSortOrder((Integer) map.getOrDefault("sort_order",0)); folder.setFilesMasks((String) map.get("files_masks")); folder.setIdentifier((String) map.get("identifier")); diff --git a/dotCMS/src/main/java/com/dotmarketing/portlets/workflows/business/WorkflowAPI.java b/dotCMS/src/main/java/com/dotmarketing/portlets/workflows/business/WorkflowAPI.java index c73875f182a4..7ae86060a096 100644 --- a/dotCMS/src/main/java/com/dotmarketing/portlets/workflows/business/WorkflowAPI.java +++ b/dotCMS/src/main/java/com/dotmarketing/portlets/workflows/business/WorkflowAPI.java @@ -1,7 +1,9 @@ package com.dotmarketing.portlets.workflows.business; +import java.util.EnumSet; import java.util.List; import java.util.Map; +import java.util.Set; import com.dotcms.contenttype.model.type.ContentType; import com.dotmarketing.beans.Permission; @@ -14,20 +16,13 @@ import com.dotmarketing.portlets.fileassets.business.IFileAsset; import com.dotmarketing.portlets.structure.model.Structure; import com.dotmarketing.portlets.workflows.actionlet.WorkFlowActionlet; -import com.dotmarketing.portlets.workflows.model.WorkflowAction; -import com.dotmarketing.portlets.workflows.model.WorkflowActionClass; -import com.dotmarketing.portlets.workflows.model.WorkflowActionClassParameter; -import com.dotmarketing.portlets.workflows.model.WorkflowComment; -import com.dotmarketing.portlets.workflows.model.WorkflowHistory; -import com.dotmarketing.portlets.workflows.model.WorkflowProcessor; -import com.dotmarketing.portlets.workflows.model.WorkflowScheme; -import com.dotmarketing.portlets.workflows.model.WorkflowSearcher; -import com.dotmarketing.portlets.workflows.model.WorkflowStep; -import com.dotmarketing.portlets.workflows.model.WorkflowTask; +import com.dotmarketing.portlets.workflows.model.*; import com.liferay.portal.model.User; public interface WorkflowAPI { + public static final Set DEFAULT_SHOW_ON = EnumSet.of(WorkflowStatus.LOCKED, WorkflowStatus.UNLOCKED); + public void registerBundleService (); public WorkFlowActionlet newActionlet(String className) throws DotDataException; diff --git a/dotCMS/src/main/java/com/dotmarketing/portlets/workflows/business/WorkflowAPIImpl.java b/dotCMS/src/main/java/com/dotmarketing/portlets/workflows/business/WorkflowAPIImpl.java index 4d8dc82efdcd..c4b52a29695c 100644 --- a/dotCMS/src/main/java/com/dotmarketing/portlets/workflows/business/WorkflowAPIImpl.java +++ b/dotCMS/src/main/java/com/dotmarketing/portlets/workflows/business/WorkflowAPIImpl.java @@ -39,16 +39,7 @@ import com.dotmarketing.portlets.workflows.actionlet.UnarchiveContentActionlet; import com.dotmarketing.portlets.workflows.actionlet.UnpublishContentActionlet; import com.dotmarketing.portlets.workflows.actionlet.WorkFlowActionlet; -import com.dotmarketing.portlets.workflows.model.WorkflowAction; -import com.dotmarketing.portlets.workflows.model.WorkflowActionClass; -import com.dotmarketing.portlets.workflows.model.WorkflowActionClassParameter; -import com.dotmarketing.portlets.workflows.model.WorkflowComment; -import com.dotmarketing.portlets.workflows.model.WorkflowHistory; -import com.dotmarketing.portlets.workflows.model.WorkflowProcessor; -import com.dotmarketing.portlets.workflows.model.WorkflowScheme; -import com.dotmarketing.portlets.workflows.model.WorkflowSearcher; -import com.dotmarketing.portlets.workflows.model.WorkflowStep; -import com.dotmarketing.portlets.workflows.model.WorkflowTask; +import com.dotmarketing.portlets.workflows.model.*; import com.dotmarketing.util.Config; import com.dotmarketing.util.Logger; import com.dotmarketing.util.UtilMethods; @@ -61,16 +52,7 @@ import org.osgi.framework.BundleContext; import java.sql.Savepoint; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.Comparator; -import java.util.Date; -import java.util.Hashtable; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.StringTokenizer; +import java.util.*; public class WorkflowAPIImpl implements WorkflowAPI, WorkflowAPIOsgiService { @@ -631,6 +613,10 @@ public void saveAction(final WorkflowAction action, } } + private boolean isValidShowOn(final Set showOn) { + return null != showOn && !showOn.isEmpty(); + } + private boolean existsScheme(final String schemeId) { boolean existsScheme = false; @@ -707,6 +693,12 @@ private void saveAction(final WorkflowAction action) throws DotDataException, Al throw new DoesNotExistException("Workflow-does-not-exists-scheme"); } + if (!this.isValidShowOn(action.getShowOn())) { + + Logger.error(this, "No show On data on workflow action record, bad data?"); + action.setShowOn(WorkflowAPI.DEFAULT_SHOW_ON); + } + workFlowFactory.saveAction(action); } diff --git a/dotCMS/src/main/java/com/dotmarketing/portlets/workflows/model/WorkflowStatus.java b/dotCMS/src/main/java/com/dotmarketing/portlets/workflows/model/WorkflowStatus.java index cd06cedfc704..ebb06cf4c8d3 100644 --- a/dotCMS/src/main/java/com/dotmarketing/portlets/workflows/model/WorkflowStatus.java +++ b/dotCMS/src/main/java/com/dotmarketing/portlets/workflows/model/WorkflowStatus.java @@ -1,5 +1,8 @@ package com.dotmarketing.portlets.workflows.model; +import com.dotmarketing.util.Logger; +import com.dotmarketing.util.UtilMethods; + import java.util.Collections; import java.util.Set; import java.util.stream.Collectors; @@ -31,16 +34,21 @@ public static String toCommaSeparatedString(final Set workflowSt * @param value Object * @return Set of {@link WorkflowStatus} */ - public static Set toSet(Object value) { + public static Set toSet(final Object value) { Set workflowStatusSet = Collections.emptySet(); - if (null != value) { - - workflowStatusSet = Stream - .of(value.toString().split(DELIMITER)) - .map(WorkflowStatus::valueOf) - .collect(Collectors.toSet()); + if (null != value && UtilMethods.isSet(value.toString())) { + + try { + workflowStatusSet = Stream + .of(value.toString().split(DELIMITER)) + .map(WorkflowStatus::valueOf) + .collect(Collectors.toSet()); + } catch (Exception e) { + Logger.error(WorkflowStatus.class, "No show On data on workflow action record, bad data?"); + workflowStatusSet = Collections.emptySet(); + } } return workflowStatusSet; diff --git a/dotCMS/src/main/java/com/dotmarketing/portlets/workflows/util/WorkflowImportExportUtil.java b/dotCMS/src/main/java/com/dotmarketing/portlets/workflows/util/WorkflowImportExportUtil.java index 273601122e6b..9eb7820d2996 100644 --- a/dotCMS/src/main/java/com/dotmarketing/portlets/workflows/util/WorkflowImportExportUtil.java +++ b/dotCMS/src/main/java/com/dotmarketing/portlets/workflows/util/WorkflowImportExportUtil.java @@ -95,8 +95,8 @@ public void importWorkflowExport(File file) throws IOException { wapi.saveStep(step); } - for (WorkflowAction aciton : importer.getActions()) { - wapi.saveAction(aciton, null); + for (WorkflowAction action : importer.getActions()) { + wapi.saveAction(action, null); } for (WorkflowActionClass actionClass : importer.getActionClasses()) { diff --git a/dotCMS/src/main/java/com/dotmarketing/startup/runonce/Task04305UpdateWorkflowActionTable.java b/dotCMS/src/main/java/com/dotmarketing/startup/runonce/Task04305UpdateWorkflowActionTable.java index bc60e3149c9f..5e3add889597 100644 --- a/dotCMS/src/main/java/com/dotmarketing/startup/runonce/Task04305UpdateWorkflowActionTable.java +++ b/dotCMS/src/main/java/com/dotmarketing/startup/runonce/Task04305UpdateWorkflowActionTable.java @@ -1,6 +1,7 @@ package com.dotmarketing.startup.runonce; import com.dotcms.repackage.org.apache.commons.lang.StringUtils; +import com.dotcms.util.ConversionUtils; import com.dotmarketing.common.db.DotConnect; import com.dotmarketing.common.db.DotDatabaseMetaData; import com.dotmarketing.common.db.ForeignKey; @@ -43,7 +44,7 @@ public class Task04305UpdateWorkflowActionTable implements StartupTask { private static final String MYSQL_CREATE_INTERMEDIATE_TABLE = "CREATE TABLE workflow_action_step (action_id VARCHAR(36) NOT NULL, step_id VARCHAR(36) NOT NULL, action_order INT default 0)"; private static final String POSTGRES_CREATE_INTERMEDIATE_TABLE = MYSQL_CREATE_INTERMEDIATE_TABLE; - private static final String MSSQL_CREATE_INTERMEDIATE_TABLE = "CREATE TABLE workflow_action_step ( action_id NVARCHAR(36) NOT NULL, step_id NVARCHAR(36) NOT NULL action_order INT default 0, CONSTRAINT pk_workflow_action_step PRIMARY KEY NONCLUSTERED (action_id, step_id) )"; + private static final String MSSQL_CREATE_INTERMEDIATE_TABLE = "CREATE TABLE workflow_action_step ( action_id NVARCHAR(36) NOT NULL, step_id NVARCHAR(36) NOT NULL, action_order INT default 0, CONSTRAINT pk_workflow_action_step PRIMARY KEY NONCLUSTERED (action_id, step_id) )"; private static final String ORACLE_CREATE_INTERMEDIATE_TABLE = "CREATE TABLE workflow_action_step ( action_id VARCHAR(36) NOT NULL, step_id VARCHAR(36) NOT NULL, action_order number(10,0) default 0, CONSTRAINT pk_workflow_action_step PRIMARY KEY (action_id, step_id) )"; private static final String MYSQL_CREATE_INTERMEDIATE_TABLE_PK = "ALTER TABLE workflow_action_step ADD CONSTRAINT pk_workflow_action_step PRIMARY KEY (action_id, step_id)"; @@ -392,16 +393,8 @@ private void closeAndStartTransaction() throws DotHibernateException { private boolean isLocked(final Object requiresCheckout) { - boolean isLocked = false; - - if (null != requiresCheckout) { - - isLocked = (requiresCheckout instanceof Boolean)? - Boolean.class.cast(requiresCheckout): - DbConnectionFactory.isDBTrue(requiresCheckout.toString()); - } - - return isLocked; + return (null != requiresCheckout)? + ConversionUtils.toBooleanFromDb(requiresCheckout):false; } private String createIntermediateTableForeignKeyActionId() { diff --git a/dotCMS/src/main/resources/mssql.sql b/dotCMS/src/main/resources/mssql.sql index 0976f9e5649a..cc8d971c5486 100644 --- a/dotCMS/src/main/resources/mssql.sql +++ b/dotCMS/src/main/resources/mssql.sql @@ -2372,7 +2372,7 @@ create table workflow_action( ); create index workflow_idx_action_step on workflow_action(step_id); -CREATE TABLE workflow_action_step ( action_id NVARCHAR(36) NOT NULL, step_id NVARCHAR(36) NOT NULL action_order INT default 0, CONSTRAINT pk_workflow_action_step PRIMARY KEY NONCLUSTERED (action_id, step_id) ); +CREATE TABLE workflow_action_step ( action_id NVARCHAR(36) NOT NULL, step_id NVARCHAR(36) NOT NULL, action_order INT default 0, CONSTRAINT pk_workflow_action_step PRIMARY KEY NONCLUSTERED (action_id, step_id) ); ALTER TABLE workflow_action_step ADD CONSTRAINT fk_workflow_action_step_action_id foreign key (action_id) references workflow_action(id); ALTER TABLE workflow_action_step ADD CONSTRAINT fk_workflow_action_step_step_id foreign key (step_id) references workflow_step (id);