Search in sources :

Example 21 with ConnectorDescriptor

use of io.syndesis.common.model.action.ConnectorDescriptor 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();
}
Also used : ConnectorDescriptor(io.syndesis.common.model.action.ConnectorDescriptor) ConnectorAction(io.syndesis.common.model.action.ConnectorAction) PathParam(javax.ws.rs.PathParam) Produces(javax.ws.rs.Produces) HystrixInvokableInfo(com.netflix.hystrix.HystrixInvokableInfo) Path(javax.ws.rs.Path) ApiParam(io.swagger.annotations.ApiParam) HashMap(java.util.HashMap) ConfigurationProperty(io.syndesis.common.model.connection.ConfigurationProperty) ApiResponses(io.swagger.annotations.ApiResponses) ApiOperation(io.swagger.annotations.ApiOperation) MediaType(javax.ws.rs.core.MediaType) EncryptionComponent(io.syndesis.server.dao.manager.EncryptionComponent) Map(java.util.Map) EntityNotFoundException(javax.persistence.EntityNotFoundException) Api(io.swagger.annotations.Api) Status(javax.ws.rs.core.Response.Status) POST(javax.ws.rs.POST) DataShape(io.syndesis.common.model.DataShape) MetadataConfigurationProperties(io.syndesis.server.verifier.MetadataConfigurationProperties) Connector(io.syndesis.common.model.connection.Connector) Collectors(java.util.stream.Collectors) DataShapeKinds(io.syndesis.common.model.DataShapeKinds) Meta(io.syndesis.server.endpoint.v1.dto.Meta) List(java.util.List) Response(javax.ws.rs.core.Response) ApiResponse(io.swagger.annotations.ApiResponse) HystrixExecutable(com.netflix.hystrix.HystrixExecutable) DynamicActionMetadata(io.syndesis.common.model.connection.DynamicActionMetadata) Entry(java.util.Map.Entry) Optional(java.util.Optional) ConnectionBase(io.syndesis.common.model.connection.ConnectionBase) Status(javax.ws.rs.core.Response.Status) HashMap(java.util.HashMap) DynamicActionMetadata(io.syndesis.common.model.connection.DynamicActionMetadata) EntityNotFoundException(javax.persistence.EntityNotFoundException) ConnectorDescriptor(io.syndesis.common.model.action.ConnectorDescriptor) ConnectorAction(io.syndesis.common.model.action.ConnectorAction) HystrixInvokableInfo(com.netflix.hystrix.HystrixInvokableInfo) Path(javax.ws.rs.Path) POST(javax.ws.rs.POST) Produces(javax.ws.rs.Produces) ApiOperation(io.swagger.annotations.ApiOperation) ApiResponses(io.swagger.annotations.ApiResponses)

Example 22 with ConnectorDescriptor

use of io.syndesis.common.model.action.ConnectorDescriptor in project syndesis by syndesisio.

the class ConnectionActionHandler method adaptDataShapes.

private static ConnectorDescriptor adaptDataShapes(final ConnectorDescriptor.Builder builder) {
    final ConnectorDescriptor descriptor = builder.build();
    final Optional<DataShape> maybeInputDataShape = descriptor.getInputDataShape();
    final DataShape inputDataShape = adaptDataShape(maybeInputDataShape);
    builder.inputDataShape(inputDataShape);
    final Optional<DataShape> maybeOutputDataShape = descriptor.getOutputDataShape();
    final DataShape outputDataShape = adaptDataShape(maybeOutputDataShape);
    builder.outputDataShape(outputDataShape);
    return builder.build();
}
Also used : ConnectorDescriptor(io.syndesis.common.model.action.ConnectorDescriptor) DataShape(io.syndesis.common.model.DataShape)

Example 23 with ConnectorDescriptor

use of io.syndesis.common.model.action.ConnectorDescriptor 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);
}
Also used : Entity(javax.ws.rs.client.Entity) Meta(io.syndesis.server.endpoint.v1.dto.Meta) DynamicActionMetadata(io.syndesis.common.model.connection.DynamicActionMetadata) Response(javax.ws.rs.core.Response) ConnectorDescriptor(io.syndesis.common.model.action.ConnectorDescriptor) HystrixInvokableInfo(com.netflix.hystrix.HystrixInvokableInfo) Test(org.junit.Test)

Example 24 with ConnectorDescriptor

use of io.syndesis.common.model.action.ConnectorDescriptor in project syndesis by syndesisio.

the class ConnectionActionHandlerTest method shouldAddMetaAndSetStatusToBadRequestIfMetaCallFails.

@Test
public void shouldAddMetaAndSetStatusToBadRequestIfMetaCallFails() {
    @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());
    assertThat(response.getStatus()).isEqualTo(Status.BAD_REQUEST.getStatusCode());
    @SuppressWarnings("unchecked") final Meta<ConnectorDescriptor> meta = (Meta<ConnectorDescriptor>) response.getEntity();
    final ConnectorDescriptor descriptor = new ConnectorDescriptor.Builder().createFrom(createOrUpdateSalesforceObjectDescriptor).inputDataShape(// 
    ConnectionActionHandler.ANY_SHAPE).outputDataShape(// 
    salesforceOutputShape).build();
    assertThat(meta.getValue()).isEqualTo(descriptor);
    final MetaData metadata = meta.getData();
    assertThat(metadata).isNotNull();
    assertThat(metadata.getType()).contains(MetaData.Type.WARNING);
    assertThat(metadata.getMessage()).contains("The query did not succeed");
}
Also used : Entity(javax.ws.rs.client.Entity) Meta(io.syndesis.server.endpoint.v1.dto.Meta) DynamicActionMetadata(io.syndesis.common.model.connection.DynamicActionMetadata) Response(javax.ws.rs.core.Response) ConnectorDescriptor(io.syndesis.common.model.action.ConnectorDescriptor) MetaData(io.syndesis.server.endpoint.v1.dto.MetaData) HystrixInvokableInfo(com.netflix.hystrix.HystrixInvokableInfo) Test(org.junit.Test)

Example 25 with ConnectorDescriptor

use of io.syndesis.common.model.action.ConnectorDescriptor in project syndesis by syndesisio.

the class ConnectionActionHandlerTest method shouldElicitActionPropertySuggestions.

@Test
public void shouldElicitActionPropertySuggestions() {
    final DynamicActionMetadata suggestions = new DynamicActionMetadata.Builder().putProperty("sObjectName", Collections.singletonList(DynamicActionMetadata.ActionPropertySuggestion.Builder.of("Contact", "Contact"))).putProperty("sObjectIdName", Arrays.asList(DynamicActionMetadata.ActionPropertySuggestion.Builder.of("ID", "Contact ID"), DynamicActionMetadata.ActionPropertySuggestion.Builder.of("Email", "Email"), DynamicActionMetadata.ActionPropertySuggestion.Builder.of("TwitterScreenName__c", "Twitter Screen Name"))).inputShape(// 
    salesforceContactShape).build();
    when(metadataCommand.execute()).thenReturn(suggestions);
    when(((HystrixInvokableInfo<?>) metadataCommand).isSuccessfulExecution()).thenReturn(true);
    final ConnectorDescriptor enrichedDefinitioin = new ConnectorDescriptor.Builder().createFrom(createOrUpdateSalesforceObjectDescriptor).replaceConfigurationProperty("sObjectName", c -> c.addEnum(ConfigurationProperty.PropertyValue.Builder.of("Contact", "Contact"))).replaceConfigurationProperty("sObjectIdName", c -> c.addEnum(ConfigurationProperty.PropertyValue.Builder.of("ID", "Contact ID"))).replaceConfigurationProperty("sObjectIdName", c -> c.addEnum(ConfigurationProperty.PropertyValue.Builder.of("Email", "Email"))).replaceConfigurationProperty("sObjectIdName", c -> c.addEnum(ConfigurationProperty.PropertyValue.Builder.of("TwitterScreenName__c", "Twitter Screen Name"))).inputDataShape(// 
    salesforceContactShape).build();
    final Map<String, String> parameters = new HashMap<>();
    parameters.put("sObjectName", "Contact");
    final Response response = handler.enrichWithMetadata(SALESFORCE_CREATE_OR_UPDATE, parameters);
    assertThat(response.getStatus()).isEqualTo(Status.OK.getStatusCode());
    @SuppressWarnings("unchecked") final Meta<ConnectorDescriptor> meta = (Meta<ConnectorDescriptor>) response.getEntity();
    assertThat(meta.getValue()).isEqualTo(enrichedDefinitioin);
}
Also used : ConnectorDescriptor(io.syndesis.common.model.action.ConnectorDescriptor) ConnectorAction(io.syndesis.common.model.action.ConnectorAction) Arrays(java.util.Arrays) MetaData(io.syndesis.server.endpoint.v1.dto.MetaData) HystrixInvokableInfo(com.netflix.hystrix.HystrixInvokableInfo) Assertions.assertThat(org.assertj.core.api.Assertions.assertThat) HashMap(java.util.HashMap) ConfigurationProperty(io.syndesis.common.model.connection.ConfigurationProperty) EncryptionComponent(io.syndesis.server.dao.manager.EncryptionComponent) ArgumentCaptor(org.mockito.ArgumentCaptor) Connection(io.syndesis.common.model.connection.Connection) Map(java.util.Map) Status(javax.ws.rs.core.Response.Status) DataShape(io.syndesis.common.model.DataShape) MetadataConfigurationProperties(io.syndesis.server.verifier.MetadataConfigurationProperties) Connector(io.syndesis.common.model.connection.Connector) Test(org.junit.Test) Mockito.when(org.mockito.Mockito.when) Entity(javax.ws.rs.client.Entity) DataShapeKinds(io.syndesis.common.model.DataShapeKinds) Meta(io.syndesis.server.endpoint.v1.dto.Meta) Response(javax.ws.rs.core.Response) DynamicActionMetadata(io.syndesis.common.model.connection.DynamicActionMetadata) HystrixExecutable(com.netflix.hystrix.HystrixExecutable) Mockito.withSettings(org.mockito.Mockito.withSettings) Collections(java.util.Collections) Mockito.mock(org.mockito.Mockito.mock) Meta(io.syndesis.server.endpoint.v1.dto.Meta) HashMap(java.util.HashMap) DynamicActionMetadata(io.syndesis.common.model.connection.DynamicActionMetadata) Response(javax.ws.rs.core.Response) ConnectorDescriptor(io.syndesis.common.model.action.ConnectorDescriptor) HystrixInvokableInfo(com.netflix.hystrix.HystrixInvokableInfo) Test(org.junit.Test)

Aggregations

ConnectorDescriptor (io.syndesis.common.model.action.ConnectorDescriptor)27 Connector (io.syndesis.common.model.connection.Connector)18 Connection (io.syndesis.common.model.connection.Connection)15 Step (io.syndesis.common.model.integration.Step)12 Action (io.syndesis.common.model.action.Action)11 ConnectorAction (io.syndesis.common.model.action.ConnectorAction)11 StepDefinition (io.syndesis.qe.bdd.entities.StepDefinition)10 AbstractStep (io.syndesis.qe.bdd.AbstractStep)9 Map (java.util.Map)8 ConfigurationProperty (io.syndesis.common.model.connection.ConfigurationProperty)7 Test (org.junit.Test)7 HystrixInvokableInfo (com.netflix.hystrix.HystrixInvokableInfo)6 Given (cucumber.api.java.en.Given)6 DataShape (io.syndesis.common.model.DataShape)6 Meta (io.syndesis.server.endpoint.v1.dto.Meta)6 HashMap (java.util.HashMap)6 Response (javax.ws.rs.core.Response)6 DynamicActionMetadata (io.syndesis.common.model.connection.DynamicActionMetadata)5 DataShapeKinds (io.syndesis.common.model.DataShapeKinds)4 IOException (java.io.IOException)4