blob: 471b679f8452eaf85aa13580695e80bd1497c3e4 [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
* <p>
* http://www.apache.org/licenses/LICENSE-2.0
* <p>
* 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.hadoop.hdds.conf;
import javax.annotation.processing.AbstractProcessor;
import javax.annotation.processing.Filer;
import javax.annotation.processing.RoundEnvironment;
import javax.annotation.processing.SupportedAnnotationTypes;
import javax.lang.model.element.Element;
import javax.lang.model.element.ElementKind;
import javax.lang.model.element.TypeElement;
import javax.tools.Diagnostic.Kind;
import javax.tools.FileObject;
import javax.tools.StandardLocation;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.nio.charset.StandardCharsets;
import java.nio.file.NoSuchFileException;
import java.util.Set;
/**
* Annotation processor to generate config fragments from Config annotations.
*/
@SupportedAnnotationTypes("org.apache.hadoop.hdds.conf.ConfigGroup")
public class ConfigFileGenerator extends AbstractProcessor {
public static final String OUTPUT_FILE_NAME = "ozone-default-generated.xml";
@Override
public boolean process(Set<? extends TypeElement> annotations,
RoundEnvironment roundEnv) {
if (roundEnv.processingOver()) {
return false;
}
Filer filer = processingEnv.getFiler();
try {
//load existing generated config (if exists)
ConfigFileAppender appender = new ConfigFileAppender();
try (InputStream input = filer
.getResource(StandardLocation.CLASS_OUTPUT, "",
OUTPUT_FILE_NAME).openInputStream()) {
appender.load(input);
} catch (FileNotFoundException | NoSuchFileException ex) {
appender.init();
}
Set<? extends Element> annotatedElements =
roundEnv.getElementsAnnotatedWith(ConfigGroup.class);
for (Element annotatedElement : annotatedElements) {
TypeElement configGroup = (TypeElement) annotatedElement;
//check if any of the setters are annotated with @Config
for (Element element : configGroup.getEnclosedElements()) {
if (element.getKind() == ElementKind.METHOD) {
processingEnv.getMessager()
.printMessage(Kind.WARNING, element.getSimpleName().toString());
if (element.getSimpleName().toString().startsWith("set")
&& element.getAnnotation(Config.class) != null) {
//update the ozone-site-generated.xml
Config configAnnotation = element.getAnnotation(Config.class);
ConfigGroup configGroupAnnotation =
configGroup.getAnnotation(ConfigGroup.class);
String key = configGroupAnnotation.prefix() + "."
+ configAnnotation.key();
appender.addConfig(key,
configAnnotation.defaultValue(),
configAnnotation.description(),
configAnnotation.tags());
}
}
}
}
FileObject resource = filer
.createResource(StandardLocation.CLASS_OUTPUT, "",
OUTPUT_FILE_NAME);
try (Writer writer = new OutputStreamWriter(
resource.openOutputStream(), StandardCharsets.UTF_8)) {
appender.write(writer);
}
} catch (IOException e) {
processingEnv.getMessager().printMessage(Kind.ERROR,
"Can't generate the config file from annotation: " + e);
}
return false;
}
}