You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@brooklyn.apache.org by sv...@apache.org on 2016/02/10 11:49:09 UTC

[2/4] brooklyn-server git commit: Initial work to simplify the rest server

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/1a53a3f9/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/LinkWithMetadata.java
----------------------------------------------------------------------
diff --git a/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/LinkWithMetadata.java b/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/LinkWithMetadata.java
index 1d2af55..a47981c 100644
--- a/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/LinkWithMetadata.java
+++ b/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/LinkWithMetadata.java
@@ -20,11 +20,11 @@ package org.apache.brooklyn.rest.domain;
 
 import java.io.Serializable;
 import java.util.Map;
+import java.util.Objects;
 
 import javax.annotation.Nullable;
 
-import org.codehaus.jackson.annotate.JsonProperty;
-
+import com.fasterxml.jackson.annotation.JsonProperty;
 import com.google.common.annotations.Beta;
 import com.google.common.collect.ImmutableMap;
 
@@ -34,55 +34,44 @@ public class LinkWithMetadata implements Serializable {
     // TODO remove 'metadata' and promote its contents to be top-level fields; then unmark as Beta
 
     private static final long serialVersionUID = 3146368899471495143L;
-    
+
     private final String link;
     private final Map<String,Object> metadata;
-    
+
     public LinkWithMetadata(
-            @JsonProperty("link") String link, 
+            @JsonProperty("link") String link,
             @Nullable @JsonProperty("metadata") Map<String,?> metadata) {
         this.link = link;
         this.metadata = (metadata == null) ? ImmutableMap.<String,Object>of() : ImmutableMap.<String,Object>copyOf(metadata);
     }
-    
+
     public String getLink() {
         return link;
     }
-    
+
     public Map<String, Object> getMetadata() {
         return metadata;
     }
 
     @Override
-    public int hashCode() {
-        final int prime = 31;
-        int result = 1;
-        result = prime * result + ((link == null) ? 0 : link.hashCode());
-        result = prime * result + ((metadata == null) ? 0 : metadata.hashCode());
-        return result;
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (!(o instanceof LinkWithMetadata)) return false;
+        LinkWithMetadata that = (LinkWithMetadata) o;
+        return Objects.equals(link, that.link) &&
+                Objects.equals(metadata, that.metadata);
     }
 
     @Override
-    public boolean equals(Object obj) {
-        if (this == obj)
-            return true;
-        if (obj == null)
-            return false;
-        if (getClass() != obj.getClass())
-            return false;
-        LinkWithMetadata other = (LinkWithMetadata) obj;
-        if (link == null) {
-            if (other.link != null)
-                return false;
-        } else if (!link.equals(other.link))
-            return false;
-        if (metadata == null) {
-            if (other.metadata != null)
-                return false;
-        } else if (!metadata.equals(other.metadata))
-            return false;
-        return true;
+    public int hashCode() {
+        return Objects.hash(link, metadata);
     }
 
-    
+    @Override
+    public String toString() {
+        return "LinkWithMetadata{" +
+                "link='" + link + '\'' +
+                ", metadata=" + metadata +
+                '}';
+    }
 }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/1a53a3f9/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/LocationConfigSummary.java
----------------------------------------------------------------------
diff --git a/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/LocationConfigSummary.java b/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/LocationConfigSummary.java
index 6b76c1e..21d5861 100644
--- a/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/LocationConfigSummary.java
+++ b/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/LocationConfigSummary.java
@@ -21,18 +21,17 @@ package org.apache.brooklyn.rest.domain;
 import java.net.URI;
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
 
-import org.codehaus.jackson.annotate.JsonProperty;
-import org.codehaus.jackson.map.annotate.JsonSerialize;
-import org.codehaus.jackson.map.annotate.JsonSerialize.Inclusion;
-
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 import com.google.common.collect.ImmutableMap;
 
 public class LocationConfigSummary extends ConfigSummary {
 
     private static final long serialVersionUID = 2232321501735217002L;
-    
-    @JsonSerialize(include = Inclusion.NON_NULL)
+
+    @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
     private final Map<String, URI> links;
 
     public LocationConfigSummary(
@@ -55,10 +54,23 @@ public class LocationConfigSummary extends ConfigSummary {
     }
 
     @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (!(o instanceof LocationConfigSummary)) return false;
+        if (!super.equals(o)) return false;
+        LocationConfigSummary that = (LocationConfigSummary) o;
+        return Objects.equals(links, that.links);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(super.hashCode(), links);
+    }
+
+    @Override
     public String toString() {
-        return "LocationConfigSummary{"
-                + "name='" + getName() + '\''
-                + ", type='" + getType() + '\''
-                + '}';
+        return "LocationConfigSummary{" +
+                "links=" + links +
+                '}';
     }
 }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/1a53a3f9/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/LocationSpec.java
----------------------------------------------------------------------
diff --git a/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/LocationSpec.java b/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/LocationSpec.java
index 8cbb9c5..4738381 100644
--- a/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/LocationSpec.java
+++ b/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/LocationSpec.java
@@ -21,14 +21,12 @@ package org.apache.brooklyn.rest.domain;
 import java.io.Serializable;
 import java.util.Collections;
 import java.util.Map;
+import java.util.Objects;
 
 import javax.annotation.Nullable;
 
-import org.codehaus.jackson.annotate.JsonProperty;
-import org.codehaus.jackson.map.annotate.JsonSerialize;
-import org.codehaus.jackson.map.annotate.JsonSerialize.Inclusion;
-
-import com.google.common.base.Objects;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 import com.google.common.collect.ImmutableMap;
 
 // FIXME change name, due to confusion with LocationSpec <- no need, as we can kill the class instead soon!
@@ -36,13 +34,13 @@ import com.google.common.collect.ImmutableMap;
 public class LocationSpec implements HasName, HasConfig, Serializable {
 
     private static final long serialVersionUID = -1562824224808185255L;
-    
-    @JsonSerialize(include = Inclusion.NON_NULL)
+
+    @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
     private final String name;
-    @JsonSerialize(include = Inclusion.NON_NULL)
+    @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
     private final String spec;
 
-    @JsonSerialize(include = Inclusion.NON_EMPTY)
+    @JsonSerialize(include = JsonSerialize.Inclusion.NON_EMPTY)
     private final Map<String, ?> config;
 
     public static LocationSpec localhost() {
@@ -74,23 +72,24 @@ public class LocationSpec implements HasName, HasConfig, Serializable {
     @Override
     public boolean equals(Object o) {
         if (this == o) return true;
-        if (o == null || getClass() != o.getClass()) return false;
-
+        if (!(o instanceof LocationSpec)) return false;
         LocationSpec that = (LocationSpec) o;
-        return Objects.equal(name, that.name) && Objects.equal(spec, that.spec) && Objects.equal(config, that.config);
+        return Objects.equals(name, that.name) &&
+                Objects.equals(spec, that.spec) &&
+                Objects.equals(config, that.config);
     }
 
     @Override
     public int hashCode() {
-        return Objects.hashCode(spec, name, config);
+        return Objects.hash(name, spec, config);
     }
 
     @Override
     public String toString() {
-        return "LocationSpec{"
-                + "name='" + name + '\''
-                + "spec='" + spec + '\''
-                + ", config=" + config
-                + '}';
+        return "LocationSpec{" +
+                "name='" + name + '\'' +
+                ", spec='" + spec + '\'' +
+                ", config=" + config +
+                '}';
     }
 }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/1a53a3f9/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/LocationSummary.java
----------------------------------------------------------------------
diff --git a/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/LocationSummary.java b/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/LocationSummary.java
index ec41544..4cad32b 100644
--- a/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/LocationSummary.java
+++ b/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/LocationSummary.java
@@ -22,14 +22,12 @@ import static com.google.common.base.Preconditions.checkNotNull;
 
 import java.net.URI;
 import java.util.Map;
+import java.util.Objects;
 
 import javax.annotation.Nullable;
 
-import org.codehaus.jackson.annotate.JsonProperty;
-import org.codehaus.jackson.map.annotate.JsonSerialize;
-import org.codehaus.jackson.map.annotate.JsonSerialize.Inclusion;
-
-import com.google.common.base.Objects;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 import com.google.common.collect.ImmutableMap;
 
 public class LocationSummary extends LocationSpec implements HasName, HasId {
@@ -39,7 +37,7 @@ public class LocationSummary extends LocationSpec implements HasName, HasId {
     private final String id;
 
     /** only intended for instantiated Locations, not definitions */
-    @JsonSerialize(include = Inclusion.NON_NULL)
+    @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
     private final String type;
     private final Map<String, URI> links;
 
@@ -71,26 +69,26 @@ public class LocationSummary extends LocationSpec implements HasName, HasId {
 
     @Override
     public boolean equals(Object o) {
+        if (this == o) return true;
+        if (!(o instanceof LocationSummary)) return false;
         if (!super.equals(o)) return false;
         LocationSummary that = (LocationSummary) o;
-        return Objects.equal(id, that.id);
+        return Objects.equals(id, that.id) &&
+                Objects.equals(type, that.type) &&
+                Objects.equals(links, that.links);
     }
 
     @Override
     public int hashCode() {
-        return Objects.hashCode(id, links);
+        return Objects.hash(super.hashCode(), id, type, links);
     }
 
     @Override
     public String toString() {
-        return "LocationSummary{"
-                + "id='" + getId() + '\''
-                + "name='" + getName() + '\''
-                + "spec='" + getSpec() + '\''
-                + "type='" + getType() + '\''
-                + ", config=" + getConfig()
-                + ", links=" + links
-                + '}';
-  }
-
+        return "LocationSummary{" +
+                "id='" + id + '\'' +
+                ", type='" + type + '\'' +
+                ", links=" + links +
+                '}';
+    }
 }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/1a53a3f9/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/PolicyConfigSummary.java
----------------------------------------------------------------------
diff --git a/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/PolicyConfigSummary.java b/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/PolicyConfigSummary.java
index 91bd2f1..dd59507 100644
--- a/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/PolicyConfigSummary.java
+++ b/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/PolicyConfigSummary.java
@@ -20,18 +20,17 @@ package org.apache.brooklyn.rest.domain;
 
 import java.net.URI;
 import java.util.Map;
+import java.util.Objects;
 
-import org.codehaus.jackson.annotate.JsonProperty;
-import org.codehaus.jackson.map.annotate.JsonSerialize;
-import org.codehaus.jackson.map.annotate.JsonSerialize.Inclusion;
-
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 import com.google.common.collect.ImmutableMap;
 
 public class PolicyConfigSummary extends ConfigSummary {
 
     private static final long serialVersionUID = 4339330833863794513L;
-    
-    @JsonSerialize(include = Inclusion.NON_NULL)
+
+    @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
     private final Map<String, URI> links;
 
     public PolicyConfigSummary(
@@ -51,10 +50,23 @@ public class PolicyConfigSummary extends ConfigSummary {
     }
 
     @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (!(o instanceof PolicyConfigSummary)) return false;
+        if (!super.equals(o)) return false;
+        PolicyConfigSummary that = (PolicyConfigSummary) o;
+        return Objects.equals(links, that.links);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(super.hashCode(), links);
+    }
+
+    @Override
     public String toString() {
-        return "PolicyConfigSummary{"
-                + "name='" + getName() + '\''
-                + ", type='" + getType() + '\''
-                + '}';
-  }
+        return "PolicyConfigSummary{" +
+                "links=" + links +
+                '}';
+    }
 }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/1a53a3f9/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/PolicySummary.java
----------------------------------------------------------------------
diff --git a/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/PolicySummary.java b/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/PolicySummary.java
index df6c722..a52ef53 100644
--- a/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/PolicySummary.java
+++ b/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/PolicySummary.java
@@ -21,20 +21,19 @@ package org.apache.brooklyn.rest.domain;
 import java.io.Serializable;
 import java.net.URI;
 import java.util.Map;
+import java.util.Objects;
 
-import org.codehaus.jackson.annotate.JsonProperty;
-import org.codehaus.jackson.map.annotate.JsonSerialize;
-import org.codehaus.jackson.map.annotate.JsonSerialize.Inclusion;
-
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 import com.google.common.collect.ImmutableMap;
 
 public class PolicySummary implements HasName, HasId, Serializable {
 
     private static final long serialVersionUID = -5086680835225136768L;
-    
+
     private final String id;
     private final String name;
-    @JsonSerialize(include = Inclusion.NON_NULL)
+    @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
     private final String catalogItemId;
     private final Status state;
     private final Map<String, URI> links;
@@ -77,32 +76,28 @@ public class PolicySummary implements HasName, HasId, Serializable {
     @Override
     public boolean equals(Object o) {
         if (this == o) return true;
-        if (o == null || getClass() != o.getClass()) return false;
-
+        if (!(o instanceof PolicySummary)) return false;
         PolicySummary that = (PolicySummary) o;
-
-        if (id != null ? !id.equals(that.id) : that.id != null)
-            return false;
-        if (name != null ? !name.equals(that.name) : that.name != null)
-            return false;
-
-        return true;
+        return Objects.equals(id, that.id) &&
+                Objects.equals(name, that.name) &&
+                Objects.equals(catalogItemId, that.catalogItemId) &&
+                state == that.state &&
+                Objects.equals(links, that.links);
     }
 
     @Override
     public int hashCode() {
-        int result = name != null ? name.hashCode() : 0;
-        result = 31 * result + (id != null ? id.hashCode() : 0);
-        return result;
+        return Objects.hash(id, name, catalogItemId, state, links);
     }
 
     @Override
     public String toString() {
-        return "ConfigSummary{"
-                + "name='" + name + '\''
-                + ", id='" + id + '\''
-                + ", catalogItemId='" + catalogItemId + '\''
-                + ", links=" + links
-                + '}';
+        return "PolicySummary{" +
+                "id='" + id + '\'' +
+                ", name='" + name + '\'' +
+                ", catalogItemId='" + catalogItemId + '\'' +
+                ", state=" + state +
+                ", links=" + links +
+                '}';
     }
 }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/1a53a3f9/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/ScriptExecutionSummary.java
----------------------------------------------------------------------
diff --git a/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/ScriptExecutionSummary.java b/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/ScriptExecutionSummary.java
index 9f7d5d5..c84573c 100644
--- a/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/ScriptExecutionSummary.java
+++ b/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/ScriptExecutionSummary.java
@@ -19,28 +19,28 @@
 package org.apache.brooklyn.rest.domain;
 
 import java.io.Serializable;
+import java.util.Objects;
 
-import org.codehaus.jackson.annotate.JsonProperty;
-import org.codehaus.jackson.map.annotate.JsonSerialize;
-import org.codehaus.jackson.map.annotate.JsonSerialize.Inclusion;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 
 public class ScriptExecutionSummary implements Serializable {
 
     private static final long serialVersionUID = -7707936602991185960L;
-    
-    @JsonSerialize(include = Inclusion.NON_NULL)
+
+    @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
     private final Object result;
-    @JsonSerialize(include = Inclusion.NON_EMPTY)
+    @JsonSerialize(include = JsonSerialize.Inclusion.NON_EMPTY)
     private final String problem;
-    @JsonSerialize(include = Inclusion.NON_EMPTY)
+    @JsonSerialize(include = JsonSerialize.Inclusion.NON_EMPTY)
     private final String stdout;
-    @JsonSerialize(include = Inclusion.NON_EMPTY)
+    @JsonSerialize(include = JsonSerialize.Inclusion.NON_EMPTY)
     private final String stderr;
 
     public ScriptExecutionSummary(
-            @JsonProperty("result") Object result, 
-            @JsonProperty("problem") String problem, 
-            @JsonProperty("stdout") String stdout, 
+            @JsonProperty("result") Object result,
+            @JsonProperty("problem") String problem,
+            @JsonProperty("stdout") String stdout,
             @JsonProperty("stderr") String stderr) {
         super();
         this.result = result;
@@ -64,4 +64,30 @@ public class ScriptExecutionSummary implements Serializable {
     public String getStdout() {
         return stdout;
     }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (!(o instanceof ScriptExecutionSummary)) return false;
+        ScriptExecutionSummary that = (ScriptExecutionSummary) o;
+        return Objects.equals(result, that.result) &&
+                Objects.equals(problem, that.problem) &&
+                Objects.equals(stdout, that.stdout) &&
+                Objects.equals(stderr, that.stderr);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(result, problem, stdout, stderr);
+    }
+
+    @Override
+    public String toString() {
+        return "ScriptExecutionSummary{" +
+                "result=" + result +
+                ", problem='" + problem + '\'' +
+                ", stdout='" + stdout + '\'' +
+                ", stderr='" + stderr + '\'' +
+                '}';
+    }
 }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/1a53a3f9/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/SensorSummary.java
----------------------------------------------------------------------
diff --git a/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/SensorSummary.java b/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/SensorSummary.java
index 890030e..11a4d2f 100644
--- a/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/SensorSummary.java
+++ b/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/SensorSummary.java
@@ -21,22 +21,21 @@ package org.apache.brooklyn.rest.domain;
 import java.io.Serializable;
 import java.net.URI;
 import java.util.Map;
+import java.util.Objects;
 
-import org.codehaus.jackson.annotate.JsonProperty;
-import org.codehaus.jackson.map.annotate.JsonSerialize;
-import org.codehaus.jackson.map.annotate.JsonSerialize.Inclusion;
-
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 import com.google.common.collect.ImmutableMap;
 
 public class SensorSummary implements HasName, Serializable {
 
     private static final long serialVersionUID = 1154308408351165426L;
-    
+
     private final String name;
     private final String type;
-    @JsonSerialize(include = Inclusion.NON_NULL)
+    @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
     private final String description;
-    @JsonSerialize(include = Inclusion.NON_NULL)
+    @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
     private final Map<String, URI> links;
 
     public SensorSummary(
@@ -70,38 +69,26 @@ public class SensorSummary implements HasName, Serializable {
     @Override
     public boolean equals(Object o) {
         if (this == o) return true;
-        if (o == null || getClass() != o.getClass()) return false;
-
+        if (!(o instanceof SensorSummary)) return false;
         SensorSummary that = (SensorSummary) o;
-
-        if (description != null ? !description.equals(that.description) : that.description != null)
-            return false;
-        if (links != null ? !links.equals(that.links) : that.links != null)
-            return false;
-        if (name != null ? !name.equals(that.name) : that.name != null)
-            return false;
-        if (type != null ? !type.equals(that.type) : that.type != null)
-            return false;
-
-        return true;
+        return Objects.equals(name, that.name) &&
+                Objects.equals(type, that.type) &&
+                Objects.equals(description, that.description) &&
+                Objects.equals(links, that.links);
     }
 
     @Override
     public int hashCode() {
-        int result = name != null ? name.hashCode() : 0;
-        result = 31 * result + (type != null ? type.hashCode() : 0);
-        result = 31 * result + (description != null ? description.hashCode() : 0);
-        result = 31 * result + (links != null ? links.hashCode() : 0);
-        return result;
+        return Objects.hash(name, type, description, links);
     }
 
     @Override
     public String toString() {
-        return "SensorSummary{"
-                + "name='" + name + '\''
-                + ", type='" + type + '\''
-                + ", description='" + description + '\''
-                + ", links=" + links
-                + '}';
+        return "SensorSummary{" +
+                "name='" + name + '\'' +
+                ", type='" + type + '\'' +
+                ", description='" + description + '\'' +
+                ", links=" + links +
+                '}';
     }
 }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/1a53a3f9/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/TaskSummary.java
----------------------------------------------------------------------
diff --git a/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/TaskSummary.java b/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/TaskSummary.java
index e4ce145..6de384e 100644
--- a/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/TaskSummary.java
+++ b/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/TaskSummary.java
@@ -24,21 +24,21 @@ import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
 import java.util.Set;
 
 import org.apache.brooklyn.util.collections.Jsonya;
-import org.codehaus.jackson.annotate.JsonIgnore;
-import org.codehaus.jackson.annotate.JsonProperty;
-import org.codehaus.jackson.map.annotate.JsonSerialize;
-import org.codehaus.jackson.map.annotate.JsonSerialize.Inclusion;
 
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 
 public class TaskSummary implements HasId, Serializable {
 
     private static final long serialVersionUID = 4637850742127078158L;
-    
+
     private final String id;
     private final String displayName;
     private final String entityId;
@@ -52,38 +52,38 @@ public class TaskSummary implements HasId, Serializable {
 
     private final String currentStatus;
     private final Object result;
-    private final boolean isError;
-    private final boolean isCancelled;
+    private final boolean error;
+    private final boolean cancelled;
 
     private final List<LinkWithMetadata> children;
     private final LinkWithMetadata submittedByTask;
 
-    @JsonSerialize(include = Inclusion.NON_NULL)
+    @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
     private final LinkWithMetadata blockingTask;
-    @JsonSerialize(include = Inclusion.NON_NULL)
+    @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
     private final String blockingDetails;
 
     private final String detailedStatus;
 
-    @JsonSerialize(include = Inclusion.NON_NULL)
+    @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
     private final Map<String, LinkWithMetadata> streams;
 
     private final Map<String, URI> links;
 
     public TaskSummary(
-            @JsonProperty("id") String id, 
-            @JsonProperty("displayName") String displayName, 
-            @JsonProperty("description") String description, 
-            @JsonProperty("entityId") String entityId, 
-            @JsonProperty("entityDisplayName") String entityDisplayName, 
+            @JsonProperty("id") String id,
+            @JsonProperty("displayName") String displayName,
+            @JsonProperty("description") String description,
+            @JsonProperty("entityId") String entityId,
+            @JsonProperty("entityDisplayName") String entityDisplayName,
             @JsonProperty("tags") Set<Object> tags,
-            @JsonProperty("submitTimeUtc") Long submitTimeUtc, 
-            @JsonProperty("startTimeUtc") Long startTimeUtc, 
-            @JsonProperty("endTimeUtc") Long endTimeUtc, 
-            @JsonProperty("currentStatus") String currentStatus, 
-            @JsonProperty("result") Object result, 
-            @JsonProperty("isError") boolean isError, 
-            @JsonProperty("isCancelled") boolean isCancelled, 
+            @JsonProperty("submitTimeUtc") Long submitTimeUtc,
+            @JsonProperty("startTimeUtc") Long startTimeUtc,
+            @JsonProperty("endTimeUtc") Long endTimeUtc,
+            @JsonProperty("currentStatus") String currentStatus,
+            @JsonProperty("result") Object result,
+            @JsonProperty("error") boolean error,
+            @JsonProperty("cancelled") boolean cancelled,
             @JsonProperty("children") List<LinkWithMetadata> children,
             @JsonProperty("submittedByTask") LinkWithMetadata submittedByTask,
             @JsonProperty("blockingTask") LinkWithMetadata blockingTask,
@@ -102,8 +102,8 @@ public class TaskSummary implements HasId, Serializable {
         this.endTimeUtc = endTimeUtc;
         this.currentStatus = currentStatus;
         this.result = result;
-        this.isError = isError;
-        this.isCancelled = isCancelled;
+        this.error = error;
+        this.cancelled = cancelled;
         this.children = children;
         this.blockingDetails = blockingDetails;
         this.blockingTask = blockingTask;
@@ -168,26 +168,26 @@ public class TaskSummary implements HasId, Serializable {
         return result;
     }
 
-    /** @deprecated since 0.7.0 use {@link #isError} instead. */
+    /** @deprecated since 0.7.0 use {@link #error} instead. */
     @Deprecated
     @JsonIgnore
     public boolean getIsError() {
-        return isError;
+        return error;
     }
 
-    /** @deprecated since 0.7.0 use {@link #isCancelled} instead. */
+    /** @deprecated since 0.7.0 use {@link #cancelled} instead. */
     @Deprecated
     @JsonIgnore
     public boolean getIsCancelled() {
-        return isCancelled;
+        return cancelled;
     }
 
     public boolean isError() {
-        return isError;
+        return error;
     }
 
     public boolean isCancelled() {
-        return isCancelled;
+        return cancelled;
     }
 
     public List<LinkWithMetadata> getChildren() {
@@ -219,13 +219,60 @@ public class TaskSummary implements HasId, Serializable {
     }
 
     @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (!(o instanceof TaskSummary)) return false;
+        TaskSummary that = (TaskSummary) o;
+        return error == that.error &&
+                cancelled == that.cancelled &&
+                Objects.equals(id, that.id) &&
+                Objects.equals(displayName, that.displayName) &&
+                Objects.equals(entityId, that.entityId) &&
+                Objects.equals(entityDisplayName, that.entityDisplayName) &&
+                Objects.equals(description, that.description) &&
+                Objects.equals(tags, that.tags) &&
+                Objects.equals(submitTimeUtc, that.submitTimeUtc) &&
+                Objects.equals(startTimeUtc, that.startTimeUtc) &&
+                Objects.equals(endTimeUtc, that.endTimeUtc) &&
+                Objects.equals(currentStatus, that.currentStatus) &&
+                Objects.equals(result, that.result) &&
+                Objects.equals(children, that.children) &&
+                Objects.equals(submittedByTask, that.submittedByTask) &&
+                Objects.equals(blockingTask, that.blockingTask) &&
+                Objects.equals(blockingDetails, that.blockingDetails) &&
+                Objects.equals(detailedStatus, that.detailedStatus) &&
+                Objects.equals(streams, that.streams) &&
+                Objects.equals(links, that.links);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(id, displayName, entityId, entityDisplayName, description, tags, submitTimeUtc, startTimeUtc, endTimeUtc, currentStatus, result, error, cancelled, children, submittedByTask, blockingTask, blockingDetails, detailedStatus, streams, links);
+    }
+
+    @Override
     public String toString() {
-        return "TaskSummary{"
-                + "id='" + id + '\''
-                + ", displayName='" + displayName + '\''
-                + ", currentStatus='" + currentStatus + '\''
-                + ", startTimeUtc='" + startTimeUtc + '\''
-                + ", endTimeUtc='" + endTimeUtc + '\''
-                + '}';
-  }
+        return "TaskSummary{" +
+                "id='" + id + '\'' +
+                ", displayName='" + displayName + '\'' +
+                ", entityId='" + entityId + '\'' +
+                ", entityDisplayName='" + entityDisplayName + '\'' +
+                ", description='" + description + '\'' +
+                ", tags=" + tags +
+                ", submitTimeUtc=" + submitTimeUtc +
+                ", startTimeUtc=" + startTimeUtc +
+                ", endTimeUtc=" + endTimeUtc +
+                ", currentStatus='" + currentStatus + '\'' +
+                ", result=" + result +
+                ", error=" + error +
+                ", cancelled=" + cancelled +
+                ", children=" + children +
+                ", submittedByTask=" + submittedByTask +
+                ", blockingTask=" + blockingTask +
+                ", blockingDetails='" + blockingDetails + '\'' +
+                ", detailedStatus='" + detailedStatus + '\'' +
+                ", streams=" + streams +
+                ", links=" + links +
+                '}';
+    }
 }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/1a53a3f9/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/UsageStatistic.java
----------------------------------------------------------------------
diff --git a/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/UsageStatistic.java b/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/UsageStatistic.java
index 4e04613..d7d4b7f 100644
--- a/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/UsageStatistic.java
+++ b/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/UsageStatistic.java
@@ -22,19 +22,15 @@ import static com.google.common.base.Preconditions.checkNotNull;
 
 import java.io.Serializable;
 import java.util.Map;
+import java.util.Objects;
 
-import org.codehaus.jackson.annotate.JsonProperty;
-
-import com.google.common.base.Objects;
+import com.fasterxml.jackson.annotation.JsonProperty;
 import com.google.common.collect.ImmutableMap;
 
-/**
- * @author Adam Lowe
- */
 public class UsageStatistic implements HasId, Serializable {
-    
+
     private static final long serialVersionUID = 5701414937003064442L;
-    
+
     private final Status status;
     private final String id;
     private final String applicationId;
@@ -44,12 +40,12 @@ public class UsageStatistic implements HasId, Serializable {
     private final Map<String,String> metadata;
 
     public UsageStatistic(
-            @JsonProperty("status") Status status, 
-            @JsonProperty("id") String id, 
+            @JsonProperty("status") Status status,
+            @JsonProperty("id") String id,
             @JsonProperty("applicationId") String applicationId,
             @JsonProperty("start") String start,
             @JsonProperty("end") String end,
-            @JsonProperty("duration") long duration, 
+            @JsonProperty("duration") long duration,
             @JsonProperty("metadata") Map<String, String> metadata) {
         this.status = checkNotNull(status, "status");
         this.id = checkNotNull(id, "id");
@@ -92,20 +88,20 @@ public class UsageStatistic implements HasId, Serializable {
     @Override
     public boolean equals(Object o) {
         if (this == o) return true;
-        if (o == null || getClass() != o.getClass()) return false;
-        UsageStatistic statistic = (UsageStatistic) o;
-
-        return Objects.equal(status, statistic.status) &&
-                Objects.equal(id, statistic.id) &&
-                Objects.equal(applicationId, statistic.applicationId) &&
-                Objects.equal(start, statistic.start) &&
-                Objects.equal(end, statistic.end) &&
-                Objects.equal(metadata, statistic.metadata);
+        if (!(o instanceof UsageStatistic)) return false;
+        UsageStatistic that = (UsageStatistic) o;
+        return duration == that.duration &&
+                status == that.status &&
+                Objects.equals(id, that.id) &&
+                Objects.equals(applicationId, that.applicationId) &&
+                Objects.equals(start, that.start) &&
+                Objects.equals(end, that.end) &&
+                Objects.equals(metadata, that.metadata);
     }
 
     @Override
     public int hashCode() {
-        return Objects.hashCode(status, id, applicationId, start, end, metadata);
+        return Objects.hash(status, id, applicationId, start, end, duration, metadata);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/1a53a3f9/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/UsageStatistics.java
----------------------------------------------------------------------
diff --git a/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/UsageStatistics.java b/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/UsageStatistics.java
index 97b09cd..cef3316 100644
--- a/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/UsageStatistics.java
+++ b/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/UsageStatistics.java
@@ -22,20 +22,16 @@ import java.io.Serializable;
 import java.net.URI;
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
 
-import org.codehaus.jackson.annotate.JsonProperty;
-
-import com.google.common.base.Objects;
+import com.fasterxml.jackson.annotation.JsonProperty;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 
-/**
- * @author Aled Sage
- */
 public class UsageStatistics implements Serializable {
 
     private static final long serialVersionUID = -1842301852728290967L;
-    
+
     // TODO populate links with /apps endpoint to link to /usage/applications/{id}, to make it more
     // RESTy
 
@@ -58,19 +54,23 @@ public class UsageStatistics implements Serializable {
 
     @Override
     public boolean equals(Object o) {
-        if (!(o instanceof UsageStatistics))
-            return false;
-        UsageStatistics other = (UsageStatistics) o;
-        return Objects.equal(statistics, other.statistics);
+        if (this == o) return true;
+        if (!(o instanceof UsageStatistics)) return false;
+        UsageStatistics that = (UsageStatistics) o;
+        return Objects.equals(statistics, that.statistics) &&
+                Objects.equals(links, that.links);
     }
 
     @Override
     public int hashCode() {
-        return Objects.hashCode(statistics);
+        return Objects.hash(statistics, links);
     }
 
     @Override
     public String toString() {
-        return "UsageStatistics{" + "statistics=" + statistics + ", links=" + links + '}';
+        return "UsageStatistics{" +
+                "statistics=" + statistics +
+                ", links=" + links +
+                '}';
     }
 }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/1a53a3f9/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/VersionSummary.java
----------------------------------------------------------------------
diff --git a/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/VersionSummary.java b/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/VersionSummary.java
index 6ebf5e7..3e36cb5 100644
--- a/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/VersionSummary.java
+++ b/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/VersionSummary.java
@@ -23,16 +23,17 @@ import static com.google.common.base.Preconditions.checkNotNull;
 import java.io.Serializable;
 import java.util.Collections;
 import java.util.List;
+import java.util.Objects;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
-import org.codehaus.jackson.annotate.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonProperty;
 
 public class VersionSummary implements Serializable {
 
     private static final long serialVersionUID = 7275038546963638540L;
-    
+
     private final String version;
     private final String buildSha1;
     private final String buildBranch;
@@ -77,4 +78,29 @@ public class VersionSummary implements Serializable {
         return features;
     }
 
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (!(o instanceof VersionSummary)) return false;
+        VersionSummary that = (VersionSummary) o;
+        return Objects.equals(version, that.version) &&
+                Objects.equals(buildSha1, that.buildSha1) &&
+                Objects.equals(buildBranch, that.buildBranch) &&
+                Objects.equals(features, that.features);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(version, buildSha1, buildBranch, features);
+    }
+
+    @Override
+    public String toString() {
+        return "VersionSummary{" +
+                "version='" + version + '\'' +
+                ", buildSha1='" + buildSha1 + '\'' +
+                ", buildBranch='" + buildBranch + '\'' +
+                ", features=" + features +
+                '}';
+    }
 }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/1a53a3f9/rest/rest-api/src/main/webapp/WEB-INF/web.xml
----------------------------------------------------------------------
diff --git a/rest/rest-api/src/main/webapp/WEB-INF/web.xml b/rest/rest-api/src/main/webapp/WEB-INF/web.xml
index 06331bd..bab259b 100644
--- a/rest/rest-api/src/main/webapp/WEB-INF/web.xml
+++ b/rest/rest-api/src/main/webapp/WEB-INF/web.xml
@@ -83,14 +83,14 @@
         <!-- load our REST API jersey resources -->
         <init-param>
             <param-name>com.sun.jersey.config.property.packages</param-name>
-            <param-value>io.swagger.jaxrs.listing;org.codehaus.jackson.jaxrs;org.apache.brooklyn.rest.resources;org.apache.brooklyn.rest.util</param-value>
+            <param-value>io.swagger.jaxrs.listing;com.fasterxml.jackson.jaxrs;org.apache.brooklyn.rest.resources;org.apache.brooklyn.rest.util</param-value>
         </init-param>
 
         <!-- install Jackson and turn on pojo/json serialization (could add org.codehaus.jackson.jaxrs 
              above but seems cleaner to pull in just the class -->
         <init-param>  
             <param-name>com.sun.jersey.config.property.classnames</param-name>
-            <param-value>org.codehaus.jackson.jaxrs.JacksonJsonProvider</param-value>
+            <param-value>com.fasterxml.jackson.jaxrs.JacksonJsonProvider</param-value>
         </init-param>
         <init-param>
             <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/1a53a3f9/rest/rest-api/src/test/java/org/apache/brooklyn/rest/domain/AbstractDomainTest.java
----------------------------------------------------------------------
diff --git a/rest/rest-api/src/test/java/org/apache/brooklyn/rest/domain/AbstractDomainTest.java b/rest/rest-api/src/test/java/org/apache/brooklyn/rest/domain/AbstractDomainTest.java
new file mode 100644
index 0000000..dc1131d
--- /dev/null
+++ b/rest/rest-api/src/test/java/org/apache/brooklyn/rest/domain/AbstractDomainTest.java
@@ -0,0 +1,44 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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 org.apache.brooklyn.rest.domain;
+
+import java.io.IOException;
+
+import org.testng.annotations.Test;
+
+import static org.apache.brooklyn.rest.util.RestApiTestUtils.asJson;
+import static org.apache.brooklyn.rest.util.RestApiTestUtils.fromJson;
+import static org.apache.brooklyn.rest.util.RestApiTestUtils.jsonFixture;
+import static org.testng.Assert.assertEquals;
+
+public abstract class AbstractDomainTest {
+
+    protected abstract String getPath();
+    protected abstract Object getDomainObject();
+
+    @Test
+    public void testSerializeToJSON() throws IOException {
+        assertEquals(asJson(getDomainObject()), jsonFixture(getPath()));
+    }
+
+    @Test
+    public void testDeserializeFromJSON() throws IOException {
+        assertEquals(fromJson(jsonFixture(getPath()), getDomainObject().getClass()), getDomainObject());
+    }
+}

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/1a53a3f9/rest/rest-api/src/test/java/org/apache/brooklyn/rest/domain/ApiErrorTest.java
----------------------------------------------------------------------
diff --git a/rest/rest-api/src/test/java/org/apache/brooklyn/rest/domain/ApiErrorTest.java b/rest/rest-api/src/test/java/org/apache/brooklyn/rest/domain/ApiErrorTest.java
index 3b370a0..f73bd30 100644
--- a/rest/rest-api/src/test/java/org/apache/brooklyn/rest/domain/ApiErrorTest.java
+++ b/rest/rest-api/src/test/java/org/apache/brooklyn/rest/domain/ApiErrorTest.java
@@ -25,19 +25,27 @@ import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertFalse;
 
 import java.io.IOException;
+import java.net.URI;
 
 import org.testng.annotations.Test;
 import org.testng.util.Strings;
 
-public class ApiErrorTest {
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
 
-    @Test
-    public void testSerializeApiError() throws IOException {
-        ApiError error = ApiError.builder()
+public class ApiErrorTest extends AbstractDomainTest {
+
+    @Override
+    protected String getPath() {
+        return "fixtures/api-error-basic.json";
+    }
+
+    @Override
+    protected Object getDomainObject() {
+        return ApiError.builder()
                 .message("explanatory message")
                 .details("accompanying details")
                 .build();
-        assertEquals(asJson(error), jsonFixture("fixtures/api-error-basic.json"));
     }
 
     @Test

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/1a53a3f9/rest/rest-api/src/test/java/org/apache/brooklyn/rest/domain/ApplicationSpecTest.java
----------------------------------------------------------------------
diff --git a/rest/rest-api/src/test/java/org/apache/brooklyn/rest/domain/ApplicationSpecTest.java b/rest/rest-api/src/test/java/org/apache/brooklyn/rest/domain/ApplicationSpecTest.java
index a04d074..b2690d6 100644
--- a/rest/rest-api/src/test/java/org/apache/brooklyn/rest/domain/ApplicationSpecTest.java
+++ b/rest/rest-api/src/test/java/org/apache/brooklyn/rest/domain/ApplicationSpecTest.java
@@ -18,36 +18,23 @@
  */
 package org.apache.brooklyn.rest.domain;
 
-import static org.apache.brooklyn.rest.util.RestApiTestUtils.asJson;
-import static org.apache.brooklyn.rest.util.RestApiTestUtils.fromJson;
-import static org.apache.brooklyn.rest.util.RestApiTestUtils.jsonFixture;
-import static org.testng.Assert.assertEquals;
-
-import java.io.IOException;
-
-import org.testng.annotations.Test;
-
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
 
-public class ApplicationSpecTest {
+public class ApplicationSpecTest extends AbstractDomainTest {
 
-    final EntitySpec entitySpec = new EntitySpec("Vanilla Java App", "org.apache.brooklyn.entity.java.VanillaJavaApp",
-            ImmutableMap.<String, String>of(
-                    "initialSize", "1",
-                    "creationScriptUrl", "http://my.brooklyn.io/storage/foo.sql"));
-
-    final ApplicationSpec applicationSpec = ApplicationSpec.builder().name("myapp")
-            .entities(ImmutableSet.of(entitySpec)).locations(ImmutableSet.of("/v1/locations/1"))
-            .build();
-
-    @Test
-    public void testSerializeToJSON() throws IOException {
-        assertEquals(asJson(applicationSpec), jsonFixture("fixtures/application-spec.json"));
+    @Override
+    protected String getPath() {
+        return "fixtures/application-spec.json";
     }
 
-    @Test
-    public void testDeserializeFromJSON() throws IOException {
-        assertEquals(fromJson(jsonFixture("fixtures/application-spec.json"), ApplicationSpec.class), applicationSpec);
+    @Override
+    protected Object getDomainObject() {
+        EntitySpec entitySpec = new EntitySpec("Vanilla Java App", "org.apache.brooklyn.entity.java.VanillaJavaApp",
+                ImmutableMap.of("initialSize", "1", "creationScriptUrl", "http://my.brooklyn.io/storage/foo.sql"));
+        return ApplicationSpec.builder().name("myapp")
+                .entities(ImmutableSet.of(entitySpec)).locations(ImmutableSet.of("/v1/locations/1"))
+                .build();
     }
+
 }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/1a53a3f9/rest/rest-api/src/test/java/org/apache/brooklyn/rest/domain/EffectorSummaryTest.java
----------------------------------------------------------------------
diff --git a/rest/rest-api/src/test/java/org/apache/brooklyn/rest/domain/EffectorSummaryTest.java b/rest/rest-api/src/test/java/org/apache/brooklyn/rest/domain/EffectorSummaryTest.java
index affce4e..71cb64d 100644
--- a/rest/rest-api/src/test/java/org/apache/brooklyn/rest/domain/EffectorSummaryTest.java
+++ b/rest/rest-api/src/test/java/org/apache/brooklyn/rest/domain/EffectorSummaryTest.java
@@ -18,36 +18,27 @@
  */
 package org.apache.brooklyn.rest.domain;
 
-import static org.apache.brooklyn.rest.util.RestApiTestUtils.asJson;
-import static org.apache.brooklyn.rest.util.RestApiTestUtils.fromJson;
-import static org.apache.brooklyn.rest.util.RestApiTestUtils.jsonFixture;
-import static org.testng.Assert.assertEquals;
-
-import java.io.IOException;
 import java.net.URI;
 
-import org.testng.annotations.Test;
-
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
 
-public class EffectorSummaryTest {
+public class EffectorSummaryTest extends AbstractDomainTest {
 
-    final EffectorSummary effectorSummary = new EffectorSummary(
-            "stop",
-            "void",
-            ImmutableSet.<EffectorSummary.ParameterSummary<?>>of(),
-            "Effector description",
-            ImmutableMap.of(
-                    "self", URI.create("/v1/applications/redis-app/entities/redis-ent/effectors/stop")));
-
-    @Test
-    public void testSerializeToJSON() throws IOException {
-        assertEquals(asJson(effectorSummary), jsonFixture("fixtures/effector-summary.json"));
+    @Override
+    protected String getPath() {
+        return "fixtures/effector-summary.json";
     }
 
-    @Test
-    public void testDeserializeFromJSON() throws IOException {
-        assertEquals(fromJson(jsonFixture("fixtures/effector-summary.json"), EffectorSummary.class), effectorSummary);
+    @Override
+    protected Object getDomainObject() {
+        return new EffectorSummary(
+                "stop",
+                "void",
+                ImmutableSet.<EffectorSummary.ParameterSummary<?>>of(),
+                "Effector description",
+                ImmutableMap.of(
+                        "self", URI.create("/v1/applications/redis-app/entities/redis-ent/effectors/stop")));
     }
+
 }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/1a53a3f9/rest/rest-api/src/test/java/org/apache/brooklyn/rest/domain/EntitySpecTest.java
----------------------------------------------------------------------
diff --git a/rest/rest-api/src/test/java/org/apache/brooklyn/rest/domain/EntitySpecTest.java b/rest/rest-api/src/test/java/org/apache/brooklyn/rest/domain/EntitySpecTest.java
index a61cfd5..1beb078 100644
--- a/rest/rest-api/src/test/java/org/apache/brooklyn/rest/domain/EntitySpecTest.java
+++ b/rest/rest-api/src/test/java/org/apache/brooklyn/rest/domain/EntitySpecTest.java
@@ -18,7 +18,6 @@
  */
 package org.apache.brooklyn.rest.domain;
 
-import static org.apache.brooklyn.rest.util.RestApiTestUtils.asJson;
 import static org.apache.brooklyn.rest.util.RestApiTestUtils.fromJson;
 import static org.apache.brooklyn.rest.util.RestApiTestUtils.jsonFixture;
 import static org.testng.Assert.assertEquals;
@@ -27,24 +26,23 @@ import java.io.IOException;
 
 import org.testng.annotations.Test;
 
-public class EntitySpecTest {
+public class EntitySpecTest extends AbstractDomainTest {
 
-    final EntitySpec entitySpec = new EntitySpec("Vanilla Java App", "org.apache.brooklyn.entity.java.VanillaJavaApp");
-
-    @Test
-    public void testSerializeToJSON() throws IOException {
-        assertEquals(asJson(new EntitySpec[] { entitySpec }), jsonFixture("fixtures/entity.json"));
+    @Override
+    protected String getPath() {
+        return "fixtures/entity.json";
     }
 
-    @Test
-    public void testDeserializeFromJSON() throws IOException {
-        assertEquals(fromJson(jsonFixture("fixtures/entity.json"), EntitySpec[].class), new EntitySpec[] { entitySpec });
+    @Override
+    protected Object getDomainObject() {
+        EntitySpec entitySpec = new EntitySpec("Vanilla Java App", "org.apache.brooklyn.entity.java.VanillaJavaApp");
+        return new EntitySpec[] { entitySpec };
     }
 
     @Test
     public void testDeserializeFromJSONOnlyWithType() throws IOException {
         EntitySpec actual = fromJson(jsonFixture("fixtures/entity-only-type.json"), EntitySpec.class);
-        assertEquals(actual.getName(), actual.getType());
+        assertEquals(actual.getType(), "org.apache.brooklyn.entity.java.VanillaJavaApp");
         assertEquals(actual.getConfig().size(), 0);
     }
 }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/1a53a3f9/rest/rest-api/src/test/java/org/apache/brooklyn/rest/domain/EntitySummaryTest.java
----------------------------------------------------------------------
diff --git a/rest/rest-api/src/test/java/org/apache/brooklyn/rest/domain/EntitySummaryTest.java b/rest/rest-api/src/test/java/org/apache/brooklyn/rest/domain/EntitySummaryTest.java
index 7f20d7b..2d39cc9 100644
--- a/rest/rest-api/src/test/java/org/apache/brooklyn/rest/domain/EntitySummaryTest.java
+++ b/rest/rest-api/src/test/java/org/apache/brooklyn/rest/domain/EntitySummaryTest.java
@@ -18,24 +18,21 @@
  */
 package org.apache.brooklyn.rest.domain;
 
-import static org.apache.brooklyn.rest.util.RestApiTestUtils.asJson;
-import static org.apache.brooklyn.rest.util.RestApiTestUtils.fromJson;
-import static org.apache.brooklyn.rest.util.RestApiTestUtils.jsonFixture;
-import static org.testng.Assert.assertEquals;
-
-import java.io.IOException;
 import java.net.URI;
 import java.util.Map;
 
-import org.testng.annotations.Test;
-
 import com.google.common.collect.Maps;
 
-public class EntitySummaryTest {
+public class EntitySummaryTest extends AbstractDomainTest {
+
+    @Override
+    protected String getPath() {
+        return "fixtures/entity-summary.json";
+    }
 
-    static final Map<String, URI> links;
-    static {
-        links = Maps.newLinkedHashMap();
+    @Override
+    protected Object getDomainObject() {
+        Map<String, URI> links = Maps.newLinkedHashMap();
         links.put("self", URI.create("/v1/applications/tesr/entities/zQsqdXzi"));
         links.put("catalog", URI.create("/v1/catalog/entities/org.apache.brooklyn.entity.webapp.tomcat.TomcatServer"));
         links.put("application", URI.create("/v1/applications/tesr"));
@@ -43,19 +40,9 @@ public class EntitySummaryTest {
         links.put("effectors", URI.create("fixtures/effector-summary-list.json"));
         links.put("sensors", URI.create("fixtures/sensor-summary-list.json"));
         links.put("activities", URI.create("fixtures/task-summary-list.json"));
-    }
-
-    static final EntitySummary entitySummary = new EntitySummary("zQsqdXzi", "MyTomcat",
-            "org.apache.brooklyn.entity.webapp.tomcat.TomcatServer", null, links);
-
-    @Test
-    public void testSerializeToJSON() throws IOException {
-        assertEquals(asJson(entitySummary), jsonFixture("fixtures/entity-summary.json"));
-    }
 
-    @Test
-    public void testDeserializeFromJSON() throws IOException {
-        assertEquals(fromJson(jsonFixture("fixtures/entity-summary.json"), EntitySummary.class), entitySummary);
+        return new EntitySummary("zQsqdXzi", "MyTomcat",
+                "org.apache.brooklyn.entity.webapp.tomcat.TomcatServer", null, links);
     }
 
 }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/1a53a3f9/rest/rest-api/src/test/java/org/apache/brooklyn/rest/domain/LocationSummaryTest.java
----------------------------------------------------------------------
diff --git a/rest/rest-api/src/test/java/org/apache/brooklyn/rest/domain/LocationSummaryTest.java b/rest/rest-api/src/test/java/org/apache/brooklyn/rest/domain/LocationSummaryTest.java
new file mode 100644
index 0000000..6279546
--- /dev/null
+++ b/rest/rest-api/src/test/java/org/apache/brooklyn/rest/domain/LocationSummaryTest.java
@@ -0,0 +1,41 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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 org.apache.brooklyn.rest.domain;
+
+import java.net.URI;
+import java.util.Map;
+
+import com.google.common.collect.Maps;
+
+public class LocationSummaryTest extends AbstractDomainTest {
+
+    @Override
+    protected String getPath() {
+        return "fixtures/location-summary.json";
+    }
+
+    @Override
+    protected Object getDomainObject() {
+        Map<String, URI> links = Maps.newLinkedHashMap();
+        links.put("self", URI.create("/v1/locations/123"));
+
+        return new LocationSummary("123", "localhost", "localhost", null, null, links);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/1a53a3f9/rest/rest-api/src/test/java/org/apache/brooklyn/rest/domain/VersionSummaryTest.java
----------------------------------------------------------------------
diff --git a/rest/rest-api/src/test/java/org/apache/brooklyn/rest/domain/VersionSummaryTest.java b/rest/rest-api/src/test/java/org/apache/brooklyn/rest/domain/VersionSummaryTest.java
index bd4c2f0..7bed51b 100644
--- a/rest/rest-api/src/test/java/org/apache/brooklyn/rest/domain/VersionSummaryTest.java
+++ b/rest/rest-api/src/test/java/org/apache/brooklyn/rest/domain/VersionSummaryTest.java
@@ -19,44 +19,31 @@
 
 package org.apache.brooklyn.rest.domain;
 
-import static org.apache.brooklyn.rest.util.RestApiTestUtils.asJson;
-import static org.apache.brooklyn.rest.util.RestApiTestUtils.fromJson;
-import static org.apache.brooklyn.rest.util.RestApiTestUtils.jsonFixture;
-import static org.testng.Assert.assertEquals;
-
-import org.testng.annotations.Test;
-
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 
-public class VersionSummaryTest {
-
-    BrooklynFeatureSummary features = new BrooklynFeatureSummary(
-            "Sample Brooklyn Project com.acme.sample:brooklyn-sample v0.1.0-SNAPSHOT",
-            "com.acme.sample.brooklyn-sample",
-            "0.1.0.SNAPSHOT",
-            "523305000",
-            ImmutableMap.of("Brooklyn-Feature-Build-Id", "e0fee1adf795c84eec4735f039503eb18d9c35cc")
-    );
-    VersionSummary summary = new VersionSummary(
-            "0.7.0-SNAPSHOT",
-            "cb4f0a3af2f5042222dd176edc102bfa64e7e0b5",
-            "versions",
-            ImmutableList.of(features)
-    );
+public class VersionSummaryTest  extends AbstractDomainTest {
 
-    @Test
-    public void testSerialize() {
-        assertEquals(asJson(summary), jsonFixture("fixtures/server-version.json"));
+    @Override
+    protected String getPath() {
+        return "fixtures/server-version.json";
     }
 
-    @Test
-    public void testDeserialize() {
-        VersionSummary deserialized = fromJson(jsonFixture("fixtures/server-version.json"), VersionSummary.class);
-        assertEquals(deserialized.getBuildSha1(), summary.getBuildSha1());
-        assertEquals(deserialized.getFeatures().size(), 1);
-        assertEquals(deserialized.getFeatures().get(0).getSymbolicName(), features.getSymbolicName());
-        assertEquals(deserialized.getFeatures().get(0).getAdditionalData().get("Brooklyn-Feature-Build-Id"), "e0fee1adf795c84eec4735f039503eb18d9c35cc");
+    @Override
+    protected Object getDomainObject() {
+        BrooklynFeatureSummary features = new BrooklynFeatureSummary(
+                "Sample Brooklyn Project com.acme.sample:brooklyn-sample v0.1.0-SNAPSHOT",
+                "com.acme.sample.brooklyn-sample",
+                "0.1.0.SNAPSHOT",
+                "523305000",
+                ImmutableMap.of("Brooklyn-Feature-Build-Id", "e0fee1adf795c84eec4735f039503eb18d9c35cc")
+        );
+        return new VersionSummary(
+                "0.7.0-SNAPSHOT",
+                "cb4f0a3af2f5042222dd176edc102bfa64e7e0b5",
+                "versions",
+                ImmutableList.of(features)
+        );
     }
 
 }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/1a53a3f9/rest/rest-api/src/test/java/org/apache/brooklyn/rest/util/RestApiTestUtils.java
----------------------------------------------------------------------
diff --git a/rest/rest-api/src/test/java/org/apache/brooklyn/rest/util/RestApiTestUtils.java b/rest/rest-api/src/test/java/org/apache/brooklyn/rest/util/RestApiTestUtils.java
index 379cdfc..36ad69c 100644
--- a/rest/rest-api/src/test/java/org/apache/brooklyn/rest/util/RestApiTestUtils.java
+++ b/rest/rest-api/src/test/java/org/apache/brooklyn/rest/util/RestApiTestUtils.java
@@ -22,8 +22,9 @@ import java.io.InputStream;
 
 import org.apache.brooklyn.util.exceptions.Exceptions;
 import org.apache.brooklyn.util.stream.Streams;
-import org.codehaus.jackson.map.ObjectMapper;
-import org.codehaus.jackson.type.TypeReference;
+
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
 
 public class RestApiTestUtils {
 

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/1a53a3f9/rest/rest-client/pom.xml
----------------------------------------------------------------------
diff --git a/rest/rest-client/pom.xml b/rest/rest-client/pom.xml
index f3fa883..d133518 100644
--- a/rest/rest-client/pom.xml
+++ b/rest/rest-client/pom.xml
@@ -56,7 +56,7 @@
         </dependency>
         <dependency>
             <groupId>org.jboss.resteasy</groupId>
-            <artifactId>resteasy-jackson-provider</artifactId>
+            <artifactId>resteasy-jackson2-provider</artifactId>
             <exclusions>
                 <exclusion>
                     <groupId>org.slf4j</groupId>

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/1a53a3f9/rest/rest-client/src/test/webapp/WEB-INF/web.xml
----------------------------------------------------------------------
diff --git a/rest/rest-client/src/test/webapp/WEB-INF/web.xml b/rest/rest-client/src/test/webapp/WEB-INF/web.xml
index 83d76c0..38b637a 100644
--- a/rest/rest-client/src/test/webapp/WEB-INF/web.xml
+++ b/rest/rest-client/src/test/webapp/WEB-INF/web.xml
@@ -84,7 +84,7 @@
             <param-value>
                 org.apache.brooklyn.rest.apidoc.ApidocHelpMessageBodyWriter;
                 org.apache.brooklyn.rest.util.FormMapProvider;
-                org.codehaus.jackson.jaxrs.JacksonJsonProvider;
+                com.fasterxml.jackson.jaxrs.JacksonJsonProvider;
                 org.apache.brooklyn.rest.resources.ActivityResource;
                 org.apache.brooklyn.rest.resources.ApidocResource;
                 org.apache.brooklyn.rest.resources.ApplicationResource;

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/1a53a3f9/rest/rest-server/pom.xml
----------------------------------------------------------------------
diff --git a/rest/rest-server/pom.xml b/rest/rest-server/pom.xml
index fdee3a5..9b36f69 100644
--- a/rest/rest-server/pom.xml
+++ b/rest/rest-server/pom.xml
@@ -7,9 +7,9 @@
     to you 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
@@ -41,11 +41,6 @@
         </dependency>
         <dependency>
             <groupId>org.apache.brooklyn</groupId>
-            <artifactId>brooklyn-core</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.brooklyn</groupId>
             <artifactId>brooklyn-camp</artifactId>
             <version>${project.version}</version>
         </dependency>
@@ -100,14 +95,12 @@
             <artifactId>slf4j-api</artifactId>
         </dependency>
         <dependency>
-            <groupId>com.sun.jersey</groupId>
-            <artifactId>jersey-json</artifactId>
-            <exclusions>
-                <exclusion>
-                    <groupId>com.sun.xml.bind</groupId>
-                    <artifactId>jaxb-impl</artifactId>
-                </exclusion>
-            </exclusions>
+            <groupId>com.fasterxml.jackson.datatype</groupId>
+            <artifactId>jackson-datatype-guava</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.fasterxml.jackson.jaxrs</groupId>
+            <artifactId>jackson-jaxrs-json-provider</artifactId>
         </dependency>
         <dependency>
             <groupId>com.sun.jersey</groupId>
@@ -133,23 +126,7 @@
             <groupId>org.eclipse.jetty</groupId>
             <artifactId>jetty-servlet</artifactId>
         </dependency>
-        <dependency>
-            <groupId>org.codehaus.jackson</groupId>
-            <artifactId>jackson-core-asl</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.codehaus.jackson</groupId>
-            <artifactId>jackson-mapper-asl</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.codehaus.jackson</groupId>
-            <artifactId>jackson-jaxrs</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.codehaus.jackson</groupId>
-            <artifactId>jackson-xc</artifactId>
-        </dependency>
-        
+
         <dependency>
             <groupId>org.apache.brooklyn</groupId>
             <artifactId>brooklyn-test-support</artifactId>

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/1a53a3f9/rest/rest-server/src/main/java/org/apache/brooklyn/rest/resources/AbstractBrooklynRestResource.java
----------------------------------------------------------------------
diff --git a/rest/rest-server/src/main/java/org/apache/brooklyn/rest/resources/AbstractBrooklynRestResource.java b/rest/rest-server/src/main/java/org/apache/brooklyn/rest/resources/AbstractBrooklynRestResource.java
index a8cc909..9057a2c 100644
--- a/rest/rest-server/src/main/java/org/apache/brooklyn/rest/resources/AbstractBrooklynRestResource.java
+++ b/rest/rest-server/src/main/java/org/apache/brooklyn/rest/resources/AbstractBrooklynRestResource.java
@@ -33,7 +33,8 @@ import org.apache.brooklyn.rest.util.json.BrooklynJacksonJsonProvider;
 import org.apache.brooklyn.util.core.task.Tasks;
 import org.apache.brooklyn.util.guava.Maybe;
 import org.apache.brooklyn.util.time.Duration;
-import org.codehaus.jackson.map.ObjectMapper;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
 
 public abstract class AbstractBrooklynRestResource implements ManagementContextInjectable {
 

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/1a53a3f9/rest/rest-server/src/main/java/org/apache/brooklyn/rest/resources/ApplicationResource.java
----------------------------------------------------------------------
diff --git a/rest/rest-server/src/main/java/org/apache/brooklyn/rest/resources/ApplicationResource.java b/rest/rest-server/src/main/java/org/apache/brooklyn/rest/resources/ApplicationResource.java
index 22a4502..d9c38b6 100644
--- a/rest/rest-server/src/main/java/org/apache/brooklyn/rest/resources/ApplicationResource.java
+++ b/rest/rest-server/src/main/java/org/apache/brooklyn/rest/resources/ApplicationResource.java
@@ -64,6 +64,7 @@ import org.apache.brooklyn.entity.group.AbstractGroup;
 import org.apache.brooklyn.rest.api.ApplicationApi;
 import org.apache.brooklyn.rest.domain.ApplicationSpec;
 import org.apache.brooklyn.rest.domain.ApplicationSummary;
+import org.apache.brooklyn.rest.domain.EntityDetail;
 import org.apache.brooklyn.rest.domain.EntitySummary;
 import org.apache.brooklyn.rest.domain.TaskSummary;
 import org.apache.brooklyn.rest.filter.HaHotStateRequired;
@@ -79,15 +80,14 @@ import org.apache.brooklyn.util.exceptions.UserFacingException;
 import org.apache.brooklyn.util.guava.Maybe;
 import org.apache.brooklyn.util.javalang.JavaClassNames;
 import org.apache.brooklyn.util.text.Strings;
-import org.codehaus.jackson.JsonNode;
-import org.codehaus.jackson.node.ArrayNode;
-import org.codehaus.jackson.node.ObjectNode;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import com.google.common.base.Throwables;
 import com.google.common.collect.FluentIterable;
+import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Iterables;
+import com.google.common.collect.Lists;
 
 @HaHotStateRequired
 public class ApplicationResource extends AbstractBrooklynRestResource implements ApplicationApi {
@@ -97,127 +97,88 @@ public class ApplicationResource extends AbstractBrooklynRestResource implements
     @Context
     private UriInfo uriInfo;
 
-    /** @deprecated since 0.6.0 use {@link #fetch(String)} (with slightly different, but better semantics) */
-    @Deprecated
-    @Override
-    public JsonNode applicationTree() {
-        ArrayNode apps = mapper().createArrayNode();
-        for (Application application : mgmt().getApplications())
-            apps.add(recursiveTreeFromEntity(application));
-        return apps;
-    }
-
-    private ObjectNode entityBase(Entity entity) {
-        ObjectNode aRoot = mapper().createObjectNode();
-        aRoot.put("name", entity.getDisplayName());
-        aRoot.put("id", entity.getId());
-        aRoot.put("type", entity.getEntityType().getName());
-
+    private EntityDetail fromEntity(Entity entity) {
         Boolean serviceUp = entity.getAttribute(Attributes.SERVICE_UP);
-        if (serviceUp!=null) aRoot.put("serviceUp", serviceUp);
 
         Lifecycle serviceState = entity.getAttribute(Attributes.SERVICE_STATE_ACTUAL);
-        if (serviceState!=null) aRoot.put("serviceState", serviceState.toString());
 
         String iconUrl = entity.getIconUrl();
         if (iconUrl!=null) {
             if (brooklyn().isUrlServerSideAndSafe(iconUrl))
                 // route to server if it is a server-side url
                 iconUrl = EntityTransformer.entityUri(entity)+"/icon";
-            aRoot.put("iconUrl", iconUrl);
         }
 
-        return aRoot;
-    }
-
-    private JsonNode recursiveTreeFromEntity(Entity entity) {
-        ObjectNode aRoot = entityBase(entity);
-
-        if (!entity.getChildren().isEmpty())
-            aRoot.put("children", childEntitiesRecursiveAsArray(entity));
-
-        return aRoot;
-    }
-
-    // TODO when applicationTree can be removed, replace this with an extension to EntitySummary (without links)
-    private JsonNode fromEntity(Entity entity) {
-        ObjectNode aRoot = entityBase(entity);
-
-        aRoot.put("applicationId", entity.getApplicationId());
-
-        if (entity.getParent()!=null) {
-            aRoot.put("parentId", entity.getParent().getId());
+        List<EntitySummary> children = Lists.newArrayList();
+        if (!entity.getChildren().isEmpty()) {
+            for (Entity child : entity.getChildren()) {
+                children.add(fromEntity(child));
+            }
         }
 
-        if (!entity.groups().isEmpty())
-            aRoot.put("groupIds", entitiesIdAsArray(entity.groups()));
+        String parentId = null;
+        if (entity.getParent()!= null) {
+            parentId = entity.getParent().getId();
+        }
 
-        if (!entity.getChildren().isEmpty())
-            aRoot.put("children", entitiesIdAndNameAsArray(entity.getChildren()));
+        List<String> groupIds = Lists.newArrayList();
+        if (!entity.groups().isEmpty()) {
+            groupIds.addAll(entitiesIdAsArray(entity.groups()));
+        }
 
+        List<Map<String, String>> members = Lists.newArrayList();
         if (entity instanceof Group) {
             // use attribute instead of method in case it is read-only
-            Collection<Entity> members = entity.getAttribute(AbstractGroup.GROUP_MEMBERS);
-            if (members!=null && !members.isEmpty())
-                aRoot.put("members", entitiesIdAndNameAsArray(members));
+            Collection<Entity> memberEntities = entity.getAttribute(AbstractGroup.GROUP_MEMBERS);
+            if (memberEntities != null && !memberEntities.isEmpty())
+                members.addAll(entitiesIdAndNameAsList(memberEntities));
         }
 
-        return aRoot;
+        return new EntityDetail(entity.getId(), parentId, entity.getDisplayName(),
+                entity.getEntityType().getName(), serviceUp, serviceState, iconUrl, entity.getCatalogItemId(),
+                children, groupIds, members);
     }
 
-    private ArrayNode childEntitiesRecursiveAsArray(Entity entity) {
-        ArrayNode node = mapper().createArrayNode();
-        for (Entity e : entity.getChildren()) {
-            if (Entitlements.isEntitled(mgmt().getEntitlementManager(), Entitlements.SEE_ENTITY, entity)) {
-                node.add(recursiveTreeFromEntity(e));
-            }
-        }
-        return node;
-    }
-
-    private ArrayNode entitiesIdAndNameAsArray(Collection<? extends Entity> entities) {
-        ArrayNode node = mapper().createArrayNode();
+    private List<Map<String, String>> entitiesIdAndNameAsList(Collection<? extends Entity> entities) {
+        List<Map<String, String>> members = Lists.newArrayList();
         for (Entity entity : entities) {
             if (Entitlements.isEntitled(mgmt().getEntitlementManager(), Entitlements.SEE_ENTITY, entity)) {
-                ObjectNode holder = mapper().createObjectNode();
-                holder.put("id", entity.getId());
-                holder.put("name", entity.getDisplayName());
-                node.add(holder);
+                members.add(ImmutableMap.of("id", entity.getId(), "name", entity.getDisplayName()));
             }
         }
-        return node;
+        return members;
     }
 
-    private ArrayNode entitiesIdAsArray(Iterable<? extends Entity> entities) {
-        ArrayNode node = mapper().createArrayNode();
+    private List<String> entitiesIdAsArray(Iterable<? extends Entity> entities) {
+        List<String> ids = Lists.newArrayList();
         for (Entity entity : entities) {
             if (Entitlements.isEntitled(mgmt().getEntitlementManager(), Entitlements.SEE_ENTITY, entity)) {
-                node.add(entity.getId());
+                ids.add(entity.getId());
             }
         }
-        return node;
+        return ids;
     }
 
     @Override
-    public JsonNode fetch(String entityIds) {
-        Map<String, JsonNode> jsonEntitiesById = MutableMap.of();
-        for (Application application : mgmt().getApplications())
-            jsonEntitiesById.put(application.getId(), fromEntity(application));
+    public List<EntityDetail> fetch(String entityIds) {
+
+        List<EntityDetail> entitySummaries = Lists.newArrayList();
+        for (Entity application : mgmt().getApplications()) {
+            entitySummaries.add(fromEntity(application));
+        }
+
         if (entityIds != null) {
             for (String entityId: entityIds.split(",")) {
                 Entity entity = mgmt().getEntityManager().getEntity(entityId.trim());
                 while (entity != null && entity.getParent() != null) {
                     if (Entitlements.isEntitled(mgmt().getEntitlementManager(), Entitlements.SEE_ENTITY, entity)) {
-                        jsonEntitiesById.put(entity.getId(), fromEntity(entity));
+                        entitySummaries.add(fromEntity(entity));
                     }
                     entity = entity.getParent();
                 }
             }
         }
-
-        ArrayNode result = mapper().createArrayNode();
-        for (JsonNode n: jsonEntitiesById.values()) result.add(n);
-        return result;
+        return entitySummaries;
     }
 
     @Override
@@ -280,7 +241,7 @@ public class ApplicationResource extends AbstractBrooklynRestResource implements
 
         log.debug("Creating app from yaml:\n{}", yaml);
         EntitySpec<? extends Application> spec = createEntitySpecForApplication(yaml);
-        
+
         if (!Entitlements.isEntitled(mgmt().getEntitlementManager(), Entitlements.DEPLOY_APPLICATION, spec)) {
             throw WebResourceUtils.unauthorized("User '%s' is not authorized to start application %s",
                 Entitlements.getEntitlementContext().user(), yaml);
@@ -361,7 +322,7 @@ public class ApplicationResource extends AbstractBrooklynRestResource implements
     @Override
     public Response delete(String application) {
         Application app = brooklyn().getApplication(application);
-        if (!Entitlements.isEntitled(mgmt().getEntitlementManager(), Entitlements.INVOKE_EFFECTOR, Entitlements.EntityAndItem.of(app, 
+        if (!Entitlements.isEntitled(mgmt().getEntitlementManager(), Entitlements.INVOKE_EFFECTOR, Entitlements.EntityAndItem.of(app,
             StringAndArgument.of(Entitlements.LifecycleEffectors.DELETE, null)))) {
             throw WebResourceUtils.unauthorized("User '%s' is not authorized to delete application %s",
                 Entitlements.getEntitlementContext().user(), app);
@@ -385,7 +346,7 @@ public class ApplicationResource extends AbstractBrooklynRestResource implements
             }
         }
     }
-    
+
     private void checkApplicationTypesAreValid(ApplicationSpec applicationSpec) {
         String appType = applicationSpec.getType();
         if (appType != null) {
@@ -410,7 +371,7 @@ public class ApplicationResource extends AbstractBrooklynRestResource implements
             typeV.get();
             return;
         }
-        
+
         // not found, try classloading
         try {
             brooklyn().getCatalogClassLoader().loadClass(type);
@@ -420,7 +381,7 @@ public class ApplicationResource extends AbstractBrooklynRestResource implements
         }
         log.info(JavaClassNames.simpleClassName(subType)+" type '{}' not defined in catalog but is on classpath; continuing", type);
     }
-    
+
     private void checkEntityTypeIsValid(String type) {
         checkSpecTypeIsValid(type, Entity.class);
     }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/1a53a3f9/rest/rest-server/src/main/java/org/apache/brooklyn/rest/util/WebResourceUtils.java
----------------------------------------------------------------------
diff --git a/rest/rest-server/src/main/java/org/apache/brooklyn/rest/util/WebResourceUtils.java b/rest/rest-server/src/main/java/org/apache/brooklyn/rest/util/WebResourceUtils.java
index 1a74a33..da72c6f 100644
--- a/rest/rest-server/src/main/java/org/apache/brooklyn/rest/util/WebResourceUtils.java
+++ b/rest/rest-server/src/main/java/org/apache/brooklyn/rest/util/WebResourceUtils.java
@@ -27,7 +27,6 @@ import javax.ws.rs.WebApplicationException;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
 
-import org.codehaus.jackson.map.ObjectMapper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.apache.brooklyn.core.catalog.internal.CatalogUtils;
@@ -37,6 +36,7 @@ import org.apache.brooklyn.util.exceptions.Exceptions;
 import org.apache.brooklyn.util.net.Urls;
 import org.apache.brooklyn.util.text.StringEscapes.JavaStringEscapes;
 
+import com.fasterxml.jackson.databind.ObjectMapper;
 import com.google.common.collect.ImmutableMap;
 import com.sun.jersey.spi.container.ContainerResponse;
 

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/1a53a3f9/rest/rest-server/src/main/java/org/apache/brooklyn/rest/util/json/BidiSerialization.java
----------------------------------------------------------------------
diff --git a/rest/rest-server/src/main/java/org/apache/brooklyn/rest/util/json/BidiSerialization.java b/rest/rest-server/src/main/java/org/apache/brooklyn/rest/util/json/BidiSerialization.java
index d53e100..93cae3f 100644
--- a/rest/rest-server/src/main/java/org/apache/brooklyn/rest/util/json/BidiSerialization.java
+++ b/rest/rest-server/src/main/java/org/apache/brooklyn/rest/util/json/BidiSerialization.java
@@ -25,15 +25,14 @@ import org.apache.brooklyn.api.entity.Entity;
 import org.apache.brooklyn.api.location.Location;
 import org.apache.brooklyn.api.mgmt.ManagementContext;
 import org.apache.brooklyn.api.objs.BrooklynObject;
-import org.codehaus.jackson.JsonGenerationException;
-import org.codehaus.jackson.JsonGenerator;
-import org.codehaus.jackson.JsonParser;
-import org.codehaus.jackson.JsonProcessingException;
-import org.codehaus.jackson.map.DeserializationContext;
-import org.codehaus.jackson.map.JsonDeserializer;
-import org.codehaus.jackson.map.JsonSerializer;
-import org.codehaus.jackson.map.SerializerProvider;
-import org.codehaus.jackson.map.module.SimpleModule;
+
+import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.databind.DeserializationContext;
+import com.fasterxml.jackson.databind.JsonDeserializer;
+import com.fasterxml.jackson.databind.JsonSerializer;
+import com.fasterxml.jackson.databind.SerializerProvider;
+import com.fasterxml.jackson.databind.module.SimpleModule;
 
 public class BidiSerialization {
 
@@ -65,14 +64,14 @@ public class BidiSerialization {
 
         protected class Serializer extends JsonSerializer<T> {
             @Override
-            public void serialize(T value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException {
+            public void serialize(T value, JsonGenerator jgen, SerializerProvider provider) throws IOException {
                 AbstractWithManagementContextSerialization.this.serialize(value, jgen, provider);
             }
         }
         
         protected class Deserializer extends JsonDeserializer<T> {
             @Override
-            public T deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException {
+            public T deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException {
                 return AbstractWithManagementContextSerialization.this.deserialize(jp, ctxt);
             }
         }
@@ -95,27 +94,27 @@ public class BidiSerialization {
             return deserializer;
         }
 
-        public void serialize(T value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException {
+        public void serialize(T value, JsonGenerator jgen, SerializerProvider provider) throws IOException {
             jgen.writeStartObject();
             writeBody(value, jgen, provider);
             jgen.writeEndObject();
         }
 
-        protected void writeBody(T value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonGenerationException, JsonProcessingException {
+        protected void writeBody(T value, JsonGenerator jgen, SerializerProvider provider) throws IOException {
             jgen.writeStringField("type", value.getClass().getCanonicalName());
             customWriteBody(value, jgen, provider);
         }
 
-        public abstract void customWriteBody(T value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException;
+        public abstract void customWriteBody(T value, JsonGenerator jgen, SerializerProvider provider) throws IOException;
 
-        public T deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException {
+        public T deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException {
             @SuppressWarnings("unchecked")
             Map<Object,Object> values = jp.readValueAs(Map.class);
             String type = (String) values.get("type");
             return customReadBody(type, values, jp, ctxt);
         }
 
-        protected abstract T customReadBody(String type, Map<Object, Object> values, JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException;
+        protected abstract T customReadBody(String type, Map<Object, Object> values, JsonParser jp, DeserializationContext ctxt) throws IOException;
 
         public void install(SimpleModule module) {
             module.addSerializer(type, serializer);
@@ -126,9 +125,9 @@ public class BidiSerialization {
     public static class ManagementContextSerialization extends AbstractWithManagementContextSerialization<ManagementContext> {
         public ManagementContextSerialization(ManagementContext mgmt) { super(ManagementContext.class, mgmt); }
         @Override
-        public void customWriteBody(ManagementContext value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException {}
+        public void customWriteBody(ManagementContext value, JsonGenerator jgen, SerializerProvider provider) throws IOException {}
         @Override
-        protected ManagementContext customReadBody(String type, Map<Object, Object> values, JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException {
+        protected ManagementContext customReadBody(String type, Map<Object, Object> values, JsonParser jp, DeserializationContext ctxt) throws IOException {
             return mgmt;
         }
     }
@@ -138,16 +137,16 @@ public class BidiSerialization {
             super(type, mgmt);
         }
         @Override
-        protected void writeBody(T value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonGenerationException, JsonProcessingException {
+        protected void writeBody(T value, JsonGenerator jgen, SerializerProvider provider) throws IOException {
             jgen.writeStringField("type", type.getCanonicalName());
             customWriteBody(value, jgen, provider);
         }
         @Override
-        public void customWriteBody(T value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException {
+        public void customWriteBody(T value, JsonGenerator jgen, SerializerProvider provider) throws IOException {
             jgen.writeStringField("id", value.getId());
         }
         @Override
-        protected T customReadBody(String type, Map<Object, Object> values, JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException {
+        protected T customReadBody(String type, Map<Object, Object> values, JsonParser jp, DeserializationContext ctxt) throws IOException {
             return getInstanceFromId((String) values.get("id"));
         }
         protected abstract T getInstanceFromId(String id);