1
22 package org.crosswire.jsword.book.sword;
23
24 import java.io.File;
25 import java.io.IOException;
26 import java.net.URI;
27 import java.util.ArrayList;
28 import java.util.List;
29
30 import org.crosswire.common.util.FileUtil;
31 import org.crosswire.common.util.Logger;
32 import org.crosswire.common.util.NetUtil;
33 import org.crosswire.jsword.JSMsg;
34 import org.crosswire.jsword.JSOtherMsg;
35 import org.crosswire.jsword.book.Book;
36 import org.crosswire.jsword.book.BookDriver;
37 import org.crosswire.jsword.book.BookException;
38 import org.crosswire.jsword.book.Books;
39 import org.crosswire.jsword.book.basic.AbstractBookDriver;
40 import org.crosswire.jsword.index.IndexManager;
41 import org.crosswire.jsword.index.IndexManagerFactory;
42 import org.crosswire.jsword.index.IndexStatus;
43
44
52 public class SwordBookDriver extends AbstractBookDriver {
53
56 public SwordBookDriver() {
57 }
58
59
64 public String getDriverName() {
65 return "Sword";
66 }
67
68
73 public Book[] getBooks() {
74 ConfigEntry.resetStatistics();
75
76 List<Book> valid = new ArrayList<Book>();
77
78 File[] dirs = SwordBookPath.getSwordPath();
79 for (int j = 0; j < dirs.length; j++) {
80 getBooks(valid, dirs[j]);
81 }
82
83 ConfigEntry.dumpStatistics();
84
85 return valid.toArray(new Book[valid.size()]);
86 }
87
88 private void getBooks(List<Book> valid, File bookDir) {
89 File mods = new File(bookDir, SwordConstants.DIR_CONF);
90 if (mods.isDirectory()) {
91 String[] bookConfs = SwordBookPath.getBookList(mods);
92
93 for (int i = 0; i < bookConfs.length; i++) {
95 String bookConf = bookConfs[i];
96 try {
97 File configfile = new File(mods, bookConf);
98 String internal = bookConf;
99 if (internal.endsWith(SwordConstants.EXTENSION_CONF)) {
100 internal = internal.substring(0, internal.length() - 5);
101 }
102 SwordBookMetaData sbmd = new SwordBookMetaData(configfile, internal, NetUtil.getURI(bookDir));
103
104 if (!sbmd.isSupported()) {
106 continue;
107 }
108
109 sbmd.setDriver(this);
110
111 Book book = createBook(sbmd);
113 if (!valid.contains(book)) {
114 valid.add(book);
115
116 IndexManager imanager = IndexManagerFactory.getIndexManager();
117 if (imanager.isIndexed(book)) {
118 sbmd.setIndexStatus(IndexStatus.DONE);
119 } else {
120 sbmd.setIndexStatus(IndexStatus.UNDONE);
121 }
122 }
123 } catch (IOException e) {
124 log.warn("Couldn't create SwordBookMetaData", e);
125 } catch (BookException e) {
126 log.warn("Couldn't create SwordBookMetaData", e);
127 }
128 }
129 } else {
130 log.debug("mods.d directory at " + mods + " does not exist");
131 }
132 }
133
134
141 @Override
142 public boolean isDeletable(Book dead) {
143 SwordBookMetaData sbmd = (SwordBookMetaData) dead.getBookMetaData();
144 File dlDir = SwordBookPath.getSwordDownloadDir();
145 File confFile = new File(dlDir, sbmd.getConfPath());
146
147 return confFile.exists();
149 }
150
151
158 @Override
159 public void delete(Book dead) throws BookException {
160 SwordBookMetaData sbmd = (SwordBookMetaData) dead.getBookMetaData();
161 File dlDir = SwordBookPath.getSwordDownloadDir();
162 File confFile = new File(dlDir, sbmd.getConfPath());
163
164 if (!confFile.exists()) {
166 throw new BookException(JSMsg.gettext("Unable to delete: {0}", confFile));
169 }
170
171 List<File> failures = FileUtil.delete(confFile);
173 if (failures.isEmpty()) {
174 URI loc = sbmd.getLocation();
175 if (loc != null) {
176 File bookDir = new File(loc.getPath());
177 failures = FileUtil.delete(bookDir);
178 Books.installed().removeBook(dead);
179 }
180
181 }
182
183 if (!failures.isEmpty()) {
185 throw new BookException(JSMsg.gettext("Unable to delete: {0}", failures.get(0)));
188 }
189 }
190
191
196 public static BookDriver instance() {
197 return INSTANCE;
198 }
199
200
208 public static void registerNewBook(SwordBookMetaData sbmd) throws BookException {
209 BookDriver[] drivers = Books.installed().getDriversByClass(SwordBookDriver.class);
210 for (int i = 0; i < drivers.length; i++) {
211 SwordBookDriver sdriver = (SwordBookDriver) drivers[i];
212 Book book = sdriver.createBook(sbmd);
213 Books.installed().addBook(book);
214 }
215 }
216
217
220 private Book createBook(SwordBookMetaData sbmd) throws BookException {
221 BookType modtype = sbmd.getBookType();
222 if (modtype == null || modtype.getBookCategory() == null) {
223 throw new BookException(JSOtherMsg.lookupText("Unsupported type: {0} when reading {1}"));
225 }
226
227 return modtype.createBook(sbmd);
228 }
229
230
233 private static final BookDriver INSTANCE = new SwordBookDriver();
234
235
238 private static final Logger log = Logger.getLogger(SwordBookDriver.class);
239
240 }
241