/**
* Copyright 2005-2016 Red Hat, Inc.
*
* Red Hat 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 io.fabric8.tools.apt;
import org.apache.deltaspike.core.api.config.ConfigProperty;
import javax.annotation.processing.RoundEnvironment;
import javax.annotation.processing.SupportedAnnotationTypes;
import javax.annotation.processing.SupportedSourceVersion;
import javax.lang.model.SourceVersion;
import javax.lang.model.element.Element;
import javax.lang.model.element.TypeElement;
import java.util.Set;
/**
* Processes all Camel {@link ConfigProperty}s and generate json schema and html documentation for the endpoint/component.
*/
@SupportedAnnotationTypes({"*"})
@SupportedSourceVersion(SourceVersion.RELEASE_8)
public class ConfigPropertyAnnotationProcessor extends AbstractAnnotationProcessor {
public boolean process(Set<? extends TypeElement> annotations, final RoundEnvironment roundEnv) {
if (roundEnv.processingOver()) {
return true;
}
Set<? extends Element> elements = roundEnv.getElementsAnnotatedWith(ConfigProperty.class);
if (!elements.isEmpty()) {
StringBuilder buffer = new StringBuilder("{");
buffer.append("\n \"type\": \"object\",");
// TODO add schema, title, description from env...
log("options: " + processingEnv.getOptions());
buffer.append("\n \"properties\": {");
boolean first = true;
for (Element element : elements) {
processEndpointClass(roundEnv, element, buffer, first);
first = false;
}
buffer.append("\n }");
buffer.append("\n}");
buffer.append("\n");
String text = buffer.toString();
writeFile("io.fabric8.environment", "schema.json", text);
}
return true;
}
protected void processEndpointClass(final RoundEnvironment roundEnv, final Element element, StringBuilder buffer, boolean first) {
final ConfigProperty property = element.getAnnotation(ConfigProperty.class);
if (property != null) {
String defaultValue = property.defaultValue();
if ("org.apache.deltaspike.NullValueMarker".equals(defaultValue)) {
defaultValue = null;
}
String name = property.name();
String description = JavaDocs.getJavaDoc(getElements(), element);
String javaTypeName = javaTypeName(element);
String jsonType = JsonSchemaTypes.getJsonSchemaTypeName(javaTypeName);
if (!first) {
buffer.append(",");
}
buffer.append("\n \"").append(name).append("\": {");
buffer.append("\n \"type\": \"").append(jsonType).append("\",");
if (defaultValue != null) {
buffer.append("\n \"default\": \"").append(defaultValue).append("\",");
}
if (description != null) {
description = description.trim();
if (description.length() > 0) {
buffer.append("\n \"description\": \"").append(description).append("\",");
}
}
buffer.append("\n \"javaType\": \"").append(javaTypeName).append("\"");
buffer.append("\n }");
}
}
}