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

org.opencms.staticexport.CmsAfterPublishStaticExportHandler 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 GmbH & Co. KG (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 GmbH & Co. KG, 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.staticexport;

import org.opencms.ade.detailpage.CmsDetailPageUtil;
import org.opencms.db.CmsPublishedResource;
import org.opencms.file.CmsObject;
import org.opencms.file.CmsResource;
import org.opencms.file.CmsResourceFilter;
import org.opencms.file.CmsVfsResourceNotFoundException;
import org.opencms.loader.I_CmsResourceLoader;
import org.opencms.main.CmsException;
import org.opencms.main.CmsLog;
import org.opencms.main.OpenCms;
import org.opencms.report.I_CmsReport;
import org.opencms.util.CmsFileUtil;
import org.opencms.util.CmsRequestUtil;
import org.opencms.util.CmsStringUtil;
import org.opencms.util.CmsUUID;
import org.opencms.workplace.CmsWorkplace;

import java.io.File;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.logging.Log;

/**
 * Implementation for the {@link I_CmsStaticExportHandler} interface.

* * This handler exports all changes immediately after something is published.

* * @since 6.0.0 * * @see I_CmsStaticExportHandler */ public class CmsAfterPublishStaticExportHandler extends A_CmsStaticExportHandler { /** Header field set-cookie constant. */ private static final String HEADER_FIELD_SET_COOKIE = "Set-Cookie"; /** The log object for this class. */ private static final Log LOG = CmsLog.getLog(CmsAfterPublishStaticExportHandler.class); /** Request method get constant. */ private static final String REQUEST_METHOD_GET = "GET"; /** Request property cookie constant. */ private static final String REQUEST_PROPERTY_COOKIE = "Cookie"; /** * Does the actual static export.

* * @param resources a list of CmsPublishedREsources to start the static export with * @param report an {@link I_CmsReport} instance to print output message, or null to write messages to the log file * * @throws CmsException in case of errors accessing the VFS * @throws IOException in case of errors writing to the export output stream * @throws ServletException in case of errors accessing the servlet */ public void doExportAfterPublish(List resources, I_CmsReport report) throws CmsException, IOException, ServletException { boolean templatesFound; // export must be done in the context of the export user // this will always use the root site CmsObject cmsExportObject = OpenCms.initCmsObject(OpenCms.getDefaultUsers().getUserExport()); List resourcesToExport = getRelatedResources(cmsExportObject, resources); // first export all non-template resources templatesFound = exportNonTemplateResources(cmsExportObject, resourcesToExport, report); LOG.warn("finished exporting non-template resources. "); // export template resources (check "plainoptimization" setting) if ((templatesFound) || (!OpenCms.getStaticExportManager().getQuickPlainExport())) { CmsStaticExportManager manager = OpenCms.getStaticExportManager(); // build resource filter set Set resourceFilter = new HashSet(); for (CmsPublishedResource pubResource : resourcesToExport) { String rfsName = manager.getRfsName(cmsExportObject, pubResource.getRootPath()); resourceFilter.add(rfsName.substring(manager.getRfsPrefixForRfsName(rfsName).length())); } long timestamp = 0; List publishedTemplateResources; boolean newTemplateLinksFound; int linkMode = CmsStaticExportManager.EXPORT_LINK_WITHOUT_PARAMETER; do { // get all template resources which are potential candidates for a static export publishedTemplateResources = cmsExportObject.readStaticExportResources(linkMode, timestamp); if (publishedTemplateResources == null) { break; } newTemplateLinksFound = publishedTemplateResources.size() > 0; if (newTemplateLinksFound) { if (linkMode == CmsStaticExportManager.EXPORT_LINK_WITHOUT_PARAMETER) { // first loop, switch mode to parameter links, leave the timestamp unchanged linkMode = CmsStaticExportManager.EXPORT_LINK_WITH_PARAMETER; // filter without parameter publishedTemplateResources.retainAll(resourceFilter); } else { // second and subsequent loops, only look for links not already exported // this can only be the case for a link with parameters // that was present on a page also generated with parameters timestamp = System.currentTimeMillis(); // filter with parameter Iterator itPubTemplates = publishedTemplateResources.iterator(); while (itPubTemplates.hasNext()) { String rfsName = itPubTemplates.next(); if (!resourceFilter.contains(rfsName.substring(0, rfsName.lastIndexOf('_')))) { itPubTemplates.remove(); } } } // leave if no template left if (publishedTemplateResources.isEmpty()) { break; } // export LOG.warn("exporting template resources. "); exportTemplateResources(cmsExportObject, publishedTemplateResources, report); } // if no new template links where found we are finished } while (newTemplateLinksFound); } } /** * Returns all resources within the current OpenCms site that are not marked as internal.

* * The result list contains objects of type {@link CmsPublishedResource}.

* * @param cms the cms context * * @return all resources within the current OpenCms site that are not marked as internal * * @throws CmsException if something goes wrong */ public List getAllResources(CmsObject cms) throws CmsException { if (LOG.isDebugEnabled()) { LOG.debug(Messages.get().getBundle().key(Messages.LOG_GET_ALL_RESOURCES_0)); } // TODO: to improve performance, get here only the resources to render from the configuration // read all from the root path, exclude resources flagged as internal List vfsResources = cms.readResources( "/", CmsResourceFilter.ALL.addExcludeFlags(CmsResource.FLAG_INTERNAL)); CmsExportFolderMatcher matcher = OpenCms.getStaticExportManager().getExportFolderMatcher(); // loop through the list and create the list of CmsPublishedResources List resources = new ArrayList(vfsResources.size()); Iterator i = vfsResources.iterator(); while (i.hasNext()) { CmsResource resource = i.next(); if (!matcher.match(resource.getRootPath())) { // filter files that do not match the resources to render continue; } CmsPublishedResource pubRes = new CmsPublishedResource(resource); if (LOG.isDebugEnabled()) { LOG.debug(Messages.get().getBundle().key(Messages.LOG_PROCESSING_1, resource.getRootPath())); } resources.add(pubRes); } if (LOG.isDebugEnabled()) { LOG.debug(Messages.get().getBundle().key(Messages.LOG_NUM_RESOURCES_1, new Integer(resources.size()))); } return resources; } /** * @see org.opencms.staticexport.I_CmsStaticExportHandler#performEventPublishProject(org.opencms.util.CmsUUID, org.opencms.report.I_CmsReport) */ @Override public void performEventPublishProject(CmsUUID publishHistoryId, I_CmsReport report) { try { m_busy = true; exportAfterPublish(publishHistoryId, report); } catch (Throwable t) { if (LOG.isErrorEnabled()) { LOG.error(Messages.get().getBundle().key(Messages.LOG_STATIC_EXPORT_ERROR_0), t); } if (report != null) { report.addError(t); } } finally { m_busy = false; } } /** * Starts the static export on publish.

* * Exports all modified resources after a publish process into the real FS.

* * @param publishHistoryId the publichHistoryId of the published project * @param report an {@link I_CmsReport} instance to print output message, or null to write messages to the log file * * @throws CmsException in case of errors accessing the VFS * @throws IOException in case of errors writing to the export output stream * @throws ServletException in case of errors accessing the servlet */ protected void exportAfterPublish(CmsUUID publishHistoryId, I_CmsReport report) throws CmsException, IOException, ServletException { // first check if the test resource was published already // if not, we must do a complete export of all static resources String rfsName = CmsFileUtil.normalizePath( OpenCms.getStaticExportManager().getExportPath(OpenCms.getStaticExportManager().getTestResource()) + OpenCms.getStaticExportManager().getTestResource()); if (LOG.isDebugEnabled()) { LOG.debug(Messages.get().getBundle().key(Messages.LOG_CHECKING_TEST_RESOURCE_1, rfsName)); } File file = new File(rfsName); if (!file.exists()) { if (LOG.isDebugEnabled()) { LOG.debug(Messages.get().getBundle().key(Messages.LOG_TEST_RESOURCE_NOT_EXISTANT_0)); } // the file is not there, so export everything OpenCms.getStaticExportManager().exportFullStaticRender(true, report); } else { if (LOG.isDebugEnabled()) { LOG.debug(Messages.get().getBundle().key(Messages.LOG_TEST_RESOURCE_EXISTS_0)); } // delete all resources deleted during the publish process, and retrieve the list of resources to actually export List publishedResources = scrubExportFolders(publishHistoryId); // do the export doExportAfterPublish(publishedResources, report); } } /** * Exports all non template resources found in a list of published resources.

* * @param cms the current cms object * @param publishedResources the list of published resources * @param report an I_CmsReport instance to print output message, or null to write messages to the log file * * @return true if some template resources were found while looping the list of published resources * * @throws CmsException in case of errors accessing the VFS * @throws IOException in case of errors writing to the export output stream * @throws ServletException in case of errors accessing the servlet */ protected boolean exportNonTemplateResources( CmsObject cms, List publishedResources, I_CmsReport report) throws CmsException, IOException, ServletException { report.println( Messages.get().container(Messages.RPT_STATICEXPORT_NONTEMPLATE_RESOURCES_BEGIN_0), I_CmsReport.FORMAT_HEADLINE); if (LOG.isDebugEnabled()) { LOG.debug( Messages.get().getBundle().key( Messages.LOG_EXPORTING_NON_TEMPLATE_1, new Integer(publishedResources.size()))); } CmsStaticExportManager manager = OpenCms.getStaticExportManager(); List resourcesToExport = new ArrayList(); boolean templatesFound = readNonTemplateResourcesToExport(cms, publishedResources, resourcesToExport); int count = 1; int size = resourcesToExport.size(); if (LOG.isDebugEnabled()) { LOG.debug(Messages.get().getBundle().key(Messages.LOG_NUM_EXPORT_1, new Integer(size))); } // now do the export Iterator i = resourcesToExport.iterator(); while (i.hasNext()) { CmsStaticExportData exportData = i.next(); if (LOG.isDebugEnabled()) { LOG.debug( Messages.get().getBundle().key( Messages.LOG_EXPORT_FILE_2, exportData.getVfsName(), exportData.getRfsName())); } report.print( org.opencms.report.Messages.get().container( org.opencms.report.Messages.RPT_SUCCESSION_2, new Integer(count++), new Integer(size)), I_CmsReport.FORMAT_NOTE); report.print(Messages.get().container(Messages.RPT_EXPORTING_0), I_CmsReport.FORMAT_NOTE); report.print( org.opencms.report.Messages.get().container( org.opencms.report.Messages.RPT_ARGUMENT_1, exportData.getVfsName())); report.print(org.opencms.report.Messages.get().container(org.opencms.report.Messages.RPT_DOTS_0)); int status = manager.export(null, null, cms, exportData); if (status == HttpServletResponse.SC_OK) { report.println( org.opencms.report.Messages.get().container(org.opencms.report.Messages.RPT_OK_0), I_CmsReport.FORMAT_OK); } else { report.println( org.opencms.report.Messages.get().container(org.opencms.report.Messages.RPT_IGNORED_0), I_CmsReport.FORMAT_NOTE); } if (LOG.isInfoEnabled()) { Object[] arguments = new Object[] { exportData.getVfsName(), exportData.getRfsName(), new Integer(status)}; LOG.info(Messages.get().getBundle().key(Messages.LOG_EXPORT_FILE_STATUS_3, arguments)); } //don't lock up the CPU exclusively - allow other Threads to run as well Thread.yield(); } resourcesToExport = null; report.println( Messages.get().container(Messages.RPT_STATICEXPORT_NONTEMPLATE_RESOURCES_END_0), I_CmsReport.FORMAT_HEADLINE); return templatesFound; } /** * Exports all sitemap resources found in a list of published resources.

* * @param entry the sitemap entry * @param data the export data * @param cookies cookies to keep the session * * @return the status of the http request used to perform the export * * @throws IOException if something goes wrong */ // protected int exportSitemapResource(CmsSitemapEntry entry, CmsStaticExportData data, StringBuffer cookies) // throws IOException { // // String vfsName = data.getVfsName(); // String rfsName = data.getRfsName(); // CmsStaticExportManager manager = OpenCms.getStaticExportManager(); // // // check if the resource to export is a detail page // // TODO: later when the property concept is finished this info is unnecessary // String path = vfsName; // boolean exportPropertyAlreadyReadFromVFS = false; // if (path.endsWith("/")) { // path = path.substring(0, path.length() - 1); // String detailId = CmsResource.getName(path); // if (CmsUUID.isValidUUID(detailId)) { // exportPropertyAlreadyReadFromVFS = true; // } // } // // try { // CmsObject exportCms = OpenCms.initCmsObject(OpenCms.getDefaultUsers().getUserExport()); // Map props = entry.getProperties(true); // // if a container page was found in the vfs and // if (((props.get("export") != null) && props.get("export").equals("true")) // || exportPropertyAlreadyReadFromVFS) { // // calculate rfs name // rfsName = manager.getRfsName(exportCms, entry.getRootPath()); // // String exportUrlStr; // if (rfsName.contains(manager.getRfsPrefix(vfsName))) { // exportUrlStr = manager.getExportUrl() + rfsName; // } else { // exportUrlStr = manager.getExportUrl() + manager.getRfsPrefix(vfsName) + rfsName; // } // if (LOG.isDebugEnabled()) { // LOG.debug(Messages.get().getBundle().key(Messages.LOG_SENDING_REQUEST_2, rfsName, exportUrlStr)); // } // // setup the connection and request the resource // URL exportUrl = new URL(exportUrlStr); // HttpURLConnection.setFollowRedirects(false); // HttpURLConnection urlcon = (HttpURLConnection)exportUrl.openConnection(); // // set request type to GET // urlcon.setRequestMethod(REQUEST_METHOD_GET); // // add special export header // urlcon.setRequestProperty(CmsRequestUtil.HEADER_OPENCMS_EXPORT, CmsStringUtil.TRUE); // // add additional headers if available // if (manager.getAcceptLanguageHeader() != null) { // urlcon.setRequestProperty(CmsRequestUtil.HEADER_ACCEPT_LANGUAGE, manager.getAcceptLanguageHeader()); // } else { // urlcon.setRequestProperty( // CmsRequestUtil.HEADER_ACCEPT_LANGUAGE, // manager.getDefaultAcceptLanguageHeader()); // } // if (manager.getAcceptCharsetHeader() != null) { // urlcon.setRequestProperty(CmsRequestUtil.HEADER_ACCEPT_CHARSET, manager.getAcceptCharsetHeader()); // } else { // urlcon.setRequestProperty( // CmsRequestUtil.HEADER_ACCEPT_CHARSET, // manager.getDefaultAcceptCharsetHeader()); // } // // // get the last modified date and add it to the request // String exportFileName = CmsFileUtil.normalizePath(manager.getExportPath(vfsName) + rfsName); // File exportFile = new File(exportFileName); // long dateLastModified = exportFile.lastModified(); // // system folder case // if (vfsName.startsWith(CmsWorkplace.VFS_PATH_SYSTEM)) { // // iterate over all rules // for (CmsStaticExportRfsRule rule : manager.getRfsRules()) { // if (rule.match(vfsName)) { // exportFileName = CmsFileUtil.normalizePath(rule.getExportPath() + rfsName); // exportFile = new File(exportFileName); // if (dateLastModified > exportFile.lastModified()) { // dateLastModified = exportFile.lastModified(); // } // } // } // } // urlcon.setIfModifiedSince(dateLastModified); // if (LOG.isDebugEnabled()) { // LOG.debug(Messages.get().getBundle().key( // Messages.LOG_IF_MODIFIED_SINCE_SET_2, // exportFile.getName(), // new Long((dateLastModified / 1000) * 1000))); // } // if (cookies.length() > 0) { // // set the cookies, included the session id to keep the same session // urlcon.setRequestProperty(REQUEST_PROPERTY_COOKIE, cookies.toString()); // } // // // now perform the request // urlcon.connect(); // int status = urlcon.getResponseCode(); // // if (cookies.length() == 0) { // //Now retrieve the cookies. The jsessionid is here // cookies.append(urlcon.getHeaderField(HEADER_FIELD_SET_COOKIE)); // if (LOG.isDebugEnabled()) { // LOG.debug(Messages.get().getBundle().key(Messages.LOG_STATICEXPORT_COOKIES_1, cookies)); // } // } // urlcon.disconnect(); // if (LOG.isInfoEnabled()) { // LOG.info(Messages.get().getBundle().key( // Messages.LOG_REQUEST_RESULT_3, // rfsName, // exportUrlStr, // new Integer(status))); // } // return status; // } // } catch (CmsException e) { // LOG.error(e.getLocalizedMessage(), e); // } // return HttpServletResponse.SC_SEE_OTHER; // } /** * Exports a single (template) resource specified by its export data.

* * @param data the export data * @param cookies cookies to keep the session * * @return the status of the http request used to perform the export * * @throws IOException if the http request fails */ protected int exportTemplateResource(CmsStaticExportData data, StringBuffer cookies) throws IOException { String vfsName = data.getVfsName(); String rfsName = data.getRfsName(); CmsStaticExportManager manager = OpenCms.getStaticExportManager(); String exportUrlStr; if (rfsName.contains(manager.getRfsPrefix(vfsName))) { LOG.info("rfsName " + rfsName + " contains rfsPrefix " + manager.getRfsPrefix(vfsName)); exportUrlStr = manager.getExportUrl() + rfsName; } else { exportUrlStr = manager.getExportUrl() + manager.getRfsPrefix(vfsName) + rfsName; } if (LOG.isDebugEnabled()) { LOG.debug(Messages.get().getBundle().key(Messages.LOG_SENDING_REQUEST_2, rfsName, exportUrlStr)); } // setup the connection and request the resource URL exportUrl = new URL(exportUrlStr); HttpURLConnection.setFollowRedirects(false); HttpURLConnection urlcon = (HttpURLConnection)exportUrl.openConnection(); // set request type to GET urlcon.setRequestMethod(REQUEST_METHOD_GET); // add special export header urlcon.setRequestProperty(CmsRequestUtil.HEADER_OPENCMS_EXPORT, CmsStringUtil.TRUE); // add additional headers if available if (manager.getAcceptLanguageHeader() != null) { urlcon.setRequestProperty(CmsRequestUtil.HEADER_ACCEPT_LANGUAGE, manager.getAcceptLanguageHeader()); } else { urlcon.setRequestProperty(CmsRequestUtil.HEADER_ACCEPT_LANGUAGE, manager.getDefaultAcceptLanguageHeader()); } if (manager.getAcceptCharsetHeader() != null) { urlcon.setRequestProperty(CmsRequestUtil.HEADER_ACCEPT_CHARSET, manager.getAcceptCharsetHeader()); } else { urlcon.setRequestProperty(CmsRequestUtil.HEADER_ACCEPT_CHARSET, manager.getDefaultAcceptCharsetHeader()); } // get the last modified date and add it to the request String exportFileName = CmsFileUtil.normalizePath(manager.getExportPath(vfsName) + rfsName); File exportFile = new File(exportFileName); long dateLastModified = exportFile.lastModified(); // system folder case if (vfsName.startsWith(CmsWorkplace.VFS_PATH_SYSTEM)) { // iterate over all rules Iterator it = manager.getRfsRules().iterator(); while (it.hasNext()) { CmsStaticExportRfsRule rule = it.next(); if (rule.match(vfsName)) { exportFileName = CmsFileUtil.normalizePath(rule.getExportPath() + rfsName); exportFile = new File(exportFileName); if (dateLastModified > exportFile.lastModified()) { dateLastModified = exportFile.lastModified(); } } } } urlcon.setIfModifiedSince(dateLastModified); if (LOG.isDebugEnabled()) { LOG.debug( Messages.get().getBundle().key( Messages.LOG_IF_MODIFIED_SINCE_SET_2, exportFile.getName(), new Long((dateLastModified / 1000) * 1000))); } if (cookies.length() > 0) { // set the cookies, included the session id to keep the same session urlcon.setRequestProperty(REQUEST_PROPERTY_COOKIE, cookies.toString()); } // now perform the request urlcon.connect(); int status = urlcon.getResponseCode(); if (cookies.length() == 0) { //Now retrieve the cookies. The jsessionid is here cookies.append(urlcon.getHeaderField(HEADER_FIELD_SET_COOKIE)); if (LOG.isDebugEnabled()) { LOG.debug(Messages.get().getBundle().key(Messages.LOG_STATICEXPORT_COOKIES_1, cookies)); } } urlcon.disconnect(); if (LOG.isInfoEnabled()) { LOG.info( Messages.get().getBundle().key( Messages.LOG_REQUEST_RESULT_3, rfsName, exportUrlStr, new Integer(status))); } return status; } /** * Exports all template resources found in a list of published resources.

* * @param cms the cms context, in the root site as Export user * @param publishedTemplateResources list of potential candidates to export * @param report an I_CmsReport instance to print output message, or null to write messages to the log file */ protected void exportTemplateResources(CmsObject cms, List publishedTemplateResources, I_CmsReport report) { CmsStaticExportManager manager = OpenCms.getStaticExportManager(); int size = publishedTemplateResources.size(); int count = 1; if (LOG.isDebugEnabled()) { LOG.debug(Messages.get().getBundle().key(Messages.LOG_EXPORT_TEMPLATES_1, new Integer(size))); } report.println( Messages.get().container(Messages.RPT_STATICEXPORT_TEMPLATE_RESOURCES_BEGIN_0), I_CmsReport.FORMAT_HEADLINE); StringBuffer cookies = new StringBuffer(); // now loop through all of them and request them from the server Iterator i = publishedTemplateResources.iterator(); while (i.hasNext()) { String rfsName = i.next(); CmsStaticExportData data = null; try { data = manager.getVfsNameInternal(cms, rfsName); } catch (CmsVfsResourceNotFoundException e) { String rfsBaseName = rfsName; int pos = rfsName.lastIndexOf('_'); if (pos >= 0) { rfsBaseName = rfsName.substring(0, pos); } try { data = manager.getVfsNameInternal(cms, rfsBaseName); } catch (CmsVfsResourceNotFoundException e2) { if (LOG.isInfoEnabled()) { LOG.info( Messages.get().getBundle().key( Messages.LOG_NO_INTERNAL_VFS_RESOURCE_FOUND_1, new String[] {rfsName})); } } } if (data != null) { data.setRfsName(rfsName); report.print( org.opencms.report.Messages.get().container( org.opencms.report.Messages.RPT_SUCCESSION_2, new Integer(count++), new Integer(size)), I_CmsReport.FORMAT_NOTE); report.print(Messages.get().container(Messages.RPT_EXPORTING_0), I_CmsReport.FORMAT_NOTE); report.print( org.opencms.report.Messages.get().container(org.opencms.report.Messages.RPT_ARGUMENT_1, rfsName)); report.print(org.opencms.report.Messages.get().container(org.opencms.report.Messages.RPT_DOTS_0)); } else { // no valid resource found for rfs name (already deleted), skip it continue; } try { CmsResource resource = data.getResource(); try { Collection detailPages = CmsDetailPageUtil.getAllDetailPagesWithUrlName(cms, resource); for (String detailPageUri : detailPages) { String altRfsName = manager.getRfsName(cms, detailPageUri); CmsStaticExportData detailData = new CmsStaticExportData( data.getVfsName(), altRfsName, data.getResource(), data.getParameters()); exportTemplateResource(detailData, cookies); } } catch (CmsException e) { LOG.error(e.getLocalizedMessage(), e); } int status = exportTemplateResource(data, cookies); // write the report if (status == HttpServletResponse.SC_OK) { report.println( org.opencms.report.Messages.get().container(org.opencms.report.Messages.RPT_OK_0), I_CmsReport.FORMAT_OK); } else if (status == HttpServletResponse.SC_NOT_MODIFIED) { report.println( org.opencms.report.Messages.get().container(org.opencms.report.Messages.RPT_SKIPPED_0), I_CmsReport.FORMAT_NOTE); } else if (status == HttpServletResponse.SC_SEE_OTHER) { report.println( org.opencms.report.Messages.get().container(org.opencms.report.Messages.RPT_IGNORED_0), I_CmsReport.FORMAT_NOTE); } else { report.println( org.opencms.report.Messages.get().container( org.opencms.report.Messages.RPT_ARGUMENT_1, new Integer(status)), I_CmsReport.FORMAT_OK); } } catch (IOException e) { report.println(e); } //don't lock up the CPU exclusively - allow other Threads to run as well Thread.yield(); } report.println( Messages.get().container(Messages.RPT_STATICEXPORT_TEMPLATE_RESOURCES_END_0), I_CmsReport.FORMAT_HEADLINE); } /** * @see org.opencms.staticexport.A_CmsStaticExportHandler#getRelatedFilesToPurge(java.lang.String, java.lang.String) */ @Override protected List getRelatedFilesToPurge(String exportFileName, String vfsName) { return Collections.emptyList(); } /** * Creates a list of {@link org.opencms.db.CmsPublishedResource} objects containing all related resources of the VFS tree.

* * If the static export has been triggered by the OpenCms workplace, publishedResources is null and all resources in the VFS tree are returned.

* If really an after publish static export is triggered, then only the related resources are returned.

* * @param cms the current cms object * @param publishedResources the list of published resources * * @return list of CmsPulishedResource objects containing all resources of the VFS tree * * @throws CmsException in case of errors accessing the VFS */ protected List getRelatedResources( CmsObject cms, List publishedResources) throws CmsException { String storedSiteRoot = cms.getRequestContext().getSiteRoot(); try { // switch to root site cms.getRequestContext().setSiteRoot("/"); if (publishedResources == null) { // full static export return getAllResources(cms); } else { // after publish export Map resourceMap = new HashMap(); Iterator itPubRes = publishedResources.iterator(); while (itPubRes.hasNext()) { CmsPublishedResource pubResource = itPubRes.next(); // check the internal flag if the resource does still exist // we cannot export with an internal flag if (cms.existsResource(pubResource.getRootPath())) { CmsResource vfsResource = cms.readResource(pubResource.getRootPath()); if (!vfsResource.isInternal()) { // add only if not internal // additionally, add all siblings of the resource Iterator itSiblings = getSiblings(cms, pubResource).iterator(); while (itSiblings.hasNext()) { CmsPublishedResource sibling = itSiblings.next(); resourceMap.put(sibling.getRootPath(), sibling); } } } else { // the resource does not exist, so add them for deletion in the static export resourceMap.put(pubResource.getRootPath(), pubResource); } boolean match = false; Iterator itExportRules = OpenCms.getStaticExportManager().getExportRules().iterator(); while (itExportRules.hasNext()) { CmsStaticExportExportRule rule = itExportRules.next(); Set relatedResources = rule.getRelatedResources(cms, pubResource); if (relatedResources != null) { Iterator itRelatedRes = relatedResources.iterator(); while (itRelatedRes.hasNext()) { CmsPublishedResource relatedRes = itRelatedRes.next(); resourceMap.put(relatedRes.getRootPath(), relatedRes); } match = true; } } // if one res does not match any rule, then export all files if (!match) { return getAllResources(cms); } } return new ArrayList(resourceMap.values()); } } finally { cms.getRequestContext().setSiteRoot(storedSiteRoot); } } /** * Returns all siblings of the published resource as list of CmsPublishedResource.

* * @param cms the cms object * @param pubResource the published resource * * @return all siblings of the published resource * * @throws CmsException if something goes wrong */ protected Set getSiblings(CmsObject cms, CmsPublishedResource pubResource) throws CmsException { Set siblings = new HashSet(); for (Iterator i = getSiblingsList(cms, pubResource.getRootPath()).iterator(); i.hasNext();) { String sibling = i.next(); siblings.add(new CmsPublishedResource(cms.readResource(sibling))); } return siblings; } /** * Returns all non template resources found in a list of published resources.

* * @param cms the current cms object * @param publishedResources the list of published resources * @param resourcesToExport the list of non-template resources * * @return true if some template resources were found while looping the list of published resources * * @throws CmsException in case of errors accessing the VFS */ protected boolean readNonTemplateResourcesToExport( CmsObject cms, List publishedResources, List resourcesToExport) throws CmsException { CmsStaticExportManager manager = OpenCms.getStaticExportManager(); boolean templatesFound = false; // loop through all resources Iterator i = publishedResources.iterator(); while (i.hasNext()) { CmsPublishedResource pubRes = i.next(); String vfsName = pubRes.getRootPath(); // only process this resource, if it is within the tree of allowed folders for static export if (manager.getExportFolderMatcher().match(vfsName)) { // get the export data object, if null is returned, this resource cannot be exported CmsStaticExportData exportData = manager.getVfsExportData(cms, vfsName); if (exportData != null) { CmsResource resource = null; if (pubRes.isFile()) { resource = exportData.getResource(); } else { // the resource is a folder, check if PROPERTY_DEFAULT_FILE is set on folder try { resource = cms.readDefaultFile(vfsName); // String defaultFileName = cms.readPropertyObject( // vfsName, // CmsPropertyDefinition.PROPERTY_DEFAULT_FILE, // false).getValue(); // if (defaultFileName != null) { // resource = cms.readResource(vfsName + defaultFileName); // } } catch (CmsException e) { // resource is (still) a folder, check default files specified in configuration for (int j = 0; j < OpenCms.getDefaultFiles().size(); j++) { String tmpResourceName = vfsName + OpenCms.getDefaultFiles().get(j); try { resource = cms.readResource(tmpResourceName); break; } catch (CmsException e1) { // ignore all other exceptions and continue the lookup process } } } } if ((resource != null) && resource.isFile()) { // check loader for current resource if it must be processed before exported I_CmsResourceLoader loader = OpenCms.getResourceManager().getLoader(resource); if (!loader.isStaticExportProcessable()) { // this resource must not be processed, so export it (if it's not marked as deleted) if (!pubRes.getState().isDeleted()) { // mark the resource for export to the real file system resourcesToExport.add(exportData); } } else { // the resource is a template resource or a folder, so store the name of it in the DB for further use templatesFound = true; cms.writeStaticExportPublishedResource( exportData.getRfsName(), CmsStaticExportManager.EXPORT_LINK_WITHOUT_PARAMETER, "", System.currentTimeMillis()); } } } } } return templatesFound; } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy