1 /* 2 * Copyright (c) 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.*; 29 import java.nio.file.spi.FileSystemProvider; 30 import java.io.IOException; 31 import java.util.Map; 32 33 /** 34 * Base implementation class of FileSystemProvider 35 */ 36 37 abstract class AbstractFileSystemProvider extends FileSystemProvider { AbstractFileSystemProvider()38 protected AbstractFileSystemProvider() { } 39 40 /** 41 * Splits the given attribute name into the name of an attribute view and 42 * the attribute. If the attribute view is not identified then it assumed 43 * to be "basic". 44 */ split(String attribute)45 private static String[] split(String attribute) { 46 String[] s = new String[2]; 47 int pos = attribute.indexOf(':'); 48 if (pos == -1) { 49 s[0] = "basic"; 50 s[1] = attribute; 51 } else { 52 s[0] = attribute.substring(0, pos++); 53 s[1] = (pos == attribute.length()) ? "" : attribute.substring(pos); 54 } 55 return s; 56 } 57 58 /** 59 * Gets a DynamicFileAttributeView by name. Returns {@code null} if the 60 * view is not available. 61 */ getFileAttributeView(Path file, String name, LinkOption... options)62 abstract DynamicFileAttributeView getFileAttributeView(Path file, 63 String name, 64 LinkOption... options); 65 66 @Override setAttribute(Path file, String attribute, Object value, LinkOption... options)67 public final void setAttribute(Path file, 68 String attribute, 69 Object value, 70 LinkOption... options) 71 throws IOException 72 { 73 String[] s = split(attribute); 74 if (s[0].length() == 0) 75 throw new IllegalArgumentException(attribute); 76 DynamicFileAttributeView view = getFileAttributeView(file, s[0], options); 77 if (view == null) 78 throw new UnsupportedOperationException("View '" + s[0] + "' not available"); 79 view.setAttribute(s[1], value); 80 } 81 82 @Override readAttributes(Path file, String attributes, LinkOption... options)83 public final Map<String,Object> readAttributes(Path file, String attributes, LinkOption... options) 84 throws IOException 85 { 86 String[] s = split(attributes); 87 if (s[0].length() == 0) 88 throw new IllegalArgumentException(attributes); 89 DynamicFileAttributeView view = getFileAttributeView(file, s[0], options); 90 if (view == null) 91 throw new UnsupportedOperationException("View '" + s[0] + "' not available"); 92 return view.readAttributes(s[1].split(",")); 93 } 94 95 /** 96 * Deletes a file. The {@code failIfNotExists} parameters determines if an 97 * {@code IOException} is thrown when the file does not exist. 98 */ implDelete(Path file, boolean failIfNotExists)99 abstract boolean implDelete(Path file, boolean failIfNotExists) throws IOException; 100 101 @Override delete(Path file)102 public final void delete(Path file) throws IOException { 103 implDelete(file, true); 104 } 105 106 @Override deleteIfExists(Path file)107 public final boolean deleteIfExists(Path file) throws IOException { 108 return implDelete(file, false); 109 } 110 } 111