Skip to content

Commit

Permalink
fix:Restart application registry service to update the category lisy …
Browse files Browse the repository at this point in the history
…from the XML configuration - EXO-68920 (#192)

Before this change, a second server start was required to import the application registry category from the XML configuration after cleaning by the `cleanApplicationRegistryUpgradePlugin`. This change will restart the `applicationRegistryService` to initialize the application category list from the configuration .
  • Loading branch information
sofyenne committed Jan 23, 2024
1 parent d508f56 commit b70f952
Show file tree
Hide file tree
Showing 4 changed files with 133 additions and 6 deletions.
2 changes: 1 addition & 1 deletion data-upgrade-app-registry/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@
<name>eXo Add-on:: Data Upgrade Add-on - ApplicationRegistery - Upgrade</name>

<properties>
<exo.test.coverage.ratio>0.80</exo.test.coverage.ratio>
<exo.test.coverage.ratio>0.78</exo.test.coverage.ratio>
</properties>

<dependencies>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,10 @@
import jakarta.persistence.EntityManager;
import jakarta.persistence.Query;

import org.exoplatform.application.registry.impl.JDBCApplicationRegistryService;
import org.exoplatform.commons.persistence.impl.EntityManagerService;
import org.exoplatform.commons.upgrade.UpgradeProductPlugin;
import org.exoplatform.commons.utils.CommonsUtils;
import org.exoplatform.container.ExoContainerContext;
import org.exoplatform.container.PortalContainer;
import org.exoplatform.container.component.RequestLifeCycle;
Expand Down Expand Up @@ -75,10 +77,20 @@ public void processUpgrade(String oldVersion, String newVersion) {
}
} finally {
RequestLifeCycle.end();
restartApplicationRegistryService();
}
}

public int getCleanedCategoriesCount() {
return cleanedCategoriesCount;
}

private void restartApplicationRegistryService() {
try {
JDBCApplicationRegistryService applicationRegistryService = CommonsUtils.getService(JDBCApplicationRegistryService.class);
applicationRegistryService.stop();
applicationRegistryService.start();
} catch (Exception e) {
LOG.info("Error encountered when restarting {} during the clean application registry upgrade plugin", JDBCApplicationRegistryService.class);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
@ConfiguredBy({
@ConfigurationUnit(scope = ContainerScope.PORTAL, path = "conf/portal/configuration.xml"),
@ConfigurationUnit(scope = ContainerScope.PORTAL, path = "conf/exo.portal.component.application-registry-configuration-local.xml"),
@ConfigurationUnit(scope = ContainerScope.PORTAL, path = "conf/portal/application-registry-initializer-configuration.xml"),
})
public class CleanAppRegistryCategoryUpgradePluginTest extends AbstractKernelTest {

Expand Down Expand Up @@ -59,9 +60,9 @@ public void testAppRegistryCategoryUpgradePlugin() throws Exception {
valueParam.setValue("org.exoplatform.platform");
initParams.addParameter(valueParam);

String toolCategoryName = "Tools";
String toolsCategoryName = "Tools";
String analyticsCategoryName = "Analytics";
ApplicationCategory toolsCategory = createAppCategory(toolCategoryName, "None");
ApplicationCategory toolsCategory = createAppCategory(toolsCategoryName, "None");
ApplicationCategory analytics = createAppCategory(analyticsCategoryName, "None");
applicationRegistryService.save(toolsCategory);
applicationRegistryService.save(analytics);
Expand All @@ -75,6 +76,16 @@ public void testAppRegistryCategoryUpgradePlugin() throws Exception {
List<ApplicationCategory> cats = applicationRegistryService.getApplicationCategories();
assertFalse(apps.isEmpty());
assertFalse(cats.isEmpty());
// assert that the tools category is created with the iframe portlet as the application
ApplicationCategory tools = applicationRegistryService.getApplicationCategory(toolsCategoryName);
assertNotNull(tools);
assertTrue(tools.getApplications().size() == 2);
assertTrue(tools.getApplications().stream().anyMatch(application -> application.getApplicationName().equals("IFramePortlet")));
//assert that the analytics category is created with the AnalyticsPortlet as the application
ApplicationCategory analyticsCategory = applicationRegistryService.getApplicationCategory(analyticsCategoryName);
assertNotNull(analyticsCategory);
assertTrue(analyticsCategory.getApplications().size() == 1);
assertTrue(analyticsCategory.getApplications().stream().anyMatch(application -> application.getApplicationName().equals("AnalyticsPortlet")));
} catch (Exception e) {
fail();
}
Expand All @@ -86,9 +97,17 @@ public void testAppRegistryCategoryUpgradePlugin() throws Exception {
appRegistryCategoryUpgradePlugin.processUpgrade(null, null);
try {
List<Application> apps = applicationRegistryService.getAllApplications();
assertTrue(apps.isEmpty());
assertTrue(!apps.isEmpty());
List<ApplicationCategory> cats = applicationRegistryService.getApplicationCategories();
assertTrue(cats.isEmpty());
assertTrue(!cats.isEmpty());
// assert that the tools category is recreated with the WhoIsOnLinePortlet as the application
ApplicationCategory tools = applicationRegistryService.getApplicationCategory(toolsCategoryName);
assertNotNull(tools);
assertTrue(tools.getApplications().size() == 1);
assertTrue(tools.getApplications().get(0).getApplicationName().equals("WhoIsOnLinePortlet"));
// assert that the analytics category is removed
ApplicationCategory analyticsCategory = applicationRegistryService.getApplicationCategory(analyticsCategoryName);
assertNull(analyticsCategory);
} catch (Exception e) {
fail();
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<!--
Copyright (C) 2024 eXo Platform SAS.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program 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 Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
-->
<configuration
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.exoplatform.org/xml/ns/kernel_1_2.xsd http://www.exoplatform.org/xml/ns/kernel_1_2.xsd"
xmlns="http://www.exoplatform.org/xml/ns/kernel_1_2.xsd">

<external-component-plugins>
<target-component>org.exoplatform.application.registry.ApplicationRegistryService</target-component>
<component-plugin>
<name>Tools.portlets.registry</name>
<set-method>initListener</set-method>
<type>org.exoplatform.application.registry.ApplicationCategoriesPlugins</type>
<description>this listener init the portlets are registered in PortletRegister</description>
<init-params>
<value-param>
<name>merge</name>
<value>true</value>
</value-param>
<value-param>
<name>system</name>
<value>true</value>
</value-param>
<object-param>
<name>tools</name>
<object type="org.exoplatform.application.registry.ApplicationCategory">
<field name="name">
<string>Tools</string>
</field>
<field name="displayName">
<string>Tools</string>
</field>
<field name="description">
<string>Applications for tools</string>
</field>
<field name="accessPermissions">
<collection type="java.util.ArrayList" item-type="java.lang.String">
<value>
<string>*:/platform/users</string>
</value>
</collection>
</field>
<field name="applications">
<collection type="java.util.ArrayList">
<value>
<object type="org.exoplatform.application.registry.Application">
<field name="applicationName">
<string>WhoIsOnLinePortlet</string>
</field>
<field name="categoryName">
<string>tools</string>
</field>
<field name="displayName">
<string>Who is on Line</string>
</field>
<field name="description">
<string>Who Is OnLine Portlet Portlet</string>
</field>
<field name="type">
<string>portlet</string>
</field>
<field name="contentId">
<string>social-portlet/WhoIsOnLinePortlet</string>
</field>
<field name="accessPermissions">
<collection type="java.util.ArrayList" item-type="java.lang.String">
<value>
<string>*:/platform/users</string>
</value>
</collection>
</field>
</object>
</value>
</collection>
</field>
</object>
</object-param>
</init-params>
</component-plugin>
</external-component-plugins>
</configuration>

0 comments on commit b70f952

Please sign in to comment.