public Builder replaceConfigurationProperty( final String propertyName, final Consumer<ConfigurationProperty.Builder> configurationPropertyConfigurator) { final ConnectorDescriptor definition = build(); final List<ActionDescriptorStep> steps = definition.getPropertyDefinitionSteps(); int stepIdx; ActionDescriptorStep step = null; for (stepIdx = 0; stepIdx < steps.size(); stepIdx++) { final ActionDescriptorStep potentialStep = steps.get(stepIdx); final Map<String, ConfigurationProperty> properties = potentialStep.getProperties(); if (properties.containsKey(propertyName)) { step = potentialStep; break; } } if (step == null) { // found no property to replace, lets just ignore it return this; } final ConfigurationProperty configurationProperty = step.getProperties().get(propertyName); final ConfigurationProperty.Builder configurationPropertyModifier = new ConfigurationProperty.Builder().createFrom(configurationProperty); configurationPropertyConfigurator.accept(configurationPropertyModifier); final ActionDescriptorStep.Builder stepModifier = new ActionDescriptorStep.Builder() .createFrom(step) .putProperty(propertyName, configurationPropertyModifier.build()); final List<ActionDescriptorStep> modifiedSteps = new ArrayList<>(steps); modifiedSteps.set(stepIdx, stepModifier.build()); return propertyDefinitionSteps(modifiedSteps); } }
@Test public void testNewRequiresProperty() { Map<String, ConfigurationProperty> left = new HashMap<>(); Map<String, ConfigurationProperty> right = new HashMap<>(); left.put("property", new ConfigurationProperty.Builder().javaType("string").build()); right.put("property", new ConfigurationProperty.Builder().javaType("STRING").build()); right.put("property2", new ConfigurationProperty.Builder().javaType("string").required(true).build()); List<LeveledMessage> messages = new DummyHandler().computePropertiesDiffMessages(LeveledMessage.Builder::new, left, right); assertThat(messages).hasSize(2); assertThat(messages.get(0)).hasFieldOrPropertyWithValue("level", LeveledMessage.Level.INFO); assertThat(messages.get(0)).hasFieldOrPropertyWithValue("code", LeveledMessage.Code.SYNDESIS001); assertThat(messages.get(1)).hasFieldOrPropertyWithValue("level", LeveledMessage.Level.WARN); assertThat(messages.get(1)).hasFieldOrPropertyWithValue("code", LeveledMessage.Code.SYNDESIS002); }
.addAction(oldAction) .putProperty("username", new ConfigurationProperty.Builder() .componentProperty(false) .secret(true) .build()) .putProperty("password", new ConfigurationProperty.Builder() .componentProperty(false) .secret(true) .build()) .putProperty("token", new ConfigurationProperty.Builder() .componentProperty(true) .secret(true) .build()) .build(); .addAction(newAction) .putProperty("username", new ConfigurationProperty.Builder() .componentProperty(false) .secret(true) .build()) .putProperty("password", new ConfigurationProperty.Builder() .componentProperty(false) .secret(true) .build())
.putConfiguredProperty("region", "EU_CENTRAL_1") .putConfiguredProperty("bucketNameOrArn", "my-bucketNameOrArn") .connector(new Connector.Builder() .putProperty( "accessKey", new ConfigurationProperty.Builder() .kind("accessKey") .secret(true) .raw(true) .componentProperty(false) .build()) .putProperty( "secretKey", new ConfigurationProperty.Builder() .kind("secretKey") .secret(true) .raw(true) .componentProperty(false) .build()) .putProperty( "region", new ConfigurationProperty.Builder() .kind("region") .secret(false) .componentProperty(false) .build()) .putProperty( "bucketNameOrArn", new ConfigurationProperty.Builder()
@Test public void shouldCreateNewConnectorsBasedOnConnectorTemplates() { final Map<String, ConfigurationProperty> properties = new HashMap<>(); properties.put("prop1", new ConfigurationProperty.Builder().build()); connectorProperties.put("prop2", new ConfigurationProperty.Builder().build()); connectorProperties.put("prop3", new ConfigurationProperty.Builder().build());
.withActionDefinitionStep("Select Salesforce object", "Select Salesforce object type to create", b -> b.putProperty("sObjectName", new ConfigurationProperty.Builder()// .kind("parameter")// .displayName("Salesforce object type")// .group("common")// .required(true)// .type("string")// .javaType("java.lang.String")// .componentProperty(false)// .description("Salesforce object type to create")// .build())) .withActionDefinitionStep("Select Identifier property", "Select Salesforce property that will hold the uniquely identifying value of this object", b -> b.putProperty("sObjectIdName", new ConfigurationProperty.Builder()// .kind("parameter")// .displayName("Identifier field name")// .group("common")// .required(true)// .type("string")// .javaType("java.lang.String")// .componentProperty(false)// .description("Unique field to hold the identifier value")// .build())) .inputDataShape(new DataShape.Builder().kind(DataShapeKinds.JSON_SCHEMA).build())// .outputDataShape(salesforceOutputShape).build();
final boolean required = parameter.getRequired(); final ConfigurationProperty.Builder propertyBuilder = new ConfigurationProperty.Builder()// .kind("property")// .displayName(name)// .description(description)// .group("producer")// .required(required)// .componentProperty(false)// .deprecated(false)// .secret(false); propertyBuilder.defaultValue(String.valueOf(defaultValue)); propertyBuilder.type(type).javaType(JsonSchemaHelper.javaTypeFor(serializableParameter)); propertyBuilder.addAllEnum(createEnums(enums)); return Optional.of(propertyBuilder.build());
public StepDescriptor.Builder replaceConfigurationProperty(final String propertyName, final Consumer<ConfigurationProperty.Builder> configurationPropertyConfigurator) { final StepDescriptor definition = build(); final List<ActionDescriptorStep> steps = definition.getPropertyDefinitionSteps(); int stepIdx; ActionDescriptorStep step = null; for (stepIdx = 0; stepIdx < steps.size(); stepIdx++) { final ActionDescriptorStep potentialStep = steps.get(stepIdx); final Map<String, ConfigurationProperty> properties = potentialStep.getProperties(); if (properties.containsKey(propertyName)) { step = potentialStep; break; } } if (step == null) { // found no property to replace, lets just ignore it return this; } final ConfigurationProperty configurationProperty = step.getProperties().get(propertyName); final ConfigurationProperty.Builder configurationPropertyModifier = new ConfigurationProperty.Builder().createFrom(configurationProperty); configurationPropertyConfigurator.accept(configurationPropertyModifier); final ActionDescriptorStep.Builder stepModifier = new ActionDescriptorStep.Builder() .createFrom(step) .putProperty(propertyName, configurationPropertyModifier.build()); final List<ActionDescriptorStep> modifiedSteps = new ArrayList<>(steps); modifiedSteps.set(stepIdx, stepModifier.build()); return propertyDefinitionSteps(modifiedSteps); } }
final boolean required = parameter.getRequired(); final ConfigurationProperty.Builder propertyBuilder = new ConfigurationProperty.Builder()// .kind("property")// .displayName(name)// .description(description)// .group("producer")// .required(required)// .componentProperty(false)// .deprecated(false)// .secret(false); propertyBuilder.defaultValue(String.valueOf(defaultValue)); propertyBuilder.type(type).javaType(JsonSchemaHelper.javaTypeFor(serializableParameter)); propertyBuilder.addAllEnum(createEnums(enums)); return Optional.of(propertyBuilder.build());
@Override protected BiFunction<Swagger, ConfigurationProperty, Optional<ConfigurationProperty>> propertyValueExtractor() { return (swagger, template) -> { final Map<String, SecuritySchemeDefinition> securityDefinitions = swagger.getSecurityDefinitions(); if (securityDefinitions == null || securityDefinitions.isEmpty()) { return Optional .of(new ConfigurationProperty.Builder().createFrom(template).defaultValue("none").addEnum(NO_SECURITY).build()); } final PropertyValue[] enums = securityDefinitions.values().stream()// .map(SecuritySchemeDefinition::getType)// .filter(SupportedAuthenticationTypes.SUPPORTED::contains)// .map(SupportedAuthenticationTypes::valueOf)// .map(SupportedAuthenticationTypes::asPropertyValue)// .toArray(l -> new ConfigurationProperty.PropertyValue[l]); final ConfigurationProperty.Builder authenticationType = new ConfigurationProperty.Builder().createFrom(template) .addEnum(enums); if (enums.length == 1) { authenticationType.defaultValue(enums[0].getValue()); } return Optional.of(authenticationType.build()); }; } },
@Override protected BiFunction<Swagger, ConfigurationProperty, Optional<ConfigurationProperty>> propertyValueExtractor() { return (swagger, template) -> { final Map<String, SecuritySchemeDefinition> securityDefinitions = swagger.getSecurityDefinitions(); if (securityDefinitions == null || securityDefinitions.isEmpty()) { return Optional .of(new ConfigurationProperty.Builder().createFrom(template).defaultValue("none").addEnum(NO_SECURITY).build()); } final PropertyValue[] enums = securityDefinitions.values().stream()// .map(SecuritySchemeDefinition::getType)// .filter(SupportedAuthenticationTypes.SUPPORTED::contains)// .map(SupportedAuthenticationTypes::valueOf)// .map(SupportedAuthenticationTypes::asPropertyValue)// .toArray(l -> new ConfigurationProperty.PropertyValue[l]); final ConfigurationProperty.Builder authenticationType = new ConfigurationProperty.Builder().createFrom(template) .addEnum(enums); if (enums.length == 1) { authenticationType.defaultValue(enums[0].getValue()); } return Optional.of(authenticationType.build()); }; } },
@Test public void shouldApplyReceivedCredentialsToConnections() { final CredentialProvider credentialProvider = mock(CredentialProvider.class); when(locator.providerWithId("providerId")).thenReturn(credentialProvider); final CredentialFlowState flowState = new OAuth2CredentialFlowState.Builder().providerId("providerId") .returnUrl(URI.create("/ui#state")).code("code").state("state").build(); final Connection connection = new Connection.Builder() .connector(new Connector.Builder().putProperty("key", new ConfigurationProperty.Builder().build()).build()) .build(); when(credentialProvider.applyTo(new Connection.Builder().createFrom(connection).isDerived(true).build(), flowState)) .then(a -> new Connection.Builder().createFrom(a.getArgument(0)) .putConfiguredProperty("key", "value").build()); final Connection finishedConnection = credentials.apply(connection, flowState); assertThat(finishedConnection).isNotNull(); assertThat(finishedConnection.getConfiguredProperties()).contains(entry("key", "value")); assertThat(finishedConnection.isDerived()).isTrue(); }
@Test public void shouldNotComputeConnectorConfiguredPropertiesAsMissing() { final ConnectionUpdateHandler updateHandler = new ConnectionUpdateHandler(dataManager, null, validator); final Connection connection = new Connection.Builder()// .id("connection")// .putConfiguredProperty("req2", "value2")// .build(); final ConfigurationProperty required = new ConfigurationProperty.Builder().required(true).build(); final Connector sameConnector = new Connector.Builder()// .id("new-connector")// .putProperty("req1", required)// .putProperty("req2", required)// .putConfiguredProperty("req1", "value1")// .build(); when(dataManager.fetchByPropertyValue(ConnectionBulletinBoard.class, "targetResourceId", "connection")) .thenReturn(Optional.empty()); final ConnectionBulletinBoard board = updateHandler.computeBoard(connection, sameConnector, sameConnector); assertThat(board.getMessages()).isEmpty(); } }
@Test public void shouldOmitHiddenProperties() { final Connector withHiddenProperty = new Connector.Builder().createFrom(connector) .putProperty("theHiddenOne", new ConfigurationProperty.Builder().type("hidden").addTag(Credentials.AUTHENTICATION_URL_TAG).build()) .build(); final OAuthApp oauthApp = OAuthApp.fromConnector(withHiddenProperty); final OAuthApp expected = new OAuthApp.Builder()// .id("connector-id")// .name("Connector")// .icon("svg-icon")// .putProperty("clientId", CLIENT_ID_PROPERTY)// .putProperty("clientSecret", CLIENT_SECRET_PROPERTY)// .putConfiguredProperty("clientId", "client-id")// .putConfiguredProperty("clientSecret", "client-secret")// .build(); assertThat(oauthApp).isEqualTo(expected); }
@Test public void shouldCreatePropertyParametersFromPetstoreSwagger() throws IOException { final String specification = resource("/swagger/petstore.swagger.json"); final Swagger swagger = new SwaggerParser().parse(specification); final Parameter petIdPathParameter = swagger.getPath("/pet/{petId}").getGet().getParameters().get(0); final Optional<ConfigurationProperty> maybeConfigurationProperty = BaseSwaggerConnectorGenerator .createPropertyFromParameter(petIdPathParameter); final ConfigurationProperty expected = new ConfigurationProperty.Builder()// .componentProperty(false)// .deprecated(false)// .description("ID of pet to return")// .displayName("petId")// .group("producer")// .javaType(Long.class.getName())// .kind("property")// .required(true)// .secret(false)// .type("integer")// .build(); assertThat(maybeConfigurationProperty).hasValue(expected); }
@Test public void shouldCreatePropertyParametersFromPetstoreSwagger() throws IOException { final String specification = resource("/swagger/petstore.swagger.json"); final Swagger swagger = new SwaggerParser().parse(specification); final Parameter petIdPathParameter = swagger.getPath("/pet/{petId}").getGet().getParameters().get(0); final Optional<ConfigurationProperty> maybeConfigurationProperty = BaseSwaggerConnectorGenerator .createPropertyFromParameter(petIdPathParameter); final ConfigurationProperty expected = new ConfigurationProperty.Builder()// .componentProperty(false)// .deprecated(false)// .description("ID of pet to return")// .displayName("petId")// .group("producer")// .javaType(Long.class.getName())// .kind("property")// .required(true)// .secret(false)// .type("integer")// .build(); assertThat(maybeConfigurationProperty).hasValue(expected); }
@Test public void shouldFetchProvidersFromDataManager() { final DataManager dataManager = mock(DataManager.class); final CredentialProviderRegistry registry = new CredentialProviderRegistry(dataManager); final Connector connector = new Connector.Builder().id("test-provider") .putProperty("clientId", new ConfigurationProperty.Builder().addTag(Credentials.CLIENT_ID_TAG).build()) .putProperty("clientSecret", new ConfigurationProperty.Builder().addTag(Credentials.CLIENT_SECRET_TAG).build()) .putConfiguredProperty("clientId", "a-client-id").putConfiguredProperty("clientSecret", "a-client-secret") .build(); when(dataManager.fetch(Connector.class, "test-provider")).thenReturn(connector); assertThat(registry.providerWithId("test-provider")).isInstanceOfSatisfying(TestCredentialProvider.class, p -> { assertThat(p.getProperties().getAppId()).isEqualTo("a-client-id"); assertThat(p.getProperties().getAppSecret()).isEqualTo("a-client-secret"); }); } }
private static Optional<ConfigurationProperty> vendorExtension(final SecuritySchemeDefinition definition, final ConfigurationProperty template, final String name) { final Map<String, Object> vendorExtensions = definition.getVendorExtensions(); if (vendorExtensions == null) { return empty(); } final Object value = vendorExtensions.get(name); if (value == null) { return empty(); } final ConfigurationProperty property = new ConfigurationProperty.Builder().createFrom(template).defaultValue(String.valueOf(value)) .build(); return Optional.of(property); }
/** * Creates an immutable copy of a {@link ConfigurationProperty} value. * Uses accessors to get values to initialize the new immutable instance. * If an instance is already immutable, it is returned as is. * @param instance The instance to copy * @return A copied immutable ConfigurationProperty instance */ public static ConfigurationProperty copyOf(ConfigurationProperty instance) { if (instance instanceof ImmutableConfigurationProperty) { return (ImmutableConfigurationProperty) instance; } return new ConfigurationProperty.Builder() .createFrom(instance) .build(); }
private static Optional<ConfigurationProperty> vendorExtension(final SecuritySchemeDefinition definition, final ConfigurationProperty template, final String name) { final Map<String, Object> vendorExtensions = definition.getVendorExtensions(); if (vendorExtensions == null) { return empty(); } final Object value = vendorExtensions.get(name); if (value == null) { return empty(); } final ConfigurationProperty property = new ConfigurationProperty.Builder().createFrom(template).defaultValue(String.valueOf(value)) .build(); return Optional.of(property); }