boolean isNew = false;
// the name that uniquely defines persistence unit
String uniqueName;
String sessionName;
try {
SEPersistenceUnitInfo puInfo;
puInfo = initializer.findPersistenceUnitInfo(name, nonNullProperties, initializationHelper);
// either persistence unit not found or provider not supported
if(puInfo == null) {
return null;
}
if(initializer.isPersistenceUnitUniquelyDefinedByName()) {
uniqueName = name;
} else {
uniqueName = initializer.createUniquePersistenceUnitName(puInfo);
}
sessionName = EntityManagerSetupImpl.getOrBuildSessionName(nonNullProperties, puInfo, uniqueName);
synchronized (EntityManagerFactoryProvider.emSetupImpls) {
emSetupImpl = EntityManagerFactoryProvider.getEntityManagerSetupImpl(sessionName);
if(emSetupImpl == null) {
if(EntityManagerFactoryProvider.initialEmSetupImpls != null) {
// there may be initial emSetupImpl (possible only in SE that uses agent) remove it and use.
emSetupImpl = EntityManagerFactoryProvider.initialEmSetupImpls.remove(uniqueName);
if(emSetupImpl != null) {
// change the name
emSetupImpl.changeSessionName(sessionName);
// make sure we grab the classloader that may have
// been provided by the user. I.E. a DynamicClassLoader
puInfo.setClassLoader(classLoader);
}
}
if(emSetupImpl == null) {
// create and predeploy a new emSetupImpl
emSetupImpl = initializer.callPredeploy(puInfo, nonNullProperties, initializationHelper, uniqueName, sessionName);