diff --git a/hawkbit-autoconfigure/src/main/java/org/eclipse/hawkbit/autoconfigure/cache/DownloadIdCacheAutoConfiguration.java b/hawkbit-autoconfigure/src/main/java/org/eclipse/hawkbit/autoconfigure/cache/DownloadIdCacheAutoConfiguration.java
index 495200dec..134b50d90 100644
--- a/hawkbit-autoconfigure/src/main/java/org/eclipse/hawkbit/autoconfigure/cache/DownloadIdCacheAutoConfiguration.java
+++ b/hawkbit-autoconfigure/src/main/java/org/eclipse/hawkbit/autoconfigure/cache/DownloadIdCacheAutoConfiguration.java
@@ -31,7 +31,7 @@ public class DownloadIdCacheAutoConfiguration {
private CacheManager cacheManager;
/**
- * Bean for the downlod id cache.
+ * Bean for the download id cache.
*
* @return the cache
*/
diff --git a/hawkbit-cache-redis/pom.xml b/hawkbit-cache-redis/pom.xml
index 09567291b..637a6b49f 100644
--- a/hawkbit-cache-redis/pom.xml
+++ b/hawkbit-cache-redis/pom.xml
@@ -45,6 +45,12 @@
+
+ org.eclipse.hawkbit
+ hawkbit-repository-api
+ ${project.version}
+ test
+
org.springframework.boot
spring-boot-starter-test
diff --git a/hawkbit-cache-redis/src/test/java/org/eclipse/hawkbit/cache/eventbus/EventDistributorTest.java b/hawkbit-cache-redis/src/test/java/org/eclipse/hawkbit/cache/eventbus/EventDistributorTest.java
index c1ff54961..bebd82484 100644
--- a/hawkbit-cache-redis/src/test/java/org/eclipse/hawkbit/cache/eventbus/EventDistributorTest.java
+++ b/hawkbit-cache-redis/src/test/java/org/eclipse/hawkbit/cache/eventbus/EventDistributorTest.java
@@ -16,8 +16,8 @@ import static org.mockito.Mockito.verify;
import java.util.Collection;
-import org.eclipse.hawkbit.eventbus.event.DownloadProgressEvent;
import org.eclipse.hawkbit.eventbus.event.EntityEvent;
+import org.eclipse.hawkbit.repository.eventbus.event.DownloadProgressEvent;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -56,7 +56,7 @@ public class EventDistributorTest {
@Test
public void distributeDistributedEventSendsToRedis() {
- final DownloadProgressEvent event = new DownloadProgressEvent("tenant", 123L, 10);
+ final DownloadProgressEvent event = new DownloadProgressEvent("tenant", 123L, 500L, 100L, 200L);
underTest.distribute(event);
// origin node ID should be set by distributing the event
@@ -67,7 +67,7 @@ public class EventDistributorTest {
@Test
public void dontDistributeDistributedEventIfSameNode() {
final String knownNodeId = EventDistributor.getNodeId();
- final DownloadProgressEvent event = new DownloadProgressEvent("tenant", 123L, 10);
+ final DownloadProgressEvent event = new DownloadProgressEvent("tenant", 123L, 500L, 100L, 200L);
event.setNodeId(knownNodeId);
// test
@@ -79,7 +79,7 @@ public class EventDistributorTest {
@Test
public void handleDistributedMessageFromRedis() {
- final DownloadProgressEvent event = new DownloadProgressEvent("tenant", 123L, 10);
+ final DownloadProgressEvent event = new DownloadProgressEvent("tenant", 123L, 500L, 100L, 200L);
final String knownChannel = "someChannel";
underTest.handleMessage(event, knownChannel);
@@ -90,7 +90,7 @@ public class EventDistributorTest {
@Test
public void handleDistributedMessageFilteredIfSameNodeId() {
- final DownloadProgressEvent event = new DownloadProgressEvent("tenant", 123L, 10);
+ final DownloadProgressEvent event = new DownloadProgressEvent("tenant", 123L, 500L, 100L, 200L);
final String knownChannel = "someChannel";
event.setOriginNodeId(EventDistributor.getNodeId());
diff --git a/hawkbit-core/src/main/java/org/eclipse/hawkbit/eventbus/event/DownloadProgressEvent.java b/hawkbit-core/src/main/java/org/eclipse/hawkbit/eventbus/event/DownloadProgressEvent.java
deleted file mode 100644
index 74679f02e..000000000
--- a/hawkbit-core/src/main/java/org/eclipse/hawkbit/eventbus/event/DownloadProgressEvent.java
+++ /dev/null
@@ -1,57 +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.eventbus.event;
-
-/**
- * Event that contains an updated download progress for a given Action.
- *
- *
- *
- *
- */
-public class DownloadProgressEvent extends AbstractDistributedEvent {
-
- private static final long serialVersionUID = 1L;
-
- private final Long statusId;
- private final int progressPercent;
-
- /**
- * Constructor.
- *
- * @param tenant
- * the tenant for this event
- * @param statusId
- * of {@link UpdateActionStatus}
- * @param progressPercent
- * number (1-100)
- */
- public DownloadProgressEvent(final String tenant, final Long statusId, final int progressPercent) {
- // the revision of the DownloadProgressEvent is just equal the
- // progressPercentage due the
- // percentage is going from 0 to 100.
- super(statusId, tenant);
- this.statusId = statusId;
- this.progressPercent = progressPercent;
- }
-
- /**
- * @return the statusId
- */
- public Long getStatusId() {
- return statusId;
- }
-
- /**
- * @return the progressPercent
- */
- public int getProgressPercent() {
- return progressPercent;
- }
-}
diff --git a/hawkbit-ddi-resource/src/main/java/org/eclipse/hawkbit/ddi/rest/resource/DdiArtifactStoreController.java b/hawkbit-ddi-resource/src/main/java/org/eclipse/hawkbit/ddi/rest/resource/DdiArtifactStoreController.java
index 75d502c47..e2af0a873 100644
--- a/hawkbit-ddi-resource/src/main/java/org/eclipse/hawkbit/ddi/rest/resource/DdiArtifactStoreController.java
+++ b/hawkbit-ddi-resource/src/main/java/org/eclipse/hawkbit/ddi/rest/resource/DdiArtifactStoreController.java
@@ -93,12 +93,12 @@ public class DdiArtifactStoreController implements DdiDlArtifactStoreControllerR
// we set a download status only if we are aware of the
// targetid, i.e. authenticated and not anonymous
if (targetid != null && !"anonymous".equals(targetid)) {
- final Action action = checkAndReportDownloadByTarget(
+ final ActionStatus actionStatus = checkAndReportDownloadByTarget(
requestResponseContextHolder.getHttpServletRequest(), targetid, artifact);
result = RestResourceConversionHelper.writeFileResponse(artifact,
requestResponseContextHolder.getHttpServletResponse(),
requestResponseContextHolder.getHttpServletRequest(), file, controllerManagement,
- action.getId());
+ actionStatus.getId());
} else {
result = RestResourceConversionHelper.writeFileResponse(artifact,
requestResponseContextHolder.getHttpServletResponse(),
@@ -131,7 +131,7 @@ public class DdiArtifactStoreController implements DdiDlArtifactStoreControllerR
return new ResponseEntity<>(HttpStatus.OK);
}
- private Action checkAndReportDownloadByTarget(final HttpServletRequest request, final String targetid,
+ private ActionStatus checkAndReportDownloadByTarget(final HttpServletRequest request, final String targetid,
final LocalArtifact artifact) {
final Target target = controllerManagement.updateLastTargetQuery(targetid,
IpUtil.getClientIpFromRequest(request, securityProperties));
@@ -152,8 +152,8 @@ public class DdiArtifactStoreController implements DdiDlArtifactStoreControllerR
actionStatus.addMessage(
RepositoryConstants.SERVER_MESSAGE_PREFIX + "Target downloads: " + request.getRequestURI());
}
- controllerManagement.addInformationalActionStatus(actionStatus);
- return action;
+
+ return controllerManagement.addInformationalActionStatus(actionStatus);
}
}
diff --git a/hawkbit-ddi-resource/src/main/java/org/eclipse/hawkbit/ddi/rest/resource/DdiRootController.java b/hawkbit-ddi-resource/src/main/java/org/eclipse/hawkbit/ddi/rest/resource/DdiRootController.java
index 120e6c246..9dd65d5fc 100644
--- a/hawkbit-ddi-resource/src/main/java/org/eclipse/hawkbit/ddi/rest/resource/DdiRootController.java
+++ b/hawkbit-ddi-resource/src/main/java/org/eclipse/hawkbit/ddi/rest/resource/DdiRootController.java
@@ -156,8 +156,8 @@ public class DdiRootController implements DdiRootControllerRestApi {
if (ifMatch != null && !RestResourceConversionHelper.matchesHttpHeader(ifMatch, artifact.getSha1Hash())) {
result = new ResponseEntity<>(HttpStatus.PRECONDITION_FAILED);
} else {
- final Action action = checkAndLogDownload(requestResponseContextHolder.getHttpServletRequest(), target,
- module);
+ final ActionStatus action = checkAndLogDownload(requestResponseContextHolder.getHttpServletRequest(),
+ target, module);
result = RestResourceConversionHelper.writeFileResponse(artifact,
requestResponseContextHolder.getHttpServletResponse(),
requestResponseContextHolder.getHttpServletRequest(), file, controllerManagement,
@@ -167,7 +167,7 @@ public class DdiRootController implements DdiRootControllerRestApi {
return result;
}
- private Action checkAndLogDownload(final HttpServletRequest request, final Target target,
+ private ActionStatus checkAndLogDownload(final HttpServletRequest request, final Target target,
final SoftwareModule module) {
final Action action = controllerManagement
.getActionForDownloadByTargetAndSoftwareModule(target.getControllerId(), module);
@@ -185,8 +185,8 @@ public class DdiRootController implements DdiRootControllerRestApi {
statusMessage.addMessage(
RepositoryConstants.SERVER_MESSAGE_PREFIX + "Target downloads " + request.getRequestURI());
}
- controllerManagement.addInformationalActionStatus(statusMessage);
- return action;
+
+ return controllerManagement.addInformationalActionStatus(statusMessage);
}
private static boolean checkModule(final String fileName, final SoftwareModule module) {
diff --git a/hawkbit-ddi-resource/src/test/java/org/eclipse/hawkbit/ddi/rest/resource/DdiArtifactDownloadTest.java b/hawkbit-ddi-resource/src/test/java/org/eclipse/hawkbit/ddi/rest/resource/DdiArtifactDownloadTest.java
index 7f12b78ae..81be97b7c 100644
--- a/hawkbit-ddi-resource/src/test/java/org/eclipse/hawkbit/ddi/rest/resource/DdiArtifactDownloadTest.java
+++ b/hawkbit-ddi-resource/src/test/java/org/eclipse/hawkbit/ddi/rest/resource/DdiArtifactDownloadTest.java
@@ -26,14 +26,14 @@ import java.util.Arrays;
import java.util.List;
import org.apache.commons.lang3.RandomUtils;
-import org.eclipse.hawkbit.eventbus.event.DownloadProgressEvent;
+import org.eclipse.hawkbit.repository.eventbus.event.DownloadProgressEvent;
import org.eclipse.hawkbit.repository.model.Action;
import org.eclipse.hawkbit.repository.model.Action.Status;
-import org.eclipse.hawkbit.repository.test.util.WithUser;
import org.eclipse.hawkbit.repository.model.Artifact;
import org.eclipse.hawkbit.repository.model.DistributionSet;
import org.eclipse.hawkbit.repository.model.LocalArtifact;
import org.eclipse.hawkbit.repository.model.Target;
+import org.eclipse.hawkbit.repository.test.util.WithUser;
import org.eclipse.hawkbit.rest.AbstractRestIntegrationTestWithMongoDB;
import org.junit.Test;
import org.slf4j.LoggerFactory;
@@ -59,11 +59,15 @@ import ru.yandex.qatools.allure.annotations.Stories;
@Stories("Artifact Download Resource")
public class DdiArtifactDownloadTest extends AbstractRestIntegrationTestWithMongoDB {
+ private static final int ARTIFACT_SIZE = 5 * 1024 * 1024;
+
public DdiArtifactDownloadTest() {
LOG = LoggerFactory.getLogger(DdiArtifactDownloadTest.class);
}
private volatile int downLoadProgress = 0;
+ private volatile long shippedBytes = 0;
+ private volatile long shippedBytesTotal = 0;
@Autowired
private EventBus eventBus;
@@ -236,6 +240,8 @@ public class DdiArtifactDownloadTest extends AbstractRestIntegrationTestWithMong
@Description("Tests valid downloads through the artifact resource by identifying the artifact not by ID but file name.")
public void downloadArtifactThroughFileName() throws Exception {
downLoadProgress = 1;
+ shippedBytes = 0;
+ shippedBytesTotal = 0;
eventBus.register(this);
assertThat(softwareManagement.findSoftwareModulesAll(pageReq)).hasSize(0);
@@ -249,7 +255,7 @@ public class DdiArtifactDownloadTest extends AbstractRestIntegrationTestWithMong
final DistributionSet ds = testdataFactory.createDistributionSet("");
// create artifact
- final byte random[] = RandomUtils.nextBytes(5 * 1024 * 1024);
+ final byte random[] = RandomUtils.nextBytes(ARTIFACT_SIZE);
final LocalArtifact artifact = artifactManagement.createLocalArtifact(new ByteArrayInputStream(random),
ds.findFirstModuleByType(osType).getId(), "file1", false);
@@ -276,6 +282,7 @@ public class DdiArtifactDownloadTest extends AbstractRestIntegrationTestWithMong
// download complete
assertThat(downLoadProgress).isEqualTo(10);
+ assertThat(shippedBytes).isEqualTo(shippedBytesTotal).isEqualTo(ARTIFACT_SIZE);
}
@Test
@@ -313,35 +320,8 @@ public class DdiArtifactDownloadTest extends AbstractRestIntegrationTestWithMong
+ "anonymous as authorization is notpossible, e.g. chekc if the controller has the artifact assigned.")
public void downloadArtifactByNameFailsIfNotAuthenticated() throws Exception {
downLoadProgress = 1;
- eventBus.register(this);
-
- assertThat(softwareManagement.findSoftwareModulesAll(pageReq)).hasSize(0);
-
- // create target
- Target target = entityFactory.generateTarget("4712");
- target = targetManagement.createTarget(target);
- final List targets = new ArrayList();
- targets.add(target);
-
- // create ds
- final DistributionSet ds = testdataFactory.createDistributionSet("");
-
- // create artifact
- final byte random[] = RandomUtils.nextBytes(5 * 1024);
- final Artifact artifact = artifactManagement.createLocalArtifact(new ByteArrayInputStream(random),
- ds.findFirstModuleByType(osType).getId(), "file1.tar.bz2", false);
-
- // download fails as artifact is not yet assigned to target
- deploymentManagement.assignDistributionSet(ds, targets);
- mvc.perform(get("/controller/artifacts/v1/filename/{filename}", "file1.tar.bz2"))
- .andExpect(status().isNotFound());
- }
-
- @Test
- @WithUser(principal = "4712", authorities = "ROLE_CONTROLLER", allSpPermissions = true)
- @Description("Ensures that an authenticated and named controller is permitted to download.")
- public void downloadArtifactByNameByNamedController() throws Exception {
- downLoadProgress = 1;
+ shippedBytes = 0;
+ shippedBytesTotal = 0;
eventBus.register(this);
assertThat(softwareManagement.findSoftwareModulesAll(pageReq)).hasSize(0);
@@ -356,7 +336,41 @@ public class DdiArtifactDownloadTest extends AbstractRestIntegrationTestWithMong
final DistributionSet ds = testdataFactory.createDistributionSet("");
// create artifact
- final byte random[] = RandomUtils.nextBytes(5 * 1024 * 1024);
+ final byte random[] = RandomUtils.nextBytes(ARTIFACT_SIZE);
+ artifactManagement.createLocalArtifact(new ByteArrayInputStream(random),
+ ds.findFirstModuleByType(osType).getId(), "file1.tar.bz2", false);
+
+ // download fails as artifact is not yet assigned to target
+ deploymentManagement.assignDistributionSet(ds, targets);
+ mvc.perform(get("/controller/artifacts/v1/filename/{filename}", "file1.tar.bz2"))
+ .andExpect(status().isNotFound());
+
+ assertThat(downLoadProgress).isEqualTo(1);
+ assertThat(shippedBytes).isEqualTo(shippedBytesTotal).isEqualTo(0L);
+ }
+
+ @Test
+ @WithUser(principal = "4712", authorities = "ROLE_CONTROLLER", allSpPermissions = true)
+ @Description("Ensures that an authenticated and named controller is permitted to download.")
+ public void downloadArtifactByNameByNamedController() throws Exception {
+ downLoadProgress = 1;
+ shippedBytes = 0;
+ shippedBytesTotal = 0;
+ eventBus.register(this);
+
+ assertThat(softwareManagement.findSoftwareModulesAll(pageReq)).hasSize(0);
+
+ // create target
+ Target target = entityFactory.generateTarget("4712");
+ target = targetManagement.createTarget(target);
+ final List targets = new ArrayList<>();
+ targets.add(target);
+
+ // create ds
+ final DistributionSet ds = testdataFactory.createDistributionSet("");
+
+ // create artifact
+ final byte random[] = RandomUtils.nextBytes(ARTIFACT_SIZE);
final Artifact artifact = artifactManagement.createLocalArtifact(new ByteArrayInputStream(random),
ds.findFirstModuleByType(osType).getId(), "file1", false);
@@ -389,6 +403,7 @@ public class DdiArtifactDownloadTest extends AbstractRestIntegrationTestWithMong
// download complete
assertThat(downLoadProgress).isEqualTo(10);
+ assertThat(shippedBytes).isEqualTo(shippedBytesTotal).isEqualTo(ARTIFACT_SIZE);
}
@Test
@@ -550,5 +565,8 @@ public class DdiArtifactDownloadTest extends AbstractRestIntegrationTestWithMong
@Subscribe
public void listen(final DownloadProgressEvent event) {
downLoadProgress++;
+ shippedBytes += event.getShippedBytesSinceLast();
+ shippedBytesTotal = event.getShippedBytesOverall();
+
}
}
diff --git a/hawkbit-mgmt-api/src/main/java/org/eclipse/hawkbit/mgmt/json/model/systemmanagement/MgmtSystemTenantServiceUsage.java b/hawkbit-mgmt-api/src/main/java/org/eclipse/hawkbit/mgmt/json/model/systemmanagement/MgmtSystemTenantServiceUsage.java
index 8cce4314b..c3e37421d 100644
--- a/hawkbit-mgmt-api/src/main/java/org/eclipse/hawkbit/mgmt/json/model/systemmanagement/MgmtSystemTenantServiceUsage.java
+++ b/hawkbit-mgmt-api/src/main/java/org/eclipse/hawkbit/mgmt/json/model/systemmanagement/MgmtSystemTenantServiceUsage.java
@@ -32,7 +32,6 @@ public class MgmtSystemTenantServiceUsage {
* @param tenantName
*/
public MgmtSystemTenantServiceUsage(final String tenantName) {
- super();
this.tenantName = tenantName;
}
diff --git a/hawkbit-repository/hawkbit-repository-api/src/main/java/org/eclipse/hawkbit/repository/ControllerManagement.java b/hawkbit-repository/hawkbit-repository-api/src/main/java/org/eclipse/hawkbit/repository/ControllerManagement.java
index 531da8819..e5dcb8f74 100644
--- a/hawkbit-repository/hawkbit-repository-api/src/main/java/org/eclipse/hawkbit/repository/ControllerManagement.java
+++ b/hawkbit-repository/hawkbit-repository-api/src/main/java/org/eclipse/hawkbit/repository/ControllerManagement.java
@@ -14,8 +14,8 @@ import java.util.Map;
import javax.validation.constraints.NotNull;
-import org.eclipse.hawkbit.eventbus.event.DownloadProgressEvent;
import org.eclipse.hawkbit.im.authentication.SpPermission.SpringEvalExpressions;
+import org.eclipse.hawkbit.repository.eventbus.event.DownloadProgressEvent;
import org.eclipse.hawkbit.repository.exception.EntityAlreadyExistsException;
import org.eclipse.hawkbit.repository.exception.EntityNotFoundException;
import org.eclipse.hawkbit.repository.exception.ToManyAttributeEntriesException;
@@ -58,16 +58,20 @@ public interface ControllerManagement {
Action addCancelActionStatus(@NotNull ActionStatus actionStatus);
/**
- * Sends the download progress in percentage and notifies the
- * {@link EventBus} with a {@link DownloadProgressEvent}.
+ * Sends the download progress and notifies the {@link EventBus} with a
+ * {@link DownloadProgressEvent}.
*
* @param statusId
* the ID of the {@link ActionStatus}
- * @param progressPercent
- * the progress in percentage which must be between 0-100
+ * @param requestedBytes
+ * requested bytes of the request
+ * @param shippedBytesSinceLast
+ * since the last report
+ * @param shippedBytesOverall
+ * for the {@link ActionStatus}
*/
@PreAuthorize(SpringEvalExpressions.IS_CONTROLLER)
- void downloadProgressPercent(long statusId, int progressPercent);
+ void downloadProgress(Long statusId, Long requestedBytes, Long shippedBytesSinceLast, Long shippedBytesOverall);
/**
* Simple addition of a new {@link ActionStatus} entry to the {@link Action}
@@ -75,9 +79,11 @@ public interface ControllerManagement {
*
* @param statusMessage
* to add to the action
+ *
+ * @return create {@link ActionStatus} entity
*/
@PreAuthorize(SpringEvalExpressions.IS_CONTROLLER)
- void addInformationalActionStatus(@NotNull ActionStatus statusMessage);
+ ActionStatus addInformationalActionStatus(@NotNull ActionStatus statusMessage);
/**
* Adds an {@link ActionStatus} entry for an update {@link Action} including
diff --git a/hawkbit-repository/hawkbit-repository-api/src/main/java/org/eclipse/hawkbit/repository/TenantStatsManagement.java b/hawkbit-repository/hawkbit-repository-api/src/main/java/org/eclipse/hawkbit/repository/TenantStatsManagement.java
index 6d390c03c..f041bc45f 100644
--- a/hawkbit-repository/hawkbit-repository-api/src/main/java/org/eclipse/hawkbit/repository/TenantStatsManagement.java
+++ b/hawkbit-repository/hawkbit-repository-api/src/main/java/org/eclipse/hawkbit/repository/TenantStatsManagement.java
@@ -20,15 +20,14 @@ import org.springframework.security.access.prepost.PreAuthorize;
public interface TenantStatsManagement {
/**
- * Service for stats of a single tenant. Opens a new transaction and as a
- * result can an be used for multiple tenants, i.e. to allow in one session
- * to collect data of all tenants in the system.
+ * Service for stats of the current tenant.
*
- * @param tenant
- * to collect for
* @return collected statistics
*/
- @PreAuthorize(SpringEvalExpressions.HAS_AUTH_SYSTEM_ADMIN)
- TenantUsage getStatsOfTenant(String tenant);
+ @PreAuthorize(SpringEvalExpressions.HAS_AUTH_READ_REPOSITORY + SpringEvalExpressions.HAS_AUTH_OR
+ + SpringEvalExpressions.HAS_AUTH_READ_TARGET + SpringEvalExpressions.HAS_AUTH_OR
+ + SpringEvalExpressions.HAS_AUTH_TENANT_CONFIGURATION + SpringEvalExpressions.HAS_AUTH_OR
+ + SpringEvalExpressions.IS_SYSTEM_CODE)
+ TenantUsage getStatsOfTenant();
}
\ No newline at end of file
diff --git a/hawkbit-repository/hawkbit-repository-api/src/main/java/org/eclipse/hawkbit/repository/eventbus/event/DownloadProgressEvent.java b/hawkbit-repository/hawkbit-repository-api/src/main/java/org/eclipse/hawkbit/repository/eventbus/event/DownloadProgressEvent.java
new file mode 100644
index 000000000..6d145e0ae
--- /dev/null
+++ b/hawkbit-repository/hawkbit-repository-api/src/main/java/org/eclipse/hawkbit/repository/eventbus/event/DownloadProgressEvent.java
@@ -0,0 +1,67 @@
+/**
+ * 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.repository.eventbus.event;
+
+import org.eclipse.hawkbit.eventbus.event.AbstractDistributedEvent;
+
+/**
+ * Event that contains an updated download progress for a given ActionStatus
+ * that was written for a download request.
+ *
+ */
+public class DownloadProgressEvent extends AbstractDistributedEvent {
+
+ private static final long serialVersionUID = 1L;
+
+ private final Long statusId;
+ private final long requestedBytes;
+ private final long shippedBytesSinceLast;
+ private final long shippedBytesOverall;
+
+ /**
+ * Constructor.
+ *
+ * @param tenant
+ * the tenant for this event
+ * @param statusId
+ * of ActionStatus that was written for the download request
+ * @param requestedBytes
+ * bytes requested
+ * @param shippedBytesSinceLast
+ * bytes since last event
+ * @param shippedBytesOverall
+ * on the download request
+ */
+ public DownloadProgressEvent(final String tenant, final Long statusId, final Long requestedBytes,
+ final Long shippedBytesSinceLast, final Long shippedBytesOverall) {
+ // the revision of the DownloadProgressEvent is just equal the
+ // shippedBytesOverall as this is a growing number.
+ super(shippedBytesOverall, tenant);
+ this.statusId = statusId;
+ this.requestedBytes = requestedBytes;
+ this.shippedBytesSinceLast = shippedBytesSinceLast;
+ this.shippedBytesOverall = shippedBytesOverall;
+ }
+
+ public Long getStatusId() {
+ return statusId;
+ }
+
+ public long getRequestedBytes() {
+ return requestedBytes;
+ }
+
+ public long getShippedBytesSinceLast() {
+ return shippedBytesSinceLast;
+ }
+
+ public long getShippedBytesOverall() {
+ return shippedBytesOverall;
+ }
+}
diff --git a/hawkbit-repository/hawkbit-repository-api/src/main/java/org/eclipse/hawkbit/repository/model/Action.java b/hawkbit-repository/hawkbit-repository-api/src/main/java/org/eclipse/hawkbit/repository/model/Action.java
index c2b96905e..98d101471 100644
--- a/hawkbit-repository/hawkbit-repository-api/src/main/java/org/eclipse/hawkbit/repository/model/Action.java
+++ b/hawkbit-repository/hawkbit-repository-api/src/main/java/org/eclipse/hawkbit/repository/model/Action.java
@@ -39,12 +39,6 @@ public interface Action extends TenantAwareBaseEntity {
return Status.CANCELING.equals(getStatus()) || Status.CANCELED.equals(getStatus());
}
- /**
- * @return current {@link Status#DOWNLOAD} progress if known by the update
- * server.
- */
- int getDownloadProgressPercent();
-
/**
* @return current {@link Status} of the {@link Action}.
*/
diff --git a/hawkbit-repository/hawkbit-repository-api/src/main/java/org/eclipse/hawkbit/repository/model/ActionStatus.java b/hawkbit-repository/hawkbit-repository-api/src/main/java/org/eclipse/hawkbit/repository/model/ActionStatus.java
index f3ca66887..e83108fe8 100644
--- a/hawkbit-repository/hawkbit-repository-api/src/main/java/org/eclipse/hawkbit/repository/model/ActionStatus.java
+++ b/hawkbit-repository/hawkbit-repository-api/src/main/java/org/eclipse/hawkbit/repository/model/ActionStatus.java
@@ -43,6 +43,12 @@ public interface ActionStatus extends TenantAwareBaseEntity {
*/
void addMessage(String message);
+ /**
+ * @return current {@link Status#DOWNLOAD} progress if known by the update
+ * server.
+ */
+ int getDownloadProgressPercent();
+
/**
* @return list of message entries that can be added to the
* {@link ActionStatus}.
diff --git a/hawkbit-repository/hawkbit-repository-api/src/main/java/org/eclipse/hawkbit/repository/report/model/TenantUsage.java b/hawkbit-repository/hawkbit-repository-api/src/main/java/org/eclipse/hawkbit/repository/report/model/TenantUsage.java
index 5467099c4..933ca564b 100644
--- a/hawkbit-repository/hawkbit-repository-api/src/main/java/org/eclipse/hawkbit/repository/report/model/TenantUsage.java
+++ b/hawkbit-repository/hawkbit-repository-api/src/main/java/org/eclipse/hawkbit/repository/report/model/TenantUsage.java
@@ -106,7 +106,7 @@ public class TenantUsage {
}
@Override
- public int hashCode() { // NOSONAR - as this is generated code
+ public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + (int) (actions ^ (actions >>> 32));
@@ -118,15 +118,14 @@ public class TenantUsage {
}
@Override
- public boolean equals(final Object obj) { // NOSONAR - as this is generated
- // code
+ public boolean equals(final Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
- if (getClass() != obj.getClass()) {
+ if (!(obj instanceof TenantUsage)) {
return false;
}
final TenantUsage other = (TenantUsage) obj;
@@ -154,7 +153,7 @@ public class TenantUsage {
@Override
public String toString() {
- return "SystemUsage [tenantName=" + tenantName + ", targets=" + targets + ", artifacts=" + artifacts
+ return "TenantUsage [tenantName=" + tenantName + ", targets=" + targets + ", artifacts=" + artifacts
+ ", actions=" + actions + ", overallArtifactVolumeInBytes=" + overallArtifactVolumeInBytes + "]";
}
diff --git a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/RepositoryApplicationConfiguration.java b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/RepositoryApplicationConfiguration.java
index 217fe8801..7236cbe79 100644
--- a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/RepositoryApplicationConfiguration.java
+++ b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/RepositoryApplicationConfiguration.java
@@ -54,6 +54,7 @@ import org.eclipse.hawkbit.repository.jpa.model.helper.TenantConfigurationManage
import org.eclipse.hawkbit.security.SecurityTokenGenerator;
import org.eclipse.hawkbit.security.SystemSecurityContext;
import org.eclipse.hawkbit.tenancy.TenantAware;
+import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.orm.jpa.JpaBaseConfiguration;
@@ -71,6 +72,8 @@ import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import org.springframework.validation.beanvalidation.MethodValidationPostProcessor;
+import com.google.common.eventbus.EventBus;
+
/**
* General configuration for hawkBit's Repository.
*
@@ -85,6 +88,9 @@ import org.springframework.validation.beanvalidation.MethodValidationPostProcess
@EnableConfigurationProperties(RepositoryProperties.class)
@EnableScheduling
public class RepositoryApplicationConfiguration extends JpaBaseConfiguration {
+ @Autowired
+ private EventBus eventBus;
+
/**
* @return the {@link SystemSecurityContext} singleton bean which make it
* accessible in beans which cannot access the service directly,
@@ -249,7 +255,9 @@ public class RepositoryApplicationConfiguration extends JpaBaseConfiguration {
@Bean
@ConditionalOnMissingBean
public TenantStatsManagement tenantStatsManagement() {
- return new JpaTenantStatsManagement();
+ final TenantStatsManagement mgmt = new JpaTenantStatsManagement();
+ eventBus.register(mgmt);
+ return mgmt;
}
/**
diff --git a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaControllerManagement.java b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaControllerManagement.java
index b9dfce105..b574d1452 100644
--- a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaControllerManagement.java
+++ b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaControllerManagement.java
@@ -451,8 +451,8 @@ public class JpaControllerManagement implements ControllerManagement {
@Override
@Modifying
@Transactional(isolation = Isolation.READ_UNCOMMITTED)
- public void addInformationalActionStatus(final ActionStatus statusMessage) {
- actionStatusRepository.save((JpaActionStatus) statusMessage);
+ public ActionStatus addInformationalActionStatus(final ActionStatus statusMessage) {
+ return actionStatusRepository.save((JpaActionStatus) statusMessage);
}
@Override
@@ -469,8 +469,9 @@ public class JpaControllerManagement implements ControllerManagement {
}
@Override
- public void downloadProgressPercent(final long statusId, final int progressPercent) {
- cacheWriteNotify.downloadProgressPercent(statusId, progressPercent);
+ public void downloadProgress(final Long statusId, final Long requestedBytes, final Long shippedBytesSinceLast,
+ final Long shippedBytesOverall) {
+ cacheWriteNotify.downloadProgress(statusId, requestedBytes, shippedBytesSinceLast, shippedBytesOverall);
}
}
diff --git a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaSystemManagement.java b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaSystemManagement.java
index ea6c99708..1786dc976 100644
--- a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaSystemManagement.java
+++ b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaSystemManagement.java
@@ -147,7 +147,7 @@ public class JpaSystemManagement implements CurrentTenantCacheKeyGenerator, Syst
final List tenants = findTenants();
tenants.forEach(tenant -> tenantAware.runAsTenant(tenant, () -> {
- report.addTenantData(systemStatsManagement.getStatsOfTenant(tenant));
+ report.addTenantData(systemStatsManagement.getStatsOfTenant());
return null;
}));
}
diff --git a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaTenantStatsManagement.java b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaTenantStatsManagement.java
index 75f99d886..83f37304a 100644
--- a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaTenantStatsManagement.java
+++ b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaTenantStatsManagement.java
@@ -12,8 +12,8 @@ import java.util.Optional;
import org.eclipse.hawkbit.repository.TenantStatsManagement;
import org.eclipse.hawkbit.repository.report.model.TenantUsage;
+import org.eclipse.hawkbit.tenancy.TenantAware;
import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
@@ -35,9 +35,14 @@ public class JpaTenantStatsManagement implements TenantStatsManagement {
@Autowired
private ActionRepository actionRepository;
+ @Autowired
+ private TenantAware tenantAware;
+
@Override
@Transactional(propagation = Propagation.REQUIRES_NEW, isolation = Isolation.READ_UNCOMMITTED)
- public TenantUsage getStatsOfTenant(final String tenant) {
+ public TenantUsage getStatsOfTenant() {
+ final String tenant = tenantAware.getCurrentTenant();
+
final TenantUsage result = new TenantUsage(tenant);
result.setTargets(targetRepository.count());
diff --git a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/cache/CacheWriteNotify.java b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/cache/CacheWriteNotify.java
index fdaf868e8..6dfdf157f 100644
--- a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/cache/CacheWriteNotify.java
+++ b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/cache/CacheWriteNotify.java
@@ -8,9 +8,10 @@
*/
package org.eclipse.hawkbit.repository.jpa.cache;
-import org.eclipse.hawkbit.eventbus.event.DownloadProgressEvent;
+import java.math.RoundingMode;
+
+import org.eclipse.hawkbit.repository.eventbus.event.DownloadProgressEvent;
import org.eclipse.hawkbit.repository.eventbus.event.RolloutGroupCreatedEvent;
-import org.eclipse.hawkbit.repository.model.Action;
import org.eclipse.hawkbit.repository.model.ActionStatus;
import org.eclipse.hawkbit.repository.model.Rollout;
import org.eclipse.hawkbit.tenancy.TenantAware;
@@ -20,6 +21,7 @@ import org.springframework.cache.CacheManager;
import org.springframework.stereotype.Service;
import com.google.common.eventbus.EventBus;
+import com.google.common.math.DoubleMath;
/**
* An service which combines the functionality for functional use cases to write
@@ -30,10 +32,6 @@ import com.google.common.eventbus.EventBus;
*/
@Service
public class CacheWriteNotify {
-
- /**
- *
- */
private static final int DOWNLOAD_PROGRESS_MAX = 100;
@Autowired
@@ -46,20 +44,29 @@ public class CacheWriteNotify {
private TenantAware tenantAware;
/**
- * writes the download progress in percentage into the cache
+ * writes the download progress into the cache
* {@link CacheKeys#DOWNLOAD_PROGRESS_PERCENT} and notifies the
* {@link EventBus} with a {@link DownloadProgressEvent}.
*
* @param statusId
* the ID of the {@link ActionStatus}
- * @param progressPercent
- * the progress in percentage which must be between 0-100
+ * @param requestedBytes
+ * requested bytes of the request
+ * @param shippedBytesSinceLast
+ * since last event
+ * @param shippedBytesOverall
+ * for the download request
*/
- public void downloadProgressPercent(final long statusId, final int progressPercent) {
+ public void downloadProgress(final Long statusId, final Long requestedBytes, final Long shippedBytesSinceLast,
+ final Long shippedBytesOverall) {
- final Cache cache = cacheManager.getCache(Action.class.getName());
+ final Cache cache = cacheManager.getCache(ActionStatus.class.getName());
final String cacheKey = CacheKeys.entitySpecificCacheKey(String.valueOf(statusId),
CacheKeys.DOWNLOAD_PROGRESS_PERCENT);
+
+ final int progressPercent = DoubleMath.roundToInt(shippedBytesOverall * 100.0 / requestedBytes,
+ RoundingMode.DOWN);
+
if (progressPercent < DOWNLOAD_PROGRESS_MAX) {
cache.put(cacheKey, progressPercent);
} else {
@@ -69,7 +76,8 @@ public class CacheWriteNotify {
cache.evict(cacheKey);
}
- eventBus.post(new DownloadProgressEvent(tenantAware.getCurrentTenant(), statusId, progressPercent));
+ eventBus.post(new DownloadProgressEvent(tenantAware.getCurrentTenant(), statusId, requestedBytes,
+ shippedBytesSinceLast, shippedBytesOverall));
}
/**
diff --git a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/model/JpaAction.java b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/model/JpaAction.java
index 2b8744618..5fa2c3bed 100644
--- a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/model/JpaAction.java
+++ b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/model/JpaAction.java
@@ -27,10 +27,7 @@ import javax.persistence.NamedEntityGraphs;
import javax.persistence.NamedSubgraph;
import javax.persistence.OneToMany;
import javax.persistence.Table;
-import javax.persistence.Transient;
-import org.eclipse.hawkbit.repository.jpa.cache.CacheField;
-import org.eclipse.hawkbit.repository.jpa.cache.CacheKeys;
import org.eclipse.hawkbit.repository.model.Action;
import org.eclipse.hawkbit.repository.model.ActionStatus;
import org.eclipse.hawkbit.repository.model.DistributionSet;
@@ -89,13 +86,6 @@ public class JpaAction extends AbstractJpaTenantAwareBaseEntity implements Actio
@JoinColumn(name = "rollout", foreignKey = @ForeignKey(value = ConstraintMode.CONSTRAINT, name = "fk_action_rollout"))
private JpaRollout rollout;
- /**
- * Note: filled only in {@link Status#DOWNLOAD}.
- */
- @Transient
- @CacheField(key = CacheKeys.DOWNLOAD_PROGRESS_PERCENT)
- private int downloadProgressPercent;
-
@Override
public DistributionSet getDistributionSet() {
return distributionSet;
@@ -120,15 +110,6 @@ public class JpaAction extends AbstractJpaTenantAwareBaseEntity implements Actio
this.status = status;
}
- @Override
- public int getDownloadProgressPercent() {
- return downloadProgressPercent;
- }
-
- public void setDownloadProgressPercent(final int downloadProgressPercent) {
- this.downloadProgressPercent = downloadProgressPercent;
- }
-
@Override
public boolean isActive() {
return active;
diff --git a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/model/JpaActionStatus.java b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/model/JpaActionStatus.java
index ef1ad3d1e..3a8cb8683 100644
--- a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/model/JpaActionStatus.java
+++ b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/model/JpaActionStatus.java
@@ -24,7 +24,10 @@ import javax.persistence.ManyToOne;
import javax.persistence.NamedAttributeNode;
import javax.persistence.NamedEntityGraph;
import javax.persistence.Table;
+import javax.persistence.Transient;
+import org.eclipse.hawkbit.repository.jpa.cache.CacheField;
+import org.eclipse.hawkbit.repository.jpa.cache.CacheKeys;
import org.eclipse.hawkbit.repository.model.Action;
import org.eclipse.hawkbit.repository.model.Action.Status;
import org.eclipse.hawkbit.repository.model.ActionStatus;
@@ -63,6 +66,13 @@ public class JpaActionStatus extends AbstractJpaTenantAwareBaseEntity implements
@Column(name = "detail_message", length = 512)
private final List messages = new ArrayList<>();
+ /**
+ * Note: filled only in {@link Status#DOWNLOAD}.
+ */
+ @Transient
+ @CacheField(key = CacheKeys.DOWNLOAD_PROGRESS_PERCENT)
+ private int downloadProgressPercent;
+
/**
* Creates a new {@link ActionStatus} object.
*
@@ -105,6 +115,11 @@ public class JpaActionStatus extends AbstractJpaTenantAwareBaseEntity implements
// JPA default constructor.
}
+ @Override
+ public int getDownloadProgressPercent() {
+ return downloadProgressPercent;
+ }
+
@Override
public Long getOccurredAt() {
return occurredAt;
diff --git a/hawkbit-repository/hawkbit-repository-jpa/src/test/java/org/eclipse/hawkbit/repository/jpa/cache/CacheWriteNotifyTest.java b/hawkbit-repository/hawkbit-repository-jpa/src/test/java/org/eclipse/hawkbit/repository/jpa/cache/CacheWriteNotifyTest.java
index 603af17c9..1f6fbca6f 100644
--- a/hawkbit-repository/hawkbit-repository-jpa/src/test/java/org/eclipse/hawkbit/repository/jpa/cache/CacheWriteNotifyTest.java
+++ b/hawkbit-repository/hawkbit-repository-jpa/src/test/java/org/eclipse/hawkbit/repository/jpa/cache/CacheWriteNotifyTest.java
@@ -13,8 +13,8 @@ import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
-import org.eclipse.hawkbit.eventbus.event.DownloadProgressEvent;
-import org.eclipse.hawkbit.repository.model.Action;
+import org.eclipse.hawkbit.repository.eventbus.event.DownloadProgressEvent;
+import org.eclipse.hawkbit.repository.model.ActionStatus;
import org.eclipse.hawkbit.tenancy.TenantAware;
import org.junit.Before;
import org.junit.Test;
@@ -59,15 +59,14 @@ public class CacheWriteNotifyTest {
@Test
public void downloadgProgressIsCachedAndEventSent() {
final long knownStatusId = 1;
- final int knownPercentage = 23;
- when(cacheManagerMock.getCache(Action.class.getName())).thenReturn(cacheMock);
+ when(cacheManagerMock.getCache(ActionStatus.class.getName())).thenReturn(cacheMock);
when(tenantAwareMock.getCurrentTenant()).thenReturn("default");
- underTest.downloadProgressPercent(knownStatusId, knownPercentage);
+ underTest.downloadProgress(knownStatusId, 500L, 100L, 100L);
- verify(cacheManagerMock).getCache(eq(Action.class.getName()));
- verify(cacheMock).put(knownStatusId + "." + CacheKeys.DOWNLOAD_PROGRESS_PERCENT, knownPercentage);
+ verify(cacheManagerMock).getCache(eq(ActionStatus.class.getName()));
+ verify(cacheMock).put(knownStatusId + "." + CacheKeys.DOWNLOAD_PROGRESS_PERCENT, 20);
verify(eventBusMock).post(any(DownloadProgressEvent.class));
}
diff --git a/hawkbit-rest-core/src/main/java/org/eclipse/hawkbit/rest/util/RestResourceConversionHelper.java b/hawkbit-rest-core/src/main/java/org/eclipse/hawkbit/rest/util/RestResourceConversionHelper.java
index 875152e0e..0c9dd39c5 100644
--- a/hawkbit-rest-core/src/main/java/org/eclipse/hawkbit/rest/util/RestResourceConversionHelper.java
+++ b/hawkbit-rest-core/src/main/java/org/eclipse/hawkbit/rest/util/RestResourceConversionHelper.java
@@ -23,6 +23,7 @@ import javax.servlet.http.HttpServletResponse;
import org.eclipse.hawkbit.artifact.repository.model.DbArtifact;
import org.eclipse.hawkbit.repository.ControllerManagement;
+import org.eclipse.hawkbit.repository.model.ActionStatus;
import org.eclipse.hawkbit.repository.model.LocalArtifact;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -87,7 +88,7 @@ public final class RestResourceConversionHelper {
* @param controllerManagement
* to write progress updates to
* @param statusId
- * of the UpdateActionStatus
+ * of the {@link ActionStatus}
*
* @return http code
*
@@ -293,6 +294,7 @@ public final class RestResourceConversionHelper {
long toRead = length;
boolean toContinue = true;
+ long shippedSinceLastEvent = 0;
while (toContinue) {
final int r = from.read(buf);
@@ -304,9 +306,11 @@ public final class RestResourceConversionHelper {
if (toRead > 0) {
to.write(buf, 0, r);
total += r;
+ shippedSinceLastEvent += r;
} else {
to.write(buf, 0, (int) toRead + r);
total += toRead + r;
+ shippedSinceLastEvent += toRead + r;
toContinue = false;
}
@@ -316,7 +320,8 @@ public final class RestResourceConversionHelper {
// every 10 percent an event
if (newPercent == 100 || newPercent > progressPercent + 10) {
progressPercent = newPercent;
- controllerManagement.downloadProgressPercent(statusId, progressPercent);
+ controllerManagement.downloadProgress(statusId, length, shippedSinceLastEvent, total);
+ shippedSinceLastEvent = 0;
}
}
}
diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/artifacts/smtype/CreateUpdateSoftwareTypeLayout.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/artifacts/smtype/CreateUpdateSoftwareTypeLayout.java
index 6355701c9..06fb8ed18 100644
--- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/artifacts/smtype/CreateUpdateSoftwareTypeLayout.java
+++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/artifacts/smtype/CreateUpdateSoftwareTypeLayout.java
@@ -164,10 +164,10 @@ public class CreateUpdateSoftwareTypeLayout extends CreateUpdateTypeLayout {
if (null != selectedTypeTag) {
tagDesc.setValue(selectedTypeTag.getDescription());
typeKey.setValue(selectedTypeTag.getKey());
- if (selectedTypeTag.getMaxAssignments() == Integer.MAX_VALUE) {
- assignOptiongroup.setValue(multiAssignStr);
- } else {
+ if (selectedTypeTag.getMaxAssignments() == 1) {
assignOptiongroup.setValue(singleAssignStr);
+ } else {
+ assignOptiongroup.setValue(multiAssignStr);
}
setColorPickerComponentsColor(selectedTypeTag.getColour());
}