diff --git a/src/main/java/org/codelibs/fess/exception/JobProcessingException.java b/src/main/java/org/codelibs/fess/exception/JobProcessingException.java new file mode 100644 index 000000000..a7f5d3985 --- /dev/null +++ b/src/main/java/org/codelibs/fess/exception/JobProcessingException.java @@ -0,0 +1,11 @@ +package org.codelibs.fess.exception; + +public class JobProcessingException extends FessSystemException { + + private static final long serialVersionUID = 1L; + + public JobProcessingException(Throwable e) { + super(e); + } + +} diff --git a/src/main/java/org/codelibs/fess/job/PurgeThumbnailJob.java b/src/main/java/org/codelibs/fess/job/PurgeThumbnailJob.java new file mode 100644 index 000000000..755058017 --- /dev/null +++ b/src/main/java/org/codelibs/fess/job/PurgeThumbnailJob.java @@ -0,0 +1,30 @@ +package org.codelibs.fess.job; + +import org.codelibs.fess.util.ComponentUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class PurgeThumbnailJob { + private static final Logger logger = LoggerFactory.getLogger(PurgeThumbnailJob.class); + + private long expiry; + + public String execute() { + try { + final long count = ComponentUtil.getThumbnailManager().purge(getExpiry()); + return "Deleted " + count + " thumbnail files."; + } catch (final Exception e) { + logger.error("Failed to purge user info.", e); + return e.getMessage(); + } + } + + public long getExpiry() { + return expiry; + } + + public PurgeThumbnailJob expiry(long expiry) { + this.expiry = expiry; + return this; + } +} diff --git a/src/main/java/org/codelibs/fess/thumbnail/ThumbnailManager.java b/src/main/java/org/codelibs/fess/thumbnail/ThumbnailManager.java index 83fae4caa..b817c89c5 100644 --- a/src/main/java/org/codelibs/fess/thumbnail/ThumbnailManager.java +++ b/src/main/java/org/codelibs/fess/thumbnail/ThumbnailManager.java @@ -16,6 +16,12 @@ package org.codelibs.fess.thumbnail; import java.io.File; +import java.io.IOException; +import java.nio.file.FileVisitResult; +import java.nio.file.FileVisitor; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.attribute.BasicFileAttributes; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -33,6 +39,7 @@ import org.codelibs.core.collection.LruHashMap; import org.codelibs.core.lang.StringUtil; import org.codelibs.fess.Constants; import org.codelibs.fess.exception.FessSystemException; +import org.codelibs.fess.exception.JobProcessingException; import org.codelibs.fess.mylasta.direction.FessConfig; import org.codelibs.fess.util.ComponentUtil; import org.codelibs.fess.util.DocumentUtil; @@ -200,6 +207,65 @@ public class ThumbnailManager { } } + public long purge(final long expiry) { + try { + final FilePurgeVisitor visitor = new FilePurgeVisitor(expiry); + Files.walkFileTree(baseDir.toPath(), visitor); + return visitor.getCount(); + } catch (final Exception e) { + throw new JobProcessingException(e); + } + } + + private static class FilePurgeVisitor implements FileVisitor { + + private long expiry; + + private long count; + + FilePurgeVisitor(final long expiry) { + this.expiry = expiry; + } + + public long getCount() { + return count; + } + + @Override + public FileVisitResult preVisitDirectory(final Path dir, final BasicFileAttributes attrs) throws IOException { + return FileVisitResult.CONTINUE; + } + + @Override + public FileVisitResult visitFile(final Path file, final BasicFileAttributes attrs) throws IOException { + if (System.currentTimeMillis() - Files.getLastModifiedTime(file).toMillis() > expiry) { + Files.delete(file); + count++; + } + return FileVisitResult.CONTINUE; + } + + @Override + public FileVisitResult visitFileFailed(final Path file, final IOException e) throws IOException { + if (e != null) { + logger.warn("I/O exception on " + file, e); + } + return FileVisitResult.CONTINUE; + } + + @Override + public FileVisitResult postVisitDirectory(final Path dir, final IOException e) throws IOException { + if (e != null) { + logger.warn("I/O exception on " + dir, e); + } + if (dir.toFile().list().length == 0) { + Files.delete(dir); + } + return FileVisitResult.CONTINUE; + } + + } + protected static class ThumbnailTask { String url; diff --git a/src/main/java/org/codelibs/fess/util/ComponentUtil.java b/src/main/java/org/codelibs/fess/util/ComponentUtil.java index 9ab685baf..b40e55661 100644 --- a/src/main/java/org/codelibs/fess/util/ComponentUtil.java +++ b/src/main/java/org/codelibs/fess/util/ComponentUtil.java @@ -60,6 +60,7 @@ import org.codelibs.fess.job.JobExecutor; import org.codelibs.fess.ldap.LdapManager; import org.codelibs.fess.mylasta.direction.FessConfig; import org.codelibs.fess.sso.SsoManager; +import org.codelibs.fess.thumbnail.ThumbnailManager; import org.lastaflute.core.message.MessageManager; import org.lastaflute.di.core.SingletonLaContainer; import org.lastaflute.di.core.factory.SingletonLaContainerFactory; @@ -74,6 +75,8 @@ public final class ComponentUtil { private static final Logger logger = LoggerFactory.getLogger(ComponentUtil.class); + private static final String THUMBNAIL_MANAGER = "thumbnailManager"; + private static final String SSO_MANAGER = "ssoManager"; private static final String PERMISSION_HELPER = "permissionHelper"; @@ -369,6 +372,10 @@ public final class ComponentUtil { return getComponent(SSO_MANAGER); } + public static ThumbnailManager getThumbnailManager() { + return getComponent(THUMBNAIL_MANAGER); + } + public static CrawlerClientFactory getCrawlerClientFactory() { return getComponent(CrawlerClientFactory.class); } diff --git a/src/main/resources/fess_indices/.fess_config/scheduled_job.bulk b/src/main/resources/fess_indices/.fess_config/scheduled_job.bulk index fd8ee9555..fe42e1a7d 100644 --- a/src/main/resources/fess_indices/.fess_config/scheduled_job.bulk +++ b/src/main/resources/fess_indices/.fess_config/scheduled_job.bulk @@ -8,3 +8,5 @@ {"name":"Log Purger","target":"all","cronExpression":"0 0 * * *","scriptType":"groovy","scriptData":"return container.getComponent(\"purgeLogJob\").execute();","jobLogging":false,"crawler":false,"available":true,"sortOrder":4,"createdBy":"system","createdTime":0,"updatedBy":"system","updatedTime":0} {"index":{"_index":".fess_config","_type":"scheduled_job","_id":"doc_purger"}} {"name":"Doc Purger","target":"all","cronExpression":"* * * * *","scriptType":"groovy","scriptData":"return container.getComponent(\"purgeDocJob\").execute();","jobLogging":false,"crawler":false,"available":true,"sortOrder":5,"createdBy":"system","createdTime":0,"updatedBy":"system","updatedTime":0} +{"index":{"_index":".fess_config","_type":"scheduled_job","_id":"thumbnail_purger"}} +{"name":"Thumbnail Purger","target":"all","cronExpression":"0 0 * * *","scriptType":"groovy","scriptData":"return container.getComponent(\"purgeThumbnailJob\").expiry(30 * 24 * 60 * 60 * 1000).execute();","jobLogging":true,"crawler":false,"available":true,"sortOrder":6,"createdBy":"system","createdTime":0,"updatedBy":"system","updatedTime":0} diff --git a/src/main/resources/fess_job.xml b/src/main/resources/fess_job.xml index 69250538a..01e0d45e1 100644 --- a/src/main/resources/fess_job.xml +++ b/src/main/resources/fess_job.xml @@ -16,4 +16,6 @@ + +