/* * Copyright (C) 2003-2017 eXo Platform SAS. * * This 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 software 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 software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.exoplatform.management.content.operations.site.seo; import static org.exoplatform.portal.mop.Utils.objectType; import org.exoplatform.management.common.exportop.AbstractExportOperationHandler; import org.exoplatform.portal.config.DataStorage; import org.exoplatform.portal.mop.SiteType; import org.exoplatform.portal.pom.config.POMSession; import org.exoplatform.portal.pom.config.POMSessionManager; import org.exoplatform.services.jcr.RepositoryService; import org.exoplatform.services.jcr.ext.app.SessionProviderService; import org.exoplatform.services.jcr.ext.common.SessionProvider; import org.exoplatform.services.resources.LocaleConfig; import org.exoplatform.services.resources.LocaleConfigService; import org.exoplatform.services.seo.PageMetadataModel; import org.exoplatform.services.seo.impl.SEOServiceImpl; import org.exoplatform.services.wcm.core.WCMConfigurationService; import org.gatein.management.api.PathAddress; import org.gatein.management.api.exceptions.OperationException; import org.gatein.management.api.operation.OperationContext; import org.gatein.management.api.operation.OperationNames; import org.gatein.management.api.operation.ResultHandler; import org.gatein.management.api.operation.model.ExportResourceModel; import org.gatein.management.api.operation.model.ExportTask; import org.gatein.mop.api.workspace.Navigation; import org.gatein.mop.api.workspace.ObjectType; import org.gatein.mop.api.workspace.Site; import org.gatein.mop.api.workspace.Workspace; import java.util.ArrayList; import java.util.Collection; import java.util.List; import javax.jcr.Node; import javax.jcr.Session; /** * The Class SiteSEOExportResource. * * @author <a href="mailto:thomas.delhomenie@exoplatform.com">Thomas * Delhoménie</a> * @author <a href="mailto:boubaker.khanfir@exoplatform.com">Boubaker * Khanfir</a> * @version $Revision$ */ public class SiteSEOExportResource extends AbstractExportOperationHandler { /** The data storage. */ private DataStorage dataStorage = null; /** The wcm configuration service. */ private WCMConfigurationService wcmConfigurationService = null; /** The session provider service. */ private SessionProviderService sessionProviderService = null; /** The repository service. */ private RepositoryService repositoryService = null; /** The pom session manager. */ private POMSessionManager pomSessionManager = null; /** * {@inheritDoc} */ @Override public void execute(OperationContext operationContext, ResultHandler resultHandler) throws OperationException { try { String operationName = operationContext.getOperationName(); PathAddress address = operationContext.getAddress(); if (dataStorage == null) { dataStorage = operationContext.getRuntimeContext().getRuntimeComponent(DataStorage.class); wcmConfigurationService = operationContext.getRuntimeContext().getRuntimeComponent(WCMConfigurationService.class); sessionProviderService = operationContext.getRuntimeContext().getRuntimeComponent(SessionProviderService.class); repositoryService = operationContext.getRuntimeContext().getRuntimeComponent(RepositoryService.class); pomSessionManager = operationContext.getRuntimeContext().getRuntimeComponent(POMSessionManager.class); } String siteName = address.resolvePathTemplate("site-name"); if (siteName == null) { throw new OperationException(operationName, "No site name specified."); } List<ExportTask> exportTasks = new ArrayList<ExportTask>(); if (!wcmConfigurationService.getSharedPortalName().equals(siteName)) { LocaleConfigService localeConfigService = operationContext.getRuntimeContext().getRuntimeComponent(LocaleConfigService.class); Collection<LocaleConfig> localeConfigs = localeConfigService.getLocalConfigs(); for (LocaleConfig localeConfig : localeConfigs) { exportTasks.add(getSEOExportTask(operationContext, siteName, localeConfig.getLocale().toString())); } } resultHandler.completed(new ExportResourceModel(exportTasks)); } catch (Exception e) { throw new OperationException(OperationNames.EXPORT_RESOURCE, "Unable to export SEO.", e); } } /** * Gets the SEO export task. * * @param operationContext the operation context * @param siteName the site name * @param lang the lang * @return the SEO export task * @throws Exception the exception */ private SiteSEOExportTask getSEOExportTask(OperationContext operationContext, String siteName, String lang) throws Exception { // FIXME comment this until ECMS-4030 get fixed // SEOService seoService = // operationContext.getRuntimeContext().getRuntimeComponent(SEOService.class); List<PageMetadataModel> pageMetadataModels = new ArrayList<PageMetadataModel>(); List<Navigation> navigations = getSiteNavigations(siteName); for (Navigation navigation : navigations) { PageMetadataModel pageMetadataModel = null; // FIXME use this once ECMS-4030 get fixed // pageMetadataModel = seoService.getPageMetadata(page.getPageId(), lang); // System.out.println(page.getStorageId()); pageMetadataModel = getPageMetadata(navigation.getObjectId(), lang); if (pageMetadataModel != null && pageMetadataModel.getKeywords() != null && !pageMetadataModel.getKeywords().isEmpty()) { pageMetadataModels.add(pageMetadataModel); } } return new SiteSEOExportTask(pageMetadataModels, siteName, lang); } /** * Gets the site navigations. * * @param siteName the site name * @return the site navigations */ private List<Navigation> getSiteNavigations(String siteName) { POMSession session = pomSessionManager.getSession(); ObjectType<Site> objectType = objectType(SiteType.PORTAL); Workspace workspace = session.getWorkspace(); Site site = workspace.getSite(objectType, siteName); Navigation rootNode = site.getRootNavigation(); Navigation defaultNode = rootNode.getChild("default"); List<Navigation> navigations = new ArrayList<Navigation>(defaultNode.getChildren()); int i = 0; computeAllNavigations(navigations, i); return navigations; } /** * Compute all navigations. * * @param navigations the navigations * @param i the i */ private void computeAllNavigations(List<Navigation> navigations, int i) { if (i >= navigations.size()) { return; } Navigation navigation = navigations.get(i); if (navigation.getChildren() != null && !navigation.getChildren().isEmpty()) { navigations.addAll(navigation.getChildren()); } } /** * Gets the page metadata. * * @param pageUUID the page UUID * @param language the language * @return the page metadata * @throws Exception the exception */ public PageMetadataModel getPageMetadata(String pageUUID, String language) throws Exception { PageMetadataModel metaModel = null; if (metaModel == null) { SessionProvider sessionProvider = sessionProviderService.getSystemSessionProvider(null); Session session = sessionProvider.getSession("portal-system", repositoryService.getCurrentRepository()); Node pageNode = session.getNodeByUUID(pageUUID); if (pageNode != null && pageNode.hasNode(SEOServiceImpl.LANGUAGES + "/" + language)) { Node seoNode = pageNode.getNode(SEOServiceImpl.LANGUAGES + "/" + language); if (seoNode.isNodeType("exo:pageMetadata")) { metaModel = new PageMetadataModel(); if (seoNode.hasProperty("exo:metaTitle")) metaModel.setTitle((seoNode.getProperty("exo:metaTitle")).getString()); if (seoNode.hasProperty("exo:metaKeywords")) metaModel.setKeywords((seoNode.getProperty("exo:metaKeywords")).getString()); if (seoNode.hasProperty("exo:metaDescription")) metaModel.setDescription((seoNode.getProperty("exo:metaDescription")).getString()); if (seoNode.hasProperty("exo:metaRobots")) metaModel.setRobotsContent((seoNode.getProperty("exo:metaRobots")).getString()); if (seoNode.hasProperty("exo:metaSitemap")) metaModel.setSiteMap(Boolean.parseBoolean((seoNode.getProperty("exo:metaSitemap")).getString())); if (seoNode.hasProperty("exo:metaPriority")) metaModel.setPriority(Long.parseLong((seoNode.getProperty("exo:metaPriority")).getString())); if (seoNode.hasProperty("exo:metaFrequency")) metaModel.setFrequency((seoNode.getProperty("exo:metaFrequency")).getString()); if (seoNode.hasProperty("exo:metaFully")) metaModel.setFullStatus((seoNode.getProperty("exo:metaFully")).getString()); } } } return metaModel; } }