Subato

Annotation Processor

Studieren Sie den zur Aufgabe gehörenden Lehrbrief und lösen Sie die Aufgaben darin. Testen Sie ihre Lösungen zunächst am besten interaktiv in der JShell.


package name.panitz.util; import java.util.Set; import javax.annotation.processing.*; import javax.lang.model.SourceVersion; import javax.lang.model.element.*; import javax.tools.Diagnostic.Kind; import javax.lang.model.type.*; import java.io.*; @SupportedAnnotationTypes("name.panitz.util.CheckDataObject") @SupportedSourceVersion(SourceVersion.RELEASE_16) public class DataObjectProcessor extends AbstractProcessor { @Override public boolean process(Set<?extends TypeElement>as,RoundEnvironment env){ try{ for (var element : env.getElementsAnnotatedWith(CheckDataObject.class)) { String packageName = ((PackageElement)element.getEnclosingElement()) .getQualifiedName().toString(); var cs = ((TypeElement)element); generateSetter(packageName,cs); checkArgumentTypes(packageName,cs); generateServlet(packageName,cs); } return false; }catch (Exception e){throw new RuntimeException(e);} } private void generateSetter(String packageName,TypeElement cs) throws Exception{ var simpleName = cs.getSimpleName(); var name = simpleName+"Util"; var fqn = packageName != null?packageName+"."+name:name; var builderFile = processingEnv.getFiler().createSourceFile(fqn); var out = new PrintWriter(builderFile.openWriter()) ; if (packageName != null) { out.append("package ").append(packageName).append(";\n"); } out.append("public class ").append(name).append("{"); for (var rc:cs.getRecordComponents()){ out.write("\n static public "+simpleName); out.write(" set"+rc.getSimpleName()); out.write("("+simpleName+" dies, "+ rc.asType() + " v){"); out.write("\n return new "+simpleName+"("); var first=true; for (var rc2:cs.getRecordComponents()){ if (first) first=false; else out.write(", "); if (rc2.getSimpleName().equals(rc.getSimpleName())) out.write("v"); else out.write("dies."+rc2.getSimpleName()+"()"); } out.append(");").append("\n }"); } out.write("\n}"); out.close(); } private void checkArgumentTypes(String packageName,TypeElement cs) throws Exception{ for (var rc:cs.getRecordComponents()){ if (!isAllowedFieldType(rc.asType())) processingEnv.getMessager().printMessage (Kind.ERROR, "illegal field type in DataObject " + rc.asType()+ " for field "+rc, cs); } } public static boolean isAllowedFieldType(TypeMirror type) { if (type instanceof DeclaredType dt) { if (dt.asElement() instanceof TypeElement ce) { return ce.toString().equals("name.panitz.util.UID") ||ce.toString().equals("java.lang.String") ||ce.getInterfaces().stream() .anyMatch(i->(""+i).equals("name.panitz.util.DataObject")); } }else if (type instanceof PrimitiveType){ return !type.toString().equals("char"); } return false; } private void generateServlet(String packageName,TypeElement cs) throws Exception{ var simpleName = cs.getSimpleName(); var name = simpleName+"Servlet"; var builderFile = processingEnv.getFiler().createSourceFile(name); var out = new PrintWriter(builderFile.openWriter()) ; if (packageName != null) { out.append("package ").append(packageName).append(";\n"); } out.write( """ import java.io.*; import javax.servlet.*; import javax.servlet.http.*; import java.sql.*; import static name.panitz.util.DataObject.*; public class """); out.write(" "+name+" "); out.write( """ extends HttpServlet{ @Override public void doGet(HttpServletRequest request,HttpServletResponse response) throws IOException, ServletException { response.setContentType("text/xml"); response.setCharacterEncoding("UTF-8"); String requestUri = request.getRequestURI(); String rest = requestUri.substring((request.getContextPath()+"/""" +simpleName+"/\").length());"); out.write( """ if (rest.startsWith("list")){ //TODO """); out.write( """ }else if (rest.startsWith("get")){ //TODO """); out.write( """ }else if (rest.startsWith("createTable")){ //TODO """); out.write( """ }else if (rest.startsWith("save")){ //TODO """); out.write( """ }else if (rest.startsWith("delete")){ //TODO """); out.write( """ }else { response .getOutputStream() .println ("<info>no match "+rest+" in "+requestUri+"</info>"); } } @Override public void doPost(HttpServletRequest rq,HttpServletResponse rp) throws IOException, ServletException { doGet(rq,rp); } } """); out.close(); } }
java
You are not logged in and therefore you cannot submit a solution.