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 12ff7dbd2..3d33b61f8 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
@@ -183,6 +183,7 @@ public class DeviceSimulatorUpdater {
final Artifact artifact) {
artifact.getUrls().entrySet().forEach(entry -> {
switch (entry.getKey()) {
+ case HTTP:
case HTTPS:
status.add(downloadUrl(entry.getValue(), targetToken, artifact.getHashes().getSha1()));
break;
diff --git a/examples/hawkbit-example-app/src/main/resources/application-cloudsandbox.properties b/examples/hawkbit-example-app/src/main/resources/application-cloudsandbox.properties
index ecf71da41..b740c2959 100644
--- a/examples/hawkbit-example-app/src/main/resources/application-cloudsandbox.properties
+++ b/examples/hawkbit-example-app/src/main/resources/application-cloudsandbox.properties
@@ -8,3 +8,7 @@
#
vaadin.servlet.productionMode=true
+
+hawkbit.artifact.url.coap.enabled=false
+hawkbit.artifact.url.http.enabled=false
+hawkbit.artifact.url.https.enabled=true
diff --git a/examples/hawkbit-example-app/src/main/resources/application.properties b/examples/hawkbit-example-app/src/main/resources/application.properties
index 64661d2ec..6e05b6b5a 100644
--- a/examples/hawkbit-example-app/src/main/resources/application.properties
+++ b/examples/hawkbit-example-app/src/main/resources/application.properties
@@ -7,15 +7,22 @@
# http://www.eclipse.org/legal/epl-v10.html
#
+# DDI authentication configuration
hawkbit.server.ddi.security.authentication.anonymous.enabled=true
-hawkbit.server.ddi.security.authentication.targettoken.enabled=false
-hawkbit.server.ddi.security.authentication.gatewaytoken.enabled=false
+hawkbit.server.ddi.security.authentication.targettoken.enabled=true
+hawkbit.server.ddi.security.authentication.gatewaytoken.enabled=true
-spring.profiles.active=amqp
+# Download URL generation config
+hawkbit.artifact.url.coap.enabled=false
+hawkbit.artifact.url.http.enabled=true
+hawkbit.artifact.url.http.port=8080
+hawkbit.artifact.url.https.enabled=false
+## Vaadin configuration
vaadin.servlet.productionMode=false
-## Configuration for RabbitMQ integration
+## Configuration for DMF/RabbitMQ integration
+spring.profiles.active=amqp
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
spring.rabbitmq.virtualHost=/
diff --git a/hawkbit-core/src/main/java/org/eclipse/hawkbit/api/ArtifactUrlHandler.java b/hawkbit-core/src/main/java/org/eclipse/hawkbit/api/ArtifactUrlHandler.java
index 522444961..03492122c 100644
--- a/hawkbit-core/src/main/java/org/eclipse/hawkbit/api/ArtifactUrlHandler.java
+++ b/hawkbit-core/src/main/java/org/eclipse/hawkbit/api/ArtifactUrlHandler.java
@@ -13,7 +13,6 @@ package org.eclipse.hawkbit.api;
* URLs to specific artifacts.
*
*/
-@FunctionalInterface
public interface ArtifactUrlHandler {
/**
@@ -34,4 +33,11 @@ public interface ArtifactUrlHandler {
*/
String getUrl(String controllerId, final Long softwareModuleId, final String filename, final String sha1Hash,
final UrlProtocol protocol);
+
+ /**
+ * @param protocol
+ * to check support for
+ * @return true of the handler supports given protocol.
+ */
+ boolean protocolSupported(UrlProtocol protocol);
}
diff --git a/hawkbit-core/src/main/java/org/eclipse/hawkbit/api/ArtifactUrlHandlerProperties.java b/hawkbit-core/src/main/java/org/eclipse/hawkbit/api/ArtifactUrlHandlerProperties.java
index 33fe8651e..50f3f4cad 100644
--- a/hawkbit-core/src/main/java/org/eclipse/hawkbit/api/ArtifactUrlHandlerProperties.java
+++ b/hawkbit-core/src/main/java/org/eclipse/hawkbit/api/ArtifactUrlHandlerProperties.java
@@ -78,6 +78,12 @@ public class ArtifactUrlHandlerProperties {
* @return the pattern to build the URL.
*/
String getPattern();
+
+ /**
+ * @return true if the {@link ProtocolProperties} is
+ * enabled.
+ */
+ boolean isEnabled();
}
/**
@@ -93,6 +99,20 @@ public class ArtifactUrlHandlerProperties {
*/
private String pattern = "{protocol}://{hostname}:{port}/{tenant}/controller/v1/{targetId}/softwaremodules/{softwareModuleId}/artifacts/{artifactFileName}";
+ /**
+ * Enables HTTP URI generation in DDI and DMF.
+ */
+ private boolean enabled = true;
+
+ @Override
+ public boolean isEnabled() {
+ return enabled;
+ }
+
+ public void setEnabled(final boolean enabled) {
+ this.enabled = enabled;
+ }
+
@Override
public String getHostname() {
return hostname;
@@ -143,6 +163,20 @@ public class ArtifactUrlHandlerProperties {
*/
private String pattern = "{protocol}://{hostname}:{port}/{tenant}/controller/v1/{targetId}/softwaremodules/{softwareModuleId}/artifacts/{artifactFileName}";
+ /**
+ * Enables HTTPS URI generation in DDI and DMF.
+ */
+ private boolean enabled = true;
+
+ @Override
+ public boolean isEnabled() {
+ return enabled;
+ }
+
+ public void setEnabled(final boolean enabled) {
+ this.enabled = enabled;
+ }
+
@Override
public String getHostname() {
return hostname;
@@ -193,6 +227,20 @@ public class ArtifactUrlHandlerProperties {
*/
private String pattern = "{protocol}://{ip}:{port}/fw/{tenant}/{targetId}/sha1/{artifactSHA1}";
+ /**
+ * Enables CoAP URI generation in DMF.
+ */
+ private boolean enabled = true;
+
+ @Override
+ public boolean isEnabled() {
+ return enabled;
+ }
+
+ public void setEnabled(final boolean enabled) {
+ this.enabled = enabled;
+ }
+
@Override
public String getHostname() {
return hostname;
diff --git a/hawkbit-core/src/main/java/org/eclipse/hawkbit/api/PropertyBasedArtifactUrlHandler.java b/hawkbit-core/src/main/java/org/eclipse/hawkbit/api/PropertyBasedArtifactUrlHandler.java
index 174086613..0072f2fbd 100644
--- a/hawkbit-core/src/main/java/org/eclipse/hawkbit/api/PropertyBasedArtifactUrlHandler.java
+++ b/hawkbit-core/src/main/java/org/eclipse/hawkbit/api/PropertyBasedArtifactUrlHandler.java
@@ -84,4 +84,15 @@ public class PropertyBasedArtifactUrlHandler implements ArtifactUrlHandler {
return replaceMap;
}
+ @Override
+ public boolean protocolSupported(final UrlProtocol protocol) {
+ final String protocolString = protocol.name().toLowerCase();
+ final ProtocolProperties properties = urlHandlerProperties.getProperties(protocolString);
+ if (properties == null || properties.getPattern() == null) {
+ return false;
+ }
+
+ return properties.isEnabled();
+ }
+
}
diff --git a/hawkbit-dmf-amqp/src/main/java/org/eclipse/hawkbit/amqp/AmqpMessageDispatcherService.java b/hawkbit-dmf-amqp/src/main/java/org/eclipse/hawkbit/amqp/AmqpMessageDispatcherService.java
index 32bcb02a5..dae5772e6 100644
--- a/hawkbit-dmf-amqp/src/main/java/org/eclipse/hawkbit/amqp/AmqpMessageDispatcherService.java
+++ b/hawkbit-dmf-amqp/src/main/java/org/eclipse/hawkbit/amqp/AmqpMessageDispatcherService.java
@@ -155,18 +155,26 @@ public class AmqpMessageDispatcherService extends BaseAmqpService {
private Artifact convertArtifact(final String targetId, final LocalArtifact localArtifact) {
final Artifact artifact = new Artifact();
- artifact.getUrls().put(Artifact.UrlProtocol.COAP,
- artifactUrlHandler.getUrl(targetId, localArtifact.getSoftwareModule().getId(),
- localArtifact.getFilename(), localArtifact.getSha1Hash(), UrlProtocol.COAP));
- artifact.getUrls().put(Artifact.UrlProtocol.HTTP,
- artifactUrlHandler.getUrl(targetId, localArtifact.getSoftwareModule().getId(),
- localArtifact.getFilename(), localArtifact.getSha1Hash(), UrlProtocol.HTTP));
- artifact.getUrls().put(Artifact.UrlProtocol.HTTPS,
- artifactUrlHandler.getUrl(targetId, localArtifact.getSoftwareModule().getId(),
- localArtifact.getFilename(), localArtifact.getSha1Hash(), UrlProtocol.HTTPS));
+ if (artifactUrlHandler.protocolSupported(UrlProtocol.COAP)) {
+ artifact.getUrls().put(Artifact.UrlProtocol.COAP,
+ artifactUrlHandler.getUrl(targetId, localArtifact.getSoftwareModule().getId(),
+ localArtifact.getFilename(), localArtifact.getSha1Hash(), UrlProtocol.COAP));
+ }
+
+ if (artifactUrlHandler.protocolSupported(UrlProtocol.HTTP)) {
+ artifact.getUrls().put(Artifact.UrlProtocol.HTTP,
+ artifactUrlHandler.getUrl(targetId, localArtifact.getSoftwareModule().getId(),
+ localArtifact.getFilename(), localArtifact.getSha1Hash(), UrlProtocol.HTTP));
+ }
+
+ if (artifactUrlHandler.protocolSupported(UrlProtocol.HTTPS)) {
+ artifact.getUrls().put(Artifact.UrlProtocol.HTTPS,
+ artifactUrlHandler.getUrl(targetId, localArtifact.getSoftwareModule().getId(),
+ localArtifact.getFilename(), localArtifact.getSha1Hash(), UrlProtocol.HTTPS));
+ }
artifact.setFilename(localArtifact.getFilename());
- artifact.setHashes(new ArtifactHash(localArtifact.getSha1Hash(), null));
+ artifact.setHashes(new ArtifactHash(localArtifact.getSha1Hash(), localArtifact.getMd5Hash()));
artifact.setSize(localArtifact.getSize());
return artifact;
}
diff --git a/hawkbit-dmf-api/src/main/java/org/eclipse/hawkbit/dmf/json/model/ArtifactHash.java b/hawkbit-dmf-api/src/main/java/org/eclipse/hawkbit/dmf/json/model/ArtifactHash.java
index 5ddb48e4f..6f86fe4a4 100644
--- a/hawkbit-dmf-api/src/main/java/org/eclipse/hawkbit/dmf/json/model/ArtifactHash.java
+++ b/hawkbit-dmf-api/src/main/java/org/eclipse/hawkbit/dmf/json/model/ArtifactHash.java
@@ -13,10 +13,6 @@ import com.fasterxml.jackson.annotation.JsonProperty;
/**
* JSON representation of artifact hash.
- *
- *
- *
- *
*/
public class ArtifactHash {
diff --git a/hawkbit-repository/src/test/java/org/eclipse/hawkbit/TestConfiguration.java b/hawkbit-repository/src/test/java/org/eclipse/hawkbit/TestConfiguration.java
index 70372fac2..d96856557 100644
--- a/hawkbit-repository/src/test/java/org/eclipse/hawkbit/TestConfiguration.java
+++ b/hawkbit-repository/src/test/java/org/eclipse/hawkbit/TestConfiguration.java
@@ -79,7 +79,7 @@ public class TestConfiguration implements AsyncConfigurer {
}
/**
- * Bean for the downlod id cache.
+ * Bean for the download id cache.
*
* @return the cache
*/
diff --git a/hawkbit-rest-resource/src/main/java/org/eclipse/hawkbit/controller/DataConversionHelper.java b/hawkbit-rest-resource/src/main/java/org/eclipse/hawkbit/controller/DataConversionHelper.java
index e035c47ee..15c2592df 100644
--- a/hawkbit-rest-resource/src/main/java/org/eclipse/hawkbit/controller/DataConversionHelper.java
+++ b/hawkbit-rest-resource/src/main/java/org/eclipse/hawkbit/controller/DataConversionHelper.java
@@ -31,7 +31,6 @@ import org.eclipse.hawkbit.repository.model.LocalArtifact;
import org.eclipse.hawkbit.repository.model.Target;
import org.eclipse.hawkbit.rest.resource.model.artifact.ArtifactHash;
import org.eclipse.hawkbit.tenancy.TenantAware;
-import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.hateoas.Link;
import com.google.common.base.Charsets;
@@ -40,10 +39,6 @@ import com.google.common.base.Charsets;
* Utility class for the Controller API.
*/
public final class DataConversionHelper {
-
- @Autowired
- ArtifactUrlHandler artifactUrlHandler;
-
// utility class, private constructor.
private DataConversionHelper() {
@@ -55,7 +50,6 @@ public final class DataConversionHelper {
.map(module -> new Chunk(mapChunkLegacyKeys(module.getType().getKey()), module.getVersion(),
module.getName(), createArtifacts(targetid, module, artifactUrlHandler)))
.collect(Collectors.toList());
-
}
private static String mapChunkLegacyKeys(final String key) {
@@ -76,29 +70,39 @@ public final class DataConversionHelper {
* of the target
* @param module
* the software module
+ *
* @return a list of artifacts or a empty list. Cannot be .
*/
public static List createArtifacts(final String targetid,
final org.eclipse.hawkbit.repository.model.SoftwareModule module,
final ArtifactUrlHandler artifactUrlHandler) {
final List files = new ArrayList<>();
- module.getLocalArtifacts().forEach(artifact -> {
- final Artifact file = new Artifact();
- file.setHashes(new ArtifactHash(artifact.getSha1Hash(), artifact.getMd5Hash()));
- file.setFilename(artifact.getFilename());
- file.setSize(artifact.getSize());
+ module.getLocalArtifacts()
+ .forEach(artifact -> files.add(createArtifact(targetid, artifactUrlHandler, artifact)));
+ return files;
+ }
+
+ private static Artifact createArtifact(final String targetid, final ArtifactUrlHandler artifactUrlHandler,
+ final LocalArtifact artifact) {
+ final Artifact file = new Artifact();
+ file.setHashes(new ArtifactHash(artifact.getSha1Hash(), artifact.getMd5Hash()));
+ file.setFilename(artifact.getFilename());
+ file.setSize(artifact.getSize());
+
+ if (artifactUrlHandler.protocolSupported(UrlProtocol.HTTP)) {
final String linkHttp = artifactUrlHandler.getUrl(targetid, artifact.getSoftwareModule().getId(),
artifact.getFilename(), artifact.getSha1Hash(), UrlProtocol.HTTP);
+ file.add(new Link(linkHttp).withRel("download-http"));
+ file.add(new Link(linkHttp + ControllerConstants.ARTIFACT_MD5_DWNL_SUFFIX).withRel("md5sum-http"));
+ }
+
+ if (artifactUrlHandler.protocolSupported(UrlProtocol.HTTPS)) {
final String linkHttps = artifactUrlHandler.getUrl(targetid, artifact.getSoftwareModule().getId(),
artifact.getFilename(), artifact.getSha1Hash(), UrlProtocol.HTTPS);
file.add(new Link(linkHttps).withRel("download"));
file.add(new Link(linkHttps + ControllerConstants.ARTIFACT_MD5_DWNL_SUFFIX).withRel("md5sum"));
- file.add(new Link(linkHttp).withRel("download-http"));
- file.add(new Link(linkHttp + ControllerConstants.ARTIFACT_MD5_DWNL_SUFFIX).withRel("md5sum-http"));
-
- files.add(file);
- });
- return files;
+ }
+ return file;
}
static ControllerBase fromTarget(final Target target, final List actions,