package com.highway2urhell.transformer; import javassist.CtClass; import javassist.CtConstructor; public class GWTTransformer extends AbstractLeechTransformer { public GWTTransformer() { super("com/google/gwt/user/server/rpc/RemoteServiceServlet"); addImportPackage("java.lang.reflect", "java.util", "org.reflections", "org.reflections.util", "org.reflections.util.ClasspathHelper", "org.objectweb.asm", "com.google.gwt.user.client.rpc", "java.util.Map"); } @Override protected void doTransform(CtClass cc) throws Exception { CtConstructor c = cc.getConstructor("()V"); String h2hHookCode = "" + "List listEntryPath = new ArrayList();" + "final Set urlClassLoader = ClasspathHelper.forClassLoader(null);" + "Reflections reflections = new Reflections(new ConfigurationBuilder().setUrls(urlClassLoader));" + "Set setGwtService = reflections.getTypesAnnotatedWith(RemoteServiceRelativePath.class);" + "Iterator iter = setGwtService.iterator();" + "while (iter.hasNext()) {" + " Class c = (Class) iter.next();" + " RemoteServiceRelativePath remoteAnnotation = (RemoteServiceRelativePath) c.getAnnotation(RemoteServiceRelativePath.class);" + " try {" + " Set setGwtServiceServer = reflections.getSubTypesOf(Class.forName(c.getName()));" + " Iterator iterServer = setGwtServiceServer.iterator();" + " while (iterServer.hasNext()) {" + " Class realName = (Class) iterServer.next();" + " Method[] tabMethod = realName.getDeclaredMethods();" + " for (int j=0;j<tabMethod.length;j++) {" + " EntryPathData entry = new EntryPathData();" + " entry.setTypePath(TypePath.DYNAMIC);" + " entry.setHttpMethod(\"POST\");" + " entry.setClassName(realName.getName());" + " entry.setMethodName(tabMethod[j].getName());" + " entry.setUri(remoteAnnotation.value());" + " entry.setSignatureName(org.objectweb.asm.Type.getMethodDescriptor(tabMethod[j]));" + " listEntryPath.add(entry);" + " }" + " }" + " } catch (ClassNotFoundException e) {" + " e.printStackTrace();" + " }" + "}" + "CoreEngine.getInstance().getFramework(\"GWT\").receiveData(listEntryPath);"; c.insertBefore(h2hHookCode); } }