// Path: h2hell-core/src/main/java/com/highway2urhell/domain/EntryPathData.java
// public class EntryPathData {
//     private String uri;
//     private String methodName;
//     private String className;
//     private String classNameNormalized;
//     private String signatureName;
//     private TypePath typePath = TypePath.UNKNOWN;
//     private Boolean audit = true;
//     private String httpMethod = "";
//     private List<EntryPathParam> listEntryPathData = new ArrayList<EntryPathParam>();
//     private Integer lineNumber;
// 
//     public Integer getLineNumber() {
// 		return lineNumber;
// 	}
// 
// 	public void setLineNumber(Integer lineNumber) {
// 		this.lineNumber = lineNumber;
// 	}
// 
// 	public Boolean getAudit() {
//         return audit;
//     }
// 
//     public void setAudit(Boolean audit) {
//         this.audit = audit;
//     }
// 
//     public String getUri() {
//         return uri;
//     }
// 
//     public void setUri(String uri) {
//         this.uri = uri;
//     }
// 
//     public String getMethodName() {
//         return methodName;
//     }
// 
//     public void setMethodName(String methodName) {
//         this.methodName = methodName;
//     }
// 
//     public String getClassName() {
//         return className;
//     }
// 
//     public void setClassName(String className) {
//         this.className = className;
//     }
// 
//     public String getClassNameNormalized() {
//         return classNameNormalized;
//     }
// 
//     public void setClassNameNormalized(String classNameNormalized) {
//         this.classNameNormalized = classNameNormalized;
//     }
// 
//     public String getSignatureName() {
//         return signatureName;
//     }
// 
//     public void setSignatureName(String signatureName) {
//         this.signatureName = signatureName;
//     }
// 
//     public TypePath getTypePath() {
//         return typePath;
//     }
// 
//     public void setTypePath(TypePath typePath) {
//         this.typePath = typePath;
//     }
// 
//     public String getHttpMethod() {
//         return httpMethod;
//     }
// 
//     public void setHttpMethod(String httpMethod) {
//         this.httpMethod = httpMethod;
//     }
// 
//     public List<EntryPathParam> getListEntryPathData() {
//         return listEntryPathData;
//     }
// 
//     public void setListEntryPathData(List<EntryPathParam> listEntryPathData) {
//         this.listEntryPathData = listEntryPathData;
//     }
// 
//     @Override
//     public String toString() {
//         return "EntryPathData [uri=" + uri + ", methodName=" + methodName
//                 + ", className=" + className + ", classNameNormalized="
//                 + classNameNormalized + ", signatureName=" + signatureName
//                 + ", typePath=" + typePath + ", httpMethod=" + httpMethod
//                 + "]";
//     }
// }
// 
// Path: h2hell-core/src/main/java/com/highway2urhell/domain/FilterEntryPath.java
// public class FilterEntryPath {
// 
//     private List<String> listFilter;
//     private String token;
//     private Boolean filter = false;
//     private Boolean packageOnly = false;
//     private Boolean classOnly = false;
//     private Boolean classMethod = false;
// 
//     public List<String> getListFilter() {
//         return listFilter;
//     }
// 
//     public Boolean getClassOnly() {
//         return classOnly;
//     }
// 
//     public void setClassOnly(Boolean classOnly) {
//         this.classOnly = classOnly;
//     }
// 
//     public void setListFilter(List<String> listFilter) {
//         this.listFilter = listFilter;
//     }
// 
//     public String getToken() {
//         return token;
//     }
// 
//     public void setToken(String token) {
//         this.token = token;
//     }
// 
//     public Boolean getFilter() {
//         return filter;
//     }
// 
//     public void setFilter(Boolean filter) {
//         this.filter = filter;
//     }
// 
//     public Boolean getPackageOnly() {
//         return packageOnly;
//     }
// 
//     public void setPackageOnly(Boolean packageOnly) {
//         this.packageOnly = packageOnly;
//     }
// 
//     public Boolean getClassMethod() {
//         return classMethod;
//     }
// 
//     @Override
//     public String toString() {
//         return "FilterEntryPath{" +
//                 "listFilter=" + listFilter +
//                 ", token='" + token + '\'' +
//                 ", filter=" + filter +
//                 ", packageOnly=" + packageOnly +
//                 ", classOnly=" + classOnly +
//                 ", classMethod=" + classMethod +
//                 '}';
//     }
// 
//     public void setClassMethod(Boolean classMethod) {
//         this.classMethod = classMethod;
//     }
// }


import com.highway2urhell.domain.EntryPathData;
import com.highway2urhell.domain.FilterEntryPath;
import java.lang.instrument.Instrumentation;
import java.lang.instrument.UnmodifiableClassException;
import java.util.*;
package com.highway2urhell.service;




public class TransformerService {

    public void transformAllClassScanByH2h(Instrumentation inst,
                                           Set<String> entryClassName) {
        for (String classNameNormalized : entryClassName) {
            String className = classNameNormalized.replaceAll("/", ".");
           System.err.println("Transform class "+ className);
            transformOneClass(inst, className);
        }

    }

    private void transformOneClass(Instrumentation inst, String className) {
        ClassLoader classLoader = Thread.currentThread()
                .getContextClassLoader();
        try {
            inst.retransformClasses(classLoader.loadClass(className));
        } catch (ClassNotFoundException e) {
           System.err.println("Error while transform Class"+className+" msg "+ e);
        } catch (UnmodifiableClassException e) {
            System.err.println("Error while transform Class"+className+" msg "+ e);
        }
    }

// Path: h2hell-core/src/main/java/com/highway2urhell/domain/EntryPathData.java
// public class EntryPathData {
//     private String uri;
//     private String methodName;
//     private String className;
//     private String classNameNormalized;
//     private String signatureName;
//     private TypePath typePath = TypePath.UNKNOWN;
//     private Boolean audit = true;
//     private String httpMethod = "";
//     private List<EntryPathParam> listEntryPathData = new ArrayList<EntryPathParam>();
//     private Integer lineNumber;
// 
//     public Integer getLineNumber() {
// 		return lineNumber;
// 	}
// 
// 	public void setLineNumber(Integer lineNumber) {
// 		this.lineNumber = lineNumber;
// 	}
// 
// 	public Boolean getAudit() {
//         return audit;
//     }
// 
//     public void setAudit(Boolean audit) {
//         this.audit = audit;
//     }
// 
//     public String getUri() {
//         return uri;
//     }
// 
//     public void setUri(String uri) {
//         this.uri = uri;
//     }
// 
//     public String getMethodName() {
//         return methodName;
//     }
// 
//     public void setMethodName(String methodName) {
//         this.methodName = methodName;
//     }
// 
//     public String getClassName() {
//         return className;
//     }
// 
//     public void setClassName(String className) {
//         this.className = className;
//     }
// 
//     public String getClassNameNormalized() {
//         return classNameNormalized;
//     }
// 
//     public void setClassNameNormalized(String classNameNormalized) {
//         this.classNameNormalized = classNameNormalized;
//     }
// 
//     public String getSignatureName() {
//         return signatureName;
//     }
// 
//     public void setSignatureName(String signatureName) {
//         this.signatureName = signatureName;
//     }
// 
//     public TypePath getTypePath() {
//         return typePath;
//     }
// 
//     public void setTypePath(TypePath typePath) {
//         this.typePath = typePath;
//     }
// 
//     public String getHttpMethod() {
//         return httpMethod;
//     }
// 
//     public void setHttpMethod(String httpMethod) {
//         this.httpMethod = httpMethod;
//     }
// 
//     public List<EntryPathParam> getListEntryPathData() {
//         return listEntryPathData;
//     }
// 
//     public void setListEntryPathData(List<EntryPathParam> listEntryPathData) {
//         this.listEntryPathData = listEntryPathData;
//     }
// 
//     @Override
//     public String toString() {
//         return "EntryPathData [uri=" + uri + ", methodName=" + methodName
//                 + ", className=" + className + ", classNameNormalized="
//                 + classNameNormalized + ", signatureName=" + signatureName
//                 + ", typePath=" + typePath + ", httpMethod=" + httpMethod
//                 + "]";
//     }
// }
// 
// Path: h2hell-core/src/main/java/com/highway2urhell/domain/FilterEntryPath.java
// public class FilterEntryPath {
// 
//     private List<String> listFilter;
//     private String token;
//     private Boolean filter = false;
//     private Boolean packageOnly = false;
//     private Boolean classOnly = false;
//     private Boolean classMethod = false;
// 
//     public List<String> getListFilter() {
//         return listFilter;
//     }
// 
//     public Boolean getClassOnly() {
//         return classOnly;
//     }
// 
//     public void setClassOnly(Boolean classOnly) {
//         this.classOnly = classOnly;
//     }
// 
//     public void setListFilter(List<String> listFilter) {
//         this.listFilter = listFilter;
//     }
// 
//     public String getToken() {
//         return token;
//     }
// 
//     public void setToken(String token) {
//         this.token = token;
//     }
// 
//     public Boolean getFilter() {
//         return filter;
//     }
// 
//     public void setFilter(Boolean filter) {
//         this.filter = filter;
//     }
// 
//     public Boolean getPackageOnly() {
//         return packageOnly;
//     }
// 
//     public void setPackageOnly(Boolean packageOnly) {
//         this.packageOnly = packageOnly;
//     }
// 
//     public Boolean getClassMethod() {
//         return classMethod;
//     }
// 
//     @Override
//     public String toString() {
//         return "FilterEntryPath{" +
//                 "listFilter=" + listFilter +
//                 ", token='" + token + '\'' +
//                 ", filter=" + filter +
//                 ", packageOnly=" + packageOnly +
//                 ", classOnly=" + classOnly +
//                 ", classMethod=" + classMethod +
//                 '}';
//     }
// 
//     public void setClassMethod(Boolean classMethod) {
//         this.classMethod = classMethod;
//     }
// }


// Path: h2hell-core/src/main/java/com/highway2urhell/service/TransformerService.java
import com.highway2urhell.domain.EntryPathData;
import com.highway2urhell.domain.FilterEntryPath;
import java.lang.instrument.Instrumentation;
import java.lang.instrument.UnmodifiableClassException;
import java.util.*;

package com.highway2urhell.service;




public class TransformerService {

    public void transformAllClassScanByH2h(Instrumentation inst,
                                           Set<String> entryClassName) {
        for (String classNameNormalized : entryClassName) {
            String className = classNameNormalized.replaceAll("/", ".");
           System.err.println("Transform class "+ className);
            transformOneClass(inst, className);
        }

    }

    private void transformOneClass(Instrumentation inst, String className) {
        ClassLoader classLoader = Thread.currentThread()
                .getContextClassLoader();
        try {
            inst.retransformClasses(classLoader.loadClass(className));
        } catch (ClassNotFoundException e) {
           System.err.println("Error while transform Class"+className+" msg "+ e);
        } catch (UnmodifiableClassException e) {
            System.err.println("Error while transform Class"+className+" msg "+ e);
        }
    }

    private Boolean filterEntry(FilterEntryPath filterEntryPath, EntryPathData entryPath) {