public static void bootstrap(ClassLoader classLoader) {
Properties args = getAgentArgs(classLoader);
debug = (args.getProperty("debug", "false").equalsIgnoreCase("true"));
boolean enabled = (args.getProperty("enabled", "true").equalsIgnoreCase("true"));
if (!enabled) {
debug("disabled");
return;
}
try {
debug("searching for persistence.xml files");
ArrayList< URL > urls = Collections.list(classLoader.getResources("META-INF/persistence.xml"));
if (urls.size() == 0) {
debug("no persistence.xml files found");
return;
}
Map< String, Unit > units = new HashMap< String, Unit >();
for (URL url : urls) {
String urlPath = url.toExternalForm();
debug("found " + urlPath);
try {
InputStream in = url.openStream();
try {
collectUnits(in, units, args);
} catch (Throwable e) {
debug("failed to read " + urlPath, e);
in.close();
}
} catch (Throwable e) {
debug("failed to read " + urlPath, e);
}
}
for (Unit unit : units.values()) {
String provider = unit.provider;
String extraClassesKey = provider + "@classes";
String unitNameKey = provider + "@unitName";
String unitName = args.getProperty(unitNameKey, "classpath-bootstrap");
String classes = args.getProperty(extraClassesKey);
if (classes != null) {
debug("parsing value of " + extraClassesKey);
try {
List< String > list = Arrays.asList(classes.split("[ \n\r\t,]"));
unit.classes.addAll(list);
} catch (Exception e) {
debug("cannot parse: " + classes, e);
}
}
try {
// Hibernate doesn't use byte code modification
if (provider.startsWith("org.hibernate")) {
debug("skipping: " + provider);
continue;
} else {
debug("starting: " + provider);
}
PersistenceUnitInfoImpl info = new PersistenceUnitInfoImpl(new Handler());
info.setManagedClassNames(new ArrayList(unit.classes));
info.setPersistenceProviderClassName(unit.provider);
info.setProperties(new Properties());
info.setId(unitName);
info.setPersistenceUnitName(unitName);
info.setRootUrlAndJarUrls("", Collections.EMPTY_LIST);
info.setJtaDataSource(new NullDataSource());
info.setNonJtaDataSource(new NullDataSource());
info.setExcludeUnlistedClasses(true);
info.setClassLoader(classLoader);
for (String name : unit.classes) {
debug("class " + name);
}
Class clazz = classLoader.loadClass(unit.provider);
PersistenceProvider persistenceProvider = (PersistenceProvider) clazz.newInstance();
// Create entity manager factory
EntityManagerFactory emf = persistenceProvider.createContainerEntityManagerFactory(info, new HashMap());
debug("success: " + provider);
} catch (Throwable e) {
debug("failed: " + provider, e);
}
}
} catch (Throwable t) {
debug("error: ", t);
}
}
|