/* * Copyright (C) 2003-2012 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/>. */ package org.exoplatform.ecms.upgrade.templates; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; import javax.jcr.Node; import javax.jcr.NodeIterator; import javax.jcr.query.Query; import javax.jcr.query.QueryManager; import org.apache.commons.lang.StringUtils; import org.exoplatform.commons.upgrade.UpgradeProductPlugin; import org.exoplatform.commons.utils.PrivilegedSystemHelper; import org.exoplatform.commons.version.util.VersionComparator; import org.exoplatform.container.xml.InitParams; import org.exoplatform.services.cms.views.ApplicationTemplateManagerService; import org.exoplatform.services.cms.views.impl.ApplicationTemplateManagerServiceImpl; import org.exoplatform.services.jcr.ext.common.SessionProvider; import org.exoplatform.services.log.ExoLogger; import org.exoplatform.services.log.Log; /** * Created by The eXo Platform SAS * Author : Nguyen Anh Vu * vuna@exoplatform.com * Feb 24, 2012 * * This class will be used to upgrade pre-defined templates of Content-list-viewer and Search portlets. * Views with desire of manual upgration can be specified in file configuration.properties.<br> * Syntax :<br> * unchanged-clv-templates={template name list} * unchanged-wcm-search-templates={template name list} * For examples :<br> * unchanged-clv-templates=list/BigHotNewsTemplateCLV.gtmpl,navigation/CategoryList.gtmpl * unchanged-wcm-search-templates=search-form/UIDefaultSearchForm.gtmpl * */ public class WCMTemplateUpgradePlugin extends UpgradeProductPlugin { private static final Log log = ExoLogger.getLogger(WCMTemplateUpgradePlugin.class.getName()); private ApplicationTemplateManagerService appTemplateService_; public WCMTemplateUpgradePlugin(ApplicationTemplateManagerService appTemplateService, InitParams initParams) { super(initParams); this.appTemplateService_ = appTemplateService; } public void processUpgrade(String oldVersion, String newVersion) { if (log.isInfoEnabled()) { log.info("Start " + this.getClass().getName() + "............."); } String unchangedClvTemplates = PrivilegedSystemHelper.getProperty("unchanged-clv-templates"); String unchangedSearchTemplates = PrivilegedSystemHelper.getProperty("unchanged-wcm-search-templates"); upgrade(unchangedClvTemplates, "content-list-viewer"); upgrade(unchangedSearchTemplates, "search"); try { // re-initialize new scripts ((ApplicationTemplateManagerServiceImpl)appTemplateService_).start(); } catch (Exception e) { if (log.isErrorEnabled()) { log.error("An unexpected error occurs when migrating templates for portlet CLV and WCMSearch: ", e); } } } private void upgrade(String unchangedTemplates, String portletName) { SessionProvider sessionProvider = null; if (StringUtils.isEmpty(unchangedTemplates)) { unchangedTemplates = ""; } try { Set<String> unchangedTemplateSet = new HashSet<String>(); Set<String> configuredTemplates = appTemplateService_.getConfiguredAppTemplateMap(portletName); List<Node> removedNodes = new ArrayList<Node>(); for (String unchangedTemplate : unchangedTemplates.split(",")) { unchangedTemplateSet.add(unchangedTemplate.trim()); } //get all old query nodes that need to be removed. sessionProvider = SessionProvider.createSystemProvider(); Node templateHomeNode = appTemplateService_.getApplicationTemplateHome(portletName, sessionProvider); QueryManager queryManager = templateHomeNode.getSession().getWorkspace().getQueryManager(); NodeIterator iter = queryManager. createQuery("SELECT * FROM nt:file WHERE jcr:path LIKE '" + templateHomeNode.getPath() + "/%'", Query.SQL). execute().getNodes(); while (iter.hasNext()) { Node templateNode = iter.nextNode(); if (!unchangedTemplateSet.contains(templateNode.getPath().substring(templateHomeNode.getPath().length() + 1)) && configuredTemplates.contains(templateNode.getPath().substring(templateHomeNode.getPath().length() + 1))) { removedNodes.add(templateNode); } } //remove all old script nodes for (Node removedNode : removedNodes) { try { removedNode.remove(); templateHomeNode.save(); } catch (Exception e) { if (log.isInfoEnabled()) { log.error("Error in " + this.getName() + ": Can not remove old template: " + removedNode.getPath()); } } } } catch (Exception e) { if (log.isErrorEnabled()) { log.error("An unexpected error occurs when migrating templates for portlet: " + portletName + ": ", e); } } finally { if (sessionProvider != null) { sessionProvider.close(); } } } @Override public boolean shouldProceedToUpgrade(String newVersion, String previousVersion) { // --- return true only for the first version of platform return VersionComparator.isAfter(newVersion,previousVersion); } }