/* * Copyright 2013 State University of New York at Oswego * * Licensed under the Apache License, Version 2.0 (the "License");  * you may not use this file except in compliance with the License.  * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software  * distributed under the License is distributed on an "AS IS" BASIS,  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  * See the License for the specific language governing permissions and  * limitations under the License. */ package edu.oswego.csc480_hci521_2013.server; import com.google.gson.FieldNamingPolicy; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.JsonObject; import com.google.gson.JsonParser; import edu.oswego.csc480_hci521_2013.server.json.deserializers .InspectRowDeserializer; import edu.oswego.csc480_hci521_2013.shared.h2o.H2OException; import edu.oswego.csc480_hci521_2013.shared.h2o.RestException; import edu.oswego.csc480_hci521_2013.shared.h2o.json.H2OResponse; import edu.oswego.csc480_hci521_2013.shared.h2o.json.Inspect; import edu.oswego.csc480_hci521_2013.shared.h2o.urlbuilders.H2ORequest; import edu.oswego.csc480_hci521_2013.shared.h2o.urlbuilders.UrlEncoder; import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.URL; import java.util.logging.Level; import java.util.logging.Logger; /** * */ public class RestHandler { private static final Logger LOGGER = Logger.getLogger( RestHandler.class.getName()); private Gson gson; private UrlEncoder encoder = new ServerUrlEncoder(); public RestHandler() { gson = new GsonBuilder() .registerTypeAdapter( Inspect.Row.class, new InspectRowDeserializer()) .setFieldNamingPolicy( FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES) .create(); } /** * Fetch the json string. * * @param query the url * @return json string * @throws Exception */ public String fetch(String query) throws RestException { try { URL url = new URL(query); BufferedReader in = new BufferedReader( new InputStreamReader(url.openStream())); StringBuilder json = new StringBuilder(); String line; while ((line = in.readLine()) != null) { json.append(line); } in.close(); return json.toString(); } catch (Exception e) { LOGGER.log(Level.SEVERE, e.getMessage(), e); throw new RestException(e); } } /** * parse the json string into a response object. * * @param <T> the type of the response object * @param json the json string * @param responseType * @return * @throws RestException */ public <T extends H2OResponse> T parse(String json, Class<T> responseType) throws H2OException { JsonParser parser = new JsonParser(); JsonObject response = parser.parse(json).getAsJsonObject(); T sv = gson.fromJson(response, responseType); // NOTE: sometimes response is null... if (sv.getResponse() == null) { LOGGER.log(Level.WARNING, "H2O Response Info is null!"); if (sv.getError() != null) { LOGGER.log(Level.SEVERE, sv.getError()); throw new H2OException(sv.getError()); } } else if (sv.getResponse().isError()) { LOGGER.log(Level.SEVERE, sv.getError()); throw new H2OException(sv.getError()); } return sv; } /** * Handles both fetch and parse. * * @param <T> * @param request * @param responseType * @return * @throws RestException */ public <T extends H2OResponse> T get(H2ORequest request, Class<T> responseType) throws RestException { String url = request.build(encoder); LOGGER.log(Level.INFO, url.toString()); String json = fetch(url); LOGGER.log(Level.INFO, json); T val = parse(json, responseType); LOGGER.log(Level.INFO, val.toString()); return val; } }