/* * Copyright (C) 2003-2014 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 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.metadata.MetadataService; import org.exoplatform.services.cms.metadata.impl.MetadataServiceImpl; import org.exoplatform.services.log.ExoLogger; import org.exoplatform.services.log.Log; /** * Created by The eXo Platform SAS * * This class will be used to upgrade template to view and edit metadata like dc:elementSet. * Metadata templates for manual upgration * can be specified in file configuration.properties.<br> * Syntax:<br> * unchanged-metadata-templates={node name list} * For example:<br> * unchanged-metadata-templates=metadata:siteMetadata * */ public class MetadataTemplateUpgradePlugin extends UpgradeProductPlugin { private Log log = ExoLogger.getLogger(this.getClass()); private MetadataService metadataService_; public MetadataTemplateUpgradePlugin(MetadataService metadataService, InitParams initParams) { super(initParams); this.metadataService_ = metadataService; } @Override public void processUpgrade(String oldVersion, String newVersion) { if (log.isInfoEnabled()) { log.info("Start " + this.getClass().getName() + "............."); } String unchangedMetadataTypes = PrivilegedSystemHelper.getProperty("unchanged-metadata-templates"); if (StringUtils.isEmpty(unchangedMetadataTypes)) { unchangedMetadataTypes = ""; } try { Set<String> unchangedMetadataTypeSet = new HashSet<String>(); List<String> configuredMetadataTypeSet = metadataService_.getMetadataList(); List<String> removedMetadata = new ArrayList<String>(); for (String unchangedMetadataType : unchangedMetadataTypes.split(",")) { unchangedMetadataTypeSet.add(unchangedMetadataType.trim()); } // get all metadata type nodes that need to be removed for (String metadataType : configuredMetadataTypeSet) { if (!unchangedMetadataTypeSet.contains(metadataType)) { removedMetadata.add(metadataType); log.info("Metadata " + metadataType + " will be updated."); } } // remove all old metadata node type for (String removedMetadataNode : removedMetadata) { metadataService_.removeMetadata(removedMetadataNode); } // reinitialize new templates ((MetadataServiceImpl)metadataService_).start(); } catch (Exception e) { if (log.isErrorEnabled()) { log.error("An unexpected error occurs when migrating metadata template", e); } } } @Override public boolean shouldProceedToUpgrade(String newVersion, String previousVersion) { // --- return true only for the first version of platform return VersionComparator.isAfter(newVersion, previousVersion); } }