blob: f681f60a51e0f33ea1120dbb27f7269cb9374331 [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.k.tooling.maven;
import java.io.IOException;
import java.nio.file.Paths;
import javax.lang.model.element.Modifier;
import com.fasterxml.jackson.core.Version;
import com.fasterxml.jackson.databind.Module;
import com.squareup.javapoet.CodeBlock;
import com.squareup.javapoet.JavaFile;
import com.squareup.javapoet.MethodSpec;
import com.squareup.javapoet.TypeSpec;
import org.apache.maven.plugin.MojoFailureException;
import org.apache.maven.plugins.annotations.LifecyclePhase;
import org.apache.maven.plugins.annotations.Mojo;
import org.apache.maven.plugins.annotations.ResolutionScope;
import org.jboss.jandex.AnnotationInstance;
import org.jboss.jandex.AnnotationValue;
import org.jboss.jandex.ClassInfo;
@Mojo(
name = "generate-yaml-loader-support-classes",
inheritByDefault = false,
defaultPhase = LifecyclePhase.GENERATE_SOURCES,
requiresDependencyResolution = ResolutionScope.COMPILE,
threadSafe = true,
requiresProject = false)
public class GenerateYamlLoaderSupportClasses extends GenerateYamlSupport {
@Override
public void execute() throws MojoFailureException {
try {
JavaFile.builder("org.apache.camel.k.loader.yaml", generateJacksonModule())
.indent(" ")
.build()
.writeTo(Paths.get(output));
JavaFile.builder("org.apache.camel.k.loader.yaml", generateReifiers())
.indent(" ")
.build()
.writeTo(Paths.get(output));
} catch (IOException e) {
throw new MojoFailureException(e.getMessage());
}
}
public final TypeSpec generateJacksonModule() {
TypeSpec.Builder type = TypeSpec.classBuilder("YamlModule");
type.addModifiers(Modifier.PUBLIC, Modifier.FINAL);
type.superclass(Module.class);
type.addMethod(
MethodSpec.methodBuilder("getModuleName")
.addModifiers(Modifier.PUBLIC)
.addAnnotation(Override.class)
.returns(String.class)
.addCode(CodeBlock.builder().addStatement("return $S", "camel-yaml").build())
.build()
);
type.addMethod(
MethodSpec.methodBuilder("version")
.addModifiers(Modifier.PUBLIC)
.addAnnotation(Override.class)
.returns(Version.class)
.addCode(CodeBlock.builder().addStatement("return $L", "Version.unknownVersion()").build())
.build()
);
MethodSpec.Builder mb = MethodSpec.methodBuilder("setupModule")
.addModifiers(Modifier.PUBLIC)
.addParameter(Module.SetupContext.class, "context");
definitions(EXPRESSION_DEFINITION_CLASS).forEach(
(k, v) -> mb.addStatement("context.registerSubtypes(new com.fasterxml.jackson.databind.jsontype.NamedType($T.class, $S))", v, k)
);
definitions(DATAFORMAT_DEFINITION_CLASS).forEach(
(k, v) -> mb.addStatement("context.registerSubtypes(new com.fasterxml.jackson.databind.jsontype.NamedType($T.class, $S))", v, k)
);
definitions(LOAD_BALANCE_DEFINITION_CLASS).forEach(
(k, v) -> mb.addStatement("context.registerSubtypes(new com.fasterxml.jackson.databind.jsontype.NamedType($T.class, $S))", v, k)
);
annotated(YAML_MIXIN_ANNOTATION).forEach(i -> {
final AnnotationInstance annotation = i.classAnnotation(YAML_MIXIN_ANNOTATION);
final AnnotationValue targets = annotation.value("value");
String name = i.toString();
if (i.nestingType() == ClassInfo.NestingType.INNER) {
name = i.enclosingClass().toString() + "." + i.simpleName();
}
if (targets != null) {
for (String target: targets.asStringArray()) {
mb.addStatement("context.setMixInAnnotations($L.class, $L.class);", target, name);
}
}
});
type.addMethod(mb.build());
return type.build();
}
public final TypeSpec generateReifiers() {
TypeSpec.Builder type = TypeSpec.classBuilder("YamlReifiers");
type.addModifiers(Modifier.PUBLIC, Modifier.FINAL);
MethodSpec.Builder mb = MethodSpec.methodBuilder("registerReifiers")
.addModifiers(Modifier.PUBLIC)
.addModifiers(Modifier.STATIC);
annotated(YAML_STEP_DEFINITION_ANNOTATION).forEach(i -> {
final AnnotationInstance annotation = i.classAnnotation(YAML_STEP_DEFINITION_ANNOTATION);
final AnnotationValue reifiers = annotation.value("reifiers");
String name = i.toString();
if (i.nestingType() == ClassInfo.NestingType.INNER) {
name = i.enclosingClass().toString() + "." + i.simpleName();
}
if (reifiers != null) {
for (String reifier: reifiers.asStringArray()) {
mb.addStatement("org.apache.camel.reifier.ProcessorReifier.registerReifier($L.class, $L::new);", name, reifier);
}
}
});
type.addMethod(mb.build());
return type.build();
}
}