private MetadataKey buildServiceKey(ForwardingSoapClient connection, WebServiceDefinition ws) { String serviceId = ws.getServiceId(); SoapMetadataResolver resolver = connection.getSoapClient(serviceId).getMetadataResolver(); MetadataKeyBuilder key = newKey(serviceId).withDisplayName(ws.getFriendlyName()); List<String> excludedOperations = ws.getExcludedOperations(); resolver.getAvailableOperations().stream() .filter(ope -> !excludedOperations.contains(ope)) .forEach(ope -> key.withChild(newKey(ope).withDisplayName(NameUtils.titleize(ope)))); return key.build(); } }
@Test public void resolveDsql() throws MetadataResolvingException { ParameterModel queryParam = mock(ParameterModel.class); when(queryParam.getModelProperty(QueryParameterModelProperty.class)) .thenReturn(Optional.of(new QueryParameterModelProperty(QueryTranslator.class))); mockMetadataKeyModelProp(queryParam, 1); setParameters(queryParam); setMetadataKeyIdModelProperty(String.class); MetadataKey dsqlKey = newKey("dsql:SELECT id FROM Circle WHERE (diameter < 18)").build(); keyIdObjectResolver = new MetadataKeyIdObjectResolver(componentModel); final Object resolvedKey = keyIdObjectResolver.resolve(dsqlKey); assertThat(resolvedKey, is(instanceOf(DsqlQuery.class))); DsqlQuery query = (DsqlQuery) resolvedKey; assertThat(query.getFields(), hasSize(1)); assertThat(query.getType().getName(), is("Circle")); }
@Test public void failToResolveWithMultipleChildren() throws MetadataResolvingException { exception.expect(MetadataResolvingException.class); exception.expectMessage("MetadataKey used for Metadata resolution must only have one child per level."); final MetadataKey invalidMetadataKey = newKey(AMERICA, CONTINENT) .withChild(newKey(USA, COUNTRY).withChild(newKey(SFO, CITY)).withChild(newKey(NY, CITY))).build(); setParameters(continentParam, countryParam, cityParam); setMetadataKeyIdModelProperty(LocationKey.class); keyIdObjectResolver = new MetadataKeyIdObjectResolver(componentModel); keyIdObjectResolver.resolve(invalidMetadataKey); }
private MetadataKeyBuilder getKeyFromField(Object resolvedKey, DeclaringMemberModelProperty declaringMemberModelProperty, ReflectionCache reflectionCache) throws Exception { return newKey(valueOf(getFieldValue(resolvedKey, declaringMemberModelProperty.getDeclaringField().getName(), reflectionCache))); }
/** * Given a {@link MetadataKey}, this is navigated recursively cloning each {@link MetadataKey} of the tree structure creating a * {@link MultilevelMetadataKeyBuilder} and adding the partName of each {@link MetadataKey} found. * * @param key {@link MetadataKey} to be cloned and enriched * @param partOrderMapping {@link Map} that contains the mapping of the name of each part of the {@link MetadataKey} * @param level the current level of the part of the {@link MetadataKey} to be cloned and enriched * @return a {@link MetadataKeyBuilder} with the cloned and enriched keys */ private MetadataKeyBuilder cloneAndEnrichMetadataKey(MetadataKey key, Map<Integer, ParameterModel> partOrderMapping, int level) { final MetadataKeyBuilder keyBuilder = newKey(key.getId(), partOrderMapping.get(level).getName()).withDisplayName(key.getDisplayName()); key.getProperties().forEach(keyBuilder::withProperty); key.getChilds().forEach(childKey -> keyBuilder.withChild(cloneAndEnrichMetadataKey(childKey, partOrderMapping, level + 1))); return keyBuilder; } }
/** * Creates and returns new instance of a {@link MetadataKeyBuilder}, to help building a new {@link MetadataKey} * represented by the given {@param id} * * @param id of the {@link MetadataKey} to be created * @return an initialized instance of {@link MetadataKeyBuilder} */ public static MetadataKeyBuilder newKey(String id) { return new MetadataKeyBuilder(id); }
@Test public void resolveMetadataWithNoRefDynamicConfig() throws Exception { location = builder().globalName(RESOLVER_WITH_IMPLICIT_DYNAMIC_CONFIG).addProcessorsPart().addIndexPart(0).build(); MetadataKey key = newKey(AMERICA).withChild(newKey(USA).withChild(newKey(SAN_FRANCISCO))).build(); final MetadataResult<ComponentMetadataDescriptor<OperationModel>> metadataResult = getComponentDynamicMetadata(key); assertFailureResult(metadataResult, 1); assertMetadataFailure(metadataResult.getFailures().get(0), "Configuration used for Metadata fetch cannot be dynamic", INVALID_CONFIGURATION, MetadataResolvingException.class.getName(), COMPONENT, ""); } }
@Test public void failToGetMetadataWithMissingMetadataKeyLevels() throws Exception { assumeThat(resolutionType, is(ResolutionType.EXPLICIT_RESOLUTION)); location = builder().globalName(INCOMPLETE_MULTILEVEL_KEY_RESOLVER).addProcessorsPart().addIndexPart(0).build(); final MetadataKey metadataKey = newKey(AMERICA, CONTINENT).withChild(newKey(USA, COUNTRY)).build(); final MetadataResult<ComponentMetadataDescriptor<OperationModel>> result = getComponentDynamicMetadata(metadataKey); assertMetadataFailure(result.getFailures().get(0), "Missing levels: [city]", INVALID_METADATA_KEY, "", COMPONENT); }
private MetadataKeyBuilder getKeyFromField(Object resolvedKey, DeclaringMemberModelProperty declaringMemberModelProperty, ReflectionCache reflectionCache) throws Exception { return newKey(valueOf(getFieldValue(resolvedKey, declaringMemberModelProperty.getDeclaringField().getName(), reflectionCache))); }
/** * Given a {@link MetadataKey}, this is navigated recursively cloning each {@link MetadataKey} of the tree structure creating a * {@link MultilevelMetadataKeyBuilder} and adding the partName of each {@link MetadataKey} found. * * @param key {@link MetadataKey} to be cloned and enriched * @param partOrderMapping {@link Map} that contains the mapping of the name of each part of the {@link MetadataKey} * @param level the current level of the part of the {@link MetadataKey} to be cloned and enriched * @return a {@link MetadataKeyBuilder} with the cloned and enriched keys */ private MetadataKeyBuilder cloneAndEnrichMetadataKey(MetadataKey key, Map<Integer, ParameterModel> partOrderMapping, int level) { final MetadataKeyBuilder keyBuilder = newKey(key.getId(), partOrderMapping.get(level).getName()).withDisplayName(key.getDisplayName()); key.getProperties().forEach(keyBuilder::withProperty); key.getChilds().forEach(childKey -> keyBuilder.withChild(cloneAndEnrichMetadataKey(childKey, partOrderMapping, level + 1))); return keyBuilder; } }
@Test public void failWithDynamicConfigurationWhenRetrievingMetadata() throws IOException { location = builder().globalName(RESOLVER_WITH_DYNAMIC_CONFIG).addProcessorsPart().addIndexPart(0).build(); MetadataKey key = newKey(AMERICA, CONTINENT).withChild(newKey(USA, COUNTRY).withChild(newKey(SAN_FRANCISCO, CITY))).build(); MetadataResult<ComponentMetadataDescriptor<OperationModel>> result = getComponentDynamicMetadata(key); assertFailureResult(result, 1); assertMetadataFailure(result.getFailures().get(0), CONFIGURATION_CANNOT_BE_DYNAMIC, INVALID_CONFIGURATION, MetadataResolvingException.class.getName(), COMPONENT); }