You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by am...@apache.org on 2016/09/15 04:56:01 UTC
svn commit: r1760825 - in /jackrabbit/trunk:
jackrabbit-aws-ext/src/main/java/org/apache/jackrabbit/aws/ext/ds/
jackrabbit-data/src/main/java/org/apache/jackrabbit/core/data/
jackrabbit-vfs-ext/src/main/java/org/apache/jackrabbit/vfs/ext/ds/
Author: amitj
Date: Thu Sep 15 04:56:00 2016
New Revision: 1760825
URL: http://svn.apache.org/viewvc?rev=1760825&view=rev
Log:
JCR-4018: Consistent Async Upload Executor handling in Backend implementations
Slightly modified patch from Woonsan Ko
Added:
jackrabbit/trunk/jackrabbit-data/src/main/java/org/apache/jackrabbit/core/data/AbstractBackend.java (with props)
Modified:
jackrabbit/trunk/jackrabbit-aws-ext/src/main/java/org/apache/jackrabbit/aws/ext/ds/S3Backend.java
jackrabbit/trunk/jackrabbit-data/src/main/java/org/apache/jackrabbit/core/data/FSBackend.java
jackrabbit/trunk/jackrabbit-vfs-ext/src/main/java/org/apache/jackrabbit/vfs/ext/ds/VFSBackend.java
Modified: jackrabbit/trunk/jackrabbit-aws-ext/src/main/java/org/apache/jackrabbit/aws/ext/ds/S3Backend.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-aws-ext/src/main/java/org/apache/jackrabbit/aws/ext/ds/S3Backend.java?rev=1760825&r1=1760824&r2=1760825&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-aws-ext/src/main/java/org/apache/jackrabbit/aws/ext/ds/S3Backend.java (original)
+++ jackrabbit/trunk/jackrabbit-aws-ext/src/main/java/org/apache/jackrabbit/aws/ext/ds/S3Backend.java Thu Sep 15 04:56:00 2016
@@ -36,11 +36,11 @@ import java.util.concurrent.TimeUnit;
import org.apache.jackrabbit.aws.ext.S3Constants;
import org.apache.jackrabbit.aws.ext.S3RequestDecorator;
import org.apache.jackrabbit.aws.ext.Utils;
+import org.apache.jackrabbit.core.data.AbstractBackend;
import org.apache.jackrabbit.core.data.AsyncTouchCallback;
import org.apache.jackrabbit.core.data.AsyncTouchResult;
import org.apache.jackrabbit.core.data.AsyncUploadCallback;
import org.apache.jackrabbit.core.data.AsyncUploadResult;
-import org.apache.jackrabbit.core.data.Backend;
import org.apache.jackrabbit.core.data.CachingDataStore;
import org.apache.jackrabbit.core.data.DataIdentifier;
import org.apache.jackrabbit.core.data.DataStoreException;
@@ -71,7 +71,7 @@ import com.amazonaws.util.StringUtils;
/**
* A data store backend that stores data on Amazon S3.
*/
-public class S3Backend implements Backend {
+public class S3Backend extends AbstractBackend {
/**
* Logger instance.
@@ -86,13 +86,9 @@ public class S3Backend implements Backen
private TransferManager tmx;
- private CachingDataStore store;
-
private Properties properties;
private Date startTime;
-
- private ThreadPoolExecutor asyncWriteExecuter;
private S3RequestDecorator s3ReqDecorator;
@@ -103,6 +99,7 @@ public class S3Backend implements Backen
@Override
public void init(CachingDataStore store, String homeDir, String config)
throws DataStoreException {
+ super.init(store, homeDir, config);
Properties initProps = null;
//Check is configuration is already provided. That takes precedence
//over config provided via file based config
@@ -132,7 +129,7 @@ public class S3Backend implements Backen
Thread.currentThread().setContextClassLoader(
getClass().getClassLoader());
LOG.debug("init");
- this.store = store;
+ setDataStore(store);
s3ReqDecorator = new S3RequestDecorator(prop);
s3service = Utils.openService(prop);
@@ -184,9 +181,7 @@ public class S3Backend implements Backen
asyncWritePoolSize = Integer.parseInt(maxConnsStr)
- writeThreads;
}
-
- asyncWriteExecuter = (ThreadPoolExecutor) Executors.newFixedThreadPool(
- asyncWritePoolSize, new NamedThreadFactory("s3-write-worker"));
+ setAsyncWritePoolSize(asyncWritePoolSize);
String renameKeyProp = prop.getProperty(S3Constants.S3_RENAME_KEYS);
boolean renameKeyBool = (renameKeyProp == null || "".equals(renameKeyProp))
? false
@@ -226,7 +221,7 @@ public class S3Backend implements Backen
throw new IllegalArgumentException(
"callback parameter cannot be null in asyncUpload");
}
- asyncWriteExecuter.execute(new AsyncUploadJob(identifier, file,
+ getAsyncWriteExecutor().execute(new AsyncUploadJob(identifier, file,
callback));
}
@@ -327,7 +322,7 @@ public class S3Backend implements Backen
Thread.currentThread().setContextClassLoader(
getClass().getClassLoader());
- asyncWriteExecuter.execute(new Runnable() {
+ getAsyncWriteExecutor().execute(new Runnable() {
@Override
public void run() {
try {
@@ -537,13 +532,13 @@ public class S3Backend implements Backen
long lastModified = s3ObjSumm.getLastModified().getTime();
LOG.debug("Identifier [{}]'s lastModified = [{}]", identifier, lastModified);
if (lastModified < min
- && store.confirmDelete(identifier)
+ && getDataStore().confirmDelete(identifier)
// confirm once more that record's lastModified < min
// order is important here
&& s3service.getObjectMetadata(bucket,
s3ObjSumm.getKey()).getLastModified().getTime() < min) {
- store.deleteFromCache(identifier);
+ getDataStore().deleteFromCache(identifier);
LOG.debug("add id [{}] to delete lists",
s3ObjSumm.getKey());
deleteList.add(new DeleteObjectsRequest.KeyVersion(
@@ -584,9 +579,9 @@ public class S3Backend implements Backen
}
@Override
- public void close() {
+ public void close() throws DataStoreException {
+ super.close();
// backend is closing. abort all mulitpart uploads from start.
- asyncWriteExecuter.shutdownNow();
if(s3service.doesBucketExist(bucket)) {
tmx.abortMultipartUploads(bucket, startTime);
}
Added: jackrabbit/trunk/jackrabbit-data/src/main/java/org/apache/jackrabbit/core/data/AbstractBackend.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-data/src/main/java/org/apache/jackrabbit/core/data/AbstractBackend.java?rev=1760825&view=auto
==============================================================================
--- jackrabbit/trunk/jackrabbit-data/src/main/java/org/apache/jackrabbit/core/data/AbstractBackend.java (added)
+++ jackrabbit/trunk/jackrabbit-data/src/main/java/org/apache/jackrabbit/core/data/AbstractBackend.java Thu Sep 15 04:56:00 2016
@@ -0,0 +1,191 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jackrabbit.core.data;
+
+import java.util.concurrent.Executor;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ThreadPoolExecutor;
+
+import org.apache.jackrabbit.core.data.util.NamedThreadFactory;
+
+/**
+ * Abstract Backend which has a reference to the underlying {@link CachingDataStore} and is
+ * maintaining the lifecycle of the internal asynchronous write executor.
+ */
+public abstract class AbstractBackend implements Backend {
+
+ /**
+ * {@link CachingDataStore} instance using this backend.
+ */
+ private CachingDataStore dataStore;
+
+ /**
+ * path of repository home dir.
+ */
+ private String homeDir;
+
+ /**
+ * path of config property file.
+ */
+ private String config;
+
+ /**
+ * The pool size of asynchronous write pooling executor.
+ */
+ private int asyncWritePoolSize = 10;
+
+ /**
+ * Asynchronous write pooling executor.
+ */
+ private volatile Executor asyncWriteExecutor;
+
+ /**
+ * Returns the pool size of the asynchronous write pool executor.
+ * @return the pool size of the asynchronous write pool executor
+ */
+ public int getAsyncWritePoolSize() {
+ return asyncWritePoolSize;
+ }
+
+ /**
+ * Sets the pool size of the asynchronous write pool executor.
+ * @param asyncWritePoolSize pool size of the async write pool executor
+ */
+ public void setAsyncWritePoolSize(int asyncWritePoolSize) {
+ this.asyncWritePoolSize = asyncWritePoolSize;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void init(CachingDataStore dataStore, String homeDir, String config) throws DataStoreException {
+ this.dataStore = dataStore;
+ this.homeDir = homeDir;
+ this.config = config;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void close() throws DataStoreException {
+ Executor asyncExecutor = getAsyncWriteExecutor();
+
+ if (asyncExecutor != null && asyncExecutor instanceof ExecutorService) {
+ ((ExecutorService) asyncExecutor).shutdownNow();
+ }
+ }
+
+ /**
+ * Returns the {@link CachingDataStore} instance using this backend.
+ * @return the {@link CachingDataStore} instance using this backend
+ */
+ protected CachingDataStore getDataStore() {
+ return dataStore;
+ }
+
+ /**
+ * Sets the {@link CachingDataStore} instance using this backend.
+ * @param dataStore the {@link CachingDataStore} instance using this backend
+ */
+ protected void setDataStore(CachingDataStore dataStore) {
+ this.dataStore = dataStore;
+ }
+
+ /**
+ * Returns path of repository home dir.
+ * @return path of repository home dir
+ */
+ protected String getHomeDir() {
+ return homeDir;
+ }
+
+ /**
+ * Sets path of repository home dir.
+ * @param homeDir path of repository home dir
+ */
+ protected void setHomeDir(String homeDir) {
+ this.homeDir = homeDir;
+ }
+
+ /**
+ * Returns path of config property file.
+ * @return path of config property file
+ */
+ protected String getConfig() {
+ return config;
+ }
+
+ /**
+ * Sets path of config property file.
+ * @param config path of config property file
+ */
+ protected void setConfig(String config) {
+ this.config = config;
+ }
+
+ /**
+ * Returns Executor used to execute asynchronous write or touch jobs.
+ * @return Executor used to execute asynchronous write or touch jobs
+ */
+ protected Executor getAsyncWriteExecutor() {
+ Executor executor = asyncWriteExecutor;
+
+ if (executor == null) {
+ synchronized (this) {
+ executor = asyncWriteExecutor;
+ if (executor == null) {
+ asyncWriteExecutor = executor = createAsyncWriteExecutor();
+ }
+ }
+ }
+
+ return executor;
+ }
+
+ /**
+ * Creates an {@link Executor}.
+ * This method is invoked during the initialization for asynchronous write/touch job executions.
+ * @return an {@link Executor}
+ */
+ protected Executor createAsyncWriteExecutor() {
+ Executor asyncExecutor;
+
+ if (dataStore.getAsyncUploadLimit() > 0 && getAsyncWritePoolSize() > 0) {
+ asyncExecutor = (ThreadPoolExecutor) Executors.newFixedThreadPool(getAsyncWritePoolSize(),
+ new NamedThreadFactory(getClass().getSimpleName() + "-write-worker"));
+ } else {
+ asyncExecutor = new ImmediateExecutor();
+ }
+
+ return asyncExecutor;
+ }
+
+ /**
+ * This class implements {@link Executor} interface to run {@code command} right away,
+ * resulting in non-asynchronous mode executions.
+ */
+ private class ImmediateExecutor implements Executor {
+ @Override
+ public void execute(Runnable command) {
+ command.run();
+ }
+ }
+
+}
Propchange: jackrabbit/trunk/jackrabbit-data/src/main/java/org/apache/jackrabbit/core/data/AbstractBackend.java
------------------------------------------------------------------------------
svn:eol-style = native
Modified: jackrabbit/trunk/jackrabbit-data/src/main/java/org/apache/jackrabbit/core/data/FSBackend.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-data/src/main/java/org/apache/jackrabbit/core/data/FSBackend.java?rev=1760825&r1=1760824&r2=1760825&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-data/src/main/java/org/apache/jackrabbit/core/data/FSBackend.java (original)
+++ jackrabbit/trunk/jackrabbit-data/src/main/java/org/apache/jackrabbit/core/data/FSBackend.java Thu Sep 15 04:56:00 2016
@@ -32,33 +32,20 @@ import java.util.Iterator;
import java.util.List;
import java.util.Properties;
import java.util.Set;
-import java.util.concurrent.Executor;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.ThreadPoolExecutor;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
-import org.apache.jackrabbit.core.data.util.NamedThreadFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-public class FSBackend implements Backend {
+public class FSBackend extends AbstractBackend {
private Properties properties;
private String fsPath;
- private CachingDataStore store;
-
- private String homeDir;
-
- private String config;
-
File fsPathDir;
- private Executor asyncWriteExecuter;
-
public static final String FS_BACKEND_PATH = "fsBackendPath";
/**
@@ -74,10 +61,10 @@ public class FSBackend implements Backen
@Override
public void init(CachingDataStore store, String homeDir, String config)
throws DataStoreException {
+ super.init(store, homeDir, config);
Properties initProps = null;
// Check is configuration is already provided. That takes precedence
// over config provided via file based config
- this.config = config;
if (this.properties != null) {
initProps = this.properties;
} else {
@@ -100,12 +87,12 @@ public class FSBackend implements Backen
public void init(CachingDataStore store, String homeDir, Properties prop)
throws DataStoreException {
- this.store = store;
- this.homeDir = homeDir;
+ setDataStore(store);
+ setHomeDir(homeDir);
this.fsPath = prop.getProperty(FS_BACKEND_PATH);
if (this.fsPath == null || "".equals(this.fsPath)) {
throw new DataStoreException("Could not initialize FSBackend from "
- + config + ". [" + FS_BACKEND_PATH + "] property not found.");
+ + getConfig() + ". [" + FS_BACKEND_PATH + "] property not found.");
}
fsPathDir = new File(this.fsPath);
if (fsPathDir.exists() && fsPathDir.isFile()) {
@@ -119,8 +106,6 @@ public class FSBackend implements Backen
+ fsPathDir.getAbsolutePath());
}
}
- asyncWriteExecuter = createAsyncWriteExecutor();
-
}
@Override
@@ -191,7 +176,7 @@ public class FSBackend implements Backen
throw new IllegalArgumentException(
"callback parameter cannot be null in asyncUpload");
}
- asyncWriteExecuter.execute(new Runnable() {
+ getAsyncWriteExecutor().execute(new Runnable() {
@Override
public void run() {
try {
@@ -269,7 +254,7 @@ public class FSBackend implements Backen
Thread.currentThread().setContextClassLoader(
getClass().getClassLoader());
- asyncWriteExecuter.execute(new Runnable() {
+ getAsyncWriteExecutor().execute(new Runnable() {
@Override
public void run() {
try {
@@ -292,15 +277,6 @@ public class FSBackend implements Backen
}
@Override
- public void close() throws DataStoreException {
- Executor asyncExecutor = getAsyncWriteExecutor();
-
- if (asyncExecutor != null && asyncExecutor instanceof ExecutorService) {
- ((ExecutorService) asyncExecutor).shutdownNow();
- }
- }
-
- @Override
public Set<DataIdentifier> deleteAllOlderThan(long min)
throws DataStoreException {
Set<DataIdentifier> deleteIdSet = new HashSet<DataIdentifier>(30);
@@ -337,32 +313,6 @@ public class FSBackend implements Backen
}
/**
- * Creates a {@link Executor}.
- * This method is invoked during the initialization for asynchronous write/touch job executions.
- * @return a {@link Executor}
- */
- protected Executor createAsyncWriteExecutor() {
- Executor asyncExecutor;
-
- if (store.getAsyncUploadLimit() > 0) {
- asyncExecutor = Executors.newFixedThreadPool(10,
- new NamedThreadFactory("fs-write-worker"));
- } else {
- asyncExecutor = new ImmediateExecutor();
- }
-
- return asyncExecutor;
- }
-
- /**
- * Returns ThreadPoolExecutor used to execute asynchronous write or touch jobs.
- * @return ThreadPoolExecutor used to execute asynchronous write or touch jobs
- */
- protected Executor getAsyncWriteExecutor() {
- return asyncWriteExecuter;
- }
-
- /**
* Returns the identified file. This method implements the pattern used to
* avoid problems with too many files in a single directory.
* <p>
@@ -487,8 +437,8 @@ public class FSBackend implements Backen
}
if (lastModified < min) {
DataIdentifier id = new DataIdentifier(file.getName());
- if (store.confirmDelete(id)) {
- store.deleteFromCache(id);
+ if (getDataStore().confirmDelete(id)) {
+ getDataStore().deleteFromCache(id);
if (LOG.isInfoEnabled()) {
LOG.info("Deleting old file "
+ file.getAbsolutePath() + " modified: "
@@ -522,16 +472,4 @@ public class FSBackend implements Backen
}
}
}
-
- /**
- * This class implements {@link Executor} interface to run {@code command} right away,
- * resulting in non-asynchronous mode executions.
- */
- private class ImmediateExecutor implements Executor {
- @Override
- public void execute(Runnable command) {
- command.run();
- }
- }
-
}
Modified: jackrabbit/trunk/jackrabbit-vfs-ext/src/main/java/org/apache/jackrabbit/vfs/ext/ds/VFSBackend.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-vfs-ext/src/main/java/org/apache/jackrabbit/vfs/ext/ds/VFSBackend.java?rev=1760825&r1=1760824&r2=1760825&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-vfs-ext/src/main/java/org/apache/jackrabbit/vfs/ext/ds/VFSBackend.java (original)
+++ jackrabbit/trunk/jackrabbit-vfs-ext/src/main/java/org/apache/jackrabbit/vfs/ext/ds/VFSBackend.java Thu Sep 15 04:56:00 2016
@@ -28,30 +28,27 @@ import java.util.LinkedList;
import java.util.List;
import java.util.Set;
import java.util.concurrent.Executor;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
import org.apache.commons.io.IOUtils;
import org.apache.commons.vfs2.FileObject;
import org.apache.commons.vfs2.FileSystemException;
import org.apache.commons.vfs2.FileType;
+import org.apache.jackrabbit.core.data.AbstractBackend;
import org.apache.jackrabbit.core.data.AsyncTouchCallback;
import org.apache.jackrabbit.core.data.AsyncTouchResult;
import org.apache.jackrabbit.core.data.AsyncUploadCallback;
import org.apache.jackrabbit.core.data.AsyncUploadResult;
-import org.apache.jackrabbit.core.data.Backend;
import org.apache.jackrabbit.core.data.CachingDataStore;
import org.apache.jackrabbit.core.data.DataIdentifier;
import org.apache.jackrabbit.core.data.DataStoreException;
-import org.apache.jackrabbit.core.data.util.NamedThreadFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* A data store backend that stores data on VFS file system.
*/
-public class VFSBackend implements Backend {
+public class VFSBackend extends AbstractBackend {
/**
* Logger instance.
@@ -79,26 +76,11 @@ public class VFSBackend implements Backe
private static final String TOUCH_FILE_NAME_SUFFIX = ".touch";
/**
- * {@link CachingDataStore} instance using this backend.
- */
- private CachingDataStore store;
-
- /**
* VFS base folder object.
*/
private FileObject baseFolder;
/**
- * The pool size of asynchronous write pooling executor.
- */
- private int asyncWritePoolSize = DEFAULT_ASYNC_WRITE_POOL_SIZE;
-
- /**
- * Asynchronous write pooling executor.
- */
- private Executor asyncWriteExecutor;
-
- /**
* Whether or not a touch file is preferred to set/get the last modified timestamp for a file object
* instead of setting/getting the last modified timestamp directly from the file object.
*/
@@ -109,34 +91,16 @@ public class VFSBackend implements Backe
}
/**
- * Returns the pool size of the async write pool executor.
- * @return the pool size of the async write pool executor
- */
- public int getAsyncWritePoolSize() {
- return asyncWritePoolSize;
- }
-
- /**
- * Sets the pool size of the async write pool executor.
- * @param asyncWritePoolSize pool size of the async write pool executor
- */
- public void setAsyncWritePoolSize(int asyncWritePoolSize) {
- this.asyncWritePoolSize = asyncWritePoolSize;
- }
-
- /**
* {@inheritDoc}
*/
@Override
public void init(CachingDataStore store, String homeDir, String config) throws DataStoreException {
- this.store = store;
+ super.init(store, homeDir, config);
// When it's local file system, no need to use a separate touch file.
if ("file".equals(baseFolder.getName().getScheme())) {
touchFilePreferred = false;
}
-
- asyncWriteExecutor = createAsyncWriteExecutor();
}
/**
@@ -281,18 +245,6 @@ public class VFSBackend implements Backe
* {@inheritDoc}
*/
@Override
- public void close() throws DataStoreException {
- Executor asyncExecutor = getAsyncWriteExecutor();
-
- if (asyncExecutor != null && asyncExecutor instanceof ExecutorService) {
- ((ExecutorService) asyncExecutor).shutdownNow();
- }
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
public Set<DataIdentifier> deleteAllOlderThan(long timestamp) throws DataStoreException {
Set<DataIdentifier> deleteIdSet = new HashSet<DataIdentifier>(30);
@@ -456,32 +408,6 @@ public class VFSBackend implements Backe
}
/**
- * Creates a {@link ThreadPoolExecutor}.
- * This method is invoked during the initialization for asynchronous write/touch job executions.
- * @return a {@link ThreadPoolExecutor}
- */
- protected Executor createAsyncWriteExecutor() {
- Executor asyncExecutor;
-
- if (getAsyncWritePoolSize() > 0) {
- asyncExecutor = (ThreadPoolExecutor) Executors.newFixedThreadPool(getAsyncWritePoolSize(),
- new NamedThreadFactory("vfs-write-worker"));
- } else {
- asyncExecutor = new ImmediateExecutor();
- }
-
- return asyncExecutor;
- }
-
- /**
- * Returns ThreadPoolExecutor used to execute asynchronous write or touch jobs.
- * @return ThreadPoolExecutor used to execute asynchronous write or touch jobs
- */
- protected Executor getAsyncWriteExecutor() {
- return asyncWriteExecutor;
- }
-
- /**
* Returns the approximate number of threads that are actively executing asynchronous writing tasks.
* @return the approximate number of threads that are actively executing asynchronous writing tasks
*/
@@ -531,7 +457,6 @@ public class VFSBackend implements Backe
/**
* Set the last modified time of a fileObject, if the fileObject is writable.
* @param fileObject the file object
- * @param time the new last modified date
* @throws DataStoreException if the fileObject is writable but modifying the date fails
*/
private void updateLastModifiedTime(FileObject fileObject) throws DataStoreException {
@@ -550,7 +475,7 @@ public class VFSBackend implements Backe
/**
* Get the last modified time of a file object.
- * @param file the file object
+ * @param fileObject the file object
* @return the last modified date
* @throws DataStoreException if reading fails
*/
@@ -777,8 +702,8 @@ public class VFSBackend implements Backe
if (lastModified < timestamp) {
identifier = new DataIdentifier(fileObject.getName().getBaseName());
- if (store.confirmDelete(identifier)) {
- store.deleteFromCache(identifier);
+ if (getDataStore().confirmDelete(identifier)) {
+ getDataStore().deleteFromCache(identifier);
if (LOG.isInfoEnabled()) {
LOG.info("Deleting old file " + fileObject.getName().getFriendlyURI() + " modified: "
@@ -797,17 +722,6 @@ public class VFSBackend implements Backe
}
}
- /**
- * This class implements {@link Executor} interface to run {@code command} right away,
- * resulting in non-asynchronous mode executions.
- */
- private class ImmediateExecutor implements Executor {
- @Override
- public void execute(Runnable command) {
- command.run();
- }
- }
-
/**
* This class implements {@link Runnable} interface to copy {@link File} to VFS file object asynchronously.
*/