diff --git a/dotCMS/src/main/java/com/dotmarketing/startup/runonce/Task240530AddDotAIPortletToLayout.java b/dotCMS/src/main/java/com/dotmarketing/startup/runonce/Task240530AddDotAIPortletToLayout.java index 75001e4d9ee..30a2524761d 100644 --- a/dotCMS/src/main/java/com/dotmarketing/startup/runonce/Task240530AddDotAIPortletToLayout.java +++ b/dotCMS/src/main/java/com/dotmarketing/startup/runonce/Task240530AddDotAIPortletToLayout.java @@ -23,7 +23,7 @@ public class Task240530AddDotAIPortletToLayout implements StartupTask { @Override public boolean forceRun() { - // first we get all layouts we have maintenance portelt + // first we get all layouts we have maintenance portlet final List apiPlaygroundLayouts = getAPIPlaygroundLayouts(); // then check if all layouts which contains API Playground also have dotAI diff --git a/dotCMS/src/main/java/com/dotmarketing/startup/runonce/Task241009ReplaceLanguagesWithLocalesPortlet.java b/dotCMS/src/main/java/com/dotmarketing/startup/runonce/Task241009ReplaceLanguagesWithLocalesPortlet.java new file mode 100644 index 00000000000..5ce2324d4c7 --- /dev/null +++ b/dotCMS/src/main/java/com/dotmarketing/startup/runonce/Task241009ReplaceLanguagesWithLocalesPortlet.java @@ -0,0 +1,98 @@ +package com.dotmarketing.startup.runonce; + +import com.dotmarketing.business.CacheLocator; +import com.dotmarketing.common.db.DotConnect; +import com.dotmarketing.exception.DotDataException; +import com.dotmarketing.exception.DotRuntimeException; +import com.dotmarketing.startup.StartupTask; +import com.dotmarketing.util.UUIDUtil; +import io.vavr.control.Try; + +import java.util.List; +import java.util.Map; +import java.util.Optional; + +/** + * Adds the dotAI portlet to all layouts which have API Playground portlet too, if it does not already exists. + * @author vico + */ +public class Task241009ReplaceLanguagesWithLocalesPortlet implements StartupTask { + + private static final String LANGUAGES_PORTLET_ID = "languages"; + private static final String LOCALES_PORTLET_ID = "locales"; + private static final String WORKFLOW_PORTLET_ID = "workflow-schemes"; + + @Override + public boolean forceRun() { + // if no locales found then flag it as true + return getLayoutPortletsByPortletId(LOCALES_PORTLET_ID).isEmpty(); + } + + @Override + public void executeUpgrade() throws DotDataException, DotRuntimeException { + final List> languagesLayoutPortlets = getLayoutPortletsByPortletId(LANGUAGES_PORTLET_ID); + + if (languagesLayoutPortlets.isEmpty()) { + final List> workflowLayoutPortlets = getLayoutPortletsByPortletId(WORKFLOW_PORTLET_ID); + if (!workflowLayoutPortlets.isEmpty()) { + final Map row = workflowLayoutPortlets.get(0); + final String layoutId = (String) row.get("layout_id"); + final int portletOrder = Optional.ofNullable((Integer) row.get("portlet_order")).orElse(0) + 1; + insertLocale(layoutId, portletOrder); + } + } else { + languagesLayoutPortlets.forEach(this::replaceLanguage); + } + + CacheLocator.getLayoutCache().clearCache(); + } + + private void replaceLanguage(final Map row) { + final String layoutId = (String) row.get("layout_id"); + final int count = Try.of( + () -> new DotConnect() + .setSQL("SELECT COUNT(portlet_id) AS count" + + " FROM cms_layouts_portlets" + + " WHERE layout_id = ? AND portlet_id = ?") + .addParam(layoutId) + .getInt("count")) + .getOrElse(0); + if (count == 0) { + final int portletOrder = Optional.ofNullable((Integer) row.get("portlet_order")).orElse(1); + insertLocale(layoutId, portletOrder); + + final String id = (String) row.get("id"); + deleteLanguage(id); + } + } + + private void deleteLanguage(final String id) { + Try.run(() -> new DotConnect() + .setSQL("DELETE FROM cms_layouts_portlets WHERE id = ?") + .addParam(id) + .loadResult()) + .getOrElseThrow(ex -> new RuntimeException(ex)); + } + + private static void insertLocale(final String layoutId, final int portletOrder) { + Try.run(() -> new DotConnect() + .setSQL("INSERT INTO cms_layouts_portlets(id, layout_id, portlet_id, portlet_order)" + + " VALUES (?, ?, ?, ?)") + .addParam(UUIDUtil.uuid()) + .addParam(layoutId) + .addParam(LOCALES_PORTLET_ID) + .addParam(portletOrder) + .loadResult()) + .getOrElseThrow(ex -> new RuntimeException(ex)); + } + + private List> getLayoutPortletsByPortletId(final String portletId) { + return Try.of( + () -> new DotConnect() + .setSQL("SELECT layout_id FROM cms_layouts_portlets WHERE portlet_id = ?") + .addParam(portletId) + .loadObjectResults()) + .getOrElse(List.of()); + } + +} diff --git a/dotCMS/src/main/java/com/dotmarketing/util/TaskLocatorUtil.java b/dotCMS/src/main/java/com/dotmarketing/util/TaskLocatorUtil.java index 74e6a4959a0..211a62f0aef 100644 --- a/dotCMS/src/main/java/com/dotmarketing/util/TaskLocatorUtil.java +++ b/dotCMS/src/main/java/com/dotmarketing/util/TaskLocatorUtil.java @@ -349,6 +349,7 @@ public static List> getStartupRunOnceTaskClasses() { .add(Task240530AddDotAIPortletToLayout.class) .add(Task240606AddVariableColumnToWorkflow.class) .add(Task241013RemoveFullPathLcColumnFromIdentifier.class) + .add(Task241009ReplaceLanguagesWithLocalesPortlet.class) .build(); return ret.stream().sorted(classNameComparator).collect(Collectors.toList()); }