Basisklassen zum Modul jdk.httpserver
ulrich
2021-07-03 f5728b1d24410f076777c1a6cd409c5e65d72051
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;
23abc6 21 import de.uhilger.httpserver.base.actor.DelegateActor;
caa4d1 22 import java.io.IOException;
U 23 import java.util.HashMap;
24 import java.util.Map;
25 import java.util.logging.Logger;
26
27 /**
28  * Der PatternDelegator delegiert HTTP-Aufrufe an HttpHandler, indem 
29  * der URL des Aufrufs mit einem Muster verglichen wird. Zu einem bestimmten 
30  * Muster passende URLs werden an den zum Muster hinterlegten HttpHandler 
31  * weitergegeben.
32  * 
33  * Wird kein passendes Muster gefunden, reicht der PatternDelegator 
34  * die Anfrage an den FileHandler weiter, wodurch - sofern vorhanden - die 
35  * vom URL bezeichnete Ressource ausgeliefert wird.
36  * 
37  * @author Ulrich Hilger
38  * @version 1, 29.06.2021
39  */
40 public class PatternDelegator extends FileHandler {
41   
42   /** Der Logger dieser Klasse */
43   private static final Logger logger = Logger.getLogger(PatternDelegator.class.getName());
44   
45   /** die HttpHandler, an die dieser Delegator passende Anfragen weitergibt */
46   //private Map<String, HttpHandler> handlers;
47   private Map<String, HandlerDescriptor> handlers;
48
49   /**
50    * Ein neues Objekt der Klasse PatternDelegator erzeugen
51    */
52   public PatternDelegator() {
53     //super(absoluteDirectoryPathAndName);
54     handlers = new HashMap();
55   }
56   
57   /**
58    * Diesem Delegator einen HttpHandler hinzufuegen
59    * 
60    * @param pattern  das Muster, das ein URL treffen muss, damit der hier 
61    * hinzugefuegte Handler aufgerufen wird
62    * @param handler  der Handler, an den dieser Delegator eine Anfrage 
63    * delegiert, wenn das Muster passt
64    */
65   public void addHandler(String pattern, HandlerDescriptor handler) {
66     handlers.put(pattern, handler);
67   }
68
69   /**
70    * Einen HttpHandler von diesem Delegator entfernen
71    * 
72    * @param pattern  das Muster, das dem HttpHandler zugeordnet ist, der 
73    * entfernt werden soll
74    */
75   public void removeHandler(String pattern) {
76     handlers.remove(pattern);
77   }
78   
79   /**
80    * Eine HTTP-Anfrage ausfuehren, indem das Muster des URL mit den 
81    * Mustern verglichen wird, die fuer diesen Delegator hinterlegt wurden 
82    * und die Anfrage an den HttpHandler delegiert wird, dessen Aufrufmuster 
83    * passt
84    * 
85    * @param exchange  das Objekt mit allen Infos zu Anfrage und Antwort
86    * @throws IOException wenn etwas nicht geklappt hat
87    */
88   @Override
89   public void handle(HttpExchange exchange) throws IOException {
23abc6 90     boolean noMatch = new DelegateActor().handle(exchange, handlers);
caa4d1 91     if(noMatch) {
U 92       super.handle(exchange);
93     }
94   }
95   
96 }