extensions/net.sf.basedb.reggie/trunk/src/net/sf/basedb/reggie/pdf/TemplateFilePage.java

Code
Comments
Other
Rev Date Author Line
6030 28 Oct 20 nicklas 1 package net.sf.basedb.reggie.pdf;
6030 28 Oct 20 nicklas 2
6030 28 Oct 20 nicklas 3 import java.io.IOException;
6081 25 Nov 20 nicklas 4 import java.util.ArrayList;
6081 25 Nov 20 nicklas 5 import java.util.List;
6030 28 Oct 20 nicklas 6
6081 25 Nov 20 nicklas 7 import org.jdom2.Element;
6081 25 Nov 20 nicklas 8
6030 28 Oct 20 nicklas 9 import net.sf.basedb.reggie.Reggie;
6030 28 Oct 20 nicklas 10 import net.sf.basedb.reggie.XmlConfig;
6030 28 Oct 20 nicklas 11 import net.sf.basedb.util.Values;
6030 28 Oct 20 nicklas 12
6030 28 Oct 20 nicklas 13 /**
6030 28 Oct 20 nicklas 14   Holds path and page number for a template PDF document.
6030 28 Oct 20 nicklas 15   @since 4.28
6030 28 Oct 20 nicklas 16 */
6030 28 Oct 20 nicklas 17 public class TemplateFilePage 
6030 28 Oct 20 nicklas 18 {
6030 28 Oct 20 nicklas 19
6030 28 Oct 20 nicklas 20   /**
6030 28 Oct 20 nicklas 21     Create a template file from information in the reggie-config.xml file.
6030 28 Oct 20 nicklas 22     The xpath parameter should identify an element where the value is expected
6030 28 Oct 20 nicklas 23     to be an absolute path or only a filename (the file is the then expected to
6030 28 Oct 20 nicklas 24     be located in the default directory). The element may have a 'page' attribute
6030 28 Oct 20 nicklas 25     that tells which page from the template pdf that should be used. If not 
6030 28 Oct 20 nicklas 26     specified, the first page is used.
6030 28 Oct 20 nicklas 27   */
6030 28 Oct 20 nicklas 28   public static TemplateFilePage fromConfig(String xpath, String parameterSet, String defaultDir, String defaultFile)
6030 28 Oct 20 nicklas 29     throws IOException
6030 28 Oct 20 nicklas 30   {
6030 28 Oct 20 nicklas 31     XmlConfig cfg = Reggie.getConfig();
6030 28 Oct 20 nicklas 32     String path = cfg.getConfig(xpath, parameterSet, defaultFile);
6030 28 Oct 20 nicklas 33     if (!path.contains("/")) path = defaultDir + "/" + path;
6030 28 Oct 20 nicklas 34     int page = Values.getInt(cfg.getConfig(xpath+"/@page", parameterSet, "1"));
6030 28 Oct 20 nicklas 35     Reggie.checkFile(path, false);
6030 28 Oct 20 nicklas 36     return new TemplateFilePage(path, page);
6030 28 Oct 20 nicklas 37   }
6030 28 Oct 20 nicklas 38   
6081 25 Nov 20 nicklas 39   /**
6081 25 Nov 20 nicklas 40     Load information about template files from the configuration file.
6081 25 Nov 20 nicklas 41     
6081 25 Nov 20 nicklas 42     @param xpath Search path to the <templates> tag, which should
6081 25 Nov 20 nicklas 43       contain one or more <file> tags
6081 25 Nov 20 nicklas 44     @param defaultDir Default directory for template files unless a full path is specifed
6081 25 Nov 20 nicklas 45     @return A list with the specified templates
6081 25 Nov 20 nicklas 46     @throws IOException
6081 25 Nov 20 nicklas 47   */
6081 25 Nov 20 nicklas 48   public static List<TemplateFilePage> fromConfig(String xpath, String defaultDir)
6081 25 Nov 20 nicklas 49     throws IOException
6081 25 Nov 20 nicklas 50   {
6081 25 Nov 20 nicklas 51     XmlConfig cfg = Reggie.getConfig();
6081 25 Nov 20 nicklas 52     Element templates = cfg.getElement(xpath);
6081 25 Nov 20 nicklas 53     List<Element> files = templates.getChildren("file");
6081 25 Nov 20 nicklas 54     
6081 25 Nov 20 nicklas 55     List<TemplateFilePage> templatePages = new ArrayList<TemplateFilePage>(files.size());
6081 25 Nov 20 nicklas 56     for (Element file : files)
6081 25 Nov 20 nicklas 57     {
6081 25 Nov 20 nicklas 58       String path = file.getTextTrim();
6081 25 Nov 20 nicklas 59       if (!path.contains("/")) path = defaultDir + "/" + path;
6081 25 Nov 20 nicklas 60       Reggie.checkFile(path, false);
6081 25 Nov 20 nicklas 61       String pages = file.getAttributeValue("pages", "1");
6081 25 Nov 20 nicklas 62       
6081 25 Nov 20 nicklas 63       for (int pageNo : expandPageRange(pages))
6081 25 Nov 20 nicklas 64       {
6081 25 Nov 20 nicklas 65         templatePages.add(new TemplateFilePage(path, pageNo));
6081 25 Nov 20 nicklas 66       }
6081 25 Nov 20 nicklas 67     }
6081 25 Nov 20 nicklas 68     return templatePages;
6081 25 Nov 20 nicklas 69   }
6081 25 Nov 20 nicklas 70   
6081 25 Nov 20 nicklas 71   /**
6081 25 Nov 20 nicklas 72     Parse the page specification and expand it into a list
6081 25 Nov 20 nicklas 73     specifying every page that are included. Entries are separated
6081 25 Nov 20 nicklas 74     by a comma and each entry is either a single page or a range.
6081 25 Nov 20 nicklas 75     Duplicate entries are preserved.
6081 25 Nov 20 nicklas 76     
6081 25 Nov 20 nicklas 77     Examples:    
6081 25 Nov 20 nicklas 78     1
6081 25 Nov 20 nicklas 79     1,2,5
6081 25 Nov 20 nicklas 80     1,3-8,27
6081 25 Nov 20 nicklas 81     
6081 25 Nov 20 nicklas 82     Invalid entries are ignored.
6081 25 Nov 20 nicklas 83     
6081 25 Nov 20 nicklas 84     @param pages A page specification with comma-separated page numbers
6081 25 Nov 20 nicklas 85       and ranges
6081 25 Nov 20 nicklas 86     @return All pages in the same order as they are specified
6081 25 Nov 20 nicklas 87   */
6081 25 Nov 20 nicklas 88   public static List<Integer> expandPageRange(String pages)
6081 25 Nov 20 nicklas 89   {
6081 25 Nov 20 nicklas 90     List<Integer> allPages = new ArrayList<Integer>();
6081 25 Nov 20 nicklas 91     
6081 25 Nov 20 nicklas 92     if (pages != null)
6081 25 Nov 20 nicklas 93     {
6081 25 Nov 20 nicklas 94       for (String entry : pages.split("\\,"))
6081 25 Nov 20 nicklas 95       {
6081 25 Nov 20 nicklas 96         entry = entry.strip();
6081 25 Nov 20 nicklas 97         String[] range = entry.split("\\-");
6081 25 Nov 20 nicklas 98         if (range.length == 2)
6081 25 Nov 20 nicklas 99         {
6081 25 Nov 20 nicklas 100           int first = Values.getInt(range[0].strip());
6081 25 Nov 20 nicklas 101           int last = Values.getInt(range[1].strip());
6081 25 Nov 20 nicklas 102           for (int pageNo = first; pageNo <= last; pageNo++)
6081 25 Nov 20 nicklas 103           {
6081 25 Nov 20 nicklas 104             allPages.add(pageNo);
6081 25 Nov 20 nicklas 105           }
6081 25 Nov 20 nicklas 106         }
6081 25 Nov 20 nicklas 107         else
6081 25 Nov 20 nicklas 108         {
6081 25 Nov 20 nicklas 109           int pageNo = Values.getInt(entry, 0);
6081 25 Nov 20 nicklas 110           if (pageNo > 0) allPages.add(pageNo);
6081 25 Nov 20 nicklas 111         }
6081 25 Nov 20 nicklas 112       }
6081 25 Nov 20 nicklas 113     }
6081 25 Nov 20 nicklas 114     
6081 25 Nov 20 nicklas 115     return allPages;
6081 25 Nov 20 nicklas 116   }
6081 25 Nov 20 nicklas 117   
6030 28 Oct 20 nicklas 118   private final String path;
6030 28 Oct 20 nicklas 119   private final int page;
6030 28 Oct 20 nicklas 120   
6030 28 Oct 20 nicklas 121   /**
6030 28 Oct 20 nicklas 122     Create a template from a path and page number.
6030 28 Oct 20 nicklas 123   */
6030 28 Oct 20 nicklas 124   public TemplateFilePage(String path, int page)
6030 28 Oct 20 nicklas 125   {
6030 28 Oct 20 nicklas 126     this.path = path;
6030 28 Oct 20 nicklas 127     this.page = page;
6030 28 Oct 20 nicklas 128   }
6030 28 Oct 20 nicklas 129   
6030 28 Oct 20 nicklas 130   /**
6030 28 Oct 20 nicklas 131     Get the path to the template PDF file.
6030 28 Oct 20 nicklas 132   */
6030 28 Oct 20 nicklas 133   public String getPath()
6030 28 Oct 20 nicklas 134   {
6030 28 Oct 20 nicklas 135     return path;
6030 28 Oct 20 nicklas 136   }
6030 28 Oct 20 nicklas 137   
6030 28 Oct 20 nicklas 138   /**
6030 28 Oct 20 nicklas 139     Get the page that should be used from the PDF.
6030 28 Oct 20 nicklas 140   */
6030 28 Oct 20 nicklas 141   public int getPage()
6030 28 Oct 20 nicklas 142   {
6030 28 Oct 20 nicklas 143     return page;
6030 28 Oct 20 nicklas 144   }
6030 28 Oct 20 nicklas 145 }