org.opencms.ade.sitemap.CmsAliasBulkEditHelper Maven / Gradle / Ivy
Show all versions of opencms-test Show documentation
/*
* 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;
}
}
}