Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /*
   * Copyright (c) 2012 Kevin Sawicki <kevinsawicki@gmail.com>
   *
   * Permission is hereby granted, free of charge, to any person obtaining a copy
   * of this software and associated documentation files (the "Software"), to
   * deal in the Software without restriction, including without limitation the
   * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
   * sell copies of the Software, and to permit persons to whom the Software is
   * furnished to do so, subject to the following conditions:
  *
  * The above copyright notice and this permission notice shall be included in
  * all copies or substantial portions of the Software.
  *
  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
  * IN THE SOFTWARE.
  */
 package com.github.kevinsawicki.halligan;
 
 import static com.github.kevinsawicki.halligan.DefaultGsonFactory.GSON_FACTORY;
 import static com.google.gson.stream.JsonToken.BEGIN_OBJECT;
 import static com.google.gson.stream.JsonToken.NAME;
 
 
 import java.net.URL;
 import java.util.List;
 import java.util.Map;
Resource class
 
 public class Resource implements Iterable<Resource>, Serializable {
 
   private static final long serialVersionUID = 8768898492847217862L;
 
   private static final Type TYPE_LINKS = new TypeToken<Map<StringLink>>() {
   }.getType();
 
   private static String getPrefix(final URL url) {
     String prefix = url.getProtocol() + "://" + url.getHost();
     int port = url.getPort();
     if (port != -1)
       return prefix + ':' + port;
     else
       return prefix;
   }

  
Gson factory
 
   protected final GsonFactory gson;
 
   private String prefix;
 
   private int code;

  
Resource properties
 
   protected final Map<StringObjectproperties = new HashMap<StringObject>();

  
Resource links
 
   protected final Map<StringLinklinks = new HashMap<StringLink>();

  
Embedded resources
 
   protected final Map<StringList<Resource>> resources = new HashMap<StringList<Resource>>();

  
Create resource from URL

Parameters:
url
Throws:
java.io.IOException
 
   public Resource(final String urlthrows IOException {
     this(url);
   }

  
Create resource from URL

Parameters:
gson
url
Throws:
java.io.IOException
  public Resource(final GsonFactory gsonfinal String urlthrows IOException {
    this(gson);
    parse(url);
  }

  
Create resource with Gson factory

Parameters:
gson
  protected Resource(final GsonFactory gson) {
    this. = gson;
  }

  
Create child resource

Parameters:
parent
gson
Throws:
java.io.IOException
  protected Resource(final Resource parentfinal GsonFactory gson)
      throws IOException {
     = parent.code;
     = parent.prefix;
    this. = gson;
  }

  
Create request to URL

  protected HttpRequest createRequest(final String url)
      throws HttpRequestException {
    return HttpRequest.get(url).accept("application/hal+json");
  }

  
Create new child resource

Returns:
new resource
Throws:
java.io.IOException
  protected Resource createResource() throws IOException {
    return new Resource(this);
  }

  
Create new root-level resource backed by given URL

Parameters:
url
Returns:
new resource
Throws:
java.io.IOException
Throw:
IOException
  protected Resource createResource(final String urlthrows IOException {
    return new Resource(url);
  }
  private Resource requestResource(String urlthrows IOException {
    if (url.length() > 0 && url.charAt(0) == '/')
      url =  + url;
    return createResource(url);
  }

  
Fill this resource by opening a request to the URL and parsing the response

Parameters:
url
Returns:
this resource
Throws:
java.io.IOException
  protected Resource parse(final String urlthrows IOException {
    BufferedReader buffer;
    try {
      HttpRequest request = createRequest(url);
       = request.code();
      buffer = request.bufferedReader();
       = getPrefix(request.getConnection().getURL());
    } catch (HttpRequestException e) {
      throw e.getCause();
    }
    JsonReader reader = new JsonReader(buffer);
    try {
      parse(reader);
    } catch (JsonParseException e) {
      IOException ioException = new IOException("JSON parsing failed");
      ioException.initCause(e);
      throw ioException;
    } finally {
      try {
        reader.close();
      } catch (IOException ignored) {
        // Ignored
      }
    }
    return this;
  }

  
Fill this resource by parsing the next object in the reader

Parameters:
reader
Returns:
this resource
Throws:
java.io.IOException
  protected Resource parse(final JsonReader readerthrows IOException {
    reader.beginObject();
    while (reader.hasNext() && reader.peek() == ) {
      String name = reader.nextName();
      if ("_links".equals(name))
        parseLinks(reader);
      else if ("_embedded".equals(name))
        parseResources(reader);
      else
        parseProperty(readername);
    }
    reader.endObject();
    return this;
  }

  
Parse resources from current value

Parameters:
reader
Throws:
java.io.IOException
  protected void parseResources(final JsonReader readerthrows IOException {
    reader.beginObject();
    while (reader.hasNext()) {
      String name = reader.nextName();
      JsonToken next = reader.peek();
      switch (next) {
      case :
        .put(name,
            Collections.singletonList(createResource().parse(reader)));
        break;
      case :
        reader.beginArray();
        List<Resourceentries = new ArrayList<Resource>();
        while (reader.peek() == )
          entries.add(createResource().parse(reader));
        reader.endArray();
        .put(nameentries);
        break;
      default:
        throw new IOException("_embedded object value is a " + next.name()
            + " and must be an array or object");
      }
    }
    reader.endObject();
  }

  
Parse resource property

Parameters:
reader
name
Throws:
java.io.IOException
  protected void parseProperty(final JsonReader readerfinal String name)
      throws IOException {
    JsonToken next = reader.peek();
    switch (next) {
    case :
      .put(name.getGson().fromJson(readerMap.class));
      break;
    case :
      .put(namereader.nextString());
      break;
    case :
      .put(namereader.nextDouble());
      break;
    case :
      .put(namenull);
      reader.nextNull();
      break;
    case :
      .put(namereader.nextBoolean());
      break;
    default:
      throw new IOException("Unrecognized property value token: " + next);
    }
  }

  
Parse links from current reader's next object value

Parameters:
reader
  protected void parseLinks(final JsonReader reader) {
    Map<StringLinklinks = .getGson().fromJson(reader);
    if (links != null && !links.isEmpty())
      this..putAll(links);
  }

  
Get the HTTP status code of the response

Returns:
code
  public int code() {
    return ;
  }

  
Get URI to self

Returns:
URI to self or null if no self link exists
  public String getSelfUri() {
    return getLinkUri("self");
  }

  
Get URI to next resource

Returns:
URI to next resource or null if no next link exists
  public String getNextUri() {
    return getLinkUri("next");
  }

  
Get URI to find resource

Returns:
URI to find resource or null if no find link exists
  public String getFindUri() {
    return getLinkUri("find");
  }

  
Get URI of link with name

Parameters:
name
Returns:
URI or null if no link with given name exists
  public String getLinkUri(final String name) {
    final Link link = getLink(name);
    return link != null ? link.expandHref() : null;
  }

  
Get link with name

Parameters:
name
Returns:
link or null if none for given name
  public Link getLink(final String name) {
    return .get(name);
  }

  
Get all links

Returns:
possibly empty java.lang.Iterable over all links
  public Iterable<Entry<StringLink>> getLinks() {
    return .entrySet();
  }

  
Get resource property as an integer

Parameters:
name
Returns:
integer value or -1 if the property is missing or not a java.lang.Number
  public int getInt(final String name) {
    final Object value = .get(name);
    return value instanceof Number ? ((Numbervalue).intValue() : -1;
  }

  
Get resource property as an integer

Parameters:
name
Returns:
integer value or -1 if the property is missing or not a java.lang.Number
  public double getDouble(final String name) {
    final Object value = .get(name);
    return value instanceof Number ? ((Numbervalue).doubleValue() : -1;
  }

  
Get resource property as a long

Parameters:
name
Returns:
long value or -1 if the property is missing or not a java.lang.Number
  public long getLong(final String name) {
    final Object value = .get(name);
    return value instanceof Number ? ((Numbervalue).longValue() : -1;
  }

  
Get resource property as a boolean

Parameters:
name
Returns:
boolean value or false if the property is missing or not a java.lang.Boolean
  public boolean getBoolean(final String name) {
    final Object value = .get(name);
    return value instanceof Boolean ? ((Booleanvalue).booleanValue() : false;
  }

  
Get resource property as a java.lang.String

Parameters:
name
Returns:
string value of property or null if the property is missing
  public String getString(final String name) {
    final Object value = .get(name);
    return value != null ? value.toString() : null;
  }

  
Get resource property as a java.util.Map

Parameters:
name
Returns:
map value of property of null if the property is missing or not a java.util.Map
  @SuppressWarnings("unchecked")
  public Map<StringObjectgetMap(final String name) {
    final Object value = .get(name);
    return value instanceof Map ? (Map<StringObject>) value : null;
  }

  
Get embedded resources with given name

Parameters:
name
Returns:
list of resources
  public List<ResourcegetResources(final String name) {
    return .get(name);
  }

  
Get number of embedded resources with given name

Parameters:
name
Returns:
count
  public int getResourceCount(final String name) {
    List<Resourceresources = getResources(name);
    return resources != null ? resources.size() : 0;
  }

  
Get embedded resource with name

Parameters:
name
Returns:
resource
  public Resource getResource(final String name) {
    List<Resourceresources = getResources(name);
    return resources != null && !resources.isEmpty() ? resources.get(0) : null;
  }

  
Does this resource have a property with the given name?

Parameters:
name
Returns:
true if property exists, false otherwise
  public boolean hasProperty(final String name) {
    return .containsKey(name);
  }

  
Does this resource have embedded resources?

Returns:
true if at least one embedded resource, false otherwise
  public boolean hasResources() {
    return !.isEmpty();
  }

  
Does this resource have one or more embedded resources with the given name?

Parameters:
name
Returns:
true if one or more embedded resources exist, false otherwise
  public boolean hasResource(final String name) {
    List<Resourceresources = getResources(name);
    return resources != null && !resources.isEmpty();
  }

  
Does this resource have a link with the given name?

Parameters:
name
Returns:
true if resource has link with name, false otherwise
  public boolean hasLink(final String name) {
    return .get(name) != null;
  }

  
Does this resource have a link to the next resource?

Returns:
true if link exists for the next resource, false otherwise
  public boolean hasNext() {
    String nextUri = getNextUri();
    return nextUri != null && nextUri.length() > 0;
  }

  
Load the next resource

Returns:
next resource
Throws:
java.io.IOException
  public Resource next() throws IOException {
    return requestResource(getNextUri());
  }

  
Load this resource using the self URI

Returns:
resource loaded from getSelfUri() value
Throws:
java.io.IOException
  public Resource load() throws IOException {
    return requestResource(getSelfUri());
  }

  
Load resource with given link name

Parameters:
linkName
Returns:
resource
Throws:
java.lang.Exception
  public Resource load(final String linkNamethrows Exception {
    return requestResource(getLinkUri(linkName));
  }

  
Get all embedded resources

Returns:
iterator over all embedded resources
    return .entrySet();
  }

  
Create iterator starting at the current resource and advancing down the chain of next links.

This returned iterator will return this resource on the first call to java.util.Iterator.next() followed by requesting and parsing the resource defined at this resource's getNextUri()

  public Iterator<Resourceiterator() {
    return new ResourceIterator(this);
  }
New to GrepCode? Check out our FAQ X