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, 2008 - 2016
18   *
19   */
20  package org.crosswire.jsword.bridge;
21  
22  import org.crosswire.jsword.book.Book;
23  import org.crosswire.jsword.book.BookCategory;
24  import org.crosswire.jsword.book.Books;
25  import org.crosswire.jsword.passage.Key;
26  import org.crosswire.jsword.versification.BookName;
27  
28  /**
29   * Determines the scope of the Bible. That is, the verses that are in the Bible
30   * and the verses that are not. This is based upon the KJV versification.
31   * 
32   * @see gnu.lgpl.License The GNU Lesser General Public License for details.
33   * @author DM Smith
34   */
35  public class BibleScope {
36  
37      public BibleScope(Book book) {
38          this.book = book;
39      }
40  
41      /**
42       * Get a key containing all the verses that are in this Bible.
43       * 
44       * @return verses that are in scope
45       */
46      public Key getInScope() {
47          computeScope();
48          return inScope;
49      }
50  
51      /**
52       * Get a key containing all the verses that are not in this Bible.
53       * 
54       * @return verses that are out of scope
55       */
56      public Key getOutOfScope() {
57          computeScope();
58          return outScope;
59      }
60  
61      private void computeScope() {
62          if (inScope == null) {
63              Key all = book.getGlobalKeyList();
64              inScope = book.createEmptyKeyList();
65              outScope = book.createEmptyKeyList();
66              for (Key key : all) {
67                  if (book.contains(key)) {
68                      inScope.addAll(key);
69                  } else {
70                      outScope.addAll(key);
71                  }
72              }
73          }
74      }
75  
76      public static void report(Book b) {
77          if (!b.getBookCategory().equals(BookCategory.BIBLE) && !b.getBookCategory().equals(BookCategory.COMMENTARY)) {
78              System.err.println(b.getInitials() + " is not a Bible or Commentary");
79              // System.exit(1);
80          }
81  
82          BibleScope scope = new BibleScope(b);
83          BookName.setFullBookName(false); // use short names
84          System.out.println('[' + b.getInitials() + ']');
85          System.out.println("InScope=" + scope.getInScope().getOsisRef());
86          System.out.println("OutScope=" + scope.getOutOfScope().getOsisRef());
87      }
88  
89      private Book book;
90  
91      /**
92       * Call with <operation> book. Where operation can be one of:
93       * <ul>
94       * <li>check - returns "TRUE" or "FALSE" indicating whether the index exists
95       * or not</li>
96       * <li>create - (re)create the index</li>
97       * <li>delete - delete the index if it exists</li>
98       * </ul>
99       * And book is the initials of a book, e.g. KJV.
100      * 
101      * @param args
102      */
103     public static void main(String[] args) {
104         if (args.length != 1) {
105             usage();
106             return;
107         }
108 
109         System.err.println("BibleScope " + args[0]);
110 
111         Book b = Books.installed().getBook(args[0]);
112         if (b == null) {
113             System.err.println("Book not found");
114             return;
115         }
116 
117         report(b);
118 
119         // List books =
120         // Books.installed().getBooks(BookFilters.getCommentaries());
121         // Iterator iter = books.iterator();
122         // while (iter.hasNext())
123         // {
124         // try {
125         // report((Book) iter.next());
126         // } catch (Exception e) {
127         // System.out.println("exception " + e.toString());
128         // }
129         // System.out.println();
130         // }
131     }
132 
133     public static void usage() {
134         System.err.println("Usage: BibleScope book");
135     }
136 
137     private Key inScope;
138     private Key outScope;
139 }
140