// Path: src/main/java/io/jvoid/configuration/JVoidConfiguration.java
// public interface JVoidConfiguration {
// 
//     String dbUrl();
// 
//     String dbUsername();
// 
//     String dbPassword();
// 
//     String basePackage();
// 
//     String excludes();
// 
//     String includes();
// 
//     Boolean heuristicExcludeCglib();
// 
//     Boolean heuristicExcludeJacoco();
// 
//     Boolean heuristicExcludeGroovyCallSite();
// 
// }
// 
// Path: src/main/java/io/jvoid/instrumentation/provider/api/ClassHandler.java
// public interface ClassHandler {
// 
//     void handleClass(CtClass ctClass) throws CannotCompileException;
// 
// }
// 
// Path: src/main/java/io/jvoid/instrumentation/provider/api/InstrumentationProvider.java
// public interface InstrumentationProvider {
// 
//     boolean matches(CtClass ctClass);
// 
//     List<ClassHandler> getClassHandlers(CtClass ctClass);
// 
//     List<MethodInstrumenter> getMethodInstrumenters(CtMethod ctMethod);
// 
// }
// 
// Path: src/main/java/io/jvoid/instrumentation/provider/api/MethodInstrumenter.java
// public interface MethodInstrumenter {
// 
//     void instrument(CtMethod ctMethod) throws CannotCompileException;
// 
//     boolean shouldInstrument(CtMethod ctMethod);
// 
// }


import java.util.Collections;
import java.util.List;
import com.google.inject.Inject;
import io.jvoid.configuration.JVoidConfiguration;
import io.jvoid.instrumentation.provider.api.ClassHandler;
import io.jvoid.instrumentation.provider.api.InstrumentationProvider;
import io.jvoid.instrumentation.provider.api.MethodInstrumenter;
import javassist.CtClass;
import javassist.CtMethod;
package io.jvoid.instrumentation.provider.app;




/**
 * JVoid instrumentation provider for the application classes.
 *
 */
public class AppInstrumentationProvider implements InstrumentationProvider {

    private AppClassHandler appClassHandler;
    private MethodInstrumenter trackerMethodInstrumenter;
    private JVoidConfiguration jvoidConfiguration;

    @Inject
    public AppInstrumentationProvider(AppClassHandler appClassHandler,
            TrackerMethodInstrumenter trackerMethodInstrumenter, JVoidConfiguration jvoidConfiguration) {
        super();
        this.appClassHandler = appClassHandler;
        this.trackerMethodInstrumenter = trackerMethodInstrumenter;
        this.jvoidConfiguration = jvoidConfiguration;
    }

    @Override
    public boolean matches(CtClass ctClass) {
// Path: src/main/java/io/jvoid/configuration/JVoidConfiguration.java
// public interface JVoidConfiguration {
// 
//     String dbUrl();
// 
//     String dbUsername();
// 
//     String dbPassword();
// 
//     String basePackage();
// 
//     String excludes();
// 
//     String includes();
// 
//     Boolean heuristicExcludeCglib();
// 
//     Boolean heuristicExcludeJacoco();
// 
//     Boolean heuristicExcludeGroovyCallSite();
// 
// }
// 
// Path: src/main/java/io/jvoid/instrumentation/provider/api/ClassHandler.java
// public interface ClassHandler {
// 
//     void handleClass(CtClass ctClass) throws CannotCompileException;
// 
// }
// 
// Path: src/main/java/io/jvoid/instrumentation/provider/api/InstrumentationProvider.java
// public interface InstrumentationProvider {
// 
//     boolean matches(CtClass ctClass);
// 
//     List<ClassHandler> getClassHandlers(CtClass ctClass);
// 
//     List<MethodInstrumenter> getMethodInstrumenters(CtMethod ctMethod);
// 
// }
// 
// Path: src/main/java/io/jvoid/instrumentation/provider/api/MethodInstrumenter.java
// public interface MethodInstrumenter {
// 
//     void instrument(CtMethod ctMethod) throws CannotCompileException;
// 
//     boolean shouldInstrument(CtMethod ctMethod);
// 
// }


// Path: src/main/java/io/jvoid/instrumentation/provider/app/AppInstrumentationProvider.java
import java.util.Collections;
import java.util.List;
import com.google.inject.Inject;
import io.jvoid.configuration.JVoidConfiguration;
import io.jvoid.instrumentation.provider.api.ClassHandler;
import io.jvoid.instrumentation.provider.api.InstrumentationProvider;
import io.jvoid.instrumentation.provider.api.MethodInstrumenter;
import javassist.CtClass;
import javassist.CtMethod;

package io.jvoid.instrumentation.provider.app;




/**
 * JVoid instrumentation provider for the application classes.
 *
 */
public class AppInstrumentationProvider implements InstrumentationProvider {

    private AppClassHandler appClassHandler;
    private MethodInstrumenter trackerMethodInstrumenter;
    private JVoidConfiguration jvoidConfiguration;

    @Inject
    public AppInstrumentationProvider(AppClassHandler appClassHandler,
            TrackerMethodInstrumenter trackerMethodInstrumenter, JVoidConfiguration jvoidConfiguration) {
        super();
        this.appClassHandler = appClassHandler;
        this.trackerMethodInstrumenter = trackerMethodInstrumenter;
        this.jvoidConfiguration = jvoidConfiguration;
    }

    @Override
    public boolean matches(CtClass ctClass) {
        JVoidConfiguration config = jvoidConfiguration;