Skip to content

Commit 82532ff

Browse files
fanstekoentsje
authored andcommitted
HBX-3166: Same usage order of reveng files and strategy for all tools
1 parent b8cd1e1 commit 82532ff

File tree

5 files changed

+85
-67
lines changed

5 files changed

+85
-67
lines changed

ant/src/main/java/org/hibernate/tool/ant/JDBCConfigurationTask.java

Lines changed: 2 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -78,12 +78,8 @@ private RevengStrategy createReverseEngineeringStrategy() {
7878

7979
RevengStrategy strategy =
8080
RevengStrategyFactory.createReverseEngineeringStrategy(
81-
null, revengFileList);
82-
83-
if(reverseEngineeringStrategyClass!=null) {
84-
strategy = loadreverseEngineeringStrategy(reverseEngineeringStrategyClass, strategy);
85-
}
86-
81+
reverseEngineeringStrategyClass, revengFileList);
82+
8783
RevengSettings qqsettings =
8884
new RevengSettings(strategy).setDefaultPackageName(packageName)
8985
.setDetectManyToMany( detectManyToMany )
@@ -124,31 +120,6 @@ public void setDetectOptimisticLock(boolean b) {
124120
detectOptimisticLock = b;
125121
}
126122

127-
private RevengStrategy loadreverseEngineeringStrategy(final String className, RevengStrategy delegate)
128-
throws BuildException {
129-
try {
130-
Class<?> clazz = ReflectionUtil.classForName(className);
131-
Constructor<?> constructor = clazz.getConstructor(new Class[] { RevengStrategy.class });
132-
return (RevengStrategy) constructor.newInstance(new Object[] { delegate });
133-
}
134-
catch (NoSuchMethodException e) {
135-
try {
136-
getProject().log("Could not find public " + className + "(ReverseEngineeringStrategy delegate) constructor on ReverseEngineeringStrategy. Trying no-arg version.",Project.MSG_VERBOSE);
137-
Class<?> clazz = ReflectionUtil.classForName(className);
138-
Constructor<?> constructor = clazz.getConstructor(new Class[] {});
139-
RevengStrategy rev = (RevengStrategy) constructor.newInstance();
140-
getProject().log("Using non-delegating strategy, thus packagename and revengfile will be ignored.", Project.MSG_INFO);
141-
return rev;
142-
}
143-
catch (Exception eq) {
144-
throw new BuildException("Could not create or find " + className + " with default no-arg constructor", eq);
145-
}
146-
}
147-
catch (Exception e) {
148-
throw new BuildException("Could not create or find " + className + " with one argument delegate constructor", e);
149-
}
150-
}
151-
152123
private Map<String, Object> loadCfgXmlFile() {
153124
return new ConfigLoader(new BootstrapServiceRegistryBuilder().build())
154125
.loadConfigXmlFile(getConfigurationFile())

orm/src/main/java/org/hibernate/tool/api/reveng/RevengStrategyFactory.java

Lines changed: 76 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -24,46 +24,88 @@
2424
import org.hibernate.tool.internal.reveng.strategy.DefaultStrategy;
2525
import org.hibernate.tool.internal.reveng.strategy.OverrideRepository;
2626
import org.hibernate.tool.util.ReflectionUtil;
27+
import org.jboss.logging.Logger;
2728

2829
public class RevengStrategyFactory {
29-
30-
private static final String DEFAULT_REVERSE_ENGINEERING_STRATEGY_CLASS_NAME =
31-
DefaultStrategy.class.getName();
32-
30+
final private static Logger log = Logger.getLogger( RevengStrategyFactory.class );
31+
32+
private static RevengStrategy createDefaultStrategyInstance() {
33+
return new DefaultStrategy();
34+
}
35+
36+
private static RuntimeException createExceptionBecauseOfMissingConstructors(Class<?> revengClass) {
37+
return new RuntimeException("A strategy of class '" + revengClass.getName() + "' could not be created. " +
38+
"No matching constructor found: '" + revengClass.getSimpleName() + "()' or " +
39+
"'" + revengClass.getSimpleName() + "(" + RevengStrategy.class.getName() + ")'");
40+
}
41+
3342
public static RevengStrategy createReverseEngineeringStrategy(
34-
String reverseEngineeringClassName) {
35-
RevengStrategy result = null;
36-
try {
37-
Class<?> reverseEngineeringClass =
38-
ReflectionUtil.classForName(
39-
reverseEngineeringClassName == null ?
40-
DEFAULT_REVERSE_ENGINEERING_STRATEGY_CLASS_NAME :
41-
reverseEngineeringClassName);
42-
Constructor<?> reverseEngineeringConstructor = reverseEngineeringClass.getConstructor(new Class[] {});
43-
result = (RevengStrategy)reverseEngineeringConstructor.newInstance();
44-
} catch (ClassNotFoundException | IllegalAccessException | InstantiationException | NoSuchMethodException | SecurityException | IllegalArgumentException | InvocationTargetException exception) {
45-
throw new RuntimeException("An exporter of class '" + reverseEngineeringClassName + "' could not be created", exception);
46-
}
47-
return result;
43+
String revengClassName, RevengStrategy delegate) {
44+
if (revengClassName == null) {
45+
return delegate == null ? createDefaultStrategyInstance() : delegate;
46+
}
47+
48+
try {
49+
Class<?> revengClass = ReflectionUtil.classForName(revengClassName);
50+
51+
if (delegate == null) {
52+
try {
53+
try {
54+
Constructor<?> revengConstructor = revengClass.getConstructor();
55+
return (RevengStrategy) revengConstructor.newInstance();
56+
} catch (NoSuchMethodException e1) {
57+
try {
58+
Constructor<?> revengConstructor = revengClass.getConstructor(RevengStrategy.class);
59+
return (RevengStrategy) revengConstructor.newInstance(createDefaultStrategyInstance());
60+
} catch (NoSuchMethodException e2) {
61+
throw createExceptionBecauseOfMissingConstructors(revengClass);
62+
}
63+
}
64+
} catch (IllegalAccessException | InstantiationException | InvocationTargetException | IllegalArgumentException e) {
65+
throw new RuntimeException("A strategy of class '" + revengClassName + "' could not be created", e);
66+
}
67+
}
68+
69+
try {
70+
try {
71+
Constructor<?> revengConstructor = revengClass.getConstructor(RevengStrategy.class);
72+
return (RevengStrategy) revengConstructor.newInstance(delegate);
73+
} catch (NoSuchMethodException e1) {
74+
log.warn("Delegating strategy given, but no matching constructor is available on class '" +
75+
revengClassName + "'. The delegating strategy will be ignored!");
76+
try {
77+
Constructor<?> revengConstructor = revengClass.getConstructor();
78+
return (RevengStrategy) revengConstructor.newInstance();
79+
} catch (NoSuchMethodException e2) {
80+
throw createExceptionBecauseOfMissingConstructors(revengClass);
81+
}
82+
}
83+
} catch (IllegalAccessException | InstantiationException | InvocationTargetException | IllegalArgumentException e) {
84+
throw new RuntimeException("A strategy of class '" + revengClassName + "' could not be created", e);
85+
}
86+
} catch (ClassNotFoundException e) {
87+
throw new RuntimeException("A strategy of class '" + revengClassName + "' could not be created", e);
88+
}
4889
}
4990

50-
public static RevengStrategy createReverseEngineeringStrategy(
51-
String reverseEngineeringClassName,
52-
File[] revengFiles) {
53-
RevengStrategy result =
54-
createReverseEngineeringStrategy(reverseEngineeringClassName);
55-
if (revengFiles != null && revengFiles.length > 0) {
56-
OverrideRepository overrideRepository = new OverrideRepository();
57-
for (File file : revengFiles) {
58-
overrideRepository.addFile(file);
59-
}
60-
result = overrideRepository.getReverseEngineeringStrategy(result);
61-
}
62-
return result;
91+
public static RevengStrategy createReverseEngineeringStrategy( String revengClassName, File[] revengFiles) {
92+
RevengStrategy result = null;
93+
if (revengFiles != null && revengFiles.length > 0) {
94+
OverrideRepository overrideRepository = new OverrideRepository();
95+
for (File file : revengFiles) {
96+
overrideRepository.addFile(file);
97+
}
98+
result = overrideRepository.getReverseEngineeringStrategy(createDefaultStrategyInstance());
99+
}
100+
101+
return createReverseEngineeringStrategy(revengClassName, result);
63102
}
64-
103+
104+
public static RevengStrategy createReverseEngineeringStrategy(String revengClassName) {
105+
return createReverseEngineeringStrategy(revengClassName, (RevengStrategy) null);
106+
}
107+
65108
public static RevengStrategy createReverseEngineeringStrategy() {
66-
return createReverseEngineeringStrategy(null);
109+
return createDefaultStrategyInstance();
67110
}
68-
69111
}

orm/src/main/java/org/hibernate/tool/internal/reveng/strategy/OverrideRepository.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -602,6 +602,11 @@ private Map<String, MetaAttribute> toMetaAttributes(MultiValuedMap<String, Simpl
602602
return result;
603603
}
604604

605+
/**
606+
* @deprecated Use {@link #getReverseEngineeringStrategy(RevengStrategy)}
607+
* with {@code delegate=null} to explicitly ignore the delegate.
608+
*/
609+
@Deprecated
605610
public RevengStrategy getReverseEngineeringStrategy() {
606611
return getReverseEngineeringStrategy(null);
607612
}

test/common/src/main/java/org/hibernate/tool/ant/Cfg2HbmWithInvalidReverseNamingStrategy/TestCase.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ public void testCfg2HbmWithInvalidReverseNamingStrategy() {
7474

7575
assertTrue(e
7676
.getMessage()
77-
.contains("Could not create or find invalid.Strategy"));
77+
.contains("A strategy of class 'invalid.Strategy' could not be created"));
7878

7979
}
8080

test/common/src/main/java/org/hibernate/tool/jdbc2cfg/OverrideBinder/TestCase.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -401,7 +401,7 @@ public void testColumnExclude() {
401401
OverrideRepository or = new OverrideRepository();
402402
or.addResource(OVERRIDETEST_REVENG_XML);
403403

404-
RevengStrategy reverseEngineeringStrategy = or.getReverseEngineeringStrategy();
404+
RevengStrategy reverseEngineeringStrategy = or.getReverseEngineeringStrategy(null);
405405

406406
assertFalse(reverseEngineeringStrategy.excludeColumn(TableIdentifier.create(null, null, "EXCOLUMNS"), "blah"));
407407
assertFalse(reverseEngineeringStrategy.excludeColumn(TableIdentifier.create(null, null, "EXCOLUMNS"), "NAME"));

0 commit comments

Comments
 (0)