Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,12 @@
import java.io.File;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.Arrays;
import java.util.Objects;
import java.util.Optional;

import org.hibernate.tool.internal.reveng.strategy.DefaultStrategy;
import org.hibernate.tool.internal.reveng.strategy.DelegatingStrategy;
import org.hibernate.tool.internal.reveng.strategy.OverrideRepository;
import org.hibernate.tool.util.ReflectionUtil;

Expand All @@ -15,38 +19,70 @@ public class RevengStrategyFactory {

public static RevengStrategy createReverseEngineeringStrategy(
String reverseEngineeringClassName) {
return createReverseEngineeringStrategy(reverseEngineeringClassName, (OverrideRepository) null);
}

public static RevengStrategy createReverseEngineeringStrategy(
String reverseEngineeringClassName,
File[] revengFiles) {
RevengStrategy result = null;
Class<?> revengClass = getRevengClass(reverseEngineeringClassName);
if (!DelegatingStrategy.class.isAssignableFrom(revengClass)) {
result = createReverseEngineeringStrategy(reverseEngineeringClassName);
}
if (revengFiles != null && revengFiles.length > 0) {
OverrideRepository overrideRepository = new OverrideRepository();
for (File file : revengFiles) {
overrideRepository.addFile(file);
}
if (DelegatingStrategy.class.isAssignableFrom(revengClass)) {
return createReverseEngineeringStrategy(reverseEngineeringClassName, overrideRepository);
}
result = overrideRepository.getReverseEngineeringStrategy(result);
}
return result;
}

private static Class<?> getRevengClass(String reverseEngineeringClassName) {
try {
Class<?> reverseEngineeringClass =
ReflectionUtil.classForName(
return ReflectionUtil.classForName(
reverseEngineeringClassName == null ?
DEFAULT_REVERSE_ENGINEERING_STRATEGY_CLASS_NAME :
reverseEngineeringClassName);
Constructor<?> reverseEngineeringConstructor = reverseEngineeringClass.getConstructor(new Class[] {});
result = (RevengStrategy)reverseEngineeringConstructor.newInstance();
} catch (ClassNotFoundException | IllegalAccessException | InstantiationException | NoSuchMethodException | SecurityException | IllegalArgumentException | InvocationTargetException exception) {
} catch (ClassNotFoundException exception) {
throw new RuntimeException("An exporter of class '" + reverseEngineeringClassName + "' could not be created", exception);
}
return result;
}

public static RevengStrategy createReverseEngineeringStrategy(
String reverseEngineeringClassName,
File[] revengFiles) {
RevengStrategy result =
createReverseEngineeringStrategy(reverseEngineeringClassName);
if (revengFiles != null && revengFiles.length > 0) {
OverrideRepository overrideRepository = new OverrideRepository();
for (File file : revengFiles) {
overrideRepository.addFile(file);
OverrideRepository overrideRepository) {
try {
Class<?> reverseEngineeringClass = getRevengClass(reverseEngineeringClassName);
if (DelegatingStrategy.class.isAssignableFrom(reverseEngineeringClass)) {
Constructor<?>[] constructors = reverseEngineeringClass.getConstructors();
Optional<Constructor<?>> doesHasDelegateParameter = Arrays.stream(constructors).filter(item -> item.getParameterCount() == 1 &&
RevengStrategy.class.isAssignableFrom(item.getParameterTypes()[0]))
.findFirst();
if (doesHasDelegateParameter.isPresent()) {
Constructor<?> reverseEngineeringConstructor = reverseEngineeringClass.getConstructor(new Class[] {RevengStrategy.class});
if (Objects.nonNull(overrideRepository))
return (RevengStrategy) reverseEngineeringConstructor.newInstance(overrideRepository.getReverseEngineeringStrategy(new DefaultStrategy()));
else
return (RevengStrategy) reverseEngineeringConstructor.newInstance(new DefaultStrategy());
}
}
result = overrideRepository.getReverseEngineeringStrategy(result);

Constructor<?> reverseEngineeringConstructor = reverseEngineeringClass.getConstructor(new Class[] {});
return (RevengStrategy)reverseEngineeringConstructor.newInstance();
} catch (IllegalAccessException | InstantiationException | NoSuchMethodException | SecurityException | IllegalArgumentException | InvocationTargetException exception) {
throw new RuntimeException("An exporter of class '" + reverseEngineeringClassName + "' could not be created", exception);
}
return result;
}

public static RevengStrategy createReverseEngineeringStrategy() {
return createReverseEngineeringStrategy(null);
}

}

Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,17 @@

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.assertTrue;

import java.io.File;
import java.net.URISyntaxException;

import javax.management.RuntimeErrorException;

import org.hibernate.id.insert.GetGeneratedKeysDelegate;
import org.hibernate.tool.internal.reveng.strategy.DefaultStrategy;
import org.hibernate.tool.internal.reveng.strategy.DelegatingStrategy;
import org.junit.jupiter.api.Test;


Expand All @@ -48,8 +57,48 @@ public void testCreateReverseEngineeringStrategy() {
assertEquals(
DefaultStrategy.class.getName(),
reverseEngineeringStrategy.getClass().getName());

reverseEngineeringStrategy =
RevengStrategyFactory.createReverseEngineeringStrategy(TestDelegatingReverseEngineeringStrategyFactory.class.getName());
assertEquals(
TestDelegatingReverseEngineeringStrategyFactory.class.getName(),
reverseEngineeringStrategy.getClass().getName());
assertEquals(DefaultStrategy.class.getName(), ((TestDelegatingReverseEngineeringStrategyFactory) reverseEngineeringStrategy).getDelegateTest().getClass().getName());


try {
File file = new File(this.getClass().getResource("/test.reveng.xml").toURI());
reverseEngineeringStrategy =
RevengStrategyFactory.createReverseEngineeringStrategy(TestDelegatingReverseEngineeringStrategyFactory.class.getName(), new File[] {file});
assertEquals(
TestDelegatingReverseEngineeringStrategyFactory.class.getName(),
reverseEngineeringStrategy.getClass().getName());
assertTrue(DelegatingStrategy.class.isAssignableFrom(((TestDelegatingReverseEngineeringStrategyFactory) reverseEngineeringStrategy).getDelegateTest().getClass()));
// TODO this does not keep track of the eventually DefaultStrategy.
} catch (URISyntaxException exception) {
throw new RuntimeException("Unable to load /test.reveng.xml from test resources", exception);
}

}

public static class TestReverseEngineeringStrategyFactory extends DefaultStrategy {}

public static class TestDelegatingReverseEngineeringStrategyFactory extends DelegatingStrategy {

private RevengStrategy delegateTest;

public TestDelegatingReverseEngineeringStrategyFactory(RevengStrategy delegate) {
super(delegate);
this.delegateTest = delegate;
}

public RevengStrategy getDelegateTest() {
return delegateTest;
}

public void setDelegateTest(RevengStrategy delegateTest) {
this.delegateTest = delegateTest;
}

}
}
28 changes: 28 additions & 0 deletions orm/src/test/resources/test.reveng.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-reverse-engineering SYSTEM "http://hibernate.org/dtd/hibernate-reverse-engineering-3.0.dtd" >

<hibernate-reverse-engineering>

<type-mapping>
<sql-type jdbc-type="BINARY" length="1" hibernate-type="boolean" />
<sql-type jdbc-type="INTEGER" length="5" hibernate-type="int" />
<sql-type jdbc-type="INTEGER" hibernate-type="long" />
<sql-type jdbc-type="BIGINT" precision="5" hibernate-type="byte[]" />
<sql-type jdbc-type="BIGINT" hibernate-type="java.math.BigInteger" />
<sql-type jdbc-type="CHAR" hibernate-type="string" />

<!-- start HBX-534 -->
<sql-type jdbc-type="NUMERIC" precision='10' scale="0" hibernate-type="Long" />
<sql-type jdbc-type="NUMERIC" precision='10' hibernate-type="java.lang.Long" />
<!-- end HBX-534 -->

<!-- nullability -->
<sql-type jdbc-type="FLOAT" scale="17" not-null="true" hibernate-type="nonnull-float" />
<sql-type jdbc-type="FLOAT" scale="17" not-null="false" hibernate-type="null-float" />
<sql-type jdbc-type="FLOAT" not-null="true" hibernate-type="onlynotnull" />
<sql-type jdbc-type="FLOAT" hibernate-type="donotcare" />


</type-mapping>

</hibernate-reverse-engineering>