diff --git a/scores.csv b/scores.csv index e8a4626192fea7d0d8de3ef6eacf5bf98eb06ec1..4bbb66933a226fe56766be5e2ab183387510ed97 100644 --- a/scores.csv +++ b/scores.csv @@ -4,3 +4,4 @@ AppArchitect;88;MEDIUM DataDynamo;186;EASY AppArchitect;88;MEDIUM CodeConductor;273;MEDIUM +AppArchitect;88000;HARD diff --git a/src/main/java/lab/MyEdit.java b/src/main/java/lab/MyEdit.java new file mode 100644 index 0000000000000000000000000000000000000000..07b46a578c37fea172e98f2dcb3e3d94c6d08755 --- /dev/null +++ b/src/main/java/lab/MyEdit.java @@ -0,0 +1,13 @@ +package lab; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.FIELD) +public @interface MyEdit { + public boolean readOnly() default false; + public boolean visible() default true; +} diff --git a/src/main/java/lab/data/Score.java b/src/main/java/lab/data/Score.java index 2be798381f3f0f0634acc64df29fa574b38e4ee7..4b91d6c3c15eda0a9764d770936fd24cd753c457 100644 --- a/src/main/java/lab/data/Score.java +++ b/src/main/java/lab/data/Score.java @@ -8,6 +8,7 @@ import jakarta.persistence.Enumerated; import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; +import lab.MyEdit; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.EqualsAndHashCode; @@ -30,12 +31,21 @@ public class Score { @Id @GeneratedValue(strategy = GenerationType.AUTO) + @MyEdit(visible = false) private Long id; + @MyEdit(readOnly = true) private String name; + @MyEdit private int points; @Enumerated(EnumType.STRING) + @MyEdit private Level level; + + public String getVirtual(){ + return "aaaa"; + } + public static Score generate() { return new Score(null, getRandomNick(), RANDOM.nextInt(50, 300), Level.values()[RANDOM.nextInt(Level.values().length)]); diff --git a/src/main/java/lab/gui/EditController.java b/src/main/java/lab/gui/EditController.java index 701243e1d1559a564a9b15e0890eb6f4dc78380f..1a32160a88b0885fced263b9b564f79cc7e2a418 100644 --- a/src/main/java/lab/gui/EditController.java +++ b/src/main/java/lab/gui/EditController.java @@ -1,7 +1,14 @@ package lab.gui; +import java.beans.BeanInfo; +import java.beans.IntrospectionException; +import java.beans.Introspector; +import java.beans.PropertyDescriptor; +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; import java.util.HashMap; import java.util.Map; +import java.util.ResourceBundle; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -14,6 +21,7 @@ import javafx.scene.control.Label; import javafx.scene.control.TextField; import javafx.scene.layout.GridPane; import javafx.stage.Stage; +import lab.MyEdit; import lab.data.Score; import lombok.Setter; @@ -50,7 +58,51 @@ public class EditController { @FXML void btnOkAction(ActionEvent event) { - //TODO: add code to read values from text fields + try { + BeanInfo beanInfo = Introspector.getBeanInfo(data.getClass()); + for (PropertyDescriptor propertyDescriptor : beanInfo.getPropertyDescriptors()) { + try { + String name = propertyDescriptor.getName(); + Field field = data.getClass().getDeclaredField(name); + MyEdit myEdit = field.getAnnotation(MyEdit.class); + if(myEdit == null || !myEdit.visible() || myEdit.readOnly()) { + continue; + } + TextField textField = nameToTextField.get(name); + String stringValue = textField.getText(); + Object value = null; + if (propertyDescriptor.getPropertyType() == String.class) { + value = stringValue; + } else if (stringValue == null || stringValue.isBlank()) { + value = null; + } else if (propertyDescriptor.getPropertyType() == Integer.class + || propertyDescriptor.getPropertyType() == int.class) { + value = Integer.parseInt(stringValue); + } else if (propertyDescriptor.getPropertyType() == Long.class + || propertyDescriptor.getPropertyType() == long.class) { + value = Long.parseLong(stringValue); + } else if (propertyDescriptor.getPropertyType() == Double.class + || propertyDescriptor.getPropertyType() == double.class) { + value = Double.parseDouble(stringValue); + } else if (propertyDescriptor.getPropertyType().isEnum()) { + for (Object enumConstant : propertyDescriptor.getPropertyType().getEnumConstants()) { + if (enumConstant.toString().equalsIgnoreCase(stringValue)) { + value = enumConstant; + break; + } + } + } + if (propertyDescriptor.getWriteMethod() != null) { + propertyDescriptor.getWriteMethod().invoke(data, value); + } + } catch (NoSuchFieldException e) { + log.warn("property {} has no field", propertyDescriptor.getName()); + } + } + } catch (IntrospectionException | IllegalAccessException | InvocationTargetException e) { + log.error(e); + } + mainScreenController.updateData((Score)data); stage.hide(); @@ -71,7 +123,32 @@ public class EditController { log.info("data set {}", data); content.getChildren().clear(); - //TODO: code to detect properties and add rows to dialog + ResourceBundle msg = ResourceBundle.getBundle("msg"); + try { + BeanInfo beanInfo = Introspector.getBeanInfo(data.getClass()); + int row = 0; + for (PropertyDescriptor propertyDescriptor : beanInfo.getPropertyDescriptors()) { + try { + Field field = data.getClass().getDeclaredField(propertyDescriptor.getName()); + MyEdit myEdit = field.getAnnotation(MyEdit.class); + if (myEdit == null) { + continue; + } + if (!myEdit.visible()) { + continue; + } + String name = propertyDescriptor.getName(); + Object value = propertyDescriptor.getReadMethod().invoke(data); + String localizedName = msg.getString(String.format("%s.%s", data.getClass().getSimpleName(), field.getName())); + addDialogRow(row, name, localizedName, value != null ? value.toString() : "", !myEdit.readOnly()); + row++; + } catch (NoSuchFieldException e) { + log.warn("property '{}' has no field in class '{}'", propertyDescriptor.getName(), data.getClass().getCanonicalName()); + } + } + } catch (IntrospectionException | InvocationTargetException | IllegalAccessException e) { + log.error(e); + } } private void addDialogRow(int rowNumber, String name, String descriptionName, String stringValue, diff --git a/src/main/resources/msg.properties b/src/main/resources/msg.properties new file mode 100644 index 0000000000000000000000000000000000000000..d0655f9afcee79b8fb8c5a4087d2d2b38292a47d --- /dev/null +++ b/src/main/resources/msg.properties @@ -0,0 +1,5 @@ + +Score.id = id +Score.level = level +Score.name = name +Score.points = points diff --git a/src/main/resources/msg_cs.properties b/src/main/resources/msg_cs.properties new file mode 100644 index 0000000000000000000000000000000000000000..e397613b223ead974bf36a1be69512c88c897149 --- /dev/null +++ b/src/main/resources/msg_cs.properties @@ -0,0 +1,5 @@ + +Score.id = Jednozna\u010Dn\u00FD identifik\u00E1tor +Score.level = Obt\u00ED\u017Enost +Score.name = Jm\u00E9no +Score.points = Body diff --git a/src/main/resources/msg_cs_CZ.properties b/src/main/resources/msg_cs_CZ.properties new file mode 100644 index 0000000000000000000000000000000000000000..73f926b653417019db394ae6ac1b0e5a9d5a56ae --- /dev/null +++ b/src/main/resources/msg_cs_CZ.properties @@ -0,0 +1,4 @@ +#Generated by ResourceBundle Editor (http://essiembre.github.io/eclipse-rbe/) + +Score.id = Jedine\u010Dn\u00FD identifik\u00E1tor +Score.name = N\u00E1zev diff --git a/src/main/resources/msg_en.properties b/src/main/resources/msg_en.properties new file mode 100644 index 0000000000000000000000000000000000000000..83da6ab577a70580f3495e7d495641b54b61e490 --- /dev/null +++ b/src/main/resources/msg_en.properties @@ -0,0 +1,6 @@ +#Generated by ResourceBundle Editor (http://essiembre.github.io/eclipse-rbe/) + +Score.id = Unique identificator +Score.level = Level +Score.name = Name +Score.points = Points