aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/vfs/inmemoryfs/InMemoryDirectoryInfo.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/vfs/inmemoryfs/InMemoryDirectoryInfo.java')
-rw-r--r--src/main/java/com/google/devtools/build/lib/vfs/inmemoryfs/InMemoryDirectoryInfo.java108
1 files changed, 108 insertions, 0 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/vfs/inmemoryfs/InMemoryDirectoryInfo.java b/src/main/java/com/google/devtools/build/lib/vfs/inmemoryfs/InMemoryDirectoryInfo.java
new file mode 100644
index 0000000000..400490bbc3
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/vfs/inmemoryfs/InMemoryDirectoryInfo.java
@@ -0,0 +1,108 @@
+// Copyright 2014 Google Inc. All rights reserved.
+//
+// Licensed 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 com.google.devtools.build.lib.vfs.inmemoryfs;
+
+import com.google.common.collect.MapMaker;
+import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe;
+import com.google.devtools.build.lib.util.Clock;
+
+import java.util.Set;
+import java.util.concurrent.ConcurrentMap;
+
+/**
+ * This class represents a directory stored in an {@link InMemoryFileSystem}.
+ */
+@ThreadSafe
+class InMemoryDirectoryInfo extends InMemoryContentInfo {
+
+ private final ConcurrentMap<String, InMemoryContentInfo> directoryContent =
+ new MapMaker().makeMap();
+
+ InMemoryDirectoryInfo(Clock clock) {
+ this(clock, true);
+ }
+
+ protected InMemoryDirectoryInfo(Clock clock, boolean isMutable) {
+ super(clock, isMutable);
+ if (isMutable) {
+ setExecutable(true);
+ }
+ }
+
+ /**
+ * Adds a new child to this directory under the name "name". Callers must
+ * ensure that no entry of that name exists already.
+ */
+ synchronized void addChild(String name, InMemoryContentInfo inode) {
+ if (name == null) { throw new NullPointerException(); }
+ if (inode == null) { throw new NullPointerException(); }
+ if (directoryContent.put(name, inode) != null) {
+ throw new IllegalArgumentException("File already exists: " + name);
+ }
+ markModificationTime();
+ }
+
+ /**
+ * Does a directory lookup, and returns the "inode" for the specified name.
+ * Returns null if the child is not found.
+ */
+ synchronized InMemoryContentInfo getChild(String name) {
+ return directoryContent.get(name);
+ }
+
+ /**
+ * Removes a previously existing child from the directory specified by this
+ * object.
+ */
+ synchronized void removeChild(String name) {
+ if (directoryContent.remove(name) == null) {
+ throw new IllegalArgumentException(name + " is not a member of this directory");
+ }
+ markModificationTime();
+ }
+
+ /**
+ * This function returns the content of a directory. For now, it returns a set
+ * to reflect the semantics of the value returned (ie. unordered, no
+ * duplicates). If thats too slow, it should be changed later.
+ */
+ Set<String> getAllChildren() {
+ return directoryContent.keySet();
+ }
+
+ @Override
+ public boolean isDirectory() {
+ return true;
+ }
+
+ @Override
+ public boolean isSymbolicLink() {
+ return false;
+ }
+
+ @Override
+ public boolean isFile() {
+ return false;
+ }
+
+ /**
+ * In the InMemory hierarchy, the getSize on a directory always returns the
+ * number of children in the directory.
+ */
+ @Override
+ public long getSize() {
+ return directoryContent.size();
+ }
+
+}