diff --git a/README.md b/README.md
index e824971e9..639988af8 100644
--- a/README.md
+++ b/README.md
@@ -10,15 +10,31 @@ Build: [](htt
* You can also check out our [Project Homepage](https://projects.eclipse.org/projects/iot.hawkbit) for further contact options.
-# Compile
-```
-mvn install
-```
-
-# Run and use
+# Compile, Run and Getting Started
We are not providing an off the shelf installation ready hawkBit update server. However, we recommend to check out the [Example Application](examples/hawkbit-example-app) for a runtime ready Spring Boot based update server that is empowered by hawkBit.
+#### Clone and build hawkBit
+```
+$ git clone https://github.com/eclipse/hawkbit.git
+$ mvn clean install
+```
+#### Start hawkBit example app
+[Example Application](examples/hawkbit-example-app)
+```
+$ java –jar ./examples/hawkbit-example-app/target/hawkbit-example-app-#version#.jar
+```
+#### Start hawkBit device simulator
+[Device Simulator](examples/hawkbit-device-simulator)
+```
+$ java –jar ./examples/hawkbit-device-simulator/target/hawkbit-device-simulator-#version#.jar
+```
+#### Generate Getting Started data
+[Example Management API Client](examples/hawkbit-mgmt-api-client)
+```
+$ java –jar ./examples/hawkbit-mgmt-api-client/target/hawkbit-mgmt-api-client-#version#.jar
+```
+
# Releases and Roadmap
* We are currently working on the first formal release under the Eclipse banner: 0.1 (see [Release 0.1 branch](https://github.com/eclipse/hawkbit/tree/release-train-0.1)).
@@ -29,11 +45,10 @@ We are not providing an off the shelf installation ready hawkBit update server.
* And of course tons of usability improvements and bug fixes.
-## Try out examples
-#### Standalone Test Application Server
-[Example Application](examples/hawkbit-example-app)
-#### Device Simulator using the DMF AMQP API
-[Device Simulator](examples/hawkbit-device-simulator)
+# Device Integration
+There are two device integration APIs provided by the hawkbit update server.
+* [Direct Device Integration API (HTTP)](DDIA.md)
+* [Device Management Federation API (AMQP)](DMFA.md)
# Modules
`hawkbit-core` : core elements.
@@ -49,9 +64,3 @@ We are not providing an off the shelf installation ready hawkBit update server.
`hawkbit-rest-resource` : HTTP REST endpoints for the Management and the Direct Device API.
`hawkbit-ui` : Vaadin UI.
`hawkbit-cache-redis` : spring cache manager configuration and implementation with redis, distributed cache and distributed events.
-
-
-# Device Integration
-There are two device integration APIs provided by the hawkbit update server.
-* [Direct Device Integration API (HTTP)](DDIA.md)
-* [Device Management Federation API (AMQP)](DMFA.md)
diff --git a/examples/hawkbit-device-simulator/src/main/java/org/eclipse/hawkbit/simulator/DDISimulatedDevice.java b/examples/hawkbit-device-simulator/src/main/java/org/eclipse/hawkbit/simulator/DDISimulatedDevice.java
index 1417c3153..b58d3a413 100644
--- a/examples/hawkbit-device-simulator/src/main/java/org/eclipse/hawkbit/simulator/DDISimulatedDevice.java
+++ b/examples/hawkbit-device-simulator/src/main/java/org/eclipse/hawkbit/simulator/DDISimulatedDevice.java
@@ -10,7 +10,6 @@ package org.eclipse.hawkbit.simulator;
import java.util.concurrent.ScheduledExecutorService;
-import org.eclipse.hawkbit.simulator.DeviceSimulatorUpdater.UpdaterCallback;
import org.eclipse.hawkbit.simulator.http.ControllerResource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -82,28 +81,27 @@ public class DDISimulatedDevice extends AbstractSimulatedDevice {
final String deploymentJson = controllerResource.getDeployment(getTenant(), getId(), actionId);
final String swVersion = JsonPath.parse(deploymentJson).read("deployment.chunks[0].version");
currentActionId = actionId;
- deviceUpdater.startUpdate(getTenant(), getId(), actionId, swVersion, new UpdaterCallback() {
- @Override
- public void updateFinished(final AbstractSimulatedDevice device, final Long actionId) {
- switch (device.getResponseStatus()) {
- case SUCCESSFUL:
- controllerResource.postSuccessFeedback(getTenant(), getId(), actionId);
- break;
- case ERROR:
- controllerResource.postErrorFeedback(getTenant(), getId(), actionId);
- break;
- default:
- throw new IllegalStateException("simulated device has an unknown response status + "
- + device.getResponseStatus());
- }
- currentActionId = null;
+ deviceUpdater.startUpdate(getTenant(), getId(), actionId, swVersion, (device, actionId1) -> {
+ switch (device.getResponseStatus()) {
+ case SUCCESSFUL:
+ controllerResource.postSuccessFeedback(getTenant(), getId(),
+ actionId1);
+ break;
+ case ERROR:
+ controllerResource.postErrorFeedback(getTenant(), getId(),
+ actionId1);
+ break;
+ default:
+ throw new IllegalStateException(
+ "simulated device has an unknown response status + " + device.getResponseStatus());
}
+ currentActionId = null;
});
}
} catch (final PathNotFoundException e) {
// href might not be in the json response, so ignore
// exception here.
- LOGGER.trace("Response does not contain a deploymentbase href link, ignoring.");
+ LOGGER.trace("Response does not contain a deploymentbase href link, ignoring.", e);
}
}
diff --git a/examples/hawkbit-device-simulator/src/main/java/org/eclipse/hawkbit/simulator/DeviceSimulatorUpdater.java b/examples/hawkbit-device-simulator/src/main/java/org/eclipse/hawkbit/simulator/DeviceSimulatorUpdater.java
index 6e93b7d04..075f30ba0 100644
--- a/examples/hawkbit-device-simulator/src/main/java/org/eclipse/hawkbit/simulator/DeviceSimulatorUpdater.java
+++ b/examples/hawkbit-device-simulator/src/main/java/org/eclipse/hawkbit/simulator/DeviceSimulatorUpdater.java
@@ -8,6 +8,7 @@
*/
package org.eclipse.hawkbit.simulator;
+import java.security.SecureRandom;
import java.util.Random;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
@@ -41,7 +42,7 @@ public class DeviceSimulatorUpdater {
/**
* Starting an simulated update process of an simulated device.
- *
+ *
* @param tenant
* the tenant of the device
* @param id
@@ -66,7 +67,7 @@ public class DeviceSimulatorUpdater {
}
private static final class DeviceSimulatorUpdateThread implements Runnable {
- private static final Random rndSleep = new Random();
+ private static final Random rndSleep = new SecureRandom();
private final AbstractSimulatedDevice device;
private final SpSenderService spSenderService;
@@ -74,9 +75,8 @@ public class DeviceSimulatorUpdater {
private final EventBus eventbus;
private final UpdaterCallback callback;
- private DeviceSimulatorUpdateThread(final AbstractSimulatedDevice device,
- final SpSenderService spSenderService, final long actionId, final EventBus eventbus,
- final UpdaterCallback callback) {
+ private DeviceSimulatorUpdateThread(final AbstractSimulatedDevice device, final SpSenderService spSenderService,
+ final long actionId, final EventBus eventbus, final UpdaterCallback callback) {
this.device = device;
this.spSenderService = spSenderService;
this.actionId = actionId;
@@ -89,8 +89,9 @@ public class DeviceSimulatorUpdater {
final double newProgress = device.getProgress() + 0.2;
device.setProgress(newProgress);
if (newProgress < 1.0) {
- threadPool.schedule(new DeviceSimulatorUpdateThread(device, spSenderService, actionId, eventbus,
- callback), rndSleep.nextInt(3000), TimeUnit.MILLISECONDS);
+ threadPool.schedule(
+ new DeviceSimulatorUpdateThread(device, spSenderService, actionId, eventbus, callback),
+ rndSleep.nextInt(3000), TimeUnit.MILLISECONDS);
} else {
callback.updateFinished(device, actionId);
}
@@ -102,7 +103,7 @@ public class DeviceSimulatorUpdater {
* Callback interface which is called when the simulated update process has
* been finished and the caller of starting the simulated update process can
* send the result to the hawkbit update server back.
- *
+ *
* @author Michael Hirsch
*
*/
@@ -111,7 +112,7 @@ public class DeviceSimulatorUpdater {
/**
* Callback method to indicate that the simulated update process has
* been finished.
- *
+ *
* @param device
* the device which has been updated
* @param actionId
diff --git a/examples/hawkbit-device-simulator/src/main/java/org/eclipse/hawkbit/simulator/NextPollTimeController.java b/examples/hawkbit-device-simulator/src/main/java/org/eclipse/hawkbit/simulator/NextPollTimeController.java
index 81acf897e..9c78ec65a 100644
--- a/examples/hawkbit-device-simulator/src/main/java/org/eclipse/hawkbit/simulator/NextPollTimeController.java
+++ b/examples/hawkbit-device-simulator/src/main/java/org/eclipse/hawkbit/simulator/NextPollTimeController.java
@@ -16,6 +16,8 @@ import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
import org.eclipse.hawkbit.simulator.event.NextPollCounterUpdate;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@@ -24,13 +26,15 @@ import com.google.common.eventbus.EventBus;
/**
* Poll time trigger which executes the {@link DDISimulatedDevice#poll()} every
* second.
- *
+ *
* @author Michael Hirsch
*
*/
@Component
public class NextPollTimeController {
+ private static final Logger LOGGER = LoggerFactory.getLogger(NextPollTimeController.class);
+
private static final ScheduledExecutorService executorService = Executors.newScheduledThreadPool(1);
private static final ExecutorService pollService = Executors.newFixedThreadPool(1);
@@ -58,14 +62,9 @@ public class NextPollTimeController {
if (nextCounter < 0) {
if (device instanceof DDISimulatedDevice) {
try {
- pollService.submit(new Runnable() {
- @Override
- public void run() {
- ((DDISimulatedDevice) device).poll();
- }
- });
- } catch (final Exception e) {
-
+ pollService.submit(() -> ((DDISimulatedDevice) device).poll());
+ } catch (final IllegalStateException e) {
+ LOGGER.trace("Device could not be polled", e);
}
nextCounter = ((DDISimulatedDevice) device).getPollDelaySec();
}
diff --git a/examples/hawkbit-mgmt-api-client/README.md b/examples/hawkbit-mgmt-api-client/README.md
index 7eb32f9e6..eff301e20 100644
--- a/examples/hawkbit-mgmt-api-client/README.md
+++ b/examples/hawkbit-mgmt-api-client/README.md
@@ -1,3 +1,39 @@
+# HawkBit management API example
+
Example client that shows how to efficiently use the hawkBit management API.
-Powered by [Feign](https://github.com/Netflix/feign).
\ No newline at end of file
+Powered by [Feign](https://github.com/Netflix/feign).
+
+## How to run the example client
+
+Run getting started example
+
+
+
+ $ java -jar hawkbit-mgmt-api-client-#version#.jar
+
+
+Run create and start rollout example
+
+
+ $ java -jar hawkbit-mgmt-api-client-#version#.jar --createrollout
+
+
+## This example shows
+
+In getting started example:
+* creating software modules type
+* creating distribution set type
+* creating distribution sets
+* creating software modules
+* assigning software modules to distribution sets
+
+In rollout mode:
+* creating software modules type
+* creating distribution set type
+* creating distribution sets
+* creating software modules
+* assigning software modules to distribution sets
+* creating a rollout
+* starting a rollout
+
diff --git a/examples/hawkbit-mgmt-api-client/pom.xml b/examples/hawkbit-mgmt-api-client/pom.xml
index cced3dfbb..6e62bfe4e 100644
--- a/examples/hawkbit-mgmt-api-client/pom.xml
+++ b/examples/hawkbit-mgmt-api-client/pom.xml
@@ -16,9 +16,43 @@
hawkbit-examples-parent0.2.0-SNAPSHOT
+ jarhawkbit-mgmt-api-clienthawkBit Management API example client
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+ repackage
+
+
+ ${baseDir}
+ false
+ org.eclipse.hawkbit.mgmt.client.Application
+ JAR
+
+
+
+
+
+
+
+
+
+
+ org.springframework.cloud
+ spring-cloud-netflix
+ 1.0.7.RELEASE
+ pom
+ import
+
+
+
@@ -26,45 +60,32 @@
hawkbit-rest-api${project.version}
-
- com.netflix.feign
- feign-jackson
- 8.12.1
- com.netflix.feignfeign-core
- 8.12.1
+
+ 8.14.2
-
-
- org.eclipse.hawkbit
- hawkbit-example-app
- ${project.version}
- test
+ hibernate-validator
+ org.hibernateorg.springframework.boot
- spring-boot-starter-test
- test
+ spring-boot-starter
- ru.yandex.qatools.allure
- allure-junit-adaptor
- test
+ org.springframework.cloud
+ spring-cloud-starter-feign
- org.easytesting
- fest-assert-core
- test
+ org.springframework.boot
+ spring-boot-starter-logging
- org.easytesting
- fest-assert
- test
+ com.google.collections
+ google-collections
+ 1.0-rc2
-
-
\ No newline at end of file
diff --git a/examples/hawkbit-mgmt-api-client/src/main/java/org/eclipse/hawkbit/mgmt/api/client/DistributionSetResource.java b/examples/hawkbit-mgmt-api-client/src/main/java/org/eclipse/hawkbit/mgmt/api/client/DistributionSetResource.java
deleted file mode 100644
index 62c987ae8..000000000
--- a/examples/hawkbit-mgmt-api-client/src/main/java/org/eclipse/hawkbit/mgmt/api/client/DistributionSetResource.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/**
- * Copyright (c) 2015 Bosch Software Innovations GmbH and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- */
-package org.eclipse.hawkbit.mgmt.api.client;
-
-import java.util.List;
-
-import org.eclipse.hawkbit.rest.resource.RestConstants;
-import org.eclipse.hawkbit.rest.resource.model.distributionset.DistributionSetRequestBodyPost;
-import org.eclipse.hawkbit.rest.resource.model.distributionset.DistributionSetsRest;
-
-import feign.Headers;
-import feign.RequestLine;
-
-/**
- * Client binding for the Distribution resource of the management API.
- */
-@FunctionalInterface
-public interface DistributionSetResource {
-
- /**
- * Creates a list of distribution sets.
- *
- * @param sets
- * the request body java bean containing the necessary attributes
- * for creating a distribution set.
- * @return the list of targets which have been created
- */
- @RequestLine("POST " + RestConstants.DISTRIBUTIONSET_V1_REQUEST_MAPPING)
- @Headers("Content-Type: application/json")
- DistributionSetsRest createDistributionSets(final List sets);
-
-}
diff --git a/examples/hawkbit-mgmt-api-client/src/main/java/org/eclipse/hawkbit/mgmt/api/client/DistrubutionSetTagResource.java b/examples/hawkbit-mgmt-api-client/src/main/java/org/eclipse/hawkbit/mgmt/api/client/DistrubutionSetTagResource.java
deleted file mode 100644
index fe7a147a8..000000000
--- a/examples/hawkbit-mgmt-api-client/src/main/java/org/eclipse/hawkbit/mgmt/api/client/DistrubutionSetTagResource.java
+++ /dev/null
@@ -1,138 +0,0 @@
-/**
- * Copyright (c) 2015 Bosch Software Innovations GmbH and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- */
-package org.eclipse.hawkbit.mgmt.api.client;
-
-import java.util.List;
-
-import org.eclipse.hawkbit.rest.resource.RestConstants;
-import org.eclipse.hawkbit.rest.resource.model.distributionset.DistributionSetsRest;
-import org.eclipse.hawkbit.rest.resource.model.tag.AssignedDistributionSetRequestBody;
-import org.eclipse.hawkbit.rest.resource.model.tag.DistributionSetTagAssigmentResultRest;
-import org.eclipse.hawkbit.rest.resource.model.tag.TagRequestBodyPut;
-import org.eclipse.hawkbit.rest.resource.model.tag.TagRest;
-import org.eclipse.hawkbit.rest.resource.model.tag.TagsRest;
-import org.eclipse.hawkbit.rest.resource.model.target.TargetsRest;
-
-import feign.Headers;
-import feign.Param;
-import feign.RequestLine;
-
-/**
- * Client binding for the DistributionSetTag resource of the management API.
- */
-public interface DistrubutionSetTagResource {
-
- /**
- * Retrieves a single distributionset tag based on the given ID.
- *
- * @param dsTagId
- * the ID of the distributionset tag to retrieve
- * @return a deserialized java bean containing the attributes of the
- * returned distributionset tag
- */
- @RequestLine("GET " + RestConstants.DISTRIBUTIONSET_TAG_V1_REQUEST_MAPPING + "/{dsTagId}")
- TagRest getDistributionSetTag(@Param("dsTagId") Long dsTagId);
-
- /**
- * Creates a list of distributionset tags.
- *
- * @param tags
- * the tags to be created
- * @return the created tag list
- */
- @RequestLine("POST " + RestConstants.DISTRIBUTIONSET_TAG_V1_REQUEST_MAPPING)
- @Headers("Content-Type: application/json")
- TagsRest createDistributionSetTags(List tags);
-
- /**
- * Update attributes of a distributionset tag.
- *
- * @param dsTagId
- * the distributionset tag id to be updated
- * @param tag
- * the request body
- * @return the updated distributionset tag
- */
- @RequestLine("PUT " + RestConstants.DISTRIBUTIONSET_TAG_V1_REQUEST_MAPPING + "/{dsTagId}")
- @Headers("Content-Type: application/json")
- TagRest updateDistributionSetTag(@Param("dsTagId") Long dsTagId, TagRequestBodyPut tag);
-
- /**
- * Deletes given distributionset tag on given ID.
- *
- * @param dsTagId
- * to be deleted
- */
- @RequestLine("DELETE " + RestConstants.DISTRIBUTIONSET_TAG_V1_REQUEST_MAPPING + "/{dsTagId}")
- void deleteDistributionSetTag(@Param("dsTagId") final Long dsTagId);
-
- /**
- * Retrieves a all assigned targets on the given distributionset tag id.
- *
- * @param dsTagId
- * the ID of the distributionset tag to retrieve
- * @return a list of targets
- */
- @RequestLine("GET " + RestConstants.DISTRIBUTIONSET_TAG_V1_REQUEST_MAPPING
- + RestConstants.DISTRIBUTIONSET_REQUEST_MAPPING)
- DistributionSetsRest getAssignedDistributionSets(@Param("dsTagId") final Long dsTagId);
-
- /**
- * Toggle the tag assignment all assigned targets will be unassigned and all
- * unassigned targets will be assigned.
- *
- * @param dsTagId
- * the ID of the distributionset tag to toggle
- * @param assignedTargetRequestBodies
- * a list of controller ids
- * @return a list of assigned and unassigned targets
- */
- @RequestLine("POST " + RestConstants.DISTRIBUTIONSET_TAG_V1_REQUEST_MAPPING
- + RestConstants.DISTRIBUTIONSET_REQUEST_MAPPING + "/toggleTagAssignment")
- @Headers("Content-Type: application/json")
- DistributionSetTagAssigmentResultRest toggleTagAssignment(@Param("dsTagId") final Long dsTagId,
- final List assignedTargetRequestBodies);
-
- /**
- * Assign targets to a given distributionset tag id.
- *
- * @param dsTagId
- * the ID of the distributionset tag to add the targets
- * @param assignedTargetRequestBodies
- * a list of controller ids
- * @return a list of assigned targets
- */
- @RequestLine("POST " + RestConstants.DISTRIBUTIONSET_TAG_V1_REQUEST_MAPPING
- + RestConstants.DISTRIBUTIONSET_REQUEST_MAPPING)
- @Headers("Content-Type: application/json")
- TargetsRest assignDistributionSets(@Param("dsTagId") final Long dsTagId,
- final List assignedTargetRequestBodies);
-
- /**
- * Unassign targets to a given distributionset tag id.
- *
- * @param dsTagId
- * the ID of the distributionset tag to add the targets
- */
- @RequestLine("DELETE " + RestConstants.DISTRIBUTIONSET_TAG_V1_REQUEST_MAPPING
- + RestConstants.DISTRIBUTIONSET_REQUEST_MAPPING)
- void unassignDistributionSets(@Param("dsTagId") final Long dsTagId);
-
- /**
- * Unassign one target to a given distributionset tag id.
- *
- * @param dsTagId
- * the ID of the distributionset tag to add the targets param
- * @param dsId
- * the distributionset id
- */
- @RequestLine("DELETE " + RestConstants.DISTRIBUTIONSET_TAG_V1_REQUEST_MAPPING
- + RestConstants.DISTRIBUTIONSET_REQUEST_MAPPING + "/{dsId}")
- void unassignDistributionSet(@Param("dsTagId") final Long dsTagId, @Param("dsId") final Long dsId);
-}
diff --git a/examples/hawkbit-mgmt-api-client/src/main/java/org/eclipse/hawkbit/mgmt/api/client/TargetResource.java b/examples/hawkbit-mgmt-api-client/src/main/java/org/eclipse/hawkbit/mgmt/api/client/TargetResource.java
deleted file mode 100644
index 66c147426..000000000
--- a/examples/hawkbit-mgmt-api-client/src/main/java/org/eclipse/hawkbit/mgmt/api/client/TargetResource.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/**
- * Copyright (c) 2015 Bosch Software Innovations GmbH and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- */
-package org.eclipse.hawkbit.mgmt.api.client;
-
-import java.util.List;
-
-import org.eclipse.hawkbit.rest.resource.model.target.TargetPagedList;
-import org.eclipse.hawkbit.rest.resource.model.target.TargetRequestBody;
-import org.eclipse.hawkbit.rest.resource.model.target.TargetRest;
-import org.eclipse.hawkbit.rest.resource.model.target.TargetsRest;
-
-import feign.Headers;
-import feign.Param;
-import feign.RequestLine;
-
-/**
- * Client binding for the Target resource of the management API.
- */
-public interface TargetResource {
-
- /**
- * Retrieves a single target based on the given ID.
- *
- * @param targetId
- * the ID of the target to retrieve
- * @return a deserialized java bean containing the attributes of the
- * returned target
- */
- @RequestLine("GET /rest/v1/targets/{targetId}")
- TargetRest getTarget(@Param("targetId") final String targetId);
-
- /**
- * Paged query of targets resource.
- *
- * @param pagingOffsetParam
- * of the paged query
- * @param pagingLimitParam
- * of the paged query
- * @return paged list of target entries
- */
- @RequestLine("GET /rest/v1/targets?offset={pagingOffsetParam}&limit={pagingLimitParam}")
- TargetPagedList getTargets(@Param("pagingOffsetParam") int pagingOffsetParam,
- @Param("pagingLimitParam") int pagingLimitParam);
-
- /**
- * Paged query of targets resource with default offset and limit.
- *
- * @return paged list of target entries
- */
- @RequestLine("GET /rest/v1/targets")
- TargetPagedList getTargets();
-
- /**
- * Deletes given target based on given ID.
- *
- * @param targetId
- * to be deleted
- */
- @RequestLine("DELETE /rest/v1/targets/{targetId}")
- void deleteTarget(@Param("targetId") final String targetId);
-
- /**
- * Creates a list of targets.
- *
- * @param targets
- * the request body java bean containing the necessary attributes
- * for creating a target.
- * @return the list of targets which have been created
- */
- @RequestLine("POST /rest/v1/targets/")
- @Headers("Content-Type: application/json")
- TargetsRest createTargets(List targets);
-
-}
diff --git a/examples/hawkbit-mgmt-api-client/src/main/java/org/eclipse/hawkbit/mgmt/api/client/TargetTagResource.java b/examples/hawkbit-mgmt-api-client/src/main/java/org/eclipse/hawkbit/mgmt/api/client/TargetTagResource.java
deleted file mode 100644
index bd74e52d7..000000000
--- a/examples/hawkbit-mgmt-api-client/src/main/java/org/eclipse/hawkbit/mgmt/api/client/TargetTagResource.java
+++ /dev/null
@@ -1,137 +0,0 @@
-/**
- * Copyright (c) 2015 Bosch Software Innovations GmbH and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- */
-package org.eclipse.hawkbit.mgmt.api.client;
-
-import java.util.List;
-
-import org.eclipse.hawkbit.rest.resource.RestConstants;
-import org.eclipse.hawkbit.rest.resource.model.tag.AssignedTargetRequestBody;
-import org.eclipse.hawkbit.rest.resource.model.tag.TagRequestBodyPut;
-import org.eclipse.hawkbit.rest.resource.model.tag.TagRest;
-import org.eclipse.hawkbit.rest.resource.model.tag.TagsRest;
-import org.eclipse.hawkbit.rest.resource.model.tag.TargetTagAssigmentResultRest;
-import org.eclipse.hawkbit.rest.resource.model.target.TargetsRest;
-
-import feign.Headers;
-import feign.Param;
-import feign.RequestLine;
-
-/**
- * Client binding for the Target resource of the management API.
- */
-public interface TargetTagResource {
-
- /**
- * Retrieves a single target tag based on the given ID.
- *
- * @param targetTagId
- * the ID of the target tag to retrieve
- * @return a deserialized java bean containing the attributes of the
- * returned target tag
- */
- @RequestLine("GET " + RestConstants.TARGET_TAG_V1_REQUEST_MAPPING + "/{targetTagId}")
- TagRest getTargetTag(@Param("targetTagId") Long targetTagId);
-
- /**
- * Creates a list of target tags.
- *
- * @param tags
- * the tags to be created
- * @return the created tag list
- */
- @RequestLine("POST " + RestConstants.TARGET_TAG_V1_REQUEST_MAPPING)
- @Headers("Content-Type: application/json")
- TagsRest createTargetTag(List tags);
-
- /**
- * Update attributes of a target tag.
- *
- * @param targetTagId
- * the target tag id to be updated
- * @param tag
- * the request body
- * @return the updated target tag
- */
- @RequestLine("PUT " + RestConstants.TARGET_TAG_V1_REQUEST_MAPPING + "/{targetTagId}")
- @Headers("Content-Type: application/json")
- TagRest updateTagretTag(@Param("targetTagId") Long targetTagId, TagRequestBodyPut tag);
-
- /**
- * Deletes given target tag on given ID.
- *
- * @param targetTagId
- * to be deleted
- */
- @RequestLine("DELETE " + RestConstants.TARGET_TAG_V1_REQUEST_MAPPING + "/{targetTagId}")
- void deleteTargetTag(@Param("targetTagId") final Long targetTagId);
-
- /**
- * Retrieves a all assigned targets on the given target tag id.
- *
- * @param targetTagId
- * the ID of the target tag to retrieve
- * @return a list of targets
- */
- @RequestLine("GET " + RestConstants.TARGET_TAG_V1_REQUEST_MAPPING
- + RestConstants.TARGET_TAG_TAGERTS_REQUEST_MAPPING)
- TargetsRest getAssignedTargets(@Param("targetTagId") final Long targetTagId);
-
- /**
- * Toggle the tag assignment all assigned targets will be unassigned and all
- * unassigned targets will be assigned.
- *
- * @param targetTagId
- * the ID of the target tag to toggle
- * @param assignedTargetRequestBodies
- * a list of controller ids
- * @return a list of assigned and unassigned targets
- */
- @RequestLine("POST " + RestConstants.TARGET_TAG_V1_REQUEST_MAPPING
- + RestConstants.TARGET_TAG_TAGERTS_REQUEST_MAPPING + "/toggleTagAssignment")
- @Headers("Content-Type: application/json")
- TargetTagAssigmentResultRest toggleTagAssignment(@Param("targetTagId") final Long targetTagId,
- final List assignedTargetRequestBodies);
-
- /**
- * Assign targets to a given target tag id.
- *
- * @param targetTagId
- * the ID of the target tag to add the targets
- * @param assignedTargetRequestBodies
- * a list of controller ids
- * @return a list of assigned targets
- */
- @RequestLine("POST " + RestConstants.TARGET_TAG_V1_REQUEST_MAPPING
- + RestConstants.TARGET_TAG_TAGERTS_REQUEST_MAPPING)
- @Headers("Content-Type: application/json")
- TargetsRest assignTargets(@Param("targetTagId") final Long targetTagId,
- final List assignedTargetRequestBodies);
-
- /**
- * Unassign targets to a given target tag id.
- *
- * @param targetTagId
- * the ID of the target tag to add the targets
- */
- @RequestLine("DELETE " + RestConstants.TARGET_TAG_V1_REQUEST_MAPPING
- + RestConstants.TARGET_TAG_TAGERTS_REQUEST_MAPPING)
- void unassignTargets(@Param("targetTagId") final Long targetTagId);
-
- /**
- * Unassign one target to a given target tag id.
- *
- * @param targetTagId
- * the ID of the target tag to add the targets param
- * @param controllerId
- * the controller id
- */
- @RequestLine("DELETE " + RestConstants.TARGET_TAG_V1_REQUEST_MAPPING
- + RestConstants.TARGET_TAG_TAGERTS_REQUEST_MAPPING + "/{controllerId}")
- void unassignTarget(@Param("targetTagId") final Long targetTagId, @Param("controllerId") final String controllerId);
-}
diff --git a/examples/hawkbit-mgmt-api-client/src/main/java/org/eclipse/hawkbit/mgmt/client/Application.java b/examples/hawkbit-mgmt-api-client/src/main/java/org/eclipse/hawkbit/mgmt/client/Application.java
new file mode 100644
index 000000000..27584b50a
--- /dev/null
+++ b/examples/hawkbit-mgmt-api-client/src/main/java/org/eclipse/hawkbit/mgmt/client/Application.java
@@ -0,0 +1,77 @@
+/**
+ * Copyright (c) 2015 Bosch Software Innovations GmbH and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.eclipse.hawkbit.mgmt.client;
+
+import org.eclipse.hawkbit.mgmt.client.scenarios.CreateStartedRolloutExample;
+import org.eclipse.hawkbit.mgmt.client.scenarios.GettingStartedDefaultScenario;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.CommandLineRunner;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.builder.SpringApplicationBuilder;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.cloud.netflix.feign.EnableFeignClients;
+import org.springframework.context.annotation.Bean;
+
+import feign.Contract;
+import feign.auth.BasicAuthRequestInterceptor;
+
+@SpringBootApplication
+@EnableFeignClients
+@EnableConfigurationProperties(ClientConfigurationProperties.class)
+public class Application implements CommandLineRunner {
+
+ @Autowired
+ private ClientConfigurationProperties configuration;
+
+ @Autowired
+ private GettingStartedDefaultScenario gettingStarted;
+
+ @Autowired
+ private CreateStartedRolloutExample gettingStartedRolloutScenario;
+
+ public static void main(final String[] args) {
+ new SpringApplicationBuilder().showBanner(false).sources(Application.class).run(args);
+ }
+
+ @Override
+ public void run(final String... args) throws Exception {
+ if (containsArg("--createrollout", args)) {
+ // run the create and start rollout example
+ gettingStartedRolloutScenario.run();
+ } else {
+ // run the getting started scenario which creates a setup of
+ // distribution set and software modules to be used
+ gettingStarted.run();
+ }
+ }
+
+ @Bean
+ public BasicAuthRequestInterceptor basicAuthRequestInterceptor() {
+ return new BasicAuthRequestInterceptor(configuration.getUsername(), configuration.getPassword());
+ }
+
+ @Bean
+ public ApplicationJsonRequestHeaderInterceptor jsonHeaderInterceptor() {
+ return new ApplicationJsonRequestHeaderInterceptor();
+ }
+
+ @Bean
+ public Contract feignContract() {
+ return new IgnoreMultipleConsumersProducersSpringMvcContract();
+ }
+
+ private boolean containsArg(final String containsArg, final String... args) {
+ for (final String arg : args) {
+ if (arg.equalsIgnoreCase(containsArg)) {
+ return true;
+ }
+ }
+ return false;
+ }
+}
\ No newline at end of file
diff --git a/examples/hawkbit-mgmt-api-client/src/main/java/org/eclipse/hawkbit/mgmt/client/ApplicationJsonRequestHeaderInterceptor.java b/examples/hawkbit-mgmt-api-client/src/main/java/org/eclipse/hawkbit/mgmt/client/ApplicationJsonRequestHeaderInterceptor.java
new file mode 100644
index 000000000..75f3b0dd1
--- /dev/null
+++ b/examples/hawkbit-mgmt-api-client/src/main/java/org/eclipse/hawkbit/mgmt/client/ApplicationJsonRequestHeaderInterceptor.java
@@ -0,0 +1,28 @@
+/**
+ * Copyright (c) 2015 Bosch Software Innovations GmbH and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.eclipse.hawkbit.mgmt.client;
+
+import org.springframework.http.MediaType;
+
+import feign.RequestInterceptor;
+import feign.RequestTemplate;
+
+/**
+ * An feign request interceptor to set the defined {@code Accept} and
+ * {@code Content-Type} headers for each request to {@code application/json}.
+ */
+public class ApplicationJsonRequestHeaderInterceptor implements RequestInterceptor {
+
+ @Override
+ public void apply(final RequestTemplate template) {
+ template.header("Accept", MediaType.APPLICATION_JSON_VALUE);
+ template.header("Content-Type", MediaType.APPLICATION_JSON_VALUE);
+ }
+
+}
diff --git a/examples/hawkbit-mgmt-api-client/src/main/java/org/eclipse/hawkbit/mgmt/client/ClientConfigurationProperties.java b/examples/hawkbit-mgmt-api-client/src/main/java/org/eclipse/hawkbit/mgmt/client/ClientConfigurationProperties.java
new file mode 100644
index 000000000..6d15bcc04
--- /dev/null
+++ b/examples/hawkbit-mgmt-api-client/src/main/java/org/eclipse/hawkbit/mgmt/client/ClientConfigurationProperties.java
@@ -0,0 +1,49 @@
+/**
+ * Copyright (c) 2015 Bosch Software Innovations GmbH and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.eclipse.hawkbit.mgmt.client;
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+
+/**
+ * Configuration bean which holds the configuration of the client e.g. the base
+ * URL of the hawkbit-server and the credentials to use the RESTful Management
+ * API.
+ */
+@ConfigurationProperties(prefix = "hawkbit")
+public class ClientConfigurationProperties {
+
+ private String url = "localhost:8080";
+ private String username = "admin";
+ private String password = "admin"; // NOSONAR this password is only used for
+ // examples
+
+ public String getUrl() {
+ return url;
+ }
+
+ public void setUrl(final String url) {
+ this.url = url;
+ }
+
+ public String getUsername() {
+ return username;
+ }
+
+ public void setUsername(final String username) {
+ this.username = username;
+ }
+
+ public String getPassword() {
+ return password;
+ }
+
+ public void setPassword(final String password) {
+ this.password = password;
+ }
+}
diff --git a/examples/hawkbit-mgmt-api-client/src/main/java/org/eclipse/hawkbit/mgmt/client/IgnoreMultipleConsumersProducersSpringMvcContract.java b/examples/hawkbit-mgmt-api-client/src/main/java/org/eclipse/hawkbit/mgmt/client/IgnoreMultipleConsumersProducersSpringMvcContract.java
new file mode 100644
index 000000000..c796aa019
--- /dev/null
+++ b/examples/hawkbit-mgmt-api-client/src/main/java/org/eclipse/hawkbit/mgmt/client/IgnoreMultipleConsumersProducersSpringMvcContract.java
@@ -0,0 +1,43 @@
+/**
+ * Copyright (c) 2015 Bosch Software Innovations GmbH and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.eclipse.hawkbit.mgmt.client;
+
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Method;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.cloud.netflix.feign.support.SpringMvcContract;
+
+import feign.MethodMetadata;
+
+/**
+ * Own implementation of the {@link SpringMvcContract} which catches the
+ * {@link IllegalStateException} which occurs due multiple produces and consumes
+ * values in the request-mapping
+ * annoation.https://github.com/spring-cloud/spring-cloud-netflix/issues/808
+ */
+public class IgnoreMultipleConsumersProducersSpringMvcContract extends SpringMvcContract {
+
+ private static final Logger LOGGER = LoggerFactory
+ .getLogger(IgnoreMultipleConsumersProducersSpringMvcContract.class);
+
+ @Override
+ protected void processAnnotationOnMethod(final MethodMetadata data, final Annotation methodAnnotation,
+ final Method method) {
+ try {
+ super.processAnnotationOnMethod(data, methodAnnotation, method);
+ } catch (final IllegalStateException e) {
+ // ignore illegalstateexception here because it's thrown because of
+ // multiple consumers and produces, see
+ // https://github.com/spring-cloud/spring-cloud-netflix/issues/808
+ LOGGER.trace(e.getMessage(), e);
+ }
+ }
+}
diff --git a/examples/hawkbit-mgmt-api-client/src/main/java/org/eclipse/hawkbit/mgmt/client/resource/DistributionSetResourceClient.java b/examples/hawkbit-mgmt-api-client/src/main/java/org/eclipse/hawkbit/mgmt/client/resource/DistributionSetResourceClient.java
new file mode 100644
index 000000000..00a9b3fba
--- /dev/null
+++ b/examples/hawkbit-mgmt-api-client/src/main/java/org/eclipse/hawkbit/mgmt/client/resource/DistributionSetResourceClient.java
@@ -0,0 +1,20 @@
+/**
+ * Copyright (c) 2015 Bosch Software Innovations GmbH and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.eclipse.hawkbit.mgmt.client.resource;
+
+import org.eclipse.hawkbit.rest.resource.api.DistributionSetRestApi;
+import org.springframework.cloud.netflix.feign.FeignClient;
+
+/**
+ * Client binding for the DistributionSet resource of the management API.
+ */
+@FeignClient(url = "${hawkbit.endpoint.url:localhost:8080}/rest/v1/distributionsets")
+public interface DistributionSetResourceClient extends DistributionSetRestApi {
+
+}
diff --git a/examples/hawkbit-mgmt-api-client/src/main/java/org/eclipse/hawkbit/mgmt/client/resource/DistributionSetTagResourceClient.java b/examples/hawkbit-mgmt-api-client/src/main/java/org/eclipse/hawkbit/mgmt/client/resource/DistributionSetTagResourceClient.java
new file mode 100644
index 000000000..ea9f5d28a
--- /dev/null
+++ b/examples/hawkbit-mgmt-api-client/src/main/java/org/eclipse/hawkbit/mgmt/client/resource/DistributionSetTagResourceClient.java
@@ -0,0 +1,20 @@
+/**
+ * Copyright (c) 2015 Bosch Software Innovations GmbH and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.eclipse.hawkbit.mgmt.client.resource;
+
+import org.eclipse.hawkbit.rest.resource.api.DistributionSetTagRestApi;
+import org.springframework.cloud.netflix.feign.FeignClient;
+
+/**
+ * Client binding for the DistributionSetTag resource of the management API.
+ */
+@FeignClient(url = "${hawkbit.endpoint.url:localhost:8080}/rest/v1/distributionsettags")
+public interface DistributionSetTagResourceClient extends DistributionSetTagRestApi {
+
+}
diff --git a/examples/hawkbit-mgmt-api-client/src/main/java/org/eclipse/hawkbit/mgmt/client/resource/DistributionSetTypeResourceClient.java b/examples/hawkbit-mgmt-api-client/src/main/java/org/eclipse/hawkbit/mgmt/client/resource/DistributionSetTypeResourceClient.java
new file mode 100644
index 000000000..08d40dfa5
--- /dev/null
+++ b/examples/hawkbit-mgmt-api-client/src/main/java/org/eclipse/hawkbit/mgmt/client/resource/DistributionSetTypeResourceClient.java
@@ -0,0 +1,21 @@
+/**
+ * Copyright (c) 2015 Bosch Software Innovations GmbH and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.eclipse.hawkbit.mgmt.client.resource;
+
+import org.eclipse.hawkbit.rest.resource.api.DistributionSetTypeRestApi;
+import org.springframework.cloud.netflix.feign.FeignClient;
+
+/**
+ * Client binding for the DistributionSetType resource of the management API.
+ *
+ */
+@FeignClient(url = "${hawkbit.endpoint.url:localhost:8080}/rest/v1/distributionsettypes")
+public interface DistributionSetTypeResourceClient extends DistributionSetTypeRestApi {
+
+}
diff --git a/examples/hawkbit-mgmt-api-client/src/main/java/org/eclipse/hawkbit/mgmt/client/resource/RolloutResourceClient.java b/examples/hawkbit-mgmt-api-client/src/main/java/org/eclipse/hawkbit/mgmt/client/resource/RolloutResourceClient.java
new file mode 100644
index 000000000..78b7413e7
--- /dev/null
+++ b/examples/hawkbit-mgmt-api-client/src/main/java/org/eclipse/hawkbit/mgmt/client/resource/RolloutResourceClient.java
@@ -0,0 +1,20 @@
+/**
+ * Copyright (c) 2015 Bosch Software Innovations GmbH and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.eclipse.hawkbit.mgmt.client.resource;
+
+import org.eclipse.hawkbit.rest.resource.api.RolloutRestApi;
+import org.springframework.cloud.netflix.feign.FeignClient;
+
+/**
+ * Client binding for the Rollout resource of the management API.
+ */
+@FeignClient(url = "${hawkbit.endpoint.url:localhost:8080}/rest/v1/rollouts")
+public interface RolloutResourceClient extends RolloutRestApi {
+
+}
diff --git a/examples/hawkbit-mgmt-api-client/src/main/java/org/eclipse/hawkbit/mgmt/client/resource/SoftwareModuleResourceClient.java b/examples/hawkbit-mgmt-api-client/src/main/java/org/eclipse/hawkbit/mgmt/client/resource/SoftwareModuleResourceClient.java
new file mode 100644
index 000000000..88e664d78
--- /dev/null
+++ b/examples/hawkbit-mgmt-api-client/src/main/java/org/eclipse/hawkbit/mgmt/client/resource/SoftwareModuleResourceClient.java
@@ -0,0 +1,20 @@
+/**
+ * Copyright (c) 2015 Bosch Software Innovations GmbH and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.eclipse.hawkbit.mgmt.client.resource;
+
+import org.eclipse.hawkbit.rest.resource.api.SoftwareModuleRestAPI;
+import org.springframework.cloud.netflix.feign.FeignClient;
+
+/**
+ * Client binding for the SoftwareModule resource of the management API.
+ */
+@FeignClient(url = "${hawkbit.endpoint.url:localhost:8080}/rest/v1/softwaremodules")
+public interface SoftwareModuleResourceClient extends SoftwareModuleRestAPI {
+
+}
diff --git a/examples/hawkbit-mgmt-api-client/src/main/java/org/eclipse/hawkbit/mgmt/client/resource/SoftwareModuleTypeResourceClient.java b/examples/hawkbit-mgmt-api-client/src/main/java/org/eclipse/hawkbit/mgmt/client/resource/SoftwareModuleTypeResourceClient.java
new file mode 100644
index 000000000..4896cb8d8
--- /dev/null
+++ b/examples/hawkbit-mgmt-api-client/src/main/java/org/eclipse/hawkbit/mgmt/client/resource/SoftwareModuleTypeResourceClient.java
@@ -0,0 +1,20 @@
+/**
+ * Copyright (c) 2015 Bosch Software Innovations GmbH and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.eclipse.hawkbit.mgmt.client.resource;
+
+import org.eclipse.hawkbit.rest.resource.api.SoftwareModuleTypeRestApi;
+import org.springframework.cloud.netflix.feign.FeignClient;
+
+/**
+ * Client binding for the oftwareModuleType resource of the management API.
+ */
+@FeignClient(url = "${hawkbit.endpoint.url:localhost:8080}/rest/v1/softwaremoduletypes")
+public interface SoftwareModuleTypeResourceClient extends SoftwareModuleTypeRestApi {
+
+}
diff --git a/examples/hawkbit-mgmt-api-client/src/main/java/org/eclipse/hawkbit/mgmt/client/resource/TargetResourceClient.java b/examples/hawkbit-mgmt-api-client/src/main/java/org/eclipse/hawkbit/mgmt/client/resource/TargetResourceClient.java
new file mode 100644
index 000000000..a82aa5443
--- /dev/null
+++ b/examples/hawkbit-mgmt-api-client/src/main/java/org/eclipse/hawkbit/mgmt/client/resource/TargetResourceClient.java
@@ -0,0 +1,20 @@
+/**
+ * Copyright (c) 2015 Bosch Software Innovations GmbH and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.eclipse.hawkbit.mgmt.client.resource;
+
+import org.eclipse.hawkbit.rest.resource.api.TargetRestApi;
+import org.springframework.cloud.netflix.feign.FeignClient;
+
+/**
+ * Client binding for the Target resource of the management API.
+ */
+@FeignClient(url = "${hawkbit.endpoint.url:localhost:8080}/rest/v1/targets")
+public interface TargetResourceClient extends TargetRestApi {
+
+}
diff --git a/examples/hawkbit-mgmt-api-client/src/main/java/org/eclipse/hawkbit/mgmt/client/resource/TargetTagResourceClient.java b/examples/hawkbit-mgmt-api-client/src/main/java/org/eclipse/hawkbit/mgmt/client/resource/TargetTagResourceClient.java
new file mode 100644
index 000000000..fee30c686
--- /dev/null
+++ b/examples/hawkbit-mgmt-api-client/src/main/java/org/eclipse/hawkbit/mgmt/client/resource/TargetTagResourceClient.java
@@ -0,0 +1,20 @@
+/**
+ * Copyright (c) 2015 Bosch Software Innovations GmbH and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.eclipse.hawkbit.mgmt.client.resource;
+
+import org.eclipse.hawkbit.rest.resource.api.TargetTagRestApi;
+import org.springframework.cloud.netflix.feign.FeignClient;
+
+/**
+ * Client binding for the TargetTag resource of the management API.
+ */
+@FeignClient(url = "${hawkbit.endpoint.url:localhost:8080}/rest/v1/targettags")
+public interface TargetTagResourceClient extends TargetTagRestApi {
+
+}
diff --git a/examples/hawkbit-mgmt-api-client/src/main/java/org/eclipse/hawkbit/mgmt/client/resource/builder/DistributionSetBuilder.java b/examples/hawkbit-mgmt-api-client/src/main/java/org/eclipse/hawkbit/mgmt/client/resource/builder/DistributionSetBuilder.java
new file mode 100644
index 000000000..c821b106c
--- /dev/null
+++ b/examples/hawkbit-mgmt-api-client/src/main/java/org/eclipse/hawkbit/mgmt/client/resource/builder/DistributionSetBuilder.java
@@ -0,0 +1,99 @@
+/**
+ * Copyright (c) 2015 Bosch Software Innovations GmbH and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.eclipse.hawkbit.mgmt.client.resource.builder;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.hawkbit.rest.resource.model.distributionset.DistributionSetRequestBodyPost;
+
+import com.google.common.collect.Lists;
+
+/**
+ *
+ * Builder pattern for building {@link DistributionSetRequestBodyPost}.
+ *
+ * @author Jonathan Knoblauch
+ *
+ */
+public class DistributionSetBuilder {
+
+ private String name;
+ private String version;
+ private String type;
+
+ /**
+ * @param name
+ * the name of the distribution set
+ * @return the builder itself
+ */
+ public DistributionSetBuilder name(final String name) {
+ this.name = name;
+ return this;
+ }
+
+ /**
+ * @param version
+ * the version of the distribution set
+ * @return the builder itself
+ */
+ public DistributionSetBuilder version(final String version) {
+ this.version = version;
+ return this;
+ }
+
+ /**
+ * @param type
+ * the distribution set type name for this distribution set
+ * @return the builder itself
+ */
+ public DistributionSetBuilder type(final String type) {
+ this.type = type;
+ return this;
+ }
+
+ /**
+ * Builds a list with a single entry of
+ * {@link DistributionSetRequestBodyPost} which can directly be used to post
+ * on the RESTful-API.
+ *
+ * @return a single entry list of {@link DistributionSetRequestBodyPost}
+ */
+ public List build() {
+ return Lists.newArrayList(doBuild(name));
+ }
+
+ /**
+ * Builds a list of multiple {@link DistributionSetRequestBodyPost} to
+ * create multiple distribution sets at once. An increasing number will be
+ * added to the name of the distribution set. The version and type will
+ * remain the same.
+ *
+ * @param count
+ * the amount of distribution sets body which should be created
+ * @return a list of {@link DistributionSetRequestBodyPost}
+ */
+ public List buildAsList(final int count) {
+ final ArrayList bodyList = Lists.newArrayList();
+ for (int index = 0; index < count; index++) {
+ bodyList.add(doBuild(name + index));
+ }
+
+ return bodyList;
+ }
+
+ private DistributionSetRequestBodyPost doBuild(final String prefixName) {
+ final DistributionSetRequestBodyPost body = new DistributionSetRequestBodyPost();
+ body.setName(prefixName);
+ body.setVersion(version);
+ body.setType(type);
+ return body;
+ }
+
+}
diff --git a/examples/hawkbit-mgmt-api-client/src/main/java/org/eclipse/hawkbit/mgmt/client/resource/builder/DistributionSetTypeBuilder.java b/examples/hawkbit-mgmt-api-client/src/main/java/org/eclipse/hawkbit/mgmt/client/resource/builder/DistributionSetTypeBuilder.java
new file mode 100644
index 000000000..e1da1f048
--- /dev/null
+++ b/examples/hawkbit-mgmt-api-client/src/main/java/org/eclipse/hawkbit/mgmt/client/resource/builder/DistributionSetTypeBuilder.java
@@ -0,0 +1,124 @@
+/**
+ * Copyright (c) 2015 Bosch Software Innovations GmbH and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.eclipse.hawkbit.mgmt.client.resource.builder;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.hawkbit.rest.resource.model.distributionsettype.DistributionSetTypeRequestBodyPost;
+import org.eclipse.hawkbit.rest.resource.model.softwaremoduletype.SoftwareModuleTypeAssigmentRest;
+
+import com.google.common.collect.Lists;
+
+/**
+ *
+ * Builder pattern for building {@link DistributionSetTypeRequestBodyPost}.
+ *
+ * @author Jonathan Knoblauch
+ *
+ */
+public class DistributionSetTypeBuilder {
+
+ private String key;
+ private String name;
+ private final List mandatorymodules = Lists.newArrayList();
+ private final List optionalmodules = Lists.newArrayList();
+
+ /**
+ * @param key
+ * the key of the distribution set type
+ * @return the builder itself
+ */
+ public DistributionSetTypeBuilder key(final String key) {
+ this.key = key;
+ return this;
+ }
+
+ /**
+ * @param name
+ * the name of the distribution set type
+ * @return the builder itself
+ */
+ public DistributionSetTypeBuilder name(final String name) {
+ this.name = name;
+ return this;
+ }
+
+ /**
+ * @param softwareModuleTypeIds
+ * the IDs of the software module types which should be mandatory
+ * for the distribution set type
+ * @return the builder itself
+ */
+ public DistributionSetTypeBuilder mandatorymodules(final Long... softwareModuleTypeIds) {
+ for (final Long id : softwareModuleTypeIds) {
+ final SoftwareModuleTypeAssigmentRest softwareModuleTypeAssigmentRest = new SoftwareModuleTypeAssigmentRest();
+ softwareModuleTypeAssigmentRest.setId(id);
+ this.mandatorymodules.add(softwareModuleTypeAssigmentRest);
+ }
+ return this;
+ }
+
+ /**
+ *
+ * @param softwareModuleTypeIds
+ * the IDs of the software module types which should be optional
+ * for the distribution set type
+ * @return the builder itself
+ */
+ public DistributionSetTypeBuilder optionalmodules(final Long... softwareModuleTypeIds) {
+ for (final Long id : softwareModuleTypeIds) {
+ final SoftwareModuleTypeAssigmentRest softwareModuleTypeAssigmentRest = new SoftwareModuleTypeAssigmentRest();
+ softwareModuleTypeAssigmentRest.setId(id);
+ this.optionalmodules.add(softwareModuleTypeAssigmentRest);
+ }
+ return this;
+ }
+
+ /**
+ * Builds a list with a single entry of
+ * {@link DistributionSetTypeRequestBodyPost} which can directly be used in
+ * the RESTful-API.
+ *
+ * @return a single entry list of {@link DistributionSetTypeRequestBodyPost}
+ */
+ public List build() {
+ return Lists.newArrayList(doBuild(name, key));
+ }
+
+ /**
+ * Builds a list of multiple {@link DistributionSetTypeRequestBodyPost} to
+ * create multiple distribution set types at once. An increasing number will
+ * be added to the name and key of the distribution set type. The optional
+ * and mandatory software module types will remain the same.
+ *
+ * @param count
+ * the amount of distribution sets type body which should be
+ * created
+ * @return a list of {@link DistributionSetTypeRequestBodyPost}
+ */
+ public List buildAsList(final int count) {
+ final ArrayList bodyList = Lists.newArrayList();
+ for (int index = 0; index < count; index++) {
+ bodyList.add(doBuild(name + index, key + index));
+ }
+ return bodyList;
+
+ }
+
+ private DistributionSetTypeRequestBodyPost doBuild(final String prefixName, final String prefixKey) {
+ final DistributionSetTypeRequestBodyPost body = new DistributionSetTypeRequestBodyPost();
+ body.setKey(prefixKey);
+ body.setName(prefixName);
+ body.setMandatorymodules(mandatorymodules);
+ body.setOptionalmodules(optionalmodules);
+ return body;
+ }
+
+}
diff --git a/examples/hawkbit-mgmt-api-client/src/main/java/org/eclipse/hawkbit/mgmt/client/resource/builder/RolloutBuilder.java b/examples/hawkbit-mgmt-api-client/src/main/java/org/eclipse/hawkbit/mgmt/client/resource/builder/RolloutBuilder.java
new file mode 100644
index 000000000..bea0fd9a4
--- /dev/null
+++ b/examples/hawkbit-mgmt-api-client/src/main/java/org/eclipse/hawkbit/mgmt/client/resource/builder/RolloutBuilder.java
@@ -0,0 +1,115 @@
+/**
+ * Copyright (c) 2015 Bosch Software Innovations GmbH and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.eclipse.hawkbit.mgmt.client.resource.builder;
+
+import org.eclipse.hawkbit.rest.resource.model.rollout.RolloutCondition;
+import org.eclipse.hawkbit.rest.resource.model.rollout.RolloutCondition.Condition;
+import org.eclipse.hawkbit.rest.resource.model.rollout.RolloutRestRequestBody;
+
+/**
+ *
+ * Builder pattern for building {@link RolloutRestRequestBody}.
+ *
+ * @author Jonathan Knoblauch
+ *
+ */
+public class RolloutBuilder {
+
+ private String name;
+ private int groupSize;
+ private String targetFilterQuery;
+ private long distributionSetId;
+ private String successThreshold;
+ private String errorThreshold;
+
+ /**
+ * @param name
+ * the name of the rollout
+ * @return the builder itself
+ */
+ public RolloutBuilder name(final String name) {
+ this.name = name;
+ return this;
+ }
+
+ /**
+ * @param groupSize
+ * the amount of groups the rollout should be split into
+ * @return the builder itself
+ */
+ public RolloutBuilder groupSize(final int groupSize) {
+ this.groupSize = groupSize;
+ return this;
+ }
+
+ /**
+ * @param targetFilterQuery
+ * the FIQL query language to filter targets to contain in the
+ * rollout
+ * @return the builder itself
+ */
+ public RolloutBuilder targetFilterQuery(final String targetFilterQuery) {
+ this.targetFilterQuery = targetFilterQuery;
+ return this;
+ }
+
+ /**
+ * @param distributionSetId
+ * the ID of the distribution set to assign to the target in the
+ * rollout
+ * @return the builder itself
+ */
+ public RolloutBuilder distributionSetId(final long distributionSetId) {
+ this.distributionSetId = distributionSetId;
+ return this;
+ }
+
+ /**
+ * @param successThreshold
+ * the threshold to be used to indicate if a deployment group is
+ * successful, to trigger the success action
+ * @return the builder itself
+ */
+ public RolloutBuilder successThreshold(final String successThreshold) {
+ this.successThreshold = successThreshold;
+ return this;
+ }
+
+ /**
+ * @param errorThreshold
+ * the threshold to be used to indicate if a deployment group is
+ * failing, to trigger the error action
+ * @return the builder itself
+ */
+ public RolloutBuilder errorThreshold(final String errorThreshold) {
+ this.errorThreshold = errorThreshold;
+ return this;
+ }
+
+ /**
+ * Builds the rollout rest body to creating a rollout.
+ *
+ * @return the rest request body for creating a rollout
+ */
+ public RolloutRestRequestBody build() {
+ return doBuild();
+ }
+
+ private RolloutRestRequestBody doBuild() {
+ final RolloutRestRequestBody body = new RolloutRestRequestBody();
+ body.setName(name);
+ body.setAmountGroups(groupSize);
+ body.setTargetFilterQuery(targetFilterQuery);
+ body.setDistributionSetId(distributionSetId);
+ body.setSuccessCondition(new RolloutCondition(Condition.THRESHOLD, successThreshold));
+ body.setErrorCondition(new RolloutCondition(Condition.THRESHOLD, errorThreshold));
+ return body;
+ }
+
+}
diff --git a/examples/hawkbit-mgmt-api-client/src/main/java/org/eclipse/hawkbit/mgmt/client/resource/builder/SoftwareModuleAssigmentBuilder.java b/examples/hawkbit-mgmt-api-client/src/main/java/org/eclipse/hawkbit/mgmt/client/resource/builder/SoftwareModuleAssigmentBuilder.java
new file mode 100644
index 000000000..840f16182
--- /dev/null
+++ b/examples/hawkbit-mgmt-api-client/src/main/java/org/eclipse/hawkbit/mgmt/client/resource/builder/SoftwareModuleAssigmentBuilder.java
@@ -0,0 +1,57 @@
+/**
+ * Copyright (c) 2015 Bosch Software Innovations GmbH and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.eclipse.hawkbit.mgmt.client.resource.builder;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.hawkbit.rest.resource.model.softwaremodule.SoftwareModuleAssigmentRest;
+
+/**
+ *
+ * Builder pattern for building {@link SoftwareModuleAssigmentRest}.
+ *
+ * @author Jonathan Knoblauch
+ *
+ */
+public class SoftwareModuleAssigmentBuilder {
+
+ private final List ids;
+
+ public SoftwareModuleAssigmentBuilder() {
+ ids = new ArrayList();
+ }
+
+ /**
+ * @param id
+ * the id of the software module
+ * @return the builder itself
+ */
+ public SoftwareModuleAssigmentBuilder id(final Long id) {
+ ids.add(id);
+ return this;
+ }
+
+ /**
+ * Builds a list with a single entry of {@link SoftwareModuleAssigmentRest}
+ * which can directly be used in the RESTful-API.
+ *
+ * @return a single entry list of {@link SoftwareModuleAssigmentRest}
+ */
+ public List build() {
+ final List softwareModuleAssigmentRestList = new ArrayList<>();
+ for (final Long id : ids) {
+ final SoftwareModuleAssigmentRest softwareModuleAssigmentRest = new SoftwareModuleAssigmentRest();
+ softwareModuleAssigmentRest.setId(id);
+ softwareModuleAssigmentRestList.add(softwareModuleAssigmentRest);
+ }
+ return softwareModuleAssigmentRestList;
+ }
+
+}
diff --git a/examples/hawkbit-mgmt-api-client/src/main/java/org/eclipse/hawkbit/mgmt/client/resource/builder/SoftwareModuleBuilder.java b/examples/hawkbit-mgmt-api-client/src/main/java/org/eclipse/hawkbit/mgmt/client/resource/builder/SoftwareModuleBuilder.java
new file mode 100644
index 000000000..30b85d901
--- /dev/null
+++ b/examples/hawkbit-mgmt-api-client/src/main/java/org/eclipse/hawkbit/mgmt/client/resource/builder/SoftwareModuleBuilder.java
@@ -0,0 +1,101 @@
+/**
+ * Copyright (c) 2015 Bosch Software Innovations GmbH and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.eclipse.hawkbit.mgmt.client.resource.builder;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.hawkbit.rest.resource.model.distributionsettype.DistributionSetTypeRequestBodyPost;
+import org.eclipse.hawkbit.rest.resource.model.softwaremodule.SoftwareModuleRequestBodyPost;
+
+import com.google.common.collect.Lists;
+
+/**
+ *
+ * Builder pattern for building {@link SoftwareModuleRequestBodyPost}.
+ *
+ * @author Jonathan Knoblauch
+ *
+ */
+public class SoftwareModuleBuilder {
+
+ private String name;
+ private String version;
+ private String type;
+
+ /**
+ * @param name
+ * the name of the software module
+ * @return the builder itself
+ */
+ public SoftwareModuleBuilder name(final String name) {
+ this.name = name;
+ return this;
+ }
+
+ /**
+ * @param version
+ * the version of the software module
+ * @return the builder itsefl
+ */
+ public SoftwareModuleBuilder version(final String version) {
+ this.version = version;
+ return this;
+ }
+
+ /**
+ * @param type
+ * the key of the software module type to be used for this
+ * software module
+ * @return the builder itself
+ */
+ public SoftwareModuleBuilder type(final String type) {
+ this.type = type;
+ return this;
+ }
+
+ /**
+ * Builds a list with a single entry of
+ * {@link SoftwareModuleRequestBodyPost} which can directly be used in the
+ * RESTful-API.
+ *
+ * @return a single entry list of {@link SoftwareModuleRequestBodyPost}
+ */
+ public List build() {
+ return Lists.newArrayList(doBuild(name));
+ }
+
+ /**
+ * Builds a list of multiple {@link SoftwareModuleRequestBodyPost} to create
+ * multiple software module at once. An increasing number will be added to
+ * the name of the software module. The version and type will remain the
+ * same.
+ *
+ * @param count
+ * the amount of software module body which should be created
+ * @return a list of {@link DistributionSetTypeRequestBodyPost}
+ */
+ public List buildAsList(final int count) {
+ final ArrayList bodyList = Lists.newArrayList();
+ for (int index = 0; index < count; index++) {
+ bodyList.add(doBuild(name + index));
+ }
+
+ return bodyList;
+ }
+
+ private SoftwareModuleRequestBodyPost doBuild(final String prefixName) {
+ final SoftwareModuleRequestBodyPost body = new SoftwareModuleRequestBodyPost();
+ body.setName(prefixName);
+ body.setVersion(version);
+ body.setType(type);
+ return body;
+ }
+
+}
diff --git a/examples/hawkbit-mgmt-api-client/src/main/java/org/eclipse/hawkbit/mgmt/client/resource/builder/SoftwareModuleTypeBuilder.java b/examples/hawkbit-mgmt-api-client/src/main/java/org/eclipse/hawkbit/mgmt/client/resource/builder/SoftwareModuleTypeBuilder.java
new file mode 100644
index 000000000..ce128d592
--- /dev/null
+++ b/examples/hawkbit-mgmt-api-client/src/main/java/org/eclipse/hawkbit/mgmt/client/resource/builder/SoftwareModuleTypeBuilder.java
@@ -0,0 +1,101 @@
+/**
+ * Copyright (c) 2015 Bosch Software Innovations GmbH and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.eclipse.hawkbit.mgmt.client.resource.builder;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.hawkbit.rest.resource.model.softwaremodule.SoftwareModuleRequestBodyPost;
+import org.eclipse.hawkbit.rest.resource.model.softwaremoduletype.SoftwareModuleTypeRequestBodyPost;
+
+import com.google.common.collect.Lists;
+
+/**
+ *
+ * Builder pattern for building {@link SoftwareModuleRequestBodyPost}.
+ *
+ * @author Jonathan Knoblauch
+ *
+ */
+public class SoftwareModuleTypeBuilder {
+
+ private String key;
+ private String name;
+ private String description;
+ private int maxAssignments;
+
+ /**
+ * @param key
+ * the key of the software module type
+ * @return the builder itself
+ */
+ public SoftwareModuleTypeBuilder key(final String key) {
+ this.key = key;
+ return this;
+ }
+
+ /**
+ * @param name
+ * the name of the software module type
+ * @return the builder itself
+ */
+ public SoftwareModuleTypeBuilder name(final String name) {
+ this.name = name;
+ return this;
+ }
+
+ public SoftwareModuleTypeBuilder description(final String description) {
+ this.description = description;
+ return this;
+ }
+
+ public SoftwareModuleTypeBuilder maxAssignments(final int maxAssignments) {
+ this.maxAssignments = maxAssignments;
+ return this;
+ }
+
+ /**
+ * Builds a list with a single entry of
+ * {@link SoftwareModuleTypeRequestBodyPost} which can directly be used in
+ * the RESTful-API.
+ *
+ * @return a single entry list of {@link SoftwareModuleTypeRequestBodyPost}
+ */
+ public List build() {
+ return Lists.newArrayList(doBuild(key, name));
+ }
+
+ /**
+ * Builds a list of multiple {@link SoftwareModuleTypeRequestBodyPost} to
+ * create multiple software module types at once. An increasing number will
+ * be added to the name and key of the software module type.
+ *
+ * @param count
+ * the amount of software module type bodies which should be
+ * created
+ * @return a list of {@link SoftwareModuleTypeRequestBodyPost}
+ */
+ public List buildAsList(final int count) {
+ final ArrayList bodyList = Lists.newArrayList();
+ for (int index = 0; index < count; index++) {
+ bodyList.add(doBuild(key + index, name + index));
+ }
+ return bodyList;
+ }
+
+ private SoftwareModuleTypeRequestBodyPost doBuild(final String prefixKey, final String prefixName) {
+ final SoftwareModuleTypeRequestBodyPost body = new SoftwareModuleTypeRequestBodyPost();
+ body.setKey(prefixKey);
+ body.setName(prefixName);
+ body.setDescription(description);
+ body.setMaxAssignments(maxAssignments);
+ return body;
+ }
+
+}
\ No newline at end of file
diff --git a/examples/hawkbit-mgmt-api-client/src/main/java/org/eclipse/hawkbit/mgmt/client/resource/builder/TagBuilder.java b/examples/hawkbit-mgmt-api-client/src/main/java/org/eclipse/hawkbit/mgmt/client/resource/builder/TagBuilder.java
new file mode 100644
index 000000000..f3888de54
--- /dev/null
+++ b/examples/hawkbit-mgmt-api-client/src/main/java/org/eclipse/hawkbit/mgmt/client/resource/builder/TagBuilder.java
@@ -0,0 +1,96 @@
+/**
+ * Copyright (c) 2015 Bosch Software Innovations GmbH and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.eclipse.hawkbit.mgmt.client.resource.builder;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.hawkbit.rest.resource.model.tag.TagRequestBodyPut;
+
+import com.google.common.collect.Lists;
+
+/**
+ * Builder pattern for building {@link TagRequestBodyPut}.
+ *
+ * @author Jonathan Knoblauch
+ *
+ */
+public class TagBuilder {
+
+ private String name;
+ private String description;
+ private String color;
+
+ /**
+ * @param name
+ * the name of the tag
+ * @return the builder itself
+ */
+ public TagBuilder name(final String name) {
+ this.name = name;
+ return this;
+ }
+
+ /**
+ * @param description
+ * the description of the tag
+ * @return the builder itself
+ */
+ public TagBuilder description(final String description) {
+ this.description = description;
+ return this;
+ }
+
+ /**
+ * @param color
+ * the colour of the tag
+ * @return the builder itself
+ */
+ public TagBuilder color(final String color) {
+ this.color = color;
+ return this;
+ }
+
+ /**
+ * Builds a list with a single entry of {@link TagRequestBodyPut} which can
+ * directly be used in the RESTful-API.
+ *
+ * @return a single entry list of {@link TagRequestBodyPut}
+ */
+ public List build() {
+ return Lists.newArrayList(doBuild(name));
+ }
+
+ /**
+ * Builds a list of multiple {@link TagRequestBodyPut} to create multiple
+ * tags at once. An increasing number will be added to the name of the tag.
+ * The color and description will remain the same.
+ *
+ * @param count
+ * the amount of distribution sets body which should be created
+ * @return a list of {@link TagRequestBodyPut}
+ */
+ public List buildAsList(final int count) {
+ final ArrayList bodyList = Lists.newArrayList();
+ for (int index = 0; index < count; index++) {
+ bodyList.add(doBuild(name + index));
+ }
+
+ return bodyList;
+ }
+
+ private TagRequestBodyPut doBuild(final String prefixName) {
+ final TagRequestBodyPut body = new TagRequestBodyPut();
+ body.setName(prefixName);
+ body.setDescription(description);
+ body.setColour(color);
+ return body;
+ }
+
+}
diff --git a/examples/hawkbit-mgmt-api-client/src/main/java/org/eclipse/hawkbit/mgmt/client/resource/builder/TargetBuilder.java b/examples/hawkbit-mgmt-api-client/src/main/java/org/eclipse/hawkbit/mgmt/client/resource/builder/TargetBuilder.java
new file mode 100644
index 000000000..5123903d9
--- /dev/null
+++ b/examples/hawkbit-mgmt-api-client/src/main/java/org/eclipse/hawkbit/mgmt/client/resource/builder/TargetBuilder.java
@@ -0,0 +1,98 @@
+/**
+ * Copyright (c) 2015 Bosch Software Innovations GmbH and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.eclipse.hawkbit.mgmt.client.resource.builder;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.hawkbit.rest.resource.model.softwaremoduletype.SoftwareModuleTypeRequestBodyPost;
+import org.eclipse.hawkbit.rest.resource.model.target.TargetRequestBody;
+
+import com.google.common.collect.Lists;
+
+/**
+ *
+ * Builder pattern for building {@link TargetRequestBody}.
+ *
+ * @author Jonathan Knoblauch
+ *
+ */
+public class TargetBuilder {
+
+ private String controllerId;
+ private String name;
+ private String description;
+
+ /**
+ * @param controllerId
+ * the ID of the controller/target
+ * @return the builder itself
+ */
+ public TargetBuilder controllerId(final String controllerId) {
+ this.controllerId = controllerId;
+ return this;
+ }
+
+ /**
+ * @param name
+ * the name of the target
+ * @return the builder itself
+ */
+ public TargetBuilder name(final String name) {
+ this.name = name;
+ return this;
+ }
+
+ /**
+ * @param description
+ * the description of the target
+ * @return the builder itself
+ */
+ public TargetBuilder description(final String description) {
+ this.description = description;
+ return this;
+ }
+
+ /**
+ * Builds a list with a single entry of {@link TargetRequestBody} which can
+ * directly be used in the RESTful-API.
+ *
+ * @return a single entry list of {@link TargetRequestBody}
+ */
+ public List build() {
+ return Lists.newArrayList(doBuild(controllerId));
+ }
+
+ /**
+ * Builds a list of multiple {@link TargetRequestBody} to create multiple
+ * targets at once. An increasing number will be added to the controllerId
+ * of the target. The name and description will remain.
+ *
+ * @param count
+ * the amount of software module type bodies which should be
+ * created
+ * @return a list of {@link SoftwareModuleTypeRequestBodyPost}
+ */
+ public List buildAsList(final int count) {
+ final ArrayList bodyList = Lists.newArrayList();
+ for (int index = 0; index < count; index++) {
+ bodyList.add(doBuild(controllerId + index));
+ }
+ return bodyList;
+ }
+
+ private TargetRequestBody doBuild(final String prefixControllerId) {
+ final TargetRequestBody body = new TargetRequestBody();
+ body.setControllerId(prefixControllerId);
+ body.setName(name);
+ body.setDescription(description);
+ return body;
+ }
+
+}
diff --git a/examples/hawkbit-mgmt-api-client/src/main/java/org/eclipse/hawkbit/mgmt/client/scenarios/CreateStartedRolloutExample.java b/examples/hawkbit-mgmt-api-client/src/main/java/org/eclipse/hawkbit/mgmt/client/scenarios/CreateStartedRolloutExample.java
new file mode 100644
index 000000000..35b0f31ea
--- /dev/null
+++ b/examples/hawkbit-mgmt-api-client/src/main/java/org/eclipse/hawkbit/mgmt/client/scenarios/CreateStartedRolloutExample.java
@@ -0,0 +1,107 @@
+/**
+ * Copyright (c) 2015 Bosch Software Innovations GmbH and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.eclipse.hawkbit.mgmt.client.scenarios;
+
+import org.eclipse.hawkbit.mgmt.client.resource.DistributionSetResourceClient;
+import org.eclipse.hawkbit.mgmt.client.resource.DistributionSetTypeResourceClient;
+import org.eclipse.hawkbit.mgmt.client.resource.RolloutResourceClient;
+import org.eclipse.hawkbit.mgmt.client.resource.SoftwareModuleResourceClient;
+import org.eclipse.hawkbit.mgmt.client.resource.SoftwareModuleTypeResourceClient;
+import org.eclipse.hawkbit.mgmt.client.resource.TargetResourceClient;
+import org.eclipse.hawkbit.mgmt.client.resource.builder.DistributionSetBuilder;
+import org.eclipse.hawkbit.mgmt.client.resource.builder.DistributionSetTypeBuilder;
+import org.eclipse.hawkbit.mgmt.client.resource.builder.RolloutBuilder;
+import org.eclipse.hawkbit.mgmt.client.resource.builder.SoftwareModuleAssigmentBuilder;
+import org.eclipse.hawkbit.mgmt.client.resource.builder.SoftwareModuleBuilder;
+import org.eclipse.hawkbit.mgmt.client.resource.builder.SoftwareModuleTypeBuilder;
+import org.eclipse.hawkbit.mgmt.client.resource.builder.TargetBuilder;
+import org.eclipse.hawkbit.rest.resource.model.distributionset.DistributionSetsRest;
+import org.eclipse.hawkbit.rest.resource.model.rollout.RolloutResponseBody;
+import org.eclipse.hawkbit.rest.resource.model.softwaremodule.SoftwareModulesRest;
+import org.eclipse.hawkbit.rest.resource.model.softwaremoduletype.SoftwareModuleTypesRest;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+/**
+ * Example for creating and starting a Rollout.
+ *
+ */
+@Component
+public class CreateStartedRolloutExample {
+
+ /* known software module type name and key */
+ private static final String SM_MODULE_TYPE = "firmware";
+
+ /* known distribution set type name and key */
+ private static final String DS_MODULE_TYPE = "firmware";
+
+ @Autowired
+ private DistributionSetResourceClient distributionSetResource;
+
+ @Autowired
+ private SoftwareModuleResourceClient softwareModuleResource;
+
+ @Autowired
+ private TargetResourceClient targetResource;
+
+ @Autowired
+ private RolloutResourceClient rolloutResource;
+
+ @Autowired
+ private DistributionSetTypeResourceClient distributionSetTypeResource;
+
+ @Autowired
+ private SoftwareModuleTypeResourceClient softwareModuleTypeResource;
+
+ /**
+ * Run the Rollout scenario.
+ */
+ public void run() {
+
+ // create three SoftwareModuleTypes
+ final SoftwareModuleTypesRest createdSoftwareModuleTypes = softwareModuleTypeResource.createSoftwareModuleTypes(
+ new SoftwareModuleTypeBuilder().key(SM_MODULE_TYPE).name(SM_MODULE_TYPE).maxAssignments(1).build())
+ .getBody();
+
+ // create one DistributionSetType
+ distributionSetTypeResource.createDistributionSetTypes(new DistributionSetTypeBuilder().key(DS_MODULE_TYPE)
+ .name(DS_MODULE_TYPE).mandatorymodules(createdSoftwareModuleTypes.get(0).getModuleId()).build())
+ .getBody();
+
+ // create one DistributionSet
+ final DistributionSetsRest distributionSetsRest = distributionSetResource.createDistributionSets(
+ new DistributionSetBuilder().name("rollout-example").version("1.0.0").type(DS_MODULE_TYPE).build())
+ .getBody();
+
+ // create three SoftwareModules
+ final SoftwareModulesRest softwareModulesRest = softwareModuleResource
+ .createSoftwareModules(
+ new SoftwareModuleBuilder().name("firmware").version("1.0.0").type(SM_MODULE_TYPE).build())
+ .getBody();
+
+ // Assign SoftwareModule to DistributionSet
+ distributionSetResource.assignSoftwareModules(distributionSetsRest.get(0).getDsId(),
+ new SoftwareModuleAssigmentBuilder().id(softwareModulesRest.get(0).getModuleId()).build());
+
+ // create ten targets
+ targetResource.createTargets(new TargetBuilder().controllerId("00-FF-AA-0").name("00-FF-AA-0")
+ .description("Targets used for rollout example").buildAsList(10));
+
+ // create a Rollout
+ final RolloutResponseBody rolloutResponseBody = rolloutResource
+ .create(new RolloutBuilder().name("MyRollout").groupSize(2).targetFilterQuery("name==00-FF-AA-0*")
+ .distributionSetId(distributionSetsRest.get(0).getDsId()).successThreshold("80")
+ .errorThreshold("50").build())
+ .getBody();
+
+ // start the created Rollout
+ rolloutResource.start(rolloutResponseBody.getRolloutId(), false);
+ }
+
+}
diff --git a/examples/hawkbit-mgmt-api-client/src/main/java/org/eclipse/hawkbit/mgmt/client/scenarios/GettingStartedDefaultScenario.java b/examples/hawkbit-mgmt-api-client/src/main/java/org/eclipse/hawkbit/mgmt/client/scenarios/GettingStartedDefaultScenario.java
new file mode 100644
index 000000000..5767ab9e7
--- /dev/null
+++ b/examples/hawkbit-mgmt-api-client/src/main/java/org/eclipse/hawkbit/mgmt/client/scenarios/GettingStartedDefaultScenario.java
@@ -0,0 +1,134 @@
+/**
+ * Copyright (c) 2015 Bosch Software Innovations GmbH and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.eclipse.hawkbit.mgmt.client.scenarios;
+
+import org.eclipse.hawkbit.mgmt.client.resource.DistributionSetResourceClient;
+import org.eclipse.hawkbit.mgmt.client.resource.DistributionSetTypeResourceClient;
+import org.eclipse.hawkbit.mgmt.client.resource.SoftwareModuleResourceClient;
+import org.eclipse.hawkbit.mgmt.client.resource.SoftwareModuleTypeResourceClient;
+import org.eclipse.hawkbit.mgmt.client.resource.builder.DistributionSetBuilder;
+import org.eclipse.hawkbit.mgmt.client.resource.builder.DistributionSetTypeBuilder;
+import org.eclipse.hawkbit.mgmt.client.resource.builder.SoftwareModuleAssigmentBuilder;
+import org.eclipse.hawkbit.mgmt.client.resource.builder.SoftwareModuleBuilder;
+import org.eclipse.hawkbit.mgmt.client.resource.builder.SoftwareModuleTypeBuilder;
+import org.eclipse.hawkbit.rest.resource.model.distributionset.DistributionSetsRest;
+import org.eclipse.hawkbit.rest.resource.model.softwaremodule.SoftwareModulesRest;
+import org.eclipse.hawkbit.rest.resource.model.softwaremoduletype.SoftwareModuleTypesRest;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+/**
+ *
+ * Default getting started scenario.
+ *
+ */
+@Component
+public class GettingStartedDefaultScenario {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(GettingStartedDefaultScenario.class);
+
+ /* known software module type name and key */
+ private static final String SM_MODULE_TYPE = "gettingstarted";
+
+ /* known distribution set type name and key */
+ private static final String DS_MODULE_TYPE = "gettingstarted";
+
+ /* known distribution name of this getting started example */
+ private static final String SM_EXAMPLE_NAME = "gettingstarted-example";
+
+ /* known distribution name of this getting started example */
+ private static final String DS_EXAMPLE_NAME = "gettingstarted-example";
+
+ @Autowired
+ private DistributionSetResourceClient distributionSetResource;
+
+ @Autowired
+ private DistributionSetTypeResourceClient distributionSetTypeResource;
+
+ @Autowired
+ private SoftwareModuleResourceClient softwareModuleResource;
+
+ @Autowired
+ private SoftwareModuleTypeResourceClient softwareModuleTypeResource;
+
+ /**
+ * Run the default getting started scenario.
+ */
+ public void run() {
+
+ LOGGER.info("Running Getting-Started-Scenario...");
+
+ // create one SoftwareModuleTypes
+ LOGGER.info("Creating software module type {}", SM_MODULE_TYPE);
+ final SoftwareModuleTypesRest createdSoftwareModuleTypes = softwareModuleTypeResource.createSoftwareModuleTypes(
+ new SoftwareModuleTypeBuilder().key(SM_MODULE_TYPE).name(SM_MODULE_TYPE).maxAssignments(1).build())
+ .getBody();
+
+ // create one DistributionSetType
+ LOGGER.info("Creating distribution set type {}", DS_MODULE_TYPE);
+ distributionSetTypeResource.createDistributionSetTypes(new DistributionSetTypeBuilder().key(DS_MODULE_TYPE)
+ .name(DS_MODULE_TYPE).mandatorymodules(createdSoftwareModuleTypes.get(0).getModuleId()).build());
+
+ // create three DistributionSet
+ final String dsVersion1 = "1.0.0";
+ final String dsVersion2 = "2.0.0";
+ final String dsVersion3 = "2.1.0";
+
+ LOGGER.info("Creating distribution set {}:{}", DS_EXAMPLE_NAME, dsVersion1);
+ final DistributionSetsRest distributionSetsRest1 = distributionSetResource.createDistributionSets(
+ new DistributionSetBuilder().name(DS_EXAMPLE_NAME).version(dsVersion1).type(DS_MODULE_TYPE).build())
+ .getBody();
+
+ LOGGER.info("Creating distribution set {}:{}", DS_EXAMPLE_NAME, dsVersion2);
+ final DistributionSetsRest distributionSetsRest2 = distributionSetResource.createDistributionSets(
+ new DistributionSetBuilder().name(DS_EXAMPLE_NAME).version(dsVersion2).type(DS_MODULE_TYPE).build())
+ .getBody();
+
+ LOGGER.info("Creating distribution set {}:{}", DS_EXAMPLE_NAME, dsVersion3);
+ final DistributionSetsRest distributionSetsRest3 = distributionSetResource.createDistributionSets(
+ new DistributionSetBuilder().name(DS_EXAMPLE_NAME).version(dsVersion3).type(DS_MODULE_TYPE).build())
+ .getBody();
+
+ // create three SoftwareModules
+ final String swVersion1 = "1";
+ final String swVersion2 = "2";
+ final String swVersion3 = "3";
+
+ LOGGER.info("Creating distribution set {}:{}", SM_EXAMPLE_NAME, swVersion1);
+ final SoftwareModulesRest softwareModulesRest1 = softwareModuleResource.createSoftwareModules(
+ new SoftwareModuleBuilder().name(SM_EXAMPLE_NAME).version(swVersion1).type(SM_MODULE_TYPE).build())
+ .getBody();
+ LOGGER.info("Creating distribution set {}:{}", SM_EXAMPLE_NAME, swVersion2);
+ final SoftwareModulesRest softwareModulesRest2 = softwareModuleResource.createSoftwareModules(
+ new SoftwareModuleBuilder().name(SM_EXAMPLE_NAME).version(swVersion2).type(SM_MODULE_TYPE).build())
+ .getBody();
+ LOGGER.info("Creating distribution set {}:{}", SM_EXAMPLE_NAME, swVersion3);
+ final SoftwareModulesRest softwareModulesRest3 = softwareModuleResource.createSoftwareModules(
+ new SoftwareModuleBuilder().name(SM_EXAMPLE_NAME).version(swVersion3).type(SM_MODULE_TYPE).build())
+ .getBody();
+
+ // Assign SoftwareModules to DistributionSet
+ LOGGER.info("Assign software module {}:{} to distribution set {}:{}", SM_EXAMPLE_NAME, swVersion1,
+ DS_EXAMPLE_NAME, dsVersion1);
+ distributionSetResource.assignSoftwareModules(distributionSetsRest1.get(0).getDsId(),
+ new SoftwareModuleAssigmentBuilder().id(softwareModulesRest1.get(0).getModuleId()).build());
+
+ LOGGER.info("Assign software module {}:{} to distribution set {}:{}", SM_EXAMPLE_NAME, swVersion2,
+ DS_EXAMPLE_NAME, dsVersion2);
+ distributionSetResource.assignSoftwareModules(distributionSetsRest2.get(0).getDsId(),
+ new SoftwareModuleAssigmentBuilder().id(softwareModulesRest2.get(0).getModuleId()).build());
+
+ LOGGER.info("Assign software module {}:{} to distribution set {}:{}", SM_EXAMPLE_NAME, swVersion3,
+ DS_EXAMPLE_NAME, dsVersion3);
+ distributionSetResource.assignSoftwareModules(distributionSetsRest3.get(0).getDsId(),
+ new SoftwareModuleAssigmentBuilder().id(softwareModulesRest3.get(0).getModuleId()).build());
+ }
+}
diff --git a/examples/hawkbit-mgmt-api-client/src/main/resources/application.properties b/examples/hawkbit-mgmt-api-client/src/main/resources/application.properties
new file mode 100644
index 000000000..da0aa79dd
--- /dev/null
+++ b/examples/hawkbit-mgmt-api-client/src/main/resources/application.properties
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2015 Bosch Software Innovations GmbH and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# which accompanies this distribution, and is available at
+# http://www.eclipse.org/legal/epl-v10.html
+#
+
+hawkbit.url=localhost:8080
+hawkbit.username=admin
+hawkbit.password=admin
+
+spring.main.banner-mode=OFF
\ No newline at end of file
diff --git a/examples/hawkbit-mgmt-api-client/src/main/resources/logback.xml b/examples/hawkbit-mgmt-api-client/src/main/resources/logback.xml
new file mode 100644
index 000000000..819566e0f
--- /dev/null
+++ b/examples/hawkbit-mgmt-api-client/src/main/resources/logback.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+ %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/examples/hawkbit-mgmt-api-client/src/test/java/org/eclipse/hawkbit/mgmt/api/client/DistributionSetTagTest.java b/examples/hawkbit-mgmt-api-client/src/test/java/org/eclipse/hawkbit/mgmt/api/client/DistributionSetTagTest.java
deleted file mode 100644
index 17384c211..000000000
--- a/examples/hawkbit-mgmt-api-client/src/test/java/org/eclipse/hawkbit/mgmt/api/client/DistributionSetTagTest.java
+++ /dev/null
@@ -1,186 +0,0 @@
-/**
- * Copyright (c) 2015 Bosch Software Innovations GmbH and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- */
-package org.eclipse.hawkbit.mgmt.api.client;
-
-import static org.fest.assertions.api.Assertions.assertThat;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.hawkbit.app.Start;
-import org.eclipse.hawkbit.rest.resource.model.distributionset.DistributionSetRequestBodyPost;
-import org.eclipse.hawkbit.rest.resource.model.distributionset.DistributionSetRest;
-import org.eclipse.hawkbit.rest.resource.model.distributionset.DistributionSetsRest;
-import org.eclipse.hawkbit.rest.resource.model.tag.AssignedDistributionSetRequestBody;
-import org.eclipse.hawkbit.rest.resource.model.tag.DistributionSetTagAssigmentResultRest;
-import org.eclipse.hawkbit.rest.resource.model.tag.TagRequestBodyPut;
-import org.eclipse.hawkbit.rest.resource.model.tag.TagRest;
-import org.eclipse.hawkbit.rest.resource.model.tag.TagsRest;
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.Ignore;
-import org.junit.Test;
-import org.springframework.boot.SpringApplication;
-import org.springframework.context.annotation.Description;
-
-import ru.yandex.qatools.allure.annotations.Features;
-import ru.yandex.qatools.allure.annotations.Stories;
-import feign.Feign;
-import feign.Logger;
-import feign.auth.BasicAuthRequestInterceptor;
-import feign.jackson.JacksonDecoder;
-import feign.jackson.JacksonEncoder;
-
-@Features("Example Tests - Management RESTful API Client")
-@Stories("DistrubutionSet Tag Resource")
-public class DistributionSetTagTest {
-
- private DistrubutionSetTagResource distrubutionSetTagResource;
-
- private static List assignedTargetRequestBodies;
-
- @BeforeClass
- public static void startupServer() {
- SpringApplication.run(Start.class, new String[0]);
- createTargetsAssignment();
- assignedTargetRequestBodies.add(new AssignedDistributionSetRequestBody().setDistributionSetId(100L));
- }
-
- @Before
- public void setup() {
- this.distrubutionSetTagResource = createDistrubutionSetTagResource();
- }
-
- // disabled as this runs not on CI environments.
- @Test
- @Description("Simple request of distrubutionset tag by ID")
- @Ignore
- public void getDistributionSetTag() {
- final TagsRest result = createDistributionSetTags(2);
-
- assertThat(distrubutionSetTagResource.getDistributionSetTag(result.get(0).getTagId()).getName()).isEqualTo(
- "Tag0");
-
- deleteDistributionSets(result);
- }
-
- // disabled as this runs not on CI environments.
- @Test
- @Description("Simple update of a distrubutionset tag")
- @Ignore
- public void updateDistributionSetTag() {
- final TagsRest created = createDistributionSetTags(10);
-
- distrubutionSetTagResource.updateDistributionSetTag(created.get(0).getTagId(), new TagRequestBodyPut()
- .setDescription("Test").setName("Test").setColour("Green"));
-
- final TagRest targetTag = distrubutionSetTagResource.getDistributionSetTag(created.get(0).getTagId());
- assertThat(targetTag.getName()).isEqualTo("Test");
- assertThat(targetTag.getDescription()).isEqualTo("Test");
- assertThat(targetTag.getColour()).isEqualTo("Green");
-
- deleteDistributionSets(created);
- }
-
- // disabled as this runs not on CI environments.
- @Test
- @Description("Simple request of all assigned distrubutionsets by a distrubutionset tag.")
- @Ignore
- public void getDistributionSetByTagId() {
- final TagsRest created = createDistributionSetTags(10);
- distrubutionSetTagResource.assignDistributionSets(created.get(2).getTagId(), assignedTargetRequestBodies);
-
- final DistributionSetsRest distributionSetsRest = distrubutionSetTagResource
- .getAssignedDistributionSets(created.get(2).getTagId());
- assertThat(distributionSetsRest).hasSize(5);
-
- distrubutionSetTagResource.unassignDistributionSets(created.get(2).getTagId());
- deleteDistributionSets(created);
- }
-
- @Test
- @Description("Toggle request to unassigned all assigned distrubutionset and assign all unassigned distrubutionset.")
- @Ignore
- public void toggleTagAssignment() {
- final TagsRest created = createDistributionSetTags(10);
- final Long id = created.get(2).getTagId();
-
- distrubutionSetTagResource.assignDistributionSets(id, assignedTargetRequestBodies);
- distrubutionSetTagResource.unassignDistributionSet(id, assignedTargetRequestBodies.get(0)
- .getDistributionSetId());
-
- DistributionSetTagAssigmentResultRest assigmentResultRest = distrubutionSetTagResource.toggleTagAssignment(id,
- assignedTargetRequestBodies);
-
- final TagRest targetTag = distrubutionSetTagResource.getDistributionSetTag(created.get(2).getTagId());
- assertThat(assigmentResultRest.getAssignedDistributionSets()).hasSize(1);
- assertThat(assigmentResultRest.getUnassignedDistributionSets()).hasSize(0);
-
- assigmentResultRest = distrubutionSetTagResource.toggleTagAssignment(id, assignedTargetRequestBodies);
- assertThat(assigmentResultRest.getAssignedDistributionSets()).hasSize(0);
- assertThat(assigmentResultRest.getUnassignedDistributionSets()).hasSize(5);
-
- distrubutionSetTagResource.unassignDistributionSets(targetTag.getTagId());
- deleteDistributionSets(created);
- }
-
- private void deleteDistributionSets(final List tags) {
- for (final TagRest tag : tags) {
- distrubutionSetTagResource.deleteDistributionSetTag(tag.getTagId());
- }
- }
-
- private TagsRest createDistributionSetTags(final int number) {
-
- final List tags = new ArrayList<>();
- for (int i = 0; i < number; i++) {
- tags.add(new TagRequestBodyPut().setDescription("Tag " + i).setName("Tag" + i).setColour("Red"));
- }
-
- final TagsRest result = distrubutionSetTagResource.createDistributionSetTags(tags);
-
- assertThat(result).hasSize(number);
- return result;
- }
-
- private DistrubutionSetTagResource createDistrubutionSetTagResource() {
- final DistrubutionSetTagResource distrubutionSetTagResource = Feign.builder().logger(new Logger.ErrorLogger())
- .logLevel(Logger.Level.BASIC).decoder(new JacksonDecoder()).encoder(new JacksonEncoder())
- .requestInterceptor(new BasicAuthRequestInterceptor("admin", "admin"))
- .target(DistrubutionSetTagResource.class, "http://localhost:8080");
- return distrubutionSetTagResource;
- }
-
- private static void createTargetsAssignment() {
-
- final List sets = new ArrayList<>();
- assignedTargetRequestBodies = new ArrayList<>();
- for (int i = 0; i < 5; i++) {
- final DistributionSetRequestBodyPost bodyPost = (DistributionSetRequestBodyPost) new DistributionSetRequestBodyPost()
- .setName("Ds" + i).setDescription("Ds" + i).setVersion("" + i);
- sets.add(bodyPost);
- }
-
- final DistributionSetsRest result = createDistributionSetResource().createDistributionSets(sets);
- for (final DistributionSetRest rest : result) {
- assignedTargetRequestBodies.add(new AssignedDistributionSetRequestBody().setDistributionSetId(rest
- .getDsId()));
- }
-
- }
-
- private static DistributionSetResource createDistributionSetResource() {
- final DistributionSetResource distributionSetResource = Feign.builder().logger(new Logger.ErrorLogger())
- .logLevel(Logger.Level.BASIC).decoder(new JacksonDecoder()).encoder(new JacksonEncoder())
- .requestInterceptor(new BasicAuthRequestInterceptor("admin", "admin"))
- .target(DistributionSetResource.class, "http://localhost:8080");
- return distributionSetResource;
- }
-
-}
diff --git a/examples/hawkbit-mgmt-api-client/src/test/java/org/eclipse/hawkbit/mgmt/api/client/TargetTagTest.java b/examples/hawkbit-mgmt-api-client/src/test/java/org/eclipse/hawkbit/mgmt/api/client/TargetTagTest.java
deleted file mode 100644
index 10f18b704..000000000
--- a/examples/hawkbit-mgmt-api-client/src/test/java/org/eclipse/hawkbit/mgmt/api/client/TargetTagTest.java
+++ /dev/null
@@ -1,182 +0,0 @@
-/**
- * Copyright (c) 2015 Bosch Software Innovations GmbH and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- */
-package org.eclipse.hawkbit.mgmt.api.client;
-
-import static org.fest.assertions.api.Assertions.assertThat;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.hawkbit.app.Start;
-import org.eclipse.hawkbit.rest.resource.model.tag.AssignedTargetRequestBody;
-import org.eclipse.hawkbit.rest.resource.model.tag.TagRequestBodyPut;
-import org.eclipse.hawkbit.rest.resource.model.tag.TagRest;
-import org.eclipse.hawkbit.rest.resource.model.tag.TagsRest;
-import org.eclipse.hawkbit.rest.resource.model.tag.TargetTagAssigmentResultRest;
-import org.eclipse.hawkbit.rest.resource.model.target.TargetRequestBody;
-import org.eclipse.hawkbit.rest.resource.model.target.TargetRest;
-import org.eclipse.hawkbit.rest.resource.model.target.TargetsRest;
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.Ignore;
-import org.junit.Test;
-import org.springframework.boot.SpringApplication;
-import org.springframework.context.annotation.Description;
-
-import ru.yandex.qatools.allure.annotations.Features;
-import ru.yandex.qatools.allure.annotations.Stories;
-import feign.Feign;
-import feign.Logger;
-import feign.auth.BasicAuthRequestInterceptor;
-import feign.jackson.JacksonDecoder;
-import feign.jackson.JacksonEncoder;
-
-@Features("Example Tests - Management RESTful API Client")
-@Stories("Target Tag Resource")
-public class TargetTagTest {
-
- private TargetTagResource targetTagResource;
-
- private static List assignedTargetRequestBodies;
-
- @BeforeClass
- public static void startupServer() {
- SpringApplication.run(Start.class, new String[0]);
- createTargetsAssignment();
- assignedTargetRequestBodies.add(new AssignedTargetRequestBody().setControllerId("NotExist"));
- }
-
- @Before
- public void setup() {
- this.targetTagResource = createTargetTagResource();
- }
-
- // disabled as this runs not on CI environments.
- @Test
- @Description("Simple request of target tag by ID")
- @Ignore
- public void getTargetTag() {
- final TagsRest result = createTargetTags(2);
-
- assertThat(targetTagResource.getTargetTag(result.get(0).getTagId()).getName()).isEqualTo("Tag0");
-
- deleteTargets(result);
- }
-
- // disabled as this runs not on CI environments.
- @Test
- @Description("Simple update of a target tag")
- @Ignore
- public void updateTargetTag() {
- final TagsRest created = createTargetTags(10);
-
- targetTagResource.updateTagretTag(created.get(0).getTagId(), new TagRequestBodyPut().setDescription("Test")
- .setName("Test").setColour("Green"));
-
- final TagRest targetTag = targetTagResource.getTargetTag(created.get(0).getTagId());
- assertThat(targetTag.getName()).isEqualTo("Test");
- assertThat(targetTag.getDescription()).isEqualTo("Test");
- assertThat(targetTag.getColour()).isEqualTo("Green");
-
- deleteTargets(created);
- }
-
- // disabled as this runs not on CI environments.
- @Test
- @Description("Simple request of all assigned targets by a target tag.")
- @Ignore
- public void getTargetsByTargetTagId() {
- final TagsRest created = createTargetTags(10);
- final Long tagId = created.get(2).getTagId();
- targetTagResource.assignTargets(tagId, assignedTargetRequestBodies);
-
- final TagRest targetTag = targetTagResource.getTargetTag(tagId);
- assertThat(targetTagResource.getAssignedTargets(tagId)).hasSize(5);
-
- targetTagResource.unassignTargets(targetTag.getTagId());
- deleteTargets(created);
- }
-
- @Test
- @Description("Toggle request to unassigned all assigned targets and assign all unassigned targets.")
- @Ignore
- public void toggleTagAssignment() {
- final TagsRest created = createTargetTags(10);
- final Long id = created.get(2).getTagId();
-
- targetTagResource.assignTargets(id, assignedTargetRequestBodies);
- targetTagResource.unassignTarget(id, assignedTargetRequestBodies.get(0).getControllerId());
-
- TargetTagAssigmentResultRest assigmentResultRest = targetTagResource.toggleTagAssignment(id,
- assignedTargetRequestBodies);
-
- final TagRest targetTag = targetTagResource.getTargetTag(created.get(2).getTagId());
- assertThat(assigmentResultRest.getAssignedTargets()).hasSize(1);
- assertThat(assigmentResultRest.getUnassignedTargets()).hasSize(0);
-
- assigmentResultRest = targetTagResource.toggleTagAssignment(id, assignedTargetRequestBodies);
- assertThat(assigmentResultRest.getAssignedTargets()).hasSize(0);
- assertThat(assigmentResultRest.getUnassignedTargets()).hasSize(5);
-
- targetTagResource.unassignTargets(targetTag.getTagId());
- deleteTargets(created);
- }
-
- private void deleteTargets(final List tags) {
- for (final TagRest tag : tags) {
- targetTagResource.deleteTargetTag(tag.getTagId());
- }
- }
-
- private TagsRest createTargetTags(final int number) {
-
- final List tags = new ArrayList<>();
- for (int i = 0; i < number; i++) {
- tags.add(new TagRequestBodyPut().setDescription("Tag " + i).setName("Tag" + i).setColour("Red"));
- }
-
- final TagsRest result = targetTagResource.createTargetTag(tags);
-
- assertThat(result).hasSize(number);
- return result;
- }
-
- private TargetTagResource createTargetTagResource() {
- final TargetTagResource targetResource = Feign.builder().logger(new Logger.ErrorLogger())
- .logLevel(Logger.Level.BASIC).decoder(new JacksonDecoder()).encoder(new JacksonEncoder())
- .requestInterceptor(new BasicAuthRequestInterceptor("admin", "admin"))
- .target(TargetTagResource.class, "http://localhost:8080");
- return targetResource;
- }
-
- private static void createTargetsAssignment() {
-
- final List targets = new ArrayList<>();
- assignedTargetRequestBodies = new ArrayList<>();
- for (int i = 0; i < 5; i++) {
-
- targets.add(new TargetRequestBody().setControllerId("test" + i).setName("testDevice"));
- }
-
- final TargetsRest result = createTargetResource().createTargets(targets);
- for (final TargetRest rest : result) {
- assignedTargetRequestBodies.add(new AssignedTargetRequestBody().setControllerId(rest.getControllerId()));
- }
-
- }
-
- private static TargetResource createTargetResource() {
- final TargetResource targetResource = Feign.builder().logger(new Logger.ErrorLogger())
- .logLevel(Logger.Level.BASIC).decoder(new JacksonDecoder()).encoder(new JacksonEncoder())
- .requestInterceptor(new BasicAuthRequestInterceptor("admin", "admin"))
- .target(TargetResource.class, "http://localhost:8080");
- return targetResource;
- }
-
-}
diff --git a/examples/hawkbit-mgmt-api-client/src/test/java/org/eclipse/hawkbit/mgmt/api/client/TargetTest.java b/examples/hawkbit-mgmt-api-client/src/test/java/org/eclipse/hawkbit/mgmt/api/client/TargetTest.java
deleted file mode 100644
index 745b119f6..000000000
--- a/examples/hawkbit-mgmt-api-client/src/test/java/org/eclipse/hawkbit/mgmt/api/client/TargetTest.java
+++ /dev/null
@@ -1,119 +0,0 @@
-/**
- * Copyright (c) 2015 Bosch Software Innovations GmbH and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- */
-package org.eclipse.hawkbit.mgmt.api.client;
-
-import static org.fest.assertions.api.Assertions.assertThat;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.hawkbit.app.Start;
-import org.eclipse.hawkbit.rest.resource.model.target.TargetPagedList;
-import org.eclipse.hawkbit.rest.resource.model.target.TargetRequestBody;
-import org.eclipse.hawkbit.rest.resource.model.target.TargetRest;
-import org.eclipse.hawkbit.rest.resource.model.target.TargetsRest;
-import org.junit.BeforeClass;
-import org.junit.Ignore;
-import org.junit.Test;
-import org.springframework.boot.SpringApplication;
-import org.springframework.context.annotation.Description;
-
-import feign.Feign;
-import feign.Logger;
-import feign.auth.BasicAuthRequestInterceptor;
-import feign.jackson.JacksonDecoder;
-import feign.jackson.JacksonEncoder;
-import ru.yandex.qatools.allure.annotations.Features;
-import ru.yandex.qatools.allure.annotations.Stories;
-
-@Features("Example Tests - Management RESTful API Client")
-@Stories("Target Resource")
-public class TargetTest {
-
- @BeforeClass
- public static void startupServer() {
- SpringApplication.run(Start.class, new String[0]);
- }
-
- // disabled as this runs not on CI environments.
- @Test
- @Description("Simple request of target by ID")
- @Ignore
- public void getTarget() {
- final TargetResource targetResource = createTargetResource();
- final TargetsRest result = createTargets(targetResource, 1);
-
- assertThat(targetResource.getTarget("test0").getName()).isEqualTo("testDevice");
-
- deleteTargets(targetResource, result);
- }
-
- // disabled as this runs not on CI environments.
- @Test
- @Description("Simple request of all targets with defined page sizing information (i.e. offset and limit).")
- @Ignore
- public void getTargetsAsPagedListWithDefinedPageSizing() {
- final TargetResource targetResource = createTargetResource();
- final TargetsRest created = createTargets(targetResource, 20);
-
- final TargetPagedList queryResult = targetResource.getTargets(0, 10);
-
- assertThat(queryResult.getContent()).hasSize(10);
- assertThat(queryResult.getTotal()).isEqualTo(20);
- assertThat(queryResult.getSize()).isEqualTo(10);
-
- deleteTargets(targetResource, created);
- }
-
- // disabled as this runs not on CI environments.
- @Test
- @Description("Simple request of all targets with defualt paging parameters.")
- @Ignore
- public void getTargetsAsPagedListWithDefaultPageSizing() {
- final TargetResource targetResource = createTargetResource();
- final TargetsRest created = createTargets(targetResource, 20);
-
- final TargetPagedList queryResult = targetResource.getTargets();
-
- assertThat(queryResult.getContent()).hasSize(20);
- assertThat(queryResult.getTotal()).isEqualTo(20);
- assertThat(queryResult.getSize()).isEqualTo(20);
-
- deleteTargets(targetResource, created);
- }
-
- private void deleteTargets(final TargetResource targetResource, final List targets) {
- for (final TargetRest targetRest : targets) {
- targetResource.deleteTarget(targetRest.getControllerId());
- }
- }
-
- private TargetsRest createTargets(final TargetResource targetResource, final int number) {
-
- final List targets = new ArrayList<>();
- for (int i = 0; i < number; i++) {
-
- targets.add(new TargetRequestBody().setControllerId("test" + i).setName("testDevice"));
- }
-
- final TargetsRest result = targetResource.createTargets(targets);
-
- assertThat(result).hasSize(number);
- return result;
- }
-
- private TargetResource createTargetResource() {
- final TargetResource targetResource = Feign.builder().logger(new Logger.ErrorLogger())
- .logLevel(Logger.Level.BASIC).decoder(new JacksonDecoder()).encoder(new JacksonEncoder())
- .requestInterceptor(new BasicAuthRequestInterceptor("admin", "admin"))
- .target(TargetResource.class, "http://localhost:8080");
- return targetResource;
- }
-
-}
diff --git a/hawkbit-core/src/main/java/org/eclipse/hawkbit/repository/TargetFields.java b/hawkbit-core/src/main/java/org/eclipse/hawkbit/repository/TargetFields.java
index 1b4daaf66..0a696fdb6 100644
--- a/hawkbit-core/src/main/java/org/eclipse/hawkbit/repository/TargetFields.java
+++ b/hawkbit-core/src/main/java/org/eclipse/hawkbit/repository/TargetFields.java
@@ -51,7 +51,16 @@ public enum TargetFields implements FieldNameProvider {
*/
ATTRIBUTE("targetInfo.controllerAttributes", true),
+ /**
+ * distribution sets which is assigned to the target.
+ */
ASSIGNEDDS("assignedDistributionSet", "name", "version"),
+
+ /**
+ * distribution sets which is installed on the target.
+ */
+ INSTALLEDDS("targetInfo.installedDistributionSet", "name", "version"),
+
/**
* The tags field.
*/
diff --git a/hawkbit-dmf-amqp/src/main/java/org/eclipse/hawkbit/amqp/AmqpMessageHandlerService.java b/hawkbit-dmf-amqp/src/main/java/org/eclipse/hawkbit/amqp/AmqpMessageHandlerService.java
index 8921e368c..f8aed4f86 100644
--- a/hawkbit-dmf-amqp/src/main/java/org/eclipse/hawkbit/amqp/AmqpMessageHandlerService.java
+++ b/hawkbit-dmf-amqp/src/main/java/org/eclipse/hawkbit/amqp/AmqpMessageHandlerService.java
@@ -298,20 +298,7 @@ public class AmqpMessageHandlerService {
*/
private void updateActionStatus(final Message message) {
final ActionUpdateStatus actionUpdateStatus = convertMessage(message, ActionUpdateStatus.class);
- final Long actionId = actionUpdateStatus.getActionId();
- LOG.debug("Target notifies intermediate about action {} with status {}.", actionId, actionUpdateStatus
- .getActionStatus().name());
-
- if (actionId == null) {
- logAndThrowMessageError(message, "Invalid message no action id");
- }
-
- final Action action = controllerManagement.findActionWithDetails(actionId);
-
- if (action == null) {
- logAndThrowMessageError(message, "Got intermediate notification about action " + actionId
- + " but action does not exist");
- }
+ final Action action = checkActionExist(message, actionUpdateStatus);
final ActionStatus actionStatus = new ActionStatus();
final List messageText = actionUpdateStatus.getMessage();
@@ -362,6 +349,29 @@ public class AmqpMessageHandlerService {
}
}
+ /**
+ * @param message
+ * @param actionUpdateStatus
+ * @return
+ */
+ private Action checkActionExist(final Message message, final ActionUpdateStatus actionUpdateStatus) {
+ final Long actionId = actionUpdateStatus.getActionId();
+ LOG.debug("Target notifies intermediate about action {} with status {}.", actionId, actionUpdateStatus
+ .getActionStatus().name());
+
+ if (actionId == null) {
+ logAndThrowMessageError(message, "Invalid message no action id");
+ }
+
+ final Action action = controllerManagement.findActionWithDetails(actionId);
+
+ if (action == null) {
+ logAndThrowMessageError(message, "Got intermediate notification about action " + actionId
+ + " but action does not exist");
+ }
+ return action;
+ }
+
private void handleCancelRejected(final Message message, final Action action, final ActionStatus actionStatus) {
if (action.isCancelingOrCanceled()) {
diff --git a/hawkbit-dmf-amqp/src/test/java/org/eclipse/hawkbit/amqp/AmqpControllerAuthentficationTest.java b/hawkbit-dmf-amqp/src/test/java/org/eclipse/hawkbit/amqp/AmqpControllerAuthentficationTest.java
index 5a77c5fce..1d962907b 100644
--- a/hawkbit-dmf-amqp/src/test/java/org/eclipse/hawkbit/amqp/AmqpControllerAuthentficationTest.java
+++ b/hawkbit-dmf-amqp/src/test/java/org/eclipse/hawkbit/amqp/AmqpControllerAuthentficationTest.java
@@ -45,7 +45,7 @@ import ru.yandex.qatools.allure.annotations.Stories;
/**
*
- *
+ * Test Amqp controller authentfication.
*/
@Features("AMQP Authenfication Test")
@Stories("Tests the authenfication")
@@ -86,24 +86,34 @@ public class AmqpControllerAuthentficationTest {
amqpMessageHandlerService.setAuthenticationManager(authenticationManager);
}
- @Test(expected = BadCredentialsException.class)
+ @Test
@Description("Tests authentication manager without principal")
public void testAuthenticationeBadCredantialsWithoutPricipal() {
final TenantSecruityToken securityToken = new TenantSecruityToken(TENANT, CONTROLLLER_ID, "12345");
- authenticationManager.doAuthenticate(securityToken);
- fail();
+ try {
+ authenticationManager.doAuthenticate(securityToken);
+ fail("BadCredentialsException was excepeted since principal was missing");
+ } catch (final BadCredentialsException exception) {
+ // test ok - exception was excepted
+ }
+
}
- @Test(expected = BadCredentialsException.class)
- @Description("Tests authentication manager without wrong credential")
+ @Test
+ @Description("Tests authentication manager without wrong credential")
public void testAuthenticationBadCredantialsWithWrongCredential() {
final TenantSecruityToken securityToken = new TenantSecruityToken(TENANT, CONTROLLLER_ID, "12345");
when(systemManagement.getConfigurationValue(
eq(TenantConfigurationKey.AUTHENTICATION_MODE_TARGET_SECURITY_TOKEN_ENABLED), any()))
.thenReturn(Boolean.TRUE);
securityToken.getHeaders().put(TenantSecruityToken.AUTHORIZATION_HEADER, "TargetToken 12" + CONTROLLLER_ID);
- authenticationManager.doAuthenticate(securityToken);
- fail();
+ try {
+ authenticationManager.doAuthenticate(securityToken);
+ fail("BadCredentialsException was excepeted due to wrong credential");
+ } catch (final BadCredentialsException exception) {
+ // test ok - exception was excepted
+ }
+
}
@Test
diff --git a/hawkbit-repository/src/main/java/org/eclipse/hawkbit/RepositoryApplicationConfiguration.java b/hawkbit-repository/src/main/java/org/eclipse/hawkbit/RepositoryApplicationConfiguration.java
index 6acf212ee..e2d31a04c 100644
--- a/hawkbit-repository/src/main/java/org/eclipse/hawkbit/RepositoryApplicationConfiguration.java
+++ b/hawkbit-repository/src/main/java/org/eclipse/hawkbit/RepositoryApplicationConfiguration.java
@@ -161,7 +161,7 @@ public class RepositoryApplicationConfiguration extends JpaBaseConfiguration {
@Override
protected Map getVendorProperties() {
- final Map properties = new HashMap();
+ final Map properties = new HashMap<>();
// Turn off dynamic weaving to disable LTW lookup in static weaving mode
properties.put("eclipselink.weaving", "false");
// needed for reports
diff --git a/hawkbit-repository/src/main/java/org/eclipse/hawkbit/report/model/DataReportSeries.java b/hawkbit-repository/src/main/java/org/eclipse/hawkbit/report/model/DataReportSeries.java
index 97623d9d0..39c8f5723 100644
--- a/hawkbit-repository/src/main/java/org/eclipse/hawkbit/report/model/DataReportSeries.java
+++ b/hawkbit-repository/src/main/java/org/eclipse/hawkbit/report/model/DataReportSeries.java
@@ -8,19 +8,22 @@
*/
package org.eclipse.hawkbit.report.model;
+import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Stream;
/**
* A data report series which contains a list of {@link DataReportSeriesItem}.
- *
+ *
*
*
* @param
* the type of the report series item
*/
-public class DataReportSeries extends AbstractReportSeries {
+public class DataReportSeries extends AbstractReportSeries {
+
+ private static final long serialVersionUID = 1L;
private final List> data = new ArrayList<>();
@@ -46,7 +49,7 @@ public class DataReportSeries extends AbstractReportSeries {
}
private void setData(final List> values) {
- this.data.clear();
+ data.clear();
data.addAll(values);
}
diff --git a/hawkbit-repository/src/main/java/org/eclipse/hawkbit/report/model/DataReportSeriesItem.java b/hawkbit-repository/src/main/java/org/eclipse/hawkbit/report/model/DataReportSeriesItem.java
index 3369ef1c0..492e27e1e 100644
--- a/hawkbit-repository/src/main/java/org/eclipse/hawkbit/report/model/DataReportSeriesItem.java
+++ b/hawkbit-repository/src/main/java/org/eclipse/hawkbit/report/model/DataReportSeriesItem.java
@@ -8,6 +8,8 @@
*/
package org.eclipse.hawkbit.report.model;
+import java.io.Serializable;
+
/**
* An data report series item which contains a type and a value.
*
@@ -16,8 +18,9 @@ package org.eclipse.hawkbit.report.model;
* @param
* the type of the report series item
*/
-public class DataReportSeriesItem {
+public class DataReportSeriesItem implements Serializable {
+ private static final long serialVersionUID = 1L;
private final T type;
private final Number data;
diff --git a/hawkbit-repository/src/main/java/org/eclipse/hawkbit/report/model/InnerOuterDataReportSeries.java b/hawkbit-repository/src/main/java/org/eclipse/hawkbit/report/model/InnerOuterDataReportSeries.java
index 1568847de..b63935b39 100644
--- a/hawkbit-repository/src/main/java/org/eclipse/hawkbit/report/model/InnerOuterDataReportSeries.java
+++ b/hawkbit-repository/src/main/java/org/eclipse/hawkbit/report/model/InnerOuterDataReportSeries.java
@@ -8,6 +8,8 @@
*/
package org.eclipse.hawkbit.report.model;
+import java.io.Serializable;
+
/**
* A double data series which contains an inner and an outer series ideal for
* showing donut charts.
@@ -17,7 +19,7 @@ package org.eclipse.hawkbit.report.model;
* @param
* The type parameter for the report series data
*/
-public class InnerOuterDataReportSeries {
+public class InnerOuterDataReportSeries {
private final DataReportSeries innerSeries;
private final DataReportSeries outerSeries;
diff --git a/hawkbit-repository/src/main/java/org/eclipse/hawkbit/repository/ControllerManagement.java b/hawkbit-repository/src/main/java/org/eclipse/hawkbit/repository/ControllerManagement.java
index 844bbd097..e4a1e5e6b 100644
--- a/hawkbit-repository/src/main/java/org/eclipse/hawkbit/repository/ControllerManagement.java
+++ b/hawkbit-repository/src/main/java/org/eclipse/hawkbit/repository/ControllerManagement.java
@@ -15,7 +15,6 @@ import java.util.Map;
import javax.persistence.EntityManager;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
-import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import javax.validation.constraints.NotNull;
@@ -212,14 +211,9 @@ public class ControllerManagement implements EnvironmentAware {
@Modifying
@Transactional
@PreAuthorize(SpringEvalExpressions.IS_CONTROLLER)
- public Target findOrRegisterTargetIfItDoesNotexist(@NotNull final String targetid, final URI address) {
- final Specification spec = new Specification() {
- @Override
- public Predicate toPredicate(final Root targetRoot, final CriteriaQuery> query,
- final CriteriaBuilder cb) {
- return cb.equal(targetRoot.get(Target_.controllerId), targetid);
- }
- };
+ public Target findOrRegisterTargetIfItDoesNotexist(@NotEmpty final String targetid, final URI address) {
+ final Specification spec = (targetRoot, query, cb) -> cb.equal(targetRoot.get(Target_.controllerId),
+ targetid);
Target target = targetRepository.findOne(spec);
@@ -229,9 +223,9 @@ public class ControllerManagement implements EnvironmentAware {
target.setName(targetid);
return targetManagement.createTarget(target, TargetUpdateStatus.REGISTERED, System.currentTimeMillis(),
address);
- } else {
- return updateLastTargetQuery(target.getTargetInfo(), address).getTarget();
}
+
+ return updateLastTargetQuery(target.getTargetInfo(), address).getTarget();
}
/**
diff --git a/hawkbit-repository/src/main/java/org/eclipse/hawkbit/repository/DistributionSetManagement.java b/hawkbit-repository/src/main/java/org/eclipse/hawkbit/repository/DistributionSetManagement.java
index 0a3838354..d22a77f75 100644
--- a/hawkbit-repository/src/main/java/org/eclipse/hawkbit/repository/DistributionSetManagement.java
+++ b/hawkbit-repository/src/main/java/org/eclipse/hawkbit/repository/DistributionSetManagement.java
@@ -22,10 +22,6 @@ import java.util.stream.Collectors;
import javax.persistence.Entity;
import javax.persistence.EntityManager;
-import javax.persistence.criteria.CriteriaBuilder;
-import javax.persistence.criteria.CriteriaQuery;
-import javax.persistence.criteria.Predicate;
-import javax.persistence.criteria.Root;
import javax.validation.constraints.NotNull;
import org.eclipse.hawkbit.eventbus.event.DistributionSetTagAssigmentResultEvent;
@@ -53,13 +49,13 @@ import org.eclipse.hawkbit.repository.model.Tag;
import org.eclipse.hawkbit.repository.model.Target;
import org.eclipse.hawkbit.repository.specifications.DistributionSetSpecification;
import org.eclipse.hawkbit.repository.specifications.DistributionSetTypeSpecification;
+import org.eclipse.hawkbit.repository.specifications.SpecificationsBuilder;
import org.hibernate.validator.constraints.NotEmpty;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.domain.Specification;
-import org.springframework.data.jpa.domain.Specifications;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.stereotype.Service;
@@ -203,7 +199,8 @@ public class DistributionSetManagement {
}
final DistributionSetTagAssigmentResult resultAssignment = result;
- afterCommit.afterCommit(() -> eventBus.post(new DistributionSetTagAssigmentResultEvent(resultAssignment)));
+ afterCommit
+ .afterCommit(() -> eventBus.post(new DistributionSetTagAssigmentResultEvent(resultAssignment)));
// no reason to persist the tag
entityManager.detach(myTag);
@@ -263,7 +260,7 @@ public class DistributionSetManagement {
@Transactional
@PreAuthorize(SpringEvalExpressions.HAS_AUTH_DELETE_REPOSITORY)
public void deleteDistributionSet(@NotNull final DistributionSet set) {
- this.deleteDistributionSet(set.getId());
+ deleteDistributionSet(set.getId());
}
/**
@@ -321,14 +318,10 @@ public class DistributionSetManagement {
@PreAuthorize(SpringEvalExpressions.HAS_AUTH_CREATE_REPOSITORY)
public DistributionSet createDistributionSet(@NotNull final DistributionSet dSet) {
prepareDsSave(dSet);
-
if (dSet.getType() == null) {
dSet.setType(systemManagement.getTenantMetadata().getDefaultDsType());
}
-
- final DistributionSet result = distributionSetRepository.save(dSet);
-
- return result;
+ return distributionSetRepository.save(dSet);
}
private void prepareDsSave(final DistributionSet dSet) {
@@ -400,7 +393,7 @@ public class DistributionSetManagement {
@PreAuthorize(SpringEvalExpressions.HAS_AUTH_UPDATE_REPOSITORY)
public DistributionSet unassignSoftwareModule(@NotNull final DistributionSet ds,
final SoftwareModule softwareModule) {
- final Set softwareModules = new HashSet();
+ final Set softwareModules = new HashSet<>();
softwareModules.add(softwareModule);
ds.removeModule(softwareModule);
checkDistributionSetSoftwareModulesIsAllowedToModify(ds, softwareModules);
@@ -491,20 +484,11 @@ public class DistributionSetManagement {
@PreAuthorize(SpringEvalExpressions.HAS_AUTH_READ_REPOSITORY)
private DistributionSet findDistributionSetsByFiltersAndInstalledOrAssignedTarget(
final DistributionSetFilter distributionSetFilter) {
-
final List> specList = buildDistributionSetSpecifications(distributionSetFilter);
-
- Specifications specs = null;
- if (!specList.isEmpty()) {
- specs = Specifications.where(specList.get(0));
+ if (specList == null || specList.isEmpty()) {
+ return null;
}
- if (specList.size() > 1) {
- specList.remove(0);
- for (final Specification s : specList) {
- specs = specs.and(s);
- }
- }
- return distributionSetRepository.findOne(specs);
+ return distributionSetRepository.findOne(SpecificationsBuilder.combineWithAnd(specList));
}
/**
@@ -531,7 +515,7 @@ public class DistributionSetManagement {
@PreAuthorize(SpringEvalExpressions.HAS_AUTH_READ_REPOSITORY)
public Page findDistributionSetsAll(@NotNull final Pageable pageReq, final Boolean deleted,
final Boolean complete) {
- final List> specList = new ArrayList>();
+ final List> specList = new ArrayList<>();
if (deleted != null) {
final Specification spec = DistributionSetSpecification.isDeleted(deleted);
@@ -563,7 +547,7 @@ public class DistributionSetManagement {
@PreAuthorize(SpringEvalExpressions.HAS_AUTH_READ_REPOSITORY)
public Page findDistributionSetsAll(@NotNull final Specification spec,
@NotNull final Pageable pageReq, final Boolean deleted) {
- final List> specList = new ArrayList>();
+ final List> specList = new ArrayList<>();
if (deleted != null) {
specList.add(DistributionSetSpecification.isDeleted(deleted));
}
@@ -635,17 +619,6 @@ public class DistributionSetManagement {
return new PageImpl<>(resultSet, pageable, findDistributionSetsByFilters.getTotalElements());
}
- private Long countDistributionSetByCriteriaAPI(@NotEmpty final List> specList) {
- Specifications specs = Specifications.where(specList.get(0));
- if (specList.size() > 1) {
- for (final Specification s : specList.subList(1, specList.size())) {
- specs = specs.and(s);
- }
- }
-
- return distributionSetRepository.count(specs);
- }
-
/**
* Find distribution set by name and version.
*
@@ -689,12 +662,12 @@ public class DistributionSetManagement {
@PreAuthorize(SpringEvalExpressions.HAS_AUTH_READ_REPOSITORY)
public Long countDistributionSetsAll() {
- final List> specList = new ArrayList>();
+ final List> specList = new ArrayList<>();
final Specification spec = DistributionSetSpecification.isDeleted(Boolean.FALSE);
specList.add(spec);
- return countDistributionSetByCriteriaAPI(specList);
+ return distributionSetRepository.count(SpecificationsBuilder.combineWithAnd(specList));
}
/**
@@ -869,17 +842,10 @@ public class DistributionSetManagement {
public Page findDistributionSetMetadataByDistributionSetId(
@NotNull final Long distributionSetId, @NotNull final Pageable pageable) {
- return distributionSetMetadataRepository.findAll(new Specification() {
- @Override
- public Predicate toPredicate(final Root root, final CriteriaQuery> query,
- final CriteriaBuilder cb) {
-
- final Predicate predicate = cb.equal(
- root.get(DistributionSetMetadata_.distributionSet).get(DistributionSet_.id), distributionSetId);
-
- return predicate;
- }
- }, pageable);
+ return distributionSetMetadataRepository.findAll(
+ (Specification) (root, query, cb) -> cb.equal(
+ root.get(DistributionSetMetadata_.distributionSet).get(DistributionSet_.id), distributionSetId),
+ pageable);
}
@@ -899,14 +865,14 @@ public class DistributionSetManagement {
public Page findDistributionSetMetadataByDistributionSetId(
@NotNull final Long distributionSetId, @NotNull final Specification spec,
@NotNull final Pageable pageable) {
- return distributionSetMetadataRepository.findAll(new Specification() {
- @Override
- public Predicate toPredicate(final Root root, final CriteriaQuery> query,
- final CriteriaBuilder cb) {
- return cb.and(cb.equal(root.get(DistributionSetMetadata_.distributionSet).get(DistributionSet_.id),
- distributionSetId), spec.toPredicate(root, query, cb));
- }
- }, pageable);
+ return distributionSetMetadataRepository
+ .findAll(
+ (Specification) (root, query,
+ cb) -> cb.and(
+ cb.equal(root.get(DistributionSetMetadata_.distributionSet)
+ .get(DistributionSet_.id), distributionSetId),
+ spec.toPredicate(root, query, cb)),
+ pageable);
}
/**
@@ -956,7 +922,7 @@ public class DistributionSetManagement {
/**
* Checking Distribution Set is already using while assign Software module.
- *
+ *
* @param distributionSet
* @param softwareModules
*/
@@ -969,9 +935,9 @@ public class DistributionSetManagement {
private List> buildDistributionSetSpecifications(
final DistributionSetFilter distributionSetFilter) {
- final List> specList = new ArrayList>();
+ final List> specList = new ArrayList<>();
- Specification spec = null;
+ Specification spec;
if (null != distributionSetFilter.getIsComplete()) {
spec = DistributionSetSpecification.isCompleted(distributionSetFilter.getIsComplete());
@@ -1053,21 +1019,12 @@ public class DistributionSetManagement {
*/
private Page findByCriteriaAPI(@NotNull final Pageable pageable,
final List> specList) {
- Specifications specs = null;
- if (!specList.isEmpty()) {
- specs = Specifications.where(specList.get(0));
- }
- if (specList.size() > 1) {
- for (final Specification s : specList.subList(1, specList.size())) {
- specs = specs.and(s);
- }
+
+ if (specList == null || specList.isEmpty()) {
+ return distributionSetRepository.findAll(pageable);
}
- if (specs == null) {
- return distributionSetRepository.findAll(pageable);
- } else {
- return distributionSetRepository.findAll(specs, pageable);
- }
+ return distributionSetRepository.findAll(SpecificationsBuilder.combineWithAnd(specList), pageable);
}
private void checkAndThrowAlreadyIfDistributionSetMetadataExists(final DsMetadataCompositeKey metadataId) {
diff --git a/hawkbit-repository/src/main/java/org/eclipse/hawkbit/repository/ReportManagement.java b/hawkbit-repository/src/main/java/org/eclipse/hawkbit/repository/ReportManagement.java
index 801f6c80d..8f87f9209 100644
--- a/hawkbit-repository/src/main/java/org/eclipse/hawkbit/repository/ReportManagement.java
+++ b/hawkbit-repository/src/main/java/org/eclipse/hawkbit/repository/ReportManagement.java
@@ -213,8 +213,8 @@ public class ReportManagement {
* count
*/
@Cacheable("targetsCreatedOverPeriod")
- public DataReportSeries targetsCreatedOverPeriod(final DateType dateType, final LocalDateTime from,
- final LocalDateTime to) {
+ public DataReportSeries targetsCreatedOverPeriod(final DateType dateType,
+ final LocalDateTime from, final LocalDateTime to) {
final Query createNativeQuery = entityManager
.createNativeQuery(getTargetsCreatedQueryTemplate(dateType, from, to));
final List