Dateiverwaltung für die WebBox
ulrich
2018-03-31 0a2df2254edd25d4f2e499f27c5f0630e60f2614
commit | author | age
8d15c3 1
U 2 package de.uhilger.filecms.web;
3
4 import static de.uhilger.filecms.web.Initialiser.FILE_BASE;
5 import de.vogella.rss.model.Feed;
6 import de.vogella.rss.model.FeedMessage;
7 import de.vogella.rss.write.RSSStreamFeedWriter;
8 import java.io.File;
9 import java.io.FileReader;
10 import java.io.IOException;
11 import java.io.Reader;
12 import java.text.SimpleDateFormat;
13 import java.util.ArrayList;
14 import java.util.Calendar;
15 import java.util.Collections;
16 import java.util.Comparator;
17 import java.util.Date;
18 import java.util.GregorianCalendar;
19 import java.util.Iterator;
20 import java.util.List;
21 import java.util.Locale;
22 import java.util.logging.Level;
23 import java.util.logging.Logger;
24 import javax.servlet.ServletContext;
25 import javax.servlet.ServletException;
26 import javax.servlet.ServletOutputStream;
27 import javax.servlet.http.HttpServletRequest;
28 import javax.servlet.http.HttpServletResponse;
29 import org.apache.catalina.servlets.DefaultServlet;
30
31 /**
32  * Das FeedServlet erstellt Feeds von Ordnern der WebBox
33  * 
34  * Eine Maximaltiefe als Parameter soll regeln, wie viele Ordner tief 
35  * Dateien gesucht werden
36  * 
37  */
38 public class FeedServlet extends DefaultServlet {
39   
40   private static final Logger logger = Logger.getLogger(FeedServlet.class.getName());
41   private int maxTiefe = 3;
42   private int maxBeitraege = 5;
43
44   @Override
45   protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
46     ServletOutputStream out = response.getOutputStream();
47     response.setContentType("text/xml");
48     String url = request.getRequestURL().toString();
49     logger.fine(url);
50     String dataUrl = url.replace("feed/", "data/");
51     logger.fine(dataUrl);
52     int pos = dataUrl.indexOf("data/");
53     String zielPfad = dataUrl.substring(pos);
54     logger.fine(zielPfad);
55     ServletContext ctx = request.getServletContext();
56     Object o = ctx.getAttribute(FILE_BASE);
57     if(o instanceof String) {
58       String basis = o.toString();
59       logger.fine(basis);
60       StringBuffer pfad = new StringBuffer();
61       pfad.append(basis);
62       pfad.append(zielPfad.replace("data/", "/www/"));
63       logger.fine(pfad.toString());
64       File dir = new File(pfad.toString());
65       if(dir.isDirectory()) {
0a2df2 66         List beitraege = new ArrayList();
8d15c3 67         collectFiles(dir, 0, beitraege);
U 68         Iterator i = beitraege.iterator();
69         while(i.hasNext()) {
70           File f = (File) i.next();
71           logger.fine(f.getAbsolutePath() + " " + f.lastModified());
72         }
73         writeFeed("Newsfeed", "Neueste Inhalte von Ulrich Hilger", out, beitraege, basis, pfad.toString());
74       } else {
75         logger.fine(dir.getAbsolutePath() + " ist kein Ordner.");
76       }
77     }    
78   }
79   
80   /**
81    * Diese Methode funktioniert nur, wenn entweder ein Ordner uebergeben 
82    * wird, der keine Unterordner enthaelt wie zum Beispiel der Ordner 'neu' 
83    * der Bildersammlung oder ein Ordner, dessen Unterordner 
84    * nach dem Schema Jahr, Monat benannt sind wie bei einem Journal, das 
85    * die Beitraege wie folgt enthaelt:
86    * Journal-Ordner
87    *   2018
88    *     12
89    *     11
90    *     10
91    *     usw.
92    *   2017
93    *     12
94    *     11
95    *     10
96    *     usw.
97    * 
98    * @param out
99    * @param dir
100    * @param tiefe
101    * @param dateizaehler 
102    */
103   private void collectFiles(File dir, int tiefe, List beitraege) {
104     List dirs = new ArrayList();
105     List beitraegeHier = new ArrayList();
106     File[] files = dir.listFiles();
107     for(int i = 0; i < files.length; i++) {
108       if(files[i].isDirectory()) {
109         if(tiefe < maxTiefe) {
110           dirs.add(files[i]);
111         }
112       } else {
113         beitraegeHier.add(files[i]);
114       }
115     }
116     if(dirs.size() > 0) {
117       // hier zuvor die Verzeichnissse absteigend nach Name sortieren      
118       Collections.sort(dirs, new Comparator<File>() {
119         @Override
120         public int compare(File o1, File o2) {
121           return o2.getName().compareTo(o1.getName());
122         }
123       });
124       Iterator i = dirs.iterator();
125       while(i.hasNext() && beitraege.size() < maxBeitraege) {
0a2df2 126         collectFiles((File) i.next(), tiefe+1, beitraege);
8d15c3 127       }
U 128     } 
129     if(beitraegeHier.size() > 0) {
130       // hier zuvor die Liste der Beitraege dieses Ordners nach lastModified absteigend sortieren
131       // dann die neuesten in beitraege aufnehmen, bis die maximale Zahl gesuchter 
132       // neuer Beitraege erreicht ist.
133       
134       Collections.sort(beitraegeHier, new Comparator<File>() {
135         @Override
136         public int compare(File o1, File o2) {
137           int ergebnis;
138           if(o1.lastModified() > o2.lastModified()) {
139             ergebnis = -1;
140           } else if(o2.lastModified() > o1.lastModified()) {
141             ergebnis = 1;
142           } else {
143             ergebnis = 0;
144           }
145           return ergebnis;
146         }
147       });
148       
149       Iterator i = beitraegeHier.iterator();
150       while(i.hasNext() && beitraege.size() < maxBeitraege) {
0a2df2 151         File bf = (File) i.next();
U 152         String nm = bf.getName().toLowerCase();
153         if(nm.endsWith(".htmi") || nm.endsWith(".html") || nm.endsWith(".htm") || 
154            nm.endsWith(".jpg") || nm.endsWith(".jpeg") || nm.endsWith(".png") || 
155            nm.endsWith(".txt")) {
156           beitraege.add(bf);
157         }
8d15c3 158       }
U 159       
160     }
161   }
162   
163   public void writeFeed(String feedTitel, String beschr, ServletOutputStream s, List beitraege, String basis, String pfad) {
0a2df2 164     String copyright = "Copyright (c) 2018 Ulrich Hilger";
U 165     String title = feedTitel;
166     String description = beschr;
167     String language = "de";
168     String link = "https://www.uhilger.de";
169     Calendar cal = new GregorianCalendar();
170     Date creationDate = cal.getTime();
171     SimpleDateFormat date_format = new SimpleDateFormat(
172             "EEE', 'dd' 'MMM' 'yyyy' 'HH:mm:ss' 'Z", Locale.US);
173     String pubdate = date_format.format(creationDate);
174     Feed rssFeed = new Feed(title, link, description, language,
175             copyright, pubdate);
8d15c3 176
0a2df2 177     Iterator i = beitraege.iterator();
U 178     while (i.hasNext()) {
179       File f = (File) i.next();
180       FeedMessage feedEintrag = new FeedMessage();
181       feedEintrag.setTitle(f.getName());
182       //feedEintrag.setDescription("Beschreibung hier");
183       feedEintrag.setAuthor("ulrich Punkt hilger bei web Punkt de (Ulrich Hilger)");
8d15c3 184
0a2df2 185       String urlStr = f.getAbsolutePath();
U 186       urlStr = urlStr.replace(basis, "https://uhilger.de");
187       urlStr = urlStr.replace("www/", "data/");
8d15c3 188
0a2df2 189       logger.fine(urlStr);
U 190
191       feedEintrag.setGuid(urlStr);
192       feedEintrag.setLink(urlStr);
193       logger.fine(f.getName());
194       feedEintrag.setDescription(readFilePart(f, urlStr));
195       rssFeed.getMessages().add(feedEintrag);
196     }
197
198     RSSStreamFeedWriter writer = new RSSStreamFeedWriter(rssFeed, s);
199     //RSSFeedWriter writer = new RSSFeedWriter(rssFeed, pfad + "/articles.rss");
200     //ByteArrayOutputStream bs = new ByteArrayOutputStream();
201     //RSSByteFeedWriter wr = new RSSByteFeedWriter(rssFeed, bs);
202     try {
203       writer.write();
204       //s.print(bs.toString());
205     } catch (Exception e) {
206       logger.log(Level.SEVERE, e.getMessage(), e);
207     }
8d15c3 208   }
U 209   
210   private String readFilePart(File f, String urlStr) {
211     StringBuffer buf = new StringBuffer();
212     Reader reader = null;
213     try {
214       String fn = f.getName().toLowerCase();
215       if(fn.endsWith(".jpg") || fn.endsWith(".jpeg") || fn.endsWith(".png")) {
216         String noExt;
217         String ext;
218         int dotpos = urlStr.lastIndexOf('.');
219         if(dotpos > -1) {
220           noExt = urlStr.substring(0, dotpos);
221           ext = urlStr.substring(dotpos);
222         } else {
223           noExt = "";
224           ext = "";
225         }
226         buf.append("<a href='");
227         buf.append(urlStr);
228         buf.append("'><img src='");
229         buf.append(noExt);
230         buf.append("_kl");
231         buf.append(ext);
232         buf.append("'></a>");
233       } else {
234         reader = new FileReader(f);
235         char[] readBuffer = new char[1024];
236         int charsRead = reader.read(readBuffer);
237         buf.append(readBuffer);
238         reader.close();
239       }
240       return buf.toString();
241     } catch (Exception ex) {
242       logger.log(Level.SEVERE, null, ex);
243       return buf.toString();
244     }
245   }
246   
247   
248 }