@Override
    public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
        // Iterate over all @Extension annotated elements.
        for (Element element : roundEnv.getElementsAnnotatedWith(Extension.class)) {
            // Check if a class has been annotated with @Extension.
            if (element.getKind() == ElementKind.CLASS) {
                String superClass = getMatchingSuperClass(element, new String[]{
                        AnnotationConstants.SINK_MAPPER_SUPER_CLASS,
                        AnnotationConstants.SINK_SUPER_CLASS,
                        AnnotationConstants.FUNCTION_EXECUTOR_SUPER_CLASS,
                        AnnotationConstants.AGGREGATION_ATTRIBUTE_EXECUTOR_SUPER_CLASS,
                        AnnotationConstants.DISTRIBUTION_STRATEGY_SUPER_CLASS,
                        AnnotationConstants.STREAM_PROCESSOR_SUPER_CLASS,
                        AnnotationConstants.STREAM_FUNCTION_PROCESSOR_SUPER_CLASS,
                        AnnotationConstants.STORE_SUPER_CLASS,
                        AnnotationConstants.SOURCE_SUPER_CLASS,
                        AnnotationConstants.SOURCE_MAPPER_SUPER_CLASS,
                        AnnotationConstants.WINDOW_PROCESSOR_CLASS,
                        AnnotationConstants.SCRIPT_SUPER_CLASS,
                        AnnotationConstants.INCREMENTAL_ATTRIBUTE_AGGREGATOR_SUPER_CLASS});
                AbstractAnnotationProcessor abstractAnnotationProcessor = null;
                Extension annotation = element.getAnnotation(Extension.class);
                String name = annotation.name();
                String description = annotation.description();
                String namespace = annotation.namespace();
                Parameter[] parameters = annotation.parameters();
                ParameterOverload[] parameterOverloads = annotation.parameterOverloads();
                ReturnAttribute[] returnAttributes = annotation.returnAttributes();
                SystemParameter[] systemParameters = annotation.systemParameter();
                Example[] examples = annotation.examples();
                String extensionClassFullName = element.asType().toString();
                if (superClass != null) {
                    switch (superClass) {
                        case AnnotationConstants.DISTRIBUTION_STRATEGY_SUPER_CLASS:
                            abstractAnnotationProcessor =
                                    new DistributionStrategyValidationAnnotationProcessor(extensionClassFullName);
                            break;
                        case AnnotationConstants.SINK_MAPPER_SUPER_CLASS:
                            abstractAnnotationProcessor =
                                    new SinkMapperValidationAnnotationProcessor(extensionClassFullName);
                            break;
                        case AnnotationConstants.SINK_SUPER_CLASS:
                            abstractAnnotationProcessor =
                                    new SinkValidationAnnotationProcessor(extensionClassFullName);
                            break;
                        case AnnotationConstants.FUNCTION_EXECUTOR_SUPER_CLASS:
                            abstractAnnotationProcessor =
                                    new FunctionExecutorValidationAnnotationProcessor(extensionClassFullName);
                            break;
                        case AnnotationConstants.AGGREGATION_ATTRIBUTE_EXECUTOR_SUPER_CLASS:
                            abstractAnnotationProcessor =
                                    new AggregationAttributeValidationAnnotationProcessor(extensionClassFullName);
                            break;
                        case AnnotationConstants.STREAM_PROCESSOR_SUPER_CLASS:
                            abstractAnnotationProcessor =
                                    new StreamProcessorValidationAnnotationProcessor(extensionClassFullName);
                            break;
                        case AnnotationConstants.SOURCE_SUPER_CLASS:
                            abstractAnnotationProcessor =
                                    new SourceValidationAnnotationProcessor(extensionClassFullName);
                            break;
                        case AnnotationConstants.SOURCE_MAPPER_SUPER_CLASS:
                            abstractAnnotationProcessor =
                                    new SourceMapperValidationAnnotationProcessor(extensionClassFullName);
                            break;
                        case AnnotationConstants.STORE_SUPER_CLASS:
                            abstractAnnotationProcessor =
                                    new StoreValidationAnnotationProcessor(extensionClassFullName);
                            break;
                        case AnnotationConstants.STREAM_FUNCTION_PROCESSOR_SUPER_CLASS:
                            abstractAnnotationProcessor =
                                    new StreamFunctionProcessorValidationAnnotationProcessor(extensionClassFullName);
                            break;
                        case AnnotationConstants.WINDOW_PROCESSOR_CLASS:
                            abstractAnnotationProcessor =
                                    new WindowProcessorValidationAnnotationProcessor(extensionClassFullName);
                            break;
                        case AnnotationConstants.SCRIPT_SUPER_CLASS:
                            abstractAnnotationProcessor =
                                    new ScriptValidationAnnotationProcessor(extensionClassFullName);
                            break;
                        case AnnotationConstants.INCREMENTAL_ATTRIBUTE_AGGREGATOR_SUPER_CLASS:
                            abstractAnnotationProcessor =
                                    new IncrementalAggregationAttributeValidationAnnotationProcessor(
                                            extensionClassFullName);
                            break;
                        default:
                            //Throw error if no matching super class.
                            showBuildError(MessageFormat.format("Default switch case executed as there is no " +
                                            "matching super class option for @{0}.",
                                    superClass), element);
                            break;
                    }
                    if (abstractAnnotationProcessor != null) {
                        try {
                            abstractAnnotationProcessor.basicParameterValidation(name, description, namespace);
                            abstractAnnotationProcessor.parameterValidation(parameters);
                            abstractAnnotationProcessor.parameterOverloadValidation(parameterOverloads, parameters);
                            abstractAnnotationProcessor.returnAttributesValidation(returnAttributes);
                            abstractAnnotationProcessor.systemParametersValidation(systemParameters);
                            abstractAnnotationProcessor.examplesValidation(examples);
                        } catch (AnnotationValidationException e) {
                            showBuildError(e.getMessage(), element);
                        }
                    } else {
                        showBuildError(MessageFormat.format("Error while validation, " +
                                "abstractAnnotationProcessor cannot be null.", superClass), element);
                    }
                } else {
                    //Throw error if no matching super class.
                    showBuildError("Class does not have a matching Siddhi Extension super class.", element);
                }
            } else {
                //Throw error if the element returned is method or package.
                showBuildError(MessageFormat.format("Only classes can be annotated with @{0}.",
                        Extension.class.getCanonicalName()), element);
            }
        }
        return false; // Returning false since this processor only validates.
    }
The annotation processor for siddhi extension annotation validation. This will validate @Extension, @Parameter,
ReturnAttribute, @SystemParameter and @Example annotation and parameters. Note that each of the validation
processor select using the super class where the extension extends or implement.
<p>
annotationsClasses : holds all the supported annotations class.
messager : the messager used to report errors, warnings, and other notices when validation error throws..
modules/siddhi-annotations/src/main/java/io/siddhi/annotation/processor/SiddhiAnnotationProcessor.java