private void declareMetadata(OperationDeclarer operation, ClassTypeLoader loader) { ImmutableMap.Builder<String, Supplier<? extends InputTypeResolver>> inputResolver = ImmutableMap.builder(); inputResolver.put(BODY_PARAM, InvokeRequestTypeResolver::new); inputResolver.put(HEADERS_PARAM, InvokeInputHeadersTypeResolver::new); inputResolver.put(ATTACHMENTS_PARAM, InvokeInputAttachmentsTypeResolver::new); DefaultMetadataResolverFactory factory = new DefaultMetadataResolverFactory(InvokeKeysResolver::new, inputResolver.build(), InvokeOutputTypeResolver::new, NullMetadataResolver::new); operation.withModelProperty(new MetadataResolverFactoryModelProperty(() -> factory)); operation.withModelProperty(new MetadataKeyIdModelProperty(loader.load(WebServiceTypeKey.class), KEYS_GROUP, SOAP_INVOKE_METADATA_CATEGORY)); }
private void addPagedOperationModelProperty(MethodElement operationMethod, OperationDeclarer operation, boolean supportsConfig) { checkDefinition(supportsConfig, format("Paged operation '%s' is defined at the extension level but it requires a config, " + "since connections are required for paging", operationMethod.getName())); operation.withModelProperty(new PagedOperationModelProperty()); operation.requiresConnection(true); }
scope.withModelProperty(new ExtensionOperationDescriptorModelProperty(scopeMethod)); scope.withModelProperty(new ImplementingMethodModelProperty(method.get())) .withModelProperty(new ComponentExecutorModelProperty(new ReflectiveOperationExecutorFactory<>(declaringClass.get(), method.get())));
private void extractOperationExtension(HasOperationDeclarer declarer, ComponentModel operationModel, DirectedGraph<String, DefaultEdge> directedGraph, XmlDslModel xmlDslModel) { String operationName = operationModel.getNameAttribute(); OperationDeclarer operationDeclarer = declarer.withOperation(operationName); ComponentModel bodyComponentModel = operationModel.getInnerComponents() .stream() .filter(child -> child.getIdentifier().equals(OPERATION_BODY_IDENTIFIER)).findFirst() .orElseThrow(() -> new IllegalArgumentException(format("The operation '%s' is missing the <body> statement", operationName))); directedGraph.addVertex(operationName); fillGraphWithTnsReferences(directedGraph, operationName, bodyComponentModel.getInnerComponents()); operationDeclarer.withModelProperty(new OperationComponentModelModelProperty(operationModel, bodyComponentModel)); operationDeclarer.describedAs(getDescription(operationModel)); operationDeclarer.getDeclaration().setDisplayModel(getDisplayModel(operationModel)); extractOperationParameters(operationDeclarer, operationModel); extractOutputType(operationDeclarer.withOutput(), OPERATION_OUTPUT_IDENTIFIER, operationModel, getDeclarationOutputFor(operationName)); extractOutputType(operationDeclarer.withOutputAttributes(), OPERATION_OUTPUT_ATTRIBUTES_IDENTIFIER, operationModel, getDeclarationOutputAttributesFor(operationName)); declareErrorModels(operationDeclarer, xmlDslModel, operationName, operationModel); }
/** * Declares the invoke operation. * * @param configDeclarer the soap config declarer * @param loader a {@link ClassTypeLoader} to load some parameters types. * @param soapErrors the {@link ErrorModel}s that this operation can throw. */ void declare(ConfigurationDeclarer configDeclarer, ClassTypeLoader loader, Set<ErrorModel> soapErrors) { ReflectionCache reflectionCache = new ReflectionCache(); OperationDeclarer operation = configDeclarer.withOperation(OPERATION_NAME) .describedAs(OPERATION_DESCRIPTION) .requiresConnection(true) .blocking(true) .withModelProperty(new ComponentExecutorModelProperty(new SoapOperationExecutorFactory())) .withModelProperty(new ConnectivityModelProperty(ForwardingSoapClient.class)); soapErrors.forEach(operation::withErrorModel); declareMetadata(operation, loader); declareOutput(operation, loader); declareMetadataKeyParameters(operation, loader, reflectionCache); declareRequestParameters(operation, loader); }
operationDeclarer.withModelProperty(new ExtensionOperationDescriptorModelProperty(operationMethod)); .withModelProperty(new ImplementingMethodModelProperty(method.get())) .withModelProperty(new ComponentExecutorModelProperty(new ReflectiveOperationExecutorFactory<>(declaringClass.get(), method.get())));
private void addPagedOperationModelProperty(MethodElement operationMethod, OperationDeclarer operation, boolean supportsConfig) { checkDefinition(supportsConfig, format("Paged operation '%s' is defined at the extension level but it requires a config, " + "since connections are required for paging", operationMethod.getName())); operation.withModelProperty(new PagedOperationModelProperty()); operation.requiresConnection(true); }
scope.withModelProperty(new ExtensionOperationDescriptorModelProperty(scopeMethod)); scope.withModelProperty(new ImplementingMethodModelProperty(method.get())) .withModelProperty(new ComponentExecutorModelProperty(new ReflectiveOperationExecutorFactory<>(declaringClass.get(), method.get())));
operationDeclarer.withModelProperty(new ExtensionOperationDescriptorModelProperty(operationMethod)); .withModelProperty(new ImplementingMethodModelProperty(method.get())) .withModelProperty(new ComponentExecutorModelProperty(new ReflectiveOperationExecutorFactory<>(declaringClass.get(), method.get())));