public ClasspathResourceMapper(Properties properties, ReferenceCache referenceCache, Mapper<String, ClassHolder> innerMapper) { this.innerMapper = innerMapper; this.referenceCache = referenceCache; Map<String, Transformation> transformationMap = new HashMap<>(); loadProperties(properties, transformationMap); transformations.addAll(transformationMap.values()); renamer = new ClassRefsRenamer(referenceCache, new CachedMapper<>(classNameMapper)); }
public ClasspathResourceMapper(ClassLoader classLoader, ReferenceCache referenceCache, Mapper<String, ClassHolder> innerMapper) { this.innerMapper = innerMapper; this.referenceCache = referenceCache; try { Enumeration<URL> resources = classLoader.getResources("META-INF/teavm.properties"); Map<String, Transformation> transformationMap = new HashMap<>(); while (resources.hasMoreElements()) { URL resource = resources.nextElement(); Properties properties = new Properties(); try (InputStream input = resource.openStream()) { properties.load(input); } loadProperties(properties, transformationMap); } transformations.addAll(transformationMap.values()); } catch (IOException e) { throw new RuntimeException("Error reading resources", e); } renamer = new ClassRefsRenamer(referenceCache, new CachedMapper<>(classNameMapper)); this.classLoader = classLoader; }
public ClasspathResourceMapper(ClassLoader classLoader, Mapper<String, ClassHolder> innerMapper) { this.innerMapper = innerMapper; try { Enumeration<URL> resources = classLoader.getResources("META-INF/teavm.properties"); Map<String, Transformation> transformationMap = new HashMap<>(); while (resources.hasMoreElements()) { URL resource = resources.nextElement(); Properties properties = new Properties(); try (InputStream input = resource.openStream()) { properties.load(input); } loadProperties(properties, transformationMap); } transformations.addAll(transformationMap.values()); } catch (IOException e) { throw new RuntimeException("Error reading resources", e); } renamer = new ClassRefsRenamer(new CachedMapper<>(classNameMapper)); this.classLoader = classLoader; }
private void transformControllers(final ClassHolder cls, ClassReaderSource classSource) { MethodDescriptor desc = new MethodDescriptor("initialize", void.class); cls.removeMethod(cls.getMethod(desc)); ClassReader patchClass = classSource.get(ControllersEmulator.class.getName()); MethodHolder patch = ModelUtils.copyMethod(patchClass.getMethod(desc)); ClassRefsRenamer renamer = new ClassRefsRenamer(preimage -> { if (preimage.equals(ControllersEmulator.class.getName())) { return Controllers.class.getName(); } return preimage; }); cls.addMethod(renamer.rename(patch)); } }
private void replaceClass(final ClassHolder cls, final ClassReader emuCls) { ClassRefsRenamer renamer = new ClassRefsRenamer(preimage -> preimage.equals(emuCls.getName()) ? cls.getName() : preimage); for (FieldHolder field : cls.getFields().toArray(new FieldHolder[0])) { cls.removeField(field); } for (MethodHolder method : cls.getMethods().toArray(new MethodHolder[0])) { cls.removeMethod(method); } for (FieldReader field : emuCls.getFields()) { cls.addField(ModelUtils.copyField(field)); } for (MethodReader method : emuCls.getMethods()) { cls.addMethod(renamer.rename(ModelUtils.copyMethod(method))); } } }