View Javadoc

1   /*
2    * Copyright (c) 2002-2012, the original author or authors.
3    *
4    * This software is distributable under the BSD license. See the terms of the
5    * BSD license in the documentation provided with this software.
6    *
7    * http://www.opensource.org/licenses/bsd-license.php
8    */
9   package jline.console.history;
10  
11  import java.io.BufferedOutputStream;
12  import java.io.BufferedReader;
13  import java.io.File;
14  import java.io.FileOutputStream;
15  import java.io.FileReader;
16  import java.io.Flushable;
17  import java.io.IOException;
18  import java.io.InputStream;
19  import java.io.InputStreamReader;
20  import java.io.PrintStream;
21  import java.io.Reader;
22  
23  import jline.internal.Log;
24  
25  import static jline.internal.Preconditions.checkNotNull;
26  
27  /**
28   * {@link History} using a file for persistent backing.
29   * <p/>
30   * Implementers should install shutdown hook to call {@link FileHistory#flush}
31   * to save history to disk.
32   *
33   * @author <a href="mailto:jason@planet57.com">Jason Dillon</a>
34   * @since 2.0
35   */
36  public class FileHistory
37      extends MemoryHistory
38      implements PersistentHistory, Flushable
39  {
40      private final File file;
41  
42      public FileHistory(final File file) throws IOException {
43          this.file = checkNotNull(file);
44          load(file);
45      }
46  
47      public File getFile() {
48          return file;
49      }
50  
51      public void load(final File file) throws IOException {
52          checkNotNull(file);
53          if (file.exists()) {
54              Log.trace("Loading history from: ", file);
55              load(new FileReader(file));
56          }
57      }
58  
59      public void load(final InputStream input) throws IOException {
60          checkNotNull(input);
61          load(new InputStreamReader(input));
62      }
63  
64      public void load(final Reader reader) throws IOException {
65          checkNotNull(reader);
66          BufferedReader input = new BufferedReader(reader);
67  
68          String item;
69          while ((item = input.readLine()) != null) {
70              internalAdd(item);
71          }
72      }
73  
74      public void flush() throws IOException {
75          Log.trace("Flushing history");
76  
77          if (!file.exists()) {
78              File dir = file.getParentFile();
79              if (!dir.exists() && !dir.mkdirs()) {
80                  Log.warn("Failed to create directory: ", dir);
81              }
82              if (!file.createNewFile()) {
83                  Log.warn("Failed to create file: ", file);
84              }
85          }
86  
87          PrintStream out = new PrintStream(new BufferedOutputStream(new FileOutputStream(file)));
88          try {
89              for (Entry entry : this) {
90                  out.println(entry.value());
91              }
92          }
93          finally {
94              out.close();
95          }
96      }
97  
98      public void purge() throws IOException {
99          Log.trace("Purging history");
100 
101         clear();
102 
103         if (!file.delete()) {
104             Log.warn("Failed to delete history file: ", file);
105         }
106     }
107 }