1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 package convwatch;
25 
26 import java.io.File;
27 import java.io.FileFilter;
28 import java.util.StringTokenizer;
29 import helper.OSHelper;
30 
31 import javax.swing.JOptionPane;
32 
33 public class FileHelper
34 {
FileHelper()35     public FileHelper()
36         {
37             // fs = System.getProperty("file.separator");
38 
39 
40             String sOSName = System.getProperty("os.name");
41             String sOSArch = System.getProperty("os.arch");
42             String sOSVersion = System.getProperty("os.version");
43 
44             GlobalLogWriter.get().println(sOSName);
45             GlobalLogWriter.get().println(sOSArch);
46             GlobalLogWriter.get().println(sOSVersion);
47 
48         }
49 
MessageBox(String _sStr)50     public static void MessageBox(String _sStr)
51         {
52             String sVersion = System.getProperty("java.version");
53             String sOSName  = System.getProperty("os.name");
54             JOptionPane.showMessageDialog( null, _sStr, sVersion + " " + sOSName + " Hello World Debugger", JOptionPane.INFORMATION_MESSAGE );
55         }
56 
exists(String _sFile)57     public static boolean exists(String _sFile)
58         {
59             if (_sFile == null) return false;
60 
61             File aFile = new File(_sFile);
62             if (aFile.exists())
63             {
64                 return true;
65             }
66             // This is just nice for DEBUG behaviour
67             // due to the fact this is absolutely context dependency no one should use it.
68             // else
69             // {
70             //     System.out.println("FileHelper:exists() tell this path doesn't exists. Check it. path is:" );
71             //     System.out.println( _sFile );
72             //     System.out.println( aFile.getAbsolutePath() );
73             //     MessageBox("Der JavaProzess wartet auf eine interaktion ihrerseits.");
74             //
75             //     File aFile2 = new File(_sFile);
76             //     if (aFile2.exists())
77             //     {
78             //         System.out.println("Thanks, file exists." );
79             //         return true;
80             //     }
81             // }
82             return false;
83         }
84 
isDir(String _sDir)85     public static boolean isDir(String _sDir)
86         {
87             if (_sDir == null) return false;
88             try
89             {
90                 File aFile = new File(_sDir);
91                 if (aFile.exists() && aFile.isDirectory())
92                 {
93                     return true;
94                 }
95             }
96             catch (NullPointerException e)
97             {
98                 GlobalLogWriter.get().println("Exception caught. FileHelper.isDir('" + _sDir + "')");
99                 e.printStackTrace();
100             }
101             return false;
102         }
103 
getBasename(String _sFilename)104     public static String getBasename(String _sFilename)
105         {
106             if (_sFilename == null) return "";
107             String fs = System.getProperty("file.separator");
108 
109             int nIdx = _sFilename.lastIndexOf(fs);
110             if (nIdx > 0)
111             {
112                 return _sFilename.substring(nIdx + 1);
113             }
114             return _sFilename;
115         }
116 
getNameNoSuffix(String _sFilename)117     public static String getNameNoSuffix(String _sFilename)
118         {
119             if (_sFilename == null) return "";
120             int nIdx = _sFilename.lastIndexOf(".");
121             if (nIdx > 0)
122             {
123                 return _sFilename.substring(0, nIdx);
124             }
125             return _sFilename;
126         }
127 
getSuffix(String _sFilename)128     public static String getSuffix(String _sFilename)
129         {
130             if (_sFilename == null) return "";
131             int nIdx = _sFilename.lastIndexOf(".");
132             if (nIdx > 0)
133             {
134                 return _sFilename.substring(nIdx );
135             }
136             return "";
137         }
138 
getPath(String _sFilename)139     public static String getPath(String _sFilename)
140         {
141             if (_sFilename == null) return "";
142             String fs = System.getProperty("file.separator");
143 
144             int nIdx = _sFilename.lastIndexOf(fs);
145             if (nIdx > 0)
146             {
147                 return _sFilename.substring(0, nIdx);
148             }
149             return "";
150         }
151 
152 /*
153     static ArrayList files = new ArrayList();
154     public static Object[] traverse( String afileDirectory )
155         {
156 
157             File fileDirectory = new File(afileDirectory);
158             // Testing, if the file is a directory, and if so, it throws an exception
159             if ( !fileDirectory.isDirectory() )
160             {
161                 throw new IllegalArgumentException( "not a directory: " + fileDirectory.getName() );
162             }
163 
164             // Getting all files and directories in the current directory
165             File[] entries = fileDirectory.listFiles();
166 
167             // Iterating for each file and directory
168             for ( int i = 0; i < entries.length; ++i )
169             {
170                 // adding file to List
171                 try
172                 {
173                     // Composing the URL by replacing all backslashs
174                     String stringUrl = "file:///"
175                         + entries[ i ].getAbsolutePath().replace( '\\', '/' );
176                     files.add(stringUrl);
177                 }
178                 catch( Exception exception )
179                 {
180                     exception.printStackTrace();
181                 }
182             }
183             return files.toArray();
184         }
185 */
186 
187     // makeDirectories("", "/tmp/a/b");
188     // creates all directories /tmp/a/b
189     //
makeDirectories(String first, String path)190     public static void makeDirectories(String first, String path)
191         {
192             makeDirectories(first, path, "0777");
193         }
194 
makeDirectories(String first, String path, String _sMode)195     public static void makeDirectories(String first, String path, String _sMode)
196         {
197             String fs = System.getProperty("file.separator");
198             if (path.startsWith(fs + fs)) // starts with UNC Path
199             {
200                 int n = path.indexOf(fs, 2);
201                 n = path.indexOf(fs, n + 1);
202                 first = path.substring(0, n);
203                 path = path.substring(n + 1);
204             }
205 
206             String already_done = null;
207             StringTokenizer path_tokenizer = new StringTokenizer(path,fs,false);
208             already_done = first;
209             while (path_tokenizer.hasMoreTokens())
210             {
211                 String part = path_tokenizer.nextToken();
212                 File new_dir = new File(already_done + File.separatorChar + part);
213                 already_done = new_dir.toString();
214                 // System.out.println(already_done);
215                 //create the directory
216                 new_dir.mkdirs();
217                 if (OSHelper.isUnix() &&
218                     _sMode.length() > 0)
219                 {
220                     try
221                     {
222                         chmod(new_dir, _sMode);
223                     }
224                     catch (java.io.IOException e)
225                     {
226                         GlobalLogWriter.get().println("Exception caught. FileHelper.makeDirectories('" + new_dir.getAbsolutePath() + "')");
227                     }
228                 }
229             }
230             // return;
231         }
232 
chmod(File file, String mode)233     public static void chmod(File file, String mode) throws java.io.IOException
234         {
235             Runtime.getRuntime().exec
236                 (new String[]
237                     {"chmod", mode, file.getAbsolutePath()});
238         }
239 
removeFirstDirectorysAndBasenameFrom(String _sName, String _sRemovePath)240     public static String removeFirstDirectorysAndBasenameFrom(String _sName, String _sRemovePath)
241         {
242             // pre: _sName: /a/b/c/d/e/f.g _sRemovePath /a/b/c
243             // result: d/e
244             String fs = System.getProperty("file.separator");
245 
246             String sBasename = FileHelper.getBasename(_sName);
247             String sSubDirs = "";
248             if (_sName.startsWith(_sRemovePath))
249             {
250                 // if _sName starts with _sRemovePath
251                 int nRemovePathIndex = _sRemovePath.length();
252                 if (! _sRemovePath.endsWith(fs))
253                 {
254                     // add 1 if we not ends with file separator
255                     nRemovePathIndex ++;
256                 }
257                 int nBasenameIndex = _sName.length() - sBasename.length() - 1;
258                 if (nRemovePathIndex < nBasenameIndex)
259                 {
260                     sSubDirs = _sName.substring(nRemovePathIndex, nBasenameIndex);
261                 }
262             }
263             else
264             {
265                 // special case, the _sRemovePath is not part of _sName
266                 sSubDirs = FileHelper.getPath(_sName);
267                 if (sSubDirs.startsWith(fs))
268                 {
269                     // remove leading file separator
270                     sSubDirs = sSubDirs.substring(1);
271                 }
272             }
273 
274             return sSubDirs;
275         }
276 
test_removeFirstDirectorysAndBasenameFrom()277     public static void test_removeFirstDirectorysAndBasenameFrom()
278         {
279             String a = removeFirstDirectorysAndBasenameFrom("/a/b/c/d/e/f.g", "/a/b/c");
280             // assure("", a.equals("d/e"));
281             String b = removeFirstDirectorysAndBasenameFrom("/a/b/c/d/e/f.g", "/a/b/c/");
282             // assure("", b.equals("d/e"));
283             String c = removeFirstDirectorysAndBasenameFrom("/a/b/c/d/e/f.g", "/b/c");
284             // assure("", c.equals("a/b/c/d/e"));
285         }
286 
287 
getSystemPathFromFileURL( String _sFileURL )288     public static String getSystemPathFromFileURL( String _sFileURL )
289     {
290         String sSystemFile = null;
291 
292         if(_sFileURL.startsWith("file:///"))
293         {
294             if (OSHelper.isWindows())
295             {
296                 sSystemFile = _sFileURL.substring(8);
297             }
298             else
299             {
300                 sSystemFile = _sFileURL.substring(7);
301             }
302         }
303         else if (_sFileURL.startsWith("file://"))
304         {
305             sSystemFile = _sFileURL.substring(5);
306         }
307         String fs = System.getProperty("file.separator");
308         if (! fs.equals("/"))
309         {
310             sSystemFile = sSystemFile.replace ('/', fs.toCharArray ()[0]);
311         }
312 // FEATURE FOR UNC NEED!!!
313         return sSystemFile;
314     }
315 
316     private static boolean m_bDebugTextShown = false;
isDebugEnabled()317     public static boolean isDebugEnabled()
318         {
319             boolean bDebug = false;
320             String sTmpPath = util.utils.getUsersTempDir();
321             //util.utils.getUsersTempDir();
322             String fs = System.getProperty("file.separator");
323             String sName = sTmpPath + fs + "DOC_COMPARATOR_DEBUG";
324             File aFile = new File(sName);
325             if (aFile.exists())
326             {
327                 if (m_bDebugTextShown == false)
328                 {
329                     GlobalLogWriter.get().println("Found file: " + sName);
330                     GlobalLogWriter.get().println("Activate debug mode.");
331                     GlobalLogWriter.get().println("If debug mode is no longer necessary, remove the above file.");
332                     m_bDebugTextShown = true;
333                 }
334                 bDebug = true;
335             }
336             return bDebug;
337         }
338 
copy(String _sSource, String _sDestination)339     public static void copy(String _sSource, String _sDestination)
340         {
341             try
342             {
343                 File inputFile = new File(_sSource);
344                 File outputFile = new File(_sDestination);
345 
346                 java.io.FileReader in = new java.io.FileReader(inputFile);
347                 java.io.FileWriter out = new java.io.FileWriter(outputFile);
348                 int c;
349 
350                 while ((c = in.read()) != -1)
351                     out.write(c);
352 
353                 in.close();
354                 out.close();
355             }
356             catch (java.io.IOException e)
357             {
358                 GlobalLogWriter.get().println("Exception caught. FileHelper.copy('" + _sSource + ", " + _sDestination + "')");
359                 GlobalLogWriter.get().println("Message: " + e.getMessage());
360             }
361         }
362 
363     /**
364      * Within the directory run through, it's possible to say which file extension types should not
365      * consider like '*.prn' because it's not a document.
366      *
367      * @return a FileFilter function
368      */
getFileFilter()369     public static FileFilter getFileFilter()
370         {
371             FileFilter aFileFilter = new FileFilter()
372                 {
373                     public boolean accept( File pathname )
374                         {
375                             // leave out files which started by '~$' these are Microsoft Office temp files
376                             if (pathname.getName().startsWith("~$"))
377                             {
378                                 return false;
379                             }
380 
381                             if (pathname.getName().endsWith(".prn"))
382                             {
383                                 return false;
384                             }
385                             // This type of document no one would like to load.
386                             if (pathname.getName().endsWith(".zip"))
387                             {
388                                 return false;
389                             }
390                             // just a hack
391                             if (pathname.getName().endsWith("_"))
392                             {
393                                 return false;
394                             }
395                             return true;
396                         }
397                 };
398             return aFileFilter;
399         }
400 }
401 
402