View Javadoc

1   /***
2    * Copyright (c) 2003, 2004, Chess iT
3    * All rights reserved.
4    *
5    * Redistribution and use in source and binary forms, with or without modification,
6    * are permitted provided that the following conditions are met:
7    * 
8    * - Redistributions of source code must retain the above copyright notice, this
9    *   list of conditions and the following disclaimer.
10   *
11   * - Redistributions in binary form must reproduce the above copyright notice,
12   *   this list of conditions and the following disclaimer in the documentation
13   *   and/or other materials provided with the distribution.
14   *
15   * - Neither the name of Chess iT, nor the names of its contributors may be used 
16   *   to endorse or promote products derived from this software without specific
17   *   prior written permission.
18   *
19   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
20   * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
21   * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
22   * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 
23   * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 
24   * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 
25   * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
26   * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
27   * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
28   * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
29   * POSSIBILITY OF SUCH DAMAGE.
30   * 
31   */
32  package nl.chess.it.util.config;
33  
34  import java.io.File;
35  import java.io.IOException;
36  import java.net.MalformedURLException;
37  import java.net.URL;
38  
39  /***
40   * @author Guus Bosman (Chess-iT)
41   */
42  public class FileParser {
43  
44      public File getExistingReadableFile(String key, String value) {
45          value = getFileName(key, value);
46          File file = new File(value);
47          if (!file.exists()) {
48              throw new InvalidPropertyException(key, value, "existing file (doesn't exist)");
49          }
50          if (!file.canRead()) {
51              throw new InvalidPropertyException(key, value, "readable file (can't read)");
52          }
53          return file;
54      }
55  
56      /***
57       * <p>
58       * Returns a writable, existing File with the given name.
59       * </p>
60       * <b>Experimental </b>. Does not support names with whitespace in it.
61       * 
62       * @param key
63       * @return
64       */
65      public File getWriteableFile(String key, String value) {
66  
67          value = getFileName(key, value);
68          File file = new File(value);
69          try {
70  
71              if (!file.exists()) {
72                  /***
73                   * Try to create the file, including the directories leading to it.
74                   */
75                  File parentFile = file.getParentFile();
76                  if (parentFile != null && (!parentFile.exists())) {
77                      if (!parentFile.mkdirs()) {
78                          throw new InvalidPropertyException(key, value, "writeable file (can't create directories '"
79                                  + parentFile + "')");
80                      }
81                  }
82                  if (!file.createNewFile()) {
83                      throw new InvalidPropertyException(key, value, "writeable file (can't create)");
84                  }
85              }
86              if (!file.canWrite()) {
87                  throw new InvalidPropertyException(key, value, "writeable file (can't write)");
88              }
89              return file;
90          } catch (IOException e) {
91              throw new InvalidPropertyException(key, value, "writeable file (I/O exception)");
92          }
93  
94      }
95  
96      protected String getFileName(String key, String value) {
97          if (containsStrangeWhiteSpace(value)) {
98              throw new InvalidPropertyException(key, value, "writeable file (strange whitespace in name; wrong slashes used?)");
99          }
100         try {
101             URL url = new URL(value);
102             value = url.getFile().toString();
103         } catch (MalformedURLException e1) {
104             // okay, not an URL. Let's continue and assume it's a local file reference.
105 
106         }
107         return value;
108     }
109 
110     /***
111      * Whether or not the filename contains whitespace that is not usuable for filenames (on most
112      * operating systems). These are: tab (\t) and newline (\n).
113      * 
114      * @param fileName
115      * @return
116      */
117     private boolean containsStrangeWhiteSpace(String fileName) {
118         char[] cs = fileName.toCharArray();
119         for (int i = 0; i < cs.length; i++) {
120             if ("\t\n".indexOf(cs[i]) >= 0) {
121                 return true;
122             }
123         }
124         return false;
125     }
126 }