1   package org.paneris.bibliomania;
2   
3   import java.io.BufferedOutputStream;
4   import java.io.BufferedWriter;
5   import java.io.File;
6   import java.io.FileOutputStream;
7   import java.io.FileWriter;
8   import java.io.OutputStream;
9   import java.io.Writer;
10  import java.sql.Timestamp;
11  import java.util.Enumeration;
12  import java.util.Hashtable;
13  import java.util.Vector;
14  
15  import org.melati.poem.CachedSelection;
16  import org.melati.poem.Column;
17  import org.melati.poem.util.EmptyEnumeration;
18  import org.melati.poem.util.MappedEnumeration;
19  import org.melati.util.IoUtils;
20  import org.melati.util.MelatiRuntimeException;
21  import org.paneris.bibliomania.generated.UnitBase;
22  
23  public abstract class Unit extends UnitBase {
24  
25    public BibliomaniaDatabase getBibliomaniaDatabase () {
26        return (BibliomaniaDatabase)getDatabase();
27    }
28  
29    public Unit() {}
30  
31    public abstract long ftiTextID_start();
32    public abstract long ftiTextID_limit();
33    public abstract Unit getParentUnit();
34    public abstract String getName();
35    
36    public abstract String getMetatag_description();
37    public abstract String getMetatag_keywords();
38    public abstract void appendCacheSubpath(StringBuffer buffer);
39  
40    public Enumeration getAncestors() {
41        Vector v = new Vector();
42        Unit p = getParentUnit();
43        while ( p!= null) {
44            v.addElement(p);
45            p = p.getParentUnit();
46        }
47        return v.elements();
48    }
49    
50  
51  
52  
53  
54  
55  
56  
57  
58  
59  
60  
61    private CachedSelection productAssociations = null;
62    protected Enumeration getProductAssociations(Column c) {
63      if (getTroid() == null)
64        return new EmptyEnumeration();
65      else {
66        if (productAssociations == null)
67          productAssociations =
68              c.cachedSelectionWhereEq(getTroid());
69        return productAssociations.objects();
70      }
71    }
72    public abstract Enumeration getProductAssociations();
73    
74    public Enumeration getRelatedProducts() {
75      return new MappedEnumeration(getProductAssociations()) {
76            public Object mapped(Object productAssociation) {
77                 return ((ProductAssociation)productAssociation).getProduct();
78               }
79            };
80    }
81   
82    public static class NoSourceDirException extends MelatiRuntimeException {
83      
84  
85  
86      private static final long serialVersionUID = 1L;
87      public String description;
88      public File dir;
89  
90      public NoSourceDirException(String description, File dir) {
91        this.description = description;
92        this.dir = dir;
93      }
94  
95      public String getMessage() {
96        return
97            "Can't access the source directory " + dir + " for " + description +
98            "---either it doesn't exist or it doesn't have the right permissions";
99      }
100   }
101 
102   public void appendCachePath(StringBuffer buffer) {
103     buffer.append(getBibliomaniaDatabase().getCachedContentRootDir());
104     appendCacheSubpath(buffer);
105   }
106 
107   public String getCachePath() {
108     StringBuffer buffer = new StringBuffer();
109     appendCachePath(buffer);
110     return buffer.toString();
111   }
112 
113   public String getBoardName() {
114     String n = getPath();
115     if (n.endsWith("/"))
116       n = n.substring(0, n.length() - 1);
117     if (n.startsWith("/"))
118       n = n.substring(1, n.length());
119     return n.replace('/','.'); 
120       
121   }
122 
123   protected Hashtable speciallyTreatedInCache() {
124     return null;
125   }
126 
127   protected void writeLock() {
128     super.writeLock();
129     lastencached = null;
130   }
131 
132   public abstract Enumeration<Unit> getMembersSlowly();
133 
134   public abstract String getDisplayName();
135 
136   public void readKeyDotTxt() throws Exception {
137   }
138 
139   public void paginate() throws Exception {
140   }
141 
142   public void index() throws Exception {
143   }
144 
145   public void encache() throws Exception {
146     assertCanWrite();
147 
148     File sourceDir = new File(getBibliomaniaDatabase().getContentRootDir(),
149                               getPath());
150     String[] sources = sourceDir.list();
151     if (sources == null)
152       sources = new String[0];
153     
154 
155     File cachePath = new File(getCachePath());
156     cachePath.mkdirs();
157 
158     Hashtable speci = speciallyTreatedInCache();
159 
160     for (int s = 0; s < sources.length; ++s) {
161       String source = sources[s];
162       File from = new File(sourceDir, source);
163 
164       if (!from.isDirectory() &&
165           (speci == null || !speci.containsKey(source))) {
166         File to;
167         if (source.endsWith(".wm")) {
168           to =
169               new File(cachePath,
170                        source.substring(0, source.length() - 3) + ".html");
171           OutputStream w = new BufferedOutputStream(new FileOutputStream(to));
172 
173           try {
174             getBibliomaniaDatabase().writeContentHeader(w, this, null);
175             getBibliomaniaDatabase().interpolateAsTemplate(from, w, this);
176             getBibliomaniaDatabase().writeContentFooter(w, this, null);
177           }
178           finally {
179             try { w.close(); } catch (Exception e) {}
180           }
181         }
182         else
183           IoUtils.copy(from, 16384, to = new File(cachePath, source));
184 
185         BibliomaniaDatabase.notifyNewContentFile(to);
186       }
187     }
188 
189     File defaul = new File(cachePath, "index.html");
190     if (!defaul.exists()) {
191       Writer w = new BufferedWriter(new FileWriter(defaul));
192       try {
193         getBibliomaniaDatabase().interpolateTemplateToFile(
194             "read/Default.wm", defaul, this);
195       }
196       finally {
197         try { w.close(); } catch (Exception e) {}
198       }
199     }
200 
201     File redirec = new File(cachePath, "contents.html");
202 
203     {
204       Writer w = new BufferedWriter(new FileWriter(redirec));
205       try {
206         getBibliomaniaDatabase().interpolateTemplateToFile(
207             "Contents.wm", redirec, this);
208       }
209       finally {
210         try { w.close(); } catch (Exception e) {}
211       }
212     }
213 
214     setLastencached(new Timestamp(System.currentTimeMillis()));
215   }
216 
217   public String getURLSubpath() {
218     return getBibliomaniaDatabase().getBib().urlPrefixed(
219                "", null, null, this, null);
220   }
221 
222   public String getURLSubpathReally() {
223     return getBibliomaniaDatabase().getBib().urlPrefixedReally(
224                "", null, null, this, null);
225   }
226 
227   public abstract SectionGroup getReadArea();
228 }
229