Skip to content

Commit 410c403

Browse files
committed
MySQL annotations now in beta. Functional state
1 parent b89b23b commit 410c403

File tree

12 files changed

+411
-252
lines changed

12 files changed

+411
-252
lines changed

.idea/sqldialects.xml

Lines changed: 6 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

core/build.gradle

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,15 @@ dependencies {
1111
testCompile group: 'junit', name: 'junit', version: '4.13.1'
1212

1313
implementation ('com.google.code.gson:gson:2.8.6')
14-
// compile group: 'mysql', name: 'mysql-connector-java', version: '8.0.17'
14+
1515
api 'com.zaxxer:HikariCP:3.4.5'
16-
implementation 'org.mariadb.jdbc:mariadb-java-client:2.7.0'
17-
api "co.aikar:idb-core:1.0.0-SNAPSHOT"
18-
api 'com.github.Fernthedev:java-api-for-mysql:1.4.2' // For MySQL annotations
16+
// compile group: 'mysql', name: 'mysql-connector-java', version: '8.0.17'
17+
implementation 'org.mariadb.jdbc:mariadb-java-client:2.7.1'
18+
19+
// api "co.aikar:idb-core:1.0.0-SNAPSHOT"
20+
api 'com.github.Fernthedev:db:292c0bb'
21+
api 'com.github.Fernthedev:java-api-for-mysql:4c51dbe' // For MySQL annotations
22+
1923

2024
api 'com.github.Fernthedev:fern-configmanager:1.3.0' // Check github releases tag for the version.
2125

core/src/main/java/com/github/fernthedev/fernapi/universal/Universal.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -128,9 +128,9 @@ protected static void checkNull() {
128128

129129

130130

131-
public static void debug(String message) {
131+
public static void debug(String message, Object... params) {
132132
if(debug) {
133-
getMethods().getAbstractLogger().info("[DEBUG] " + message);
133+
getMethods().getAbstractLogger().info("[DEBUG] " + message, params);
134134
}
135135
}
136136

core/src/main/java/com/github/fernthedev/fernapi/universal/data/database/ColumnData.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import org.panteleyev.mysqlapi.annotations.Column;
66
import org.panteleyev.mysqlapi.annotations.PrimaryKey;
77

8+
import javax.annotation.Nullable;
89
import java.io.Serializable;
910
import java.lang.reflect.Field;
1011

@@ -27,6 +28,7 @@ public class ColumnData implements Serializable {
2728
* Will return null if it is SQL NULL
2829
*/
2930
@Getter
31+
@Nullable
3032
private final String value;
3133

3234
@Getter

core/src/main/java/com/github/fernthedev/fernapi/universal/data/database/RowData.java

Lines changed: 99 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,15 @@
22

33
import co.aikar.idb.DbRow;
44
import com.google.errorprone.annotations.Immutable;
5+
import com.google.errorprone.annotations.OverridingMethodsMustInvokeSuper;
56
import lombok.ToString;
7+
import org.panteleyev.mysqlapi.MySqlProxy;
68
import org.panteleyev.mysqlapi.annotations.Column;
79
import org.panteleyev.mysqlapi.annotations.PrimaryKey;
810

911
import java.lang.reflect.Field;
1012
import java.util.Arrays;
11-
import java.util.HashMap;
13+
import java.util.LinkedHashMap;
1214
import java.util.Map;
1315

1416
/**
@@ -19,43 +21,82 @@
1921
@Immutable
2022
public abstract class RowData {
2123

22-
private final Map<Field, ColumnData> cachedData = new HashMap<>();
23-
private final Map<String, ColumnData> cachedDataStr = new HashMap<>();
24+
private static final MySqlProxy mySqlProxy = new MySqlProxy();
2425

25-
public RowData(DbRow rowData) {
26+
private boolean initiated = false;
27+
28+
protected final RowData instance;
29+
30+
private final Map<Field, ColumnData> cachedData = new LinkedHashMap<>();
31+
private final Map<String, ColumnData> cachedDataStr = new LinkedHashMap<>();
32+
33+
public RowData() {
2634
validateKeys(getClass());
35+
instance = this;
36+
}
2737

28-
Arrays.stream(getClass().getDeclaredFields())
29-
.filter(field -> field.isAnnotationPresent(Column.class))
30-
.forEach(field -> {
31-
ColumnData columnData;
32-
try {
33-
Column column = field.getAnnotation(Column.class);
34-
columnData = ColumnData.fromField(field, rowData.get(column.value()).toString());
35-
addField(field, columnData);
36-
} catch (IllegalAccessException e) {
37-
e.printStackTrace();
38+
/**
39+
* Must set initiated to true to avoid problems when overriden.
40+
* @param rowData
41+
*/
42+
@OverridingMethodsMustInvokeSuper
43+
protected void initiateRowData(DbRow rowData) {
44+
if (initiated)
45+
throw new IllegalStateException("Already initiated row data and is immutable.");
46+
47+
initiated = true;
48+
49+
50+
for (Field field : getClass().getDeclaredFields()) {
51+
if (field.isAnnotationPresent(Column.class)) {
52+
ColumnData columnData;
53+
try {
54+
Column column = field.getAnnotation(Column.class);
55+
columnData = ColumnData.fromField(field, rowData.get(column.value()).toString());
56+
addField(field, columnData, rowData.get(columnData.getColumnName()));
57+
} catch (IllegalAccessException e) {
58+
e.printStackTrace();
59+
}
3860
}
39-
});
61+
}
62+
}
63+
64+
protected void initiateRowData() {
65+
if (initiated)
66+
throw new IllegalStateException("Already initiated row data and is immutable.");
67+
68+
initiated = true;
69+
for (Field field : getClass().getDeclaredFields()) {
70+
if (field.isAnnotationPresent(Column.class)) {
71+
ColumnData columnData;
72+
try {
73+
field.setAccessible(true);
74+
columnData = ColumnData.fromField(field, field.get(instance).toString());
75+
addField(field, columnData);
76+
} catch (IllegalAccessException e) {
77+
e.printStackTrace();
78+
}
79+
}
80+
}
4081
}
4182

4283
public static <T> void validateKeys(Class<T> rowData) {
4384

44-
boolean anyColumns = Arrays.stream(rowData.getFields()).anyMatch(field -> field.isAnnotationPresent(Column.class));
85+
boolean anyColumns = Arrays.stream(rowData.getDeclaredFields()).anyMatch(field -> field.isAnnotationPresent(Column.class));
4586

4687
if (!anyColumns)
47-
throw new IllegalStateException("No fields have @" + Column.class.toString() + " annotation");
88+
throw new IllegalStateException("No fields have @" + Column.class.getName() + " annotation");
4889

4990

50-
boolean primaryKey = Arrays.stream(rowData.getFields()).anyMatch(field -> field.isAnnotationPresent(PrimaryKey.class));
91+
boolean primaryKey = Arrays.stream(rowData.getDeclaredFields()).anyMatch(field -> field.isAnnotationPresent(PrimaryKey.class));
5192

5293
if (!primaryKey)
53-
throw new IllegalStateException("No fields have @" + PrimaryKey.class.toString() + " annotation");
94+
throw new IllegalStateException("No fields have @" + PrimaryKey.class.getName() + " annotation");
5495

55-
boolean multiplePrimaryKeys = Arrays.stream(rowData.getFields()).filter(field -> field.isAnnotationPresent(PrimaryKey.class)).count() > 1;
96+
boolean multiplePrimaryKeys = Arrays.stream(rowData.getDeclaredFields()).filter(field -> field.isAnnotationPresent(PrimaryKey.class)).count() > 1;
5697

5798
if (multiplePrimaryKeys)
58-
throw new IllegalStateException("Too many fields have @" + PrimaryKey.class.toString() + " annotation");
99+
throw new IllegalStateException("Too many fields have @" + PrimaryKey.class.getName() + " annotation");
59100

60101
}
61102

@@ -64,20 +105,55 @@ private void addField(Field field, ColumnData columnData) {
64105
cachedDataStr.put(field.getAnnotation(Column.class).value(), columnData);
65106
}
66107

108+
private void addField(Field field, ColumnData columnData, Object value) {
109+
cachedData.put(field, columnData);
110+
cachedDataStr.put(field.getAnnotation(Column.class).value(), columnData);
111+
112+
try {
113+
Object val = mySqlProxy.getFieldValue(field.getType(), value);
114+
115+
field.setAccessible(true);
116+
117+
field.set(this, val);
118+
} catch (IllegalAccessException e) {
119+
e.printStackTrace();
120+
}
121+
}
122+
67123

68124
public ColumnData getColumn(String sqlName) {
125+
if (!initiated)
126+
initiateRowData();
127+
69128
return cachedDataStr.get(sqlName);
70129
}
71130

72131
public ColumnData getColumn(Field field) {
132+
if (!initiated)
133+
initiateRowData();
134+
73135
return cachedData.get(field);
74136
}
75137

76138
/**
77139
* Immutable
78140
* @return
79141
*/
80-
public Map<String, ColumnData> getDataCopy() {
81-
return new HashMap<>(cachedDataStr);
142+
public Map<String, ColumnData> getDataStrCopy() {
143+
if (!initiated)
144+
initiateRowData();
145+
146+
return new LinkedHashMap<>(cachedDataStr);
147+
}
148+
149+
/**
150+
* Immutable
151+
* @return
152+
*/
153+
public Map<Field, ColumnData> getDataCopy() {
154+
if (!initiated)
155+
initiateRowData();
156+
157+
return new LinkedHashMap<>(cachedData);
82158
}
83159
}
Lines changed: 34 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,43 +1,49 @@
11
package com.github.fernthedev.fernapi.universal.data.database;
22

33
import lombok.Getter;
4+
import lombok.Synchronized;
45
import org.panteleyev.mysqlapi.annotations.Column;
56
import org.panteleyev.mysqlapi.annotations.PrimaryKey;
67

78
import java.lang.reflect.Field;
8-
import java.util.Arrays;
9-
import java.util.HashMap;
9+
import java.util.LinkedHashMap;
1010
import java.util.Map;
1111

1212
public class RowDataTemplate<T extends RowData> {
1313

14-
private final Map<Field, ColumnData> cachedData = new HashMap<>();
15-
private final Map<String, ColumnData> cachedDataStr = new HashMap<>();
14+
private final Map<Field, ColumnData> cachedData = new LinkedHashMap<>();
15+
private final Map<String, ColumnData> cachedDataStr = new LinkedHashMap<>();
1616

1717
@Getter
1818
private Field primaryKeyField;
1919

2020
public RowDataTemplate(Class<T> rowData) {
2121
RowData.validateKeys(rowData);
2222

23-
Arrays.stream(getClass().getDeclaredFields())
24-
.filter(field -> field.isAnnotationPresent(Column.class))
25-
.forEach(field -> {
26-
ColumnData columnData;
27-
try {
23+
Field[] declaredFields = rowData.getDeclaredFields();
2824

29-
columnData = ColumnData.fromField(field, null);
30-
addField(field, columnData);
25+
for (Field field : declaredFields) {
26+
if (!field.isAnnotationPresent(Column.class)) {
27+
continue;
28+
}
3129

32-
if (field.isAnnotationPresent(PrimaryKey.class))
33-
primaryKeyField = field;
30+
ColumnData columnData;
31+
try {
32+
33+
columnData = ColumnData.fromField(field, null);
34+
addField(field, columnData);
35+
36+
if (field.isAnnotationPresent(PrimaryKey.class))
37+
primaryKeyField = field;
38+
39+
} catch (IllegalAccessException e) {
40+
e.printStackTrace();
41+
}
42+
}
3443

35-
} catch (IllegalAccessException e) {
36-
e.printStackTrace();
37-
}
38-
});
3944
}
4045

46+
@Synchronized
4147
private void addField(Field field, ColumnData columnData) {
4248
cachedData.put(field, columnData);
4349
cachedDataStr.put(field.getAnnotation(Column.class).value(), columnData);
@@ -52,14 +58,22 @@ public ColumnData getColumn(String sqlName) {
5258
}
5359

5460
public ColumnData getColumn(Field field) {
55-
return cachedData.get(field);
61+
return cachedData.get(field);
62+
}
63+
64+
/**
65+
* Immutable
66+
* @return
67+
*/
68+
public Map<String, ColumnData> getDataStrCopy() {
69+
return new LinkedHashMap<>(cachedDataStr);
5670
}
5771

5872
/**
5973
* Immutable
6074
* @return
6175
*/
62-
public Map<String, ColumnData> getDataCopy() {
63-
return new HashMap<>(cachedDataStr);
76+
public Map<Field, ColumnData> getDataCopy() {
77+
return new LinkedHashMap<>(cachedData);
6478
}
6579
}

0 commit comments

Comments
 (0)