Java Web Services via REST bereitstellen
ulrich
2014-11-16 1da1cadfe51b9fc9970091e0d2ee6bedbcfd859b
src/de/uhilger/transit/web/TransitServlet.java
@@ -15,86 +15,91 @@
    You should have received a copy of the GNU Affero General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/
package de.uhilger.transit.web;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.Writer;
import java.io.InputStream;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Enumeration;
import java.util.Map;
import java.util.ArrayList;
import java.util.List;
import de.uhilger.transit.*;
/**
 * Das TransitServlet macht beliebige Klassen und Methoden
 * ueber HTTP zugaenglich.
 * Das TransitServlet macht beliebige Klassen und Methoden ueber HTTP
 * zugaenglich.
 * 
 * <p><b>Achtung:</b>Das TransitServlet 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>
 * <b>Achtung:</b>Das TransitServlet 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>
 * <p>
 * Fuer die Bereitstellung von Funktionen ist eine Berechtigungspruefung noetig,
 * die am besten in Form eines Filters implementiert wird.</p>
 * 
 * @author Copyright (c) Ulrich Hilger, http://uhilger.de
 * @author Published under the terms and conditions of
 * the <a href="http://www.gnu.org/licenses/agpl-3.0" target="_blank">GNU Affero General Public License</a>
 * @author Published under the terms and conditions of the
 * <a href="http://www.gnu.org/licenses/agpl-3.0" target="_blank">GNU Affero
 * General Public License</a>
 * 
 * @version 1, September 16, 2012
 */
public class TransitServlet extends HttpServlet {
public class TransitServlet extends AbstractServlet {
  /** Proforma Konstante fuer Schnittstelle Serializable */
  /**
   * Proforma Konstante fuer Schnittstelle Serializable
   */
  public static final long serialVersionUID = 42L;
  
  /** Name des Parameters Klasse */
  /**
   * Name des Parameters Klasse
   */
  public static final String CLASS_NAME = "c";
  /** Name des Parameters Methode */
  /**
   * Name des Parameters Methode
   */
  public static final String METHOD_NAME = "m";
  /** Name des Parameters Parameter */
  /**
   * Name des Parameters Parameter
   */
  public static final String PARAMETER_NAME = "p";
  /** Name des Parameters Format */
  /**
   * Name des Parameters Format
   */
  public static final String FORMAT_NAME = "f";
  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")};
      
  /**
   * Eine Anfrage via HTTP GET verarbeiten
   * 
   * <p>Folgende Parameter werden erwartet:</p>
   * <p>c: Klasse, z.B. de.uhilger.test.EineKlasse<br>
   * <p>
   * Folgende Parameter werden erwartet:</p>
   * <p>
   * c: Klasse, z.B. de.uhilger.test.EineKlasse<br>
   * m: Methode<br>
   * p: Erster Parameter der Methode in der Reihenfolge der Deklaration<br>
   * p: Zweiter Parameter der Methode in der Reihenfolge der Deklaration<br>
   *  .<br>
   *  .<br>
   * .
   * <br>
   * .
   * <br>
   * p: Letzter Parameter der Methode in der Reihenfolge der Deklaration</p>
   * 
   * <p>Das Ergebnis der Verarbeitung wird in Form einer Zeichenkette im
   * Format der JavaScript Object Notation (JSON) in die Antwort der
   * HTTP-Anfrage geschrieben.</p>
   * <p>
   * Das Ergebnis der Verarbeitung wird in Form einer Zeichenkette im Format der
   * JavaScript Object Notation (JSON) in die Antwort der HTTP-Anfrage
   * geschrieben.</p>
   * 
   * @param req die Anfrage, die verarbeitet werden soll
   * @param resp das Objekt, mit dem das Ergebnis der Verarbeitung mitgeteilt wird
   * @param resp das Objekt, mit dem das Ergebnis der Verarbeitung mitgeteilt
   * wird
   */
  @Override
  protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
@@ -104,21 +109,27 @@
  /**
   * Eine Anfrage via HTTP POST verarbeiten
   * 
   * <p>Folgende Parameter werden erwartet:</p>
   * <p>c: Klasse, z.B. de.uhilger.test.EineKlasse<br>
   * <p>
   * Folgende Parameter werden erwartet:</p>
   * <p>
   * c: Klasse, z.B. de.uhilger.test.EineKlasse<br>
   * m: Methode<br>
   * p: Erster Parameter der Methode in der Reihenfolge der Deklaration<br>
   * p: Zweiter Parameter der Methode in der Reihenfolge der Deklaration<br>
   *  .<br>
   *  .<br>
   * .
   * <br>
   * .
   * <br>
   * p: Letzter Parameter der Methode in der Reihenfolge der Deklaration</p>
   * 
   * <p>Das Ergebnis der Verarbeitung wird in Form einer Zeichenkette im
   * Format der JavaScript Object Notation (JSON) in die Antwort der
   * HTTP-Anfrage geschrieben.</p>
   * <p>
   * Das Ergebnis der Verarbeitung wird in Form einer Zeichenkette im Format der
   * JavaScript Object Notation (JSON) in die Antwort der HTTP-Anfrage
   * geschrieben.</p>
   * 
   * @param req die Anfrage, die verarbeitet werden soll
   * @param resp das Objekt, mit dem das Ergebnis der Verarbeitung mitgeteilt wird
   * @param resp das Objekt, mit dem das Ergebnis der Verarbeitung mitgeteilt
   * wird
   */
  @Override
  protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
@@ -126,11 +137,12 @@
  }
  
  /**
   * Diese Methode verarbeitet die Anfragen, die via HTTP GET und HTTP POST
   * an dieses Servlet gestellt werden.
   * Diese Methode verarbeitet die Anfragen, die via HTTP GET und HTTP POST an
   * dieses Servlet gestellt werden.
   * 
   * @param req die Anfrage, die verarbeitet werden soll
   * @param resp das Objekt, mit dem das Ergebnis der Verarbeitung mitgeteilt wird
   * @param resp das Objekt, mit dem das Ergebnis der Verarbeitung mitgeteilt
   * wird
   */
  @SuppressWarnings("unchecked")
  public void anfrageAusfuehren(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
@@ -157,8 +169,8 @@
        }
      }
      Object[] parameter = parameterListe.toArray(new Object[0]);
      StringBuffer buf = new StringBuffer();
      StringBuilder buf = new StringBuilder();
      if (istErlaubt(klassenName)) {
      server = new JavaServer();
      server.wandlerHinzufuegen(new JsonWandler());
      server.wandlerHinzufuegen(new JsonFlatWandler());
@@ -168,7 +180,7 @@
        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());
@@ -203,6 +215,9 @@
      } else {
        buf.append("<p>Ergebnis von server.klasseFinden ist null (Klasse nicht gefunden?).</p>");
      }
      } else {
        buf.append("<p>Klasse " + klassenName + " nicht erlaubt.</p>");
      }
      Writer w = resp.getWriter();
      w.write(buf.toString());
      w.flush();
@@ -217,14 +232,4 @@
    }
  }    
    
  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;
  }
}