Fix conflicts from #806. This closes #806.

Project: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/repo
Commit: 
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/commit/2aac052f
Tree: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/tree/2aac052f
Diff: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/diff/2aac052f

Branch: refs/heads/master
Commit: 2aac052fbde38b566f5d70efa0d241b0488c98f4
Parents: 2ed62d6 f73a1af
Author: Hadrian Zbarcea <[email protected]>
Authored: Sat Aug 8 22:39:29 2015 -0400
Committer: Hadrian Zbarcea <[email protected]>
Committed: Sat Aug 8 22:54:34 2015 -0400

----------------------------------------------------------------------
 brooklyn-install.sh                             |   2 +-
 .../io/brooklyn/camp/CampRestResources.java     |   2 +-
 .../camp/rest/resource/ApidocRestResource.java  |   4 +-
 .../ApplicationComponentRestResource.java       |   2 +-
 ...pplicationComponentTemplateRestResource.java |   2 +-
 .../rest/resource/AssemblyRestResource.java     |   2 +-
 .../resource/AssemblyTemplateRestResource.java  |   2 +-
 .../resource/PlatformComponentRestResource.java |   2 +-
 .../PlatformComponentTemplateRestResource.java  |   2 +-
 .../rest/resource/PlatformRestResource.java     |   2 +-
 docs/guide/ops/brooklyn_properties.md           |  10 +-
 docs/guide/start/brooklyn.properties            |   2 +-
 .../main/java/org/apache/brooklyn/cli/Main.java |   4 +-
 .../brooklyn/cli/lister/ItemDescriptors.java    |  14 +-
 .../jsgui/BrooklynJavascriptGuiLauncher.java    |   2 +-
 .../BrooklynJavascriptGuiLauncherTest.java      |   2 +-
 .../brooklyn/launcher/BrooklynLauncher.java     |   8 +-
 .../brooklyn/launcher/BrooklynWebServer.java    |  22 +-
 .../launcher/config/BrooklynGlobalConfig.java   |   2 +-
 .../BrooklynEntityMirrorIntegrationTest.java    |   2 +-
 .../launcher/BrooklynWebServerTest.java         |   2 +-
 .../brooklyn/launcher/WebAppRunnerTest.java     |   4 +-
 .../main/java/brooklyn/rest/api/AccessApi.java  |  62 --
 .../java/brooklyn/rest/api/ActivityApi.java     |  69 ---
 .../java/brooklyn/rest/api/ApplicationApi.java  | 222 -------
 .../main/java/brooklyn/rest/api/CatalogApi.java | 325 ----------
 .../java/brooklyn/rest/api/EffectorApi.java     |  85 ---
 .../main/java/brooklyn/rest/api/EntityApi.java  | 235 --------
 .../java/brooklyn/rest/api/EntityConfigApi.java | 145 -----
 .../java/brooklyn/rest/api/LocationApi.java     | 101 ----
 .../main/java/brooklyn/rest/api/PolicyApi.java  | 151 -----
 .../java/brooklyn/rest/api/PolicyConfigApi.java | 120 ----
 .../main/java/brooklyn/rest/api/ScriptApi.java  |  52 --
 .../main/java/brooklyn/rest/api/SensorApi.java  | 150 -----
 .../main/java/brooklyn/rest/api/ServerApi.java  | 203 -------
 .../main/java/brooklyn/rest/api/UsageApi.java   | 156 -----
 .../main/java/brooklyn/rest/api/VersionApi.java |  42 --
 .../brooklyn/rest/domain/AccessSummary.java     |  74 ---
 .../java/brooklyn/rest/domain/ApiError.java     | 208 -------
 .../brooklyn/rest/domain/ApplicationSpec.java   | 181 ------
 .../rest/domain/ApplicationSummary.java         | 117 ----
 .../rest/domain/BrooklynFeatureSummary.java     |  91 ---
 .../rest/domain/CatalogEntitySummary.java       |  81 ---
 .../rest/domain/CatalogItemSummary.java         | 151 -----
 .../rest/domain/CatalogLocationSummary.java     |  59 --
 .../rest/domain/CatalogPolicySummary.java       |  64 --
 .../brooklyn/rest/domain/ConfigSummary.java     | 172 ------
 .../brooklyn/rest/domain/EffectorSummary.java   | 187 ------
 .../rest/domain/EntityConfigSummary.java        |  69 ---
 .../java/brooklyn/rest/domain/EntitySpec.java   | 102 ----
 .../brooklyn/rest/domain/EntitySummary.java     |  97 ---
 .../java/brooklyn/rest/domain/HasConfig.java    |  28 -
 .../main/java/brooklyn/rest/domain/HasId.java   |  26 -
 .../main/java/brooklyn/rest/domain/HasName.java |  26 -
 .../rest/domain/HighAvailabilitySummary.java    | 144 -----
 .../brooklyn/rest/domain/LinkWithMetadata.java  |  88 ---
 .../rest/domain/LocationConfigSummary.java      |  62 --
 .../java/brooklyn/rest/domain/LocationSpec.java |  96 ---
 .../brooklyn/rest/domain/LocationSummary.java   |  96 ---
 .../rest/domain/PolicyConfigSummary.java        |  60 --
 .../brooklyn/rest/domain/PolicySummary.java     | 108 ----
 .../rest/domain/ScriptExecutionSummary.java     |  67 ---
 .../brooklyn/rest/domain/SensorSummary.java     | 107 ----
 .../main/java/brooklyn/rest/domain/Status.java  |  33 -
 .../rest/domain/SummaryComparators.java         |  82 ---
 .../java/brooklyn/rest/domain/TaskSummary.java  | 232 -------
 .../brooklyn/rest/domain/UsageStatistic.java    | 124 ----
 .../brooklyn/rest/domain/UsageStatistics.java   |  76 ---
 .../brooklyn/rest/domain/VersionSummary.java    |  81 ---
 .../org/apache/brooklyn/rest/api/AccessApi.java |  62 ++
 .../apache/brooklyn/rest/api/ActivityApi.java   |  69 +++
 .../brooklyn/rest/api/ApplicationApi.java       | 222 +++++++
 .../apache/brooklyn/rest/api/CatalogApi.java    | 325 ++++++++++
 .../apache/brooklyn/rest/api/EffectorApi.java   |  85 +++
 .../org/apache/brooklyn/rest/api/EntityApi.java | 235 ++++++++
 .../brooklyn/rest/api/EntityConfigApi.java      | 145 +++++
 .../apache/brooklyn/rest/api/LocationApi.java   | 101 ++++
 .../org/apache/brooklyn/rest/api/PolicyApi.java | 151 +++++
 .../brooklyn/rest/api/PolicyConfigApi.java      | 120 ++++
 .../org/apache/brooklyn/rest/api/ScriptApi.java |  52 ++
 .../org/apache/brooklyn/rest/api/SensorApi.java | 150 +++++
 .../org/apache/brooklyn/rest/api/ServerApi.java | 203 +++++++
 .../org/apache/brooklyn/rest/api/UsageApi.java  | 156 +++++
 .../apache/brooklyn/rest/api/VersionApi.java    |  42 ++
 .../brooklyn/rest/domain/AccessSummary.java     |  74 +++
 .../apache/brooklyn/rest/domain/ApiError.java   | 208 +++++++
 .../brooklyn/rest/domain/ApplicationSpec.java   | 181 ++++++
 .../rest/domain/ApplicationSummary.java         | 117 ++++
 .../rest/domain/BrooklynFeatureSummary.java     |  91 +++
 .../rest/domain/CatalogEntitySummary.java       |  81 +++
 .../rest/domain/CatalogItemSummary.java         | 151 +++++
 .../rest/domain/CatalogLocationSummary.java     |  59 ++
 .../rest/domain/CatalogPolicySummary.java       |  64 ++
 .../brooklyn/rest/domain/ConfigSummary.java     | 172 ++++++
 .../brooklyn/rest/domain/EffectorSummary.java   | 187 ++++++
 .../rest/domain/EntityConfigSummary.java        |  69 +++
 .../apache/brooklyn/rest/domain/EntitySpec.java | 102 ++++
 .../brooklyn/rest/domain/EntitySummary.java     |  97 +++
 .../apache/brooklyn/rest/domain/HasConfig.java  |  28 +
 .../org/apache/brooklyn/rest/domain/HasId.java  |  26 +
 .../apache/brooklyn/rest/domain/HasName.java    |  26 +
 .../rest/domain/HighAvailabilitySummary.java    | 144 +++++
 .../brooklyn/rest/domain/LinkWithMetadata.java  |  88 +++
 .../rest/domain/LocationConfigSummary.java      |  62 ++
 .../brooklyn/rest/domain/LocationSpec.java      |  96 +++
 .../brooklyn/rest/domain/LocationSummary.java   |  96 +++
 .../rest/domain/PolicyConfigSummary.java        |  60 ++
 .../brooklyn/rest/domain/PolicySummary.java     | 108 ++++
 .../rest/domain/ScriptExecutionSummary.java     |  67 +++
 .../brooklyn/rest/domain/SensorSummary.java     | 107 ++++
 .../org/apache/brooklyn/rest/domain/Status.java |  33 +
 .../rest/domain/SummaryComparators.java         |  82 +++
 .../brooklyn/rest/domain/TaskSummary.java       | 232 +++++++
 .../brooklyn/rest/domain/UsageStatistic.java    | 124 ++++
 .../brooklyn/rest/domain/UsageStatistics.java   |  76 +++
 .../brooklyn/rest/domain/VersionSummary.java    |  81 +++
 usage/rest-api/src/main/webapp/WEB-INF/web.xml  |  10 +-
 .../java/brooklyn/rest/domain/ApiErrorTest.java |  63 --
 .../rest/domain/ApplicationSpecTest.java        |  53 --
 .../rest/domain/EffectorSummaryTest.java        |  53 --
 .../brooklyn/rest/domain/EntitySpecTest.java    |  50 --
 .../brooklyn/rest/domain/EntitySummaryTest.java |  61 --
 .../brooklyn/rest/domain/LocationSpecTest.java  |  58 --
 .../rest/domain/VersionSummaryTest.java         |  62 --
 .../brooklyn/rest/util/RestApiTestUtils.java    |  58 --
 .../brooklyn/rest/domain/ApiErrorTest.java      |  63 ++
 .../rest/domain/ApplicationSpecTest.java        |  53 ++
 .../rest/domain/EffectorSummaryTest.java        |  53 ++
 .../brooklyn/rest/domain/EntitySpecTest.java    |  50 ++
 .../brooklyn/rest/domain/EntitySummaryTest.java |  61 ++
 .../brooklyn/rest/domain/LocationSpecTest.java  |  58 ++
 .../rest/domain/VersionSummaryTest.java         |  62 ++
 .../brooklyn/rest/util/RestApiTestUtils.java    |  58 ++
 .../brooklyn/rest/client/BrooklynApi.java       |  30 +-
 .../ApplicationResourceIntegrationTest.java     |  14 +-
 .../rest/client/BrooklynApiRestClientTest.java  |  11 +-
 .../rest-client/src/test/webapp/WEB-INF/web.xml |  38 +-
 .../java/brooklyn/rest/BrooklynRestApi.java     |  89 ---
 .../java/brooklyn/rest/BrooklynWebConfig.java   | 155 -----
 .../BrooklynPropertiesSecurityFilter.java       | 176 ------
 .../rest/filter/HaHotCheckResourceFilter.java   | 151 -----
 .../rest/filter/HaHotStateRequired.java         |  36 --
 .../rest/filter/HaMasterCheckFilter.java        | 140 -----
 .../brooklyn/rest/filter/LoggingFilter.java     | 160 -----
 .../brooklyn/rest/filter/NoCacheFilter.java     |  40 --
 .../rest/filter/RequestTaggingFilter.java       |  62 --
 .../resources/AbstractBrooklynRestResource.java | 153 -----
 .../brooklyn/rest/resources/AccessResource.java |  46 --
 .../rest/resources/ActivityResource.java        |  67 ---
 .../brooklyn/rest/resources/ApidocResource.java |  29 -
 .../rest/resources/ApplicationResource.java     | 463 --------------
 .../rest/resources/CatalogResource.java         | 481 ---------------
 .../rest/resources/EffectorResource.java        | 115 ----
 .../rest/resources/EntityConfigResource.java    | 153 -----
 .../brooklyn/rest/resources/EntityResource.java | 225 -------
 .../rest/resources/LocationResource.java        | 185 ------
 .../rest/resources/PolicyConfigResource.java    | 109 ----
 .../brooklyn/rest/resources/PolicyResource.java | 133 -----
 .../brooklyn/rest/resources/ScriptResource.java |  99 ---
 .../brooklyn/rest/resources/SensorResource.java | 150 -----
 .../brooklyn/rest/resources/ServerResource.java | 496 ---------------
 .../brooklyn/rest/resources/UsageResource.java  | 257 --------
 .../rest/resources/VersionResource.java         |  32 -
 .../brooklyn/rest/security/PasswordHasher.java  |  32 -
 .../provider/AbstractSecurityProvider.java      |  56 --
 .../provider/AnyoneSecurityProvider.java        |  40 --
 .../provider/BlackholeSecurityProvider.java     |  40 --
 ...nUserWithRandomPasswordSecurityProvider.java |  68 ---
 .../provider/DelegatingSecurityProvider.java    | 156 -----
 .../provider/ExplicitUsersSecurityProvider.java | 103 ----
 .../security/provider/LdapSecurityProvider.java | 131 ----
 .../security/provider/SecurityProvider.java     |  35 --
 .../rest/transform/AccessTransformer.java       |  39 --
 .../rest/transform/ApplicationTransformer.java  | 116 ----
 .../transform/BrooklynFeatureTransformer.java   |  45 --
 .../rest/transform/CatalogTransformer.java      | 163 -----
 .../rest/transform/EffectorTransformer.java     |  86 ---
 .../rest/transform/EntityTransformer.java       | 155 -----
 .../transform/HighAvailabilityTransformer.java  |  50 --
 .../rest/transform/LocationTransformer.java     | 194 ------
 .../rest/transform/PolicyTransformer.java       |  84 ---
 .../rest/transform/SensorTransformer.java       |  85 ---
 .../rest/transform/TaskTransformer.java         | 147 -----
 .../rest/util/BrooklynRestResourceUtils.java    | 564 -----------------
 .../rest/util/DefaultExceptionMapper.java       | 102 ----
 .../brooklyn/rest/util/EntityLocationUtils.java |  85 ---
 .../brooklyn/rest/util/FormMapProvider.java     |  81 ---
 .../rest/util/ManagementContextProvider.java    |  33 -
 .../brooklyn/rest/util/ShutdownHandler.java     |  23 -
 .../rest/util/ShutdownHandlerProvider.java      |  30 -
 .../brooklyn/rest/util/URLParamEncoder.java     |  27 -
 .../brooklyn/rest/util/WebResourceUtils.java    | 162 -----
 .../rest/util/json/BidiSerialization.java       | 175 ------
 .../util/json/BrooklynJacksonJsonProvider.java  | 172 ------
 .../json/ConfigurableSerializerProvider.java    |  94 ---
 .../ErrorAndToStringUnknownTypeSerializer.java  | 125 ----
 .../rest/util/json/MultimapSerializer.java      |  62 --
 ...StrictPreferringFieldsVisibilityChecker.java | 107 ----
 .../apache/brooklyn/rest/BrooklynRestApi.java   |  89 +++
 .../apache/brooklyn/rest/BrooklynWebConfig.java | 155 +++++
 .../BrooklynPropertiesSecurityFilter.java       | 176 ++++++
 .../rest/filter/HaHotCheckResourceFilter.java   | 151 +++++
 .../rest/filter/HaHotStateRequired.java         |  36 ++
 .../rest/filter/HaMasterCheckFilter.java        | 140 +++++
 .../brooklyn/rest/filter/LoggingFilter.java     | 160 +++++
 .../brooklyn/rest/filter/NoCacheFilter.java     |  40 ++
 .../rest/filter/RequestTaggingFilter.java       |  62 ++
 .../resources/AbstractBrooklynRestResource.java | 153 +++++
 .../brooklyn/rest/resources/AccessResource.java |  46 ++
 .../rest/resources/ActivityResource.java        |  67 +++
 .../brooklyn/rest/resources/ApidocResource.java |  29 +
 .../rest/resources/ApplicationResource.java     | 463 ++++++++++++++
 .../rest/resources/CatalogResource.java         | 481 +++++++++++++++
 .../rest/resources/EffectorResource.java        | 115 ++++
 .../rest/resources/EntityConfigResource.java    | 153 +++++
 .../brooklyn/rest/resources/EntityResource.java | 225 +++++++
 .../rest/resources/LocationResource.java        | 185 ++++++
 .../rest/resources/PolicyConfigResource.java    | 109 ++++
 .../brooklyn/rest/resources/PolicyResource.java | 133 +++++
 .../brooklyn/rest/resources/ScriptResource.java |  99 +++
 .../brooklyn/rest/resources/SensorResource.java | 150 +++++
 .../brooklyn/rest/resources/ServerResource.java | 496 +++++++++++++++
 .../brooklyn/rest/resources/UsageResource.java  | 257 ++++++++
 .../rest/resources/VersionResource.java         |  32 +
 .../brooklyn/rest/security/PasswordHasher.java  |  32 +
 .../provider/AbstractSecurityProvider.java      |  56 ++
 .../provider/AnyoneSecurityProvider.java        |  40 ++
 .../provider/BlackholeSecurityProvider.java     |  40 ++
 ...nUserWithRandomPasswordSecurityProvider.java |  68 +++
 .../provider/DelegatingSecurityProvider.java    | 156 +++++
 .../provider/ExplicitUsersSecurityProvider.java | 103 ++++
 .../security/provider/LdapSecurityProvider.java | 131 ++++
 .../security/provider/SecurityProvider.java     |  35 ++
 .../rest/transform/AccessTransformer.java       |  39 ++
 .../rest/transform/ApplicationTransformer.java  | 116 ++++
 .../transform/BrooklynFeatureTransformer.java   |  45 ++
 .../rest/transform/CatalogTransformer.java      | 163 +++++
 .../rest/transform/EffectorTransformer.java     |  86 +++
 .../rest/transform/EntityTransformer.java       | 155 +++++
 .../transform/HighAvailabilityTransformer.java  |  50 ++
 .../rest/transform/LocationTransformer.java     | 194 ++++++
 .../rest/transform/PolicyTransformer.java       |  84 +++
 .../rest/transform/SensorTransformer.java       |  85 +++
 .../rest/transform/TaskTransformer.java         | 147 +++++
 .../rest/util/BrooklynRestResourceUtils.java    | 564 +++++++++++++++++
 .../rest/util/DefaultExceptionMapper.java       | 102 ++++
 .../brooklyn/rest/util/EntityLocationUtils.java |  85 +++
 .../brooklyn/rest/util/FormMapProvider.java     |  81 +++
 .../rest/util/ManagementContextProvider.java    |  33 +
 .../brooklyn/rest/util/ShutdownHandler.java     |  23 +
 .../rest/util/ShutdownHandlerProvider.java      |  30 +
 .../brooklyn/rest/util/URLParamEncoder.java     |  27 +
 .../brooklyn/rest/util/WebResourceUtils.java    | 162 +++++
 .../rest/util/json/BidiSerialization.java       | 175 ++++++
 .../util/json/BrooklynJacksonJsonProvider.java  | 172 ++++++
 .../json/ConfigurableSerializerProvider.java    |  94 +++
 .../ErrorAndToStringUnknownTypeSerializer.java  | 125 ++++
 .../rest/util/json/MultimapSerializer.java      |  62 ++
 ...StrictPreferringFieldsVisibilityChecker.java | 107 ++++
 .../rest-server/src/main/webapp/WEB-INF/web.xml |  40 +-
 .../config/render/TestRendererHints.java        |   2 +
 .../brooklynnode/DeployBlueprintTest.java       |  90 ---
 .../BrooklynPropertiesSecurityFilterTest.java   | 111 ----
 .../brooklyn/rest/BrooklynRestApiLauncher.java  | 433 --------------
 .../rest/BrooklynRestApiLauncherTest.java       |  76 ---
 .../BrooklynRestApiLauncherTestFixture.java     | 110 ----
 .../test/java/brooklyn/rest/HaHotCheckTest.java | 130 ----
 .../brooklyn/rest/HaMasterCheckFilterTest.java  | 219 -------
 .../brooklyn/rest/domain/ApplicationTest.java   |  94 ---
 .../rest/domain/LocationSummaryTest.java        |  55 --
 .../brooklyn/rest/domain/SensorSummaryTest.java | 102 ----
 .../rest/resources/AccessResourceTest.java      |  68 ---
 .../rest/resources/ApiDocResourceTest.java      | 138 -----
 .../ApplicationResourceIntegrationTest.java     | 134 -----
 .../rest/resources/ApplicationResourceTest.java | 598 -------------------
 .../rest/resources/CatalogResetTest.java        | 113 ----
 .../rest/resources/CatalogResourceTest.java     | 432 --------------
 .../rest/resources/DelegatingPrintStream.java   | 183 ------
 .../rest/resources/DescendantsTest.java         | 134 -----
 .../resources/EntityConfigResourceTest.java     | 173 ------
 .../rest/resources/EntityResourceTest.java      | 190 ------
 .../rest/resources/ErrorResponseTest.java       |  98 ---
 .../rest/resources/LocationResourceTest.java    | 189 ------
 .../rest/resources/PolicyResourceTest.java      | 145 -----
 .../rest/resources/ScriptResourceTest.java      |  53 --
 .../SensorResourceIntegrationTest.java          |  83 ---
 .../rest/resources/SensorResourceTest.java      | 272 ---------
 .../ServerResourceIntegrationTest.java          | 126 ----
 .../rest/resources/ServerResourceTest.java      | 176 ------
 .../rest/resources/ServerShutdownTest.java      | 187 ------
 .../rest/resources/UsageResourceTest.java       | 447 --------------
 .../rest/resources/VersionResourceTest.java     |  50 --
 .../rest/security/PasswordHasherTest.java       |  37 --
 .../security/provider/TestSecurityProvider.java |  46 --
 .../rest/testing/BrooklynRestApiTest.java       | 185 ------
 .../rest/testing/BrooklynRestResourceTest.java  | 155 -----
 .../rest/testing/mocks/CapitalizePolicy.java    |  32 -
 .../rest/testing/mocks/EverythingGroup.java     |  27 -
 .../rest/testing/mocks/EverythingGroupImpl.java |  32 -
 .../rest/testing/mocks/NameMatcherGroup.java    |  30 -
 .../testing/mocks/NameMatcherGroupImpl.java     |  33 -
 .../rest/testing/mocks/RestMockApp.java         |  24 -
 .../rest/testing/mocks/RestMockAppBuilder.java  |  39 --
 .../testing/mocks/RestMockSimpleEntity.java     | 104 ----
 .../testing/mocks/RestMockSimplePolicy.java     |  65 --
 .../util/BrooklynRestResourceUtilsTest.java     | 215 -------
 .../rest/util/EntityLocationUtilsTest.java      |  73 ---
 .../rest/util/HaHotStateCheckClassResource.java |  38 --
 .../rest/util/HaHotStateCheckResource.java      |  44 --
 .../util/NullHttpServletRequestProvider.java    |  46 --
 .../rest/util/NullServletConfigProvider.java    |  46 --
 .../brooklyn/rest/util/TestShutdownHandler.java |  39 --
 .../json/BrooklynJacksonSerializerTest.java     | 399 -------------
 .../brooklynnode/DeployBlueprintTest.java       |  92 +++
 .../BrooklynPropertiesSecurityFilterTest.java   | 111 ++++
 .../brooklyn/rest/BrooklynRestApiLauncher.java  | 433 ++++++++++++++
 .../rest/BrooklynRestApiLauncherTest.java       |  76 +++
 .../BrooklynRestApiLauncherTestFixture.java     | 110 ++++
 .../apache/brooklyn/rest/HaHotCheckTest.java    | 130 ++++
 .../brooklyn/rest/HaMasterCheckFilterTest.java  | 219 +++++++
 .../brooklyn/rest/domain/ApplicationTest.java   |  94 +++
 .../rest/domain/LocationSummaryTest.java        |  55 ++
 .../brooklyn/rest/domain/SensorSummaryTest.java | 102 ++++
 .../rest/resources/AccessResourceTest.java      |  68 +++
 .../rest/resources/ApiDocResourceTest.java      | 138 +++++
 .../ApplicationResourceIntegrationTest.java     | 134 +++++
 .../rest/resources/ApplicationResourceTest.java | 598 +++++++++++++++++++
 .../rest/resources/CatalogResetTest.java        | 113 ++++
 .../rest/resources/CatalogResourceTest.java     | 432 ++++++++++++++
 .../rest/resources/DelegatingPrintStream.java   | 183 ++++++
 .../rest/resources/DescendantsTest.java         | 134 +++++
 .../resources/EntityConfigResourceTest.java     | 173 ++++++
 .../rest/resources/EntityResourceTest.java      | 191 ++++++
 .../rest/resources/ErrorResponseTest.java       |  98 +++
 .../rest/resources/LocationResourceTest.java    | 189 ++++++
 .../rest/resources/PolicyResourceTest.java      | 145 +++++
 .../rest/resources/ScriptResourceTest.java      |  53 ++
 .../SensorResourceIntegrationTest.java          |  84 +++
 .../rest/resources/SensorResourceTest.java      | 273 +++++++++
 .../ServerResourceIntegrationTest.java          | 127 ++++
 .../rest/resources/ServerResourceTest.java      | 176 ++++++
 .../rest/resources/ServerShutdownTest.java      | 187 ++++++
 .../rest/resources/UsageResourceTest.java       | 447 ++++++++++++++
 .../rest/resources/VersionResourceTest.java     |  50 ++
 .../rest/security/PasswordHasherTest.java       |  37 ++
 .../security/provider/TestSecurityProvider.java |  46 ++
 .../rest/testing/BrooklynRestApiTest.java       | 185 ++++++
 .../rest/testing/BrooklynRestResourceTest.java  | 155 +++++
 .../rest/testing/mocks/CapitalizePolicy.java    |  32 +
 .../rest/testing/mocks/EverythingGroup.java     |  27 +
 .../rest/testing/mocks/EverythingGroupImpl.java |  32 +
 .../rest/testing/mocks/NameMatcherGroup.java    |  30 +
 .../testing/mocks/NameMatcherGroupImpl.java     |  33 +
 .../rest/testing/mocks/RestMockApp.java         |  24 +
 .../rest/testing/mocks/RestMockAppBuilder.java  |  39 ++
 .../testing/mocks/RestMockSimpleEntity.java     | 104 ++++
 .../testing/mocks/RestMockSimplePolicy.java     |  65 ++
 .../util/BrooklynRestResourceUtilsTest.java     | 215 +++++++
 .../rest/util/EntityLocationUtilsTest.java      |  73 +++
 .../rest/util/HaHotStateCheckClassResource.java |  38 ++
 .../rest/util/HaHotStateCheckResource.java      |  44 ++
 .../util/NullHttpServletRequestProvider.java    |  46 ++
 .../rest/util/NullServletConfigProvider.java    |  46 ++
 .../brooklyn/rest/util/TestShutdownHandler.java |  39 ++
 .../json/BrooklynJacksonSerializerTest.java     | 399 +++++++++++++
 .../main/java/brooklyn/rest/apidoc/Apidoc.java  |  33 -
 .../brooklyn/rest/apidoc/ApidocEndpoint.java    |  54 --
 .../apidoc/ApidocHelpMessageBodyWriter.java     |  28 -
 .../brooklyn/rest/apidoc/ApidocResource.java    | 291 ---------
 .../java/brooklyn/rest/apidoc/ApidocRoot.java   |  47 --
 .../org/apache/brooklyn/rest/apidoc/Apidoc.java |  33 +
 .../brooklyn/rest/apidoc/ApidocEndpoint.java    |  54 ++
 .../apidoc/ApidocHelpMessageBodyWriter.java     |  28 +
 .../brooklyn/rest/apidoc/ApidocResource.java    | 291 +++++++++
 .../apache/brooklyn/rest/apidoc/ApidocRoot.java |  47 ++
 375 files changed, 21333 insertions(+), 21324 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/2aac052f/usage/jsgui/src/test/java/org/apache/brooklyn/rest/jsgui/BrooklynJavascriptGuiLauncherTest.java
----------------------------------------------------------------------
diff --cc 
usage/jsgui/src/test/java/org/apache/brooklyn/rest/jsgui/BrooklynJavascriptGuiLauncherTest.java
index 799b181,aeab8fa..9538073
--- 
a/usage/jsgui/src/test/java/org/apache/brooklyn/rest/jsgui/BrooklynJavascriptGuiLauncherTest.java
+++ 
b/usage/jsgui/src/test/java/org/apache/brooklyn/rest/jsgui/BrooklynJavascriptGuiLauncherTest.java
@@@ -27,8 -26,9 +27,8 @@@ import org.testng.annotations.Test
  import brooklyn.config.BrooklynServiceAttributes;
  import brooklyn.entity.basic.Entities;
  import brooklyn.management.ManagementContext;
- import brooklyn.rest.BrooklynRestApiLauncherTestFixture;
+ import org.apache.brooklyn.rest.BrooklynRestApiLauncherTestFixture;
  import brooklyn.test.Asserts;
 -import brooklyn.test.HttpTestUtils;
  
  /** Convenience and demo for launching programmatically. */
  public class BrooklynJavascriptGuiLauncherTest {

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/2aac052f/usage/launcher/src/test/java/org/apache/brooklyn/entity/brooklynnode/BrooklynEntityMirrorIntegrationTest.java
----------------------------------------------------------------------
diff --cc 
usage/launcher/src/test/java/org/apache/brooklyn/entity/brooklynnode/BrooklynEntityMirrorIntegrationTest.java
index d66dc53,b0ba2e7..d4787ff
--- 
a/usage/launcher/src/test/java/org/apache/brooklyn/entity/brooklynnode/BrooklynEntityMirrorIntegrationTest.java
+++ 
b/usage/launcher/src/test/java/org/apache/brooklyn/entity/brooklynnode/BrooklynEntityMirrorIntegrationTest.java
@@@ -39,8 -37,10 +39,8 @@@ import brooklyn.entity.proxying.EntityS
  import org.apache.brooklyn.launcher.BrooklynWebServer;
  import brooklyn.management.ManagementContext;
  import brooklyn.management.ha.HighAvailabilityMode;
- import brooklyn.rest.filter.BrooklynPropertiesSecurityFilter;
+ import org.apache.brooklyn.rest.filter.BrooklynPropertiesSecurityFilter;
  import brooklyn.test.Asserts;
 -import brooklyn.test.EntityTestUtils;
 -import brooklyn.test.HttpTestUtils;
  import brooklyn.test.entity.LocalManagementContextForTests;
  import brooklyn.test.entity.TestApplication;
  import brooklyn.util.exceptions.Exceptions;

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/2aac052f/usage/launcher/src/test/java/org/apache/brooklyn/launcher/WebAppRunnerTest.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/2aac052f/usage/rest-client/src/test/java/org/apache/brooklyn/rest/client/BrooklynApiRestClientTest.java
----------------------------------------------------------------------
diff --cc 
usage/rest-client/src/test/java/org/apache/brooklyn/rest/client/BrooklynApiRestClientTest.java
index d3586af,f23d721..9c23546
--- 
a/usage/rest-client/src/test/java/org/apache/brooklyn/rest/client/BrooklynApiRestClientTest.java
+++ 
b/usage/rest-client/src/test/java/org/apache/brooklyn/rest/client/BrooklynApiRestClientTest.java
@@@ -38,11 -37,12 +38,12 @@@ import brooklyn.entity.basic.StartableA
  import brooklyn.location.basic.BasicLocationRegistry;
  import brooklyn.management.ManagementContext;
  import brooklyn.management.internal.LocalManagementContext;
- import brooklyn.rest.BrooklynRestApiLauncher;
- import brooklyn.rest.BrooklynRestApiLauncherTest;
- import brooklyn.rest.domain.ApplicationSummary;
- import brooklyn.rest.domain.CatalogLocationSummary;
- import brooklyn.rest.security.provider.TestSecurityProvider;
+ import org.apache.brooklyn.rest.BrooklynRestApiLauncher;
+ import org.apache.brooklyn.rest.BrooklynRestApiLauncherTest;
+ import org.apache.brooklyn.rest.domain.ApplicationSummary;
+ import org.apache.brooklyn.rest.domain.CatalogLocationSummary;
+ import org.apache.brooklyn.rest.security.provider.TestSecurityProvider;
 -import brooklyn.test.HttpTestUtils;
++import org.apache.brooklyn.test.HttpTestUtils;
  import brooklyn.test.entity.TestEntity;
  
  @Test

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/2aac052f/usage/rest-server/src/test/java/org/apache/brooklyn/entity/brooklynnode/DeployBlueprintTest.java
----------------------------------------------------------------------
diff --cc 
usage/rest-server/src/test/java/org/apache/brooklyn/entity/brooklynnode/DeployBlueprintTest.java
index 0000000,6195ab0..68d8e9a
mode 000000,100644..100644
--- 
a/usage/rest-server/src/test/java/org/apache/brooklyn/entity/brooklynnode/DeployBlueprintTest.java
+++ 
b/usage/rest-server/src/test/java/org/apache/brooklyn/entity/brooklynnode/DeployBlueprintTest.java
@@@ -1,0 -1,91 +1,92 @@@
+ /*
+  * 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.entity.brooklynnode;
+ 
+ import static org.testng.Assert.assertEquals;
+ 
+ import java.net.URI;
+ import java.util.List;
+ import java.util.Map;
+ 
++import org.apache.brooklyn.test.HttpTestUtils;
+ import org.eclipse.jetty.server.Server;
+ import org.slf4j.Logger;
+ import org.slf4j.LoggerFactory;
+ import org.testng.annotations.BeforeMethod;
+ import org.testng.annotations.Test;
+ 
+ import brooklyn.entity.basic.BasicApplication;
+ import brooklyn.entity.basic.EntityLocal;
+ import brooklyn.entity.brooklynnode.BrooklynNode;
+ import brooklyn.entity.brooklynnode.BrooklynNode.DeployBlueprintEffector;
+ import brooklyn.entity.proxying.EntitySpec;
+ import brooklyn.event.feed.http.JsonFunctions;
+ import brooklyn.management.EntityManager;
+ import org.apache.brooklyn.rest.BrooklynRestApiLauncherTestFixture;
 -import brooklyn.test.HttpTestUtils;
++import org.apache.brooklyn.test.HttpTestUtils;
+ import brooklyn.util.guava.Functionals;
+ 
+ import com.google.common.base.Function;
+ import com.google.common.collect.ImmutableList;
+ import com.google.common.collect.ImmutableMap;
+ 
+ public class DeployBlueprintTest extends BrooklynRestApiLauncherTestFixture {
+ 
+     private static final Logger log = 
LoggerFactory.getLogger(DeployBlueprintTest.class);
+ 
+     Server server;
+ 
+     @BeforeMethod(alwaysRun=true)
+     public void setUp() throws Exception {
+         server = newServer();
+         useServerForTest(server);
+     }
+ 
+     @Test
+     public void testStartsAppViaEffector() throws Exception {
+         URI webConsoleUri = URI.create(getBaseUri());
+ 
+         EntitySpec<BrooklynNode> spec = EntitySpec.create(BrooklynNode.class);
+         EntityManager mgr = 
getManagementContextFromJettyServerAttributes(server).getEntityManager();
+         BrooklynNode node = mgr.createEntity(spec);
+         ((EntityLocal)node).setAttribute(BrooklynNode.WEB_CONSOLE_URI, 
webConsoleUri);
+         mgr.manage(node);
+         Map<String, String> params = 
ImmutableMap.of(DeployBlueprintEffector.BLUEPRINT_CAMP_PLAN.getName(), "{ 
services: [ serviceType: \"java:"+BasicApplication.class.getName()+"\" ] }");
+         String id = node.invoke(BrooklynNode.DEPLOY_BLUEPRINT, 
params).getUnchecked();
+ 
+         log.info("got: "+id);
+ 
+         String apps = 
HttpTestUtils.getContent(webConsoleUri.toString()+"/v1/applications");
+         List<String> appType = parseJsonList(apps, ImmutableList.of("spec", 
"type"), String.class);
+         assertEquals(appType, 
ImmutableList.of(BasicApplication.class.getName()));
+         
+         String status = 
HttpTestUtils.getContent(webConsoleUri.toString()+"/v1/applications/"+id+"/entities/"+id+"/sensors/service.status");
+         log.info("STATUS: "+status);
+     }
+     
+     private <T> List<T> parseJsonList(String json, List<String> elements, 
Class<T> clazz) {
+         Function<String, List<T>> func = Functionals.chain(
+                 JsonFunctions.asJson(),
+                 JsonFunctions.forEach(Functionals.chain(
+                         JsonFunctions.walk(elements),
+                         JsonFunctions.cast(clazz))));
+         return func.apply(json);
+     }
+ 
+ }

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/2aac052f/usage/rest-server/src/test/java/org/apache/brooklyn/rest/BrooklynRestApiLauncherTest.java
----------------------------------------------------------------------
diff --cc 
usage/rest-server/src/test/java/org/apache/brooklyn/rest/BrooklynRestApiLauncherTest.java
index 0000000,34ea94d..ead95ba
mode 000000,100644..100644
--- 
a/usage/rest-server/src/test/java/org/apache/brooklyn/rest/BrooklynRestApiLauncherTest.java
+++ 
b/usage/rest-server/src/test/java/org/apache/brooklyn/rest/BrooklynRestApiLauncherTest.java
@@@ -1,0 -1,76 +1,76 @@@
+ /*
+  * 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;
+ 
+ import static 
org.apache.brooklyn.rest.BrooklynRestApiLauncher.StartMode.FILTER;
+ import static 
org.apache.brooklyn.rest.BrooklynRestApiLauncher.StartMode.SERVLET;
+ import static 
org.apache.brooklyn.rest.BrooklynRestApiLauncher.StartMode.WEB_XML;
+ 
+ import java.util.concurrent.Callable;
+ 
++import org.apache.brooklyn.test.HttpTestUtils;
+ import org.apache.http.HttpStatus;
+ import org.eclipse.jetty.server.Server;
+ import org.testng.annotations.Test;
+ 
+ import org.apache.brooklyn.rest.security.provider.AnyoneSecurityProvider;
+ import 
org.apache.brooklyn.rest.util.BrooklynRestResourceUtilsTest.SampleNoOpApplication;
+ import brooklyn.test.Asserts;
 -import brooklyn.test.HttpTestUtils;
+ 
+ public class BrooklynRestApiLauncherTest extends 
BrooklynRestApiLauncherTestFixture {
+ 
+     @Test
+     public void testFilterStart() throws Exception {
+         
checkRestCatalogApplications(useServerForTest(baseLauncher().mode(FILTER).start()));
+     }
+ 
+     @Test
+     public void testServletStart() throws Exception {
+         
checkRestCatalogApplications(useServerForTest(baseLauncher().mode(SERVLET).start()));
+     }
+ 
+     @Test
+     public void testWebAppStart() throws Exception {
+         
checkRestCatalogApplications(useServerForTest(baseLauncher().mode(WEB_XML).start()));
+     }
+ 
+     private BrooklynRestApiLauncher baseLauncher() {
+         return BrooklynRestApiLauncher.launcher()
+                 .securityProvider(AnyoneSecurityProvider.class)
+                 .forceUseOfDefaultCatalogWithJavaClassPath(true);
+     }
+     
+     private static void checkRestCatalogApplications(Server server) throws 
Exception {
+         final String rootUrl = 
"http://localhost:"+server.getConnectors()[0].getLocalPort();
+         int code = Asserts.succeedsEventually(new Callable<Integer>() {
+             @Override
+             public Integer call() throws Exception {
+                 int code = 
HttpTestUtils.getHttpStatusCode(rootUrl+"/v1/catalog/applications");
+                 if (code == HttpStatus.SC_FORBIDDEN) {
+                     throw new RuntimeException("Retry request");
+                 } else {
+                     return code;
+                 }
+             }
+         });
+         HttpTestUtils.assertHealthyStatusCode(code);
+         
HttpTestUtils.assertContentContainsText(rootUrl+"/v1/catalog/applications", 
SampleNoOpApplication.class.getSimpleName());
+     }
+     
+ }

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/2aac052f/usage/rest-server/src/test/java/org/apache/brooklyn/rest/resources/ApplicationResourceTest.java
----------------------------------------------------------------------
diff --cc 
usage/rest-server/src/test/java/org/apache/brooklyn/rest/resources/ApplicationResourceTest.java
index 0000000,c72339b..9d05dea
mode 000000,100644..100644
--- 
a/usage/rest-server/src/test/java/org/apache/brooklyn/rest/resources/ApplicationResourceTest.java
+++ 
b/usage/rest-server/src/test/java/org/apache/brooklyn/rest/resources/ApplicationResourceTest.java
@@@ -1,0 -1,598 +1,598 @@@
+ /*
+  * 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.resources;
+ 
+ import static com.google.common.collect.Iterables.find;
+ import static org.testng.Assert.assertEquals;
+ import static org.testng.Assert.assertNotNull;
+ import static org.testng.Assert.assertTrue;
+ 
+ import java.io.IOException;
+ import java.net.URI;
+ import java.util.Collection;
+ import java.util.Map;
+ import java.util.Set;
+ import java.util.concurrent.TimeoutException;
+ 
+ import javax.ws.rs.core.MediaType;
+ import javax.ws.rs.core.MultivaluedMap;
+ import javax.ws.rs.core.Response;
+ 
++import org.apache.brooklyn.test.HttpTestUtils;
+ import org.slf4j.Logger;
+ import org.slf4j.LoggerFactory;
+ import org.testng.Assert;
+ import org.testng.annotations.Test;
+ 
+ import com.google.common.base.Predicate;
+ import com.google.common.base.Predicates;
+ import com.google.common.collect.ImmutableMap;
+ import com.google.common.collect.ImmutableSet;
+ import com.google.common.collect.Iterables;
+ import com.google.common.collect.Maps;
+ import com.sun.jersey.api.client.ClientResponse;
+ import com.sun.jersey.api.client.GenericType;
+ import com.sun.jersey.api.client.UniformInterfaceException;
+ import com.sun.jersey.api.client.WebResource;
+ import com.sun.jersey.core.util.MultivaluedMapImpl;
+ 
+ import brooklyn.entity.Application;
+ import brooklyn.entity.basic.Attributes;
+ import brooklyn.entity.basic.BasicApplication;
+ import brooklyn.entity.basic.BasicEntity;
+ import brooklyn.entity.basic.Entities;
+ import brooklyn.entity.basic.EntityFunctions;
+ import brooklyn.entity.basic.EntityLocal;
+ import brooklyn.entity.basic.EntityPredicates;
+ import brooklyn.entity.basic.Lifecycle;
+ import brooklyn.location.basic.AbstractLocation;
+ import brooklyn.location.basic.LocationConfigKeys;
+ import brooklyn.location.basic.LocationInternal;
+ import brooklyn.location.geo.HostGeoInfo;
+ import org.apache.brooklyn.rest.domain.ApiError;
+ import org.apache.brooklyn.rest.domain.ApplicationSpec;
+ import org.apache.brooklyn.rest.domain.ApplicationSummary;
+ import org.apache.brooklyn.rest.domain.EffectorSummary;
+ import org.apache.brooklyn.rest.domain.EntityConfigSummary;
+ import org.apache.brooklyn.rest.domain.EntitySpec;
+ import org.apache.brooklyn.rest.domain.EntitySummary;
+ import org.apache.brooklyn.rest.domain.PolicySummary;
+ import org.apache.brooklyn.rest.domain.SensorSummary;
+ import org.apache.brooklyn.rest.domain.Status;
+ import org.apache.brooklyn.rest.domain.TaskSummary;
+ import org.apache.brooklyn.rest.testing.BrooklynRestResourceTest;
+ import org.apache.brooklyn.rest.testing.mocks.CapitalizePolicy;
+ import org.apache.brooklyn.rest.testing.mocks.NameMatcherGroup;
+ import org.apache.brooklyn.rest.testing.mocks.RestMockApp;
+ import org.apache.brooklyn.rest.testing.mocks.RestMockAppBuilder;
+ import org.apache.brooklyn.rest.testing.mocks.RestMockSimpleEntity;
+ import brooklyn.test.Asserts;
 -import brooklyn.test.HttpTestUtils;
+ import brooklyn.util.collections.CollectionFunctionals;
+ import brooklyn.util.exceptions.Exceptions;
+ import brooklyn.util.time.Duration;
+ 
+ @Test(singleThreaded = true)
+ public class ApplicationResourceTest extends BrooklynRestResourceTest {
+ 
+     /*
+      * In simpleSpec, not using EverythingGroup because caused problems! The 
group is a child of the
+      * app, and the app is a member of the group. It failed in jenkins with:
+      *   BasicApplicationImpl{id=GSPjBCe4} GSPjBCe4
+      *     service.isUp: true
+      *     service.problems: 
{service-lifecycle-indicators-from-children-and-members=Required entity not 
healthy: EverythingGroupImpl{id=KQ4mSEOJ}}
+      *     service.state: on-fire
+      *     service.state.expected: running @ 1412003485617 / Mon Sep 29 
15:11:25 UTC 2014
+      *   EverythingGroupImpl{id=KQ4mSEOJ} KQ4mSEOJ
+      *     service.isUp: true
+      *     service.problems: 
{service-lifecycle-indicators-from-children-and-members=Required entities not 
healthy: BasicApplicationImpl{id=GSPjBCe4}, EverythingGroupImpl{id=KQ4mSEOJ}}
+      *     service.state: on-fire
+      * I'm guessing there's a race: the app was not yet healthy because 
EverythingGroup hadn't set itself to running; 
+      * but then the EverythingGroup would never transition to healthy because 
one of its members was not healthy.
+      */
+ 
+     private static final Logger log = 
LoggerFactory.getLogger(ApplicationResourceTest.class);
+     
+     private final ApplicationSpec simpleSpec = 
ApplicationSpec.builder().name("simple-app")
+           .entities(ImmutableSet.of(
+                   new EntitySpec("simple-ent", 
RestMockSimpleEntity.class.getName()),
+                   new EntitySpec("simple-group", 
NameMatcherGroup.class.getName(), ImmutableMap.of("namematchergroup.regex", 
"simple-ent"))
+           ))
+           .locations(ImmutableSet.of("localhost"))
+           .build();
+ 
+     // Convenience for finding an EntitySummary within a collection, based on 
its name
+     private static Predicate<EntitySummary> withName(final String name) {
+         return new Predicate<EntitySummary>() {
+             public boolean apply(EntitySummary input) {
+                 return name.equals(input.getName());
+             }
+         };
+     }
+ 
+     // Convenience for finding a Map within a collection, based on the value 
of one of its keys
+     private static Predicate<? super Map<?,?>> withValueForKey(final Object 
key, final Object value) {
+         return new Predicate<Object>() {
+             public boolean apply(Object input) {
+                 if (!(input instanceof Map)) return false;
+                 return value.equals(((Map<?, ?>) input).get(key));
+             }
+         };
+     }
+ 
+     @Test
+     public void testGetUndefinedApplication() {
+         try {
+             
client().resource("/v1/applications/dummy-not-found").get(ApplicationSummary.class);
+         } catch (UniformInterfaceException e) {
+             assertEquals(e.getResponse().getStatus(), 404);
+         }
+     }
+ 
+     private static void assertRegexMatches(String actual, String 
patternExpected) {
+         if (actual==null) Assert.fail("Actual value is null; expected 
"+patternExpected);
+         if (!actual.matches(patternExpected)) {
+             Assert.fail("Text '"+actual+"' does not match expected pattern 
"+patternExpected);
+         }
+     }
+ 
+     @Test
+     public void testDeployApplication() throws Exception {
+         ClientResponse response = clientDeploy(simpleSpec);
+ 
+         HttpTestUtils.assertHealthyStatusCode(response.getStatus());
+         assertEquals(getManagementContext().getApplications().size(), 1);
+         assertRegexMatches(response.getLocation().getPath(), 
"/v1/applications/.*");
+         // Object taskO = response.getEntity(Object.class);
+         TaskSummary task = response.getEntity(TaskSummary.class);
+         log.info("deployed, got " + task);
+         assertEquals(task.getEntityId(), 
getManagementContext().getApplications().iterator().next().getApplicationId());
+ 
+         waitForApplicationToBeRunning(response.getLocation());
+     }
+ 
+     @Test(dependsOnMethods = { "testDeleteApplication" })
+     // this must happen after we've deleted the main application, as 
testLocatedLocations assumes a single location
+     public void testDeployApplicationImpl() throws Exception {
+     ApplicationSpec spec = ApplicationSpec.builder()
+             .type(RestMockApp.class.getCanonicalName())
+             .name("simple-app-impl")
+             .locations(ImmutableSet.of("localhost"))
+             .build();
+ 
+         ClientResponse response = clientDeploy(spec);
+         assertTrue(response.getStatus() / 100 == 2, "response is " + 
response);
+ 
+         // Expect app to be running
+         URI appUri = response.getLocation();
+         waitForApplicationToBeRunning(response.getLocation());
+         
assertEquals(client().resource(appUri).get(ApplicationSummary.class).getSpec().getName(),
 "simple-app-impl");
+     }
+ 
+     @Test(dependsOnMethods = { "testDeployApplication", "testLocatedLocation" 
})
+     public void testDeployApplicationFromInterface() throws Exception {
+         ApplicationSpec spec = ApplicationSpec.builder()
+                 .type(BasicApplication.class.getCanonicalName())
+                 .name("simple-app-interface")
+                 .locations(ImmutableSet.of("localhost"))
+                 .build();
+ 
+         ClientResponse response = clientDeploy(spec);
+         assertTrue(response.getStatus() / 100 == 2, "response is " + 
response);
+ 
+         // Expect app to be running
+         URI appUri = response.getLocation();
+         waitForApplicationToBeRunning(response.getLocation());
+         
assertEquals(client().resource(appUri).get(ApplicationSummary.class).getSpec().getName(),
 "simple-app-interface");
+     }
+ 
+     @Test(dependsOnMethods = { "testDeployApplication", "testLocatedLocation" 
})
+     public void testDeployApplicationFromBuilder() throws Exception {
+         ApplicationSpec spec = ApplicationSpec.builder()
+                 .type(RestMockAppBuilder.class.getCanonicalName())
+                 .name("simple-app-builder")
+                 .locations(ImmutableSet.of("localhost"))
+                 .build();
+ 
+         ClientResponse response = clientDeploy(spec);
+         assertTrue(response.getStatus() / 100 == 2, "response is " + 
response);
+ 
+         // Expect app to be running
+         URI appUri = response.getLocation();
+         waitForApplicationToBeRunning(response.getLocation(), 
Duration.TEN_SECONDS);
+         
assertEquals(client().resource(appUri).get(ApplicationSummary.class).getSpec().getName(),
 "simple-app-builder");
+ 
+         // Expect app to have the child-entity
+         Set<EntitySummary> entities = client().resource(appUri.toString() + 
"/entities")
+                 .get(new GenericType<Set<EntitySummary>>() {});
+         assertEquals(entities.size(), 1);
+         assertEquals(Iterables.getOnlyElement(entities).getName(), "child1");
+         assertEquals(Iterables.getOnlyElement(entities).getType(), 
RestMockSimpleEntity.class.getCanonicalName());
+     }
+ 
+     @Test(dependsOnMethods = { "testDeployApplication", "testLocatedLocation" 
})
+     public void testDeployApplicationYaml() throws Exception {
+         String yaml = "{ name: simple-app-yaml, location: localhost, 
services: [ { serviceType: "+BasicApplication.class.getCanonicalName()+" } ] }";
+ 
+         ClientResponse response = client().resource("/v1/applications")
+                 .entity(yaml, "application/x-yaml")
+                 .post(ClientResponse.class);
+         assertTrue(response.getStatus()/100 == 2, "response is "+response);
+ 
+         // Expect app to be running
+         URI appUri = response.getLocation();
+         waitForApplicationToBeRunning(response.getLocation());
+         
assertEquals(client().resource(appUri).get(ApplicationSummary.class).getSpec().getName(),
 "simple-app-yaml");
+     }
+ 
+     @SuppressWarnings("deprecation")
+     @Test
+     public void testReferenceCatalogEntity() throws Exception {
+         getManagementContext().getCatalog().addItem(BasicEntity.class);
+ 
+         String yaml = "{ name: simple-app-yaml, location: localhost, 
services: [ { serviceType: " + BasicEntity.class.getName() + " } ] }";
+ 
+         ClientResponse response = client().resource("/v1/applications")
+                 .entity(yaml, "application/x-yaml")
+                 .post(ClientResponse.class);
+         assertTrue(response.getStatus()/100 == 2, "response is "+response);
+ 
+         // Expect app to be running
+         URI appUri = response.getLocation();
+         waitForApplicationToBeRunning(response.getLocation());
+         
assertEquals(client().resource(appUri).get(ApplicationSummary.class).getSpec().getName(),
 "simple-app-yaml");
+ 
+         ClientResponse response2 = client().resource(appUri.getPath())
+                 .delete(ClientResponse.class);
+         assertEquals(response2.getStatus(), 
Response.Status.ACCEPTED.getStatusCode());
+     }
+ 
+     @Test
+     public void testDeployWithInvalidEntityType() {
+         try {
+             clientDeploy(ApplicationSpec.builder()
+                     .name("invalid-app")
+                     .entities(ImmutableSet.of(new EntitySpec("invalid-ent", 
"not.existing.entity")))
+                     .locations(ImmutableSet.of("localhost"))
+                     .build());
+ 
+         } catch (UniformInterfaceException e) {
+             ApiError error = e.getResponse().getEntity(ApiError.class);
+             assertEquals(error.getMessage(), "Undefined type 
'not.existing.entity'");
+         }
+     }
+ 
+     @Test
+     public void testDeployWithInvalidLocation() {
+         try {
+             clientDeploy(ApplicationSpec.builder()
+                     .name("invalid-app")
+                     .entities(ImmutableSet.of(new EntitySpec("simple-ent", 
RestMockSimpleEntity.class.getName())))
+                     .locations(ImmutableSet.of("3423"))
+                     .build());
+ 
+         } catch (UniformInterfaceException e) {
+             ApiError error = e.getResponse().getEntity(ApiError.class);
+             assertEquals(error.getMessage(), "Undefined location '3423'");
+         }
+     }
+ 
+     @Test(dependsOnMethods = "testDeployApplication")
+     public void testListEntities() {
+         Set<EntitySummary> entities = 
client().resource("/v1/applications/simple-app/entities")
+                 .get(new GenericType<Set<EntitySummary>>() {});
+ 
+         assertEquals(entities.size(), 2);
+ 
+         EntitySummary entity = Iterables.find(entities, 
withName("simple-ent"), null);
+         EntitySummary group = Iterables.find(entities, 
withName("simple-group"), null);
+         Assert.assertNotNull(entity);
+         Assert.assertNotNull(group);
+ 
+         
client().resource(entity.getLinks().get("self")).get(ClientResponse.class);
+ 
+         Set<EntitySummary> children = 
client().resource(entity.getLinks().get("children"))
+                 .get(new GenericType<Set<EntitySummary>>() {});
+         assertEquals(children.size(), 0);
+     }
+ 
+     @Test(dependsOnMethods = "testDeployApplication")
+     public void testListApplications() {
+         Set<ApplicationSummary> applications = 
client().resource("/v1/applications")
+                 .get(new GenericType<Set<ApplicationSummary>>() { });
+         log.info("Applications listed are: " + applications);
+         for (ApplicationSummary app : applications) {
+             if (simpleSpec.getName().equals(app.getSpec().getName())) return;
+         }
+         Assert.fail("simple-app not found in list of applications: 
"+applications);
+     }
+ 
+     @Test(dependsOnMethods = "testDeployApplication")
+     public void testGetApplicationOnFire() {
+         Application app = Iterables.find(manager.getApplications(), 
EntityPredicates.displayNameEqualTo(simpleSpec.getName()));
+         Lifecycle origState = 
app.getAttribute(Attributes.SERVICE_STATE_ACTUAL);
+         
+         ApplicationSummary summary = 
client().resource("/v1/applications/"+app.getId())
+                 .get(ApplicationSummary.class);
+         assertEquals(summary.getStatus(), Status.RUNNING);
+ 
+         ((EntityLocal)app).setAttribute(Attributes.SERVICE_STATE_ACTUAL, 
Lifecycle.ON_FIRE);
+         try {
+             ApplicationSummary summary2 = 
client().resource("/v1/applications/"+app.getId())
+                     .get(ApplicationSummary.class);
+             log.info("Application: " + summary2);
+             assertEquals(summary2.getStatus(), Status.ERROR);
+             
+         } finally {
+             ((EntityLocal)app).setAttribute(Attributes.SERVICE_STATE_ACTUAL, 
origState);
+         }
+     }
+ 
+     @SuppressWarnings({ "rawtypes", "unchecked" })
+     @Test(dependsOnMethods = "testDeployApplication")
+     public void testFetchApplicationsAndEntity() {
+         Collection apps = 
client().resource("/v1/applications/fetch").get(Collection.class);
+         log.info("Applications fetched are: " + apps);
+ 
+         Map app = null;
+         for (Object appI : apps) {
+             Object name = ((Map) appI).get("name");
+             if ("simple-app".equals(name)) {
+                 app = (Map) appI;
+             }
+             if (ImmutableSet.of("simple-ent", "simple-group").contains(name))
+                 Assert.fail(name + " should not be listed at high level: " + 
apps);
+         }
+ 
+         Assert.assertNotNull(app);
+         Collection children = (Collection) app.get("children");
+         Assert.assertEquals(children.size(), 2);
+ 
+         Map entitySummary = (Map) Iterables.find(children, 
withValueForKey("name", "simple-ent"), null);
+         Map groupSummary = (Map) Iterables.find(children, 
withValueForKey("name", "simple-group"), null);
+         Assert.assertNotNull(entitySummary);
+         Assert.assertNotNull(groupSummary);
+ 
+         String itemIds = app.get("id") + "," + entitySummary.get("id") + "," 
+ groupSummary.get("id");
+         Collection entities = 
client().resource("/v1/applications/fetch?items="+itemIds)
+                 .get(Collection.class);
+         log.info("Applications+Entities fetched are: " + entities);
+ 
+         Assert.assertEquals(entities.size(), apps.size() + 2);
+         Map entityDetails = (Map) Iterables.find(entities, 
withValueForKey("name", "simple-ent"), null);
+         Map groupDetails = (Map) Iterables.find(entities, 
withValueForKey("name", "simple-group"), null);
+         Assert.assertNotNull(entityDetails);
+         Assert.assertNotNull(groupDetails);
+ 
+         Assert.assertEquals(entityDetails.get("parentId"), app.get("id"));
+         Assert.assertNull(entityDetails.get("children"));
+         Assert.assertEquals(groupDetails.get("parentId"), app.get("id"));
+         Assert.assertNull(groupDetails.get("children"));
+ 
+         Collection entityGroupIds = (Collection) 
entityDetails.get("groupIds");
+         Assert.assertNotNull(entityGroupIds);
+         Assert.assertEquals(entityGroupIds.size(), 1);
+         Assert.assertEquals(entityGroupIds.iterator().next(), 
groupDetails.get("id"));
+ 
+         Collection groupMembers = (Collection) groupDetails.get("members");
+         Assert.assertNotNull(groupMembers);
+ 
+         for (Application appi : getManagementContext().getApplications()) {
+             Entities.dumpInfo(appi);
+         }
+         log.info("MEMBERS: " + groupMembers);
+ 
+         Assert.assertEquals(groupMembers.size(), 1);
+         Map entityMemberDetails = (Map) Iterables.find(groupMembers, 
withValueForKey("name", "simple-ent"), null);
+         Assert.assertNotNull(entityMemberDetails);
+         Assert.assertEquals(entityMemberDetails.get("id"), 
entityDetails.get("id"));
+     }
+ 
+     @Test(dependsOnMethods = "testDeployApplication")
+     public void testListSensors() {
+         Set<SensorSummary> sensors = 
client().resource("/v1/applications/simple-app/entities/simple-ent/sensors")
+                 .get(new GenericType<Set<SensorSummary>>() { });
+         assertTrue(sensors.size() > 0);
+         SensorSummary sample = Iterables.find(sensors, new 
Predicate<SensorSummary>() {
+             @Override
+             public boolean apply(SensorSummary sensorSummary) {
+                 return 
sensorSummary.getName().equals(RestMockSimpleEntity.SAMPLE_SENSOR.getName());
+             }
+         });
+         assertEquals(sample.getType(), "java.lang.String");
+     }
+ 
+     @Test(dependsOnMethods = "testDeployApplication")
+     public void testListConfig() {
+         Set<EntityConfigSummary> config = 
client().resource("/v1/applications/simple-app/entities/simple-ent/config")
+                 .get(new GenericType<Set<EntityConfigSummary>>() { });
+         assertTrue(config.size() > 0);
+         System.out.println(("CONFIG: " + config));
+     }
+ 
+     @Test(dependsOnMethods = "testListConfig")
+     public void testListConfig2() {
+         Set<EntityConfigSummary> config = 
client().resource("/v1/applications/simple-app/entities/simple-ent/config")
+                 .get(new GenericType<Set<EntityConfigSummary>>() {});
+         assertTrue(config.size() > 0);
+         System.out.println(("CONFIG: " + config));
+     }
+ 
+     @Test(dependsOnMethods = "testDeployApplication")
+     public void testListEffectors() {
+         Set<EffectorSummary> effectors = 
client().resource("/v1/applications/simple-app/entities/simple-ent/effectors")
+                 .get(new GenericType<Set<EffectorSummary>>() {});
+ 
+         assertTrue(effectors.size() > 0);
+ 
+         EffectorSummary sampleEffector = find(effectors, new 
Predicate<EffectorSummary>() {
+             @Override
+             public boolean apply(EffectorSummary input) {
+                 return input.getName().equals("sampleEffector");
+             }
+         });
+         assertEquals(sampleEffector.getReturnType(), "java.lang.String");
+     }
+ 
+     @Test(dependsOnMethods = "testListSensors")
+     public void testTriggerSampleEffector() throws InterruptedException, 
IOException {
+         ClientResponse response = client()
+                 
.resource("/v1/applications/simple-app/entities/simple-ent/effectors/"+RestMockSimpleEntity.SAMPLE_EFFECTOR.getName())
+                 .type(MediaType.APPLICATION_JSON_TYPE)
+                 .post(ClientResponse.class, ImmutableMap.of("param1", "foo", 
"param2", 4));
+ 
+         assertEquals(response.getStatus(), 
Response.Status.ACCEPTED.getStatusCode());
+ 
+         String result = response.getEntity(String.class);
+         assertEquals(result, "foo4");
+     }
+ 
+     @Test(dependsOnMethods = "testListSensors")
+     public void testTriggerSampleEffectorWithFormData() throws 
InterruptedException, IOException {
+         MultivaluedMap<String, String> data = new MultivaluedMapImpl();
+         data.add("param1", "foo");
+         data.add("param2", "4");
+         ClientResponse response = client()
+                 
.resource("/v1/applications/simple-app/entities/simple-ent/effectors/"+RestMockSimpleEntity.SAMPLE_EFFECTOR.getName())
+                 .type(MediaType.APPLICATION_FORM_URLENCODED_TYPE)
+                 .post(ClientResponse.class, data);
+ 
+         assertEquals(response.getStatus(), 
Response.Status.ACCEPTED.getStatusCode());
+ 
+         String result = response.getEntity(String.class);
+         assertEquals(result, "foo4");
+     }
+ 
+     @Test(dependsOnMethods = "testTriggerSampleEffector")
+     public void testBatchSensorValues() {
+         WebResource resource = 
client().resource("/v1/applications/simple-app/entities/simple-ent/sensors/current-state");
+         Map<String, Object> sensors = resource.get(new 
GenericType<Map<String, Object>>() {});
+         assertTrue(sensors.size() > 0);
+         
assertEquals(sensors.get(RestMockSimpleEntity.SAMPLE_SENSOR.getName()), "foo4");
+     }
+ 
+     @Test(dependsOnMethods = "testBatchSensorValues")
+     public void testReadEachSensor() {
+     Set<SensorSummary> sensors = 
client().resource("/v1/applications/simple-app/entities/simple-ent/sensors")
+             .get(new GenericType<Set<SensorSummary>>() {});
+ 
+         Map<String, String> readings = Maps.newHashMap();
+         for (SensorSummary sensor : sensors) {
+             try {
+                 readings.put(sensor.getName(), 
client().resource(sensor.getLinks().get("self")).accept(MediaType.TEXT_PLAIN).get(String.class));
+             } catch (UniformInterfaceException uie) {
+                 if (uie.getResponse().getStatus() == 204) { // no content
+                     readings.put(sensor.getName(), null);
+                 } else {
+                     Exceptions.propagate(uie);
+                 }
+             }
+         }
+ 
+         
assertEquals(readings.get(RestMockSimpleEntity.SAMPLE_SENSOR.getName()), 
"foo4");
+     }
+ 
+     @Test(dependsOnMethods = "testTriggerSampleEffector")
+     public void testPolicyWhichCapitalizes() {
+         String policiesEndpoint = 
"/v1/applications/simple-app/entities/simple-ent/policies";
+         Set<PolicySummary> policies = 
client().resource(policiesEndpoint).get(new 
GenericType<Set<PolicySummary>>(){});
+         assertEquals(policies.size(), 0);
+ 
+         ClientResponse response = client().resource(policiesEndpoint)
+                 .queryParam("type", CapitalizePolicy.class.getCanonicalName())
+                 .type(MediaType.APPLICATION_JSON_TYPE)
+                 .post(ClientResponse.class, Maps.newHashMap());
+         assertEquals(response.getStatus(), 200);
+         PolicySummary policy = response.getEntity(PolicySummary.class);
+         assertNotNull(policy.getId());
+         String newPolicyId = policy.getId();
+         log.info("POLICY CREATED: " + newPolicyId);
+         policies = client().resource(policiesEndpoint).get(new 
GenericType<Set<PolicySummary>>() {});
+         assertEquals(policies.size(), 1);
+ 
+         Lifecycle status = client().resource(policiesEndpoint + "/" + 
newPolicyId).get(Lifecycle.class);
+         log.info("POLICY STATUS: " + status);
+ 
+         response = 
client().resource(policiesEndpoint+"/"+newPolicyId+"/start")
+                 .post(ClientResponse.class);
+         assertEquals(response.getStatus(), 204);
+         status = client().resource(policiesEndpoint + "/" + 
newPolicyId).get(Lifecycle.class);
+         assertEquals(status, Lifecycle.RUNNING);
+ 
+         response = client().resource(policiesEndpoint+"/"+newPolicyId+"/stop")
+                 .post(ClientResponse.class);
+         assertEquals(response.getStatus(), 204);
+         status = client().resource(policiesEndpoint + "/" + 
newPolicyId).get(Lifecycle.class);
+         assertEquals(status, Lifecycle.STOPPED);
+ 
+         response = 
client().resource(policiesEndpoint+"/"+newPolicyId+"/destroy")
+                 .post(ClientResponse.class);
+         assertEquals(response.getStatus(), 204);
+ 
+         response = 
client().resource(policiesEndpoint+"/"+newPolicyId).get(ClientResponse.class);
+         log.info("POLICY STATUS RESPONSE AFTER DESTROY: " + 
response.getStatus());
+         assertEquals(response.getStatus(), 404);
+ 
+         policies = client().resource(policiesEndpoint).get(new 
GenericType<Set<PolicySummary>>() {});
+         assertEquals(0, policies.size());
+     }
+ 
+     @SuppressWarnings({ "rawtypes" })
+     @Test(dependsOnMethods = "testDeployApplication")
+     public void testLocatedLocation() {
+         log.info("starting testLocatedLocations");
+         testListApplications();
+ 
+         LocationInternal l = (LocationInternal) 
getManagementContext().getApplications().iterator().next().getLocations().iterator().next();
+         if (l.config().getLocalRaw(LocationConfigKeys.LATITUDE).isAbsent()) {
+             log.info("Supplying fake locations for localhost because could 
not be autodetected");
+             ((AbstractLocation) l).setHostGeoInfo(new 
HostGeoInfo("localhost", "localhost", 50, 0));
+         }
+         Map result = client().resource("/v1/locations/usage/LocatedLocations")
+                 .get(Map.class);
+         log.info("LOCATIONS: " + result);
+         Assert.assertEquals(result.size(), 1);
+         Map details = (Map) result.values().iterator().next();
+         assertEquals(details.get("leafEntityCount"), 2);
+     }
+ 
+     @Test(dependsOnMethods = {"testListEffectors", 
"testFetchApplicationsAndEntity", "testTriggerSampleEffector", 
"testListApplications","testReadEachSensor","testPolicyWhichCapitalizes","testLocatedLocation"})
+     public void testDeleteApplication() throws TimeoutException, 
InterruptedException {
+         waitForPageFoundResponse("/v1/applications/simple-app", 
ApplicationSummary.class);
+         Collection<Application> apps = 
getManagementContext().getApplications();
+         log.info("Deleting simple-app from " + apps);
+         int size = apps.size();
+ 
+         ClientResponse response = 
client().resource("/v1/applications/simple-app")
+                 .delete(ClientResponse.class);
+ 
+         assertEquals(response.getStatus(), 
Response.Status.ACCEPTED.getStatusCode());
+         TaskSummary task = response.getEntity(TaskSummary.class);
+         assertTrue(task.getDescription().toLowerCase().contains("destroy"), 
task.getDescription());
+         
assertTrue(task.getDescription().toLowerCase().contains("simple-app"), 
task.getDescription());
+ 
+         waitForPageNotFoundResponse("/v1/applications/simple-app", 
ApplicationSummary.class);
+ 
+         log.info("App appears gone, apps are: " + 
getManagementContext().getApplications());
+         // more logging above, for failure in the check below
+ 
+         Asserts.eventually(
+                 EntityFunctions.applications(getManagementContext()),
+                 Predicates.compose(Predicates.equalTo(size-1), 
CollectionFunctionals.sizeFunction()) );
+     }
+ }

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/2aac052f/usage/rest-server/src/test/java/org/apache/brooklyn/rest/resources/EntityResourceTest.java
----------------------------------------------------------------------
diff --cc 
usage/rest-server/src/test/java/org/apache/brooklyn/rest/resources/EntityResourceTest.java
index 0000000,6f46679..27dd701
mode 000000,100644..100644
--- 
a/usage/rest-server/src/test/java/org/apache/brooklyn/rest/resources/EntityResourceTest.java
+++ 
b/usage/rest-server/src/test/java/org/apache/brooklyn/rest/resources/EntityResourceTest.java
@@@ -1,0 -1,190 +1,191 @@@
+ /*
+  * 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.resources;
+ 
+ import java.util.Collection;
+ import java.util.List;
+ import java.util.Map;
+ 
+ import javax.annotation.Nullable;
+ import javax.ws.rs.core.MediaType;
+ 
++import org.apache.brooklyn.test.HttpTestUtils;
+ 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 brooklyn.entity.Entity;
+ import brooklyn.entity.basic.BasicApplication;
+ import brooklyn.entity.basic.Entities;
+ import brooklyn.entity.basic.EntityInternal;
+ import org.apache.brooklyn.rest.domain.ApplicationSpec;
+ import org.apache.brooklyn.rest.domain.EntitySpec;
+ import org.apache.brooklyn.rest.domain.TaskSummary;
+ import org.apache.brooklyn.rest.testing.BrooklynRestResourceTest;
+ import org.apache.brooklyn.rest.testing.mocks.RestMockSimpleEntity;
 -import brooklyn.test.HttpTestUtils;
++import org.apache.brooklyn.test.HttpTestUtils;
+ import brooklyn.test.entity.TestEntity;
+ import brooklyn.util.collections.MutableList;
+ import brooklyn.util.exceptions.Exceptions;
+ 
+ import com.google.common.base.Predicate;
+ import com.google.common.collect.ImmutableSet;
+ import com.google.common.collect.Iterables;
+ import com.sun.jersey.api.client.ClientResponse;
+ 
+ @Test(singleThreaded = true)
+ public class EntityResourceTest extends BrooklynRestResourceTest {
+ 
+     private static final Logger log = 
LoggerFactory.getLogger(EntityResourceTest.class);
+     
+     private final ApplicationSpec simpleSpec = ApplicationSpec.builder()
+             .name("simple-app")
+             .entities(ImmutableSet.of(new EntitySpec("simple-ent", 
RestMockSimpleEntity.class.getName())))
+             .locations(ImmutableSet.of("localhost"))
+             .build();
+ 
+     private EntityInternal entity;
+ 
+     private static final String entityEndpoint = 
"/v1/applications/simple-app/entities/simple-ent";
+ 
+     @BeforeClass(alwaysRun = true)
+     @Override
+     public void setUp() throws Exception {
+         super.setUp();
+ 
+         // Deploy application
+         ClientResponse deploy = clientDeploy(simpleSpec);
+         waitForApplicationToBeRunning(deploy.getLocation());
+ 
+         // Add tag
+         entity = (EntityInternal) 
Iterables.find(getManagementContext().getEntityManager().getEntities(), new 
Predicate<Entity>() {
+             @Override
+             public boolean apply(@Nullable Entity input) {
+                 return 
"RestMockSimpleEntity".equals(input.getEntityType().getSimpleName());
+             }
+         });
+     }
+ 
+     @Test
+     public void testTagsSanity() throws Exception {
+         entity.tags().addTag("foo");
+         
+         ClientResponse response = client().resource(entityEndpoint + "/tags")
+                 .accept(MediaType.APPLICATION_JSON_TYPE)
+                 .get(ClientResponse.class);
+         String data = response.getEntity(String.class);
+         
+         try {
+             List<Object> tags = new ObjectMapper().readValue(data, new 
TypeReference<List<Object>>() {});
+             Assert.assertTrue(tags.contains("foo"));
+             Assert.assertFalse(tags.contains("bar"));
+         } catch (Exception e) {
+             Exceptions.propagateIfFatal(e);
+             throw new IllegalStateException("Error with deserialization of 
tags list: "+e+"\n"+data, e);
+         }
+     }
+     
+     @Test
+     public void testRename() throws Exception {
+         try {
+             ClientResponse response = client().resource(entityEndpoint + 
"/name")
+                 .queryParam("name", "New Name")
+                 .post(ClientResponse.class);
+ 
+             HttpTestUtils.assertHealthyStatusCode(response.getStatus());
+             Assert.assertTrue(entity.getDisplayName().equals("New Name"));
+         } finally {
+             // restore it for other tests!
+             entity.setDisplayName("simple-ent");
+         }
+     }
+     
+     @Test
+     public void testAddChild() throws Exception {
+         try {
+             // to test in GUI: 
+             // services: [ { type: brooklyn.entity.basic.BasicEntity }]
+             ClientResponse response = client().resource(entityEndpoint + 
"/children?timeout=10s")
+                 .entity("services: [ { type: "+TestEntity.class.getName()+" 
}]", "application/yaml")
+                 .post(ClientResponse.class);
+ 
+             HttpTestUtils.assertHealthyStatusCode(response.getStatus());
+             Assert.assertEquals(entity.getChildren().size(), 1);
+             Entity child = Iterables.getOnlyElement(entity.getChildren());
+             Assert.assertTrue(Entities.isManaged(child));
+             
+             TaskSummary task = response.getEntity(TaskSummary.class);
+             Assert.assertEquals(task.getResult(), 
MutableList.of(child.getId()));
+             
+         } finally {
+             // restore it for other tests
+             Collection<Entity> children = entity.getChildren();
+             if (!children.isEmpty()) 
Entities.unmanage(Iterables.getOnlyElement(children));
+         }
+     }
+     
+     @Test
+     public void testTagsDoNotSerializeTooMuch() throws Exception {
+         entity.tags().addTag("foo");
+         entity.tags().addTag(entity.getParent());
+ 
+         ClientResponse response = client().resource(entityEndpoint + "/tags")
+                 .accept(MediaType.APPLICATION_JSON)
+                 .get(ClientResponse.class);
+         String raw = response.getEntity(String.class);
+         log.info("TAGS raw: "+raw);
+         HttpTestUtils.assertHealthyStatusCode(response.getStatus());
+         
+         Assert.assertTrue(raw.contains(entity.getParent().getId()), 
"unexpected app tag, does not include ID: "+raw);
+         
+         Assert.assertTrue(raw.length() < 1000, "unexpected app tag, includes 
too much mgmt info (len "+raw.length()+"): "+raw);
+         
+         
Assert.assertFalse(raw.contains(entity.getManagementContext().getManagementNodeId()),
 "unexpected app tag, includes too much mgmt info: "+raw);
+         Assert.assertFalse(raw.contains("managementContext"), "unexpected app 
tag, includes too much mgmt info: "+raw);
+         Assert.assertFalse(raw.contains("localhost"), "unexpected app tag, 
includes too much mgmt info: "+raw);
+         Assert.assertFalse(raw.contains("catalog"), "unexpected app tag, 
includes too much mgmt info: "+raw);
+ 
+         @SuppressWarnings("unchecked")
+         List<Object> tags = mapper().readValue(raw, List.class);
+         log.info("TAGS are: "+tags);
+         
+         Assert.assertEquals(tags.size(), 2, "tags are: "+tags);
+ 
+         Assert.assertTrue(tags.contains("foo"));
+         Assert.assertFalse(tags.contains("bar"));
+         
+         MutableList<Object> appTags = MutableList.copyOf(tags);
+         appTags.remove("foo");
+         Object appTag = Iterables.getOnlyElement( appTags );
+         
+         // it's a map at this point, because there was no way to make it 
something stronger than Object
+         Assert.assertTrue(appTag instanceof Map, "Should have deserialized an 
entity: "+appTag);
+         // let's re-serialize it as an entity
+         appTag = mapper().readValue(mapper().writeValueAsString(appTag), 
Entity.class);
+         
+         Assert.assertTrue(appTag instanceof Entity, "Should have deserialized 
an entity: "+appTag);
+         Assert.assertEquals( ((Entity)appTag).getId(), 
entity.getApplicationId(), "Wrong ID: "+appTag);
+         Assert.assertTrue(appTag instanceof BasicApplication, "Should have 
deserialized BasicApplication: "+appTag);
+     }
+     
+ }

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/2aac052f/usage/rest-server/src/test/java/org/apache/brooklyn/rest/resources/SensorResourceIntegrationTest.java
----------------------------------------------------------------------
diff --cc 
usage/rest-server/src/test/java/org/apache/brooklyn/rest/resources/SensorResourceIntegrationTest.java
index 0000000,c61c327..4262384
mode 000000,100644..100644
--- 
a/usage/rest-server/src/test/java/org/apache/brooklyn/rest/resources/SensorResourceIntegrationTest.java
+++ 
b/usage/rest-server/src/test/java/org/apache/brooklyn/rest/resources/SensorResourceIntegrationTest.java
@@@ -1,0 -1,83 +1,84 @@@
+ /*
+  * 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.resources;
+ 
+ import java.net.URI;
+ 
++import org.apache.brooklyn.test.HttpTestUtils;
+ import org.apache.http.client.HttpClient;
+ import org.eclipse.jetty.server.Server;
+ import org.testng.Assert;
+ import org.testng.annotations.BeforeClass;
+ import org.testng.annotations.Test;
+ 
+ import brooklyn.entity.Entity;
+ import brooklyn.entity.basic.BasicApplication;
+ import brooklyn.entity.basic.EntityInternal;
+ import brooklyn.entity.basic.EntityPredicates;
+ import brooklyn.entity.proxying.EntitySpec;
+ import brooklyn.management.ManagementContext;
+ import org.apache.brooklyn.rest.BrooklynRestApiLauncher;
+ import org.apache.brooklyn.rest.BrooklynRestApiLauncherTestFixture;
+ import org.apache.brooklyn.rest.testing.mocks.RestMockSimpleEntity;
 -import brooklyn.test.HttpTestUtils;
++import org.apache.brooklyn.test.HttpTestUtils;
+ import brooklyn.test.entity.LocalManagementContextForTests;
+ import brooklyn.util.collections.MutableList;
+ import brooklyn.util.http.HttpTool;
+ import brooklyn.util.http.HttpToolResponse;
+ import brooklyn.util.net.Urls;
+ 
+ import com.google.common.collect.ImmutableMap;
+ import com.google.common.collect.Iterables;
+ 
+ public class SensorResourceIntegrationTest extends 
BrooklynRestApiLauncherTestFixture {
+ 
+     private Server server;
+     private ManagementContext mgmt;
+     private BasicApplication app;
+ 
+     @BeforeClass(alwaysRun = true)
+     protected void setUp() {
+         mgmt = LocalManagementContextForTests.newInstance();
+         server = useServerForTest(BrooklynRestApiLauncher.launcher()
+             .managementContext(mgmt)
+             .withoutJsgui()
+             .start());
+         app = 
mgmt.getEntityManager().createEntity(EntitySpec.create(BasicApplication.class).displayName("simple-app")
+             .child(EntitySpec.create(Entity.class, 
RestMockSimpleEntity.class).displayName("simple-ent")));
+         mgmt.getEntityManager().manage(app);
+         
app.start(MutableList.of(mgmt.getLocationRegistry().resolve("localhost")));
+     }
+     
+     // marked integration because of time
+     @Test(groups = "Integration")
+     public void testSensorBytes() throws Exception {
+         EntityInternal entity = (EntityInternal) 
Iterables.find(mgmt.getEntityManager().getEntities(), 
EntityPredicates.displayNameEqualTo("simple-ent"));
+         SensorResourceTest.addAmphibianSensor(entity);
+         
+         String baseUri = getBaseUri(server);
+         URI url = URI.create(Urls.mergePaths(baseUri, 
SensorResourceTest.SENSORS_ENDPOINT, SensorResourceTest.SENSOR_NAME));
+         
+         // Uses explicit "application/json" because failed on jenkins as 
though "text/plain" was the default on Ubuntu jenkins! 
+         HttpClient client = HttpTool.httpClientBuilder().uri(baseUri).build();
+         HttpToolResponse response = HttpTool.httpGet(client, url, 
ImmutableMap.<String, String>of("Accept", "application/json"));
+         HttpTestUtils.assertHealthyStatusCode(response.getResponseCode());
+         Assert.assertEquals(response.getContentAsString(), "\"12345 frogs\"");
+     }
+ 
+ }

Reply via email to