Skip to content

Commit 21b1ffc

Browse files
Merge pull request #47 from yojo-generator/develop
* 📈 ISSUE-36 Add @generated annotation
2 parents 1cf33a2 + 6e5140e commit 21b1ffc

6 files changed

Lines changed: 57 additions & 50 deletions

File tree

src/main/java/ru/yojo/codegen/constants/Dictionary.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -383,6 +383,10 @@ public final class Dictionary {
383383
* Email annotation template
384384
*/
385385
public static final String EMAIL_ANNOTATION = "@Email";
386+
/**
387+
* Generated annotation
388+
*/
389+
public static final String GENERATED_ANNOTATION = "@Generated(\"Yojo\")";
386390
/**
387391
* Digits annotation template
388392
*/
@@ -687,6 +691,10 @@ public final class Dictionary {
687691
* Javax Email import
688692
*/
689693
public static final String JAVAX_EMAIL_IMPORT = "javax.validation.constraints.Email;";
694+
/**
695+
* Javax Generated import
696+
*/
697+
public static final String JAVAX_GENERATED_IMPORT = "javax.annotation.processing.Generated;";
690698
/**
691699
* Standard collection and utility imports.
692700
*/

src/main/java/ru/yojo/codegen/domain/message/Message.java

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@
77
import java.util.Set;
88

99
import static java.lang.System.lineSeparator;
10-
import static ru.yojo.codegen.constants.Dictionary.*;
10+
import static ru.yojo.codegen.constants.Dictionary.LOMBOK_DATA_ANNOTATION;
11+
import static ru.yojo.codegen.constants.Dictionary.LOMBOK_DATA_IMPORT;
1112
import static ru.yojo.codegen.util.MapperUtil.*;
1213

1314
/**
@@ -290,19 +291,9 @@ public String toWrite() {
290291

291292
stringBuilder.insert(0, lombokAnnotationBuilder);
292293

293-
if (isNotBlank(summary)) {
294-
StringBuilder javadoc = new StringBuilder();
295-
javadoc.append(lineSeparator()).append(JAVA_DOC_CLASS_START);
296-
javadoc.append(lineSeparator()).append(String.format(JAVA_DOC_CLASS_LINE, summary));
297-
javadoc.append(lineSeparator()).append(JAVA_DOC_CLASS_END);
298-
javadoc.append(lineSeparator());
299-
300-
stringBuilder.insert(0, javadoc);
301-
}
302-
303294
fillParameters.getVariableProperties().forEach(vp -> requiredImports.addAll(vp.getRequiredImports()));
304295

305-
return finishBuild(stringBuilder, requiredImports, messagePackageName);
296+
return finishBuild(stringBuilder, requiredImports, messagePackageName, summary);
306297
}
307298

308299
public FillParameters getFillParameters() {

src/main/java/ru/yojo/codegen/domain/schema/Schema.java

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -389,11 +389,7 @@ public String toWrite() {
389389

390390
stringBuilder.insert(0, lombokAnnotationBuilder);
391391

392-
if (!isInterface) {
393-
generateClassJavaDoc(stringBuilder, description);
394-
}
395-
396-
return finishBuild(stringBuilder, requiredImports, packageName);
392+
return finishBuild(stringBuilder, requiredImports, packageName, description);
397393
}
398394

399395
// ——— Helper methods ——— //
@@ -405,7 +401,7 @@ public String toWrite() {
405401
*/
406402
private StringBuilder generateInterface() {
407403
StringBuilder stringBuilder = getInterfaceBuilder(schemaName);
408-
generateClassJavaDoc(stringBuilder, description);
404+
// generateClassJavaDoc(stringBuilder, description);
409405
if (!methods.isEmpty()) {
410406
methods.values().forEach(method -> {
411407
Map<String, Object> currentMethod = castObjectToMap(method);
@@ -422,11 +418,12 @@ private StringBuilder generateInterface() {
422418
});
423419
}
424420
if (!interfaceImports.isEmpty()) {
425-
stringBuilder.insert(0, lineSeparator());
426-
interfaceImports.forEach(i -> {
427-
i = IMPORT.concat(i.endsWith(";") ? i : i + ";");
428-
stringBuilder.insert(0, i + lineSeparator());
429-
});
421+
getImportSet().addAll(interfaceImports);
422+
// stringBuilder.insert(0, lineSeparator());
423+
// interfaceImports.forEach(i -> {
424+
// i = IMPORT.concat(i.endsWith(";") ? i : i + ";");
425+
// stringBuilder.insert(0, i + lineSeparator());
426+
// });
430427
}
431428
return stringBuilder;
432429
}

src/main/java/ru/yojo/codegen/util/MapperUtil.java

Lines changed: 16 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@
2626
*/
2727
@SuppressWarnings("all")
2828
public class MapperUtil {
29-
3029
/**
3130
* Safely extracts a {@code Set<String>} value from a map for the given key, or returns an empty set.
3231
*
@@ -213,7 +212,7 @@ public static StringBuilder getEnumClassBuilder(String schemaName) {
213212
* }
214213
* </pre>
215214
*
216-
* @param schemaName class name
215+
* @param schemaName class name
217216
* @param implementsFrom set of interface simple names
218217
* @return builder with class+implements header
219218
*/
@@ -238,7 +237,7 @@ public static StringBuilder getImplementationClassBuilder(String schemaName, Set
238237
* }
239238
* </pre>
240239
*
241-
* @param schemaName class name
240+
* @param schemaName class name
242241
* @param extendsClass superclass name
243242
* @return builder with class+extends header
244243
*/
@@ -262,8 +261,8 @@ public static StringBuilder getExtendsClassBuilder(String schemaName, String ext
262261
* }
263262
* </pre>
264263
*
265-
* @param schemaName class name
266-
* @param extendsClass superclass name
264+
* @param schemaName class name
265+
* @param extendsClass superclass name
267266
* @param implementsFrom set of interface names
268267
* @return builder with full inheritance header
269268
*/
@@ -435,28 +434,35 @@ private static String fetchAccessors(LombokProperties lombokProperties) {
435434
}
436435

437436
/**
438-
* Finalizes Java source by prepending package and imports, and appending closing brace.
437+
* Finalizes Java source by prepending package, imports, and @Generated annotation, and appending closing brace.
439438
*
440439
* @param sb builder with class body
441440
* @param requiredImports set of import strings
442-
* @param packageName package name (with semicolon)
441+
* @param packageName package name
442+
* @param javaDoc javaDoc text
443443
* @return complete Java source
444444
*/
445-
public static String finishBuild(StringBuilder sb, Set<String> requiredImports, String packageName) {
445+
public static String finishBuild(StringBuilder sb, Set<String> requiredImports, String packageName, String javaDoc) {
446446
StringBuilder importBuilder = new StringBuilder();
447+
448+
requiredImports.add(JAVAX_GENERATED_IMPORT);
449+
447450
requiredImports.forEach(imp -> {
448451
importBuilder
449452
.append(IMPORT)
450453
.append(imp)
451454
.append(lineSeparator());
452455
});
453-
sb.insert(0, importBuilder.append(lineSeparator()));
454456

457+
sb.insert(0, GENERATED_ANNOTATION + lineSeparator());
458+
459+
generateClassJavaDoc(sb, javaDoc);
460+
461+
sb.insert(0, importBuilder.append(lineSeparator()));
455462
sb.insert(0, new StringBuilder("package ")
456463
.append(packageName)
457464
.append(lineSeparator())
458465
.append(lineSeparator()));
459-
460466
return sb
461467
.append(lineSeparator())
462468
.append("}")
@@ -490,7 +496,6 @@ public static StringBuilder prepareStringBuilder(Set<String> requiredImports,
490496
} else {
491497
sb = getClassBuilder(schemaName);
492498
}
493-
494499
requiredImports.addAll(importSet);
495500
sb.append(fillParameters.toWrite()).append(lineSeparator());
496501
return sb;
@@ -511,7 +516,6 @@ public static String capitalize(final String str) {
511516
if (strLen == 0) {
512517
return str;
513518
}
514-
515519
final int firstCodepoint = str.codePointAt(0);
516520
final int newCodePoint = Character.toTitleCase(firstCodepoint);
517521
return checkPoints(firstCodepoint, newCodePoint, str, new int[strLen], strLen);
@@ -528,7 +532,6 @@ public static String uncapitalize(final String str) {
528532
if (strLen == 0) {
529533
return str;
530534
}
531-
532535
final int firstCodepoint = str.codePointAt(0);
533536
final int newCodePoint = Character.toLowerCase(firstCodepoint);
534537
return checkPoints(firstCodepoint, newCodePoint, str, new int[strLen], strLen);
@@ -538,7 +541,6 @@ private static String checkPoints(int firstCodepoint, int newCodePoint, String s
538541
if (firstCodepoint == newCodePoint) {
539542
return str;
540543
}
541-
542544
final int[] newCodePoints = strLen;
543545
int outOffset = 0;
544546
newCodePoints[outOffset++] = newCodePoint;
@@ -745,28 +747,21 @@ public static void registerNestedSchemas(
745747
Map<String, Object> properties,
746748
Map<String, Object> schemas,
747749
Map<String, Object> innerSchemas) {
748-
749750
if (properties == null) return;
750-
751751
for (Map.Entry<String, Object> entry : properties.entrySet()) {
752752
String fieldName = entry.getKey();
753753
Object value = entry.getValue();
754-
755754
if (value instanceof Map) {
756755
@SuppressWarnings("unchecked")
757756
Map<String, Object> fieldDef = (Map<String, Object>) value;
758-
759757
// Проверяем, является ли поле объектом с собственными свойствами
760758
if ("object".equals(getStringValueIfExistOrElseNull("type", fieldDef)) &&
761759
fieldDef.containsKey("properties")) {
762-
763760
// Генерируем уникальное имя класса: Parent + CapitalizedFieldName
764761
String nestedClassName = parentClassName + capitalize(fieldName);
765-
766762
// Если такая схема ещё не зарегистрирована — регистрируем
767763
if (!innerSchemas.containsKey(nestedClassName)) {
768764
Map<String, Object> nestedProps = castObjectToMap(fieldDef.get("properties"));
769-
770765
// Создаём "виртуальную" схему
771766
Map<String, Object> virtualSchema = new LinkedHashMap<>();
772767
virtualSchema.put("type", "object");
@@ -777,9 +772,7 @@ public static void registerNestedSchemas(
777772
if (fieldDef.containsKey("description")) {
778773
virtualSchema.put("description", fieldDef.get("description"));
779774
}
780-
781775
innerSchemas.put(nestedClassName, virtualSchema);
782-
783776
// 🔁 Рекурсивно обрабатываем вложенные объекты внутри этого объекта
784777
registerNestedSchemas(nestedClassName, nestedProps, schemas, innerSchemas);
785778
}

src/test/java/ru/yojo/codegen/generator/ComprehensiveFeatureTest.java

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -227,7 +227,6 @@ void inheritanceAndInterfaces() throws IOException {
227227
// Interface with methods + imports
228228
String iface = readFile("common/InterfaceWithMethods.java");
229229
assertThat(iface)
230-
.contains("import example.testGenerate.common.SomeObjectInnerSchema;")
231230
.contains("void someOne(String someString, SomeObjectInnerSchema schema);")
232231
.contains("SomeObjectInnerSchema anotherOne(String someString, SomeObjectInnerSchema schema);");
233232
}
@@ -873,7 +872,24 @@ void nullableAnnotationOnNonRequiredFields() throws IOException {
873872
}
874873

875874
@Test
876-
@Order(99)
875+
@Order(25)
876+
void shouldContainsGeneratedAnnotation() throws IOException {
877+
// given
878+
generate("test.yaml", "", "example.testGenerate");
879+
880+
// when
881+
String content = readFile("common/CustomSchema.java");
882+
883+
// then
884+
assertThat(content)
885+
.contains("private Long baseField;")
886+
.contains("private String specificField;")
887+
.contains("@Generated(\"Yojo\")")
888+
.contains("import javax.annotation.processing.Generated;");
889+
}
890+
891+
@Test
892+
@Order(26)
877893
void testCreateApplicationV1NestedObjectInAllOf() throws IOException {
878894
generate("test-create-app.yaml", "createApp", "example.testGenerate.createApp");
879895

src/test/java/ru/yojo/codegen/generator/EmailFormatTest.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,17 @@
88
import ru.yojo.codegen.context.YojoContext;
99
import ru.yojo.codegen.domain.lombok.Accessors;
1010
import ru.yojo.codegen.domain.lombok.LombokProperties;
11-
import ru.yojo.codegen.generator.YojoGenerator;
1211

1312
import javax.tools.*;
1413
import java.io.File;
1514
import java.io.IOException;
1615
import java.nio.file.Files;
1716
import java.nio.file.Path;
1817
import java.nio.file.Paths;
19-
import java.util.*;
18+
import java.util.ArrayList;
19+
import java.util.Arrays;
20+
import java.util.Collections;
21+
import java.util.List;
2022
import java.util.stream.Collectors;
2123
import java.util.stream.Stream;
2224

0 commit comments

Comments
 (0)