1 /*
2  * Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved.
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * This code is free software; you can redistribute it and/or modify it
6  * under the terms of the GNU General Public License version 2 only, as
7  * published by the Free Software Foundation.  Oracle designates this
8  * particular file as subject to the "Classpath" exception as provided
9  * by Oracle in the LICENSE file that accompanied this code.
10  *
11  * This code is distributed in the hope that it will be useful, but WITHOUT
12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14  * version 2 for more details (a copy is included in the LICENSE file that
15  * accompanied this code).
16  *
17  * You should have received a copy of the GNU General Public License version
18  * 2 along with this work; if not, write to the Free Software Foundation,
19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20  *
21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22  * or visit www.oracle.com if you need additional information or have any
23  * questions.
24  */
25 
26 package sun.nio.fs;
27 
28 import java.nio.file.attribute.*;
29 import java.util.*;
30 import java.io.IOException;
31 
32 /**
33  * Base implementation of BasicFileAttributeView
34  */
35 
36 abstract class AbstractBasicFileAttributeView
37     implements BasicFileAttributeView, DynamicFileAttributeView
38 {
39     private static final String SIZE_NAME = "size";
40     private static final String CREATION_TIME_NAME = "creationTime";
41     private static final String LAST_ACCESS_TIME_NAME = "lastAccessTime";
42     private static final String LAST_MODIFIED_TIME_NAME = "lastModifiedTime";
43     private static final String FILE_KEY_NAME = "fileKey";
44     private static final String IS_DIRECTORY_NAME = "isDirectory";
45     private static final String IS_REGULAR_FILE_NAME = "isRegularFile";
46     private static final String IS_SYMBOLIC_LINK_NAME = "isSymbolicLink";
47     private static final String IS_OTHER_NAME = "isOther";
48 
49     // the names of the basic attributes
50     static final Set<String> basicAttributeNames =
51         Util.newSet(SIZE_NAME,
52                     CREATION_TIME_NAME,
53                     LAST_ACCESS_TIME_NAME,
54                     LAST_MODIFIED_TIME_NAME,
55                     FILE_KEY_NAME,
56                     IS_DIRECTORY_NAME,
57                     IS_REGULAR_FILE_NAME,
58                     IS_SYMBOLIC_LINK_NAME,
59                     IS_OTHER_NAME);
60 
AbstractBasicFileAttributeView()61     protected AbstractBasicFileAttributeView() { }
62 
63     @Override
name()64     public String name() {
65         return "basic";
66     }
67 
68     @Override
setAttribute(String attribute, Object value)69     public void setAttribute(String attribute, Object value)
70         throws IOException
71     {
72         if (attribute.equals(LAST_MODIFIED_TIME_NAME)) {
73             setTimes((FileTime)value, null, null);
74             return;
75         }
76         if (attribute.equals(LAST_ACCESS_TIME_NAME)) {
77             setTimes(null, (FileTime)value, null);
78             return;
79         }
80         if (attribute.equals(CREATION_TIME_NAME)) {
81             setTimes(null, null, (FileTime)value);
82             return;
83         }
84         throw new IllegalArgumentException("'" + name() + ":" +
85             attribute + "' not recognized");
86     }
87 
88     /**
89      * Used to build a map of attribute name/values.
90      */
91     static class AttributesBuilder {
92         private Set<String> names = new HashSet<>();
93         private Map<String,Object> map = new HashMap<>();
94         private boolean copyAll;
95 
AttributesBuilder(Set<String> allowed, String[] requested)96         private AttributesBuilder(Set<String> allowed, String[] requested) {
97             for (String name: requested) {
98                 if (name.equals("*")) {
99                     copyAll = true;
100                 } else {
101                     if (!allowed.contains(name))
102                         throw new IllegalArgumentException("'" + name + "' not recognized");
103                     names.add(name);
104                 }
105             }
106         }
107 
108         /**
109          * Creates builder to build up a map of the matching attributes
110          */
create(Set<String> allowed, String[] requested)111         static AttributesBuilder create(Set<String> allowed, String[] requested) {
112             return new AttributesBuilder(allowed, requested);
113         }
114 
115         /**
116          * Returns true if the attribute should be returned in the map
117          */
match(String name)118         boolean match(String name) {
119             return copyAll || names.contains(name);
120         }
121 
add(String name, Object value)122         void add(String name, Object value) {
123             map.put(name, value);
124         }
125 
126         /**
127          * Returns the map. Discard all references to the AttributesBuilder
128          * after invoking this method.
129          */
unmodifiableMap()130         Map<String,Object> unmodifiableMap() {
131             return Collections.unmodifiableMap(map);
132         }
133     }
134 
135     /**
136      * Invoked by readAttributes or sub-classes to add all matching basic
137      * attributes to the builder
138      */
addRequestedBasicAttributes(BasicFileAttributes attrs, AttributesBuilder builder)139     final void addRequestedBasicAttributes(BasicFileAttributes attrs,
140                                            AttributesBuilder builder)
141     {
142         if (builder.match(SIZE_NAME))
143             builder.add(SIZE_NAME, attrs.size());
144         if (builder.match(CREATION_TIME_NAME))
145             builder.add(CREATION_TIME_NAME, attrs.creationTime());
146         if (builder.match(LAST_ACCESS_TIME_NAME))
147             builder.add(LAST_ACCESS_TIME_NAME, attrs.lastAccessTime());
148         if (builder.match(LAST_MODIFIED_TIME_NAME))
149             builder.add(LAST_MODIFIED_TIME_NAME, attrs.lastModifiedTime());
150         if (builder.match(FILE_KEY_NAME))
151             builder.add(FILE_KEY_NAME, attrs.fileKey());
152         if (builder.match(IS_DIRECTORY_NAME))
153             builder.add(IS_DIRECTORY_NAME, attrs.isDirectory());
154         if (builder.match(IS_REGULAR_FILE_NAME))
155             builder.add(IS_REGULAR_FILE_NAME, attrs.isRegularFile());
156         if (builder.match(IS_SYMBOLIC_LINK_NAME))
157             builder.add(IS_SYMBOLIC_LINK_NAME, attrs.isSymbolicLink());
158         if (builder.match(IS_OTHER_NAME))
159             builder.add(IS_OTHER_NAME, attrs.isOther());
160     }
161 
162     @Override
readAttributes(String[] requested)163     public Map<String,Object> readAttributes(String[] requested)
164         throws IOException
165     {
166         AttributesBuilder builder =
167             AttributesBuilder.create(basicAttributeNames, requested);
168         addRequestedBasicAttributes(readAttributes(), builder);
169         return builder.unmodifiableMap();
170     }
171 }
172