blob: c9fe79eb200c6d19eee6878a2c36e5725a93505d [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.generator.swagger;
import java.io.IOException;
import java.nio.file.Path;
import javax.annotation.Generated;
import javax.lang.model.element.Modifier;
import com.squareup.javapoet.AnnotationSpec;
import com.squareup.javapoet.ClassName;
import com.squareup.javapoet.JavaFile;
import com.squareup.javapoet.MethodSpec;
import com.squareup.javapoet.TypeSpec;
import org.apache.camel.util.ObjectHelper;
import static org.apache.camel.util.StringHelper.notEmpty;
public class SpringBootProjectSourceCodeGenerator {
private static final String DEFAULT_INDENT = " ";
private String indent = DEFAULT_INDENT;
private String packageName;
public void generate(Path destination) throws IOException {
final JavaFile javaFile = generateSourceCode();
javaFile.writeTo(destination);
}
public SpringBootProjectSourceCodeGenerator withIndent(final String indent) {
this.indent = ObjectHelper.notNull(indent, "indent");
return this;
}
public SpringBootProjectSourceCodeGenerator withPackageName(final String packageName) {
notEmpty(packageName, "packageName");
this.packageName = packageName;
return this;
}
JavaFile generateSourceCode() {
notEmpty(packageName, "packageName");
final MethodSpec methodSpec = generateRestMethod();
final String classNameToUse = "CamelRestController";
final AnnotationSpec.Builder generatedAnnotation = AnnotationSpec.builder(Generated.class).addMember("value",
"$S", getClass().getName());
final AnnotationSpec.Builder restAnnotation = AnnotationSpec.builder(ClassName.bestGuess("org.springframework.web.bind.annotation.RestController"));
TypeSpec.Builder builder = TypeSpec.classBuilder(classNameToUse)
.addModifiers(Modifier.PUBLIC, Modifier.FINAL).addMethod(methodSpec)
.addAnnotation(generatedAnnotation.build())
.addAnnotation(restAnnotation.build())
.addJavadoc("Forward requests to the Camel servlet so it can service REST requests.\n");
TypeSpec generatedRestController = builder.build();
return JavaFile.builder(packageName, generatedRestController).indent(indent).build();
}
MethodSpec generateRestMethod() {
ClassName req = ClassName.bestGuess("javax.servlet.http.HttpServletRequest");
ClassName res = ClassName.bestGuess("javax.servlet.http.HttpServletResponse");
final AnnotationSpec.Builder reqAnnotation = AnnotationSpec.builder(ClassName.bestGuess("org.springframework.web.bind.annotation.RequestMapping"))
.addMember("value", "\"/**\"");
final MethodSpec.Builder forward = MethodSpec.methodBuilder("camelServlet").addModifiers(Modifier.PUBLIC)
.addParameter(req, "request")
.addParameter(res, "response")
.addAnnotation(reqAnnotation.build())
.returns(void.class);
forward.addCode("try {\n");
forward.addCode(" String path = request.getRequestURI();\n");
forward.addCode(" request.getServletContext().getRequestDispatcher(\"/camel/\" + path).forward(request, response);\n");
forward.addCode("} catch (Exception e) {\n");
forward.addCode(" response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);\n");
forward.addCode("}\n");
return forward.build();
}
public static SpringBootProjectSourceCodeGenerator generator() {
return new SpringBootProjectSourceCodeGenerator();
}
}