Skip to content

Commit ebd8c54

Browse files
committed
model can merge and ignore packages
1 parent f465a9e commit ebd8c54

File tree

10 files changed

+132
-24
lines changed

10 files changed

+132
-24
lines changed

code-assert-gui/src/main/java/guru/nidi/codeassert/gui/AppController.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,6 @@ public class AppController {
2525

2626
@GetMapping("model")
2727
public Model model(@RequestParam String jarfile) {
28-
return Model.from(new File(jarfile));
28+
return Model.from(new File(jarfile)).read();
2929
}
3030
}

code-assert/src/main/java/guru/nidi/codeassert/dependency/DependencyAnalyzer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ public class DependencyAnalyzer implements Analyzer<Dependencies> {
3333
private final DependencyCollector collector;
3434

3535
public DependencyAnalyzer(AnalyzerConfig config) {
36-
this(Model.from(config.getClasses()), DependencyRules.denyAll(), Scope.PACKAGES, new DependencyCollector());
36+
this(Model.from(config.getClasses()).read(), DependencyRules.denyAll(), Scope.PACKAGES, new DependencyCollector());
3737
}
3838

3939
public DependencyAnalyzer(Model model) {

code-assert/src/main/java/guru/nidi/codeassert/model/ClassFileParser.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,9 @@ CodeClass parse(InputStream is, Model model) throws IOException {
5454
final int flags = parseAccessFlags();
5555

5656
final String className = parseClassName();
57+
if (model.isIgnoreClass(className)) {
58+
return null;
59+
}
5760
final String superClassName = parseSuperClassName();
5861
final List<String> interfaceNames = parseInterfaces();
5962
final List<MemberInfo> fields = parseMembers();

code-assert/src/main/java/guru/nidi/codeassert/model/CodeClass.java

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ public class CodeClass extends UsingElement<CodeClass> {
4141
int codeSize;
4242
int totalSize;
4343
boolean concrete;
44+
int sourceSize;
4445
int codeLines;
4546
int commentLines;
4647
int emptyLines;
@@ -91,6 +92,10 @@ public boolean isConcrete() {
9192
return concrete;
9293
}
9394

95+
public int getSourceSize() {
96+
return sourceSize;
97+
}
98+
9499
public int getCodeLines() {
95100
return codeLines;
96101
}
@@ -160,17 +165,23 @@ public boolean isMatchedBy(LocationMatcher matcher) {
160165

161166
void addImport(String type, Model model) {
162167
if (!name.equals(type)) {
163-
final String packName = Model.packageOf(type);
164-
final CodePackage p = model.getOrCreatePackage(packName);
165-
usedPackages.add(p);
166-
pack.addEfferent(p);
167-
usedClasses.add(model.getOrCreateClass(type));
168+
final CodeClass clazz = model.getOrCreateClass(type);
169+
if (clazz != null) {
170+
final String packName = model.packageOf(type);
171+
final CodePackage p = model.getOrCreatePackage(packName);
172+
usedPackages.add(p);
173+
pack.addEfferent(p);
174+
usedClasses.add(clazz);
175+
}
168176
}
169177
}
170178

171179
void addAnnotation(String type, Model model) {
172-
addImport(type, model);
173-
annotations.add(model.getOrCreateClass(type));
180+
final CodeClass clazz = model.getOrCreateClass(type);
181+
if (clazz != null) {
182+
addImport(type, model);
183+
annotations.add(clazz);
184+
}
174185
}
175186

176187
public boolean equals(Object other) {

code-assert/src/main/java/guru/nidi/codeassert/model/CodeClassBuilder.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ public CodeClassBuilder addAttributeRefs(List<AttributeInfo> attributes) throws
9797

9898
public CodeClassBuilder addPackageInfo(Model model, String className) {
9999
if (className.endsWith(".package-info")) {
100-
final CodePackage pack = model.getOrCreatePackage(Model.packageOf(className));
100+
final CodePackage pack = model.getOrCreatePackage(model.packageOf(className));
101101
for (final CodeClass ann : clazz.getAnnotations()) {
102102
pack.addAnnotation(ann);
103103
}
@@ -115,7 +115,8 @@ public CodeClassBuilder addCodeSizes(int totalSize, List<MemberInfo> methods) {
115115
return this;
116116
}
117117

118-
public CodeClassBuilder addSourceSizes(int codeLines, int commentLines, int emptyLines, int totalLines) {
118+
public CodeClassBuilder addSourceSizes(int sourceSize, int codeLines, int commentLines, int emptyLines, int totalLines) {
119+
clazz.sourceSize = sourceSize;
119120
clazz.codeLines = codeLines;
120121
clazz.commentLines = commentLines;
121122
clazz.emptyLines = emptyLines;

code-assert/src/main/java/guru/nidi/codeassert/model/Model.java

Lines changed: 34 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -23,26 +23,35 @@
2323
import java.util.zip.ZipEntry;
2424

2525
import static java.util.Arrays.asList;
26+
import static java.util.Collections.emptyList;
2627

2728
public class Model {
2829
public static final String UNNAMED_PACKAGE = "<Unnamed Package>";
2930

3031
final Map<String, CodePackage> packages = new HashMap<>();
3132
final Map<String, CodeClass> classes = new HashMap<>();
33+
private final Set<String> ownPackages = new HashSet<>();
34+
private final List<String> ignorePackages;
35+
private final List<String> mergePackages;
3236

33-
public static Model from(File... files) {
34-
return from(asList(files));
37+
Model() {
38+
this(emptyList(), emptyList());
3539
}
3640

37-
public static Model from(List<File> files) {
38-
return new Model().and(files);
41+
Model(List<String> ignorePackages, List<String> mergePackages) {
42+
this.ignorePackages = ignorePackages;
43+
this.mergePackages = mergePackages;
3944
}
4045

41-
public Model and(File... files) {
42-
return and(asList(files));
46+
public static ModelBuilder from(File... files) {
47+
return from(asList(files));
4348
}
4449

45-
public Model and(List<File> files) {
50+
public static ModelBuilder from(List<File> files) {
51+
return new ModelBuilder().and(files);
52+
}
53+
54+
public Model read(List<File> files) {
4655
try {
4756
final ClassFileParser classParser = new ClassFileParser();
4857
for (final File file : files) {
@@ -70,7 +79,10 @@ private void add(ClassFileParser parser, String name, InputStream in) throws IOE
7079
}
7180
}
7281
} else if (name.endsWith(".class")) {
73-
parser.parse(in, this);
82+
final CodeClass clazz = parser.parse(in, this);
83+
if (clazz != null) {
84+
ownPackages.add(clazz.getPackageName());
85+
}
7486
}
7587
}
7688

@@ -84,6 +96,9 @@ CodePackage getOrCreatePackage(String name) {
8496
}
8597

8698
CodeClass getOrCreateClass(String name) {
99+
if (isIgnoreClass(name)) {
100+
return null;
101+
}
87102
CodeClass clazz = classes.get(name);
88103
if (clazz == null) {
89104
final CodePackage pack = getOrCreatePackage(packageOf(name));
@@ -94,9 +109,18 @@ CodeClass getOrCreateClass(String name) {
94109
return clazz;
95110
}
96111

97-
static String packageOf(String type) {
112+
String packageOf(String type) {
98113
final int pos = type.lastIndexOf('.');
99-
return pos < 0 ? UNNAMED_PACKAGE : type.substring(0, pos);
114+
final String pack = pos < 0 ? UNNAMED_PACKAGE : type.substring(0, pos);
115+
return mergePackages.stream().filter(pack::startsWith).findFirst().orElse(pack);
116+
}
117+
118+
boolean isIgnoreClass(String name) {
119+
return ignorePackages.stream().anyMatch(name::startsWith);
120+
}
121+
122+
public boolean isOwnPackage(CodePackage pack) {
123+
return ownPackages.contains(pack.getName());
100124
}
101125

102126
public Collection<CodePackage> getPackages() {
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
/*
2+
* Copyright © 2015 Stefan Niederhauser ([email protected])
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
package guru.nidi.codeassert.model;
17+
18+
import java.io.File;
19+
import java.util.ArrayList;
20+
import java.util.List;
21+
22+
import static java.util.Arrays.asList;
23+
24+
public class ModelBuilder {
25+
private final List<File> files = new ArrayList<>();
26+
private final List<String> ignorePackages = new ArrayList<>();
27+
private final List<String> mergePackages = new ArrayList<>();
28+
29+
public static ModelBuilder from(File... files) {
30+
return from(asList(files));
31+
}
32+
33+
public static ModelBuilder from(List<File> files) {
34+
return new ModelBuilder().and(files);
35+
}
36+
37+
public ModelBuilder and(File... files) {
38+
return and(asList(files));
39+
}
40+
41+
public ModelBuilder and(List<File> files) {
42+
this.files.addAll(files);
43+
return this;
44+
}
45+
46+
public ModelBuilder ignoringPackages(String... packages) {
47+
return ignoringPackages(asList(packages));
48+
}
49+
50+
public ModelBuilder ignoringPackages(List<String> packages) {
51+
ignorePackages.addAll(packages);
52+
return this;
53+
}
54+
55+
public ModelBuilder mergingPackages(String... packages) {
56+
return mergingPackages(asList(packages));
57+
}
58+
59+
public ModelBuilder mergingPackages(List<String> packages) {
60+
mergePackages.addAll(packages);
61+
return this;
62+
}
63+
64+
public Model read() {
65+
return new Model(ignorePackages,mergePackages).read(files);
66+
}
67+
}

code-assert/src/main/java/guru/nidi/codeassert/model/SourceFileParser.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ enum State {
4444
int commentLines;
4545
int emptyLines;
4646
int totalLines;
47+
int sourceSize;
4748

4849
static CodeClass parse(CodeClass clazz, File file, Charset charset) throws IOException {
4950
try (InputStream in = new FileInputStream(file)) {
@@ -71,7 +72,7 @@ static CodeClass parse(CodeClass clazz, Language language, Reader reader) throws
7172
} else {
7273
parser.parse(in);
7374
new CodeClassBuilder(clazz)
74-
.addSourceSizes(parser.codeLines, parser.commentLines, parser.emptyLines, parser.totalLines);
75+
.addSourceSizes(parser.sourceSize, parser.codeLines, parser.commentLines, parser.emptyLines, parser.totalLines);
7576
}
7677
return clazz;
7778
}
@@ -92,6 +93,7 @@ void parse(BufferedReader in) throws IOException {
9293
state = CODE;
9394
while ((line = in.readLine()) != null) {
9495
pos = 0;
96+
sourceSize += line.length() + 1; //TODO newline could also be 2 len, can we support this?
9597
totalLines++;
9698
if (line.trim().length() == 0) {
9799
emptyLines++;

code-assert/src/test/java/guru/nidi/codeassert/dependency/DependencyRulesTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ public class DependencyRulesTest {
5454

5555
@BeforeEach
5656
void analyze() {
57-
model = Model.from(AnalyzerConfig.maven().mainAndTest("guru/nidi/codeassert/dependency").getClasses());
57+
model = Model.from(AnalyzerConfig.maven().mainAndTest("guru/nidi/codeassert/dependency").getClasses()).read();
5858
}
5959

6060
@Test

code-assert/src/test/java/guru/nidi/codeassert/model/AnalyzerTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
import static org.junit.jupiter.api.Assertions.assertEquals;
2222

2323
class AnalyzerTest {
24-
final Model model = Model.from(AnalyzerConfig.maven().mainAndTest("guru/nidi/codeassert/model").getClasses());
24+
final Model model = Model.from(AnalyzerConfig.maven().mainAndTest("guru/nidi/codeassert/model").getClasses()).read();
2525

2626
@Test
2727
void packages() {

0 commit comments

Comments
 (0)