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:08 UTC

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

Repository: brooklyn-server
Updated Branches:
  refs/heads/master 46ae22385 -> 5c8bb4ebb


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/1a53a3f9/rest/rest-server/src/main/java/org/apache/brooklyn/rest/util/json/BrooklynJacksonJsonProvider.java
----------------------------------------------------------------------
diff --git a/rest/rest-server/src/main/java/org/apache/brooklyn/rest/util/json/BrooklynJacksonJsonProvider.java b/rest/rest-server/src/main/java/org/apache/brooklyn/rest/util/json/BrooklynJacksonJsonProvider.java
index 053e8b4..f6d2a08 100644
--- a/rest/rest-server/src/main/java/org/apache/brooklyn/rest/util/json/BrooklynJacksonJsonProvider.java
+++ b/rest/rest-server/src/main/java/org/apache/brooklyn/rest/util/json/BrooklynJacksonJsonProvider.java
@@ -27,18 +27,17 @@ import org.apache.brooklyn.config.ConfigKey;
 import org.apache.brooklyn.core.config.ConfigKeys;
 import org.apache.brooklyn.core.internal.BrooklynProperties;
 import org.apache.brooklyn.core.mgmt.ManagementContextInjectable;
-import org.apache.brooklyn.core.mgmt.internal.ManagementContextInternal;
 import org.apache.brooklyn.core.server.BrooklynServiceAttributes;
 import org.apache.brooklyn.rest.util.OsgiCompat;
-import org.codehaus.jackson.Version;
-import org.codehaus.jackson.jaxrs.JacksonJsonProvider;
-import org.codehaus.jackson.map.ObjectMapper;
-import org.codehaus.jackson.map.SerializationConfig;
-import org.codehaus.jackson.map.module.SimpleModule;
-import org.codehaus.jackson.map.type.TypeFactory;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.fasterxml.jackson.core.Version;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.module.SimpleModule;
+import com.fasterxml.jackson.datatype.guava.GuavaModule;
+import com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider;
+
 public class BrooklynJacksonJsonProvider extends JacksonJsonProvider implements ManagementContextInjectable {
 
     private static final Logger log = LoggerFactory.getLogger(BrooklynJacksonJsonProvider.class);
@@ -107,7 +106,7 @@ public class BrooklynJacksonJsonProvider extends JacksonJsonProvider implements
 
                 mapper = newPrivateObjectMapper(mgmt);
                 log.debug("Storing new ObjectMapper against "+mgmt+" because no ServletContext available: "+mapper);
-                ((ManagementContextInternal)mgmt).getBrooklynProperties().put(key, mapper);
+                ((BrooklynProperties)mgmt.getConfig()).put(key, mapper);
                 return mapper;
             }
         }
@@ -137,25 +136,21 @@ public class BrooklynJacksonJsonProvider extends JacksonJsonProvider implements
             throw new IllegalStateException("No management context available for creating ObjectMapper");
         }
 
-        SerializationConfig defaultConfig = new ObjectMapper().getSerializationConfig();
-        SerializationConfig sc = new SerializationConfig(
-            defaultConfig.getClassIntrospector() /* ObjectMapper.DEFAULT_INTROSPECTOR */,
-            defaultConfig.getAnnotationIntrospector() /* ObjectMapper.DEFAULT_ANNOTATION_INTROSPECTOR */,
-            new PossiblyStrictPreferringFieldsVisibilityChecker(),
-            null, null, TypeFactory.defaultInstance(), null);
-
         ConfigurableSerializerProvider sp = new ConfigurableSerializerProvider();
         sp.setUnknownTypeSerializer(new ErrorAndToStringUnknownTypeSerializer());
 
-        ObjectMapper mapper = new ObjectMapper(null, sp, null, sc, null);
+        ObjectMapper mapper = new ObjectMapper();
+        mapper.setSerializerProvider(sp);
+        mapper.setVisibility(new PossiblyStrictPreferringFieldsVisibilityChecker());
+
         SimpleModule mapperModule = new SimpleModule("Brooklyn", new Version(0, 0, 0, "ignored"));
 
         new BidiSerialization.ManagementContextSerialization(mgmt).install(mapperModule);
         new BidiSerialization.EntitySerialization(mgmt).install(mapperModule);
         new BidiSerialization.LocationSerialization(mgmt).install(mapperModule);
-        mapperModule.addSerializer(new MultimapSerializer());
 
-        mapper.registerModule(mapperModule);
+        mapper.registerModule(new GuavaModule()).registerModule(mapperModule);
+
         return mapper;
     }
 

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/1a53a3f9/rest/rest-server/src/main/java/org/apache/brooklyn/rest/util/json/ConfigurableSerializerProvider.java
----------------------------------------------------------------------
diff --git a/rest/rest-server/src/main/java/org/apache/brooklyn/rest/util/json/ConfigurableSerializerProvider.java b/rest/rest-server/src/main/java/org/apache/brooklyn/rest/util/json/ConfigurableSerializerProvider.java
index 3078524..a84c695 100644
--- a/rest/rest-server/src/main/java/org/apache/brooklyn/rest/util/json/ConfigurableSerializerProvider.java
+++ b/rest/rest-server/src/main/java/org/apache/brooklyn/rest/util/json/ConfigurableSerializerProvider.java
@@ -21,66 +21,62 @@ package org.apache.brooklyn.rest.util.json;
 import java.io.IOException;
 
 import org.apache.brooklyn.util.exceptions.Exceptions;
-import org.codehaus.jackson.JsonGenerator;
-import org.codehaus.jackson.JsonProcessingException;
-import org.codehaus.jackson.JsonStreamContext;
-import org.codehaus.jackson.map.JsonSerializer;
-import org.codehaus.jackson.map.SerializationConfig;
-import org.codehaus.jackson.map.SerializerFactory;
-import org.codehaus.jackson.map.ser.StdSerializerProvider;
-import org.codehaus.jackson.type.JavaType;
+
+import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.core.JsonStreamContext;
+import com.fasterxml.jackson.databind.JavaType;
+import com.fasterxml.jackson.databind.JsonSerializer;
+import com.fasterxml.jackson.databind.SerializationConfig;
+import com.fasterxml.jackson.databind.ser.DefaultSerializerProvider;
+import com.fasterxml.jackson.databind.ser.SerializerFactory;
 
 /** allows the serializer-of-last-resort to be customized, ie used for unknown-types */
-final class ConfigurableSerializerProvider extends StdSerializerProvider {
-    
+final class ConfigurableSerializerProvider extends DefaultSerializerProvider {
+
+    protected JsonSerializer<Object> unknownTypeSerializer;
+
     public ConfigurableSerializerProvider() {}
-    
-    public ConfigurableSerializerProvider(SerializationConfig config) {
-        // NB: not usually necessary to pass config, as object mapper gets its own config set explicitly
-        this(config, new ConfigurableSerializerProvider(), null);
+
+    @Override
+    public DefaultSerializerProvider createInstance(SerializationConfig config, SerializerFactory jsf) {
+        return new ConfigurableSerializerProvider(config, this, jsf);
     }
-    
+
     public ConfigurableSerializerProvider(SerializationConfig config, ConfigurableSerializerProvider src, SerializerFactory jsf) {
-        super(config, src, jsf);
+        super(src, config, jsf);
         unknownTypeSerializer = src.unknownTypeSerializer;
     }
-    
-    protected StdSerializerProvider createInstance(SerializationConfig config, SerializerFactory jsf) {
-        return new ConfigurableSerializerProvider(config, this, jsf);
-    }
 
-    protected JsonSerializer<Object> unknownTypeSerializer;
-    
     public JsonSerializer<Object> getUnknownTypeSerializer(Class<?> unknownType) {
         if (unknownTypeSerializer!=null) return unknownTypeSerializer;
         return super.getUnknownTypeSerializer(unknownType);
     }
-    
+
     public void setUnknownTypeSerializer(JsonSerializer<Object> unknownTypeSerializer) {
         this.unknownTypeSerializer = unknownTypeSerializer;
     }
 
     @Override
-    protected void _serializeValue(JsonGenerator jgen, Object value) throws IOException, JsonProcessingException {
+    public void serializeValue(JsonGenerator jgen, Object value) throws IOException {
         JsonStreamContext ctxt = jgen.getOutputContext();
         try {
-            super._serializeValue(jgen, value);
+            super.serializeValue(jgen, value);
         } catch (Exception e) {
             onSerializationException(ctxt, jgen, value, e);
         }
     }
 
     @Override
-    protected void _serializeValue(JsonGenerator jgen, Object value, JavaType rootType) throws IOException, JsonProcessingException {
+    public void serializeValue(JsonGenerator jgen, Object value, JavaType rootType) throws IOException {
         JsonStreamContext ctxt = jgen.getOutputContext();
         try {
-            super._serializeValue(jgen, value, rootType);
+            super.serializeValue(jgen, value, rootType);
         } catch (Exception e) {
             onSerializationException(ctxt, jgen, value, e);
         }
     }
 
-    protected void onSerializationException(JsonStreamContext ctxt, JsonGenerator jgen, Object value, Exception e) throws IOException, JsonProcessingException {
+    protected void onSerializationException(JsonStreamContext ctxt, JsonGenerator jgen, Object value, Exception e) throws IOException {
         Exceptions.propagateIfFatal(e);
 
         JsonSerializer<Object> unknownTypeSerializer = getUnknownTypeSerializer(value.getClass());

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/1a53a3f9/rest/rest-server/src/main/java/org/apache/brooklyn/rest/util/json/ErrorAndToStringUnknownTypeSerializer.java
----------------------------------------------------------------------
diff --git a/rest/rest-server/src/main/java/org/apache/brooklyn/rest/util/json/ErrorAndToStringUnknownTypeSerializer.java b/rest/rest-server/src/main/java/org/apache/brooklyn/rest/util/json/ErrorAndToStringUnknownTypeSerializer.java
index 8d18c8a..e529ec9 100644
--- a/rest/rest-server/src/main/java/org/apache/brooklyn/rest/util/json/ErrorAndToStringUnknownTypeSerializer.java
+++ b/rest/rest-server/src/main/java/org/apache/brooklyn/rest/util/json/ErrorAndToStringUnknownTypeSerializer.java
@@ -27,43 +27,42 @@ import javax.annotation.Nullable;
 
 import org.apache.brooklyn.util.collections.MutableSet;
 import org.apache.brooklyn.util.javalang.Reflections;
-import org.codehaus.jackson.JsonGenerationException;
-import org.codehaus.jackson.JsonGenerator;
-import org.codehaus.jackson.JsonProcessingException;
-import org.codehaus.jackson.JsonStreamContext;
-import org.codehaus.jackson.map.JsonMappingException;
-import org.codehaus.jackson.map.SerializerProvider;
-import org.codehaus.jackson.map.annotate.JsonSerialize;
-import org.codehaus.jackson.map.ser.impl.UnknownSerializer;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.core.JsonStreamContext;
+import com.fasterxml.jackson.databind.JsonMappingException;
+import com.fasterxml.jackson.databind.SerializerProvider;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.impl.UnknownSerializer;
+
 /**
  * for non-json-serializable classes (quite a lot of them!) simply provide a sensible error message and a toString.
- * TODO maybe we want to attempt to serialize fields instead?  (but being careful not to be self-referential!) 
+ * TODO maybe we want to attempt to serialize fields instead?  (but being careful not to be self-referential!)
  */
 public class ErrorAndToStringUnknownTypeSerializer extends UnknownSerializer {
-    
+
     private static final Logger log = LoggerFactory.getLogger(ErrorAndToStringUnknownTypeSerializer.class);
     private static Set<String> WARNED_CLASSES = Collections.synchronizedSet(MutableSet.<String>of());
-    
+
     @Override
-    public void serialize(Object value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException {
+    public void serialize(Object value, JsonGenerator jgen, SerializerProvider provider) throws IOException {
         if (BidiSerialization.isStrictSerialization())
             throw new JsonMappingException("Cannot serialize object containing "+value.getClass().getName()+" when strict serialization requested");
 
         serializeFromError(jgen.getOutputContext(), null, value, jgen, provider);
     }
 
-    public void serializeFromError(JsonStreamContext ctxt, @Nullable Exception error, Object value, JsonGenerator jgen, SerializerProvider configurableSerializerProvider) throws JsonGenerationException, IOException {
+    public void serializeFromError(JsonStreamContext ctxt, @Nullable Exception error, Object value, JsonGenerator jgen, SerializerProvider configurableSerializerProvider) throws IOException {
         if (log.isDebugEnabled())
             log.debug("Recovering from json serialization error, serializing "+value+": "+error);
-        
+
         if (BidiSerialization.isStrictSerialization())
             throw new JsonMappingException("Cannot serialize "
                 + (ctxt!=null && !ctxt.inRoot() ? "object containing " : "")
                 + value.getClass().getName()+" when strict serialization requested");
-        
+
         if (WARNED_CLASSES.add(value.getClass().getCanonicalName())) {
             log.warn("Standard serialization not possible for "+value.getClass()+" ("+value+")", error);
         }
@@ -73,12 +72,12 @@ public class ErrorAndToStringUnknownTypeSerializer extends UnknownSerializer {
         // without this, when serializing the large (1.5M) Server json object from BrooklynJacksonSerializerTest creates invalid json,
         // containing:  "foo":false,"{"error":true,...
         jgen.flush();
-        
+
         boolean createObject = !newCtxt.inObject() || newCtxt.getCurrentName()!=null;
         if (createObject) {
             jgen.writeStartObject();
         }
-        
+
         if (allowEmpty(value.getClass())) {
             // write nothing
         } else {
@@ -99,16 +98,16 @@ public class ErrorAndToStringUnknownTypeSerializer extends UnknownSerializer {
                 jgen.writeFieldName("causedByError");
                 jgen.writeString(error.toString());
             }
-            
+
         }
-        
+
         if (createObject) {
             jgen.writeEndObject();
         }
-        
+
         while (newCtxt!=null && !newCtxt.equals(ctxt)) {
             if (jgen.getOutputContext().inArray()) { jgen.writeEndArray(); continue; }
-            if (jgen.getOutputContext().inObject()) { jgen.writeEndObject(); continue; } 
+            if (jgen.getOutputContext().inObject()) { jgen.writeEndObject(); continue; }
             break;
         }
 

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/1a53a3f9/rest/rest-server/src/main/java/org/apache/brooklyn/rest/util/json/MultimapSerializer.java
----------------------------------------------------------------------
diff --git a/rest/rest-server/src/main/java/org/apache/brooklyn/rest/util/json/MultimapSerializer.java b/rest/rest-server/src/main/java/org/apache/brooklyn/rest/util/json/MultimapSerializer.java
deleted file mode 100644
index 1c2f8c1..0000000
--- a/rest/rest-server/src/main/java/org/apache/brooklyn/rest/util/json/MultimapSerializer.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * 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.util.json;
-
-import java.io.IOException;
-import java.util.Collection;
-import java.util.Map;
-
-import org.codehaus.jackson.JsonGenerator;
-import org.codehaus.jackson.map.SerializerProvider;
-import org.codehaus.jackson.map.ser.std.SerializerBase;
-
-import com.google.common.annotations.Beta;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Multimap;
-
-/**
- * Provides a serializer for {@link Multimap} instances.
- * <p>
- * When Brooklyn's Jackson dependency is updated from org.codehaus.jackson:1.9.13 to
- * com.fasterxml.jackson:2.3+ then this class should be replaced with a dependency on
- * jackson-datatype-guava and a GuavaModule registered with Brooklyn's ObjectMapper.
- */
-@Beta
-public class MultimapSerializer extends SerializerBase<Multimap<?, ?>> {
-
-    @SuppressWarnings({ "unchecked", "rawtypes" })
-    protected MultimapSerializer() {
-        super((Class<Multimap<?, ?>>) (Class) Multimap.class);
-    }
-
-    @Override
-    public void serialize(Multimap<?, ?> value, JsonGenerator jgen, SerializerProvider provider) throws IOException {
-        jgen.writeStartObject();
-        writeEntries(value, jgen, provider);
-        jgen.writeEndObject();
-    }
-
-    private void writeEntries(Multimap<?, ?> value, JsonGenerator jgen, SerializerProvider provider) throws IOException {
-        for (Map.Entry<?, ? extends Collection<?>> entry : value.asMap().entrySet()) {
-            provider.findKeySerializer(provider.constructType(String.class), null)
-                    .serialize(entry.getKey(), jgen, provider);
-            provider.defaultSerializeValue(Lists.newArrayList(entry.getValue()), jgen);
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/1a53a3f9/rest/rest-server/src/main/java/org/apache/brooklyn/rest/util/json/PossiblyStrictPreferringFieldsVisibilityChecker.java
----------------------------------------------------------------------
diff --git a/rest/rest-server/src/main/java/org/apache/brooklyn/rest/util/json/PossiblyStrictPreferringFieldsVisibilityChecker.java b/rest/rest-server/src/main/java/org/apache/brooklyn/rest/util/json/PossiblyStrictPreferringFieldsVisibilityChecker.java
index 502f063..e474467 100644
--- a/rest/rest-server/src/main/java/org/apache/brooklyn/rest/util/json/PossiblyStrictPreferringFieldsVisibilityChecker.java
+++ b/rest/rest-server/src/main/java/org/apache/brooklyn/rest/util/json/PossiblyStrictPreferringFieldsVisibilityChecker.java
@@ -22,13 +22,14 @@ import java.lang.reflect.Field;
 import java.lang.reflect.Member;
 import java.lang.reflect.Method;
 
-import org.codehaus.jackson.annotate.JsonAutoDetect;
-import org.codehaus.jackson.annotate.JsonAutoDetect.Visibility;
-import org.codehaus.jackson.annotate.JsonMethod;
-import org.codehaus.jackson.map.introspect.AnnotatedField;
-import org.codehaus.jackson.map.introspect.AnnotatedMember;
-import org.codehaus.jackson.map.introspect.AnnotatedMethod;
-import org.codehaus.jackson.map.introspect.VisibilityChecker;
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.PropertyAccessor;
+import com.fasterxml.jackson.databind.introspect.AnnotatedField;
+import com.fasterxml.jackson.databind.introspect.AnnotatedMember;
+import com.fasterxml.jackson.databind.introspect.AnnotatedMethod;
+import com.fasterxml.jackson.databind.introspect.VisibilityChecker;
+
+import static com.fasterxml.jackson.annotation.JsonAutoDetect.*;
 
 /** a visibility checker which disables getters, but allows private access,
  * unless {@link BidiSerialization#isStrictSerialization()} is enabled in which case public fields or annotations must be used.
@@ -39,13 +40,13 @@ import org.codehaus.jackson.map.introspect.VisibilityChecker;
  * causes infinite recursion)
  **/
 public class PossiblyStrictPreferringFieldsVisibilityChecker implements VisibilityChecker<PossiblyStrictPreferringFieldsVisibilityChecker> {
-    VisibilityChecker<?> 
+    VisibilityChecker<?>
         vizDefault = new VisibilityChecker.Std(Visibility.NONE, Visibility.NONE, Visibility.NONE, Visibility.ANY, Visibility.ANY),
         vizStrict = new VisibilityChecker.Std(Visibility.NONE, Visibility.NONE, Visibility.NONE, Visibility.PUBLIC_ONLY, Visibility.PUBLIC_ONLY);
     
     @Override public PossiblyStrictPreferringFieldsVisibilityChecker with(JsonAutoDetect ann) { throw new UnsupportedOperationException(); }
     @Override public PossiblyStrictPreferringFieldsVisibilityChecker with(Visibility v) { throw new UnsupportedOperationException(); }
-    @Override public PossiblyStrictPreferringFieldsVisibilityChecker withVisibility(JsonMethod method, Visibility v) { throw new UnsupportedOperationException(); }
+    @Override public PossiblyStrictPreferringFieldsVisibilityChecker withVisibility(PropertyAccessor method, Visibility v) { throw new UnsupportedOperationException(); }
     @Override public PossiblyStrictPreferringFieldsVisibilityChecker withGetterVisibility(Visibility v) { throw new UnsupportedOperationException(); }
     @Override public PossiblyStrictPreferringFieldsVisibilityChecker withIsGetterVisibility(Visibility v) { throw new UnsupportedOperationException(); }
     @Override public PossiblyStrictPreferringFieldsVisibilityChecker withSetterVisibility(Visibility v) { throw new UnsupportedOperationException(); }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/1a53a3f9/rest/rest-server/src/main/webapp/WEB-INF/web.xml
----------------------------------------------------------------------
diff --git a/rest/rest-server/src/main/webapp/WEB-INF/web.xml b/rest/rest-server/src/main/webapp/WEB-INF/web.xml
index 1c44b02..ae98ff6 100644
--- a/rest/rest-server/src/main/webapp/WEB-INF/web.xml
+++ b/rest/rest-server/src/main/webapp/WEB-INF/web.xml
@@ -91,7 +91,7 @@
             <param-value>
                 io.swagger.jaxrs.listing.SwaggerSerializers;
                 org.apache.brooklyn.rest.util.FormMapProvider;
-                org.codehaus.jackson.jaxrs.JacksonJsonProvider;
+                com.fasterxml.jackson.jaxrs.json.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/src/test/java/org/apache/brooklyn/rest/domain/ApplicationTest.java
----------------------------------------------------------------------
diff --git a/rest/rest-server/src/test/java/org/apache/brooklyn/rest/domain/ApplicationTest.java b/rest/rest-server/src/test/java/org/apache/brooklyn/rest/domain/ApplicationTest.java
index 7e9c910..8708fb1 100644
--- a/rest/rest-server/src/test/java/org/apache/brooklyn/rest/domain/ApplicationTest.java
+++ b/rest/rest-server/src/test/java/org/apache/brooklyn/rest/domain/ApplicationTest.java
@@ -41,7 +41,7 @@ import com.google.common.collect.ImmutableSet;
 public class ApplicationTest {
 
     final EntitySpec entitySpec = new EntitySpec("Vanilla Java App", "org.apache.brooklyn.entity.java.VanillaJavaApp",
-            ImmutableMap.<String, String>of(
+            ImmutableMap.of(
                     "initialSize", "1",
                     "creationScriptUrl", "http://my.brooklyn.io/storage/foo.sql"));
 
@@ -50,20 +50,15 @@ public class ApplicationTest {
             .locations(ImmutableSet.of("/v1/locations/1"))
             .build();
 
-    final ApplicationSummary application = new ApplicationSummary(null, applicationSpec, Status.STARTING, null);
+    final Map<String, URI> links = ImmutableMap.of(
+            "self", URI.create("/v1/applications/" + applicationSpec.getName()),
+            "entities", URI.create("fixtures/entity-summary-list.json"));
+    final ApplicationSummary application = new ApplicationSummary("myapp_id", applicationSpec, Status.STARTING, links);
 
     @SuppressWarnings("serial")
     @Test
     public void testSerializeToJSON() throws IOException {
-        ApplicationSummary application1 = new ApplicationSummary("myapp_id", applicationSpec, Status.STARTING, null) {
-            @Override
-            public Map<String, URI> getLinks() {
-                return ImmutableMap.of(
-                        "self", URI.create("/v1/applications/" + applicationSpec.getName()),
-                        "entities", URI.create("fixtures/entity-summary-list.json"));
-            }
-        };
-        assertEquals(asJson(application1), jsonFixture("fixtures/application.json"));
+        assertEquals(asJson(application), jsonFixture("fixtures/application.json"));
     }
 
     @Test

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/1a53a3f9/rest/rest-server/src/test/java/org/apache/brooklyn/rest/domain/LocationSummaryTest.java
----------------------------------------------------------------------
diff --git a/rest/rest-server/src/test/java/org/apache/brooklyn/rest/domain/LocationSummaryTest.java b/rest/rest-server/src/test/java/org/apache/brooklyn/rest/domain/LocationSummaryTest.java
deleted file mode 100644
index 7df3de1..0000000
--- a/rest/rest-server/src/test/java/org/apache/brooklyn/rest/domain/LocationSummaryTest.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * 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 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.util.Collections;
-import java.util.List;
-
-import org.codehaus.jackson.type.TypeReference;
-import org.testng.annotations.Test;
-
-import org.apache.brooklyn.rest.transform.LocationTransformer;
-
-public class LocationSummaryTest {
-
-    @SuppressWarnings("deprecation")
-    final LocationSummary summary = LocationTransformer.newInstance("123", LocationSpec.localhost());
-
-    @Test
-    public void testSerializeToJSON() throws IOException {
-        assertEquals(asJson(summary), jsonFixture("fixtures/location-summary.json"));
-    }
-
-    @Test
-    public void testDeserializeFromJSON() throws IOException {
-        assertEquals(fromJson(jsonFixture("fixtures/location-summary.json"), LocationSummary.class), summary);
-    }
-
-    @Test
-    public void testDeserializeListFromJSON() throws IOException {
-        assertEquals(fromJson(jsonFixture("fixtures/location-list.json"), new TypeReference<List<LocationSummary>>() {}), 
-                Collections.singletonList(summary));
-    }
-}

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/1a53a3f9/rest/rest-server/src/test/java/org/apache/brooklyn/rest/resources/DescendantsTest.java
----------------------------------------------------------------------
diff --git a/rest/rest-server/src/test/java/org/apache/brooklyn/rest/resources/DescendantsTest.java b/rest/rest-server/src/test/java/org/apache/brooklyn/rest/resources/DescendantsTest.java
index a8748a7..3f42c8d 100644
--- a/rest/rest-server/src/test/java/org/apache/brooklyn/rest/resources/DescendantsTest.java
+++ b/rest/rest-server/src/test/java/org/apache/brooklyn/rest/resources/DescendantsTest.java
@@ -37,8 +37,6 @@ import org.apache.brooklyn.rest.testing.BrooklynRestResourceTest;
 import org.apache.brooklyn.rest.testing.mocks.RestMockSimpleEntity;
 import org.apache.brooklyn.util.collections.MutableList;
 import org.apache.brooklyn.util.text.StringEscapes;
-import org.codehaus.jackson.JsonGenerationException;
-import org.codehaus.jackson.map.JsonMappingException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.testng.annotations.Test;
@@ -63,7 +61,7 @@ public class DescendantsTest extends BrooklynRestResourceTest {
         build();
 
     @Test
-    public void testDescendantsInSimpleDeployedApplication() throws InterruptedException, TimeoutException, JsonGenerationException, JsonMappingException, UniformInterfaceException, ClientHandlerException, IOException {
+    public void testDescendantsInSimpleDeployedApplication() throws InterruptedException, TimeoutException, UniformInterfaceException, ClientHandlerException, IOException {
         ClientResponse response = clientDeploy(simpleSpec);
         assertTrue(response.getStatus()/100 == 2, "response is "+response);
         Application application = Iterables.getOnlyElement( getManagementContext().getApplications() );

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/1a53a3f9/rest/rest-server/src/test/java/org/apache/brooklyn/rest/resources/EntityResourceTest.java
----------------------------------------------------------------------
diff --git a/rest/rest-server/src/test/java/org/apache/brooklyn/rest/resources/EntityResourceTest.java b/rest/rest-server/src/test/java/org/apache/brooklyn/rest/resources/EntityResourceTest.java
index d6857fb..1c091da 100644
--- a/rest/rest-server/src/test/java/org/apache/brooklyn/rest/resources/EntityResourceTest.java
+++ b/rest/rest-server/src/test/java/org/apache/brooklyn/rest/resources/EntityResourceTest.java
@@ -38,14 +38,14 @@ import org.apache.brooklyn.rest.testing.mocks.RestMockSimpleEntity;
 import org.apache.brooklyn.util.collections.MutableList;
 import org.apache.brooklyn.util.exceptions.Exceptions;
 import org.apache.brooklyn.util.http.HttpAsserts;
-import org.codehaus.jackson.map.ObjectMapper;
-import org.codehaus.jackson.type.TypeReference;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.testng.Assert;
 import org.testng.annotations.BeforeClass;
 import org.testng.annotations.Test;
 
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
 import com.google.common.base.Predicate;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Iterables;

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/1a53a3f9/rest/rest-server/src/test/java/org/apache/brooklyn/rest/testing/BrooklynRestApiTest.java
----------------------------------------------------------------------
diff --git a/rest/rest-server/src/test/java/org/apache/brooklyn/rest/testing/BrooklynRestApiTest.java b/rest/rest-server/src/test/java/org/apache/brooklyn/rest/testing/BrooklynRestApiTest.java
index e63a239..45aec4a 100644
--- a/rest/rest-server/src/test/java/org/apache/brooklyn/rest/testing/BrooklynRestApiTest.java
+++ b/rest/rest-server/src/test/java/org/apache/brooklyn/rest/testing/BrooklynRestApiTest.java
@@ -26,10 +26,10 @@ import org.apache.brooklyn.core.location.BasicLocationRegistry;
 import org.apache.brooklyn.core.mgmt.ManagementContextInjectable;
 import org.apache.brooklyn.core.mgmt.internal.LocalManagementContext;
 import org.apache.brooklyn.core.test.entity.LocalManagementContextForTests;
-import org.codehaus.jackson.map.ObjectMapper;
 import org.testng.annotations.AfterClass;
 import org.testng.annotations.BeforeMethod;
 
+import com.fasterxml.jackson.databind.ObjectMapper;
 import com.google.common.base.Preconditions;
 import com.sun.jersey.api.client.Client;
 import com.sun.jersey.api.client.WebResource;

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/1a53a3f9/rest/rest-server/src/test/java/org/apache/brooklyn/rest/testing/BrooklynRestResourceTest.java
----------------------------------------------------------------------
diff --git a/rest/rest-server/src/test/java/org/apache/brooklyn/rest/testing/BrooklynRestResourceTest.java b/rest/rest-server/src/test/java/org/apache/brooklyn/rest/testing/BrooklynRestResourceTest.java
index c644643..b94e73c 100644
--- a/rest/rest-server/src/test/java/org/apache/brooklyn/rest/testing/BrooklynRestResourceTest.java
+++ b/rest/rest-server/src/test/java/org/apache/brooklyn/rest/testing/BrooklynRestResourceTest.java
@@ -28,7 +28,6 @@ import java.util.logging.Level;
 
 import javax.ws.rs.core.MediaType;
 
-import org.codehaus.jackson.map.ObjectMapper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.testng.Assert;
@@ -43,6 +42,7 @@ import org.apache.brooklyn.util.exceptions.Exceptions;
 import org.apache.brooklyn.util.repeat.Repeater;
 import org.apache.brooklyn.util.time.Duration;
 
+import com.fasterxml.jackson.databind.ObjectMapper;
 import com.sun.jersey.api.client.ClientResponse;
 import com.sun.jersey.api.client.UniformInterfaceException;
 import com.sun.jersey.spi.inject.Errors;

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/1a53a3f9/rest/rest-server/src/test/java/org/apache/brooklyn/rest/util/json/BrooklynJacksonSerializerTest.java
----------------------------------------------------------------------
diff --git a/rest/rest-server/src/test/java/org/apache/brooklyn/rest/util/json/BrooklynJacksonSerializerTest.java b/rest/rest-server/src/test/java/org/apache/brooklyn/rest/util/json/BrooklynJacksonSerializerTest.java
index 7a255a3..9542eda 100644
--- a/rest/rest-server/src/test/java/org/apache/brooklyn/rest/util/json/BrooklynJacksonSerializerTest.java
+++ b/rest/rest-server/src/test/java/org/apache/brooklyn/rest/util/json/BrooklynJacksonSerializerTest.java
@@ -28,9 +28,6 @@ import javax.ws.rs.core.MediaType;
 
 import org.apache.http.client.HttpClient;
 import org.apache.http.client.utils.URIBuilder;
-import org.codehaus.jackson.annotate.JsonProperty;
-import org.codehaus.jackson.map.ObjectMapper;
-import org.codehaus.jackson.map.annotate.JsonSerialize;
 import org.eclipse.jetty.server.Server;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -52,6 +49,9 @@ import org.apache.brooklyn.util.exceptions.Exceptions;
 import org.apache.brooklyn.util.stream.Streams;
 import org.apache.brooklyn.util.text.Strings;
 
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Multimap;
 import com.google.common.collect.MultimapBuilder;


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

Posted by sv...@apache.org.
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);


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

Posted by sv...@apache.org.
Initial work to simplify the rest server

- remove JsonNode from API interfaces
- refactor consistently toStringand hashCode and equals for the domain objects
- remove deprecated code
- simplified pom dependencies
- remove com.codehaus.jackson dependency and promote com.fasterxml.jackson usage
- adjust BrooklynJacksonSerializer to use jackson 2 api
- fix web.xml for rest-api and rest-client
- update feature.xml dependencies, following maven dependency changes


Project: http://git-wip-us.apache.org/repos/asf/brooklyn-server/repo
Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-server/commit/1a53a3f9
Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-server/tree/1a53a3f9
Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-server/diff/1a53a3f9

Branch: refs/heads/master
Commit: 1a53a3f9de92ef9002c19bdad467b85699f32f1b
Parents: 46ae223
Author: Andrea Turli <an...@gmail.com>
Authored: Tue Feb 9 09:32:37 2016 +0100
Committer: Andrea Turli <an...@gmail.com>
Committed: Wed Feb 10 09:22:16 2016 +0100

----------------------------------------------------------------------
 camp/camp-server/pom.xml                        |   5 -
 core/pom.xml                                    |   8 --
 .../apache/brooklyn/core/mgmt/BrooklynTags.java |   7 +-
 .../brooklyn/core/mgmt/BrooklynTaskTags.java    |   2 +-
 .../ha/dto/BasicManagementNodeSyncRecord.java   |   5 +-
 .../rebind/dto/BasicCatalogItemMemento.java     |   2 +-
 .../mgmt/rebind/dto/BasicEntityMemento.java     |   5 +-
 .../mgmt/rebind/dto/MutableBrooklynMemento.java |   5 +-
 karaf/features/src/main/feature/feature.xml     |  25 ++--
 parent/pom.xml                                  |  27 +---
 pom.xml                                         |   7 +-
 rest/rest-api/pom.xml                           |  15 ++-
 .../apache/brooklyn/rest/api/ActivityApi.java   |   1 -
 .../brooklyn/rest/api/ApplicationApi.java       |  14 +-
 .../brooklyn/rest/domain/AccessSummary.java     |  19 +--
 .../apache/brooklyn/rest/domain/ApiError.java   |  83 ++++++------
 .../brooklyn/rest/domain/ApplicationSpec.java   |  63 ++++-----
 .../rest/domain/ApplicationSummary.java         |  29 ++--
 .../rest/domain/BrooklynFeatureSummary.java     |  37 +++++-
 .../rest/domain/CatalogEntitySummary.java       |  50 ++++---
 .../rest/domain/CatalogItemSummary.java         |  69 ++++++----
 .../rest/domain/CatalogLocationSummary.java     |  27 +++-
 .../rest/domain/CatalogPolicySummary.java       |  32 +++--
 .../brooklyn/rest/domain/ConfigSummary.java     |  50 ++++---
 .../brooklyn/rest/domain/EffectorSummary.java   |  60 ++++-----
 .../rest/domain/EntityConfigSummary.java        |  31 +++--
 .../brooklyn/rest/domain/EntityDetail.java      |  80 +++++++++++
 .../apache/brooklyn/rest/domain/EntitySpec.java |  38 ++----
 .../brooklyn/rest/domain/EntitySummary.java     |  38 +++---
 .../rest/domain/HighAvailabilitySummary.java    |  51 +++++---
 .../brooklyn/rest/domain/LinkWithMetadata.java  |  55 ++++----
 .../rest/domain/LocationConfigSummary.java      |  32 +++--
 .../brooklyn/rest/domain/LocationSpec.java      |  35 +++--
 .../brooklyn/rest/domain/LocationSummary.java   |  34 +++--
 .../rest/domain/PolicyConfigSummary.java        |  34 +++--
 .../brooklyn/rest/domain/PolicySummary.java     |  43 +++---
 .../rest/domain/ScriptExecutionSummary.java     |  48 +++++--
 .../brooklyn/rest/domain/SensorSummary.java     |  49 +++----
 .../brooklyn/rest/domain/TaskSummary.java       | 123 +++++++++++------
 .../brooklyn/rest/domain/UsageStatistic.java    |  38 +++---
 .../brooklyn/rest/domain/UsageStatistics.java   |  26 ++--
 .../brooklyn/rest/domain/VersionSummary.java    |  30 ++++-
 rest/rest-api/src/main/webapp/WEB-INF/web.xml   |   4 +-
 .../rest/domain/AbstractDomainTest.java         |  44 +++++++
 .../brooklyn/rest/domain/ApiErrorTest.java      |  18 ++-
 .../rest/domain/ApplicationSpecTest.java        |  37 ++----
 .../rest/domain/EffectorSummaryTest.java        |  37 ++----
 .../brooklyn/rest/domain/EntitySpecTest.java    |  20 ++-
 .../brooklyn/rest/domain/EntitySummaryTest.java |  35 ++---
 .../rest/domain/LocationSummaryTest.java        |  41 ++++++
 .../rest/domain/VersionSummaryTest.java         |  51 +++-----
 .../brooklyn/rest/util/RestApiTestUtils.java    |   5 +-
 rest/rest-client/pom.xml                        |   2 +-
 .../rest-client/src/test/webapp/WEB-INF/web.xml |   2 +-
 rest/rest-server/pom.xml                        |  41 ++----
 .../resources/AbstractBrooklynRestResource.java |   3 +-
 .../rest/resources/ApplicationResource.java     | 131 +++++++------------
 .../brooklyn/rest/util/WebResourceUtils.java    |   2 +-
 .../rest/util/json/BidiSerialization.java       |  41 +++---
 .../util/json/BrooklynJacksonJsonProvider.java  |  31 ++---
 .../json/ConfigurableSerializerProvider.java    |  52 ++++----
 .../ErrorAndToStringUnknownTypeSerializer.java  |  41 +++---
 .../rest/util/json/MultimapSerializer.java      |  62 ---------
 ...StrictPreferringFieldsVisibilityChecker.java |  19 +--
 .../rest-server/src/main/webapp/WEB-INF/web.xml |   2 +-
 .../brooklyn/rest/domain/ApplicationTest.java   |  17 +--
 .../rest/domain/LocationSummaryTest.java        |  55 --------
 .../rest/resources/DescendantsTest.java         |   4 +-
 .../rest/resources/EntityResourceTest.java      |   4 +-
 .../rest/testing/BrooklynRestApiTest.java       |   2 +-
 .../rest/testing/BrooklynRestResourceTest.java  |   2 +-
 .../json/BrooklynJacksonSerializerTest.java     |   6 +-
 72 files changed, 1156 insertions(+), 1087 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/1a53a3f9/camp/camp-server/pom.xml
----------------------------------------------------------------------
diff --git a/camp/camp-server/pom.xml b/camp/camp-server/pom.xml
index 502c83e..1ef149d 100644
--- a/camp/camp-server/pom.xml
+++ b/camp/camp-server/pom.xml
@@ -142,11 +142,6 @@
             <groupId>org.apache.commons</groupId>
             <artifactId>commons-lang3</artifactId>
         </dependency>
-        <!-- ATTN: this moves the dependency version from 1.9.2 to 1.9.13 -->
-        <dependency>
-            <groupId>org.codehaus.jackson</groupId>
-            <artifactId>jackson-core-asl</artifactId>
-        </dependency>
         <dependency>
             <groupId>org.slf4j</groupId>
             <artifactId>slf4j-api</artifactId>

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/1a53a3f9/core/pom.xml
----------------------------------------------------------------------
diff --git a/core/pom.xml b/core/pom.xml
index 3be573d..fadc689 100644
--- a/core/pom.xml
+++ b/core/pom.xml
@@ -66,10 +66,6 @@
             <artifactId>xstream</artifactId>
         </dependency>
         <dependency>
-            <groupId>org.codehaus.jackson</groupId>
-            <artifactId>jackson-mapper-asl</artifactId>
-        </dependency>
-        <dependency>
             <groupId>com.google.code.gson</groupId>
             <artifactId>gson</artifactId>
         </dependency>
@@ -139,10 +135,6 @@
             <artifactId>slf4j-api</artifactId>
         </dependency>
         <dependency>
-            <groupId>org.codehaus.jackson</groupId>
-            <artifactId>jackson-core-asl</artifactId>
-        </dependency>
-        <dependency>
             <groupId>com.google.guava</groupId>
             <artifactId>guava</artifactId>
         </dependency>

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/1a53a3f9/core/src/main/java/org/apache/brooklyn/core/mgmt/BrooklynTags.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/mgmt/BrooklynTags.java b/core/src/main/java/org/apache/brooklyn/core/mgmt/BrooklynTags.java
index 0ddc79a..7a0171e 100644
--- a/core/src/main/java/org/apache/brooklyn/core/mgmt/BrooklynTags.java
+++ b/core/src/main/java/org/apache/brooklyn/core/mgmt/BrooklynTags.java
@@ -23,9 +23,9 @@ import java.util.ArrayList;
 import java.util.List;
 
 import org.apache.brooklyn.util.collections.MutableList;
-import org.codehaus.jackson.annotate.JsonIgnore;
-import org.codehaus.jackson.annotate.JsonProperty;
 
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonProperty;
 import com.google.common.annotations.Beta;
 import com.google.common.base.Function;
 import com.google.common.base.Objects;
@@ -40,7 +40,8 @@ public class BrooklynTags {
     
     public static class NamedStringTag implements Serializable {
         private static final long serialVersionUID = 7932098757009051348L;
-        @JsonProperty final String kind;
+        @JsonProperty
+        final String kind;
         @JsonProperty final String contents;
         public NamedStringTag(@JsonProperty("kind") String kind, @JsonProperty("contents") String contents) {
             this.kind = kind;

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/1a53a3f9/core/src/main/java/org/apache/brooklyn/core/mgmt/BrooklynTaskTags.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/mgmt/BrooklynTaskTags.java b/core/src/main/java/org/apache/brooklyn/core/mgmt/BrooklynTaskTags.java
index 1fba49d..0ce9a2e 100644
--- a/core/src/main/java/org/apache/brooklyn/core/mgmt/BrooklynTaskTags.java
+++ b/core/src/main/java/org/apache/brooklyn/core/mgmt/BrooklynTaskTags.java
@@ -42,10 +42,10 @@ import org.apache.brooklyn.util.javalang.MemoryUsageTracker;
 import org.apache.brooklyn.util.stream.Streams;
 import org.apache.brooklyn.util.text.StringEscapes.BashStringEscapes;
 import org.apache.brooklyn.util.text.Strings;
-import org.codehaus.jackson.annotate.JsonProperty;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.fasterxml.jackson.annotation.JsonProperty;
 import com.google.common.annotations.Beta;
 import com.google.common.base.Functions;
 import com.google.common.base.Objects;

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/1a53a3f9/core/src/main/java/org/apache/brooklyn/core/mgmt/ha/dto/BasicManagementNodeSyncRecord.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/mgmt/ha/dto/BasicManagementNodeSyncRecord.java b/core/src/main/java/org/apache/brooklyn/core/mgmt/ha/dto/BasicManagementNodeSyncRecord.java
index d8f18b1..265540c 100644
--- a/core/src/main/java/org/apache/brooklyn/core/mgmt/ha/dto/BasicManagementNodeSyncRecord.java
+++ b/core/src/main/java/org/apache/brooklyn/core/mgmt/ha/dto/BasicManagementNodeSyncRecord.java
@@ -25,9 +25,8 @@ import org.apache.brooklyn.api.mgmt.ha.ManagementNodeState;
 import org.apache.brooklyn.api.mgmt.ha.ManagementNodeSyncRecord;
 import org.apache.brooklyn.core.BrooklynVersion;
 import org.apache.brooklyn.util.time.Time;
-import org.codehaus.jackson.annotate.JsonAutoDetect;
-import org.codehaus.jackson.annotate.JsonAutoDetect.Visibility;
 
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
 import com.google.common.base.Objects;
 
 /**
@@ -36,7 +35,7 @@ import com.google.common.base.Objects;
  * 
  * @author aled
  */
-@JsonAutoDetect(fieldVisibility=Visibility.ANY, getterVisibility=Visibility.NONE)
+@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY, getterVisibility = JsonAutoDetect.Visibility.NONE)
 public class BasicManagementNodeSyncRecord implements ManagementNodeSyncRecord, Serializable {
 
     private static final long serialVersionUID = 4918161834047884244L;

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/1a53a3f9/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/dto/BasicCatalogItemMemento.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/dto/BasicCatalogItemMemento.java b/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/dto/BasicCatalogItemMemento.java
index bf252e0..3651267 100644
--- a/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/dto/BasicCatalogItemMemento.java
+++ b/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/dto/BasicCatalogItemMemento.java
@@ -29,8 +29,8 @@ import org.apache.brooklyn.api.mgmt.rebind.mementos.CatalogItemMemento;
 import org.apache.brooklyn.api.objs.SpecParameter;
 import org.apache.brooklyn.core.catalog.internal.BasicBrooklynCatalog;
 import org.apache.brooklyn.core.catalog.internal.CatalogUtils;
-import org.codehaus.jackson.annotate.JsonAutoDetect;
 
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
 import com.google.common.base.Joiner;
 import com.google.common.base.Objects;
 import com.google.common.collect.ImmutableList;

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/1a53a3f9/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/dto/BasicEntityMemento.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/dto/BasicEntityMemento.java b/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/dto/BasicEntityMemento.java
index 8294562..f06ff36 100644
--- a/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/dto/BasicEntityMemento.java
+++ b/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/dto/BasicEntityMemento.java
@@ -30,8 +30,6 @@ import org.apache.brooklyn.api.mgmt.rebind.mementos.EntityMemento;
 import org.apache.brooklyn.api.mgmt.rebind.mementos.TreeNode;
 import org.apache.brooklyn.api.sensor.AttributeSensor;
 import org.apache.brooklyn.api.sensor.Sensor;
-import org.codehaus.jackson.annotate.JsonAutoDetect;
-import org.codehaus.jackson.annotate.JsonAutoDetect.Visibility;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.apache.brooklyn.config.ConfigKey;
@@ -41,6 +39,7 @@ import org.apache.brooklyn.core.entity.AbstractEntity;
 import org.apache.brooklyn.core.objs.BrooklynTypes;
 import org.apache.brooklyn.core.sensor.Sensors;
 
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
 import com.google.common.base.Objects.ToStringHelper;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
@@ -54,7 +53,7 @@ import com.google.common.collect.Maps;
  * 
  * @author aled
  */
-@JsonAutoDetect(fieldVisibility=Visibility.ANY, getterVisibility=Visibility.NONE)
+@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY, getterVisibility= JsonAutoDetect.Visibility.NONE)
 public class BasicEntityMemento extends AbstractTreeNodeMemento implements EntityMemento, Serializable {
 
     private static final Logger log = LoggerFactory.getLogger(BasicEntityMemento.class);

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/1a53a3f9/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/dto/MutableBrooklynMemento.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/dto/MutableBrooklynMemento.java b/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/dto/MutableBrooklynMemento.java
index 293207b..fa0fe19 100644
--- a/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/dto/MutableBrooklynMemento.java
+++ b/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/dto/MutableBrooklynMemento.java
@@ -31,9 +31,8 @@ import org.apache.brooklyn.api.mgmt.rebind.mementos.EntityMemento;
 import org.apache.brooklyn.api.mgmt.rebind.mementos.FeedMemento;
 import org.apache.brooklyn.api.mgmt.rebind.mementos.LocationMemento;
 import org.apache.brooklyn.api.mgmt.rebind.mementos.PolicyMemento;
-import org.codehaus.jackson.annotate.JsonAutoDetect;
-import org.codehaus.jackson.annotate.JsonAutoDetect.Visibility;
 
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
@@ -44,7 +43,7 @@ import com.google.common.collect.Sets;
 /**
  * @deprecated since 0.7.0; this code will move to src/tests/java
  */
-@JsonAutoDetect(fieldVisibility=Visibility.ANY, getterVisibility=Visibility.NONE)
+@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY, getterVisibility = JsonAutoDetect.Visibility.NONE)
 public class MutableBrooklynMemento implements BrooklynMemento {
 
     // TODO Is this class pulling its weight? Do we really need it?

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/1a53a3f9/karaf/features/src/main/feature/feature.xml
----------------------------------------------------------------------
diff --git a/karaf/features/src/main/feature/feature.xml b/karaf/features/src/main/feature/feature.xml
index bc520e7..19d439e 100644
--- a/karaf/features/src/main/feature/feature.xml
+++ b/karaf/features/src/main/feature/feature.xml
@@ -85,6 +85,7 @@
     <feature name="brooklyn-rest-api" version="${project.version}" description="Brooklyn REST API">
         <feature>brooklyn-utils-rest-swagger</feature>
         <feature>brooklyn-api</feature>
+        <feature>brooklyn-core</feature>
 
         <bundle>mvn:org.apache.brooklyn/brooklyn-rest-api/${project.version}</bundle>
 
@@ -98,8 +99,8 @@
         <!--<feature>jersey</feature>-->
         <bundle dependency="true">mvn:com.sun.jersey/jersey-servlet/${jersey.version}</bundle>
         <bundle dependency="true">mvn:org.apache.commons/commons-lang3/${commons-lang3.version}</bundle>
-        <bundle dependency="true">mvn:org.codehaus.jackson/jackson-core-asl/${jackson.version}</bundle>
-        <bundle dependency="true">mvn:org.codehaus.jackson/jackson-mapper-asl/${jackson.version}</bundle>
+        <bundle dependency="true">mvn:com.fasterxml.jackson.core/jackson-annotations/${fasterxml.jackson.version}</bundle>
+        <bundle dependency="true">mvn:com.fasterxml.jackson.core/jackson-databind/${fasterxml.jackson.version}</bundle>
 
         <!--<bundle dependency="true">mvn:javax.ws.rs/jsr311-api/${jsr311-api.version}</bundle>-->
         <bundle dependency="true">mvn:javax.servlet/javax.servlet-api/${javax-servlet.version}</bundle>
@@ -116,7 +117,7 @@
         <bundle>mvn:org.apache.brooklyn/brooklyn-core/${project.version}</bundle>
         <bundle>mvn:org.apache.brooklyn/brooklyn-rt-osgi/${project.version}</bundle>
         <bundle>mvn:org.apache.brooklyn/brooklyn-utils-groovy/${project.version}</bundle>
-    
+
         <bundle dependency="true">mvn:com.google.code.gson/gson/${gson.version}</bundle>
         <bundle dependency="true">mvn:com.jayway.jsonpath/json-path/${jsonPath.version}</bundle>
         <bundle dependency="true">mvn:com.fasterxml.jackson.core/jackson-core/${fasterxml.jackson.version}</bundle>
@@ -132,9 +133,6 @@
         <bundle dependency="true">mvn:org.bouncycastle/bcpkix-jdk15on/${bouncycastle.version}</bundle>
         <bundle dependency="true">mvn:commons-codec/commons-codec/${commons-codec.version}</bundle>
         <bundle dependency="true">mvn:org.apache.commons/commons-lang3/${commons-lang3.version}</bundle>
-        <bundle dependency="true">mvn:org.codehaus.jackson/jackson-core-asl/${jackson.version}</bundle>
-        <bundle dependency="true">mvn:org.codehaus.jackson/jackson-mapper-asl/${jackson.version}</bundle>
-        <bundle dependency="true">mvn:org.codehaus.jackson/jackson-jaxrs/${jackson.version}</bundle>
 
         <!-- TODO: don't use wrap -->
         <bundle dependency="true">wrap:mvn:com.google.http-client/google-http-client/1.18.0-rc</bundle> <!-- from geoip -->
@@ -168,16 +166,10 @@
         <feature>brooklyn-camp-base</feature>
         <feature>brooklyn-utils-rest-swagger</feature>
         <feature>jetty</feature> <!-- TODO: pax-jetty??? -->
-
-        <bundle dependency="true">mvn:org.codehaus.jackson/jackson-core-asl/${jackson.version}</bundle>
-        
-        <bundle dependency="true">wrap:mvn:javax.validation/validation-api/${validation-api.version}</bundle>
-        <bundle>mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.reflections/${reflections.bundle.version}</bundle>
     </feature>
 
     <feature name="brooklyn-rest-server" version="${project.version}" description="Brooklyn REST Server">
         <bundle>mvn:org.apache.brooklyn/brooklyn-rest-server/${project.version}</bundle>
-        <feature>brooklyn-core</feature>
         <feature>brooklyn-rest-api</feature>
         <feature>brooklyn-camp-brooklyn</feature>
         <feature>brooklyn-camp-base</feature>
@@ -188,18 +180,21 @@
         <bundle dependency="true">mvn:com.sun.jersey/jersey-server/${jersey.version}</bundle>
         <bundle dependency="true">mvn:com.sun.jersey/jersey-core/${jersey.version}</bundle>
         <bundle dependency="true">mvn:com.sun.jersey/jersey-servlet/${jersey.version}</bundle>
+
+        <bundle dependency="true">mvn:com.fasterxml.jackson.datatype/jackson-datatype-guava/${fasterxml.jackson.version}</bundle>
+        <bundle dependency="true">mvn:com.fasterxml.jackson.jaxrs/jackson-jaxrs-json-provider/${fasterxml.jackson.version}</bundle>
     </feature>
 
     <feature name="brooklyn-jsgui" version="${project.version}" description="Brooklyn REST JavaScript Web GUI">
         <bundle>mvn:org.apache.brooklyn/brooklyn-jsgui/${project.version}/war</bundle>
         <feature>war</feature>
     </feature>
-  
+
     <feature name="brooklyn-commands"  version="${project.version}"  description="Brooklyn Shell Commands">
         <bundle>mvn:org.apache.brooklyn/brooklyn-commands/${project.version}</bundle>
         <!--<feature version="${project.version}">brooklyn-core</feature>-->
     </feature>
-  
+
     <feature name="brooklyn-software-winrm" version="${project.version}" description="Brooklyn WinRM Software Entities">
         <bundle>mvn:org.apache.brooklyn/brooklyn-software-winrm/${project.version}</bundle>
         <feature>brooklyn-core</feature>
@@ -285,5 +280,5 @@
         <feature>brooklyn-software-base</feature>
         <bundle dependency="true">mvn:com.google.guava/guava/${guava.version}</bundle>
     </feature>
-    
+
 </features>

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/1a53a3f9/parent/pom.xml
----------------------------------------------------------------------
diff --git a/parent/pom.xml b/parent/pom.xml
index 6c1817e..2b1f4a5 100644
--- a/parent/pom.xml
+++ b/parent/pom.xml
@@ -174,26 +174,6 @@
                 <version>${jetty-schemas.version}</version>
             </dependency>
             <dependency>
-                <groupId>org.codehaus.jackson</groupId>
-                <artifactId>jackson-core-asl</artifactId>
-                <version>${jackson.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.codehaus.jackson</groupId>
-                <artifactId>jackson-mapper-asl</artifactId>
-                <version>${jackson.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.codehaus.jackson</groupId>
-                <artifactId>jackson-jaxrs</artifactId>
-                <version>${jackson.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.codehaus.jackson</groupId>
-                <artifactId>jackson-xc</artifactId>
-                <version>${jackson.version}</version>
-            </dependency>
-            <dependency>
                 <groupId>com.fasterxml.jackson.core</groupId>
                 <artifactId>jackson-annotations</artifactId>
                 <version>${fasterxml.jackson.version}</version>
@@ -219,6 +199,11 @@
                 <version>${fasterxml.jackson.version}</version>
             </dependency>
             <dependency>
+                <groupId>com.fasterxml.jackson.datatype</groupId>
+                <artifactId>jackson-datatype-guava</artifactId>
+                <version>${fasterxml.jackson.version}</version>
+            </dependency>
+            <dependency>
                 <groupId>io.swagger</groupId>
                 <artifactId>swagger-annotations</artifactId>
                 <version>${swagger.version}</version>
@@ -402,7 +387,7 @@
             </dependency>
             <dependency>
                 <groupId>org.jboss.resteasy</groupId>
-                <artifactId>resteasy-jackson-provider</artifactId>
+                <artifactId>resteasy-jackson2-provider</artifactId>
                 <version>${resteasy.version}</version>
             </dependency>
             <dependency>

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/1a53a3f9/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index e066e13..5078260 100644
--- a/pom.xml
+++ b/pom.xml
@@ -97,8 +97,7 @@
         <slf4j.version>1.6.6</slf4j.version>  <!-- used for java.util.logging jul-to-slf4j interception -->
         <guava.version>17.0</guava.version>
         <xstream.version>1.4.7</xstream.version>
-        <jackson.version>1.9.13</jackson.version>  <!-- codehaus jackson, used by brooklyn rest server -->
-        <fasterxml.jackson.version>2.4.5</fasterxml.jackson.version>  <!-- more recent jackson, but not compatible with old annotations! -->
+        <fasterxml.jackson.version>2.7.0</fasterxml.jackson.version>  <!-- more recent jackson, but not compatible with old annotations! -->
         <jersey.version>1.19</jersey.version>
         <httpclient.version>4.4.1</httpclient.version>
         <commons-lang3.version>3.3.2</commons-lang3.version>
@@ -127,12 +126,12 @@
         <geronimo-jta_1.1_spec.version>1.1.1</geronimo-jta_1.1_spec.version>
         <sleepycat-je.version>5.0.34</sleepycat-je.version>
         <commons-cli.version>1.2</commons-cli.version>
-        <astyanax.version>1.56.24</astyanax.version>
+        <astyanax.version>3.8.0</astyanax.version>
         <jcouchdb.version>0.11.0-1</jcouchdb.version>
         <solr.version>4.7.0</solr.version>
         <jtidy.version>r8-20060801</jtidy.version>
         <opendmk_jmxremote_optional_jar.version>1.0-b01-ea</opendmk_jmxremote_optional_jar.version>
-        <resteasy.version>3.0.8.Final</resteasy.version>
+        <resteasy.version>3.0.14.Final</resteasy.version>
         <jopt.version>4.3</jopt.version>
         <concurrentlinkedhashmap.version>1.0_jdk5</concurrentlinkedhashmap.version>
         <javax-servlet.version>3.1.0</javax-servlet.version>

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/1a53a3f9/rest/rest-api/pom.xml
----------------------------------------------------------------------
diff --git a/rest/rest-api/pom.xml b/rest/rest-api/pom.xml
index 9a74d52..fc61f97 100644
--- a/rest/rest-api/pom.xml
+++ b/rest/rest-api/pom.xml
@@ -35,12 +35,19 @@
 
     <dependencies>
         <dependency>
-            <groupId>org.codehaus.jackson</groupId>
-            <artifactId>jackson-core-asl</artifactId>
+            <groupId>org.apache.brooklyn</groupId>
+            <artifactId>brooklyn-core</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.fasterxml.jackson.core</groupId>
+            <artifactId>jackson-annotations</artifactId>
+            <version>${fasterxml.jackson.version}</version>
         </dependency>
         <dependency>
-            <groupId>org.codehaus.jackson</groupId>
-            <artifactId>jackson-mapper-asl</artifactId>
+            <groupId>com.fasterxml.jackson.core</groupId>
+            <artifactId>jackson-databind</artifactId>
+            <version>${fasterxml.jackson.version}</version>
         </dependency>
         <dependency>
             <groupId>com.sun.jersey.contribs</groupId>

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/1a53a3f9/rest/rest-api/src/main/java/org/apache/brooklyn/rest/api/ActivityApi.java
----------------------------------------------------------------------
diff --git a/rest/rest-api/src/main/java/org/apache/brooklyn/rest/api/ActivityApi.java b/rest/rest-api/src/main/java/org/apache/brooklyn/rest/api/ActivityApi.java
index 2482608..de93c64 100644
--- a/rest/rest-api/src/main/java/org/apache/brooklyn/rest/api/ActivityApi.java
+++ b/rest/rest-api/src/main/java/org/apache/brooklyn/rest/api/ActivityApi.java
@@ -43,7 +43,6 @@ public interface ActivityApi {
     @ApiResponses(value = {
             @ApiResponse(code = 404, message = "Could not find task")
     })
-//  @Produces("text/json")
     public TaskSummary get(
             @ApiParam(value = "Task ID", required = true) @PathParam("task") String taskId
             );

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/1a53a3f9/rest/rest-api/src/main/java/org/apache/brooklyn/rest/api/ApplicationApi.java
----------------------------------------------------------------------
diff --git a/rest/rest-api/src/main/java/org/apache/brooklyn/rest/api/ApplicationApi.java b/rest/rest-api/src/main/java/org/apache/brooklyn/rest/api/ApplicationApi.java
index c412644..cd8f22e 100644
--- a/rest/rest-api/src/main/java/org/apache/brooklyn/rest/api/ApplicationApi.java
+++ b/rest/rest-api/src/main/java/org/apache/brooklyn/rest/api/ApplicationApi.java
@@ -35,11 +35,10 @@ import javax.ws.rs.QueryParam;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
 
-import org.codehaus.jackson.JsonNode;
-
 import org.apache.brooklyn.rest.domain.ApplicationSpec;
 import org.apache.brooklyn.rest.domain.ApplicationSummary;
 import org.apache.brooklyn.rest.domain.EntitySummary;
+import org.apache.brooklyn.rest.domain.EntityDetail;
 
 import io.swagger.annotations.ApiResponse;
 import io.swagger.annotations.ApiResponses;
@@ -53,20 +52,11 @@ import io.swagger.annotations.ApiParam;
 public interface ApplicationApi {
 
     @GET
-    @Path("/tree")
-    @ApiOperation(
-            value = "Fetch applications and entities tree hierarchy"
-    )
-    /** @deprecated since 0.6.0 use {@link #fetch(String)} (with slightly different, but better semantics) */
-    @Deprecated
-    public JsonNode applicationTree();
-
-    @GET
     @Path("/fetch")
     @ApiOperation(
             value = "Fetch display details for all applications and optionally selected additional entities"
     )
-    public JsonNode fetch(
+    public List<EntityDetail> fetch(
             @ApiParam(value="Selected additional entity ID's to include, comma-separated", required=false)
             @DefaultValue("")
             @QueryParam("items") String items);

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/1a53a3f9/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/AccessSummary.java
----------------------------------------------------------------------
diff --git a/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/AccessSummary.java b/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/AccessSummary.java
index 8d5aefa..13ea344 100644
--- a/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/AccessSummary.java
+++ b/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/AccessSummary.java
@@ -21,18 +21,17 @@ 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 com.fasterxml.jackson.annotation.JsonProperty;
 import com.google.common.annotations.Beta;
-import com.google.common.base.Objects;
 import com.google.common.collect.ImmutableMap;
 
 @Beta
 public class AccessSummary implements Serializable {
 
     private static final long serialVersionUID = 5097292906225042890L;
-    
+
     private final boolean locationProvisioningAllowed;
     private final Map<String, URI> links;
 
@@ -51,23 +50,25 @@ public class AccessSummary implements Serializable {
     public Map<String, URI> getLinks() {
         return links;
     }
-    
+
     @Override
     public boolean equals(Object o) {
+        if (this == o) return true;
         if (!(o instanceof AccessSummary)) return false;
-        AccessSummary other = (AccessSummary) o;
-        return locationProvisioningAllowed == other.isLocationProvisioningAllowed();
+        AccessSummary that = (AccessSummary) o;
+        return locationProvisioningAllowed == that.locationProvisioningAllowed &&
+                Objects.equals(links, that.links);
     }
 
     @Override
     public int hashCode() {
-        return Objects.hashCode(locationProvisioningAllowed);
+        return Objects.hash(locationProvisioningAllowed, links);
     }
 
     @Override
     public String toString() {
         return "AccessSummary{" +
-                "locationProvisioningAllowed='" + locationProvisioningAllowed + '\'' +
+                "locationProvisioningAllowed=" + locationProvisioningAllowed +
                 ", 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/ApiError.java
----------------------------------------------------------------------
diff --git a/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/ApiError.java b/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/ApiError.java
index f26be79..89ee744 100644
--- a/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/ApiError.java
+++ b/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/ApiError.java
@@ -21,17 +21,16 @@ package org.apache.brooklyn.rest.domain;
 import static com.google.common.base.Preconditions.checkNotNull;
 
 import java.io.Serializable;
+import java.util.Objects;
 
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
 import javax.ws.rs.core.Response.Status;
 
 import org.apache.brooklyn.util.text.Strings;
-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.base.Optional;
 import com.google.common.base.Throwables;
 
@@ -46,17 +45,17 @@ public class ApiError implements Serializable {
     public static ApiError of(Throwable t) {
         return builderFromThrowable(t).build();
     }
-    
+
     public static ApiError of(String message) {
         return builder().message(message).build();
     }
-    
+
     /** @deprecated since 0.7.0; use {@link #builderFromThrowable(Throwable)} */
     @Deprecated
     public static Builder fromThrowable(Throwable t) {
         return builderFromThrowable(t);
     }
-    
+
     /**
      * @return An {@link ApiError.Builder} whose message is initialised to either the throwable's
      *         message or the throwable's class name if the message is null and whose details are
@@ -89,17 +88,17 @@ public class ApiError implements Serializable {
         public Builder errorCode(Status errorCode) {
             return errorCode(errorCode.getStatusCode());
         }
-        
+
         public Builder errorCode(Integer errorCode) {
             this.errorCode = errorCode;
             return this;
         }
-        
+
         /** as {@link #prefixMessage(String, String)} with default separator of `: ` */
         public Builder prefixMessage(String prefix) {
             return prefixMessage(prefix, ": ");
         }
-        
+
         /** puts a prefix in front of the message, with the given separator if there is already a message;
          * if there is no message, it simply sets the prefix as the message
          */
@@ -108,7 +107,7 @@ public class ApiError implements Serializable {
             else message(prefix+separatorIfMessageNotBlank+message);
             return this;
         }
-        
+
         public ApiError build() {
             return new ApiError(message, details, errorCode);
         }
@@ -118,25 +117,25 @@ public class ApiError implements Serializable {
         public Builder fromApiError(ApiError error) {
             return copy(error);
         }
-        
+
         public Builder copy(ApiError error) {
             return this
                     .message(error.message)
                     .details(error.details)
                     .errorCode(error.error);
         }
-        
+
         public String getMessage() {
             return message;
         }
     }
 
     private final String message;
-    
-    @JsonSerialize(include=Inclusion.NON_EMPTY)
+
+    @JsonSerialize(include= JsonSerialize.Inclusion.NON_EMPTY)
     private final String details;
 
-    @JsonSerialize(include=Inclusion.NON_NULL)
+    @JsonSerialize(include= JsonSerialize.Inclusion.NON_NULL)
     private final Integer error;
 
     public ApiError(String message) { this(message, null); }
@@ -161,30 +160,6 @@ public class ApiError implements Serializable {
     public Integer getError() {
         return error;
     }
-    
-    @Override
-    public boolean equals(Object other) {
-        if (this == other) return true;
-        if (other == null || getClass() != other.getClass()) return false;
-        ApiError that = ApiError.class.cast(other);
-        return Objects.equal(this.message, that.message) &&
-                Objects.equal(this.details, that.details) &&
-                Objects.equal(this.error, that.error);
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hashCode(message, details, error);
-    }
-
-    @Override
-    public String toString() {
-        return Objects.toStringHelper(this)
-                .add("message", message)
-                .add("details", details)
-                .add("error", error)
-                .toString();
-    }
 
     public Response asBadRequestResponseJson() {
         return asResponse(Status.BAD_REQUEST, MediaType.APPLICATION_JSON_TYPE);
@@ -196,12 +171,36 @@ public class ApiError implements Serializable {
             .entity(this)
             .build();
     }
-    
+
     public Response asResponse(MediaType type) {
         return asResponse(null, type);
     }
-    
+
     public Response asJsonResponse() {
         return asResponse(MediaType.APPLICATION_JSON_TYPE);
     }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (!(o instanceof ApiError)) return false;
+        ApiError apiError = (ApiError) o;
+        return Objects.equals(message, apiError.message) &&
+                Objects.equals(details, apiError.details) &&
+                Objects.equals(error, apiError.error);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(message, details, error);
+    }
+
+    @Override
+    public String toString() {
+        return "ApiError{" +
+                "message='" + message + '\'' +
+                ", details='" + details + '\'' +
+                ", error=" + error +
+                '}';
+    }
 }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/1a53a3f9/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/ApplicationSpec.java
----------------------------------------------------------------------
diff --git a/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/ApplicationSpec.java b/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/ApplicationSpec.java
index 8e82c8e..52f7efd 100644
--- a/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/ApplicationSpec.java
+++ b/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/ApplicationSpec.java
@@ -24,12 +24,11 @@ import java.io.Serializable;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Map;
+import java.util.Objects;
 import java.util.Set;
 
-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;
 import com.google.common.collect.ImmutableSet;
 
@@ -86,12 +85,12 @@ public class ApplicationSpec implements HasName, Serializable {
     }
 
     private final String name;
-    @JsonSerialize(include = Inclusion.NON_NULL)
+    @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
     private final String type;
-    @JsonSerialize(include = Inclusion.NON_NULL)
+    @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
     private final Set<EntitySpec> entities;
     private final Set<String> locations;
-    @JsonSerialize(include = Inclusion.NON_EMPTY)
+    @JsonSerialize(include = JsonSerialize.Inclusion.NON_EMPTY)
     private final Map<String, String> config;
 
   public ApplicationSpec(
@@ -110,7 +109,7 @@ public class ApplicationSpec implements HasName, Serializable {
       this.locations = ImmutableSet.copyOf(checkNotNull(locations, "locations must be provided for an application spec"));
       this.config = config == null ? Collections.<String, String>emptyMap() : ImmutableMap.<String, String>copyOf(config);
       if (this.entities!=null && this.type!=null) throw new IllegalStateException("cannot supply both type and entities for an application spec");
-      // valid for both to be null, e.g. for an anonymous type 
+      // valid for both to be null, e.g. for an anonymous type
 //      if (this.entities==null && this.type==null) throw new IllegalStateException("must supply either type or entities for an application spec");
   }
 
@@ -137,45 +136,29 @@ public class ApplicationSpec implements HasName, Serializable {
 
     @Override
     public boolean equals(Object o) {
-        if (this == o)
-            return true;
-        if (o == null || getClass() != o.getClass())
-            return false;
-
+        if (this == o) return true;
+        if (!(o instanceof ApplicationSpec)) return false;
         ApplicationSpec that = (ApplicationSpec) o;
-
-        if (name != null ? !name.equals(that.name) : that.name != null)
-            return false;
-        if (type != null ? !type.equals(that.type) : that.type != null)
-            return false;
-        if (entities != null ? !entities.equals(that.entities) : that.entities != null)
-            return false;
-        if (locations != null ? !locations.equals(that.locations) : that.locations != null)
-            return false;
-        if (config != null ? !config.equals(that.config) : that.config != null)
-            return false;
-
-        return true;
+        return Objects.equals(name, that.name) &&
+                Objects.equals(type, that.type) &&
+                Objects.equals(entities, that.entities) &&
+                Objects.equals(locations, that.locations) &&
+                Objects.equals(config, that.config);
     }
 
     @Override
     public int hashCode() {
-        int result = name != null ? name.hashCode() : 0;
-        result = 31 * result + (type != null ? type.hashCode() : 0);
-        result = 31 * result + (entities != null ? entities.hashCode() : 0);
-        result = 31 * result + (locations != null ? locations.hashCode() : 0);
-        result = 31 * result + (config != null ? config.hashCode() : 0);
-        return result;
+        return Objects.hash(name, type, entities, locations, config);
     }
 
     @Override
     public String toString() {
-        return "ApplicationSpec{"
-                + "name='" + name + '\''
-                + ", type=" + type
-                + ", entitySpecs=" + entities
-                + ", locations=" + locations
-                + ", config=" + config
-                + '}';
-  }
+        return "ApplicationSpec{" +
+                "name='" + name + '\'' +
+                ", type='" + type + '\'' +
+                ", entities=" + entities +
+                ", locations=" + locations +
+                ", 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/ApplicationSummary.java
----------------------------------------------------------------------
diff --git a/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/ApplicationSummary.java b/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/ApplicationSummary.java
index 3d8ead9..9bc9fe6 100644
--- a/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/ApplicationSummary.java
+++ b/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/ApplicationSummary.java
@@ -23,9 +23,9 @@ import static com.google.common.base.Preconditions.checkNotNull;
 import java.io.Serializable;
 import java.net.URI;
 import java.util.Map;
+import java.util.Objects;
 
-import org.codehaus.jackson.annotate.JsonProperty;
-
+import com.fasterxml.jackson.annotation.JsonProperty;
 import com.google.common.collect.ImmutableMap;
 
 public class ApplicationSummary implements HasId, Serializable {
@@ -63,7 +63,7 @@ public class ApplicationSummary implements HasId, Serializable {
     public String getId() {
         return id;
     }
-    
+
     public ApplicationSpec getSpec() {
         return spec;
     }
@@ -87,31 +87,26 @@ public class ApplicationSummary implements HasId, Serializable {
     @Override
     public boolean equals(Object o) {
         if (this == o) return true;
-        if (o == null || getClass() != o.getClass()) return false;
-
+        if (!(o instanceof ApplicationSummary)) return false;
         ApplicationSummary that = (ApplicationSummary) o;
-
-        if (spec != null ? !spec.equals(that.spec) : that.spec != null)
-            return false;
-        if (status != that.status) return false;
-
-        return true;
+        return Objects.equals(id, that.id) &&
+                Objects.equals(spec, that.spec) &&
+                status == that.status &&
+                Objects.equals(links, that.links);
     }
 
     @Override
     public int hashCode() {
-        int result = spec != null ? spec.hashCode() : 0;
-        result = 31 * result + (status != null ? status.hashCode() : 0);
-        return result;
+        return Objects.hash(id, spec, status, links);
     }
 
     @Override
     public String toString() {
-        return "Application{" +
-                "id=" + id +
+        return "ApplicationSummary{" +
+                "id='" + id + '\'' +
                 ", spec=" + spec +
                 ", status=" + status +
+                ", 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/BrooklynFeatureSummary.java
----------------------------------------------------------------------
diff --git a/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/BrooklynFeatureSummary.java b/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/BrooklynFeatureSummary.java
index 3f0c95d..97a3f68 100644
--- a/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/BrooklynFeatureSummary.java
+++ b/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/BrooklynFeatureSummary.java
@@ -23,12 +23,12 @@ 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.JsonAnyGetter;
-import org.codehaus.jackson.annotate.JsonAnySetter;
-import org.codehaus.jackson.annotate.JsonIgnore;
-import org.codehaus.jackson.annotate.JsonProperty;
-
+import com.fasterxml.jackson.annotation.JsonAnyGetter;
+import com.fasterxml.jackson.annotation.JsonAnySetter;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonProperty;
 import com.google.common.collect.Maps;
 
 public class BrooklynFeatureSummary implements Serializable {
@@ -88,4 +88,31 @@ public class BrooklynFeatureSummary implements Serializable {
         additionalData.put(name, value);
     }
 
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (!(o instanceof BrooklynFeatureSummary)) return false;
+        BrooklynFeatureSummary that = (BrooklynFeatureSummary) o;
+        return Objects.equals(name, that.name) &&
+                Objects.equals(symbolicName, that.symbolicName) &&
+                Objects.equals(version, that.version) &&
+                Objects.equals(lastModified, that.lastModified) &&
+                Objects.equals(additionalData, that.additionalData);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(name, symbolicName, version, lastModified, additionalData);
+    }
+
+    @Override
+    public String toString() {
+        return "BrooklynFeatureSummary{" +
+                "name='" + name + '\'' +
+                ", symbolicName='" + symbolicName + '\'' +
+                ", version='" + version + '\'' +
+                ", lastModified='" + lastModified + '\'' +
+                ", additionalData=" + additionalData +
+                '}';
+    }
 }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/1a53a3f9/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/CatalogEntitySummary.java
----------------------------------------------------------------------
diff --git a/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/CatalogEntitySummary.java b/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/CatalogEntitySummary.java
index 48e49cb..61724bc 100644
--- a/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/CatalogEntitySummary.java
+++ b/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/CatalogEntitySummary.java
@@ -20,25 +20,27 @@ package org.apache.brooklyn.rest.domain;
 
 import java.net.URI;
 import java.util.Map;
+import java.util.Objects;
 import java.util.Set;
 
-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.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 
 public class CatalogEntitySummary extends CatalogItemSummary {
 
     private static final long serialVersionUID = 1063908984191424539L;
 
-    @JsonSerialize(include=Inclusion.NON_EMPTY)
+    @JsonSerialize(include = JsonSerialize.Inclusion.NON_EMPTY)
     private final Set<EntityConfigSummary> config;
-    
-    @JsonSerialize(include=Inclusion.NON_EMPTY)
+
+    @JsonSerialize(include = JsonSerialize.Inclusion.NON_EMPTY)
     private final Set<SensorSummary> sensors;
 
-    @JsonSerialize(include=Inclusion.NON_EMPTY)
+    @JsonSerialize(include = JsonSerialize.Inclusion.NON_EMPTY)
     private final Set<EffectorSummary> effectors;
 
+    @JsonCreator
     public CatalogEntitySummary(
             @JsonProperty("symbolicName") String symbolicName,
             @JsonProperty("version") String version,
@@ -48,8 +50,8 @@ public class CatalogEntitySummary extends CatalogItemSummary {
             @JsonProperty("description") String description,
             @JsonProperty("iconUrl") String iconUrl,
             @JsonProperty("tags") Set<Object> tags,
-            @JsonProperty("config") Set<EntityConfigSummary> config, 
-            @JsonProperty("sensors") Set<SensorSummary> sensors, 
+            @JsonProperty("config") Set<EntityConfigSummary> config,
+            @JsonProperty("sensors") Set<SensorSummary> sensors,
             @JsonProperty("effectors") Set<EffectorSummary> effectors,
             @JsonProperty("deprecated") boolean deprecated,
             @JsonProperty("links") Map<String, URI> links
@@ -63,21 +65,37 @@ public class CatalogEntitySummary extends CatalogItemSummary {
     public Set<EntityConfigSummary> getConfig() {
         return config;
     }
-    
+
     public Set<SensorSummary> getSensors() {
         return sensors;
     }
-    
+
     public Set<EffectorSummary> getEffectors() {
         return effectors;
     }
 
     @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (!(o instanceof CatalogEntitySummary)) return false;
+        if (!super.equals(o)) return false;
+        CatalogEntitySummary that = (CatalogEntitySummary) o;
+        return Objects.equals(config, that.config) &&
+                Objects.equals(sensors, that.sensors) &&
+                Objects.equals(effectors, that.effectors);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(super.hashCode(), config, sensors, effectors);
+    }
+
+    @Override
     public String toString() {
-        return super.toString()+"["+
-                "config="+getConfig()+"; " +
-                "sensors="+getSensors()+"; "+
-                "effectors="+getEffectors()+"; "+
-                "deprecated="+isDeprecated()+"]";
+        return "CatalogEntitySummary{" +
+                "config=" + config +
+                ", sensors=" + sensors +
+                ", effectors=" + effectors +
+                '}';
     }
 }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/1a53a3f9/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/CatalogItemSummary.java
----------------------------------------------------------------------
diff --git a/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/CatalogItemSummary.java b/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/CatalogItemSummary.java
index e3daf87..b2555a1 100644
--- a/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/CatalogItemSummary.java
+++ b/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/CatalogItemSummary.java
@@ -23,15 +23,12 @@ import java.net.URI;
 import java.util.Collection;
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
 import java.util.Set;
 
-import org.apache.commons.lang.builder.EqualsBuilder;
-import org.codehaus.jackson.annotate.JsonIgnoreProperties;
-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.JsonIgnoreProperties;
+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;
 
@@ -42,7 +39,7 @@ import com.google.common.collect.ImmutableMap;
 public class CatalogItemSummary implements HasId, HasName, Serializable {
 
     private static final long serialVersionUID = -823483595879417681L;
-    
+
     private final String id;
     private final String symbolicName;
     private final String version;
@@ -50,19 +47,19 @@ public class CatalogItemSummary implements HasId, HasName, Serializable {
     //needed for backwards compatibility only (json serializer works on fields, not getters)
     @Deprecated
     private final String type;
-    
+
     private final String javaType;
-    
+
     private final String name;
-    @JsonSerialize(include=Inclusion.NON_EMPTY)
+    @JsonSerialize(include = JsonSerialize.Inclusion.NON_EMPTY)
     private final String description;
-    @JsonSerialize(include=Inclusion.NON_EMPTY)
+    @JsonSerialize(include= JsonSerialize.Inclusion.NON_EMPTY)
     private final String iconUrl;
     private final String planYaml;
-    @JsonSerialize(include=Inclusion.NON_EMPTY)
+    @JsonSerialize(include = JsonSerialize.Inclusion.NON_EMPTY)
     private final List<Object> tags;
     private final boolean deprecated;
-    
+
     private final Map<String, URI> links;
 
     public CatalogItemSummary(
@@ -142,22 +139,44 @@ public class CatalogItemSummary implements HasId, HasName, Serializable {
     }
 
     @Override
-    public String toString() {
-        return Objects.toStringHelper(this)
-                .add("id", symbolicName)
-                .add("version", version)
-                .add("deprecated", deprecated)
-                .toString();
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (!(o instanceof CatalogItemSummary)) return false;
+        CatalogItemSummary that = (CatalogItemSummary) o;
+        return deprecated == that.deprecated &&
+                Objects.equals(id, that.id) &&
+                Objects.equals(symbolicName, that.symbolicName) &&
+                Objects.equals(version, that.version) &&
+                Objects.equals(type, that.type) &&
+                Objects.equals(javaType, that.javaType) &&
+                Objects.equals(name, that.name) &&
+                Objects.equals(description, that.description) &&
+                Objects.equals(iconUrl, that.iconUrl) &&
+                Objects.equals(planYaml, that.planYaml) &&
+                Objects.equals(tags, that.tags) &&
+                Objects.equals(links, that.links);
     }
 
     @Override
     public int hashCode() {
-        return Objects.hashCode(symbolicName, version, name, javaType, tags, deprecated);
+        return Objects.hash(id, symbolicName, version, type, javaType, name, description, iconUrl, planYaml, tags, deprecated, links);
     }
-    
+
     @Override
-    public boolean equals(Object obj) {
-        return EqualsBuilder.reflectionEquals(this, obj);
+    public String toString() {
+        return "CatalogItemSummary{" +
+                "id='" + id + '\'' +
+                ", symbolicName='" + symbolicName + '\'' +
+                ", version='" + version + '\'' +
+                ", type='" + type + '\'' +
+                ", javaType='" + javaType + '\'' +
+                ", name='" + name + '\'' +
+                ", description='" + description + '\'' +
+                ", iconUrl='" + iconUrl + '\'' +
+                ", planYaml='" + planYaml + '\'' +
+                ", tags=" + tags +
+                ", deprecated=" + deprecated +
+                ", 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/CatalogLocationSummary.java
----------------------------------------------------------------------
diff --git a/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/CatalogLocationSummary.java b/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/CatalogLocationSummary.java
index cd94d8e..eb061c5 100644
--- a/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/CatalogLocationSummary.java
+++ b/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/CatalogLocationSummary.java
@@ -20,16 +20,16 @@ package org.apache.brooklyn.rest.domain;
 
 import java.net.URI;
 import java.util.Map;
+import java.util.Objects;
 import java.util.Set;
 
-import org.codehaus.jackson.annotate.JsonProperty;
-
+import com.fasterxml.jackson.annotation.JsonProperty;
 import com.google.common.collect.ImmutableSet;
 
 public class CatalogLocationSummary extends CatalogItemSummary {
 
     private static final long serialVersionUID = 8420991584336514673L;
-    
+
     private final Set<LocationConfigSummary> config;
 
     public CatalogLocationSummary(
@@ -49,14 +49,29 @@ public class CatalogLocationSummary extends CatalogItemSummary {
         // TODO expose config from policies
         this.config = (config == null) ? ImmutableSet.<LocationConfigSummary>of() : config;
     }
-    
+
     public Set<LocationConfigSummary> getConfig() {
         return config;
     }
 
     @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (!(o instanceof CatalogLocationSummary)) return false;
+        if (!super.equals(o)) return false;
+        CatalogLocationSummary that = (CatalogLocationSummary) o;
+        return Objects.equals(config, that.config);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(super.hashCode(), config);
+    }
+
+    @Override
     public String toString() {
-        return super.toString()+"["+
-                "config="+getConfig()+"]";
+        return "CatalogLocationSummary{" +
+                "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/CatalogPolicySummary.java
----------------------------------------------------------------------
diff --git a/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/CatalogPolicySummary.java b/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/CatalogPolicySummary.java
index 2b34f55..79187eb 100644
--- a/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/CatalogPolicySummary.java
+++ b/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/CatalogPolicySummary.java
@@ -20,19 +20,18 @@ package org.apache.brooklyn.rest.domain;
 
 import java.net.URI;
 import java.util.Map;
+import java.util.Objects;
 import java.util.Set;
 
-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.ImmutableSet;
 
 public class CatalogPolicySummary extends CatalogItemSummary {
 
     private static final long serialVersionUID = -588856488327394445L;
-    
-    @JsonSerialize(include=Inclusion.NON_EMPTY)
+
+    @JsonSerialize(include = JsonSerialize.Inclusion.NON_EMPTY)
     private final Set<PolicyConfigSummary> config;
 
     public CatalogPolicySummary(
@@ -52,14 +51,29 @@ public class CatalogPolicySummary extends CatalogItemSummary {
         // TODO expose config from policies
         this.config = (config == null) ? ImmutableSet.<PolicyConfigSummary>of() : config;
     }
-    
+
     public Set<PolicyConfigSummary> getConfig() {
         return config;
     }
 
     @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (!(o instanceof CatalogPolicySummary)) return false;
+        if (!super.equals(o)) return false;
+        CatalogPolicySummary that = (CatalogPolicySummary) o;
+        return Objects.equals(config, that.config);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(super.hashCode(), config);
+    }
+
+    @Override
     public String toString() {
-        return super.toString()+"["+
-                "config="+getConfig()+"]";
+        return "CatalogPolicySummary{" +
+                "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/ConfigSummary.java
----------------------------------------------------------------------
diff --git a/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/ConfigSummary.java b/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/ConfigSummary.java
index 8e3d460..22e88d6 100644
--- a/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/ConfigSummary.java
+++ b/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/ConfigSummary.java
@@ -23,15 +23,15 @@ import java.net.URI;
 import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
 
 import javax.annotation.Nullable;
 
 import org.apache.brooklyn.config.ConfigKey;
 import org.apache.brooklyn.util.collections.Jsonya;
-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.base.Function;
 import com.google.common.collect.FluentIterable;
 import com.google.common.collect.ImmutableMap;
@@ -39,20 +39,20 @@ import com.google.common.collect.ImmutableMap;
 public abstract class ConfigSummary implements HasName, Serializable {
 
     private static final long serialVersionUID = -2831796487073496730L;
-    
+
     private final String name;
     private final String type;
-    @JsonSerialize(include = Inclusion.NON_NULL)
+    @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
     private final Object defaultValue;
-    @JsonSerialize(include = Inclusion.NON_NULL)
+    @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
     private final String description;
     @JsonSerialize
     private final boolean reconfigurable;
-    @JsonSerialize(include = Inclusion.NON_NULL)
+    @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
     private final String label;
-    @JsonSerialize(include = Inclusion.NON_NULL)
+    @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
     private final Double priority;
-    @JsonSerialize(include = Inclusion.NON_NULL)
+    @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
     private final List<Map<String, String>> possibleValues;
 
     protected ConfigSummary(
@@ -150,22 +150,34 @@ public abstract class ConfigSummary 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 ConfigSummary)) return false;
         ConfigSummary that = (ConfigSummary) o;
-
-        if (name != null ? !name.equals(that.name) : that.name != null)
-            return false;
-
-        return true;
+        return reconfigurable == that.reconfigurable &&
+                Objects.equals(name, that.name) &&
+                Objects.equals(type, that.type) &&
+                Objects.equals(defaultValue, that.defaultValue) &&
+                Objects.equals(description, that.description) &&
+                Objects.equals(label, that.label) &&
+                Objects.equals(priority, that.priority) &&
+                Objects.equals(possibleValues, that.possibleValues);
     }
 
     @Override
     public int hashCode() {
-        int result = name != null ? name.hashCode() : 0;
-        return result;
+        return Objects.hash(name, type, defaultValue, description, reconfigurable, label, priority, possibleValues);
     }
 
     @Override
-    public abstract String toString();
+    public String toString() {
+        return "ConfigSummary{" +
+                "name='" + name + '\'' +
+                ", type='" + type + '\'' +
+                ", defaultValue=" + defaultValue +
+                ", description='" + description + '\'' +
+                ", reconfigurable=" + reconfigurable +
+                ", label='" + label + '\'' +
+                ", priority=" + priority +
+                ", possibleValues=" + possibleValues +
+                '}';
+    }
 }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/1a53a3f9/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/EffectorSummary.java
----------------------------------------------------------------------
diff --git a/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/EffectorSummary.java b/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/EffectorSummary.java
index 9a2d4ae..8ad7812 100644
--- a/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/EffectorSummary.java
+++ b/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/EffectorSummary.java
@@ -23,10 +23,8 @@ import java.net.URI;
 import java.util.Map;
 import java.util.Set;
 
-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.base.Objects;
 import com.google.common.collect.ImmutableMap;
 
@@ -36,10 +34,10 @@ public class EffectorSummary implements HasName, Serializable {
 
     public static class ParameterSummary<T> implements HasName, Serializable {
         private static final long serialVersionUID = -6393686096290306153L;
-        
+
         private final String name;
         private final String type;
-        @JsonSerialize(include = Inclusion.NON_NULL)
+        @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
         private final String description;
         private final T defaultValue;
 
@@ -75,9 +73,9 @@ public class EffectorSummary implements HasName, Serializable {
         public boolean equals(Object o) {
             if (this == o) return true;
             if (o == null || getClass() != o.getClass()) return false;
-    
+
           ParameterSummary<?> that = (ParameterSummary<?>) o;
-    
+
           return Objects.equal(this.name, that.name)
                   && Objects.equal(this.type, that.type)
                   && Objects.equal(this.description, that.description)
@@ -104,9 +102,9 @@ public class EffectorSummary implements HasName, Serializable {
     private final String name;
     private final String returnType;
     private final Set<ParameterSummary<?>> parameters;
-    @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 EffectorSummary(
@@ -146,42 +144,28 @@ public class EffectorSummary 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 EffectorSummary)) return false;
         EffectorSummary that = (EffectorSummary) 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 (parameters != null ? !parameters.equals(that.parameters) : that.parameters != null)
-            return false;
-        if (returnType != null ? !returnType.equals(that.returnType) : that.returnType != null)
-            return false;
-
-        return true;
+        return java.util.Objects.equals(name, that.name) &&
+                java.util.Objects.equals(returnType, that.returnType) &&
+                java.util.Objects.equals(parameters, that.parameters) &&
+                java.util.Objects.equals(description, that.description) &&
+                java.util.Objects.equals(links, that.links);
     }
 
     @Override
     public int hashCode() {
-        int result = name != null ? name.hashCode() : 0;
-        result = 31 * result + (description != null ? description.hashCode() : 0);
-        result = 31 * result + (returnType != null ? returnType.hashCode() : 0);
-        result = 31 * result + (parameters != null ? parameters.hashCode() : 0);
-        result = 31 * result + (links != null ? links.hashCode() : 0);
-        return result;
+        return java.util.Objects.hash(name, returnType, parameters, description, links);
     }
 
     @Override
     public String toString() {
-        return "EffectorSummary{"
-                + "name='" + name + '\''
-                + ", description='" + description + '\''
-                + ", returnType='" + returnType + '\''
-                + ", parameters=" + parameters
-                + ", links=" + links
-                + '}';
+        return "EffectorSummary{" +
+                "name='" + name + '\'' +
+                ", returnType='" + returnType + '\'' +
+                ", parameters=" + parameters +
+                ", 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/EntityConfigSummary.java
----------------------------------------------------------------------
diff --git a/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/EntityConfigSummary.java b/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/EntityConfigSummary.java
index 62c6717..1e1de5b 100644
--- a/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/EntityConfigSummary.java
+++ b/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/EntityConfigSummary.java
@@ -18,22 +18,22 @@
  */
 package org.apache.brooklyn.rest.domain;
 
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 import com.google.common.collect.ImmutableMap;
 
 import org.apache.brooklyn.config.ConfigKey;
-import org.codehaus.jackson.annotate.JsonProperty;
-import org.codehaus.jackson.map.annotate.JsonSerialize;
-import org.codehaus.jackson.map.annotate.JsonSerialize.Inclusion;
 
 import java.net.URI;
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
 
 public class EntityConfigSummary extends ConfigSummary {
 
     private static final long serialVersionUID = -1336134336883426030L;
-    
-    @JsonSerialize(include = Inclusion.NON_NULL)
+
+    @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
     private final Map<String, URI> links;
 
     public EntityConfigSummary(
@@ -61,10 +61,23 @@ public class EntityConfigSummary extends ConfigSummary {
     }
 
     @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (!(o instanceof EntityConfigSummary)) return false;
+        if (!super.equals(o)) return false;
+        EntityConfigSummary that = (EntityConfigSummary) o;
+        return Objects.equals(links, that.links);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(super.hashCode(), links);
+    }
+
+    @Override
     public String toString() {
-        return "EntityConfigSummary{"
-                + "name='" + getName() + '\''
-                + ", type='" + getType() + '\''
-                + '}';
+        return "EntityConfigSummary{" +
+                "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/EntityDetail.java
----------------------------------------------------------------------
diff --git a/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/EntityDetail.java b/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/EntityDetail.java
new file mode 100644
index 0000000..830c0b1
--- /dev/null
+++ b/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/EntityDetail.java
@@ -0,0 +1,80 @@
+/*
+ * 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.util.List;
+import java.util.Map;
+import java.util.Objects;
+
+import org.apache.brooklyn.core.entity.lifecycle.Lifecycle;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.google.common.collect.ImmutableList;
+
+public class EntityDetail extends EntitySummary {
+
+    private static final long serialVersionUID = 100490507982229165L;
+
+    private final String parentId;
+    @JsonSerialize(include = JsonSerialize.Inclusion.NON_EMPTY)
+    private final List<EntitySummary> children;
+    private final List<String> groupIds;
+    private final List<Map<String, String>> members;
+
+    public EntityDetail(
+            @JsonProperty("id") String id,
+            @JsonProperty("parentId") String parentId,
+            @JsonProperty("name") String name,
+            @JsonProperty("type") String type,
+            @JsonProperty("serviceUp") Boolean serviceUp,
+            @JsonProperty("serviceState") Lifecycle serviceState,
+            @JsonProperty("iconUrl") String iconUrl,
+            @JsonProperty("catalogItemId") String catalogItemId,
+            @JsonProperty("children") List<EntitySummary> children,
+            @JsonProperty("groupIds") List<String> groupIds,
+            @JsonProperty("members") List<Map<String, String>> members) {
+        super(id, name, type, catalogItemId, null);
+        this.parentId = parentId;
+        this.children = (children == null) ? ImmutableList.<EntitySummary>of() : ImmutableList.copyOf(children);
+        this.groupIds = (groupIds == null) ? ImmutableList.<String>of() : ImmutableList.copyOf(groupIds);
+        this.members = (members == null) ? ImmutableList.<Map<String,String>>of() : ImmutableList.copyOf(members);
+    }
+
+    public static long getSerialVersionUID() {
+        return serialVersionUID;
+    }
+
+    public String getParentId() {
+        return parentId;
+    }
+
+    public List<EntitySummary> getChildren() {
+        return children;
+    }
+
+    public List<String> getGroupIds() {
+        return groupIds;
+    }
+
+    public List<Map<String, String>> getMembers() {
+        return members;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/1a53a3f9/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/EntitySpec.java
----------------------------------------------------------------------
diff --git a/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/EntitySpec.java b/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/EntitySpec.java
index a7110a2..b4d9c04 100644
--- a/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/EntitySpec.java
+++ b/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/EntitySpec.java
@@ -20,18 +20,18 @@ package org.apache.brooklyn.rest.domain;
 
 import static com.google.common.base.Preconditions.checkNotNull;
 
+import com.fasterxml.jackson.annotation.JsonProperty;
 import com.google.common.collect.ImmutableMap;
 
-import org.codehaus.jackson.annotate.JsonProperty;
-
 import java.io.Serializable;
 import java.util.Collections;
 import java.util.Map;
+import java.util.Objects;
 
 public class EntitySpec implements HasName, Serializable {
 
     private static final long serialVersionUID = -3882575609132757188L;
-    
+
     private final String name;
     private final String type;
     private final Map<String, String> config;
@@ -69,34 +69,24 @@ public class EntitySpec implements HasName, Serializable {
     @Override
     public boolean equals(Object o) {
         if (this == o) return true;
-        if (o == null || getClass() != o.getClass()) return false;
-
-        EntitySpec entitySpec = (EntitySpec) o;
-
-        if (config != null ? !config.equals(entitySpec.config) : entitySpec.config != null)
-            return false;
-        if (name != null ? !name.equals(entitySpec.name) : entitySpec.name != null)
-            return false;
-        if (type != null ? !type.equals(entitySpec.type) : entitySpec.type != null)
-            return false;
-
-        return true;
+        if (!(o instanceof EntitySpec)) return false;
+        EntitySpec that = (EntitySpec) o;
+        return Objects.equals(name, that.name) &&
+                Objects.equals(type, that.type) &&
+                Objects.equals(config, that.config);
     }
 
     @Override
     public int hashCode() {
-        int result = name != null ? name.hashCode() : 0;
-        result = 31 * result + (type != null ? type.hashCode() : 0);
-        result = 31 * result + (config != null ? config.hashCode() : 0);
-        return result;
+        return Objects.hash(name, type, config);
     }
 
     @Override
     public String toString() {
-        return "EntitySpec{"
-                + "name='" + name + '\''
-                + ", type='" + type + '\''
-                + ", config=" + config
-                + '}';
+        return "EntitySpec{" +
+                "name='" + name + '\'' +
+                ", type='" + type + '\'' +
+                ", 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/EntitySummary.java
----------------------------------------------------------------------
diff --git a/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/EntitySummary.java b/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/EntitySummary.java
index b2bb9b1..e0a585a 100644
--- a/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/EntitySummary.java
+++ b/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/EntitySummary.java
@@ -18,24 +18,23 @@
  */
 package org.apache.brooklyn.rest.domain;
 
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 import com.google.common.collect.ImmutableMap;
 
-import org.codehaus.jackson.annotate.JsonProperty;
-import org.codehaus.jackson.map.annotate.JsonSerialize;
-import org.codehaus.jackson.map.annotate.JsonSerialize.Inclusion;
-
 import java.io.Serializable;
 import java.net.URI;
 import java.util.Map;
+import java.util.Objects;
 
 public class EntitySummary implements HasId, HasName, Serializable {
 
     private static final long serialVersionUID = 100490507982229165L;
-    
+
     private final String id;
     private final String name;
     private final String type;
-    @JsonSerialize(include = Inclusion.NON_NULL)
+    @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
     private final String catalogItemId;
     private final Map<String, URI> links;
 
@@ -76,22 +75,29 @@ public class EntitySummary implements HasId, HasName, Serializable {
 
     @Override
     public boolean equals(Object o) {
-        return (o instanceof EntitySummary) && id.equals(((EntitySummary) o).getId());
+        if (this == o) return true;
+        if (!(o instanceof EntitySummary)) return false;
+        EntitySummary that = (EntitySummary) o;
+        return Objects.equals(id, that.id) &&
+                Objects.equals(name, that.name) &&
+                Objects.equals(type, that.type) &&
+                Objects.equals(catalogItemId, that.catalogItemId) &&
+                Objects.equals(links, that.links);
     }
 
     @Override
     public int hashCode() {
-        return id != null ? id.hashCode() : 0;
+        return Objects.hash(id, name, type, catalogItemId, links);
     }
 
     @Override
     public String toString() {
-        return "EntitySummary{"
-                + "id='" + id + '\''
-                + ", name=" + name
-                + ", type=" + type
-                + ", catalogItemId=" + catalogItemId
-                + ", links=" + links
-                + '}';
-  }
+        return "EntitySummary{" +
+                "id='" + id + '\'' +
+                ", name='" + name + '\'' +
+                ", type='" + type + '\'' +
+                ", catalogItemId='" + catalogItemId + '\'' +
+                ", 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/HighAvailabilitySummary.java
----------------------------------------------------------------------
diff --git a/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/HighAvailabilitySummary.java b/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/HighAvailabilitySummary.java
index c63d13f..037c08e 100644
--- a/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/HighAvailabilitySummary.java
+++ b/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/HighAvailabilitySummary.java
@@ -21,10 +21,9 @@ 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 com.google.common.base.Objects;
+import com.fasterxml.jackson.annotation.JsonProperty;
 import com.google.common.collect.ImmutableMap;
 
 public class HighAvailabilitySummary implements Serializable {
@@ -33,13 +32,13 @@ public class HighAvailabilitySummary implements Serializable {
 
     public static class HaNodeSummary implements Serializable {
         private static final long serialVersionUID = 9205960988226816539L;
-        
+
         private final String nodeId;
         private final URI nodeUri;
         private final String status;
         private final Long localTimestamp;
         private final Long remoteTimestamp;
-        
+
         public HaNodeSummary(
                 @JsonProperty("nodeId") String nodeId,
                 @JsonProperty("nodeUri") URI nodeUri,
@@ -75,20 +74,30 @@ public class HighAvailabilitySummary implements Serializable {
 
         @Override
         public boolean equals(Object o) {
-            return (o instanceof HaNodeSummary) && Objects.equal(nodeId, ((HaNodeSummary) o).getNodeId());
+            if (this == o) return true;
+            if (!(o instanceof HaNodeSummary)) return false;
+            HaNodeSummary that = (HaNodeSummary) o;
+            return Objects.equals(nodeId, that.nodeId) &&
+                    Objects.equals(nodeUri, that.nodeUri) &&
+                    Objects.equals(status, that.status) &&
+                    Objects.equals(localTimestamp, that.localTimestamp) &&
+                    Objects.equals(remoteTimestamp, that.remoteTimestamp);
         }
 
         @Override
         public int hashCode() {
-            return Objects.hashCode(nodeId);
+            return Objects.hash(nodeId, nodeUri, status, localTimestamp, remoteTimestamp);
         }
 
         @Override
         public String toString() {
-            return "HighAvailabilitySummary{"
-                    + "nodeId='" + nodeId + '\''
-                    + ", status='" + status + '\''
-                    + '}';
+            return "HaNodeSummary{" +
+                    "nodeId='" + nodeId + '\'' +
+                    ", nodeUri=" + nodeUri +
+                    ", status='" + status + '\'' +
+                    ", localTimestamp=" + localTimestamp +
+                    ", remoteTimestamp=" + remoteTimestamp +
+                    '}';
         }
     }
 
@@ -126,19 +135,27 @@ public class HighAvailabilitySummary implements Serializable {
 
     @Override
     public boolean equals(Object o) {
-        return (o instanceof HighAvailabilitySummary) && ownId.equals(((HighAvailabilitySummary) o).getOwnId());
+        if (this == o) return true;
+        if (!(o instanceof HighAvailabilitySummary)) return false;
+        HighAvailabilitySummary that = (HighAvailabilitySummary) o;
+        return Objects.equals(ownId, that.ownId) &&
+                Objects.equals(masterId, that.masterId) &&
+                Objects.equals(nodes, that.nodes) &&
+                Objects.equals(links, that.links);
     }
 
     @Override
     public int hashCode() {
-        return ownId != null ? ownId.hashCode() : 0;
+        return Objects.hash(ownId, masterId, nodes, links);
     }
 
     @Override
     public String toString() {
-        return "HighAvailabilitySummary{"
-                + "ownId='" + ownId + '\''
-                + ", links=" + links
-                + '}';
+        return "HighAvailabilitySummary{" +
+                "ownId='" + ownId + '\'' +
+                ", masterId='" + masterId + '\'' +
+                ", nodes=" + nodes +
+                ", links=" + links +
+                '}';
     }
 }


[4/4] brooklyn-server git commit: Closes #11

Posted by sv...@apache.org.
Closes #11

Initial work to simplify the rest server

- remove JsonNode from API interfaces
- refactor consistently toStringand hashCode and equals for the domain objects
- remove deprecated code
- simplified pom dependencies
- remove com.codehaus.jackson dependency and promote com.fasterxml.jackson usage
- adjust BrooklynJacksonSerializer to use jackson 2 api
- fix web.xml for rest-api and rest-client
- update feature.xml dependencies, following maven dependency changes


Project: http://git-wip-us.apache.org/repos/asf/brooklyn-server/repo
Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-server/commit/5c8bb4eb
Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-server/tree/5c8bb4eb
Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-server/diff/5c8bb4eb

Branch: refs/heads/master
Commit: 5c8bb4ebbc5b480226aa2c45ce167b3e950cb38f
Parents: 46ae223 1a53a3f
Author: Svetoslav Neykov <sv...@cloudsoftcorp.com>
Authored: Wed Feb 10 12:48:24 2016 +0200
Committer: Svetoslav Neykov <sv...@cloudsoftcorp.com>
Committed: Wed Feb 10 12:48:24 2016 +0200

----------------------------------------------------------------------
 camp/camp-server/pom.xml                        |   5 -
 core/pom.xml                                    |   8 --
 .../apache/brooklyn/core/mgmt/BrooklynTags.java |   7 +-
 .../brooklyn/core/mgmt/BrooklynTaskTags.java    |   2 +-
 .../ha/dto/BasicManagementNodeSyncRecord.java   |   5 +-
 .../rebind/dto/BasicCatalogItemMemento.java     |   2 +-
 .../mgmt/rebind/dto/BasicEntityMemento.java     |   5 +-
 .../mgmt/rebind/dto/MutableBrooklynMemento.java |   5 +-
 karaf/features/src/main/feature/feature.xml     |  25 ++--
 parent/pom.xml                                  |  27 +---
 pom.xml                                         |   7 +-
 rest/rest-api/pom.xml                           |  15 ++-
 .../apache/brooklyn/rest/api/ActivityApi.java   |   1 -
 .../brooklyn/rest/api/ApplicationApi.java       |  14 +-
 .../brooklyn/rest/domain/AccessSummary.java     |  19 +--
 .../apache/brooklyn/rest/domain/ApiError.java   |  83 ++++++------
 .../brooklyn/rest/domain/ApplicationSpec.java   |  63 ++++-----
 .../rest/domain/ApplicationSummary.java         |  29 ++--
 .../rest/domain/BrooklynFeatureSummary.java     |  37 +++++-
 .../rest/domain/CatalogEntitySummary.java       |  50 ++++---
 .../rest/domain/CatalogItemSummary.java         |  69 ++++++----
 .../rest/domain/CatalogLocationSummary.java     |  27 +++-
 .../rest/domain/CatalogPolicySummary.java       |  32 +++--
 .../brooklyn/rest/domain/ConfigSummary.java     |  50 ++++---
 .../brooklyn/rest/domain/EffectorSummary.java   |  60 ++++-----
 .../rest/domain/EntityConfigSummary.java        |  31 +++--
 .../brooklyn/rest/domain/EntityDetail.java      |  80 +++++++++++
 .../apache/brooklyn/rest/domain/EntitySpec.java |  38 ++----
 .../brooklyn/rest/domain/EntitySummary.java     |  38 +++---
 .../rest/domain/HighAvailabilitySummary.java    |  51 +++++---
 .../brooklyn/rest/domain/LinkWithMetadata.java  |  55 ++++----
 .../rest/domain/LocationConfigSummary.java      |  32 +++--
 .../brooklyn/rest/domain/LocationSpec.java      |  35 +++--
 .../brooklyn/rest/domain/LocationSummary.java   |  34 +++--
 .../rest/domain/PolicyConfigSummary.java        |  34 +++--
 .../brooklyn/rest/domain/PolicySummary.java     |  43 +++---
 .../rest/domain/ScriptExecutionSummary.java     |  48 +++++--
 .../brooklyn/rest/domain/SensorSummary.java     |  49 +++----
 .../brooklyn/rest/domain/TaskSummary.java       | 123 +++++++++++------
 .../brooklyn/rest/domain/UsageStatistic.java    |  38 +++---
 .../brooklyn/rest/domain/UsageStatistics.java   |  26 ++--
 .../brooklyn/rest/domain/VersionSummary.java    |  30 ++++-
 rest/rest-api/src/main/webapp/WEB-INF/web.xml   |   4 +-
 .../rest/domain/AbstractDomainTest.java         |  44 +++++++
 .../brooklyn/rest/domain/ApiErrorTest.java      |  18 ++-
 .../rest/domain/ApplicationSpecTest.java        |  37 ++----
 .../rest/domain/EffectorSummaryTest.java        |  37 ++----
 .../brooklyn/rest/domain/EntitySpecTest.java    |  20 ++-
 .../brooklyn/rest/domain/EntitySummaryTest.java |  35 ++---
 .../rest/domain/LocationSummaryTest.java        |  41 ++++++
 .../rest/domain/VersionSummaryTest.java         |  51 +++-----
 .../brooklyn/rest/util/RestApiTestUtils.java    |   5 +-
 rest/rest-client/pom.xml                        |   2 +-
 .../rest-client/src/test/webapp/WEB-INF/web.xml |   2 +-
 rest/rest-server/pom.xml                        |  41 ++----
 .../resources/AbstractBrooklynRestResource.java |   3 +-
 .../rest/resources/ApplicationResource.java     | 131 +++++++------------
 .../brooklyn/rest/util/WebResourceUtils.java    |   2 +-
 .../rest/util/json/BidiSerialization.java       |  41 +++---
 .../util/json/BrooklynJacksonJsonProvider.java  |  31 ++---
 .../json/ConfigurableSerializerProvider.java    |  52 ++++----
 .../ErrorAndToStringUnknownTypeSerializer.java  |  41 +++---
 .../rest/util/json/MultimapSerializer.java      |  62 ---------
 ...StrictPreferringFieldsVisibilityChecker.java |  19 +--
 .../rest-server/src/main/webapp/WEB-INF/web.xml |   2 +-
 .../brooklyn/rest/domain/ApplicationTest.java   |  17 +--
 .../rest/domain/LocationSummaryTest.java        |  55 --------
 .../rest/resources/DescendantsTest.java         |   4 +-
 .../rest/resources/EntityResourceTest.java      |   4 +-
 .../rest/testing/BrooklynRestApiTest.java       |   2 +-
 .../rest/testing/BrooklynRestResourceTest.java  |   2 +-
 .../json/BrooklynJacksonSerializerTest.java     |   6 +-
 72 files changed, 1156 insertions(+), 1087 deletions(-)
----------------------------------------------------------------------