Skip to content

Commit 20c41c2

Browse files
committed
enhancement to #197 which allows for further customization of the generated
names (prior to any hashing or other mangling, which applies to builders only)
1 parent 2f844e7 commit 20c41c2

7 files changed

Lines changed: 91 additions & 20 deletions

File tree

flapi-descriptor/src/main/java/unquietcode/tools/flapi/generator/naming/NameGenerator.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,4 +47,20 @@ public interface NameGenerator {
4747
* @return a new state name, or the same, but not null
4848
*/
4949
String className(String stateKey);
50+
51+
52+
// *Generator
53+
String generatorName(String stateName);
54+
55+
// *Factory
56+
String factoryName(String stateName);
57+
58+
// *Helper
59+
String helperName(String stateName);
60+
61+
// *Builder
62+
String builderName(String stateName);
63+
64+
// Start
65+
String wrapperName(String stateName);
5066
}

src/main/java/unquietcode/tools/flapi/generator/AbstractGenerator.java

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,8 @@ protected AbstractGenerator(GeneratorContext ctx) {
4242

4343
protected static final TypeCreationStrategy BUILDER_INTERFACE_STRATEGY = new DefaultTypeCreationStrategy() {
4444
public @Override JDefinedClass createStrongType(GeneratorContext ctx, StateClass state) {
45-
String name = ctx.getGeneratedName("", "Builder", state);
46-
47-
Pair<JDefinedClass, Boolean> construction = ctx.getOrCreateInterface(state.getName(), name);
45+
final String name = ctx.getGeneratedName(state);
46+
final Pair<JDefinedClass, Boolean> construction = ctx.getOrCreateInterface(state.getName(), name);
4847
final JDefinedClass _interface = construction.first;
4948
final boolean created = construction.second;
5049

@@ -128,33 +127,35 @@ public JDefinedClass createStrongType(GeneratorContext ctx, StateClass state) {
128127
if (state.getHelperClass() != null) {
129128
return null;
130129
} else {
131-
return ctx.getOrCreateInterface(state.getName(), state.getName() + "Helper").first;
130+
String name = ctx.getNameGenerator().helperName(state.getName());
131+
return ctx.getOrCreateInterface(state.getName(), name).first;
132132
}
133133
}
134134
};
135135

136136
protected static final TypeCreationStrategy GENERATOR_CLASS_STRATEGY = new DefaultTypeCreationStrategy() {
137137
public JDefinedClass createStrongType(GeneratorContext ctx, StateClass state) {
138-
String name = state.getName()+"Generator";
138+
String name = ctx.getNameGenerator().generatorName(state.getName());
139139
return ctx.getOrCreateClass(state.getName(), name).first;
140140
}
141141
};
142142

143143
protected static final TypeCreationStrategy FACTORY_INTERFACE_STRATEGY = new DefaultTypeCreationStrategy() {
144144
public JDefinedClass createStrongType(GeneratorContext ctx, StateClass state) {
145-
String name = state.getName()+"Factory";
145+
String name = ctx.getNameGenerator().factoryName(state.getName());
146146
return ctx.getOrCreateInterface(state.getName(), name).first;
147147
}
148148
};
149149

150150
public static final TypeCreationStrategy WRAPPER_INTERFACE_STRATEGY = new DefaultTypeCreationStrategy() {
151151
public @Override JDefinedClass createStrongType(GeneratorContext ctx, StateClass state) {
152-
String name = state.getName()+"Builder";
153-
JDefinedClass parent = ctx.getOrCreateInterface(state.getName(), name).first;
152+
final String builderName = ctx.getNameGenerator().builderName(state.getName());
153+
final JDefinedClass parent = ctx.getOrCreateInterface(state.getName(), builderName).first;
154154
JDefinedClass startClass;
155155

156156
try {
157-
startClass = parent._interface("Start");
157+
String wrapperName = ctx.getNameGenerator().wrapperName(state.getName());
158+
startClass = parent._interface(wrapperName);
158159
} catch (JClassAlreadyExistsException ex) {
159160
return ex.getExistingClass();
160161
}

src/main/java/unquietcode/tools/flapi/generator/GeneratorContext.java

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,10 @@ private String checkPackageName(String name) {
8282
return name;
8383
}
8484

85+
public NameGenerator getNameGenerator() {
86+
return nameGenerator;
87+
}
88+
8589
public void setNameGenerator(NameGenerator generator) {
8690
this.nameGenerator = Objects.requireNonNull(generator);
8791
}
@@ -155,14 +159,12 @@ public boolean doesInterfaceExist(String name) {
155159
* a lack of support for two methods with the same name but
156160
* different parameters.
157161
*
158-
* @param prefix prefix for the name (eg 'Impl')
159-
* @param suffix suffix for the name (eg 'Builder')
160162
* @param state state to generate a name for
161163
* @return the generated name, which should be unique across the graph
162164
*/
163-
public String getGeneratedName(String prefix, String suffix, StateClass state) {
164-
StringBuilder name = new StringBuilder();
165-
name.append(prefix).append(state.getName()).append(suffix);
165+
public String getGeneratedName(StateClass state) {
166+
final String builderName = nameGenerator.builderName(state.getName());
167+
final StringBuilder name = new StringBuilder(builderName);
166168

167169
for (Transition transition : state.getTransitions()) {
168170
final boolean isImplicit = transition.info().isImplicit();

src/main/java/unquietcode/tools/flapi/generator/naming/DefaultNameGenerator.java

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,7 @@
1717
package unquietcode.tools.flapi.generator.naming;
1818

1919
/**
20-
* Default name generator, which acts simply as a pass-through
21-
* for the provided names.
20+
* Default name generator.
2221
*
2322
* @author Ben Fagin
2423
* @version 2015-01-14
@@ -34,4 +33,29 @@ public String methodName(String methodKey) {
3433
public String className(String stateKey) {
3534
return stateKey;
3635
}
36+
37+
@Override
38+
public String generatorName(String stateName) {
39+
return stateName+"Generator";
40+
}
41+
42+
@Override
43+
public String factoryName(String stateName) {
44+
return stateName+"Factory";
45+
}
46+
47+
@Override
48+
public String helperName(String stateName) {
49+
return stateName+"Helper";
50+
}
51+
52+
@Override
53+
public String builderName(String stateName) {
54+
return stateName+"Builder";
55+
}
56+
57+
@Override
58+
public String wrapperName(String stateName) {
59+
return "Start";
60+
}
3761
}

src/main/java/unquietcode/tools/flapi/generator/naming/HashedNameGenerator.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
* @author Ben Fagin
2626
* @version 2015-01-14
2727
*/
28-
public class HashedNameGenerator implements NameGenerator {
28+
public class HashedNameGenerator extends DefaultNameGenerator {
2929
private final Function<String, String> methodNameHasher = new Hasher("m");
3030
private final Function<String, String> stateNameHasher = new Hasher("S");
3131

src/main/java/unquietcode/tools/flapi/generator/naming/NameGenerator.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,4 +45,20 @@ public interface NameGenerator {
4545
* @return a new state name, or the same, but not null
4646
*/
4747
String className(String stateKey);
48+
49+
50+
// *Generator
51+
String generatorName(String stateName);
52+
53+
// *Factory
54+
String factoryName(String stateName);
55+
56+
// *Helper
57+
String helperName(String stateName);
58+
59+
// *Builder
60+
String builderName(String stateName);
61+
62+
// Start
63+
String wrapperName(String stateName);
4864
}

src/test/java/unquietcode/tools/flapi/GraphNaming_T.java

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
import org.junit.Test;
1111
import unquietcode.tools.flapi.generator.GeneratorContext;
12+
import unquietcode.tools.flapi.generator.naming.DefaultNameGenerator;
1213
import unquietcode.tools.flapi.graph.components.LateralTransition;
1314
import unquietcode.tools.flapi.graph.components.StateClass;
1415
import unquietcode.tools.flapi.graph.components.Transition;
@@ -30,16 +31,21 @@ public void twoMethodsInDifferentStatesYieldsDifferentStateNames() {
3031
t2.info().setMaxOccurrences(1);
3132

3233
GeneratorContext ctx = new GeneratorContext("");
34+
ctx.setNameGenerator(new DefaultNameGenerator() {
35+
public @Override String builderName(String stateName) {
36+
return stateName;
37+
}
38+
});
3339

3440
StateClass sc1 = new StateClass();
3541
sc1.setName("State");
3642
sc1.addTransitions(t1);
37-
String s1 = ctx.getGeneratedName("", "", sc1);
43+
String s1 = ctx.getGeneratedName(sc1);
3844

3945
StateClass sc2 = new StateClass();
4046
sc2.setName("State");
4147
sc2.addTransitions(t2);
42-
String s2 = ctx.getGeneratedName("", "", sc2);
48+
String s2 = ctx.getGeneratedName(sc2);
4349

4450
assertFalse(s1.equals(s2));
4551
}
@@ -62,7 +68,13 @@ public void twoMethodsInTheSameClass() {
6268
sc1.addTransitions(t1, t2);
6369

6470
GeneratorContext ctx = new GeneratorContext("");
65-
String name = ctx.getGeneratedName("", "", sc1);
71+
ctx.setNameGenerator(new DefaultNameGenerator() {
72+
public @Override String builderName(String stateName) {
73+
return stateName;
74+
}
75+
});
76+
77+
String name = ctx.getGeneratedName(sc1);
6678
assertEquals("expected the same name", "State_2method_2method_1A", name);
6779
}
6880
}

0 commit comments

Comments
 (0)