Skip to content

Commit 9238014

Browse files
committed
Added auto auto-increment for integer and long id fields,
Made either updatedAt and createdAt optional for @dates, Modified toSnakeCase conversion to properly support multiple uppercase characters in a sequence, Added dependency injection for Models and Observers, Added a method to register models by package
1 parent 162e988 commit 9238014

File tree

8 files changed

+71
-5
lines changed

8 files changed

+71
-5
lines changed

pom.xml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,13 @@
88
<artifactId>ORM</artifactId>
99
<version>1.0-SNAPSHOT</version>
1010

11+
<repositories>
12+
<repository>
13+
<id>javawebstack</id>
14+
<url>https://repo.javawebstack.org</url>
15+
</repository>
16+
</repositories>
17+
1118
<build>
1219
<plugins>
1320
<plugin>
@@ -46,6 +53,11 @@
4653
<artifactId>reflections</artifactId>
4754
<version>0.9.12</version>
4855
</dependency>
56+
<dependency>
57+
<groupId>org.javawebstack</groupId>
58+
<artifactId>Injector</artifactId>
59+
<version>1.0-SNAPSHOT</version>
60+
</dependency>
4961
</dependencies>
5062

5163
<distributionManagement>

src/main/java/org/javawebstack/orm/ORM.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import org.javawebstack.orm.exception.ORMConfigurationException;
44
import org.javawebstack.orm.migration.AutoMigrator;
55
import org.javawebstack.orm.wrapper.SQL;
6+
import org.reflections.Reflections;
67

78
import java.util.ArrayList;
89
import java.util.HashMap;
@@ -30,6 +31,15 @@ public static <T extends Model> Repo<T> register(Class<T> model, SQL sql) throws
3031
return register(model, sql, new ORMConfig());
3132
}
3233

34+
public void register(Package p, SQL sql, ORMConfig config) throws ORMConfigurationException {
35+
for(Class<? extends Model> model : new Reflections(p.getName()).getSubTypesOf(Model.class))
36+
ORM.register(model, sql, config);
37+
}
38+
39+
public void register(Package p, SQL sql) throws ORMConfigurationException {
40+
register(p, sql, new ORMConfig());
41+
}
42+
3343
public static void unregister(Class<? extends Model> model){
3444
repositories.remove(model);
3545
}

src/main/java/org/javawebstack/orm/ORMConfig.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package org.javawebstack.orm;
22

3+
import org.javawebstack.injector.Injector;
34
import org.javawebstack.orm.mapper.DefaultMapper;
45
import org.javawebstack.orm.mapper.TypeMapper;
56

@@ -11,7 +12,10 @@ public class ORMConfig {
1112
private boolean camelToSnakeCase = true;
1213
private int defaultSize = 0;
1314
private boolean idPrimaryKey = true;
15+
private boolean idAutoIncrement = true;
1416
private final List<TypeMapper> typeMappers = new ArrayList<>();
17+
private Injector injector;
18+
1519
public ORMConfig(){
1620
typeMappers.add(new DefaultMapper());
1721
}
@@ -35,6 +39,14 @@ public ORMConfig setIdPrimaryKey(boolean idPrimaryKey){
3539
this.idPrimaryKey = idPrimaryKey;
3640
return this;
3741
}
42+
public ORMConfig setIdAutoIncrement(boolean idAutoIncrement){
43+
this.idAutoIncrement = idAutoIncrement;
44+
return this;
45+
}
46+
public ORMConfig setInjector(Injector injector){
47+
this.injector = injector;
48+
return this;
49+
}
3850
public boolean isCamelToSnakeCase() {
3951
return camelToSnakeCase;
4052
}
@@ -50,6 +62,14 @@ public List<TypeMapper> getTypeMappers(){
5062
public boolean isIdPrimaryKey() {
5163
return idPrimaryKey;
5264
}
65+
public boolean isIdAutoIncrement(){
66+
return idAutoIncrement;
67+
}
68+
69+
public Injector getInjector() {
70+
return injector;
71+
}
72+
5373
public TypeMapper getTypeMapper(Class<?> type, int size){
5474
for(TypeMapper mapper : getTypeMappers()){
5575
SQLType sqlType = mapper.getType(type, size);

src/main/java/org/javawebstack/orm/Repo.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,8 @@ public void save(T entry){
5050
}
5151

5252
public void create(T entry){
53+
if(info.getConfig().getInjector() != null)
54+
info.getConfig().getInjector().inject(entry);
5355
observers.forEach(o -> o.saving(entry));
5456
observers.forEach(o -> o.creating(entry));
5557
executeCreate(entry);
@@ -61,8 +63,10 @@ private void executeCreate(T entry){
6163
try {
6264
if(info.hasDates()){
6365
Timestamp now = Timestamp.from(Instant.now());
64-
info.getField(info.getCreatedField()).set(entry, now);
65-
info.getField(info.getUpdatedField()).set(entry, now);
66+
if(info.hasCreated())
67+
info.getField(info.getCreatedField()).set(entry, now);
68+
if(info.hasUpdated())
69+
info.getField(info.getUpdatedField()).set(entry, now);
6670
}
6771
List<Object> params = new ArrayList<>();
6872
StringBuilder sb = new StringBuilder("INSERT INTO `");
@@ -171,6 +175,8 @@ private Object getId(T entry){
171175
}
172176

173177
public Repo<T> observe(Observer<T> observer){
178+
if(info.getConfig().getInjector() != null)
179+
info.getConfig().getInjector().inject(observer);
174180
observers.add(observer);
175181
return this;
176182
}

src/main/java/org/javawebstack/orm/SQLMapper.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package org.javawebstack.orm;
22

3+
import org.javawebstack.injector.Injector;
34
import org.javawebstack.orm.exception.ORMQueryException;
45
import org.javawebstack.orm.mapper.TypeMapper;
56

@@ -26,9 +27,14 @@ public static <T extends Model> List<T> map(Repo<T> repo, ResultSet rs, List<Cla
2627
try {
2728
while (rs.next()){
2829
T t = (T) repo.getInfo().getModelConstructor().newInstance();
30+
Injector injector = repo.getInfo().getConfig().getInjector();
31+
if(injector != null)
32+
injector.inject(t);
2933
for(Class<? extends Model> model : joinedModels){
3034
Repo<Model> r = Repo.get((Class<Model>) model);
3135
Model o = (Model) r.getInfo().getModelConstructor().newInstance();
36+
if(injector != null)
37+
injector.inject(o);
3238
t.internalAddJoinedModel(model, mapBack(r, rs, o));
3339
}
3440
list.add(mapBack(repo, rs, t));

src/main/java/org/javawebstack/orm/TableInfo.java

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,8 +118,19 @@ public boolean hasDates(){
118118
return dates != null;
119119
}
120120

121+
public boolean hasCreated(){
122+
return hasDates() && getFields().contains(getCreatedField());
123+
}
124+
125+
public boolean hasUpdated(){
126+
return hasDates() && getFields().contains(getUpdatedField());
127+
}
128+
121129
public boolean isAutoIncrement(){
122-
return fieldConfigs.get(idField).ai();
130+
return (
131+
getField(getIdField()).getType().equals(Integer.class) ||
132+
getField(getIdField()).getType().equals(Long.class)
133+
) && (fieldConfigs.get(idField).ai() || config.isIdAutoIncrement());
123134
}
124135

125136
public String getSoftDeleteField(){

src/main/java/org/javawebstack/orm/query/Query.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -259,7 +259,7 @@ public void update(T entity){
259259
}
260260

261261
public void update(Map<String, Object> values){
262-
if(repo.getInfo().hasDates())
262+
if(repo.getInfo().hasUpdated())
263263
values.put(repo.getInfo().getColumnName(repo.getInfo().getUpdatedField()), Timestamp.from(Instant.now()));
264264
List<Object> parameters = new ArrayList<>();
265265
List<String> sets = new ArrayList<>();

src/main/java/org/javawebstack/orm/util/Helper.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@ public static String toSnakeCase(String source){
77
sb.append(Character.toLowerCase(source.charAt(0)));
88
for(int i=1; i<source.length(); i++){
99
if(Character.isUpperCase(source.charAt(i))){
10-
sb.append("_");
10+
if(!Character.isUpperCase(source.charAt(i-1)))
11+
sb.append("_");
1112
sb.append(Character.toLowerCase(source.charAt(i)));
1213
}else{
1314
sb.append(source.charAt(i));

0 commit comments

Comments
 (0)