docs(06-annotations): Добавлено задание в README

This commit is contained in:
Mark Zheleznyakov
2024-11-08 00:31:35 +03:00
parent afef99cc0b
commit 12a30b0e80
16 changed files with 647 additions and 0 deletions

View File

@ -0,0 +1,43 @@
/*
* This file was generated by the Gradle 'init' task.
*
* This generated file contains a sample Java application project to get you started.
* For more details on building Java & JVM projects, please refer to https://docs.gradle.org/8.10.2/userguide/building_java_projects.html in the Gradle documentation.
*/
plugins {
// Apply the application plugin to add support for building a CLI application in Java.
application
}
repositories {
// Use Maven Central for resolving dependencies.
mavenCentral()
}
dependencies {
// This dependency is used by the application.
implementation(libs.guava)
}
// Apply a specific Java toolchain to ease working on different environments.
java {
toolchain {
languageVersion = JavaLanguageVersion.of(23)
}
}
application {
// Define the main class for the application.
mainClass = "ru.mrqiz.annotations.App"
}
tasks.named<Test>("test") {
// Use JUnit Platform for unit tests.
useJUnitPlatform()
}
tasks.named<JavaExec>("run") {
standardInput = System.`in`
}

View File

@ -0,0 +1,10 @@
package ru.mrqiz.annotations;
public class App {
public static void main(String[] args) {
Data dataToSave = new Data(10, 20, 30, 40, 50);
SaveData saveData = new SaveData("/tmp/data.json", "/tmp/save.log");
saveData.save(dataToSave);
}
}

View File

@ -0,0 +1,52 @@
package ru.mrqiz.annotations;
public class Data {
@Ok
private Integer field1;
@Ok
private Integer field2;
@Ugly(k = 10)
private Integer field3;
@Ugly
private Integer field4;
private Integer field5;
public Data(
Integer field1,
Integer field2,
Integer field3,
Integer field4,
Integer field5
) {
this.field1 = field1;
this.field2 = field2;
this.field3 = field3;
this.field4 = field4;
this.field5 = field5;
}
public Integer getField1() {
return field1;
}
public Integer getField2() {
return field2;
}
public Integer getField3() {
return field3;
}
public Integer getField4() {
return field4;
}
public Integer getField5() {
return field5;
}
}

View File

@ -0,0 +1,12 @@
package ru.mrqiz.annotations;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.annotation.ElementType;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface Ok {
}

View File

@ -0,0 +1,80 @@
package ru.mrqiz.annotations;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.lang.reflect.Field;
import java.util.Random;
import java.util.logging.Logger;
import java.io.IOException;
import java.util.logging.FileHandler;
import java.util.logging.Logger;
import java.util.logging.SimpleFormatter;
public class SaveData {
private static final Logger logger = Logger.getLogger(SaveData.class.getName());
private String logFileName;
private String dataFileName;
public SaveData(String dataFileName, String logFileName) {
this.logFileName = logFileName;
this.dataFileName = dataFileName;
setupLogger();
}
private void setupLogger() {
try {
FileHandler fileHandler = new FileHandler(logFileName, true);
fileHandler.setFormatter(new SimpleFormatter());
logger.addHandler(fileHandler);
} catch (IOException e) {
e.printStackTrace();
}
}
public void save(Data data) {
StringBuilder jsonBuilder = new StringBuilder();
jsonBuilder.append("{\n");
boolean hasOkFields = false;
Field[] fields = data.getClass().getDeclaredFields();
Random random = new Random();
for (Field field : fields) {
field.setAccessible(true);
try {
if (field.isAnnotationPresent(Ok.class)) {
hasOkFields = true;
jsonBuilder.append(String.format(" \"%s\": \"%d\",\n", field.getName(), field.get(data)));
} else if (field.isAnnotationPresent(Ugly.class)) {
hasOkFields = true;
Ugly uglyAnnotation = field.getAnnotation(Ugly.class);
int k = uglyAnnotation.k();
int randomValue = random.nextInt(2 * k + 1) - k;
jsonBuilder.append(String.format(" \"%s\": \"%d\",\n", field.getName(), randomValue));
} else {
logger.warning("cant find annotations at '" + field.getName() + "', not writing in file.");
}
} catch (IllegalAccessException e) {
logger.severe("unable to get access to field: " + e.getMessage());
}
}
if (hasOkFields) {
jsonBuilder.setLength(jsonBuilder.length() - 2);
jsonBuilder.append("\n}");
writeToFile(jsonBuilder.toString());
}
}
private void writeToFile(String json) {
try (BufferedWriter writer = new BufferedWriter(new FileWriter(dataFileName))) {
writer.write(json);
} catch (IOException e) {
logger.severe("unable to read to file: " + e.getMessage());
}
}
}

View File

@ -0,0 +1,13 @@
package ru.mrqiz.annotations;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.annotation.ElementType;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface Ugly {
int k() default 5;
}