use of io.syndesis.common.model.connection.DynamicActionMetadata in project syndesis by syndesisio.
the class ConnectionActionHandlerTest method shouldSetInoutOutputShapesToAnyIfMetadataCallFails.
@Test
public void shouldSetInoutOutputShapesToAnyIfMetadataCallFails() {
@SuppressWarnings({ "unchecked", "rawtypes" }) final Class<Entity<Map<String, Object>>> entityType = (Class) Entity.class;
ArgumentCaptor.forClass(entityType);
// simulates fallback return
final DynamicActionMetadata fallback = new DynamicActionMetadata.Builder().build();
when(metadataCommand.execute()).thenReturn(fallback);
when(((HystrixInvokableInfo<?>) metadataCommand).isSuccessfulExecution()).thenReturn(false);
final Response response = handler.enrichWithMetadata(SALESFORCE_CREATE_OR_UPDATE, Collections.emptyMap());
@SuppressWarnings("unchecked") final Meta<ConnectorDescriptor> meta = (Meta<ConnectorDescriptor>) response.getEntity();
final ConnectorDescriptor descriptor = meta.getValue();
assertThat(descriptor.getInputDataShape()).contains(ConnectionActionHandler.ANY_SHAPE);
assertThat(descriptor.getOutputDataShape()).contains(salesforceOutputShape);
}
use of io.syndesis.common.model.connection.DynamicActionMetadata in project syndesis-qe by syndesisio.
the class StepDescriptorEndpoint method getStepDescriptor.
public StepDescriptor getStepDescriptor(String stepKind, DataShape in, DataShape out) {
super.setEndpointName("/steps/" + stepKind + "/descriptor");
log.debug("POST, destination : {}", getEndpointUrl());
final Invocation.Builder invocation = createInvocation(null);
DynamicActionMetadata metadata = new DynamicActionMetadata.Builder().inputShape(in).outputShape(out).build();
JsonNode response;
try {
response = invocation.post(Entity.entity(metadata, MediaType.APPLICATION_JSON), JsonNode.class);
} catch (BadRequestException ex) {
log.error("Bad request, trying again in 15 seconds");
try {
Thread.sleep(15000L);
} catch (InterruptedException ignore) {
// ignore
}
response = invocation.post(Entity.entity(metadata, MediaType.APPLICATION_JSON), JsonNode.class);
}
return transformJsonNode(response, StepDescriptor.class);
}
use of io.syndesis.common.model.connection.DynamicActionMetadata in project syndesis by syndesisio.
the class ConnectionActionHandler method applyMetadataTo.
private static ConnectorDescriptor applyMetadataTo(final ConnectorDescriptor descriptor, final DynamicActionMetadata dynamicMetadata) {
final Map<String, List<DynamicActionMetadata.ActionPropertySuggestion>> actionPropertySuggestions = dynamicMetadata.properties();
final ConnectorDescriptor.Builder enriched = new ConnectorDescriptor.Builder().createFrom(descriptor);
actionPropertySuggestions.forEach((k, vals) -> enriched.replaceConfigurationProperty(k, b -> b.addAllEnum(vals.stream().map(s -> ConfigurationProperty.PropertyValue.Builder.from(s))::iterator)));
// Setting the defaultValue as suggested by the metadata
for (final Entry<String, List<DynamicActionMetadata.ActionPropertySuggestion>> suggestions : actionPropertySuggestions.entrySet()) {
if (suggestions.getValue().size() == 1) {
for (final DynamicActionMetadata.ActionPropertySuggestion suggestion : suggestions.getValue()) {
enriched.replaceConfigurationProperty(suggestion.displayValue(), v -> v.defaultValue(suggestion.value()));
}
}
}
final DataShape input = dynamicMetadata.inputShape();
if (shouldEnrichDataShape(descriptor.getInputDataShape(), input)) {
enriched.inputDataShape(input);
}
final DataShape output = dynamicMetadata.outputShape();
if (shouldEnrichDataShape(descriptor.getOutputDataShape(), output)) {
enriched.outputDataShape(output);
}
return adaptDataShapes(enriched);
}
use of io.syndesis.common.model.connection.DynamicActionMetadata in project syndesis by syndesisio.
the class ConnectionActionHandler method enrichWithMetadata.
@POST
@Path(value = "/{id}")
@Produces(MediaType.APPLICATION_JSON)
@ApiOperation("Retrieves enriched action definition, that is an action definition that has input/output data shapes and property enums defined with respect to the given action properties")
@ApiResponses(@ApiResponse(code = 200, reference = "#/definitions/ConnectorDescriptor", message = "A map of zero or more action property suggestions keyed by the property name"))
public Response enrichWithMetadata(@PathParam("id") @ApiParam(required = true, example = "io.syndesis:salesforce-create-or-update:latest") final String id, final Map<String, String> properties) {
final ConnectorAction action = //
actions.stream().filter(//
a -> a.idEquals(id)).findAny().orElseThrow(() -> new EntityNotFoundException("Action with id: " + id));
final ConnectorDescriptor defaultDescriptor = action.getDescriptor();
if (!action.getTags().contains("dynamic")) {
return Response.ok().entity(Meta.verbatim(defaultDescriptor)).build();
}
final Map<String, String> parameters = encryptionComponent.decrypt(new HashMap<>(Optional.ofNullable(properties).orElseGet(HashMap::new)));
// put all action parameters with `null` values
defaultDescriptor.getPropertyDefinitionSteps().forEach(step -> step.getProperties().forEach((k, v) -> parameters.putIfAbsent(k, null)));
// add the pattern as a property
if (action.getPattern() != null) {
parameters.put(action.getPattern().getDeclaringClass().getSimpleName(), action.getPattern().name());
}
// lastly put all connection properties
parameters.putAll(encryptionComponent.decrypt(connection.getConfiguredProperties()));
final HystrixExecutable<DynamicActionMetadata> meta = createMetadataCommand(action, parameters);
final DynamicActionMetadata dynamicActionMetadata = meta.execute();
final ConnectorDescriptor enrichedDescriptor = applyMetadataTo(defaultDescriptor, dynamicActionMetadata);
@SuppressWarnings("unchecked") final HystrixInvokableInfo<ConnectorDescriptor> metaInfo = (HystrixInvokableInfo<ConnectorDescriptor>) meta;
final Meta<ConnectorDescriptor> metaResult = Meta.from(enrichedDescriptor, metaInfo);
final Status status = metaResult.getData().getType().map(t -> t.status).orElse(Status.OK);
return Response.status(status).entity(metaResult).build();
}
use of io.syndesis.common.model.connection.DynamicActionMetadata in project syndesis by syndesisio.
the class ConnectionActionHandlerTest method shouldProvideActionDefinition.
@Test
public void shouldProvideActionDefinition() {
@SuppressWarnings({ "unchecked", "rawtypes" }) final Class<Entity<Map<String, Object>>> entityType = (Class) Entity.class;
ArgumentCaptor.forClass(entityType);
final DynamicActionMetadata suggestions = new DynamicActionMetadata.Builder().putProperty("sObjectName", Arrays.asList(DynamicActionMetadata.ActionPropertySuggestion.Builder.of("Account", "Account"), DynamicActionMetadata.ActionPropertySuggestion.Builder.of("Contact", "Contact"))).build();
when(metadataCommand.execute()).thenReturn(suggestions);
when(((HystrixInvokableInfo<?>) metadataCommand).isSuccessfulExecution()).thenReturn(true);
final Response response = handler.enrichWithMetadata(SALESFORCE_CREATE_OR_UPDATE, Collections.emptyMap());
assertThat(response.getStatus()).isEqualTo(Status.OK.getStatusCode());
@SuppressWarnings("unchecked") final Meta<ConnectorDescriptor> meta = (Meta<ConnectorDescriptor>) response.getEntity();
final ConnectorDescriptor enrichedDefinitioin = new ConnectorDescriptor.Builder().createFrom(createOrUpdateSalesforceObjectDescriptor).replaceConfigurationProperty("sObjectName", c -> c.addEnum(ConfigurationProperty.PropertyValue.Builder.of("Account", "Account"), ConfigurationProperty.PropertyValue.Builder.of("Contact", "Contact"))).inputDataShape(//
ConnectionActionHandler.ANY_SHAPE).build();
assertThat(meta.getValue()).isEqualTo(enrichedDefinitioin);
}
Aggregations