a_cmsstaticexporthandler.java
来自「找了很久才找到到源代码」· Java 代码 · 共 444 行 · 第 1/2 页
JAVA
444 行
}
}
// add index.html to folder name
rfsName += CmsStaticExportManager.EXPORT_DEFAULT_FILE;
if (LOG.isDebugEnabled()) {
LOG.debug(Messages.get().getBundle().key(Messages.LOG_FOLDER_1, rfsName));
}
}
String rfsExportFileName = CmsFileUtil.normalizePath(OpenCms.getStaticExportManager().getExportPath(
vfsName)
+ rfsName.substring(OpenCms.getStaticExportManager().getRfsPrefix(vfsName).length()));
purgeFile(rfsExportFileName, vfsName);
scrubedFiles.add(rfsName);
List fileList = getRelatedFilesToPurge(rfsExportFileName, vfsName);
Iterator iter = fileList.iterator();
while (iter.hasNext()) {
File file = (File)iter.next();
purgeFile(file.getAbsolutePath(), vfsName);
rfsName = CmsFileUtil.normalizePath(OpenCms.getStaticExportManager().getRfsPrefix(vfsName)
+ "/"
+ file.getAbsolutePath().substring(
OpenCms.getStaticExportManager().getExportPath(vfsName).length()));
rfsName = CmsStringUtil.substitute(rfsName, new String(new char[] {File.separatorChar}), "/");
scrubedFiles.add(rfsName);
}
}
}
}
return publishedResources;
}
/**
* Add the link sources of moved resources to the list of published resources.<p>
*
* @param cms the cms context
* @param publishedResources the published resources
*
* @return the list of published resources included the link sources of moved resources
*/
protected List addMovedLinkSources(CmsObject cms, List publishedResources) {
publishedResources = new ArrayList(publishedResources);
Set pubResources = new HashSet(publishedResources.size());
// this is needed since the CmsPublishedResource#equals(Object) method just compares ids and not paths
// and with moved files you have 2 entries with the same id and different paths...
Iterator itPubRes = publishedResources.iterator();
while (itPubRes.hasNext()) {
CmsPublishedResource pubRes = (CmsPublishedResource)itPubRes.next();
pubResources.add(pubRes.getRootPath());
}
boolean modified = true;
// until no more resources are added
while (modified) {
modified = false;
Iterator itPrePubRes = new ArrayList(publishedResources).iterator();
while (itPrePubRes.hasNext()) {
CmsPublishedResource res = (CmsPublishedResource)itPrePubRes.next();
if (res.getMovedState() != CmsPublishedResource.STATE_MOVED_DESTINATION) {
// handle only resources that are destination of move operations
continue;
}
List relations = null;
try {
// get all link sources to this resource
relations = cms.getRelationsForResource(
cms.getRequestContext().removeSiteRoot(res.getRootPath()),
CmsRelationFilter.SOURCES);
} catch (CmsException e) {
// should never happen
if (LOG.isErrorEnabled()) {
LOG.error(e.getLocalizedMessage(), e);
}
}
if (relations == null || relations.isEmpty()) {
// continue with next resource if no link sources found
continue;
}
Iterator itRelations = relations.iterator();
while (itRelations.hasNext()) {
CmsRelation relation = (CmsRelation)itRelations.next();
CmsPublishedResource source = null;
try {
// get the link source
source = new CmsPublishedResource(relation.getSource(cms, CmsResourceFilter.ALL));
} catch (CmsException e) {
// should never happen
if (LOG.isWarnEnabled()) {
LOG.warn(e.getLocalizedMessage());
}
}
if (source == null || pubResources.contains(source.getRootPath())) {
// continue if the link source could not been retrieved or if the list already contains it
continue;
}
// add it, and set the modified flag to give it another round
modified = true;
pubResources.add(source.getRootPath());
publishedResources.add(source);
}
}
}
return publishedResources;
}
/**
* Returns a list of related files to purge.<p>
*
* @param exportFileName the previous exported rfs filename (already purged)
* @param vfsName the vfs name of the resource (to be used to compute more sofisticated sets of related files to purge
*
* @return a list of related files to purge
*/
protected abstract List getRelatedFilesToPurge(String exportFileName, String vfsName);
/**
* Returns a list containing the root paths of all siblings of a resource.<p>
*
* @param cms the export user context
* @param resPath the path of the resource to get the siblings for
* @return a list containing the root paths of all siblings of a resource
*/
protected List getSiblingsList(CmsObject cms, String resPath) {
List siblings = new ArrayList();
try {
List li = cms.readSiblings(resPath, CmsResourceFilter.ALL);
for (int i = 0, l = li.size(); i < l; i++) {
String vfsName = ((CmsResource)li.get(i)).getRootPath();
siblings.add(vfsName);
}
} catch (CmsVfsResourceNotFoundException e) {
// resource not found, probably because the export user has no read permission on the resource, ignore
} catch (CmsSecurityException e) {
// security exception, probably because the export user has no read permission on the resource, ignore
} catch (CmsException e) {
// ignore, nothing to do about this
if (LOG.isWarnEnabled()) {
LOG.warn(Messages.get().getBundle().key(Messages.LOG_FETCHING_SIBLINGS_FAILED_1, resPath), e);
}
}
if (!siblings.contains(resPath)) {
// always add the resource itself, this has to be done because if the resource was
// deleted during publishing, the sibling lookup above will produce no results
siblings.add(resPath);
}
return siblings;
}
/**
* Deletes the given file from the RFS if it exists,
* also deletes all parameter variations of the file.<p>
*
* @param rfsFilePath the path of the RFS file to delete
* @param vfsName the VFS name of the file to delete (required for logging)
*/
protected void purgeFile(String rfsFilePath, String vfsName) {
File rfsFile = new File(rfsFilePath);
// first delete the base file
deleteFile(rfsFile, vfsName);
// now delete the file parameter variations
// get the parent folder
File parent = rfsFile.getParentFile();
if (parent != null) {
// list all files in the parent folder that are variations of the base file
File[] paramVariants = parent.listFiles(new PrefixFileFilter(rfsFile));
if (paramVariants != null) {
for (int v = 0; v < paramVariants.length; v++) {
deleteFile(paramVariants[v], vfsName);
}
}
}
}
/**
* Deletes the given file from the RFS, with error handling and logging.<p>
*
* @param file the file to delete
* @param vfsName the VFS name of the file (required for logging)
*/
private void deleteFile(File file, String vfsName) {
try {
if (file.exists() && file.canWrite()) {
file.delete();
// write log message
if (LOG.isInfoEnabled()) {
LOG.info(Messages.get().getBundle().key(Messages.LOG_FILE_DELETED_1, getRfsName(file, vfsName)));
}
}
} catch (Throwable t) {
// ignore, nothing to do about this
if (LOG.isWarnEnabled()) {
LOG.warn(
Messages.get().getBundle().key(Messages.LOG_FILE_DELETION_FAILED_1, getRfsName(file, vfsName)),
t);
}
}
}
/**
* Returns the export file name starting from the OpenCms webapp folder.<p>
*
* @param file the file to delete
* @param vfsName the VFS name of the file (required for logging)
*
* @return the export file name starting from the OpenCms webapp folder
*/
private String getRfsName(File file, String vfsName) {
String filePath = file.getAbsolutePath();
String result = CmsFileUtil.normalizePath(OpenCms.getStaticExportManager().getRfsPrefix(vfsName)
+ filePath.substring(OpenCms.getStaticExportManager().getExportPath(vfsName).length()));
return CmsStringUtil.substitute(result, new String(new char[] {File.separatorChar}), "/");
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?