1   /**
2    * Distribution License:
3    * JSword is free software; you can redistribute it and/or modify it under
4    * the terms of the GNU Lesser General Public License, version 2.1 or later
5    * as published by the Free Software Foundation. This program is distributed
6    * in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
7    * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
8    * See the GNU Lesser General Public License for more details.
9    *
10   * The License is available on the internet at:
11   *      http://www.gnu.org/copyleft/lgpl.html
12   * or by writing to:
13   *      Free Software Foundation, Inc.
14   *      59 Temple Place - Suite 330
15   *      Boston, MA 02111-1307, USA
16   *
17   * © CrossWire Bible Society, 2013 - 2016
18   *
19   */
20  package org.crosswire.jsword.book.sword.state;
21  
22  import java.io.File;
23  import java.io.IOException;
24  import java.io.RandomAccessFile;
25  import java.net.URI;
26  
27  import org.crosswire.common.util.FileUtil;
28  import org.crosswire.common.util.IOUtil;
29  import org.crosswire.common.util.Reporter;
30  import org.crosswire.jsword.JSMsg;
31  import org.crosswire.jsword.book.BookException;
32  import org.crosswire.jsword.book.BookMetaData;
33  import org.crosswire.jsword.book.sword.SwordUtil;
34  import org.slf4j.Logger;
35  import org.slf4j.LoggerFactory;
36  
37  /**
38   * Stores the random access files required for processing the passage request
39   * 
40   * The caller is required to close to correctly free resources and avoid File
41   * pointer leaks
42   * 
43   * @see gnu.lgpl.License The GNU Lesser General Public License for details.
44   * @author DM Smith
45   */
46  public class GenBookBackendState extends AbstractOpenFileState {
47      /**
48       * This is default package access for forcing the use of the
49       * OpenFileStateManager to manage the creation. Not doing so may result in
50       * new instances of OpenFileState being created for no reason, and as a
51       * result, if they are released to the OpenFileStateManager by mistake this
52       * would result in leakage
53       * 
54       * @param bookMetaData the appropriate metadata for the book
55       */
56      GenBookBackendState(BookMetaData bookMetaData) {
57          super(bookMetaData);
58          URI path = null;
59          try {
60              path = SwordUtil.getExpandedDataPath(bookMetaData);
61          } catch (BookException e) {
62              Reporter.informUser(this, e);
63              return;
64          }
65  
66          bdtFile = new File(path.getPath() + EXTENSION_BDT);
67  
68          if (!bdtFile.canRead()) {
69              // TRANSLATOR: Common error condition: The file could not be read.
70              // There can be many reasons.
71              // {0} is a placeholder for the file.
72              Reporter.informUser(this, new BookException(JSMsg.gettext("Error reading {0}", bdtFile.getAbsolutePath())));
73              return;
74          }
75  
76          try {
77              bdtRaf  = new RandomAccessFile(bdtFile, FileUtil.MODE_READ);
78          } catch (IOException ex) {
79              //failed to open the files, so close them now
80              IOUtil.close(bdtRaf);
81  
82              LOGGER.error("failed to open files", ex);
83              bdtRaf = null;
84          }
85      }
86  
87      public void releaseResources() {
88          IOUtil.close(bdtRaf);
89          bdtRaf = null;
90      }
91  
92      /**
93       * @return the bdtRaf
94       */
95      public RandomAccessFile getBdtRaf() {
96          return bdtRaf;
97      }
98  
99      /**
100      * Raw GenBook file extensions
101      */
102     private static final String EXTENSION_BDT = ".bdt";
103 
104     /**
105      * The raw data file
106      */
107     private File bdtFile;
108 
109     /**
110      * The random access file for the raw data
111      */
112     private RandomAccessFile bdtRaf;
113 
114     /**
115      * The log stream
116      */
117     private static final Logger LOGGER = LoggerFactory.getLogger(GenBookBackendState.class);
118 }
119