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
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 }