All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.opencms.ade.sitemap.CmsAliasBulkEditHelper Maven / Gradle / Ivy

Go to download

OpenCms is an enterprise-ready, easy to use website content management system based on Java and XML technology. Offering a complete set of features, OpenCms helps content managers worldwide to create and maintain beautiful websites fast and efficiently.

There is a newer version: 18.0
Show newest version
/*
 * This library is part of OpenCms -
 * the Open Source Content Management System
 *
 * Copyright (C) Alkacon Software (http://www.alkacon.com)
 *
 * This library 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 library 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.
 *
 * For further information about Alkacon Software, please see the
 * company website: http://www.alkacon.com
 *
 * For further information about OpenCms, please see the
 * project website: http://www.opencms.org
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */

package org.opencms.ade.sitemap;

import static org.opencms.ade.sitemap.shared.I_CmsAliasConstants.PARAM_IMPORTFILE;
import static org.opencms.ade.sitemap.shared.I_CmsAliasConstants.PARAM_SEPARATOR;
import static org.opencms.ade.sitemap.shared.I_CmsAliasConstants.PARAM_SITEROOT;

import org.opencms.db.CmsAlias;
import org.opencms.db.CmsAliasManager;
import org.opencms.db.CmsRewriteAlias;
import org.opencms.file.CmsObject;
import org.opencms.file.CmsResource;
import org.opencms.file.CmsResourceFilter;
import org.opencms.gwt.shared.alias.CmsAliasEditValidationReply;
import org.opencms.gwt.shared.alias.CmsAliasEditValidationRequest;
import org.opencms.gwt.shared.alias.CmsAliasImportResult;
import org.opencms.gwt.shared.alias.CmsAliasSaveValidationRequest;
import org.opencms.gwt.shared.alias.CmsAliasTableRow;
import org.opencms.gwt.shared.alias.CmsRewriteAliasTableRow;
import org.opencms.main.CmsException;
import org.opencms.main.OpenCms;
import org.opencms.util.CmsUUID;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Locale;
import java.util.Set;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

import com.google.common.collect.Sets;

/**
 * Helper class used by a service to edit or import aliases for a whole site.

*/ public class CmsAliasBulkEditHelper { /** The current CMS context. */ private CmsObject m_cms; /** Flag to indicate whether the validation was successful. */ private boolean m_hasErrors; /** * Creates a new helper object.

* * @param cms the current CMS context */ public CmsAliasBulkEditHelper(CmsObject cms) { m_cms = cms; } /** * Imports uploaded aliases from a request.

* * @param request the request containing the uploaded aliases * @param response the response * @throws Exception if something goes wrong */ public void importAliases(HttpServletRequest request, HttpServletResponse response) throws Exception { FileItemFactory factory = new DiskFileItemFactory(); ServletFileUpload upload = new ServletFileUpload(factory); @SuppressWarnings("unchecked") List items = upload.parseRequest(request); byte[] data = null; String siteRoot = null; String separator = ","; for (FileItem fileItem : items) { String name = fileItem.getFieldName(); if (PARAM_IMPORTFILE.equals(name)) { data = fileItem.get(); } else if (PARAM_SITEROOT.equals(name)) { siteRoot = new String(fileItem.get(), request.getCharacterEncoding()); } else if (PARAM_SEPARATOR.equals(name)) { separator = new String(fileItem.get(), request.getCharacterEncoding()); } } List result = new ArrayList(); if ((siteRoot != null) && (data != null)) { result = OpenCms.getAliasManager().importAliases(m_cms, data, siteRoot, separator); } String key = CmsVfsSitemapService.addAliasImportResult(result); // only respond with a key, then the client can get the data for the key via GWT-RPC response.getWriter().print(key); } /** * Saves alias changes to the database.

* * @param saveRequest an object containing the alias changes to save * * @return a validation error if the alias data is invalid, or null otherwise * * @throws CmsException if something goes wrong */ public CmsAliasEditValidationReply saveAliases(CmsAliasSaveValidationRequest saveRequest) throws CmsException { CmsAliasEditValidationReply reply = validateAliases(saveRequest); if (m_hasErrors) { return reply; } else { List rewriteData = saveRequest.getRewriteData(); OpenCms.getAliasManager().saveRewriteAliases( m_cms, m_cms.getRequestContext().getSiteRoot(), convertRewriteData(rewriteData)); Set allTouchedIds = new HashSet(); List rows = saveRequest.getEditedData(); for (CmsAliasTableRow row : rows) { if (row.isEdited()) { allTouchedIds.add(row.getStructureId()); if (row.getOriginalStructureId() != null) { allTouchedIds.add(row.getOriginalStructureId()); } } } allTouchedIds.addAll(saveRequest.getDeletedIds()); CmsAliasManager aliasManager = OpenCms.getAliasManager(); String siteRoot = saveRequest.getSiteRoot(); List aliases = aliasManager.getAliasesForSite(m_cms, siteRoot); Set aliasSet = new HashSet(); Set editedAliasSet = new HashSet(); aliasSet.addAll(aliases); for (CmsAliasTableRow row : rows) { CmsAlias editedAlias = new CmsAlias(row.getStructureId(), siteRoot, row.getAliasPath(), row.getMode()); editedAliasSet.add(editedAlias); } Set toDelete = Sets.difference(aliasSet, editedAliasSet); toDelete = filterStructureId(toDelete, allTouchedIds); Set toAdd = Sets.difference(editedAliasSet, aliasSet); toAdd = filterStructureId(toAdd, allTouchedIds); aliasManager.updateAliases(m_cms, toDelete, toAdd); return null; } } /** * Validates the alias data.

* * @param validationRequest an object containing the alias data to validate * * @return the validation result */ public CmsAliasEditValidationReply validateAliases(CmsAliasEditValidationRequest validationRequest) { List editedData = validationRequest.getEditedData(); CmsAliasTableRow newEntry = validationRequest.getNewEntry(); if (newEntry != null) { newEntry.setKey((new CmsUUID()).toString()); editedData.add(newEntry); } CmsObject cms = m_cms; Locale locale = OpenCms.getWorkplaceManager().getWorkplaceLocale(cms); for (CmsAliasTableRow row : editedData) { row.clearErrors(); validateSingleAliasRow(cms, row); } Set foundAliasPaths = new HashSet(); Set duplicateAliasPaths = new HashSet(); for (CmsAliasTableRow row : editedData) { String aliasPath = row.getAliasPath(); if (foundAliasPaths.contains(aliasPath)) { duplicateAliasPaths.add(aliasPath); } foundAliasPaths.add(aliasPath); } for (CmsAliasTableRow row : editedData) { if (duplicateAliasPaths.contains(row.getAliasPath())) { if (row.getPathError() == null) { row.setAliasError(messageDuplicateAliasPath(locale)); m_hasErrors = true; } } } CmsAliasEditValidationReply result = new CmsAliasEditValidationReply(); List changedRows = new ArrayList(); for (CmsAliasTableRow row : editedData) { if (row.isChanged()) { changedRows.add(row); } } if (newEntry != null) { changedRows.remove(newEntry); } result.setChangedRows(changedRows); result.setValidatedNewEntry(newEntry); return result; } /** * Filters all aliases from a set whose structure id is in a given set of structure ids.

* * @param aliases the aliases to filter * @param structureIds the structure ids for which we want the aliases * * @return the filtered structure ids */ protected Set filterStructureId(Set aliases, Set structureIds) { Set result = new HashSet(); for (CmsAlias alias : aliases) { if (structureIds.contains(alias.getStructureId())) { result.add(alias); } } return result; } /** * Converts rewrite alias table rows to rewrite alias objects.

* * @param rewriteData the rewrite data * * @return the converted rewrite aliases */ private List convertRewriteData(List rewriteData) { String siteRoot = m_cms.getRequestContext().getSiteRoot(); List result = new ArrayList(); for (CmsRewriteAliasTableRow row : rewriteData) { CmsRewriteAlias alias = new CmsRewriteAlias( row.getId(), siteRoot, row.getPatternString(), row.getReplacementString(), row.getMode()); result.add(alias); } return result; } /** * Message accessor. * * @param locale the locale for messages * * @return the message string */ private String messageDuplicateAliasPath(Locale locale) { return Messages.get().getBundle(locale).key(Messages.ERR_ALIAS_DUPLICATE_ALIAS_PATH_0); } /** * Message accessor. * * @param locale the locale for messages * * @return the message string */ private String messageInvalidAliasPath(Locale locale) { return Messages.get().getBundle(locale).key(Messages.ERR_ALIAS_INVALID_ALIAS_PATH_0); } /** * Message accessor. * * @param locale the locale for messages * * @return the message string */ private String messageResourceNotFound(Locale locale) { return Messages.get().getBundle(locale).key(Messages.ERR_ALIAS_RESOURCE_NOT_FOUND_0); } /** * Validates a single alias row.

* * @param cms the current CMS context * @param row the row to validate */ private void validateSingleAliasRow(CmsObject cms, CmsAliasTableRow row) { Locale locale = OpenCms.getWorkplaceManager().getWorkplaceLocale(cms); if (row.getStructureId() == null) { String path = row.getResourcePath(); try { CmsResource resource = cms.readResource(path, CmsResourceFilter.ALL); row.setStructureId(resource.getStructureId()); if (row.getOriginalStructureId() == null) { row.setOriginalStructureId(resource.getStructureId()); } } catch (CmsException e) { row.setPathError(messageResourceNotFound(locale)); m_hasErrors = true; } } if (!CmsAlias.ALIAS_PATTERN.matcher(row.getAliasPath()).matches()) { row.setAliasError(messageInvalidAliasPath(locale)); m_hasErrors = true; } } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy