1
20 package org.crosswire.jsword.book.sword;
21
22 import java.io.File;
23 import java.io.IOException;
24 import java.net.URI;
25 import java.util.HashSet;
26 import java.util.List;
27 import java.util.Set;
28
29 import org.crosswire.common.util.FileUtil;
30 import org.crosswire.common.util.NetUtil;
31 import org.crosswire.jsword.JSMsg;
32 import org.crosswire.jsword.JSOtherMsg;
33 import org.crosswire.jsword.book.Book;
34 import org.crosswire.jsword.book.BookDriver;
35 import org.crosswire.jsword.book.BookException;
36 import org.crosswire.jsword.book.BookMetaData;
37 import org.crosswire.jsword.book.Books;
38 import org.crosswire.jsword.book.basic.AbstractBookDriver;
39 import org.crosswire.jsword.index.IndexManager;
40 import org.crosswire.jsword.index.IndexManagerFactory;
41 import org.crosswire.jsword.index.IndexStatus;
42 import org.slf4j.Logger;
43 import org.slf4j.LoggerFactory;
44
45
53 public class SwordBookDriver extends AbstractBookDriver {
54
57 public SwordBookDriver() {
58 }
59
60
63 public String getDriverName() {
64 return "Sword";
65 }
66
67
70 public Book[] getBooks() {
71 File[] dirs = SwordBookPath.getSwordPath();
72 Set<Book> valid = new HashSet<Book>(dirs.length + dirs.length / 3);
75 for (int j = 0; j < dirs.length; j++) {
76 getBooks(valid, dirs[j]);
77 }
78 return valid.toArray(new Book[valid.size()]);
79 }
80
81 private void getBooks(Set<Book> valid, File bookDir) {
82 File mods = new File(bookDir, SwordConstants.DIR_CONF);
83 if (!mods.isDirectory()) {
84 LOGGER.debug("mods.d directory at {} does not exist", mods);
85 return;
86 }
87
88 String[] bookConfs = SwordBookPath.getBookList(mods);
89
90 URI bookDirURI = NetUtil.getURI(bookDir);
92 for (int i = 0; i < bookConfs.length; i++) {
93 String bookConf = bookConfs[i];
94 try {
95 SwordBookMetaData sbmd = null;
96
97 File configfile = new File(mods, bookConf);
98 if (configfile.exists()) {
99 sbmd = new SwordBookMetaData(configfile, bookDirURI);
101 }
102
103 if (sbmd == null) {
104 LOGGER.error("The book's configuration files is not supported.");
105 continue;
106 }
107
108 if (!sbmd.isSupported()) {
110 LOGGER.error("The book's configuration files is not supported. -> Initials [{}], Driver=[{}], Versification=[{}], Book type=[{}], Book category=[{}]",
111 sbmd.getInitials(), sbmd.getDriver(), sbmd.getProperty(BookMetaData.KEY_VERSIFICATION), sbmd.getBookType(), sbmd.getBookCategory());
112 continue;
113 }
114
115 sbmd.setDriver(this);
116
117 Book book = createBook(sbmd);
119 if (!valid.contains(book)) {
120 valid.add(book);
121
122 IndexManager imanager = IndexManagerFactory.getIndexManager();
123 if (imanager.isIndexed(book)) {
124 sbmd.setIndexStatus(IndexStatus.DONE);
125 } else {
126 sbmd.setIndexStatus(IndexStatus.UNDONE);
127 }
128 }
129 } catch (IOException e) {
130 LOGGER.warn("Couldn't create SwordBookMetaData", e);
131 } catch (BookException e) {
132 LOGGER.warn("Couldn't create SwordBookMetaData", e);
133 }
134 }
135 }
136
137
140 @Override
141 public boolean isDeletable(Book dead) {
142 SwordBookMetaData sbmd = (SwordBookMetaData) dead.getBookMetaData();
143 File confFile = sbmd.getConfigFile();
144 return confFile != null && confFile.exists();
146 }
147
148
151 @Override
152 public void delete(Book dead) throws BookException {
153 SwordBookMetaData sbmd = (SwordBookMetaData) dead.getBookMetaData();
154 File confFile = sbmd.getConfigFile();
155
156 if (confFile == null || !confFile.exists()) {
158 throw new BookException(JSMsg.gettext("Unable to delete: {0}", confFile));
161 }
162
163 List<File> failures = FileUtil.delete(confFile);
165 if (failures.isEmpty()) {
166 URI loc = sbmd.getLocation();
167 if (loc != null) {
168 File bookDir = new File(loc.getPath());
169 failures = FileUtil.delete(bookDir);
170 Books.installed().removeBook(dead);
171 }
172
173 }
174
175 if (!failures.isEmpty()) {
177 throw new BookException(JSMsg.gettext("Unable to delete: {0}", failures.get(0)));
180 }
181 }
182
183
188 public static BookDriver instance() {
189 return INSTANCE;
190 }
191
192
200 public static void registerNewBook(SwordBookMetaData sbmd) throws BookException {
201 BookDriver[] drivers = Books.installed().getDriversByClass(SwordBookDriver.class);
202 for (int i = 0; i < drivers.length; i++) {
203 SwordBookDriver sdriver = (SwordBookDriver) drivers[i];
204 Book book = sdriver.createBook(sbmd);
205 Books.installed().addBook(book);
206 }
207 }
208
209
212 private Book createBook(SwordBookMetaData sbmd) throws BookException {
213 BookType modtype = sbmd.getBookType();
214 if (modtype == null || modtype.getBookCategory() == null) {
215 throw new BookException(JSOtherMsg.lookupText("Unsupported type: {0} when reading {1}"));
217 }
218
219 return modtype.createBook(sbmd);
220 }
221
222
225 private static final BookDriver INSTANCE = new SwordBookDriver();
226
227
230 private static final Logger LOGGER = LoggerFactory.getLogger(SwordBookDriver.class);
231 }
232