• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2013 Google Inc.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *     http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.google.common.jimfs;
18 
19 import com.google.common.collect.ImmutableMap;
20 import com.google.common.collect.ImmutableSet;
21 import java.io.IOException;
22 import java.nio.file.attribute.BasicFileAttributeView;
23 import java.nio.file.attribute.BasicFileAttributes;
24 import java.nio.file.attribute.FileAttributeView;
25 import java.nio.file.attribute.FileTime;
26 import org.checkerframework.checker.nullness.compatqual.NullableDecl;
27 
28 /**
29  * Attribute provider that provides attributes common to all file systems, the {@link
30  * BasicFileAttributeView} ("basic" or no view prefix), and allows the reading of {@link
31  * BasicFileAttributes}.
32  *
33  * @author Colin Decker
34  */
35 final class BasicAttributeProvider extends AttributeProvider {
36 
37   private static final ImmutableSet<String> ATTRIBUTES =
38       ImmutableSet.of(
39           "size",
40           "fileKey",
41           "isDirectory",
42           "isRegularFile",
43           "isSymbolicLink",
44           "isOther",
45           "creationTime",
46           "lastAccessTime",
47           "lastModifiedTime");
48 
49   @Override
name()50   public String name() {
51     return "basic";
52   }
53 
54   @Override
fixedAttributes()55   public ImmutableSet<String> fixedAttributes() {
56     return ATTRIBUTES;
57   }
58 
59   @Override
get(File file, String attribute)60   public Object get(File file, String attribute) {
61     switch (attribute) {
62       case "size":
63         return file.size();
64       case "fileKey":
65         return file.id();
66       case "isDirectory":
67         return file.isDirectory();
68       case "isRegularFile":
69         return file.isRegularFile();
70       case "isSymbolicLink":
71         return file.isSymbolicLink();
72       case "isOther":
73         return !file.isDirectory() && !file.isRegularFile() && !file.isSymbolicLink();
74       case "creationTime":
75         return FileTime.fromMillis(file.getCreationTime());
76       case "lastAccessTime":
77         return FileTime.fromMillis(file.getLastAccessTime());
78       case "lastModifiedTime":
79         return FileTime.fromMillis(file.getLastModifiedTime());
80       default:
81         return null;
82     }
83   }
84 
85   @Override
set(File file, String view, String attribute, Object value, boolean create)86   public void set(File file, String view, String attribute, Object value, boolean create) {
87     switch (attribute) {
88       case "creationTime":
89         checkNotCreate(view, attribute, create);
90         file.setCreationTime(checkType(view, attribute, value, FileTime.class).toMillis());
91         break;
92       case "lastAccessTime":
93         checkNotCreate(view, attribute, create);
94         file.setLastAccessTime(checkType(view, attribute, value, FileTime.class).toMillis());
95         break;
96       case "lastModifiedTime":
97         checkNotCreate(view, attribute, create);
98         file.setLastModifiedTime(checkType(view, attribute, value, FileTime.class).toMillis());
99         break;
100       case "size":
101       case "fileKey":
102       case "isDirectory":
103       case "isRegularFile":
104       case "isSymbolicLink":
105       case "isOther":
106         throw unsettable(view, attribute, create);
107       default:
108     }
109   }
110 
111   @Override
viewType()112   public Class<BasicFileAttributeView> viewType() {
113     return BasicFileAttributeView.class;
114   }
115 
116   @Override
view( FileLookup lookup, ImmutableMap<String, FileAttributeView> inheritedViews)117   public BasicFileAttributeView view(
118       FileLookup lookup, ImmutableMap<String, FileAttributeView> inheritedViews) {
119     return new View(lookup);
120   }
121 
122   @Override
attributesType()123   public Class<BasicFileAttributes> attributesType() {
124     return BasicFileAttributes.class;
125   }
126 
127   @Override
readAttributes(File file)128   public BasicFileAttributes readAttributes(File file) {
129     return new Attributes(file);
130   }
131 
132   /** Implementation of {@link BasicFileAttributeView}. */
133   private static final class View extends AbstractAttributeView implements BasicFileAttributeView {
134 
View(FileLookup lookup)135     protected View(FileLookup lookup) {
136       super(lookup);
137     }
138 
139     @Override
name()140     public String name() {
141       return "basic";
142     }
143 
144     @Override
readAttributes()145     public BasicFileAttributes readAttributes() throws IOException {
146       return new Attributes(lookupFile());
147     }
148 
149     @Override
setTimes( @ullableDecl FileTime lastModifiedTime, @NullableDecl FileTime lastAccessTime, @NullableDecl FileTime createTime)150     public void setTimes(
151         @NullableDecl FileTime lastModifiedTime,
152         @NullableDecl FileTime lastAccessTime,
153         @NullableDecl FileTime createTime)
154         throws IOException {
155       File file = lookupFile();
156 
157       if (lastModifiedTime != null) {
158         file.setLastModifiedTime(lastModifiedTime.toMillis());
159       }
160 
161       if (lastAccessTime != null) {
162         file.setLastAccessTime(lastAccessTime.toMillis());
163       }
164 
165       if (createTime != null) {
166         file.setCreationTime(createTime.toMillis());
167       }
168     }
169   }
170 
171   /** Implementation of {@link BasicFileAttributes}. */
172   static class Attributes implements BasicFileAttributes {
173 
174     private final FileTime lastModifiedTime;
175     private final FileTime lastAccessTime;
176     private final FileTime creationTime;
177     private final boolean regularFile;
178     private final boolean directory;
179     private final boolean symbolicLink;
180     private final long size;
181     private final Object fileKey;
182 
Attributes(File file)183     protected Attributes(File file) {
184       this.lastModifiedTime = FileTime.fromMillis(file.getLastModifiedTime());
185       this.lastAccessTime = FileTime.fromMillis(file.getLastAccessTime());
186       this.creationTime = FileTime.fromMillis(file.getCreationTime());
187       this.regularFile = file.isRegularFile();
188       this.directory = file.isDirectory();
189       this.symbolicLink = file.isSymbolicLink();
190       this.size = file.size();
191       this.fileKey = file.id();
192     }
193 
194     @Override
lastModifiedTime()195     public FileTime lastModifiedTime() {
196       return lastModifiedTime;
197     }
198 
199     @Override
lastAccessTime()200     public FileTime lastAccessTime() {
201       return lastAccessTime;
202     }
203 
204     @Override
creationTime()205     public FileTime creationTime() {
206       return creationTime;
207     }
208 
209     @Override
isRegularFile()210     public boolean isRegularFile() {
211       return regularFile;
212     }
213 
214     @Override
isDirectory()215     public boolean isDirectory() {
216       return directory;
217     }
218 
219     @Override
isSymbolicLink()220     public boolean isSymbolicLink() {
221       return symbolicLink;
222     }
223 
224     @Override
isOther()225     public boolean isOther() {
226       return false;
227     }
228 
229     @Override
size()230     public long size() {
231       return size;
232     }
233 
234     @Override
fileKey()235     public Object fileKey() {
236       return fileKey;
237     }
238   }
239 }
240