Coverage Report - org.paneris.bibliomania.population.KeyDotTxtFilter
 
Classes in this File Line Coverage Branch Coverage Complexity
KeyDotTxtFilter
74%
38/51
65%
13/20
2.75
KeyDotTxtFilter$1
0%
0/3
N/A
2.75
 
 1  
 package org.paneris.bibliomania.population;
 2  
 
 3  
 import java.io.BufferedReader;
 4  
 import java.io.File;
 5  
 import java.io.FileReader;
 6  
 import java.util.Enumeration;
 7  
 import java.util.Vector;
 8  
 
 9  
 import org.melati.poem.AccessToken;
 10  
 import org.melati.poem.PoemTask;
 11  
 import org.melati.util.MelatiRuntimeException;
 12  
 import org.paneris.bibliomania.BibliomaniaDatabase;
 13  
 import org.paneris.bibliomania.Book;
 14  
 import org.paneris.bibliomania.Chapter;
 15  
 import org.paneris.bibliomania.util.OROUtils;
 16  
 
 17  
 import org.apache.oro.text.regex.MatchResult;
 18  
 import org.apache.oro.text.regex.Pattern;
 19  
 import org.apache.oro.text.regex.Perl5Compiler;
 20  
 import org.apache.oro.text.regex.Perl5Matcher;
 21  
 
 22  0
 public class KeyDotTxtFilter {
 23  
 
 24  
   public static class PopulationException extends MelatiRuntimeException {
 25  
 
 26  
     private static final long serialVersionUID = 1L;
 27  
 
 28  
     public File keyDotTxtFile;
 29  
 
 30  
     public PopulationException(File keyDotTxtFile, Exception problem) {
 31  
       super(problem);
 32  
       this.keyDotTxtFile = keyDotTxtFile;
 33  
     }
 34  
 
 35  
     public String getMessage() {
 36  
       return "A problem was encountered importing " + keyDotTxtFile + ":\n" +
 37  
            subException.getMessage();
 38  
     }
 39  
   }
 40  
 
 41  0
   public static class SyntaxException extends MelatiRuntimeException {
 42  
     private static final long serialVersionUID = 1L;
 43  
 
 44  
     public int linenum;
 45  
     public String line;
 46  
 
 47  
     public SyntaxException(int linenum, String line) {
 48  
       this.linenum = linenum;
 49  
       this.line = line;
 50  
     }
 51  
 
 52  
     public String getMessage() {
 53  
       return "Line " + linenum + " was not in the " +
 54  
              "<filename>.html <chapter title> format:\n" +
 55  
              "[[" + line + "]]";
 56  
     }
 57  
   }
 58  
 
 59  
   private static final Pattern
 60  1
       data = OROUtils.perl5Pattern(
 61  
                 "^\\s*(.*?\\.html)\\s+(.*?)((  |\t)\\s*(.*?))?\\s*$",
 62  
                 Perl5Compiler.CASE_INSENSITIVE_MASK),
 63  1
       white = OROUtils.perl5Pattern("^(#.*|\\s*)$", Perl5Compiler.DEFAULT_MASK);
 64  
 
 65  
   private static void populateFromDataRE(Book book, Vector oldChapters,
 66  
                                          int seq, MatchResult match) {
 67  
     Chapter chapter;
 68  5
     if (oldChapters.size() <= seq)
 69  0
       chapter = null;
 70  
     else {
 71  5
       chapter = (Chapter)oldChapters.elementAt(seq);
 72  5
       oldChapters.setElementAt(null, seq);
 73  
     }
 74  
 
 75  5
     if (chapter == null)
 76  0
       chapter = (Chapter)book.getBibliomaniaDatabase().getChapterTable().
 77  
                                                            newPersistent();
 78  
 
 79  5
     chapter.setBook(book);
 80  5
     chapter.setSequence(seq);
 81  5
     chapter.setTitle(match.group(2));
 82  5
     chapter.setLongtitle(match.group(5)); // may be null
 83  5
     chapter.setFilepath(book.getPath(), match.group(1));
 84  
 
 85  5
     if (!chapter.statusExistent())
 86  0
       chapter.makePersistent();
 87  5
   }
 88  
 
 89  
   public static void populate(Book book) {
 90  1
     File keyDotTxtFile = new File(book.getSourceDir(), "key.txt");
 91  
     try {
 92  1
       BufferedReader keyDotTxt =
 93  
         new BufferedReader(new FileReader(keyDotTxtFile));
 94  
 
 95  1
       Perl5Matcher matcher = new Perl5Matcher();
 96  
 
 97  1
       Vector oldChapters = new Vector();
 98  
 
 99  1
       for (Enumeration existingChapters = book.getChapters();
 100  6
            existingChapters.hasMoreElements();) {
 101  5
         Chapter chapter = (Chapter)existingChapters.nextElement();
 102  5
         int seq = chapter.getSequence().intValue();
 103  5
         if (oldChapters.size() <= seq)
 104  5
           oldChapters.setSize(seq + 1);
 105  5
         oldChapters.setElementAt(chapter, seq);
 106  5
       }
 107  
         
 108  1
       int chapterCount = 0;
 109  6
       for (int lineno = 0;; ++lineno) {
 110  6
         String line = keyDotTxt.readLine();
 111  6
         if (line == null)
 112  1
           break;
 113  
 
 114  5
         if (matcher.matches(line, white)) {}
 115  5
         else if (matcher.matches(line, data))
 116  5
             populateFromDataRE(book, oldChapters,
 117  
                                chapterCount++, matcher.getMatch());
 118  
         else 
 119  0
           throw new SyntaxException(lineno, line);
 120  
       }
 121  
 
 122  6
       for (int c = 0; c < oldChapters.size(); ++c) {
 123  5
         Chapter chapter = (Chapter)oldChapters.elementAt(c);
 124  5
         if (chapter != null)
 125  0
           chapter.delete_unsafe_butCleanFTI();
 126  
       }
 127  
     }
 128  0
     catch (Exception e) {
 129  0
       throw new PopulationException(keyDotTxtFile, e);
 130  1
     }
 131  1
   }
 132  
 
 133  
   public static void main(final String[] args) throws Exception {
 134  0
     final BibliomaniaDatabase bib = new BibliomaniaDatabase();
 135  0
     bib.connect("bibliomania", "org.melati.poem.dbms.Postgresql",
 136  
                 "jdbc:postgresql:bibliomania", "postgres", "*",8);
 137  0
     bib.inSession(
 138  
         AccessToken.root,
 139  0
         new PoemTask() {
 140  
           public void run() {
 141  0
           populate((Book)bib.getBookTable().getTitleColumn().firstWhereEq(args[0]));
 142  0
         }
 143  
         });
 144  0
   }
 145  
 }