Skip to content

Commit

Permalink
feat: Impersonate page instances created from a site template - MEED-…
Browse files Browse the repository at this point in the history
…7678 - MEED-7679 - MEED-7680 - Meeds-io/MIPs#165 (#244)

This change will add an event listener that is triggered when a site is
created frm a site template to impersonate the preferences of Portlets
of type CMS.
  • Loading branch information
boubaker committed Oct 29, 2024
1 parent f97006b commit 5911c22
Show file tree
Hide file tree
Showing 3 changed files with 101 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
/**
* This file is part of the Meeds project (https://meeds.io/).
*
* Copyright (C) 2020 - 2024 Meeds Association [email protected]
*
* This program 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 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
package io.meeds.layout.listener;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import org.exoplatform.portal.config.UserPortalConfigService;
import org.exoplatform.portal.mop.SiteKey;
import org.exoplatform.services.listener.Event;
import org.exoplatform.services.listener.ListenerBase;
import org.exoplatform.services.listener.ListenerService;

import io.meeds.layout.service.PageLayoutService;

import jakarta.annotation.PostConstruct;

@Component
public class SiteCreatedFromTemplateListener implements ListenerBase<SiteKey, SiteKey> {

@Autowired
private ListenerService listenerService;

@Autowired
private PageLayoutService pageLayoutService;

@PostConstruct
public void init() {
listenerService.addListener(UserPortalConfigService.SITE_TEMPLATE_INSTANTIATED, this);
}

@Override
public void onEvent(Event<SiteKey, SiteKey> event) throws Exception {
pageLayoutService.impersonateSite(event.getData());
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -139,6 +139,20 @@ public Application getPageApplicationLayout(PageKey pageKey,
return application;
}

public void impersonateSite(SiteKey siteKey) {
PortalConfig portalConfig = layoutService.getPortalConfig(siteKey);
impersonateModel(portalConfig.getPortalLayout());
List<PageContext> pages = layoutService.findPages(siteKey);
if (CollectionUtils.isNotEmpty(pages)) {
pages.forEach(page -> impersonatePage(page.getKey()));
}
}

public void impersonatePage(PageKey pageKey) {
Page page = getPageLayout(pageKey);
impersonateModel(page);
}

public Page getPageLayout(PageKey pageKey, String username) throws ObjectNotFoundException, IllegalAccessException {
Page page = getPageLayout(pageKey);
if (page == null) {
Expand Down Expand Up @@ -462,6 +476,21 @@ private void computeApplicationPreferences(Application application, String usern
application.setState(applicationState);
}

@SneakyThrows
private void impersonateModel(ModelObject object) {
if (object instanceof Container container) {
ArrayList<ModelObject> children = container.getChildren();
if (CollectionUtils.isNotEmpty(children)) {
children.forEach(this::impersonateModel);
}
} else if (object instanceof Application application) {
Portlet preferences = portletInstanceService.exportApplicationPreferences(application);
if (preferences != null) {
layoutService.save(application.getState(), preferences);
}
}
}

private Portlet getApplicationPreferences(long applicationId, String username) throws IllegalAccessException,
ObjectNotFoundException {
List<PortletInstancePreference> preferences = portletInstanceService.getApplicationPreferences(applicationId, username);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
import java.util.Locale;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.stream.Collectors;

import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.collections4.MapUtils;
Expand All @@ -36,6 +37,7 @@
import org.exoplatform.portal.config.UserACL;
import org.exoplatform.portal.config.model.Application;
import org.exoplatform.portal.pom.spi.portlet.Portlet;
import org.exoplatform.portal.pom.spi.portlet.Preference;
import org.exoplatform.services.listener.ListenerService;
import org.exoplatform.services.log.ExoLogger;
import org.exoplatform.services.log.Log;
Expand Down Expand Up @@ -347,6 +349,23 @@ public List<PortletInstance> getPortletInstances() {
return portletInstanceStorage.getPortletInstances();
}

public Portlet exportApplicationPreferences(Application application) {
String portletName = portletInstanceLayoutStorage.getApplicationPortletName(application);
if (preferencePlugins.containsKey(portletName)) {
PortletInstancePreferencePlugin plugin = preferencePlugins.get(portletName);
Portlet preferences = portletInstanceLayoutStorage.getApplicationPreferences(Long.parseLong(application.getStorageId()));
List<PortletInstancePreference> exportedPreferences = plugin.generatePreferences(application, preferences);
Map<String, Preference> preferencesMap = exportedPreferences.stream()
.collect(Collectors.toMap(PortletInstancePreference::getName,
p -> new Preference(p.getName(),
p.getValue(),
false)));
return new Portlet(preferencesMap);
} else {
return null;
}
}

private void deletePortletInstanceFromStore(long id) throws ObjectNotFoundException {
try {
attachmentService.deleteAttachments(PortletInstanceAttachmentPlugin.OBJECT_TYPE, String.valueOf(id));
Expand Down

0 comments on commit 5911c22

Please sign in to comment.