Skip to content

Commit 64a45bc

Browse files
fanstekoentsje
authored andcommitted
HBX-3166: Same usage order of reveng files and strategy for all tools
1 parent d59279c commit 64a45bc

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
@@ -80,12 +80,8 @@ private RevengStrategy createReverseEngineeringStrategy() {
8080

8181
RevengStrategy strategy =
8282
RevengStrategyFactory.createReverseEngineeringStrategy(
83-
null, revengFileList);
84-
85-
if(reverseEngineeringStrategyClass!=null) {
86-
strategy = loadreverseEngineeringStrategy(reverseEngineeringStrategyClass, strategy);
87-
}
88-
83+
reverseEngineeringStrategyClass, revengFileList);
84+
8985
RevengSettings qqsettings =
9086
new RevengSettings(strategy).setDefaultPackageName(packageName)
9187
.setDetectManyToMany( detectManyToMany )
@@ -126,31 +122,6 @@ public void setDetectOptimisticLock(boolean b) {
126122
detectOptimisticLock = b;
127123
}
128124

129-
private RevengStrategy loadreverseEngineeringStrategy(final String className, RevengStrategy delegate)
130-
throws BuildException {
131-
try {
132-
Class<?> clazz = ReflectionUtil.classForName(className);
133-
Constructor<?> constructor = clazz.getConstructor(new Class[] { RevengStrategy.class });
134-
return (RevengStrategy) constructor.newInstance(new Object[] { delegate });
135-
}
136-
catch (NoSuchMethodException e) {
137-
try {
138-
getProject().log("Could not find public " + className + "(ReverseEngineeringStrategy delegate) constructor on ReverseEngineeringStrategy. Trying no-arg version.",Project.MSG_VERBOSE);
139-
Class<?> clazz = ReflectionUtil.classForName(className);
140-
Constructor<?> constructor = clazz.getConstructor(new Class[] {});
141-
RevengStrategy rev = (RevengStrategy) constructor.newInstance();
142-
getProject().log("Using non-delegating strategy, thus packagename and revengfile will be ignored.", Project.MSG_INFO);
143-
return rev;
144-
}
145-
catch (Exception eq) {
146-
throw new BuildException("Could not create or find " + className + " with default no-arg constructor", eq);
147-
}
148-
}
149-
catch (Exception e) {
150-
throw new BuildException("Could not create or find " + className + " with one argument delegate constructor", e);
151-
}
152-
}
153-
154125
private Map<String, Object> loadCfgXmlFile() {
155126
return new ConfigLoader(new BootstrapServiceRegistryBuilder().build())
156127
.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
@@ -7,46 +7,88 @@
77
import org.hibernate.tool.internal.reveng.strategy.DefaultStrategy;
88
import org.hibernate.tool.internal.reveng.strategy.OverrideRepository;
99
import org.hibernate.tool.util.ReflectionUtil;
10+
import org.jboss.logging.Logger;
1011

1112
public class RevengStrategyFactory {
12-
13-
private static final String DEFAULT_REVERSE_ENGINEERING_STRATEGY_CLASS_NAME =
14-
DefaultStrategy.class.getName();
15-
13+
final private static Logger log = Logger.getLogger( RevengStrategyFactory.class );
14+
15+
private static RevengStrategy createDefaultStrategyInstance() {
16+
return new DefaultStrategy();
17+
}
18+
19+
private static RuntimeException createExceptionBecauseOfMissingConstructors(Class<?> revengClass) {
20+
return new RuntimeException("A strategy of class '" + revengClass.getName() + "' could not be created. " +
21+
"No matching constructor found: '" + revengClass.getSimpleName() + "()' or " +
22+
"'" + revengClass.getSimpleName() + "(" + RevengStrategy.class.getName() + ")'");
23+
}
24+
1625
public static RevengStrategy createReverseEngineeringStrategy(
17-
String reverseEngineeringClassName) {
18-
RevengStrategy result = null;
19-
try {
20-
Class<?> reverseEngineeringClass =
21-
ReflectionUtil.classForName(
22-
reverseEngineeringClassName == null ?
23-
DEFAULT_REVERSE_ENGINEERING_STRATEGY_CLASS_NAME :
24-
reverseEngineeringClassName);
25-
Constructor<?> reverseEngineeringConstructor = reverseEngineeringClass.getConstructor(new Class[] {});
26-
result = (RevengStrategy)reverseEngineeringConstructor.newInstance();
27-
} catch (ClassNotFoundException | IllegalAccessException | InstantiationException | NoSuchMethodException | SecurityException | IllegalArgumentException | InvocationTargetException exception) {
28-
throw new RuntimeException("An exporter of class '" + reverseEngineeringClassName + "' could not be created", exception);
29-
}
30-
return result;
26+
String revengClassName, RevengStrategy delegate) {
27+
if (revengClassName == null) {
28+
return delegate == null ? createDefaultStrategyInstance() : delegate;
29+
}
30+
31+
try {
32+
Class<?> revengClass = ReflectionUtil.classForName(revengClassName);
33+
34+
if (delegate == null) {
35+
try {
36+
try {
37+
Constructor<?> revengConstructor = revengClass.getConstructor();
38+
return (RevengStrategy) revengConstructor.newInstance();
39+
} catch (NoSuchMethodException e1) {
40+
try {
41+
Constructor<?> revengConstructor = revengClass.getConstructor(RevengStrategy.class);
42+
return (RevengStrategy) revengConstructor.newInstance(createDefaultStrategyInstance());
43+
} catch (NoSuchMethodException e2) {
44+
throw createExceptionBecauseOfMissingConstructors(revengClass);
45+
}
46+
}
47+
} catch (IllegalAccessException | InstantiationException | InvocationTargetException | IllegalArgumentException e) {
48+
throw new RuntimeException("A strategy of class '" + revengClassName + "' could not be created", e);
49+
}
50+
}
51+
52+
try {
53+
try {
54+
Constructor<?> revengConstructor = revengClass.getConstructor(RevengStrategy.class);
55+
return (RevengStrategy) revengConstructor.newInstance(delegate);
56+
} catch (NoSuchMethodException e1) {
57+
log.warn("Delegating strategy given, but no matching constructor is available on class '" +
58+
revengClassName + "'. The delegating strategy will be ignored!");
59+
try {
60+
Constructor<?> revengConstructor = revengClass.getConstructor();
61+
return (RevengStrategy) revengConstructor.newInstance();
62+
} catch (NoSuchMethodException e2) {
63+
throw createExceptionBecauseOfMissingConstructors(revengClass);
64+
}
65+
}
66+
} catch (IllegalAccessException | InstantiationException | InvocationTargetException | IllegalArgumentException e) {
67+
throw new RuntimeException("A strategy of class '" + revengClassName + "' could not be created", e);
68+
}
69+
} catch (ClassNotFoundException e) {
70+
throw new RuntimeException("A strategy of class '" + revengClassName + "' could not be created", e);
71+
}
3172
}
3273

33-
public static RevengStrategy createReverseEngineeringStrategy(
34-
String reverseEngineeringClassName,
35-
File[] revengFiles) {
36-
RevengStrategy result =
37-
createReverseEngineeringStrategy(reverseEngineeringClassName);
38-
if (revengFiles != null && revengFiles.length > 0) {
39-
OverrideRepository overrideRepository = new OverrideRepository();
40-
for (File file : revengFiles) {
41-
overrideRepository.addFile(file);
42-
}
43-
result = overrideRepository.getReverseEngineeringStrategy(result);
44-
}
45-
return result;
74+
public static RevengStrategy createReverseEngineeringStrategy( String revengClassName, File[] revengFiles) {
75+
RevengStrategy result = null;
76+
if (revengFiles != null && revengFiles.length > 0) {
77+
OverrideRepository overrideRepository = new OverrideRepository();
78+
for (File file : revengFiles) {
79+
overrideRepository.addFile(file);
80+
}
81+
result = overrideRepository.getReverseEngineeringStrategy(createDefaultStrategyInstance());
82+
}
83+
84+
return createReverseEngineeringStrategy(revengClassName, result);
4685
}
47-
86+
87+
public static RevengStrategy createReverseEngineeringStrategy(String revengClassName) {
88+
return createReverseEngineeringStrategy(revengClassName, (RevengStrategy) null);
89+
}
90+
4891
public static RevengStrategy createReverseEngineeringStrategy() {
49-
return createReverseEngineeringStrategy(null);
92+
return createDefaultStrategyInstance();
5093
}
51-
5294
}

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
@@ -585,6 +585,11 @@ private Map<String, MetaAttribute> toMetaAttributes(MultiValuedMap<String, Simpl
585585
return result;
586586
}
587587

588+
/**
589+
* @deprecated Use {@link #getReverseEngineeringStrategy(RevengStrategy)}
590+
* with {@code delegate=null} to explicitly ignore the delegate.
591+
*/
592+
@Deprecated
588593
public RevengStrategy getReverseEngineeringStrategy() {
589594
return getReverseEngineeringStrategy(null);
590595
}

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
@@ -76,7 +76,7 @@ public void testCfg2HbmWithInvalidReverseNamingStrategy() {
7676

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

8181
}
8282

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
@@ -402,7 +402,7 @@ public void testColumnExclude() {
402402
OverrideRepository or = new OverrideRepository();
403403
or.addResource(OVERRIDETEST_REVENG_XML);
404404

405-
RevengStrategy reverseEngineeringStrategy = or.getReverseEngineeringStrategy();
405+
RevengStrategy reverseEngineeringStrategy = or.getReverseEngineeringStrategy(null);
406406

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

0 commit comments

Comments
 (0)