Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

HBX-2739: Create Interface for ClassMetadataWrapper #4683

Merged
merged 12 commits into from
Feb 29, 2024
Merged
Original file line number Diff line number Diff line change
@@ -1,7 +1,25 @@
package org.hibernate.tool.orm.jbt.api;

import org.hibernate.Session;
import org.hibernate.engine.spi.SharedSessionContractImplementor;
import org.hibernate.persister.entity.AbstractEntityPersister;
import org.hibernate.persister.entity.EntityPersister;
import org.hibernate.tool.orm.jbt.wrp.Wrapper;
import org.hibernate.type.Type;

public interface ClassMetadataWrapper extends Wrapper {

default String getEntityName() { return ((EntityPersister)getWrappedObject()).getEntityName(); }
default String getIdentifierPropertyName() { return ((EntityPersister)getWrappedObject()).getIdentifierPropertyName(); }
default String[] getPropertyNames() { return ((EntityPersister)getWrappedObject()).getPropertyNames(); }
default Type[] getPropertyTypes() { return ((EntityPersister)getWrappedObject()).getPropertyTypes(); }
default Class<?> getMappedClass() { return ((EntityPersister)getWrappedObject()).getMappedClass(); }
default Type getIdentifierType() { return ((EntityPersister)getWrappedObject()).getIdentifierType(); }
default Object getPropertyValue(Object object, String name) { return ((EntityPersister)getWrappedObject()).getPropertyValue(object, name); }
default boolean hasIdentifierProperty() { return ((EntityPersister)getWrappedObject()).hasIdentifierProperty(); }
default Object getIdentifier(Object object, Session session) { return ((EntityPersister)getWrappedObject()).getIdentifier(object, (SharedSessionContractImplementor)session); }
default boolean isInstanceOfAbstractEntityPersister() { return (EntityPersister)getWrappedObject() instanceof AbstractEntityPersister; }
default Integer getPropertyIndexOrNull(String id) { return ((EntityPersister)getWrappedObject()).getEntityMetamodel().getPropertyIndexOrNull(id); }
default Object getTuplizerPropertyValue(Object entity, int i) { return ((EntityPersister)getWrappedObject()).getValue(entity, i); }

}
Original file line number Diff line number Diff line change
@@ -1,20 +1,30 @@
package org.hibernate.tool.orm.jbt.api;

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

import java.io.File;
import java.io.FileWriter;
import java.nio.file.Files;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AvailableSettings;
import org.hibernate.cfg.Configuration;
import org.hibernate.engine.spi.SessionFactoryImplementor;
import org.hibernate.persister.entity.EntityPersister;
import org.hibernate.tool.orm.jbt.internal.factory.ClassMetadataWrapperFactory;
import org.hibernate.tool.orm.jbt.util.MockConnectionProvider;
import org.hibernate.tool.orm.jbt.util.MockDialect;
import org.hibernate.type.CollectionType;
import org.hibernate.type.Type;
import org.hibernate.type.internal.NamedBasicTypeImpl;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.io.TempDir;
Expand Down Expand Up @@ -49,6 +59,7 @@ public static class Foo {
public File tempDir;

private ClassMetadataWrapper classMetadataWrapper = null;
private SessionFactory sessionFactory = null;

@BeforeEach
public void beforeEach() throws Exception {
Expand All @@ -64,8 +75,8 @@ public void beforeEach() throws Exception {
Configuration configuration = new Configuration();
configuration.addFile(hbmXmlFile);
configuration.configure(cfgXmlFile);
SessionFactoryImplementor sessionFactory = (SessionFactoryImplementor)configuration.buildSessionFactory();
EntityPersister entityPersister = sessionFactory
sessionFactory = configuration.buildSessionFactory();
EntityPersister entityPersister = ((SessionFactoryImplementor)sessionFactory)
.getMappingMetamodel().getEntityDescriptor(Foo.class.getName());
classMetadataWrapper = ClassMetadataWrapperFactory.createClassMetadataWrapper(entityPersister);
}
Expand All @@ -75,4 +86,86 @@ public void testConstruction() {
assertNotNull(classMetadataWrapper);
}

@Test
public void testGetEntityName() {
assertEquals(Foo.class.getName(), classMetadataWrapper.getEntityName());
}

@Test
public void testGetIdentifierPropertyName() {
assertEquals("id", classMetadataWrapper.getIdentifierPropertyName());
}

@Test
public void testGetPropertyNames() {
String[] propertyNames = classMetadataWrapper.getPropertyNames();
assertEquals(1, propertyNames.length);
assertEquals("bars", propertyNames[0]);
}

@Test
public void testGetPropertyTypes() {
Type[] types = classMetadataWrapper.getPropertyTypes();
assertEquals(1, types.length);
Type type = types[0];
assertTrue(type.isCollectionType());
assertEquals(
"org.hibernate.tool.orm.jbt.api.ClassMetadataWrapperTest$Foo.bars",
((CollectionType)type).getRole());
}

@Test
public void testGetMappedClass() {
assertSame(Foo.class, classMetadataWrapper.getMappedClass());
}

@Test
public void testGetIdentifierType() {
Type identifierType = classMetadataWrapper.getIdentifierType();
assertNotNull(identifierType);
assertTrue(identifierType instanceof NamedBasicTypeImpl);
assertSame("string", ((NamedBasicTypeImpl<?>)identifierType).getName());
}

@Test
public void testGetPropertyValue() {
Foo foo = new Foo();
Set<String> foobarSet = new HashSet<String>(Arrays.asList("foo", "bar"));
foo.bars = foobarSet;
assertSame(foobarSet, classMetadataWrapper.getPropertyValue(foo, "bars"));
}

@Test
public void testHasIdentifierProperty() {
assertTrue(classMetadataWrapper.hasIdentifierProperty());
}

@Test
public void testGetIdentifier() {
Session session = sessionFactory.openSession();
Foo foo = new Foo();
foo.id = "bar";
Object identifier = classMetadataWrapper.getIdentifier(foo, session);
assertSame("bar", identifier);
}

@Test
public void testIsInstanceOfAbstractEntityPersister() {
assertTrue(classMetadataWrapper.isInstanceOfAbstractEntityPersister());
}

@Test
public void testGetPropertyIndexOrNull() {
assertSame(0, classMetadataWrapper.getPropertyIndexOrNull("bars"));
assertNull(classMetadataWrapper.getPropertyIndexOrNull("foo"));
}

@Test
public void testGetTuplizerPropertyValue() {
Foo foo = new Foo();
Set<String> bars = Set.of("foo", "bar");
foo.bars = bars;
assertSame(bars, classMetadataWrapper.getTuplizerPropertyValue(foo, 0));
}

}
Loading