Skip to content

Commit b9bdff9

Browse files
committed
By moving the definition of the base data-set to the class visitor factory it is correctly tied to its implementation.
This removes all complexities with defining a custom data-set/class visitor.
1 parent cdd327e commit b9bdff9

5 files changed

Lines changed: 60 additions & 28 deletions

File tree

src/main/java/nl/rug/jbi/jsm/bcel/ClassVisitor.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package nl.rug.jbi.jsm.bcel;
22

33
import com.google.common.base.Preconditions;
4+
import com.google.common.collect.ImmutableSet;
45
import nl.rug.jbi.jsm.core.event.EventBus;
56
import org.apache.bcel.classfile.*;
67
import org.apache.bcel.classfile.Deprecated;
@@ -21,8 +22,17 @@
2122
* @since 2014-05-28
2223
*/
2324
public class ClassVisitor extends EmptyVisitor {
25+
public final static ImmutableSet<Class> DEFAULT_CLASSES = ImmutableSet.<Class>builder()
26+
.add(JavaClassDefinition.class)
27+
.add(MethodDefinition.class)
28+
.add(FieldDefinition.class)
29+
.add(ExceptionHandlerDefinition.class)
30+
.add(FieldAccessInstr.class)
31+
.add(InvokeMethodInstr.class)
32+
.add(TypeUseInstruction.class)
33+
.add(LocalVariableDefinition.class)
34+
.build();
2435
private final static Logger logger = LogManager.getLogger(ClassVisitor.class);
25-
2636
private final JavaClass visitedClass;
2737
private final EventBus eBus;
2838
private final ConstantPoolGen cp;

src/main/java/nl/rug/jbi/jsm/core/JSMCore.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package nl.rug.jbi.jsm.core;
22

3+
import com.google.common.base.Preconditions;
34
import nl.rug.jbi.jsm.bcel.CompositeBCELClassLoader;
45
import nl.rug.jbi.jsm.core.calculator.BaseMetric;
56
import nl.rug.jbi.jsm.core.calculator.MetricCollection;
@@ -25,7 +26,7 @@
2526
* @since 2014-06-01
2627
*/
2728
public class JSMCore {
28-
private final Pipeline pipe = new Pipeline();
29+
private final Pipeline pipe;
2930
private final ClassVisitorFactory cvFactory;
3031
private volatile boolean running = false;
3132

@@ -42,7 +43,10 @@ public JSMCore() {
4243
* @param cvFactory factory which produced the class visitors that are used during execution.
4344
*/
4445
public JSMCore(final ClassVisitorFactory cvFactory) {
46+
Preconditions.checkNotNull(cvFactory, "Factory cannot be NULL");
47+
4548
this.cvFactory = cvFactory;
49+
this.pipe = new Pipeline(this.cvFactory.getDefaultDataClasses());
4650
}
4751

4852
/**

src/main/java/nl/rug/jbi/jsm/core/execution/ClassVisitorFactory.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
import nl.rug.jbi.jsm.core.event.EventBus;
44
import org.apache.bcel.classfile.JavaClass;
55

6+
import java.util.Set;
7+
68
/**
79
* Factory for the ClassVisitor runnable, given the {@link org.apache.bcel.classfile.JavaClass} and the associated
810
* EventBus, a class visitor needs to be created which extracts data from the JavaClass and publishes it through the
@@ -23,4 +25,12 @@ public interface ClassVisitorFactory {
2325
* @return Runnable that will execute the class visitor.
2426
*/
2527
public Runnable createClassVisitor(final JavaClass targetClass, final EventBus eventBus);
28+
29+
/**
30+
* If the {@link nl.rug.jbi.jsm.bcel.ClassVisitor} is extended, this should return a super-set of
31+
* {@link nl.rug.jbi.jsm.bcel.ClassVisitor#DEFAULT_CLASSES}.
32+
*
33+
* @return The set of classes which get produced by the class visitors this factory creates.
34+
*/
35+
public Set<Class> getDefaultDataClasses();
2636
}

src/main/java/nl/rug/jbi/jsm/core/execution/JSMClassVisitorFactory.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
import nl.rug.jbi.jsm.core.event.EventBus;
55
import org.apache.bcel.classfile.JavaClass;
66

7+
import java.util.Set;
8+
79
public class JSMClassVisitorFactory implements ClassVisitorFactory {
810
public final static JSMClassVisitorFactory INSTANCE = new JSMClassVisitorFactory();
911

@@ -17,4 +19,9 @@ public void run() {
1719
}
1820
};
1921
}
22+
23+
@Override
24+
public Set<Class> getDefaultDataClasses() {
25+
return ClassVisitor.DEFAULT_CLASSES;
26+
}
2027
}

src/main/java/nl/rug/jbi/jsm/core/pipeline/Pipeline.java

Lines changed: 27 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,12 @@
22

33
import com.google.common.base.Function;
44
import com.google.common.base.Objects;
5+
import com.google.common.base.Preconditions;
56
import com.google.common.base.Predicate;
6-
import com.google.common.collect.*;
7-
import nl.rug.jbi.jsm.bcel.*;
7+
import com.google.common.collect.FluentIterable;
8+
import com.google.common.collect.Iterables;
9+
import com.google.common.collect.Lists;
10+
import com.google.common.collect.Maps;
811
import nl.rug.jbi.jsm.core.calculator.*;
912
import nl.rug.jbi.jsm.core.event.Subscribe;
1013
import nl.rug.jbi.jsm.core.event.UsingProducer;
@@ -15,7 +18,10 @@
1518
import java.lang.reflect.InvocationTargetException;
1619
import java.lang.reflect.Method;
1720
import java.lang.reflect.Modifier;
18-
import java.util.*;
21+
import java.util.Collections;
22+
import java.util.List;
23+
import java.util.Map;
24+
import java.util.Set;
1925

2026
import static com.google.common.base.Preconditions.checkArgument;
2127
import static com.google.common.base.Preconditions.checkNotNull;
@@ -31,36 +37,29 @@
3137
public class Pipeline {
3238
private final static Logger logger = LogManager.getLogger(Pipeline.class);
3339

34-
//This set contains all types of data that get produces for the first CLASS frame.
35-
private final static Set<Class> BASE_DATA_CLASSES = Sets.newTreeSet(new Comparator<Class>() {
36-
@Override
37-
public int compare(Class o1, Class o2) {
38-
return o1.getName().compareTo(o2.getName());
39-
}
40-
});
41-
42-
static {
43-
//Register the basic types produced by the BCELClassVisitor
44-
registerNewBaseData(JavaClassDefinition.class);
45-
registerNewBaseData(MethodDefinition.class);
46-
registerNewBaseData(FieldDefinition.class);
47-
registerNewBaseData(ExceptionHandlerDefinition.class);
48-
registerNewBaseData(FieldAccessInstr.class);
49-
registerNewBaseData(InvokeMethodInstr.class);
50-
registerNewBaseData(TypeUseInstruction.class);
51-
registerNewBaseData(LocalVariableDefinition.class);
52-
}
53-
5440
private final Map<MetricScope, HandlerMap> handlerMaps = Maps.newEnumMap(MetricScope.class);
5541
private final Map<MetricScope, PipelineFrame> frameMap = Maps.newEnumMap(MetricScope.class);
5642
private final Map<Class<? extends ProducerMetric>, ProducerMetric> registeredProducers = Maps.newHashMap();
5743

58-
public Pipeline() {
44+
/**
45+
* Creates a new pipeline-frame execution plan.
46+
*
47+
* @param defaultDataClasses The set of data available in the first frame of the class scope.
48+
*/
49+
public Pipeline(final Set<Class> defaultDataClasses) {
50+
Preconditions.checkNotNull(defaultDataClasses, "The set of default data classes cannot be NULL.");
51+
Preconditions.checkArgument(Iterables.all(defaultDataClasses, new Predicate<Class>() {
52+
@Override
53+
public boolean apply(Class aClass) {
54+
return aClass != null;
55+
}
56+
}), "The set of default data classes cannot contain NULL.");
57+
5958
this.handlerMaps.put(MetricScope.CLASS, new HandlerMap());
6059
this.handlerMaps.put(MetricScope.PACKAGE, new HandlerMap());
6160
this.handlerMaps.put(MetricScope.COLLECTION, new HandlerMap());
6261

63-
this.frameMap.put(MetricScope.CLASS, new PipelineFrame(MetricScope.CLASS, BASE_DATA_CLASSES));
62+
this.frameMap.put(MetricScope.CLASS, new PipelineFrame(MetricScope.CLASS, defaultDataClasses));
6463
this.frameMap.put(MetricScope.PACKAGE, new PipelineFrame(MetricScope.PACKAGE));
6564
this.frameMap.put(MetricScope.COLLECTION, new PipelineFrame(MetricScope.COLLECTION));
6665
}
@@ -71,9 +70,11 @@ public Pipeline() {
7170
* class are created to prevent exceptions related to unknown data-types.
7271
*
7372
* @param dataType The data-type to register within the initial CLASS frame.
73+
* @deprecated Definition moved to class visitor factory, since the set is tied to it.
7474
*/
75+
@Deprecated
7576
public static void registerNewBaseData(final Class dataType) {
76-
Pipeline.BASE_DATA_CLASSES.add(dataType);
77+
//NOOP
7778
}
7879

7980
private Pair<Class, HandlerExecutor> processMethod(final Method listener, final BaseMetric metric)

0 commit comments

Comments
 (0)