Merge branch 'Feature/Add_Rest_Api_with_Java_client' of https://github.com/bsinno/hawkbit.git into Feature/Add_Rest_Api_with_Java_client

Conflicts:
	examples/hawkbit-example-ddi-client/src/main/java/org/eclipse/hawkbit/ddi/client/DdiExampleClient.java


Signed-off-by: Jonathan Philip Knoblauch <JonathanPhilip.Knoblauch@bosch-si.com>
This commit is contained in:
Jonathan Philip Knoblauch
2016-04-27 12:23:36 +02:00
11 changed files with 311 additions and 195 deletions

View File

@@ -1,27 +1,27 @@
/**
* 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.ddi.client;
import org.springframework.http.MediaType;
import feign.RequestInterceptor;
import feign.RequestTemplate;
/**
*
*
*/
public class DdiAcceptedRequestInterceptor implements RequestInterceptor {
@Override
public void apply(final RequestTemplate template) {
template.header("Accept", MediaType.APPLICATION_JSON_VALUE, MediaType.APPLICATION_OCTET_STREAM_VALUE,
MediaType.TEXT_PLAIN_VALUE);
}
}
/**
* 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.ddi.client;
import org.springframework.http.MediaType;
import feign.RequestInterceptor;
import feign.RequestTemplate;
/**
*
*
*/
public class DdiAcceptedRequestInterceptor implements RequestInterceptor {
@Override
public void apply(final RequestTemplate template) {
template.header("Accept", MediaType.APPLICATION_JSON_VALUE, MediaType.APPLICATION_OCTET_STREAM_VALUE,
MediaType.TEXT_PLAIN_VALUE);
}
}

View File

@@ -9,6 +9,7 @@
package org.eclipse.hawkbit.ddi.client;
import org.apache.commons.lang.Validate;
import org.eclipse.hawkbit.ddi.client.authenctication.AuthenticationInterceptor;
import org.eclipse.hawkbit.ddi.client.resource.RootControllerResourceClient;
import org.eclipse.hawkbit.feign.core.client.ApplicationJsonRequestHeaderInterceptor;
import org.eclipse.hawkbit.feign.core.client.IgnoreMultipleConsumersProducersSpringMvcContract;
@@ -31,10 +32,20 @@ public class DdiDefaultFeignClient {
private final String tenant;
public DdiDefaultFeignClient(final String baseUrl, final String tenant) {
this(baseUrl, tenant, null);
}
public DdiDefaultFeignClient(final String baseUrl, final String tenant,
final AuthenticationInterceptor authenticationInterceptor) {
feignBuilder = Feign.builder().contract(new IgnoreMultipleConsumersProducersSpringMvcContract())
.requestInterceptor(new ApplicationJsonRequestHeaderInterceptor())
.requestInterceptor(new DdiAcceptedRequestInterceptor()).logLevel(Level.FULL)
.logger(new Logger.ErrorLogger()).encoder(new JacksonEncoder()).decoder(new DdiDecoder());
if (authenticationInterceptor != null) {
feignBuilder.requestInterceptor(authenticationInterceptor);
}
Validate.notNull(baseUrl, "A baseUrl has to be set");
Validate.notNull(tenant, "A tenant has to be set");
this.baseUrl = baseUrl;

View File

@@ -12,10 +12,12 @@ import java.io.IOException;
import java.io.InputStream;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.temporal.ChronoField;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Pattern;
import org.eclipse.hawkbit.ddi.client.authenctication.AuthenticationInterceptor;
import org.eclipse.hawkbit.ddi.client.resource.RootControllerResourceClient;
import org.eclipse.hawkbit.ddi.client.strategy.PersistenceStrategy;
import org.eclipse.hawkbit.ddi.json.model.DdiActionFeedback;
@@ -45,10 +47,10 @@ public class DdiExampleClient implements Runnable {
private final RootControllerResourceClient rootControllerResourceClient;
private final PersistenceStrategy persistenceStrategy;
private DdiClientStatus clientStatus;
private final DdiDefaultFeignClient sdiDefaultFeignClient;
private FinalResult finalResultOfCurrentUpdate;
/**
/**
* Constructor for the DDI example client.
*
* @param baseUrl
@@ -62,19 +64,34 @@ public class DdiExampleClient implements Runnable {
*/
public DdiExampleClient(final String baseUrl, final String controllerId, final String tenant,
final PersistenceStrategy persistenceStrategy) {
this.controllerId = controllerId;
sdiDefaultFeignClient = new DdiDefaultFeignClient(baseUrl, tenant);
this(baseUrl, controllerId, tenant, persistenceStrategy, null);
}
this.rootControllerResourceClient = sdiDefaultFeignClient.getRootControllerResourceClient();
/**
* Constructor for the DDI example client.
*
* @param baseUrl
* the base url of the hawkBit server
* @param controllerId
* the controller id that will be simulated
* @param tenant
* the tenant
* @param persistenceStrategy
* the persistence strategy for downloading artifacts
* @param authenticationInterceptor
* the authentication intercepter to authenticate the DDI client,
* might be {@code null}
*/
public DdiExampleClient(final String baseUrl, final String controllerId, final String tenant,
final PersistenceStrategy persistenceStrategy, final AuthenticationInterceptor authenticationInterceptor) {
this.controllerId = controllerId;
this.rootControllerResourceClient = new DdiDefaultFeignClient(baseUrl, tenant, authenticationInterceptor)
.getRootControllerResourceClient();
this.actionIdOfLastInstalltion = null;
this.persistenceStrategy = persistenceStrategy;
this.clientStatus = DdiClientStatus.DOWN;
}
public DdiDefaultFeignClient getSdiDefaultFeignClient() {
return sdiDefaultFeignClient;
}
@Override
public void run() {
clientStatus = DdiClientStatus.UP;
@@ -84,7 +101,7 @@ public class DdiExampleClient implements Runnable {
response = rootControllerResourceClient.getControllerBase(controllerId);
final String pollingTimeFormReponse = response.getBody().getConfig().getPolling().getSleep();
final LocalTime localtime = LocalTime.parse(pollingTimeFormReponse);
final long pollingIntervalInMillis = localtime.toNanoOfDay();
final long pollingIntervalInMillis = localtime.getLong(ChronoField.MILLI_OF_DAY);
final Link controllerDeploymentBaseLink = response.getBody().getLink("deploymentBase");
if (controllerDeploymentBaseLink != null) {
final Long actionId = getActionIdOutOfLink(controllerDeploymentBaseLink);

View File

@@ -0,0 +1,19 @@
/**
* 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.ddi.client.authenctication;
import feign.RequestInterceptor;
/**
* An DdiClient authentication intercepter to provide credential information
* e.g. in http-headers.
*/
public interface AuthenticationInterceptor extends RequestInterceptor {
}

View File

@@ -0,0 +1,34 @@
/**
* 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.ddi.client.authenctication;
/**
* A factory to create {@link AuthenticationInterceptor}s.
*/
public class AuthenticationInterceptorFactory {
private AuthenticationInterceptorFactory() {
// factory class no public constructor
}
/**
* Creates a new {@link AuthenticationInterceptor} to authenticate a
* Ddi-Client via a target-security-token HTTP authorization header.
*
* @param targetSecurityToken
* the target-security-token to be added to the HTTP
* 'TargetToken' authorization header
* @return the authentication interceptor which can be used to authenticate
* an Ddi-Client
*/
public static AuthenticationInterceptor createTargetSecurityAuthenticator(final String targetSecurityToken) {
return new TargetSecurityTokenAuthenticationInterceptor(targetSecurityToken);
}
}

View File

@@ -0,0 +1,35 @@
/**
* 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.ddi.client.authenctication;
import com.google.common.net.HttpHeaders;
import feign.RequestTemplate;
/**
* Implementation of the {@link AuthenticationInterceptor} to add a given
* target-security-token to the HTTP authorization header.
*/
class TargetSecurityTokenAuthenticationInterceptor implements AuthenticationInterceptor {
private final String targetSecurityToken;
/**
* @param targetSecurityToken
* the security token to add to the authorization header
*/
TargetSecurityTokenAuthenticationInterceptor(final String targetSecurityToken) {
this.targetSecurityToken = targetSecurityToken;
}
@Override
public void apply(final RequestTemplate template) {
template.header(HttpHeaders.AUTHORIZATION, "TargetToken " + targetSecurityToken);
}
}

View File

@@ -1,5 +1,7 @@
package org.eclipse.hawkbit.example.ddi.client;
import org.eclipse.hawkbit.ddi.client.DdiExampleClient;
import org.eclipse.hawkbit.ddi.client.strategy.SaveArtifactsStrategy;
import org.junit.Test;
/**
@@ -9,14 +11,12 @@ public class AppTest {
@Test
public void AppTest() {
// final DdiExampleClient ddiClient = new
// DdiExampleClient("http://localhost:8080/", "Einstein1", "DEFAULT",
// 2000,
// new SaveArtifactsStrategy());
// final Thread thread = new Thread(ddiClient);
// thread.run();
//
// System.out.println("next steps........................");
final DdiExampleClient ddiClient = new DdiExampleClient("http://localhost:8080/", "Einstein15", "DEFAULT",
new SaveArtifactsStrategy());
final Thread thread = new Thread(ddiClient);
thread.run();
System.out.println("next steps........................");
}
}