private WeavingException weavingException(WovenClass wovenClass, Exception e) { String msg = format("There was a serious error trying to weave the class %s. See the associated exception for more information.", wovenClass.getClassName()); // This is a failure that should stop the class loading! LOGGER.error(msg, e); return new WeavingException(msg, e); } }
@Override public void weave(WovenClass wovenClass) { BundleWiring wiring = wovenClass.getBundleWiring(); Bundle bundle = wiring.getBundle(); ClassLoader cl = wiring.getClassLoader(); Collection<ClassTransformer> transformersToTry = getTransformers(bundle); for (ClassTransformer transformer : transformersToTry) { if (transformClass(wovenClass, cl, transformer)) { LOGGER.info("Weaving " + wovenClass.getClassName() + " using " + transformer.getClass().getName()); break; } } Class<?> dClass = wovenClass.getDefinedClass(); if (transformersToTry.isEmpty() && dClass != null && dClass.getAnnotation(Entity.class) != null) { LOGGER.warn("Loading " + wovenClass.getClassName() + " before transformer is present"); } }
public boolean isSuperClassWoven(WovenClass wovenClass) { ClassReader cReader = new ClassReader(wovenClass.getBytes()); try { Class<?> superClass = Class.forName(cReader.getSuperName().replace('/', '.'), false, wovenClass.getBundleWiring().getClassLoader()); return WovenProxy.class.isAssignableFrom(superClass); } catch (ClassNotFoundException e) { String failureMessage = NLS.MESSAGES.getMessage("fatal.weaving.failure", wovenClass.getClassName()); //This is a failure that should stop the class loading! LOGGER.error(failureMessage, e); throw new WeavingException(failureMessage, e); } }
@Override public void weave(WovenClass wovenClass) { BundleWiring wiring = wovenClass.getBundleWiring(); Bundle bundle = wiring.getBundle(); Boolean seen = bundleMap.get(wiring); if (seen != null) { return; } boolean requiresWeaving = false; if (isBeanBundle(bundle) || isExtension(bundle)) { log.debug("weaving {}", wovenClass.getClassName()); wovenClass.getDynamicImports().add("org.jboss.weld.*"); requiresWeaving = true; } bundleMap.put(wiring, requiresWeaving); }
@Override public void weave(WovenClass wovenClass) { if (wovenClass.getBundleWiring().getBundle() == puInfo.getBundle() && managedClasses.contains(wovenClass.getClassName())) { try { synchronized (this) { LOG.debug("weaving {}", wovenClass.getClassName()); byte[] transformed = transformer.transform(cl, wovenClass.getClassName(), wovenClass.getDefinedClass(), wovenClass.getProtectionDomain(), wovenClass.getBytes()); wovenClass.setBytes(transformed); /* * * TODO Hard-coded list of packages for OpenJPA and Eclipselink. We should only * add the ones required for the given provider. */ wovenClass.getDynamicImports().add("org.apache.openjpa.enhance"); wovenClass.getDynamicImports().add("org.apache.openjpa.util"); wovenClass.getDynamicImports().add("org.eclipse.persistence.*"); wovenClass.getDynamicImports().add("org.hibernate.*"); wovenClass.getDynamicImports().add("javassist.util.proxy"); } } catch (IllegalClassFormatException exc) { throw new WeavingException("cannot transform " + wovenClass.getClassName(), exc); } } }
if (!isEnabled(wovenClass.getClassName()) || isDisabled(wovenClass.getClassName())) { return; wovenClass.getClassName()), e); } else { throw weavingException(wovenClass, e);
if (!isEnabled(wovenClass.getClassName()) || isDisabled(wovenClass.getClassName())) { return; LOGGER.trace(NLS.MESSAGES.getMessage("cannot.weave", wovenClass.getClassName()), e); } else { String failureMessage = NLS.MESSAGES.getMessage("fatal.weaving.failure", wovenClass.getClassName());
private static boolean transformClass(WovenClass wovenClass, ClassLoader cl, ClassTransformer transformer) throws ThreadDeath, OutOfMemoryError { try { byte[] result = transformer .transform(cl, wovenClass.getClassName(), wovenClass.getDefinedClass(), wovenClass.getProtectionDomain(), wovenClass.getBytes()); if (result != null) { wovenClass.setBytes(result); wovenClass.getDynamicImports().add("org.eclipse.persistence.*"); wovenClass.getDynamicImports().add("org.apache.openjpa.*"); return true; } } catch (Exception t) { Bundle b = wovenClass.getBundleWiring().getBundle(); String msg = String.format("Weaving failure on class %s in bundle %s/%s using transformer %s", wovenClass.getClassName(), b.getSymbolicName(), b.getVersion(), transformer); throw new WeavingException(msg, t); } return false; }
@Override public void weave(WovenClass wovenClass) { Bundle consumerBundle = wovenClass.getBundleWiring().getBundle(); Set<WeavingData> wd = activator.getWeavingData(consumerBundle); if (wd != null) { activator.log(Level.FINE, "Weaving class " + wovenClass.getClassName()); ClassReader cr = new ClassReader(wovenClass.getBytes()); ClassWriter cw = new OSGiFriendlyClassWriter(ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES, wovenClass.getBundleWiring().getClassLoader()); TCCLSetterVisitor tsv = new TCCLSetterVisitor(cw, wovenClass.getClassName(), wd); cr.accept(tsv, ClassReader.SKIP_FRAMES); if (tsv.isWoven()) { wovenClass.setBytes(cw.toByteArray()); if (tsv.additionalImportRequired()) wovenClass.getDynamicImports().add(addedImport); if (activator.isLogEnabled(Level.FINEST)) { StringWriter stringWriter = new StringWriter(); ClassReader reader = new ClassReader(wovenClass.getBytes()); ClassVisitor tracer = new TraceClassVisitor(new PrintWriter(stringWriter)); ClassVisitor checker = new CheckClassAdapter(tracer, true); reader.accept(checker, 0); activator.log(Level.FINEST, "Woven class bytecode: \n" + stringWriter.toString()); } } } } }