Dateiverwaltung für die WebBox
ulrich
2018-03-31 8d15c3c95de63fa08706c488f81479153e4fd9f4
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()) {
66         ArrayList beitraege = new ArrayList();
67         collectFiles(dir, 0, beitraege);
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) {
126         collectFiles((File) i.next(), ++tiefe, beitraege);
127       }
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) {
151         beitraege.add(i.next());
152       }
153       
154     }
155   }
156   
157   public void writeFeed(String feedTitel, String beschr, ServletOutputStream s, List beitraege, String basis, String pfad) {
158         String copyright = "Copyright (c) 2018 Ulrich Hilger";
159         String title = feedTitel;
160         String description = beschr;
161         String language = "de";
162         String link = "https://www.uhilger.de";
163         Calendar cal = new GregorianCalendar();
164         Date creationDate = cal.getTime();
165         SimpleDateFormat date_format = new SimpleDateFormat(
166                 "EEE', 'dd' 'MMM' 'yyyy' 'HH:mm:ss' 'Z", Locale.US);
167         String pubdate = date_format.format(creationDate);
168         Feed rssFeed = new Feed(title, link, description, language,
169                 copyright, pubdate);
170
171         Iterator i = beitraege.iterator();
172         while(i.hasNext()) {
173             File f = (File) i.next();
174             FeedMessage feedEintrag = new FeedMessage();
175             feedEintrag.setTitle(f.getName());
176             //feedEintrag.setDescription("Beschreibung hier");
177             feedEintrag.setAuthor("ulrich Punkt hilger bei web Punkt de (Ulrich Hilger)");
178             
179             String urlStr = f.getAbsolutePath();
180             urlStr = urlStr.replace(basis, "https://uhilger.de");
181             urlStr = urlStr.replace("www/", "data/");
182
183             logger.fine(urlStr);
184             
185             feedEintrag.setGuid(urlStr);
186             feedEintrag.setLink(urlStr);
187             logger.fine(f.getName());
188             feedEintrag.setDescription(readFilePart(f, urlStr));
189             rssFeed.getMessages().add(feedEintrag);
190         }
191
192         RSSStreamFeedWriter writer = new RSSStreamFeedWriter(rssFeed, s);
193         //RSSFeedWriter writer = new RSSFeedWriter(rssFeed, pfad + "/articles.rss");
194         //ByteArrayOutputStream bs = new ByteArrayOutputStream();
195         //RSSByteFeedWriter wr = new RSSByteFeedWriter(rssFeed, bs);
196         try {
197           writer.write();
198           //s.print(bs.toString());
199         } catch (Exception e) {
200           logger.log(Level.SEVERE, e.getMessage(), e);
201         }    
202   }
203   
204   private String readFilePart(File f, String urlStr) {
205     StringBuffer buf = new StringBuffer();
206     Reader reader = null;
207     try {
208       String fn = f.getName().toLowerCase();
209       if(fn.endsWith(".jpg") || fn.endsWith(".jpeg") || fn.endsWith(".png")) {
210         String noExt;
211         String ext;
212         int dotpos = urlStr.lastIndexOf('.');
213         if(dotpos > -1) {
214           noExt = urlStr.substring(0, dotpos);
215           ext = urlStr.substring(dotpos);
216         } else {
217           noExt = "";
218           ext = "";
219         }
220         buf.append("<a href='");
221         buf.append(urlStr);
222         buf.append("'><img src='");
223         buf.append(noExt);
224         buf.append("_kl");
225         buf.append(ext);
226         buf.append("'></a>");
227       } else {
228         reader = new FileReader(f);
229         char[] readBuffer = new char[1024];
230         int charsRead = reader.read(readBuffer);
231         buf.append(readBuffer);
232         reader.close();
233       }
234       return buf.toString();
235     } catch (Exception ex) {
236       logger.log(Level.SEVERE, null, ex);
237       return buf.toString();
238     }
239   }
240   
241   
242 }