Skip to content

Commit

Permalink
HBX-2390: Create a JBoss Tools adaptation layer in Hibernate Tools
Browse files Browse the repository at this point in the history
  - Add new test case 'org.hibernate.tool.orm.jbt.wrp.QueryWrapperFactoryTest#testSetParameterList()' (and reorganize test class)
  - Add new default interface method 'org.hibernate.tool.orm.jbt.wrp.QueryWrapperFactory.QueryWrapper#setParameterList(String,List,Object)'
  - Override interface method 'org.hibernate.tool.orm.jbt.wrp.QueryWrapperFactory.QueryWrapper#getWrappedObject()'

Signed-off-by: Koen Aers <[email protected]>
  • Loading branch information
koentsje committed Jun 26, 2023
1 parent 29ab0df commit 40bf60c
Show file tree
Hide file tree
Showing 2 changed files with 51 additions and 13 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.List;

import org.hibernate.query.Query;
import org.hibernate.query.spi.QueryImplementor;
Expand All @@ -17,7 +18,10 @@ public static QueryWrapper<?> createQueryWrapper(Query<?> query) {
}

static interface QueryWrapper<T> extends QueryImplementor<T>, Wrapper {

@Override default Query<?> getWrappedObject() { return (Query<?>)this; }
default void setParameterList(String name, List<Object> list, Object anything) {
getWrappedObject().setParameterList(name, list);
}
}

private static class QueryWrapperInvocationHandler implements InvocationHandler {
Expand All @@ -30,8 +34,20 @@ private QueryWrapperInvocationHandler(Query<?> q) {

@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if (isSetParamterListMethod(method, args)) {
return query.setParameterList((String)args[0], (List<?>)args[1]);
} else if (method.getName().equals("getWrappedObject") && (args == null || args.length == 0)) {
return query;
}
return method.invoke(query, args);
}

private boolean isSetParamterListMethod(Method m, Object[] args) {
return m.getName().equals("setParameterList")
&& args.length == 3
&& args[0] instanceof String
&& args[1] instanceof List<?>;
}

}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package org.hibernate.tool.orm.jbt.wrp;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertTrue;

Expand All @@ -10,12 +11,15 @@
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
import java.util.Arrays;
import java.util.List;

import org.h2.Driver;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.query.Query;
import org.hibernate.query.spi.QueryParameterBinding;
import org.hibernate.query.sqm.internal.QuerySqmImpl;
import org.hibernate.tool.orm.jbt.util.NativeConfiguration;
import org.hibernate.tool.orm.jbt.wrp.QueryWrapperFactory.QueryWrapper;
import org.junit.jupiter.api.AfterEach;
Expand Down Expand Up @@ -54,8 +58,11 @@ public static void beforeAll() throws Exception {
@TempDir
public File tempDir;

private QueryWrapper<?> queryWrapper = null;
private Query<?> wrappedQuery = null;
private QueryWrapper<?> simpleQueryWrapper = null;
private Query<?> wrappedSimpleQuery = null;

private QueryWrapper<?> parameterizedQueryWrapper = null;
private Query<?> wrappedParameterizedQuery = null;

private SessionFactory sessionFactory = null;
private Connection connection = null;
Expand All @@ -68,8 +75,14 @@ public void before() throws Exception {
tempDir = Files.createTempDirectory("temp").toFile();
createDatabase();
createSessionFactory();
wrappedQuery = sessionFactory.openSession().createQuery("from " + Foo.class.getName());
queryWrapper = QueryWrapperFactory.createQueryWrapper(wrappedQuery);
simpleQueryWrapper = (QueryWrapper<?>)sessionFactory
.openSession()
.createQuery("from " + Foo.class.getName());
wrappedSimpleQuery = simpleQueryWrapper.getWrappedObject();
parameterizedQueryWrapper = (QueryWrapper<?>)sessionFactory
.openSession()
.createQuery("from " + Foo.class.getName() + " where id = :foo");
wrappedParameterizedQuery = parameterizedQueryWrapper.getWrappedObject();
}

@AfterEach
Expand All @@ -79,16 +92,16 @@ public void afterEach() throws Exception {

@Test
public void testCreateQueryWrapper() {
assertNotNull(queryWrapper);
assertTrue(queryWrapper instanceof QueryWrapperFactory.QueryWrapper<?>);
assertNotNull(simpleQueryWrapper);
assertTrue(simpleQueryWrapper instanceof QueryWrapperFactory.QueryWrapper<?>);
}

@Test
public void testList() throws Exception {
List<?> result = queryWrapper.list();
List<?> result = simpleQueryWrapper.list();
assertTrue(result.isEmpty());
statement.execute("INSERT INTO FOO VALUES(1, 'bars')");
result = queryWrapper.list();
result = simpleQueryWrapper.list();
assertEquals(1, result.size());
Object obj = result.get(0);
assertTrue(obj instanceof Foo);
Expand All @@ -99,10 +112,19 @@ public void testList() throws Exception {

@Test
public void testSetMaxResults() {
queryWrapper.setMaxResults(1);
assertEquals(1, wrappedQuery.getMaxResults());
queryWrapper.setMaxResults(Integer.MAX_VALUE);
assertEquals(Integer.MAX_VALUE, wrappedQuery.getMaxResults());
simpleQueryWrapper.setMaxResults(1);
assertEquals(1, wrappedSimpleQuery.getMaxResults());
simpleQueryWrapper.setMaxResults(Integer.MAX_VALUE);
assertEquals(Integer.MAX_VALUE, wrappedSimpleQuery.getMaxResults());
}

@Test
public void testSetParameterList() {
QueryParameterBinding<?> binding =
((QuerySqmImpl<?>)wrappedParameterizedQuery).getParameterBindings().getBinding("foo");
assertFalse(binding.isBound());
parameterizedQueryWrapper.setParameterList("foo", Arrays.asList(1), new Object());
assertTrue(binding.isBound());
}

private void createDatabase() throws Exception {
Expand Down

0 comments on commit 40bf60c

Please sign in to comment.