Dateiverwaltung für die WebBox
ulrich
2018-03-31 8d15c3c95de63fa08706c488f81479153e4fd9f4
Feeds hinzugefuegt, Feinschliff fehlt noch
3 files modified
1 files added
263 ■■■■■ changed files
README.md 11 ●●●● patch | view | raw | blame | history
src/java/de/uhilger/filecms/web/FeedServlet.java 242 ●●●●● patch | view | raw | blame | history
src/java/logging.properties 2 ●●● patch | view | raw | blame | history
web/WEB-INF/web.xml 8 ●●●●● patch | view | raw | blame | history
README.md
@@ -18,7 +18,7 @@
### Konfiguration
Die Dateiverwaltung arbeitet mit relativen Pfadangaben und erhält den Ablageort von Dateien über die Angabe `de.uhilger.filecms.web.Initialiser.FILE_BASE` des Servlet-Kontext. Diese Angabe wird beim Start der Dateiverwaltung gebildet und kann im Deployment Descritor der Dateiverwaltung (Datei `WEB-INF/web.xml`) mit dem Context-Parameter `datenAblage` festgelegt werden.
Die Dateiverwaltung arbeitet mit relativen Pfadangaben und erhält den Ablageort von Dateien über die Angabe `de.uhilger.filecms.web.Initialiser.FILE_BASE` des Servlet-Kontext. Diese Angabe wird beim Start der Dateiverwaltung gebildet und kann im Deployment Descritor der Dateiverwaltung (Datei `WEB-INF/web.xml`) mit dem Context-Parameter `datenAblage` festgelegt werden.
#### Automatische Ermittlung des Ablageortes
@@ -76,7 +76,7 @@
Das Webarchiv der Dateiverwaltung liegt anschließend als `$FILE-CMS/dist/file-cms.war` fertig zum Deployment bereit.
Die im obigen Build-Skript bereits mit `$CATALINA_BASE` gekennzeichneten Klassenbibliotheken werden nicht als Teil des Webarchivs der Dateiverwaltung gebaut und im Verzeichnis `$CATALINA_BASE/lib` der WebBox erwartet.
Die im obigen Build-Skript bereits mit `$CATALINA_BASE` gekennzeichneten Klassenbibliotheken werden nicht als Teil des Webarchivs der Dateiverwaltung gebaut und im Verzeichnis `$CATALINA_BASE/lib` der WebBox erwartet.
### Distributionsalternative
@@ -110,6 +110,11 @@
- [Moment](http://momentjs.com/)
- [Numeral](http://numeraljs.com/)
## Geplante Erweiterungen
+ Packen von Ordnern
+ Feeds für Ordner
## Lizenz
Die Dateiverwaltung wird zu den Bedingungen der [GNU Affero General Public License](/gitblit/doc/file-cms.git/master/web!agpl.txt) bereitgestellt. Die von der Dateiverwaltung verwendeten Komponenten unterliegen zum Teil anderen Lizenzen. Deren Nutzungsbedingungen sind an den Quellen der Komponenten angegeben.
Die Dateiverwaltung wird zu den Bedingungen der [GNU Affero General Public License](/gitblit/doc/file-cms.git/master/web!agpl.txt) bereitgestellt. Die von der Dateiverwaltung verwendeten Komponenten unterliegen zum Teil anderen Lizenzen. Deren Nutzungsbedingungen sind an den Quellen der Komponenten angegeben.
src/java/de/uhilger/filecms/web/FeedServlet.java
New file
@@ -0,0 +1,242 @@
package de.uhilger.filecms.web;
import static de.uhilger.filecms.web.Initialiser.FILE_BASE;
import de.vogella.rss.model.Feed;
import de.vogella.rss.model.FeedMessage;
import de.vogella.rss.write.RSSStreamFeedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.catalina.servlets.DefaultServlet;
/**
 * Das FeedServlet erstellt Feeds von Ordnern der WebBox
 *
 * Eine Maximaltiefe als Parameter soll regeln, wie viele Ordner tief
 * Dateien gesucht werden
 *
 */
public class FeedServlet extends DefaultServlet {
  private static final Logger logger = Logger.getLogger(FeedServlet.class.getName());
  private int maxTiefe = 3;
  private int maxBeitraege = 5;
  @Override
  protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
    ServletOutputStream out = response.getOutputStream();
    response.setContentType("text/xml");
    String url = request.getRequestURL().toString();
    logger.fine(url);
    String dataUrl = url.replace("feed/", "data/");
    logger.fine(dataUrl);
    int pos = dataUrl.indexOf("data/");
    String zielPfad = dataUrl.substring(pos);
    logger.fine(zielPfad);
    ServletContext ctx = request.getServletContext();
    Object o = ctx.getAttribute(FILE_BASE);
    if(o instanceof String) {
      String basis = o.toString();
      logger.fine(basis);
      StringBuffer pfad = new StringBuffer();
      pfad.append(basis);
      pfad.append(zielPfad.replace("data/", "/www/"));
      logger.fine(pfad.toString());
      File dir = new File(pfad.toString());
      if(dir.isDirectory()) {
        ArrayList beitraege = new ArrayList();
        collectFiles(dir, 0, beitraege);
        Iterator i = beitraege.iterator();
        while(i.hasNext()) {
          File f = (File) i.next();
          logger.fine(f.getAbsolutePath() + " " + f.lastModified());
        }
        writeFeed("Newsfeed", "Neueste Inhalte von Ulrich Hilger", out, beitraege, basis, pfad.toString());
      } else {
        logger.fine(dir.getAbsolutePath() + " ist kein Ordner.");
      }
    }
  }
  /**
   * Diese Methode funktioniert nur, wenn entweder ein Ordner uebergeben
   * wird, der keine Unterordner enthaelt wie zum Beispiel der Ordner 'neu'
   * der Bildersammlung oder ein Ordner, dessen Unterordner
   * nach dem Schema Jahr, Monat benannt sind wie bei einem Journal, das
   * die Beitraege wie folgt enthaelt:
   * Journal-Ordner
   *   2018
   *     12
   *     11
   *     10
   *     usw.
   *   2017
   *     12
   *     11
   *     10
   *     usw.
   *
   * @param out
   * @param dir
   * @param tiefe
   * @param dateizaehler
   */
  private void collectFiles(File dir, int tiefe, List beitraege) {
    List dirs = new ArrayList();
    List beitraegeHier = new ArrayList();
    File[] files = dir.listFiles();
    for(int i = 0; i < files.length; i++) {
      if(files[i].isDirectory()) {
        if(tiefe < maxTiefe) {
          dirs.add(files[i]);
        }
      } else {
        beitraegeHier.add(files[i]);
      }
    }
    if(dirs.size() > 0) {
      // hier zuvor die Verzeichnissse absteigend nach Name sortieren
      Collections.sort(dirs, new Comparator<File>() {
        @Override
        public int compare(File o1, File o2) {
          return o2.getName().compareTo(o1.getName());
        }
      });
      Iterator i = dirs.iterator();
      while(i.hasNext() && beitraege.size() < maxBeitraege) {
        collectFiles((File) i.next(), ++tiefe, beitraege);
      }
    }
    if(beitraegeHier.size() > 0) {
      // hier zuvor die Liste der Beitraege dieses Ordners nach lastModified absteigend sortieren
      // dann die neuesten in beitraege aufnehmen, bis die maximale Zahl gesuchter
      // neuer Beitraege erreicht ist.
      Collections.sort(beitraegeHier, new Comparator<File>() {
        @Override
        public int compare(File o1, File o2) {
          int ergebnis;
          if(o1.lastModified() > o2.lastModified()) {
            ergebnis = -1;
          } else if(o2.lastModified() > o1.lastModified()) {
            ergebnis = 1;
          } else {
            ergebnis = 0;
          }
          return ergebnis;
        }
      });
      Iterator i = beitraegeHier.iterator();
      while(i.hasNext() && beitraege.size() < maxBeitraege) {
        beitraege.add(i.next());
      }
    }
  }
  public void writeFeed(String feedTitel, String beschr, ServletOutputStream s, List beitraege, String basis, String pfad) {
        String copyright = "Copyright (c) 2018 Ulrich Hilger";
        String title = feedTitel;
        String description = beschr;
        String language = "de";
        String link = "https://www.uhilger.de";
        Calendar cal = new GregorianCalendar();
        Date creationDate = cal.getTime();
        SimpleDateFormat date_format = new SimpleDateFormat(
                "EEE', 'dd' 'MMM' 'yyyy' 'HH:mm:ss' 'Z", Locale.US);
        String pubdate = date_format.format(creationDate);
        Feed rssFeed = new Feed(title, link, description, language,
                copyright, pubdate);
        Iterator i = beitraege.iterator();
        while(i.hasNext()) {
            File f = (File) i.next();
            FeedMessage feedEintrag = new FeedMessage();
            feedEintrag.setTitle(f.getName());
            //feedEintrag.setDescription("Beschreibung hier");
            feedEintrag.setAuthor("ulrich Punkt hilger bei web Punkt de (Ulrich Hilger)");
            String urlStr = f.getAbsolutePath();
            urlStr = urlStr.replace(basis, "https://uhilger.de");
            urlStr = urlStr.replace("www/", "data/");
            logger.fine(urlStr);
            feedEintrag.setGuid(urlStr);
            feedEintrag.setLink(urlStr);
            logger.fine(f.getName());
            feedEintrag.setDescription(readFilePart(f, urlStr));
            rssFeed.getMessages().add(feedEintrag);
        }
        RSSStreamFeedWriter writer = new RSSStreamFeedWriter(rssFeed, s);
        //RSSFeedWriter writer = new RSSFeedWriter(rssFeed, pfad + "/articles.rss");
        //ByteArrayOutputStream bs = new ByteArrayOutputStream();
        //RSSByteFeedWriter wr = new RSSByteFeedWriter(rssFeed, bs);
        try {
          writer.write();
          //s.print(bs.toString());
        } catch (Exception e) {
          logger.log(Level.SEVERE, e.getMessage(), e);
        }
  }
  private String readFilePart(File f, String urlStr) {
    StringBuffer buf = new StringBuffer();
    Reader reader = null;
    try {
      String fn = f.getName().toLowerCase();
      if(fn.endsWith(".jpg") || fn.endsWith(".jpeg") || fn.endsWith(".png")) {
        String noExt;
        String ext;
        int dotpos = urlStr.lastIndexOf('.');
        if(dotpos > -1) {
          noExt = urlStr.substring(0, dotpos);
          ext = urlStr.substring(dotpos);
        } else {
          noExt = "";
          ext = "";
        }
        buf.append("<a href='");
        buf.append(urlStr);
        buf.append("'><img src='");
        buf.append(noExt);
        buf.append("_kl");
        buf.append(ext);
        buf.append("'></a>");
      } else {
        reader = new FileReader(f);
        char[] readBuffer = new char[1024];
        int charsRead = reader.read(readBuffer);
        buf.append(readBuffer);
        reader.close();
      }
      return buf.toString();
    } catch (Exception ex) {
      logger.log(Level.SEVERE, null, ex);
      return buf.toString();
    }
  }
}
src/java/logging.properties
@@ -65,4 +65,4 @@
# messages:
# com.xyz.foo.level = SEVERE
de.uhilger.filecms.handlers = java.util.logging.FileHandler, java.util.logging.ConsoleHandler
de.uhilger.filecms.level = FINER
de.uhilger.filecms.level = INFO
web/WEB-INF/web.xml
@@ -41,6 +41,10 @@
        <servlet-name>UploadeServlet</servlet-name>
        <servlet-class>de.uhilger.filecms.web.UploadServlet</servlet-class>
    </servlet>
    <servlet>
        <servlet-name>Feeder</servlet-name>
        <servlet-class>de.uhilger.filecms.web.FeedServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>TransitRS</servlet-name>
        <url-pattern>/rpc/*</url-pattern>
@@ -57,6 +61,10 @@
        <servlet-name>UploadeServlet</servlet-name>
        <url-pattern>/api/upload</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>Feeder</servlet-name>
        <url-pattern>/feed/*</url-pattern>
    </servlet-mapping>
    <session-config>
        <session-timeout>
            30