001/**
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements.  See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License.  You may obtain a copy of the License at
008 *
009 *      http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017package org.apache.camel.component.file.strategy;
018
019import java.io.File;
020
021import org.apache.camel.Exchange;
022import org.apache.camel.component.file.GenericFile;
023import org.apache.camel.component.file.GenericFileOperations;
024
025/**
026 * Acquires exclusive read lock to the given file. Will wait until the lock is granted.
027 * After granting the read lock it is released, we just want to make sure that when we start
028 * consuming the file its not currently in progress of being written by third party.
029 * <p/>
030 * This implementation is only supported by the File component, that leverages the {@link MarkerFileExclusiveReadLockStrategy}
031 * as well, to ensure only acquiring locks on files, which is not already in progress by another process,
032 * that have marked this using the marker file.
033 * <p/>
034 * Setting the option {@link #setMarkerFiler(boolean)} to <tt>false</tt> allows to turn off using marker files.
035 */
036public class FileRenameExclusiveReadLockStrategy extends GenericFileRenameExclusiveReadLockStrategy<File> {
037
038    private MarkerFileExclusiveReadLockStrategy marker = new MarkerFileExclusiveReadLockStrategy();
039    private boolean markerFile = true;
040
041    @Override
042    public boolean acquireExclusiveReadLock(GenericFileOperations<File> operations, GenericFile<File> file, Exchange exchange) throws Exception {
043        // must call marker first
044        if (markerFile && !marker.acquireExclusiveReadLock(operations, file, exchange)) {
045            return false;
046        }
047
048        return super.acquireExclusiveReadLock(operations, file, exchange);
049    }
050
051    @Override
052    public void releaseExclusiveReadLockOnAbort(GenericFileOperations<File> operations, GenericFile<File> file, Exchange exchange) throws Exception {
053        // must call marker first
054        try {
055            if (markerFile) {
056                marker.releaseExclusiveReadLockOnAbort(operations, file, exchange);
057            }
058        } finally {
059            super.releaseExclusiveReadLockOnAbort(operations, file, exchange);
060        }
061    }
062
063    @Override
064    public void releaseExclusiveReadLockOnRollback(GenericFileOperations<File> operations, GenericFile<File> file, Exchange exchange) throws Exception {
065        // must call marker first
066        try {
067            if (markerFile) {
068                marker.releaseExclusiveReadLockOnRollback(operations, file, exchange);
069            }
070        } finally {
071            super.releaseExclusiveReadLockOnRollback(operations, file, exchange);
072        }
073    }
074
075    @Override
076    public void releaseExclusiveReadLockOnCommit(GenericFileOperations<File> operations, GenericFile<File> file, Exchange exchange) throws Exception {
077        // must call marker first
078        try {
079            if (markerFile) {
080                marker.releaseExclusiveReadLockOnCommit(operations, file, exchange);
081            }
082        } finally {
083            super.releaseExclusiveReadLockOnCommit(operations, file, exchange);
084        }
085    }
086
087    @Override
088    public void setMarkerFiler(boolean markerFile) {
089        this.markerFile = markerFile;
090    }
091
092}