use of io.gravitee.rest.api.services.dynamicproperties.model.DynamicProperty in project gravitee-management-rest-api by gravitee-io.
the class DynamicPropertyUpdater method update.
private void update(Collection<DynamicProperty> dynamicProperties) {
// Get latest changes
ApiEntity latestApi = apiService.findById(api.getId());
List<Property> properties = (latestApi.getProperties() != null) ? latestApi.getProperties().getProperties() : Collections.emptyList();
List<Property> userDefinedProperties = properties.stream().filter(property -> !property.isDynamic()).collect(Collectors.toList());
Map<String, Property> propertyMap = properties.stream().collect(Collectors.toMap(Property::getKey, property -> property));
List<Property> updatedProperties = new ArrayList<>();
boolean needToBeSaved = false;
for (DynamicProperty dynamicProperty : dynamicProperties) {
Property property = propertyMap.get(dynamicProperty.getKey());
if (property == null || property.isDynamic()) {
updatedProperties.add(dynamicProperty);
}
// save properties only if there's something new
if (property == null || (property.isDynamic() && !property.getValue().equals(dynamicProperty.getValue()))) {
needToBeSaved = true;
}
}
if (needToBeSaved) {
// Add previous user-defined properties
updatedProperties.addAll(userDefinedProperties);
// Sort properties alphabetically to avoid redeploy if just the order has changed.
List<Property> sortedUpdatedProperties = updatedProperties.stream().sorted(Comparator.comparing(Property::getKey)).collect(Collectors.toList());
// Create properties container
Properties apiProperties = new Properties();
try {
apiProperties.setProperties(sortedUpdatedProperties);
} catch (RuntimeException e) {
logger.error(e.getMessage(), e);
}
latestApi.setProperties(apiProperties);
boolean isSync = apiService.isSynchronized(api.getId());
// Update API
apiService.update(latestApi.getId(), ApiService.convert(latestApi));
// Do not deploy if there are manual changes to push
if (isSync) {
// Publish API only in case of changes
if (!updatedProperties.containsAll(properties) || !properties.containsAll(updatedProperties)) {
ApiDeploymentEntity deployEntity = new ApiDeploymentEntity();
deployEntity.setDeploymentLabel("Dynamic properties sync");
apiService.deploy(latestApi.getId(), "dynamic-property-updater", EventType.PUBLISH_API, deployEntity);
}
}
}
}
use of io.gravitee.rest.api.services.dynamicproperties.model.DynamicProperty in project gravitee-management-rest-api by gravitee-io.
the class DynamicPropertyUpdaterTest method shouldUpdateProperties.
@Test
public void shouldUpdateProperties() {
Mockito.when(provider.get()).thenReturn(CompletableFuture.supplyAsync(() -> {
DynamicProperty property = new DynamicProperty("my-key", "my-value");
return Collections.singletonList(property);
}));
poller.handle(1L);
}
use of io.gravitee.rest.api.services.dynamicproperties.model.DynamicProperty in project gravitee-management-rest-api by gravitee-io.
the class JoltMapper method map.
public Collection<DynamicProperty> map(String source) {
// Default value is equal to the input json value (in case empty jolt specs)
String jsonProperties = source;
ArrayList transformed;
if (jsonProperties != null && jsonProperties.charAt(0) == '[') {
transformed = (ArrayList) chainr.transform(JsonUtils.jsonToList(source));
} else {
transformed = (ArrayList) chainr.transform(JsonUtils.jsonToMap(source));
}
jsonProperties = JsonUtils.toJsonString(transformed);
List<Object> items = JsonUtils.jsonToList(jsonProperties);
Object collect = items.stream().map(item -> {
Map<String, String> mapItem = (Map<String, String>) item;
Object key = mapItem.get("key");
if (key instanceof Number) {
return new DynamicProperty(key.toString(), mapItem.get("value"));
} else {
return new DynamicProperty((String) key, mapItem.get("value"));
}
}).collect(Collectors.toList());
return (Collection<DynamicProperty>) collect;
}
use of io.gravitee.rest.api.services.dynamicproperties.model.DynamicProperty in project gravitee-management-rest-api by gravitee-io.
the class JoltMapperTest method test.
@Test
public void test() throws IOException {
mapper = new JoltMapper(read("/jolt/specification.json"));
String input = IOUtils.toString(read("/jolt/custom-response.json"), Charset.defaultCharset());
Collection<DynamicProperty> properties = mapper.map(input);
assertFalse(properties.isEmpty());
}
use of io.gravitee.rest.api.services.dynamicproperties.model.DynamicProperty in project gravitee-management-rest-api by gravitee-io.
the class HttpProvider method get.
@Override
public CompletableFuture<Collection<DynamicProperty>> get() {
Promise<Buffer> promise = Promise.promise();
URI requestUri = URI.create(dpConfiguration.getUrl());
boolean ssl = HTTPS_SCHEME.equalsIgnoreCase(requestUri.getScheme());
final HttpClientOptions clientOptions = new HttpClientOptions().setSsl(ssl).setTrustAll(true).setMaxPoolSize(1).setKeepAlive(false).setTcpKeepAlive(false).setConnectTimeout(2000);
final HttpClient httpClient = vertx.createHttpClient(clientOptions);
final int port = requestUri.getPort() != -1 ? requestUri.getPort() : (HTTPS_SCHEME.equals(requestUri.getScheme()) ? 443 : 80);
String relativeUri = (requestUri.getRawQuery() == null) ? requestUri.getRawPath() : requestUri.getRawPath() + '?' + requestUri.getRawQuery();
RequestOptions options = new RequestOptions().setMethod(HttpMethod.valueOf(dpConfiguration.getMethod().name())).setHost(requestUri.getHost()).setPort(port).setURI(relativeUri);
// headers
options.putHeader(HttpHeaders.USER_AGENT, NodeUtils.userAgent(node));
options.putHeader("X-Gravitee-Request-Id", UuidString.generateRandom());
if (dpConfiguration.getHeaders() != null) {
dpConfiguration.getHeaders().forEach(httpHeader -> options.putHeader(httpHeader.getName(), httpHeader.getValue()));
}
httpClient.request(options).onFailure(new Handler<Throwable>() {
@Override
public void handle(Throwable event) {
promise.fail(event);
// Close client
httpClient.close();
}
}).onSuccess(new Handler<HttpClientRequest>() {
@Override
public void handle(HttpClientRequest request) {
request.response(new Handler<AsyncResult<HttpClientResponse>>() {
@Override
public void handle(AsyncResult<HttpClientResponse> asyncResponse) {
if (asyncResponse.failed()) {
promise.fail(asyncResponse.cause());
// Close client
httpClient.close();
} else {
final HttpClientResponse response = asyncResponse.result();
if (response.statusCode() == HttpStatusCode.OK_200) {
response.bodyHandler(buffer -> {
promise.complete(buffer);
// Close client
httpClient.close();
});
} else {
promise.complete(null);
// Close client
httpClient.close();
}
}
}
}).exceptionHandler(new Handler<Throwable>() {
@Override
public void handle(Throwable throwable) {
promise.fail(throwable);
// Close client
httpClient.close();
}
});
if (!StringUtils.isEmpty(dpConfiguration.getBody())) {
request.end(dpConfiguration.getBody());
} else {
request.end();
}
}
});
return promise.future().map(new Function<Buffer, Collection<DynamicProperty>>() {
@Override
public Collection<DynamicProperty> apply(Buffer buffer) {
if (buffer == null) {
return null;
}
return mapper.map(buffer.toString());
}
}).toCompletionStage().toCompletableFuture();
}
Aggregations