/** * Copyright (C) 2012-2014 Gist Labs, LLC. (http://gistlabs.com) * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ package com.gistlabs.mechanize.document.json; import java.io.InputStreamReader; import java.util.Arrays; import java.util.Collection; import org.apache.http.HttpResponse; import org.apache.http.client.methods.HttpRequestBase; import org.json.JSONArray; import org.json.JSONObject; import org.json.JSONTokener; import com.gistlabs.mechanize.Mechanize; import com.gistlabs.mechanize.document.AbstractDocument; import com.gistlabs.mechanize.document.json.node.JsonNode; import com.gistlabs.mechanize.document.json.node.impl.ArrayNodeImpl; import com.gistlabs.mechanize.document.json.node.impl.ObjectNodeImpl; import com.gistlabs.mechanize.exceptions.MechanizeExceptionFactory; import com.gistlabs.mechanize.util.apache.ContentType; public class JsonDocument extends AbstractDocument { public static Collection<String> CONTENT_MATCHERS = Arrays.asList( ContentType.APPLICATION_JSON.getMimeType()); private JsonNode json; public JsonDocument(final Mechanize agent, final HttpRequestBase request, final HttpResponse response) { super(agent, request, response); } @Override protected void loadPage() throws Exception { try { JSONTokener jsonTokener = new JSONTokener(new InputStreamReader(getInputStream())); char nextClean = jsonTokener.nextClean(); jsonTokener.back(); switch (nextClean) { case '{': this.json = new ObjectNodeImpl(new JSONObject(jsonTokener)); break; case '[': this.json = new ArrayNodeImpl(new JSONArray(jsonTokener)); break; default: throw new IllegalStateException(String.format("Error processing token=%s from request=%s",nextClean, this.getRequest())); } } catch (Exception e) { throw MechanizeExceptionFactory.newException(e); } } @Override public JsonNode getRoot() { return this.json; } }