@Override protected void onSource(WithSourcesDeclaration owner, SourceDeclaration source) { source.getModelProperty(ImplementingTypeModelProperty.class) .map(ImplementingTypeModelProperty::getType) .ifPresent(clazz -> { getOutputType(clazz).ifPresent(type -> declareCustomType(source.getOutput(), type)); getAttributesType(clazz).ifPresent(type -> declareCustomType(source.getOutputAttributes(), type)); }); source.getSuccessCallback().ifPresent(this::declareParametersCustomStaticTypes); source.getErrorCallback().ifPresent(this::declareParametersCustomStaticTypes); }
@Override protected void onSource(WithSourcesDeclaration owner, SourceDeclaration declaration) { final StereotypeModel defaultStereotype = createStereotype(declaration.getName(), sourceParent); ifPresent(declaration.getModelProperty(ImplementingTypeModelProperty.class) .map(ImplementingTypeModelProperty::getType) .map(declaringType -> new TypeWrapper(declaringType, typeLoader)), type -> resolveStereotype(type, declaration, defaultStereotype), () -> declaration.withStereotype(defaultStereotype)); addConfigRefStereoTypesIfNeeded(declaration); }
@Before public void before() { when(extensionLoadingContext.getExtensionDeclarer()).thenReturn(extensionDeclarer); when(extensionDeclarer.getDeclaration()).thenReturn(extensionDeclaration); when(extensionDeclaration.getMessageSources()).thenReturn(asList(sourceDeclaration)); when(sourceDeclaration.getParameterGroup(DEFAULT_GROUP_NAME)).thenReturn(parameterGroup); when(sourceDeclaration.getSuccessCallback()).thenReturn(empty()); when(sourceDeclaration.getErrorCallback()).thenReturn(empty()); }
@Override protected void onSource(WithSourcesDeclaration owner, SourceDeclaration declaration) { final StereotypeModel defaultStereotype = createStereotype(declaration.getName(), sourceParent); declaration.withStereotype(defaultStereotype); addConfigRefStereoTypesIfNeeded(declaration); } };
@Before public void before() { when(extensionLoadingContext.getExtensionDeclarer()).thenReturn(extensionDeclarer); when(extensionDeclarer.getDeclaration()).thenReturn(extensionDeclaration); when(extensionDeclaration.getOperations()).thenReturn(singletonList(operation)); when(extensionDeclaration.getMessageSources()).thenReturn(singletonList(source)); when(source.getSuccessCallback()).thenReturn(empty()); when(source.getErrorCallback()).thenReturn(empty()); when(source.getModelProperty(ExtensionTypeDescriptorModelProperty.class)).thenReturn(empty()); when(operation.getModelProperty(ExtensionOperationDescriptorModelProperty.class)).thenReturn(empty()); when(operation.getParameterGroup(DEFAULT_GROUP_NAME)).thenReturn(new ParameterGroupDeclaration(DEFAULT_GROUP_NAME)); when(source.getParameterGroup(DEFAULT_GROUP_NAME)).thenReturn(new ParameterGroupDeclaration(DEFAULT_GROUP_NAME)); mockMediaType(operation, false); mockMediaType(source, false); }
void document(TypeElement element, WithSourcesDeclaration<?>... containerDeclarations) { getSourceClasses(processingEnv, element) .forEach(sourceElement -> findMatchingSource(containerDeclarations, sourceElement) .ifPresent(source -> { source.setDescription(processor.getJavaDocSummary(processingEnv, sourceElement)); parameterDeclarer.document(source, sourceElement); Map<String, Element> methods = getApiMethods(processingEnv, singletonList(sourceElement)); source.getSuccessCallback().ifPresent(cb -> documentCallback(methods, cb)); source.getErrorCallback().ifPresent(cb -> documentCallback(methods, cb)); })); }
private void assertTestModuleMessageSource(ExtensionDeclaration extensionDeclaration) throws Exception { assertThat(extensionDeclaration.getMessageSources(), hasSize(1)); SourceDeclaration source = extensionDeclaration.getMessageSources().get(0); assertThat(source.getName(), is(DEA_SOURCE_NAME)); final MetadataType outputType = source.getOutput().getType(); assertThat(outputType, is(instanceOf(ArrayType.class))); MetadataType outputMetadataType = IntrospectionUtils.getReturnType(new TypeWrapper(Object.class, TYPE_LOADER)); assertMessageType(((ArrayType) outputType).getType(), STRING_TYPE, TYPE_LOADER.load(DEAOfficerAttributes.class)); assertThat(source.getOutputAttributes().getType(), equalTo(outputMetadataType)); ConfigurationDeclaration config = extensionDeclaration.getConfigurations().get(0); assertThat(config.getMessageSources(), hasSize(3)); assertHeisenbergSource(config.getMessageSources().get(0), ASYNC_SOURCE_NAME, AsyncHeisenbergSource.class); assertHeisenbergSource(config.getMessageSources().get(1), SOURCE_NAME, HeisenbergSource.class); }
private void addBackPressureParameter(ExtensionDeclaration extensionDeclaration, SourceDeclaration sourceDeclaration, BackPressureStrategyModelProperty property) { ParameterDeclaration parameter = new ParameterDeclaration(BACK_PRESSURE_STRATEGY_PARAMETER_NAME); parameter.setDescription(BACK_PRESSURE_STRATEGY_PARAMETER_DESCRIPTION); parameter.setRequired(false); parameter.setDefaultValue(property.getDefaultMode()); parameter.setExpressionSupport(NOT_SUPPORTED); parameter.setLayoutModel(LayoutModel.builder().tabName(ADVANCED_TAB).build()); MetadataType type = BaseTypeBuilder.create(JAVA).stringType() .id(format("%s-%s-backPressureStrategy", extensionDeclaration.getName(), sourceDeclaration.getName())) .with(new EnumAnnotation<>(property.getSupportedModes().stream().map(BackPressureMode::name).toArray(String[]::new))) .build(); parameter.setType(type, false); sourceDeclaration.getParameterGroup(DEFAULT_GROUP_NAME).addParameter(parameter); }
private void assertHeisenbergSource(SourceDeclaration source, String sourceName, Class<? extends Source> type) { assertThat(source.getName(), is(sourceName)); List<ParameterDeclaration> parameters = source.getAllParameters(); assertThat(parameters, hasSize(31)); assertParameter(parameters, SOURCE_PARAMETER, "", INT_TYPE, true, NOT_SUPPORTED, null); assertParameter(parameters, SOURCE_CALLBACK_PARAMETER, "", toMetadataType(Long.class), false, SUPPORTED, "#[payload]"); assertParameter(parameters, SOURCE_REPEATED_CALLBACK_PARAMETER, "", STRING_TYPE, false, SUPPORTED, null); assertParameter(parameters, "methylamine", "", toMetadataType(Methylamine.class), false, SUPPORTED, null); ImplementingTypeModelProperty typeModelProperty = source.getModelProperty(ImplementingTypeModelProperty.class).get(); assertThat(typeModelProperty.getType(), equalTo(type)); }
@Override protected void onSource(WithSourcesDeclaration owner, SourceDeclaration declaration) { Optional<MetadataType> outputType = declaration.getModelProperty(ExtensionTypeDescriptorModelProperty.class) .filter(mp -> mp.getType() instanceof SourceElement) .map(mp -> (SourceElement) mp.getType()) .map(SourceElement::getReturnMetadataType); declareMimeTypeParameters(declaration, outputType); }
@Override protected void onSource(SourceDeclaration source) { extractType(source).ifPresent(type -> { if (type.isAssignableTo(PollingSource.class)) { source.setRunsOnPrimaryNodeOnly(true); ParameterDeclaration parameter = new ParameterDeclaration(SCHEDULING_STRATEGY_PARAMETER_NAME); parameter.setDescription(SCHEDULING_STRATEGY_PARAMETER_DESCRIPTION); parameter.setRequired(true); parameter.setType(loader.load(Scheduler.class), false); parameter.setExpressionSupport(NOT_SUPPORTED); parameter.addModelProperty(new InfrastructureParameterModelProperty(10)); parameter.addModelProperty(new QNameModelProperty(new QName(CORE_NAMESPACE, SCHEDULING_STRATEGY_ELEMENT_IDENTIFIER, CORE_PREFIX))); parameter.setDslConfiguration(ParameterDslConfiguration.builder() .allowsInlineDefinition(true) .allowsReferences(false) .allowTopLevelDefinition(false) .build()); thereArePollingSources.set(true); source.getParameterGroup(DEFAULT_GROUP_NAME).addParameter(parameter); } }); } }.walk(extensionDeclarer.getDeclaration());
@Test public void declareStaticAndDynamicTypesInSource() { List<SourceDeclaration> messageSources = declaration.getConfigurations().get(0).getMessageSources(); SourceDeclaration sourceDynamicAttributes = getDeclaration(messageSources, "MetadataSource"); assertOutputType(sourceDynamicAttributes.getOutput(), TYPE_BUILDER.objectType() .with(new ClassInformationAnnotation(Map.class, asList(String.class, Object.class))) .openWith(TYPE_LOADER.load(Object.class)).build(), true); assertOutputType(sourceDynamicAttributes.getOutputAttributes(), toMetadataType(StringAttributes.class), false); assertParameterType(getDeclaration(sourceDynamicAttributes.getAllParameters(), "type"), toMetadataType(String.class)); messageSources = declaration.getMessageSources(); SourceDeclaration sourceStaticAttributes = getDeclaration(messageSources, "MetadataSourceWithMultilevel"); assertOutputType(sourceStaticAttributes.getOutput(), TYPE_BUILDER.objectType() .with(new ClassInformationAnnotation(Map.class, asList(String.class, Object.class))) .openWith(TYPE_LOADER.load(Object.class)).build(), true); assertOutputType(sourceStaticAttributes.getOutputAttributes(), toMetadataType(StringAttributes.class), false); List<ParameterDeclaration> locationKey = sourceStaticAttributes.getAllParameters(); assertParameterType(getDeclaration(locationKey, "continent"), toMetadataType(String.class)); assertParameterType(getDeclaration(locationKey, "country"), toMetadataType(String.class)); assertParameterType(getDeclaration(locationKey, "city"), toMetadataType(String.class)); }
@Override protected void onSource(SourceDeclaration sourceDeclaration) { BackPressureStrategyModelProperty property; Optional<ExtensionTypeDescriptorModelProperty> extensionTypeDescriptorModelProperty = sourceDeclaration.getModelProperty(ExtensionTypeDescriptorModelProperty.class); if (extensionTypeDescriptorModelProperty.isPresent()) { Type sourceType = extensionTypeDescriptorModelProperty.get().getType(); property = sourceType.getAnnotation(BackPressure.class) .map(BackPressureStrategyModelProperty::of) .orElseGet(BackPressureStrategyModelProperty::getDefault); sourceDeclaration.addModelProperty(property); if (property.getSupportedModes().size() > 1) { addBackPressureParameter(extensionDeclaration, sourceDeclaration, property); } } } }.walk(extensionDeclaration);
private Optional<SourceDeclaration> findMatchingSource(WithSourcesDeclaration<?>[] containerDeclarations, Element element) { for (WithSourcesDeclaration<?> declaration : containerDeclarations) { Optional<SourceDeclaration> sourceDeclaration = declaration.getMessageSources().stream() .filter(source -> { String name = source.getName(); String elementName = element.getSimpleName().toString(); String defaultNaming = hyphenize(elementName); return name.equals(defaultNaming) || getAlias(element).map(name::equals).orElse(name.equals(elementName)); }) .findFirst(); if (sourceDeclaration.isPresent()) { return sourceDeclaration; } } return Optional.empty(); }
@Override protected void onSource(SourceDeclaration declaration) { ClusterSupport annotation = getAnnotation(declaration, ClusterSupport.class).orElse(null); if (annotation != null) { SourceClusterSupport clusterSupport = annotation.value(); if (clusterSupport == NOT_SUPPORTED) { declaration.setRunsOnPrimaryNodeOnly(true); } else { declaration.setRunsOnPrimaryNodeOnly(false); addPrimaryNodeParameter(declaration, clusterSupport == DEFAULT_PRIMARY_NODE_ONLY); } } else { declaration.setRunsOnPrimaryNodeOnly(false); addPrimaryNodeParameter(declaration, false); } } }.walk(extensionLoadingContext.getExtensionDeclarer().getDeclaration());
void document(TypeElement element, WithSourcesDeclaration<?>... containerDeclarations) { getSourceClasses(processingEnv, element) .forEach(sourceElement -> findMatchingSource(containerDeclarations, sourceElement) .ifPresent(source -> { source.setDescription(processor.getJavaDocSummary(processingEnv, sourceElement)); parameterDeclarer.document(source, sourceElement); Map<String, Element> methods = getApiMethods(processingEnv, singletonList(sourceElement)); source.getSuccessCallback().ifPresent(cb -> documentCallback(methods, cb)); source.getErrorCallback().ifPresent(cb -> documentCallback(methods, cb)); })); }
private void addBackPressureParameter(ExtensionDeclaration extensionDeclaration, SourceDeclaration sourceDeclaration, BackPressureStrategyModelProperty property) { ParameterDeclaration parameter = new ParameterDeclaration(BACK_PRESSURE_STRATEGY_PARAMETER_NAME); parameter.setDescription(BACK_PRESSURE_STRATEGY_PARAMETER_DESCRIPTION); parameter.setRequired(false); parameter.setDefaultValue(property.getDefaultMode()); parameter.setExpressionSupport(NOT_SUPPORTED); parameter.setLayoutModel(LayoutModel.builder().tabName(ADVANCED_TAB).build()); MetadataType type = BaseTypeBuilder.create(JAVA).stringType() .id(format("%s-%s-backPressureStrategy", extensionDeclaration.getName(), sourceDeclaration.getName())) .with(new EnumAnnotation<>(property.getSupportedModes().stream().map(BackPressureMode::name).toArray(String[]::new))) .build(); parameter.setType(type, false); sourceDeclaration.getParameterGroup(DEFAULT_GROUP_NAME).addParameter(parameter); }
private <T extends Annotation> Optional<T> getAnnotation(SourceDeclaration declaration, Class<T> annotation) { return declaration.getModelProperty(ExtensionTypeDescriptorModelProperty.class) .map(ExtensionTypeDescriptorModelProperty::getType) .filter(type -> type.isAnnotatedWith(annotation)) .flatMap(type -> type.getAnnotation(annotation)); }
@Override protected void onSource(SourceDeclaration source) { extractType(source).ifPresent(type -> { if (type.isAssignableTo(PollingSource.class)) { source.setRunsOnPrimaryNodeOnly(true); ParameterDeclaration parameter = new ParameterDeclaration(SCHEDULING_STRATEGY_PARAMETER_NAME); parameter.setDescription(SCHEDULING_STRATEGY_PARAMETER_DESCRIPTION); parameter.setRequired(true); parameter.setType(loader.load(Scheduler.class), false); parameter.setExpressionSupport(NOT_SUPPORTED); parameter.addModelProperty(new InfrastructureParameterModelProperty(10)); parameter.addModelProperty(new QNameModelProperty(new QName(CORE_NAMESPACE, SCHEDULING_STRATEGY_ELEMENT_IDENTIFIER, CORE_PREFIX))); parameter.setDslConfiguration(ParameterDslConfiguration.builder() .allowsInlineDefinition(true) .allowsReferences(false) .allowTopLevelDefinition(false) .build()); thereArePollingSources.set(true); source.getParameterGroup(DEFAULT_GROUP_NAME).addParameter(parameter); } }); } }.walk(extensionDeclarer.getDeclaration());
@Override protected void onSource(SourceDeclaration sourceDeclaration) { BackPressureStrategyModelProperty property; Optional<ExtensionTypeDescriptorModelProperty> extensionTypeDescriptorModelProperty = sourceDeclaration.getModelProperty(ExtensionTypeDescriptorModelProperty.class); if (extensionTypeDescriptorModelProperty.isPresent()) { Type sourceType = extensionTypeDescriptorModelProperty.get().getType(); property = sourceType.getAnnotation(BackPressure.class) .map(BackPressureStrategyModelProperty::of) .orElseGet(BackPressureStrategyModelProperty::getDefault); sourceDeclaration.addModelProperty(property); if (property.getSupportedModes().size() > 1) { addBackPressureParameter(extensionDeclaration, sourceDeclaration, property); } } } }.walk(extensionDeclaration);