Skip to content

Commit 4b5310c

Browse files
committed
Merge branch 'release-0.3.0'
2 parents e8c594f + 137d2f0 commit 4b5310c

File tree

55 files changed

+2671
-462
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

55 files changed

+2671
-462
lines changed

.github/CODEOWNERS

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
# See https://help.github.com/articles/about-codeowners/
2+
3+
* @jamierocks

.gitignore

+1-1
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,6 @@ gradle-app.setting
229229
# End of https://www.gitignore.io/api/java,macos,linux,gradle,windows,intellij+all,intellij+iml
230230

231231
### Bombe ###
232-
bombe-*/build/
232+
bombe*/build/
233233

234234
test-classes/

bombe-asm/build.gradle

+2-3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
dependencies {
2-
compile project(':bombe-core')
3-
compile 'org.ow2.asm:asm-commons:6.2'
4-
compile 'com.github.ben-manes.caffeine:caffeine:2.6.2'
2+
compile project(':bombe')
3+
compile 'org.ow2.asm:asm-commons:7.0'
54
}

bombe-asm/src/main/java/me/jamiemansfield/bombe/asm/jar/JarWalker.java

-107
This file was deleted.

bombe-asm/src/main/java/me/jamiemansfield/bombe/asm/analysis/SourceSetInheritanceProvider.java renamed to bombe-asm/src/main/java/org/cadixdev/bombe/asm/analysis/ClassProviderInheritanceProvider.java

+18-21
Original file line numberDiff line numberDiff line change
@@ -28,41 +28,38 @@
2828
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2929
*/
3030

31-
package me.jamiemansfield.bombe.asm.analysis;
31+
package org.cadixdev.bombe.asm.analysis;
3232

33-
import com.github.benmanes.caffeine.cache.Caffeine;
34-
import com.github.benmanes.caffeine.cache.LoadingCache;
35-
import me.jamiemansfield.bombe.analysis.InheritanceProvider;
36-
import me.jamiemansfield.bombe.asm.jar.SourceSet;
33+
import org.cadixdev.bombe.analysis.InheritanceProvider;
34+
import org.cadixdev.bombe.asm.jar.ClassProvider;
35+
import org.objectweb.asm.ClassReader;
3736

3837
import java.util.Optional;
3938

4039
/**
41-
* An {@link InheritanceProvider} that obtains all of its information
42-
* from a given {@link SourceSet}.
40+
* An implementation of {@link InheritanceProvider} that retrieves all of
41+
* its information from a {@link ClassProvider}.
4342
*
4443
* @author Jamie Mansfield
45-
* @since 0.1.0
44+
* @since 0.3.0
4645
*/
47-
public class SourceSetInheritanceProvider implements InheritanceProvider {
46+
public class ClassProviderInheritanceProvider implements InheritanceProvider {
4847

49-
private final LoadingCache<String, ClassInfo> cache;
48+
private final ClassProvider provider;
5049

51-
public SourceSetInheritanceProvider(final SourceSet sources) {
52-
this.cache = Caffeine.newBuilder()
53-
.build(key -> {
54-
if (sources.has(key)) {
55-
return new ClassNodeClassInfo(sources.get(key));
56-
}
57-
else {
58-
return null;
59-
}
60-
});
50+
public ClassProviderInheritanceProvider(final ClassProvider provider) {
51+
this.provider = provider;
6152
}
6253

6354
@Override
6455
public Optional<ClassInfo> provide(final String klass) {
65-
return Optional.ofNullable(this.cache.get(klass));
56+
final byte[] classBytes = this.provider.get(klass);
57+
if (classBytes == null) return Optional.empty();
58+
59+
final ClassReader reader = new ClassReader(classBytes);
60+
final InheritanceClassInfoVisitor classInfoVisitor = new InheritanceClassInfoVisitor();
61+
reader.accept(classInfoVisitor, ClassReader.SKIP_CODE | ClassReader.SKIP_DEBUG | ClassReader.SKIP_FRAMES);
62+
return Optional.of(classInfoVisitor.create());
6663
}
6764

6865
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
/*
2+
* Copyright (c) 2018, Jamie Mansfield <https://jamiemansfield.me/>
3+
* All rights reserved.
4+
*
5+
* Redistribution and use in source and binary forms, with or without
6+
* modification, are permitted provided that the following conditions are met:
7+
*
8+
* Redistributions of source code must retain the above copyright notice, this
9+
* list of conditions and the following disclaimer.
10+
*
11+
* Redistributions in binary form must reproduce the above copyright notice,
12+
* this list of conditions and the following disclaimer in the documentation
13+
* and/or other materials provided with the distribution.
14+
*
15+
* Neither the name of the copyright holder nor the names of its
16+
* contributors may be used to endorse or promote products derived from
17+
* this software without specific prior written permission.
18+
*
19+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20+
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21+
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22+
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
23+
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24+
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
25+
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
26+
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
27+
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28+
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29+
*/
30+
31+
package org.cadixdev.bombe.asm.analysis;
32+
33+
import org.cadixdev.bombe.analysis.InheritanceProvider;
34+
import org.cadixdev.bombe.analysis.InheritanceType;
35+
import org.cadixdev.bombe.type.signature.FieldSignature;
36+
import org.cadixdev.bombe.type.signature.MethodSignature;
37+
import org.objectweb.asm.ClassVisitor;
38+
import org.objectweb.asm.FieldVisitor;
39+
import org.objectweb.asm.MethodVisitor;
40+
import org.objectweb.asm.Opcodes;
41+
42+
import java.util.Arrays;
43+
import java.util.Collections;
44+
import java.util.HashMap;
45+
import java.util.List;
46+
import java.util.Map;
47+
48+
class InheritanceClassInfoVisitor extends ClassVisitor {
49+
50+
private String name;
51+
private boolean isInterface;
52+
private String superName;
53+
private List<String> interfaces = Collections.emptyList();
54+
55+
private final Map<FieldSignature, InheritanceType> fields = new HashMap<>();
56+
private final Map<String, InheritanceType> fieldsByName = new HashMap<>();
57+
private final Map<MethodSignature, InheritanceType> methods = new HashMap<>();
58+
59+
InheritanceClassInfoVisitor() {
60+
super(Opcodes.ASM6);
61+
}
62+
63+
InheritanceProvider.ClassInfo create() {
64+
return new InheritanceProvider.ClassInfo.Impl(this.name, this.isInterface, this.superName, this.interfaces,
65+
this.fields, this.fieldsByName, this.methods);
66+
}
67+
68+
@Override
69+
public void visit(int version, int access, String name, String signature, String superName, String[] interfaces) {
70+
this.name = name;
71+
this.isInterface = (access & Opcodes.ACC_INTERFACE) != 0;
72+
this.superName = superName;
73+
this.interfaces = Arrays.asList(interfaces);
74+
}
75+
76+
@Override
77+
public FieldVisitor visitField(int access, String name, String descriptor, String signature, Object value) {
78+
InheritanceType type = InheritanceType.fromModifiers(access);
79+
this.fields.put(FieldSignature.of(name, descriptor), type);
80+
this.fieldsByName.put(name, type);
81+
return null;
82+
}
83+
84+
@Override
85+
public MethodVisitor visitMethod(int access, String name, String descriptor, String signature, String[] exceptions) {
86+
this.methods.put(MethodSignature.of(name, descriptor), InheritanceType.fromModifiers(access));
87+
return null;
88+
}
89+
90+
}

bombe-asm/src/main/java/me/jamiemansfield/bombe/asm/analysis/ClassNodeClassInfo.java renamed to bombe-asm/src/main/java/org/cadixdev/bombe/asm/jar/ClassLoaderClassProvider.java

+28-22
Original file line numberDiff line numberDiff line change
@@ -28,34 +28,40 @@
2828
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2929
*/
3030

31-
package me.jamiemansfield.bombe.asm.analysis;
31+
package org.cadixdev.bombe.asm.jar;
3232

33-
import me.jamiemansfield.bombe.analysis.InheritanceProvider;
34-
import me.jamiemansfield.bombe.type.signature.FieldSignature;
35-
import me.jamiemansfield.bombe.type.signature.MethodSignature;
36-
import org.objectweb.asm.tree.ClassNode;
33+
import org.cadixdev.bombe.util.ByteStreams;
34+
35+
import java.io.ByteArrayOutputStream;
36+
import java.io.IOException;
37+
import java.io.InputStream;
3738

3839
/**
39-
* An implementation of {@link InheritanceProvider.ClassInfo} using data
40-
* obtained through a {@link ClassNode}.
40+
* An implementation of {@link ClassProvider} backed by a {@link ClassLoader}.
4141
*
4242
* @author Jamie Mansfield
43-
* @since 0.1.0
43+
* @since 0.3.0
4444
*/
45-
class ClassNodeClassInfo extends InheritanceProvider.ClassInfo.Impl {
46-
47-
ClassNodeClassInfo(final ClassNode klass) {
48-
super(
49-
klass.name,
50-
klass.superName
51-
);
52-
this.interfaces.addAll(klass.interfaces);
53-
klass.fields.stream()
54-
.map(fieldNode -> FieldSignature.of(fieldNode.name, fieldNode.desc))
55-
.forEach(this.fields::add);
56-
klass.methods.stream()
57-
.map(methodNode -> MethodSignature.of(methodNode.name, methodNode.desc))
58-
.forEach(this.methods::add);
45+
public class ClassLoaderClassProvider implements ClassProvider {
46+
47+
private final ClassLoader loader;
48+
49+
public ClassLoaderClassProvider(final ClassLoader loader) {
50+
this.loader = loader;
51+
}
52+
53+
@Override
54+
public byte[] get(final String klass) {
55+
final String internalName = klass + ".class";
56+
57+
try (final InputStream in = this.loader.getResourceAsStream(internalName)) {
58+
final ByteArrayOutputStream baos = new ByteArrayOutputStream();
59+
ByteStreams.copy(in, baos);
60+
return baos.toByteArray();
61+
}
62+
catch (final IOException ignored) {
63+
return null;
64+
}
5965
}
6066

6167
}

0 commit comments

Comments
 (0)