Skip to content

Commit 2f71269

Browse files
committed
Prevent duplicate entities
1 parent 4cb9bdd commit 2f71269

File tree

9 files changed

+212
-107
lines changed

9 files changed

+212
-107
lines changed

cdt-java-protocol-builder/src/main/java/com/github/kklisura/cdt/definition/builder/Application.java

Lines changed: 5 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -20,36 +20,30 @@
2020
* #L%
2121
*/
2222

23-
import com.github.javaparser.ast.CompilationUnit;
24-
import com.github.javaparser.printer.PrettyPrinter;
25-
import com.github.javaparser.printer.PrettyPrinterConfiguration;
26-
import com.github.javaparser.utils.SourceRoot;
2723
import com.github.kklisura.cdt.definition.builder.protocol.DevToolsProtocol;
2824
import com.github.kklisura.cdt.definition.builder.protocol.types.Domain;
2925
import com.github.kklisura.cdt.definition.builder.support.java.builder.Builder;
3026
import com.github.kklisura.cdt.definition.builder.support.java.builder.JavaBuilderFactory;
3127
import com.github.kklisura.cdt.definition.builder.support.java.builder.JavaClassBuilder;
3228
import com.github.kklisura.cdt.definition.builder.support.java.builder.JavaEnumBuilder;
3329
import com.github.kklisura.cdt.definition.builder.support.java.builder.JavaInterfaceBuilder;
30+
import com.github.kklisura.cdt.definition.builder.support.java.builder.SourceProject;
3431
import com.github.kklisura.cdt.definition.builder.support.java.builder.impl.JavaClassBuilderImpl;
3532
import com.github.kklisura.cdt.definition.builder.support.java.builder.impl.JavaEnumBuilderImpl;
3633
import com.github.kklisura.cdt.definition.builder.support.java.builder.impl.JavaInterfaceBuilderImpl;
34+
import com.github.kklisura.cdt.definition.builder.support.java.builder.impl.SourceProjectImpl;
3735
import com.github.kklisura.cdt.definition.builder.support.protocol.builder.CommandBuilder;
3836
import com.github.kklisura.cdt.definition.builder.support.protocol.builder.EventBuilder;
3937
import com.github.kklisura.cdt.definition.builder.support.protocol.builder.TypesBuilder;
4038
import com.github.kklisura.cdt.definition.builder.support.utils.DomainUtils;
4139
import com.github.kklisura.cdt.definition.builder.support.utils.StringUtils;
4240
import com.github.kklisura.cdt.definition.builder.utils.DevToolsProtocolUtils;
43-
import com.google.googlejavaformat.java.Formatter;
44-
import com.google.googlejavaformat.java.FormatterException;
45-
import com.google.googlejavaformat.java.JavaFormatterOptions;
4641
import java.io.FileInputStream;
4742
import java.io.IOException;
4843
import java.io.InputStream;
4944
import java.nio.file.Path;
5045
import java.util.ArrayList;
5146
import java.util.List;
52-
import java.util.function.Function;
5347
import org.kohsuke.args4j.CmdLineException;
5448
import org.kohsuke.args4j.CmdLineParser;
5549
import org.kohsuke.args4j.ParserProperties;
@@ -105,7 +99,7 @@ public static void main(String[] args) throws IOException {
10599
final DevToolsProtocol protocol = DevToolsProtocolUtils.readJson(inputStream);
106100

107101
Path outputLocation = configuration.getOutputProjectLocation().toPath().resolve(SRC_MAIN);
108-
SourceRoot sourceRoot = new SourceRoot(outputLocation);
102+
SourceProject sourceProject = new SourceProjectImpl(outputLocation);
109103

110104
JavaBuilderFactory javaBuilderFactory =
111105
new JavaBuilderFactory() {
@@ -154,35 +148,10 @@ public JavaInterfaceBuilder createInterfaceBuilder(
154148

155149
// Build all items
156150
for (Builder builder : builderList) {
157-
builder.build(sourceRoot);
151+
builder.build(sourceProject);
158152
}
159153

160-
PrettyPrinterConfiguration prettyPrinterConfiguration = new PrettyPrinterConfiguration();
161-
prettyPrinterConfiguration.setIndent("\t");
162-
prettyPrinterConfiguration.setPrintComments(true);
163-
prettyPrinterConfiguration.setPrintJavadoc(true);
164-
prettyPrinterConfiguration.setOrderImports(true);
165-
166-
PrettyPrinter prettyPrinter = new PrettyPrinter(prettyPrinterConfiguration);
167-
168-
JavaFormatterOptions javaFormatterOptions =
169-
JavaFormatterOptions.builder().style(JavaFormatterOptions.Style.GOOGLE).build();
170-
171-
sourceRoot.setPrinter(googleCodeFormatter(javaFormatterOptions, prettyPrinter::print));
172-
sourceRoot.saveAll(outputLocation);
173-
}
174-
175-
private static Function<CompilationUnit, String> googleCodeFormatter(
176-
JavaFormatterOptions options, Function<CompilationUnit, String> printer) {
177-
Formatter formatter = new Formatter(options);
178-
return compilationUnit -> {
179-
String source = printer.apply(compilationUnit);
180-
try {
181-
return formatter.formatSourceAndFixImports(source);
182-
} catch (FormatterException e) {
183-
throw new RuntimeException("Failed formatting source.", e);
184-
}
185-
};
154+
sourceProject.saveAll();
186155
}
187156

188157
private static Builder buildCommandFactory(List<Domain> domains, String basePackage) {

cdt-java-protocol-builder/src/main/java/com/github/kklisura/cdt/definition/builder/support/java/builder/Builder.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
2020
* #L%
2121
*/
2222

23-
import com.github.javaparser.utils.SourceRoot;
2423
import java.io.IOException;
2524

2625
/**
@@ -32,8 +31,8 @@ public interface Builder {
3231
/**
3332
* Builds an item. Generates a code.
3433
*
35-
* @param sourceRoot Source root.
34+
* @param sourceProject Source project.
3635
* @throws IOException If saving fails.
3736
*/
38-
void build(SourceRoot sourceRoot) throws IOException;
37+
void build(SourceProject sourceProject) throws IOException;
3938
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package com.github.kklisura.cdt.definition.builder.support.java.builder;
2+
3+
/*-
4+
* #%L
5+
* cdt-java-protocol-builder
6+
* %%
7+
* Copyright (C) 2018 Kenan Klisura
8+
* %%
9+
* Licensed under the Apache License, Version 2.0 (the "License");
10+
* you may not use this file except in compliance with the License.
11+
* You may obtain a copy of the License at
12+
*
13+
* http://www.apache.org/licenses/LICENSE-2.0
14+
*
15+
* Unless required by applicable law or agreed to in writing, software
16+
* distributed under the License is distributed on an "AS IS" BASIS,
17+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18+
* See the License for the specific language governing permissions and
19+
* limitations under the License.
20+
* #L%
21+
*/
22+
23+
import com.github.javaparser.ast.CompilationUnit;
24+
25+
/**
26+
* Source project.
27+
*
28+
* @author Kenan Klisura
29+
*/
30+
public interface SourceProject {
31+
/**
32+
* Adds a compilation unit to source-project.
33+
*
34+
* @param packageName Compilation unit package name.
35+
* @param name Name.
36+
* @param compilationUnit Compilation unit.
37+
*/
38+
void addCompilationUnit(String packageName, String name, CompilationUnit compilationUnit);
39+
40+
/** Saves all compilation units. */
41+
void saveAll();
42+
}

cdt-java-protocol-builder/src/main/java/com/github/kklisura/cdt/definition/builder/support/java/builder/impl/BaseBuilder.java

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,9 @@
2121
*/
2222

2323
import com.github.javaparser.ast.CompilationUnit;
24-
import com.github.javaparser.utils.CodeGenerationUtils;
25-
import com.github.javaparser.utils.SourceRoot;
2624
import com.github.kklisura.cdt.definition.builder.support.java.builder.Builder;
25+
import com.github.kklisura.cdt.definition.builder.support.java.builder.SourceProject;
2726
import java.io.IOException;
28-
import java.nio.file.Path;
2927
import lombok.Getter;
3028

3129
/**
@@ -67,16 +65,11 @@ protected String getPackageName() {
6765
/**
6866
* Builds an item. Generates a code.
6967
*
70-
* @param sourceRoot Root path to save generated code.
68+
* @param sourceProject Root path to save generated code.
7169
* @throws IOException If saving fails.
7270
*/
7371
@Override
74-
public void build(SourceRoot sourceRoot) throws IOException {
75-
String packageName = compilationUnit.getPackageDeclaration().get().getName().getIdentifier();
76-
77-
Path path = sourceRoot.getRoot().resolve(CodeGenerationUtils.packageToPath(packageName));
78-
79-
compilationUnit.setStorage(path.resolve(getName() + ".java"));
80-
sourceRoot.add(compilationUnit);
72+
public void build(SourceProject sourceProject) throws IOException {
73+
sourceProject.addCompilationUnit(getPackageName(), getName(), compilationUnit);
8174
}
8275
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
package com.github.kklisura.cdt.definition.builder.support.java.builder.impl;
2+
3+
/*-
4+
* #%L
5+
* cdt-java-protocol-builder
6+
* %%
7+
* Copyright (C) 2018 Kenan Klisura
8+
* %%
9+
* Licensed under the Apache License, Version 2.0 (the "License");
10+
* you may not use this file except in compliance with the License.
11+
* You may obtain a copy of the License at
12+
*
13+
* http://www.apache.org/licenses/LICENSE-2.0
14+
*
15+
* Unless required by applicable law or agreed to in writing, software
16+
* distributed under the License is distributed on an "AS IS" BASIS,
17+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18+
* See the License for the specific language governing permissions and
19+
* limitations under the License.
20+
* #L%
21+
*/
22+
23+
import static com.github.javaparser.utils.CodeGenerationUtils.packageToPath;
24+
25+
import com.github.javaparser.ast.CompilationUnit;
26+
import com.github.javaparser.printer.PrettyPrinter;
27+
import com.github.javaparser.printer.PrettyPrinterConfiguration;
28+
import com.github.javaparser.utils.SourceRoot;
29+
import com.github.kklisura.cdt.definition.builder.support.java.builder.SourceProject;
30+
import com.google.googlejavaformat.java.Formatter;
31+
import com.google.googlejavaformat.java.FormatterException;
32+
import com.google.googlejavaformat.java.JavaFormatterOptions;
33+
import java.nio.file.Path;
34+
import java.util.HashMap;
35+
import java.util.Map;
36+
import java.util.function.Function;
37+
38+
/**
39+
* Source project implementation.
40+
*
41+
* @author Kenan Klisura
42+
*/
43+
public class SourceProjectImpl implements SourceProject {
44+
private SourceRoot sourceRoot;
45+
private Path outputLocation;
46+
47+
private Map<String, CompilationUnit> compilationUnitCache;
48+
49+
public SourceProjectImpl(Path outputLocation) {
50+
this.sourceRoot = new SourceRoot(outputLocation);
51+
this.outputLocation = outputLocation;
52+
this.compilationUnitCache = new HashMap<>();
53+
}
54+
55+
@Override
56+
public void addCompilationUnit(String packageName, String name, CompilationUnit compilationUnit) {
57+
Path path = sourceRoot.getRoot().resolve(packageToPath(packageName));
58+
compilationUnit.setStorage(path.resolve(name + ".java"));
59+
60+
String compilationCacheKey = packageName + "." + name;
61+
62+
if (compilationUnitCache.containsKey(compilationCacheKey)) {
63+
CompilationUnit alreadyAdded = compilationUnitCache.get(compilationCacheKey);
64+
65+
if (!alreadyAdded.equals(compilationUnit)) {
66+
throw new RuntimeException(
67+
"Duplicate interface/class/enum found on " + compilationCacheKey);
68+
}
69+
}
70+
compilationUnitCache.put(compilationCacheKey, compilationUnit);
71+
72+
sourceRoot.add(compilationUnit);
73+
}
74+
75+
@Override
76+
public void saveAll() {
77+
PrettyPrinterConfiguration prettyPrinterConfiguration = new PrettyPrinterConfiguration();
78+
prettyPrinterConfiguration.setIndent("\t");
79+
prettyPrinterConfiguration.setPrintComments(true);
80+
prettyPrinterConfiguration.setPrintJavadoc(true);
81+
prettyPrinterConfiguration.setOrderImports(true);
82+
83+
PrettyPrinter prettyPrinter = new PrettyPrinter(prettyPrinterConfiguration);
84+
85+
JavaFormatterOptions javaFormatterOptions =
86+
JavaFormatterOptions.builder().style(JavaFormatterOptions.Style.GOOGLE).build();
87+
88+
sourceRoot.setPrinter(googleCodeFormatter(javaFormatterOptions, prettyPrinter::print));
89+
sourceRoot.saveAll(outputLocation);
90+
}
91+
92+
private static Function<CompilationUnit, String> googleCodeFormatter(
93+
JavaFormatterOptions options, Function<CompilationUnit, String> printer) {
94+
Formatter formatter = new Formatter(options);
95+
return compilationUnit -> {
96+
String source = printer.apply(compilationUnit);
97+
try {
98+
return formatter.formatSourceAndFixImports(source);
99+
} catch (FormatterException e) {
100+
throw new RuntimeException("Failed formatting source.", e);
101+
}
102+
};
103+
}
104+
}

cdt-java-protocol-builder/src/main/java/com/github/kklisura/cdt/definition/builder/support/java/builder/support/CombinedBuilders.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@
2020
* #L%
2121
*/
2222

23-
import com.github.javaparser.utils.SourceRoot;
2423
import com.github.kklisura.cdt.definition.builder.support.java.builder.Builder;
24+
import com.github.kklisura.cdt.definition.builder.support.java.builder.SourceProject;
2525
import java.io.IOException;
2626
import java.util.List;
2727

@@ -52,9 +52,9 @@ public List<Builder> getBuilderList() {
5252
}
5353

5454
@Override
55-
public void build(SourceRoot sourceRoot) throws IOException {
55+
public void build(SourceProject sourceProject) throws IOException {
5656
for (Builder builder : builderList) {
57-
builder.build(sourceRoot);
57+
builder.build(sourceProject);
5858
}
5959
}
6060
}

0 commit comments

Comments
 (0)