Java Web Services via REST bereitstellen
ulrich
2014-12-10 87f8e99e48cc032148f7bb63d0f29c18d04c78a5
src/de/uhilger/transit/web/TransitServletRS.java
@@ -18,29 +18,46 @@
package de.uhilger.transit.web;
import javax.servlet.*;
import de.uhilger.transit.JavaServer;
import de.uhilger.transit.JsonFlatWandler;
import de.uhilger.transit.JsonNiceWandler;
import de.uhilger.transit.JsonWandler;
import de.uhilger.transit.NutzerKontext;
import de.uhilger.transit.XmlWandler;
import java.io.IOException;
import java.io.Writer;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;
import java.util.logging.*;
import de.uhilger.transit.*;
/**
 * Das TransitServlet macht beliebige Klassen und Methoden
 * Das TransitServletRS macht beliebige Klassen und Methoden
 * ueber HTTP zugaenglich. 
 * 
 * <p><b>Achtung:</b>Das TransitServlet sollte nur in einem
 * <p>Methodenaufrufe über dieses Servlet erfolgen in der Form<br>
 * <code>
 * http://server:port/contextpfad/servletpfad/name.der.package.Klasse/methode/antwortformat/param1/param2/../paramN
 * </code></p>
 *
 * <p>Standardmäßig werden von Transit die Antwortformate JSON, JSONFLAT und XML
 * bereitgestellt. Über die Schnittstelle Wandler lassen sich weitere Formate
 * hinzufügen.</p>
 *
 * <p><b>Achtung:</b>Das TransitServletRS sollte nur in einem
 * per Authentifizierung und Autorisierung geschuetzten 
 * Bereich einer Webanwendung bereitgestellt werden da andernfalls 
 * durchweg alle Klassen und Methoden, die sich auf dem Server 
 * finden, zugaenglich werden.</p>
 * 
 * <p>Fuer die Bereitstellung von Funktionen ist eine Berechtigungspruefung  
 * noetig, die am besten in Form eines Filters implementiert wird.</p>
 * noetig, die am besten in Form eines Filters implementiert wird.
 * Transit stellt hierfür die Klassen Waechter und RechtePruefer bereit.</p>
 * 
 * @author Copyright (c) Ulrich Hilger, http://uhilger.de
 * @author Published under the terms and conditions of
@@ -48,26 +65,13 @@
 * 
 * @version 1, September 16, 2012
 */
public class TransitServletRS extends HttpServlet {
public class TransitServletRS extends AbstractServlet {
  /** Proforma Konstante fuer Schnittstelle Serializable */
  public static final long serialVersionUID = 42L;
  
  private static final Logger logger = Logger.getLogger(TransitServletRS.class.getName());
  public static final String MIME_JSON = "application/json";
  public static final String MIME_XML = "text/xml";
  private static final String[] specialChars = {new String("\u00c4"), new String("\u00d6"),
      new String("\u00dc"), new String("\u00e4"), new String("\u00f6"), new String("\u00fc"), new String("\u00df")};
  private String klassen;
  public void init(ServletConfig servletConfig) throws ServletException{
    this.klassen = servletConfig.getInitParameter("klassen");
    super.init(servletConfig);
  }
  /**
   * Eine Anfrage via HTTP GET verarbeiten
   * 
@@ -128,44 +132,21 @@
    JavaServer server = null;
    try {
      /*
      String klassenName = null;
      String methodenName = null;
      List parameterListe = new ArrayList();
      String formatName = null;
      Enumeration en = req.getParameterNames();
      while(en.hasMoreElements()) {
        String pName = en.nextElement().toString();
        String[] pWerte = req.getParameterValues(pName);
        if(pName.equals(CLASS_NAME)) {
          klassenName = pWerte[0];
        } else if(pName.equals(METHOD_NAME)) {
          methodenName = pWerte[0];
        } else if(pName.equals(FORMAT_NAME)) {
          formatName = pWerte[0];
        } else {
          for(int i = 0; i < pWerte.length; i++) {
            parameterListe.add(pWerte[i]);
          }
        }
      }
      */
      /*
        http://server:port/contextpfad/servletpfad/de.irgend.eine.Klasse/methode/format/param1/param2/../paramN
        wird zu
        elemente[0] = /
        elemente[1] = de.irgend.eine.Klasse
        elemente[2] = methode
        elemente[3] = format
        elemente[4]-[n] = param1
        elemente[4]-[n] = param1 - paramn
      */
      
      String pathInfo = req.getPathInfo();
      logger.info("pathInfo: " + pathInfo);
      logger.log(Level.INFO, "pathInfo: {0}", pathInfo);
      String[] elemente = pathInfo.split("/");
      String klassenName = elemente[1];
      StringBuffer buf = new StringBuffer();
      if(this.klassen.contains(klassenName)) {
      StringBuilder buf = new StringBuilder();
      if(istErlaubt(klassenName)) {
        String methodenName = elemente[2];
        String formatName = elemente[3];
        List parameterListe = new ArrayList();
@@ -178,13 +159,14 @@
        server = new JavaServer();
        server.wandlerHinzufuegen(new JsonWandler());
        server.wandlerHinzufuegen(new JsonFlatWandler());
        server.wandlerHinzufuegen(new JsonNiceWandler());
        server.wandlerHinzufuegen(new XmlWandler());
        Class cls = server.klasseFinden(klassenName);
        if(cls != null) {
          Object o = cls.newInstance();
          if(o != null) {
            if(o instanceof NutzerKontext) {
              ((NutzerKontext) o).setNutzerId(Waechter.getUserName(req));
              ((NutzerKontext) o).setNutzerId(getUserName(req));
            }
            if(o instanceof WebKontext) {
              ((WebKontext) o).setServletContext(getServletContext());
@@ -220,7 +202,7 @@
          buf.append("<p>Ergebnis von server.klasseFinden ist null (Klasse nicht gefunden?).</p>");
        }
      } else {
        buf.append("<p>Klasse " + klassenName + " nicht erlaubt.</p>");
        buf.append("<p>Klasse ").append(klassenName).append(" nicht erlaubt.</p>");
      }
      Writer w = resp.getWriter();
      w.write(buf.toString());
@@ -235,15 +217,5 @@
      }
    }
  }    
  public String escapeHtml(String text) {
    text = text.replace(specialChars[0], "&Auml;");
    text = text.replace(specialChars[1], "&Ouml;");
    text = text.replace(specialChars[2], "&Uuml;");
    text = text.replace(specialChars[3], "&auml;");
    text = text.replace(specialChars[4], "&ouml;");
    text = text.replace(specialChars[5], "&uuml;");
    text = text.replace(specialChars[6], "&szlig;");
    return text;
  }
}