001package edu.pdx.cs410J.airlineweb;
002
003import com.google.common.annotations.VisibleForTesting;
004import edu.pdx.cs410J.ParserException;
005import edu.pdx.cs410J.web.HttpRequestHelper;
006
007import java.io.IOException;
008import java.io.StringReader;
009import java.util.Map;
010
011import static edu.pdx.cs410J.web.HttpRequestHelper.Response;
012import static edu.pdx.cs410J.web.HttpRequestHelper.RestException;
013import static java.net.HttpURLConnection.HTTP_OK;
014
015/**
016 * A helper class for accessing the rest client.  Note that this class provides
017 * an example of how to make gets and posts to a URL.  You'll need to change it
018 * to do something other than just send dictionary entries.
019 */
020public class AirlineRestClient
021{
022    private static final String WEB_APP = "airline";
023    private static final String SERVLET = "flights";
024
025    private final HttpRequestHelper http;
026
027
028    /**
029     * Creates a client to the airline REST service running on the given host and port
030     * @param hostName The name of the host
031     * @param port The port
032     */
033    public AirlineRestClient( String hostName, int port )
034    {
035        this(new HttpRequestHelper(String.format("http://%s:%d/%s/%s", hostName, port, WEB_APP, SERVLET)));
036    }
037
038    @VisibleForTesting
039    AirlineRestClient(HttpRequestHelper http) {
040      this.http = http;
041    }
042
043  /**
044   * Returns all dictionary entries from the server
045   */
046  public Map<String, String> getAllDictionaryEntries() throws IOException, ParserException {
047    Response response = http.get(Map.of());
048    throwExceptionIfNotOkayHttpStatus(response);
049
050    TextParser parser = new TextParser(new StringReader(response.getContent()));
051    return parser.parse();
052  }
053
054  /**
055   * Returns the definition for the given word
056   */
057  public String getDefinition(String word) throws IOException, ParserException {
058    Response response = http.get(Map.of(AirlineServlet.WORD_PARAMETER, word));
059    throwExceptionIfNotOkayHttpStatus(response);
060    String content = response.getContent();
061
062    TextParser parser = new TextParser(new StringReader(content));
063    return parser.parse().get(word);
064  }
065
066  public void addDictionaryEntry(String word, String definition) throws IOException {
067    Response response = http.post(Map.of(AirlineServlet.WORD_PARAMETER, word, AirlineServlet.DEFINITION_PARAMETER, definition));
068    throwExceptionIfNotOkayHttpStatus(response);
069  }
070
071  public void removeAllDictionaryEntries() throws IOException {
072    Response response = http.delete(Map.of());
073    throwExceptionIfNotOkayHttpStatus(response);
074  }
075
076  private void throwExceptionIfNotOkayHttpStatus(Response response) {
077    int code = response.getHttpStatusCode();
078    if (code != HTTP_OK) {
079      String message = response.getContent();
080      throw new RestException(code, message);
081    }
082  }
083
084}