Basisklassen zum Modul jdk.httpserver
ulrich
2021-07-03 73b5b85c1c7caf1095ae004cb8efb7b73f360099
commit | author | age
caa4d1 1 /*
U 2   http-base - Extensions to jdk.httpserver
3   Copyright (C) 2021  Ulrich Hilger
4
5   This program is free software: you can redistribute it and/or modify
6   it under the terms of the GNU Affero General Public License as
7   published by the Free Software Foundation, either version 3 of the
8   License, or (at your option) any later version.
9
10   This program is distributed in the hope that it will be useful,
11   but WITHOUT ANY WARRANTY; without even the implied warranty of
12   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13   GNU Affero General Public License for more details.
14
15   You should have received a copy of the GNU Affero General Public License
16   along with this program.  If not, see <https://www.gnu.org/licenses/>.
17  */
18 package de.uhilger.httpserver.base.handler;
19
20 import com.sun.net.httpserver.HttpExchange;
21 import com.sun.net.httpserver.HttpHandler;
22 import java.io.IOException;
23 import java.lang.reflect.InvocationTargetException;
24 import java.util.HashMap;
25 import java.util.Iterator;
26 import java.util.Map;
27 import java.util.Set;
28 import java.util.logging.Level;
29 import java.util.logging.Logger;
30
31 /**
32  * Der PatternDelegator delegiert HTTP-Aufrufe an HttpHandler, indem 
33  * der URL des Aufrufs mit einem Muster verglichen wird. Zu einem bestimmten 
34  * Muster passende URLs werden an den zum Muster hinterlegten HttpHandler 
35  * weitergegeben.
36  * 
37  * Wird kein passendes Muster gefunden, reicht der PatternDelegator 
38  * die Anfrage an den FileHandler weiter, wodurch - sofern vorhanden - die 
39  * vom URL bezeichnete Ressource ausgeliefert wird.
40  * 
41  * @author Ulrich Hilger
42  * @version 1, 29.06.2021
43  */
44 public class PatternDelegator extends FileHandler {
45   
46   /** Der Logger dieser Klasse */
47   private static final Logger logger = Logger.getLogger(PatternDelegator.class.getName());
48   
49   /** die HttpHandler, an die dieser Delegator passende Anfragen weitergibt */
50   //private Map<String, HttpHandler> handlers;
51   private Map<String, HandlerDescriptor> handlers;
52
53   /**
54    * Ein neues Objekt der Klasse PatternDelegator erzeugen
55    */
56   public PatternDelegator() {
57     //super(absoluteDirectoryPathAndName);
58     handlers = new HashMap();
59   }
60   
61   /**
62    * Diesem Delegator einen HttpHandler hinzufuegen
63    * 
64    * @param pattern  das Muster, das ein URL treffen muss, damit der hier 
65    * hinzugefuegte Handler aufgerufen wird
66    * @param handler  der Handler, an den dieser Delegator eine Anfrage 
67    * delegiert, wenn das Muster passt
68    */
69   public void addHandler(String pattern, HandlerDescriptor handler) {
70     handlers.put(pattern, handler);
71   }
72
73   /**
74    * Einen HttpHandler von diesem Delegator entfernen
75    * 
76    * @param pattern  das Muster, das dem HttpHandler zugeordnet ist, der 
77    * entfernt werden soll
78    */
79   public void removeHandler(String pattern) {
80     handlers.remove(pattern);
81   }
82   
83   /**
84    * Eine HTTP-Anfrage ausfuehren, indem das Muster des URL mit den 
85    * Mustern verglichen wird, die fuer diesen Delegator hinterlegt wurden 
86    * und die Anfrage an den HttpHandler delegiert wird, dessen Aufrufmuster 
87    * passt
88    * 
89    * @param exchange  das Objekt mit allen Infos zu Anfrage und Antwort
90    * @throws IOException wenn etwas nicht geklappt hat
91    */
92   @Override
93   public void handle(HttpExchange exchange) throws IOException {
94     String path = exchange.getRequestURI().getPath();
95     logger.fine("path: " + path);
96     Set keys = handlers.keySet();
97     Iterator<String> i = keys.iterator();
98     boolean noMatch = true;
99     while(i.hasNext() && noMatch) {
100       String regex = i.next();
101       logger.fine("regex: " + regex);
102       if(path.matches(regex)) {
103         try {
104           noMatch = false;
105           logger.fine("match");
106           //HttpHandler handler = handlers.get(regex);
107           HandlerDescriptor hd = handlers.get(regex);
108           String handlerClass = hd.getHandlerClassName();
109           Object o = Class.forName(handlerClass).getConstructors()[0].newInstance();
110           if(o instanceof AttributeHandler) {
111             AttributeHandler handler = (AttributeHandler) o;
112             Map<String, String> attrs = hd.getAttributes();
113             Iterator<String> it = attrs.keySet().iterator();
114             while(it.hasNext()) {
115               String key = it.next();
116               String value = attrs.get(key);
117               handler.setAttribute(key, value);
118             }
119             handler.handle(exchange);      
120           } else if(o instanceof HttpHandler) {
121             HttpHandler handler = (HttpHandler) o;
122             handler.handle(exchange);      
123           }
124         } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException ex) {
125           Logger.getLogger(PatternDelegator.class.getName()).log(Level.SEVERE, null, ex);
126         }
127       }
128     }
129     if(noMatch) {
130       super.handle(exchange);
131     }
132   }
133   
134 }