Skip to content

Commit c2f58f7

Browse files
committed
Slight generator optimizations
- removed shuffling to have predictable build times - added "random" generic types - fixed "random" imports / fields - added primitive arguments support (roots, depth, classes, path) - consistently using "Foo" instead of "Element" base type names
1 parent 1d0dd29 commit c2f58f7

File tree

5 files changed

+67
-46
lines changed

5 files changed

+67
-46
lines changed

JavaProjectGenerator/src/de/loskutov/jpg/Clazz.java

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,12 @@ String generateCode() {
1717
if(object) {
1818
return generateObject();
1919
}
20+
String type = genTypes.next();
2021
String s = "package " + packageName + ";\n\n" +
2122
"import " + imports.next() + ";\n\n" +
2223
"@SuppressWarnings(\"all\")\n" +
23-
"public abstract class " + name + "<E> extends " + extend + "<E> implements " + implement + "<E> {\n\n" +
24-
"\t public E element;\n\n" +
24+
"public abstract class " + name + "<"+type+"> extends " + extend + "<"+type+"> implements " + implement + "<"+type+"> {\n\n" +
25+
"\t public "+type+" element;\n\n" +
2526
"\t public " + fields.next() + " field1;\n\n" +
2627
"\t public static " + name + " instance;\n\n" +
2728
"\t public static " + name + " getInstance() {\n" +
@@ -37,26 +38,27 @@ String generateCode() {
3738
"\t \t " + extend + ".getInstance().setName(getName());\n" +
3839
"\t \t return;\n" +
3940
"\t }\n\n" +
40-
"\t public E get() {\n" +
41-
"\t \t return (E)" + extend + ".getInstance().get();\n" +
41+
"\t public "+type+" get() {\n" +
42+
"\t \t return ("+type+")" + extend + ".getInstance().get();\n" +
4243
"\t }\n\n" +
4344
"\t public void set(Object element) {\n" +
44-
"\t \t this.element = (E)element;\n" +
45+
"\t \t this.element = ("+type+")element;\n" +
4546
"\t \t " + extend + ".getInstance().set(this.element);\n" +
4647
"\t }\n\n" +
47-
"\t public E call() throws Exception {\n" +
48-
"\t \t return (E)" + extend + ".getInstance().call();\n" +
48+
"\t public "+type+" call() throws Exception {\n" +
49+
"\t \t return ("+type+")" + extend + ".getInstance().call();\n" +
4950
"\t }\n" +
5051
"}\n";
5152
return s;
5253
}
5354

5455
String generateObject() {
56+
String type = genTypes.next();
5557
String s = "package " + packageName + ";\n" +
5658
"import " + imports.next() + ";\n" +
5759
"@SuppressWarnings(\"all\")\n" +
58-
"public abstract class " + name + "<E> implements " + implement + "<E> {\n" +
59-
"public E element;\n" +
60+
"public abstract class " + name + "<"+type+"> implements " + implement + "<"+type+"> {\n" +
61+
"public "+type+" element;\n" +
6062
"public " + fields.next() + " field1;\n" +
6163
"public static " + name + " instance;\n" +
6264
"public static " + name + " getInstance() {\n" +
@@ -75,16 +77,16 @@ String generateObject() {
7577
"\t return;\n" +
7678
"}\n" +
7779

78-
"public E get() {\n" +
80+
"public "+type+" get() {\n" +
7981
"\t return element;\n" +
8082
"}\n" +
8183

8284
"public void set(Object element) {\n" +
83-
"\t this.element = (E)element;\n" +
85+
"\t this.element = ("+type+")element;\n" +
8486
"}\n" +
8587

86-
"public E call() throws Exception {\n" +
87-
"\t return (E)getInstance().call();\n" +
88+
"public "+type+" call() throws Exception {\n" +
89+
"\t return ("+type+")getInstance().call();\n" +
8890
"}\n" +
8991
"}\n";
9092
return s;

JavaProjectGenerator/src/de/loskutov/jpg/Interface.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,20 +11,21 @@ public class Interface extends JavaElement {
1111

1212
@Override
1313
String generateCode() {
14+
String type = genTypes.next();
1415
String s = "package " + packageName + ";\n\n" +
1516
"import " + imports.next() + ";\n\n" +
1617
"@SuppressWarnings(\"all\")\n" +
17-
"public interface " + name + "<E> extends " + extend + "<E> {\n\n" +
18+
"public interface " + name + "<"+type+"> extends " + extend + "<"+type+"> {\n\n" +
1819

1920
"\t " + fields.next() + " ifield = null;\n\n" +
2021

2122
"\t String getName();\n\n" +
2223

2324
"\t void setName(String s);\n\n" +
2425

25-
"\t E get();\n\n" +
26+
"\t "+type+" get();\n\n" +
2627

27-
"\t void set(E e);\n\n" +
28+
"\t void set("+type+" e);\n\n" +
2829
"}\n";
2930
return s;
3031
}

JavaProjectGenerator/src/de/loskutov/jpg/JavaElement.java

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
import java.nio.file.Path;
99
import java.util.Arrays;
1010
import java.util.List;
11+
import java.util.stream.Collectors;
12+
import java.util.stream.IntStream;
1113

1214
public abstract class JavaElement {
1315

@@ -45,16 +47,18 @@ public abstract class JavaElement {
4547
"javax.rmi.ssl.SslRMIClientSocketFactory"
4648
);
4749

50+
static List<String> LETTERS = IntStream.rangeClosed('A', 'Z').mapToObj(x -> String.valueOf((char)x))
51+
.collect(Collectors.toList());
52+
4853
String name;
4954
String packageName;
50-
Ring<String> imports;
51-
Ring<String> fields;
55+
static Ring<String> imports = new Ring<>(IMPORTS);
56+
static Ring<String> fields = new Ring<>(FIELDS);
57+
static Ring<String> genTypes = new Ring<>(LETTERS);
5258

5359
JavaElement(String name, String packageName){
5460
this.name = name;
5561
this.packageName = packageName;
56-
imports = new Ring<>(IMPORTS);
57-
fields = new Ring<>(FIELDS);
5862
}
5963

6064
abstract String generateCode();

JavaProjectGenerator/src/de/loskutov/jpg/Main.java

Lines changed: 34 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -14,26 +14,40 @@
1414
import java.util.stream.Stream;
1515

1616
public class Main {
17-
17+
1818
public static void main(String[] args) throws IOException {
19-
File rootDir = new File("./target/generated/");
20-
System.out.println("Writing to " + rootDir.getAbsolutePath());
21-
Path root = rootDir.toPath();
22-
23-
19+
String pathname = "./target/generated/";
20+
21+
int roots = 10;
2422
int depth = 10;
25-
int roots = 10;
2623
int classes = 100;
24+
if(args.length == 0) {
25+
System.out.println("No arguments given, using defaults");
26+
} else {
27+
try {
28+
roots = Integer.parseUnsignedInt(args[0]);
29+
depth = Integer.parseUnsignedInt(args[1]);
30+
classes = Integer.parseUnsignedInt(args[2]);
31+
pathname = args[3];
32+
} catch(Exception e) {
33+
//
34+
}
35+
}
36+
File rootDir = new File(pathname);
37+
Path root = rootDir.toPath();
38+
System.out.println("Writing to " + rootDir.getAbsolutePath());
39+
System.out.println("Roots: " + roots + ", depth: " + depth + ", classes & interfaces per package: " + (classes*2));
40+
System.out.println("Will generate " + roots + "x" + depth + "x" + classes + "x2 + 2 = " + (depth * roots* classes * 2 + 2) + " files");
2741

2842
new JavaBuilder(depth, roots, classes, root).build();
2943
}
3044
}
3145

3246
class JavaBuilder {
33-
47+
3448
static List<String> namesList = IntStream.rangeClosed('a', 'z').mapToObj(x -> String.valueOf((char)x))
3549
.collect(Collectors.toList());
36-
50+
3751
int depth;
3852
int roots;
3953
private Ring<String> pnames;
@@ -44,7 +58,7 @@ class JavaBuilder {
4458
private List<Interface> interfaces;
4559

4660
private int countClasses;
47-
61+
4862
public JavaBuilder(int depth, int roots, int countClasses, Path root) {
4963
this.depth = depth;
5064
this.roots = roots;
@@ -54,7 +68,7 @@ public JavaBuilder(int depth, int roots, int countClasses, Path root) {
5468
classes = new ArrayList<>();
5569
interfaces = new ArrayList<>();
5670
}
57-
71+
5872
void build() throws IOException {
5973
Files.walkFileTree(root, new SimpleFileVisitor<Path>() {
6074
@Override
@@ -70,13 +84,13 @@ public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOEx
7084
}
7185
});
7286
Files.createDirectories(root);
73-
87+
7488
List<Package> rootPackages = new ArrayList<>();
7589
for (int i = 0; i < roots; i++) {
7690
Package p = createPackage(pnames.next(), null);
7791
rootPackages.add(p);
7892
}
79-
93+
8094
for (Package r : rootPackages) {
8195
Stream<Package> stream = Stream.iterate(r, x -> new Package(pnames.next(), x)).limit(depth);
8296
stream.forEach(p -> {
@@ -97,30 +111,30 @@ private void generateFile(JavaElement e) {
97111
e1.printStackTrace();
98112
}
99113
}
100-
114+
101115
void createInterfaces(Package p) {
102116
Ring<Interface> toImplement = new Ring<>(interfaces, countClasses);
103117
if(interfaces.isEmpty()) {
104118
interfaces.add(new Interface("IFoo0", p.getFqn(), "java.util.concurrent.Callable"));
105119
}
106-
toImplement.stream().forEach(i -> {
120+
toImplement.stream().forEach(i -> {
107121
interfaces.add(new Interface("IFoo" + interfaces.size(), p.getFqn(), toImplement.next().fqn()));
108122
});
109123
}
110-
124+
111125
void createClasses(Package p) {
112126
Ring<Interface> implement = new Ring<>(interfaces, countClasses);
113127
Ring<Clazz> toExtend = new Ring<>(classes, countClasses);
114128
if (classes.isEmpty()) {
115-
classes.add(new Clazz("Element0", p.getFqn(), implement.next().fqn(), "java.lang.Object"));
129+
classes.add(new Clazz("Foo0", p.getFqn(), implement.next().fqn(), "java.lang.Object"));
116130
}
117131
toExtend.stream().forEach(x -> {
118-
classes.add(new Clazz("Element" + classes.size(), p.getFqn(), implement.next().fqn(), toExtend.next().fqn()));
132+
classes.add(new Clazz("Foo" + classes.size(), p.getFqn(), implement.next().fqn(), toExtend.next().fqn()));
119133
});
120134
}
121-
135+
122136
Package createPackage(String name, Package parent) {
123137
return new Package(name, parent);
124138
}
125-
139+
126140
}

JavaProjectGenerator/src/de/loskutov/jpg/Ring.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,31 +9,31 @@ public class Ring<E> {
99
private List<E> choices;
1010
int cursor = -1;
1111
private int limit;
12-
12+
1313
Ring(List<E> list){
1414
this(list, -1);
1515
}
16-
16+
1717
Ring(List<E> list, int limit){
1818
this.limit = limit;
1919
if(list instanceof ArrayList) {
2020
this.choices = list;
2121
} else {
2222
this.choices = new ArrayList<>(list);
2323
}
24-
Collections.shuffle(choices);
24+
// Collections.shuffle(choices);
2525
}
26-
26+
2727
E next() {
2828
cursor ++;
2929
if(cursor >= choices.size()) {
3030
cursor = 0;
3131
}
3232
return choices.get(cursor);
3333
}
34-
34+
3535
Stream<E> stream(){
36-
if(limit > 0) {
36+
if(limit > 0) {
3737
return Stream.generate(() -> next()).limit(limit);
3838
}
3939
return Stream.generate(() -> next());

0 commit comments

Comments
 (0)