Skip to content

Commit fe31eeb

Browse files
committed
Fix
1 parent 74478eb commit fe31eeb

5 files changed

Lines changed: 84 additions & 6 deletions

File tree

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package me.zort.sqllib;
2+
3+
import java.lang.invoke.MethodHandles;
4+
import java.lang.invoke.MethodType;
5+
import java.lang.reflect.Constructor;
6+
import java.lang.reflect.Method;
7+
8+
public abstract class JVM {
9+
10+
public abstract Object invokeDefault(Class<?> declaringClass, Object instance, Method method, Object[] args) throws Throwable;
11+
12+
public static JVM getJVM() {
13+
int ver = jvmVer();
14+
if (ver < 8)
15+
throw new UnsupportedOperationException("Unsupported JVM version: " + ver);
16+
else if (ver == 8)
17+
return new JVM8();
18+
else
19+
return new JVM9();
20+
}
21+
22+
private static int jvmVer() {
23+
String version = System.getProperty("java.version");
24+
if(version.startsWith("1.")) {
25+
version = version.substring(2, 3);
26+
} else {
27+
int dot = version.indexOf(".");
28+
if(dot != -1) {
29+
version = version.substring(0, dot);
30+
}
31+
}
32+
return Integer.parseInt(version);
33+
}
34+
35+
36+
static final class JVM8 extends JVM {
37+
@Override
38+
public Object invokeDefault(Class<?> declaringClass, Object instance, Method method, Object[] args) throws Throwable {
39+
Constructor<MethodHandles.Lookup> constructor = MethodHandles.Lookup.class.getDeclaredConstructor(Class.class);
40+
constructor.setAccessible(true);
41+
return constructor.newInstance(declaringClass)
42+
.in(declaringClass)
43+
.unreflectSpecial(method, declaringClass)
44+
.bindTo(instance)
45+
.invokeWithArguments(args);
46+
}
47+
}
48+
49+
static final class JVM9 extends JVM {
50+
@Override
51+
public Object invokeDefault(Class<?> declaringClass, Object instance, Method method, Object[] args) throws Throwable {
52+
MethodHandles.Lookup lookup = MethodHandles.lookup();
53+
return lookup.findSpecial(declaringClass, method.getName(), MethodType.methodType(method.getReturnType(), method.getParameterTypes()), declaringClass)
54+
.bindTo(instance)
55+
.invokeWithArguments(args);
56+
}
57+
}
58+
59+
}

core/src/main/java/me/zort/sqllib/SQLDatabaseConnectionImpl.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,12 @@
2828
import org.jetbrains.annotations.NotNull;
2929
import org.jetbrains.annotations.Nullable;
3030

31+
import java.lang.invoke.MethodHandles;
32+
import java.lang.invoke.MethodType;
3133
import java.lang.reflect.*;
3234
import java.sql.*;
3335
import java.util.*;
36+
import java.util.concurrent.CopyOnWriteArrayList;
3437

3538
/**
3639
* Main database client object implementation.
@@ -157,6 +160,9 @@ public final <T> T createGate(Class<T> mappingInterface) {
157160
Objects.requireNonNull(mappingInterface, "Mapping interface cannot be null!");
158161

159162
StatementMappingStrategy<T> statementMapping = mappingFactory.create(mappingInterface, this);
163+
164+
List<Method> pendingMethods = new CopyOnWriteArrayList<>();
165+
160166
return (T) Proxy.newProxyInstance(mappingInterface.getClassLoader(),
161167
new Class[]{mappingInterface}, (proxy, method, args) -> {
162168

@@ -170,6 +176,11 @@ public final <T> T createGate(Class<T> mappingInterface) {
170176
return mappingResultAdapter.adaptResult(method, result);
171177
}
172178

179+
// Default methods are invoked normally.
180+
if (declaringClass.isInterface() && method.isDefault()) {
181+
return JVM.getJVM().invokeDefault(declaringClass, proxy, method, args);
182+
}
183+
173184
throw new UnsupportedOperationException("Method " + method.getName() + " is not supported by this mapping repository!");
174185
});
175186
}

core/src/main/java/me/zort/sqllib/internal/query/InsertQuery.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,8 @@ public QueryDetails buildQueryDetails() {
8585
details.append(" VALUES ");
8686
insertArray(details, values, true);
8787

88+
details.append(buildInnerQuery());
89+
8890
return details;
8991
}
9092

core/src/main/java/me/zort/sqllib/internal/query/UpsertQuery.java

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -54,11 +54,6 @@ public QueryDetails buildQueryDetails() {
5454
return stmt;
5555
}
5656

57-
@Override
58-
public String buildQuery() {
59-
return super.buildQuery();
60-
}
61-
6257
@Override
6358
public UpsertQuery then(String part) {
6459
return (UpsertQuery) super.then(part);

src/test/java/me/zort/sqllib/test/TestCase2.java

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import me.zort.sqllib.api.data.QueryResult;
99
import me.zort.sqllib.api.data.QueryRowsResult;
1010
import me.zort.sqllib.api.data.Row;
11+
import me.zort.sqllib.internal.annotation.PrimaryKey;
1112
import me.zort.sqllib.mapping.annotation.*;
1213
import org.junit.jupiter.api.*;
1314
import org.junit.jupiter.api.condition.EnabledOnOs;
@@ -51,12 +52,16 @@ public void prepare() {
5152
@Test
5253
public void test1_Mapping() {
5354
DatabaseRepository repository = connection.createGate(DatabaseRepository.class);
54-
assertNull(repository.save(new User("User1", 1000)).getRejectMessage());
55+
56+
User user1 = new User("User1", 1000);
57+
58+
assertNull(repository.save(user1).getRejectMessage());
5559
assertTrue(repository.selectOne("User1").isPresent());
5660
assertNull(repository.insertNew("User4", 800).getRejectMessage());
5761
assertTrue(repository.selectOne("User4").isPresent());
5862
assertFalse(repository.selectAll().isEmpty());
5963
assertNotEquals(0L, repository.count().get(0).get("COUNT(*)"));
64+
assertTrue(repository.saveUser(user1));
6065

6166
assertNull(repository.deleteAll().getRejectMessage());
6267
assertTrue(repository.selectAll().isEmpty());
@@ -93,10 +98,16 @@ public interface DatabaseRepository {
9398

9499
@Query("SELECT COUNT(*) FROM users;")
95100
QueryRowsResult<Row> count();
101+
102+
default boolean saveUser(User user) {
103+
System.out.println("Saving user...");
104+
return save(user).isSuccessful();
105+
}
96106
}
97107

98108
@AllArgsConstructor
99109
private static class User {
110+
@PrimaryKey
100111
private final String nickname;
101112
private final int points;
102113

0 commit comments

Comments
 (0)