Advertisement
NelloRizzo

Un Reqeust Builder

Oct 27th, 2020
250
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 6.83 KB | None | 0 0
  1. package corso.java.mypersonalblog.helpers;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.Dictionary;
  5. import java.util.Enumeration;
  6. import java.util.HashMap;
  7. import java.util.Hashtable;
  8. import java.util.List;
  9. import java.util.Map;
  10.  
  11. /**
  12.  * Questa classe si occuperà di costruire la stringa di request
  13.  * a partire da tutti i pezzi che la compongono.
  14.  */
  15. public class RequestBuilder {
  16.     // Una URL è costituita da tante parti:
  17.     // authority://host:port/path_1/.../path_n?p1=v1&...&pn=vn
  18.     // URL Google: https://www.google.com:80/search?q=testocercato
  19.     /**
  20.      * Memorizza l'authority della URL.
  21.      */
  22.     private String authority;
  23.     /**
  24.      * Memorizza l'host al quale collegarci.
  25.      */
  26.     private String host;
  27.  
  28.     /**
  29.      * Legge il valore del campo authority.
  30.      */
  31.     public String getAuthority() {
  32.         return authority;
  33.     }
  34.  
  35.     // Template builder serve per un NOTAZIONE FLUENTE:
  36.     // RequestBuilder builder = new RequestBuilder().setAuthority("http").setHost("192.168.1.1").setPort(8080)
  37.  
  38.     /**
  39.      * Imposta il campo authority.
  40.      *
  41.      * @param authority il valore del campo authority.
  42.      */
  43.     public RequestBuilder setAuthority(String authority) {
  44.         this.authority = authority;
  45.         return this;
  46.     }
  47.  
  48.     /**
  49.      * Legge il valore del campo host.
  50.      */
  51.     public String getHost() {
  52.         return host;
  53.     }
  54.  
  55.     /**
  56.      * Imposta l'host.
  57.      *
  58.      * @param host il valore dell'host.
  59.      */
  60.     public RequestBuilder setHost(String host) {
  61.         this.host = host;
  62.         return this;
  63.     }
  64.  
  65.     /**
  66.      * Legge la porta sull'host.
  67.      */
  68.     public int getPort() {
  69.         return port;
  70.     }
  71.  
  72.     /**
  73.      * Imposta la porta sull'host.
  74.      *
  75.      * @param port il valore della porta dell'host.
  76.      */
  77.     public RequestBuilder setPort(int port) {
  78.         this.port = port;
  79.         return this;
  80.     }
  81.  
  82.     /**
  83.      * Memorizza la porta sull'host.
  84.      */
  85.     private int port;
  86.     /**
  87.      * Memorizza i pezzi del path.
  88.      */
  89.     private List<String> paths;
  90.  
  91.     // concedo la possibilità di aggiungere e togliere parti del path
  92.     // RequestBuilder builder = new RequestBuilder().setAuthority("http").setHost("192.168.1.1").setPort(8080)
  93.     //                          .addPath(0, "path1").addPath("path2").remove(1).remove("path1")
  94.  
  95.     /**
  96.      * Aggiunge un percorso.
  97.      *
  98.      * @param position posizione nella quale aggiungere il percorso.
  99.      * @param path     percorso da aggiungere.
  100.      */
  101.     public RequestBuilder addPath(int position, String path) {
  102.         paths.add(position, path);
  103.         return this;
  104.     }
  105.  
  106.     /**
  107.      * Overloading del metodo precendente.
  108.      * Determina un'altra possibilità nell'invocazione del metodo: a differenza del metodo
  109.      * precedente che aggiungeva in una determinata posizione, questo aggiunge alla fine.
  110.      *
  111.      * @param path percorso da aggiungere.
  112.      */
  113.     public RequestBuilder addPath(String path) {
  114.         paths.add(path);
  115.         return this;
  116.     }
  117.  
  118.     /**
  119.      * Rimuove il percorso che si trova in una particolare posizione.
  120.      *
  121.      * @param position la posizione del percorso da rimuovere.
  122.      */
  123.     public RequestBuilder removePath(int position) {
  124.         paths.remove(position);
  125.         return this;
  126.     }
  127.  
  128.     /**
  129.      * Rimuove il path passato come parametro.
  130.      *
  131.      * @param pathToRemove il path da rimuovere.
  132.      */
  133.     public RequestBuilder removePath(String pathToRemove) {
  134.         paths.remove(pathToRemove);
  135.         return this;
  136.     }
  137.  
  138.     /**
  139.      * Memorizza i pezzi della query string.
  140.      */
  141.     private Dictionary<String, String> queryString;
  142.     // accesso alle parti di query string
  143.  
  144.     /**
  145.      * Aggiunge una parte di query string.
  146.      *
  147.      * @param key   parametro di query.
  148.      * @param value valore associato al parametro.
  149.      */
  150.     public RequestBuilder addQuery(String key, String value) {
  151.         queryString.put(key, value);
  152.         return this;
  153.     }
  154.  
  155.     /**
  156.      * Rimuove una parte di query string.
  157.      *
  158.      * @param key parametro da rimuovere.
  159.      */
  160.     public RequestBuilder removeQuery(String key) {
  161.         queryString.remove(key);
  162.         return this;
  163.     }
  164.  
  165.     // Costanti della classe
  166.     /**
  167.      * Definizione della costante che rappresenta un'authority di tipo http con traffico in chiaro.
  168.      */
  169.     public static final String AUTHORITY_HTTP = "http";
  170.     /**
  171.      * Definizione della costante che rappresenta un'autority di tipo http con traffico crittografato.
  172.      */
  173.     public static final String AUTHORITY_HTTPS = "https";
  174.  
  175.     /**
  176.      * Il costruttore deve preoccuparsi di inizializzare gli elementi interni alla classe.
  177.      */
  178.     public RequestBuilder() {
  179.         authority = AUTHORITY_HTTPS; // per default la classe costruisce una request predisposta per https
  180.         host = "10.0.0.2"; // questo potrebbe essere un host di default, utilizzato se non provvedo a modificarlo
  181.         port = 80; // questa è la porta di default di un web server, verso cui vanno tutte le richieste HTTP
  182.         paths = new ArrayList<>(); // path è una List inizializzata come ArrayList
  183.         queryString = new Hashtable<>();
  184.     }
  185.  
  186.     /**
  187.      * Produce la request come stringa.
  188.      *
  189.      * @return restituisce la request costruita sulla base dei valori degli attributi della classe.
  190.      */
  191.     public String build() {
  192.         // devo costruire questo:
  193.         // authority://host:port/path_1/.../path_n?p1=v1&...&pn=vn
  194.         StringBuilder sb = new StringBuilder() // costruisco una stringa per passaggi successivi
  195.                 .append(authority) // aggiungo l'authority
  196.                 .append("://") // aggiungo questi tre caratteri
  197.                 .append(host); // aggiungo l'host
  198.         if (port != 80)  // se la porta non è quella standard...
  199.             sb.append(":").append(port); // aggiungo la porta dopo i due punti
  200.         sb.append("/"); // aggiungo una slash
  201.         for (String path : paths) // scorro i paths
  202.             sb.append(path).append("/"); // e li aggiungo uno ad uno
  203.         // controllo se ci sono query strings
  204.         if (queryString.size() > 0) {
  205.             // il dizionario implementa Enumeration sulle chiavi
  206.             Enumeration<String> e = queryString.keys();
  207.             while (e.hasMoreElements()) // scorro le chiavi
  208.             {
  209.                 // leggo la chiave corrente
  210.                 String key = e.nextElement();
  211.                 // leggo il valore associato
  212.                 String value = queryString.get(key);
  213.                 // lo aggiungo alla stringa e aggiungo pure una & alla fine per la concatenazione
  214.                 sb.append(key).append("=").append(value).append("&");
  215.             }
  216.         }
  217.         // alla fine restituisco la query string
  218.         return sb.toString();
  219.     }
  220. }
  221.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement