1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* Licensed to the Apache Software Foundation (ASF) under one or more
2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * contributor license agreements.  See the NOTICE file distributed with
3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * this work for additional information regarding copyright ownership.
4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The ASF licenses this file to You under the Apache License, Version 2.0
5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * (the "License"); you may not use this file except in compliance with
6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the License.  You may obtain a copy of the License at
7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *     http://www.apache.org/licenses/LICENSE-2.0
9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * See the License for the specific language governing permissions and
14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * limitations under the License.
15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpackage org.apache.harmony.nio.internal;
18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.io.IOException;
20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.nio.channels.ClosedChannelException;
21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.nio.channels.FileChannel;
22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.nio.channels.FileLock;
23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
24d2510429e70ab91a04c67d5ca39b30f354eba221Jesse Wilson/**
25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The concrete implementation of an NIO file lock object.
26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectfinal class FileLockImpl extends FileLock {
28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    // Remembers if this lock has been released via the API.
30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private boolean isReleased = false;
31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
32d2510429e70ab91a04c67d5ca39b30f354eba221Jesse Wilson    /**
33d2510429e70ab91a04c67d5ca39b30f354eba221Jesse Wilson     * Answers a new file lock object with the given parameters.
34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
35d2510429e70ab91a04c67d5ca39b30f354eba221Jesse Wilson     * @param channel
36d2510429e70ab91a04c67d5ca39b30f354eba221Jesse Wilson     *            the file channel hosting the lock.
37d2510429e70ab91a04c67d5ca39b30f354eba221Jesse Wilson     * @param position
38d2510429e70ab91a04c67d5ca39b30f354eba221Jesse Wilson     *            the start position of the lock, in bytes
39d2510429e70ab91a04c67d5ca39b30f354eba221Jesse Wilson     * @param size
40d2510429e70ab91a04c67d5ca39b30f354eba221Jesse Wilson     *            the length of the lock, in bytes
41d2510429e70ab91a04c67d5ca39b30f354eba221Jesse Wilson     * @param shared
42d2510429e70ab91a04c67d5ca39b30f354eba221Jesse Wilson     *            whether this lock is shared (true) or exclusive (false)
43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public FileLockImpl(FileChannel channel, long position, long size,
45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            boolean shared) {
46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        super(channel, position, size, shared);
47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
49d2510429e70ab91a04c67d5ca39b30f354eba221Jesse Wilson    /**
50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Tests to see if the lock is valid. A lock can be invalidated if the
51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * channel it is acquired on is closed or if it is released. (non-Javadoc)
52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @see java.nio.channels.FileLock#isValid()
54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
55d2510429e70ab91a04c67d5ca39b30f354eba221Jesse Wilson    @Override
56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public boolean isValid() {
57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return !isReleased && channel().isOpen();
58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
60d2510429e70ab91a04c67d5ca39b30f354eba221Jesse Wilson    /**
61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Releases the file lock on the channel that acquired it. Releasing an
62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * invalid lock has no effect.
63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @see java.nio.channels.FileLock#release()
65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
66d2510429e70ab91a04c67d5ca39b30f354eba221Jesse Wilson    @Override
67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void release() throws IOException {
68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (!channel().isOpen()) {
69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new ClosedChannelException();
70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (!isReleased) {
73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            ((FileChannelImpl) channel()).release(this);
74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            isReleased = true;
75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
78