Created
January 9, 2025 16:07
-
-
Save agentgt/0a7484ec8820446c2970d8b2af527bb9 to your computer and use it in GitHub Desktop.
jOOQ generator extension to add @default for MapStruct and to create package info for JSpecify annotations
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public class CustomJavaGenerator extends JavaGenerator { | |
private final ThreadLocal<@Nullable JavaWriter> currentJavaWriter = new ThreadLocal<>(); | |
private final ConcurrentHashMap<String, String> packageMap = new ConcurrentHashMap<>(); | |
@Override | |
protected void generateRecord( | |
TableDefinition table) { | |
String packageName = getStrategy().getJavaPackageName(table, Mode.RECORD); | |
File recordFile = getFile(table, Mode.RECORD); | |
if (packageName != null && packageMap.putIfAbsent(packageName, packageName) == null) { | |
File packageDirectory = recordFile.getParentFile(); | |
File packageInfoFile = new File(packageDirectory, "package-info.java"); | |
JavaWriter packageInfo = newJavaWriter(packageInfoFile); | |
packageInfo.println("@" + "org.eclipse.jdt.annotation.NonNullByDefault"); | |
packageInfo.println("package " + packageName + ";"); | |
closeJavaWriter(packageInfo); | |
} | |
JavaWriter out = newJavaWriter(getFile(table, Mode.RECORD)); | |
if (currentJavaWriter.get() != null) { | |
log.error("Java writer wasn't cleared from thread local"); | |
} | |
currentJavaWriter.set(out); | |
try { | |
log.info( | |
"Generating record", | |
out.file() | |
.getName()); | |
generateRecord(table, out); | |
} | |
finally { | |
currentJavaWriter.remove(); | |
} | |
closeJavaWriter(out); | |
} | |
@Override | |
public boolean generateConstructorPropertiesAnnotationOnRecords() { | |
JavaWriter out = currentJavaWriter.get(); | |
// if out is not null then we know we are generating a record | |
if (out != null) { | |
out.println("@%s", Default.class); | |
} | |
return super.generateConstructorPropertiesAnnotationOnRecords(); | |
} | |
private static final JooqLogger log = JooqLogger.getLogger(CustomJavaGenerator.class); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment