blob: 09952408503f8a72ab5e856d107ff2ba8cde2035 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.camel.tools.apt;
import java.util.Iterator;
import java.util.Set;
import java.util.TreeSet;
import java.util.function.Predicate;
import java.util.stream.Collectors;
import javax.annotation.processing.Messager;
import javax.annotation.processing.RoundEnvironment;
import javax.annotation.processing.SupportedAnnotationTypes;
import javax.lang.model.element.Element;
import javax.lang.model.element.TypeElement;
import javax.tools.Diagnostic.Kind;
import javax.xml.bind.annotation.XmlRootElement;
import static org.apache.camel.tools.apt.helper.Strings.canonicalClassName;
/**
* APT compiler plugin to generate JSon Schema for all EIP models and camel-spring's <camelContext> types.
*/
@SupportedAnnotationTypes({"javax.xml.bind.annotation.*", "org.apache.camel.spi.Label"})
public class ModelAnnotationProcessor extends AbstractCamelAnnotationProcessor {
private CoreEipAnnotationProcessorHelper coreProcessor = new CoreEipAnnotationProcessorHelper();
private SpringAnnotationProcessorHelper springProcessor = new SpringAnnotationProcessorHelper();
@Override
protected void doProcess(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) throws Exception {
Set<? extends Element> elements = roundEnv.getElementsAnnotatedWith(XmlRootElement.class);
final Messager messager = processingEnv.getMessager();
messager.printMessage(Kind.WARNING, String.format("Found %d elements annotated with XmlRootElement", elements.size()));
Set<? extends Element> coreElements = elements.stream()
.filter(new Predicate<Element>() {
@Override
public boolean test(Element element) {
if (element instanceof TypeElement) {
TypeElement classElement = (TypeElement) element;
final String javaTypeName = canonicalClassName(classElement.getQualifiedName().toString());
return javaTypeName.startsWith("org.apache.camel.model");
}
return false;
}
}).collect(Collectors.toSet());
messager.printMessage(Kind.WARNING, String.format("Found %d core elements", coreElements.size()));
Set<? extends Element> springElements = elements.stream()
.filter(new Predicate<Element>() {
@Override
public boolean test(Element element) {
if (element instanceof TypeElement) {
TypeElement classElement = (TypeElement) element;
final String javaTypeName = canonicalClassName(classElement.getQualifiedName().toString());
return javaTypeName.startsWith("org.apache.camel.spring") || javaTypeName.startsWith("org.apache.camel.core.xml");
}
return false;
}
}).collect(Collectors.toSet());
messager.printMessage(Kind.WARNING, String.format("Found %d spring elements", springElements.size()));
// we want them to be sorted
Set<String> propertyPlaceholderDefinitions = new TreeSet<>(String::compareToIgnoreCase);
Iterator<? extends Element> it = coreElements.iterator();
while (it.hasNext()) {
TypeElement classElement = (TypeElement) it.next();
coreProcessor.processModelClass(processingEnv, roundEnv, classElement, propertyPlaceholderDefinitions);
}
it = springElements.iterator();
while (it.hasNext()) {
TypeElement classElement = (TypeElement) it.next();
springProcessor.processModelClass(processingEnv, roundEnv, classElement);
}
if (!propertyPlaceholderDefinitions.isEmpty()) {
messager.printMessage(Kind.WARNING, String.format("Generating placeholder definitions helper for %d definitions", propertyPlaceholderDefinitions.size()));
PropertyPlaceholderGenerator.generatePropertyPlaceholderDefinitionsHelper(processingEnv, roundEnv, propertyPlaceholderDefinitions);
}
}
}