Skip to content

Commit

Permalink
OpenLiberty#1102 load less classes on CDI bootstrap
Browse files Browse the repository at this point in the history
  • Loading branch information
Emily-Jiang committed Nov 28, 2017
1 parent 242f51b commit d6c14c0
Show file tree
Hide file tree
Showing 4 changed files with 66 additions and 53 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -173,7 +173,7 @@ public static Map<String, Class<?>> loadClasses(ClassLoader classLoader, Set<Str
}

@FFDCIgnore({ Throwable.class })
private static Class<?> loadClass(final ClassLoader classLoader, final String className) {
public static Class<?> loadClass(final ClassLoader classLoader, final String className) {

Class<?> clazz = null;
try {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@

import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;

import javax.enterprise.inject.spi.BeanManager;
Expand Down Expand Up @@ -77,15 +76,15 @@ public interface WebSphereBeanDeploymentArchive extends BeanDeploymentArchive {
*
* @param clazz
*/
void addToBeanClazzes(Class<?> clazz);
void addToBeanClazzes(String className);

/**
* Return the Set of ALL classes known about by this BDA. These classes are found by scanForBeans()
* so that method must have been called first.
*
* @return the map of all classes known about by this BDA
*/
public Map<String, Class<?>> getAllClazzes();
public Set<String> getAllClazzes();

/**
* Get the BeanManager for this BDA
Expand Down Expand Up @@ -234,7 +233,7 @@ public interface WebSphereBeanDeploymentArchive extends BeanDeploymentArchive {
* @param beanClass
* @return
*/
public boolean containsBeanClass(Class<?> beanClass);
public boolean containsBeanClass(String beanClass);

/**
* @return whether the bean archive has been scanned
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;

import javax.enterprise.inject.spi.AnnotatedField;
import javax.enterprise.inject.spi.AnnotatedType;
Expand Down Expand Up @@ -83,8 +82,9 @@ public class BeanDeploymentArchiveImpl implements WebSphereBeanDeploymentArchive
private final Set<String> allClassNames = new HashSet<String>();

//sorted maps
private final Map<String, Class<?>> allClasses = new TreeMap<String, Class<?>>();
private final Map<String, Class<?>> beanClasses = new TreeMap<String, Class<?>>();
private final Set<String> allClasses = new HashSet<String>();
private final Set<String> beanClasses = new HashSet<String>();
private final ClassLoader classloader;

private final Set<Class<?>> ejbClasses = new HashSet<Class<?>>();
private final Set<Class<?>> managedBeanClasses = new HashSet<Class<?>>();
Expand Down Expand Up @@ -150,6 +150,7 @@ public class BeanDeploymentArchiveImpl implements WebSphereBeanDeploymentArchive
this.id = archiveID;
this.eeModuleDescptorId = eeModuleDescptorId == null ? archiveID : eeModuleDescptorId;
this.archive = archive;
this.classloader = archive.getClassLoader();
this.cdiDeployment = cdiDeployment;
this.extensionCanSeeApplicationBDAs = extensionCanSeeApplicationBDAs;

Expand Down Expand Up @@ -297,8 +298,11 @@ public void scan() throws CDIException {
ClassLoader classLoader = archive.getClassLoader();

//first load all the classes in the BDA, including any configured additional classes
this.allClasses.putAll(CDIUtils.loadClasses(classLoader, this.allClassNames));
this.allClasses.putAll(CDIUtils.loadClasses(classLoader, this.additionalClasses));

/*
* this.allClasses.putAll(CDIUtils.loadClasses(classLoader, this.allClassNames));
* this.allClasses.putAll(CDIUtils.loadClasses(classLoader, this.additionalClasses));
*/

//scan the children
for (WebSphereBeanDeploymentArchive child : accessibleBDAs) {
Expand All @@ -312,11 +316,9 @@ public void scan() throws CDIException {

//and pull out the corresponding classes
for (String className : rawBeanclassNames) {
Class<?> clazz = this.allClasses.get(className);
if (clazz != null) {
if (clazz.getClassLoader() == classLoader || !isAccessibleBean(clazz)) {
this.beanClasses.put(className, clazz);
}

if (this.allClasses.contains(className)) {
this.beanClasses.add(className);
}
}

Expand All @@ -334,7 +336,7 @@ public void scan() throws CDIException {
}
}

private boolean isAccessibleBean(Class<?> beanClass) {
private boolean isAccessibleBean(String beanClass) {
boolean accessibleBean = false;
for (WebSphereBeanDeploymentArchive child : accessibleBDAs) {
if (child.containsBeanClass(beanClass)) {
Expand Down Expand Up @@ -374,7 +376,8 @@ private Set<String> scanForBeanClassNames() throws CDIException {
private void initializeInjectionClasses() throws CDIException {
Set<Class<?>> classes = new HashSet<Class<?>>();

classes.addAll(this.beanClasses.values());
//load the class now
classes.addAll(CDIUtils.loadClasses(this.archive.getClassLoader(), this.beanClasses).values());

if (archive.getType() == ArchiveType.CLIENT_MODULE) {
Map<String, Class<?>> clientClasses = getClientContainerManagedClasses();
Expand All @@ -398,11 +401,9 @@ private void initializeJEEComponentClasses() throws CDIException {
//it will soon include WebSockets as well

List<String> jeeComponentClassNames = archive.getInjectionClassList();
for (Map.Entry<String, Class<?>> entry : this.allClasses.entrySet()) {

String className = entry.getKey();
Class<?> clazz = entry.getValue();
for (String className : this.allClasses) {

Class<?> clazz = CDIUtils.loadClass(classloader, className);
if (jeeComponentClassNames.contains(className)) {
classes.add(clazz);
}
Expand Down Expand Up @@ -461,11 +462,14 @@ private void scanForEndpoints() throws CDIException {
for (ManagedBeanDescriptor<?> managedBeanDescriptor : managedBeanDescriptors) {
boolean added = false;
for (WebSphereBeanDeploymentArchive child : getWebSphereBeanDeploymentArchives()) {
if ((child.getAllClazzes().containsKey(managedBeanDescriptor.getBeanClass().getName()))
&& (child.getAllClazzes().containsValue(managedBeanDescriptor.getBeanClass()))) {
child.addManagedBeanDescriptor(managedBeanDescriptor);
added = true;
break;
if (child.getAllClazzes().contains(managedBeanDescriptor.getBeanClass().getName())) {
Class<?> clazz = CDIUtils.loadClass(classloader, managedBeanDescriptor.getBeanClass().getName());
if (clazz == managedBeanDescriptor.getBeanClass()) {

child.addManagedBeanDescriptor(managedBeanDescriptor);
added = true;
break;
}
}
}
if (!added) {
Expand All @@ -476,11 +480,13 @@ private void scanForEndpoints() throws CDIException {
for (EjbDescriptor<?> ejbDescriptor : ejbDescriptors) {
boolean added = false;
for (WebSphereBeanDeploymentArchive child : getWebSphereBeanDeploymentArchives()) {
if ((child.getAllClazzes().containsKey(ejbDescriptor.getBeanClass().getName()))
&& (child.getAllClazzes().containsValue(ejbDescriptor.getBeanClass()))) {
child.addEjbDescriptor(ejbDescriptor);
added = true;
break;
if (child.getAllClazzes().contains(ejbDescriptor.getBeanClass().getName())) {
Class<?> clazz = CDIUtils.loadClass(classloader, ejbDescriptor.getBeanClass().getName());
if (clazz == ejbDescriptor.getBeanClass()) {
child.addEjbDescriptor(ejbDescriptor);
added = true;
break;
}
}
}
if (!added) {
Expand Down Expand Up @@ -590,26 +596,21 @@ public boolean hasBeans() {
@Trivial
// This is marked trivial because it's called when iterating over all BDAs to look
// for a single class which causes lots of noise in the trace without adding any value
public Map<String, Class<?>> getAllClazzes() {
public Set<String> getAllClazzes() {
return allClasses;
}

@Override
public Collection<String> getBeanClasses() {
return beanClasses.keySet();
return beanClasses;
}

@Override
public boolean containsBeanClass(Class<?> clazz) {
public boolean containsBeanClass(String clazz) {
//check to see whether it contains this class
boolean containsBeanClass = false;

Class<?> beanClass = beanClasses.get(clazz.getName());
if (beanClass != null && clazz.equals(beanClass)) {
containsBeanClass = true;
}

return containsBeanClass;
return beanClasses.contains(clazz);
}

/*
Expand Down Expand Up @@ -800,7 +801,7 @@ public void addEjbDescriptor(EjbDescriptor<?> ejbDescriptor) {
if (getBeanDiscoveryMode() != BeanDiscoveryMode.NONE) {
this.ejbDescriptors.add(ejbDescriptor);
Class<?> beanClass = ejbDescriptor.getBeanClass();
this.beanClasses.put(beanClass.getName(), beanClass);
this.beanClasses.add(beanClass.getName());
this.ejbClasses.add(beanClass);
Set<EjbDescriptor<?>> ejbDescriptors = ejbDescriptorMap.get(beanClass);
if (ejbDescriptors == null) {
Expand All @@ -826,9 +827,9 @@ public CDIRuntime getCDIRuntime() {

/** {@inheritDoc} */
@Override
public void addToBeanClazzes(Class<?> clazz) {
this.beanClasses.put(clazz.getName(), clazz);
this.allClasses.put(clazz.getName(), clazz);
public void addToBeanClazzes(String className) {
this.beanClasses.add(className);
this.allClasses.add(className);
}

@Override
Expand All @@ -838,11 +839,11 @@ public void createInjectionTargetsForJEEComponentClasses() throws CDIException {
//jeeComponentClasses is per module but we have multiple bdas per module
//so if the class is not directly in this bda, check the descendant bdas
for (Class<?> clazz : jeeComponentClasses) {
if (allClasses.containsKey(clazz.getName())) {
if (allClasses.contains(clazz.getName())) {
createInjectionTargetsForJEEComponentClass(clazz);
} else {
for (WebSphereBeanDeploymentArchive child : getDescendantBdas()) {
if (child.getAllClazzes().containsKey(clazz.getName())) {
if (child.getAllClazzes().contains(clazz.getName())) {
child.createInjectionTargetsForJEEComponentClass(clazz);
break;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -406,15 +406,15 @@ private BeanDeploymentArchive findCandidateBDAtoAddThisClass(Class<?> beanClass)
for (WebSphereBeanDeploymentArchive wbda : getWebSphereBeanDeploymentArchives()) {

if (wbda.getClassLoader() == beanClass.getClassLoader()) {
wbda.addToBeanClazzes(beanClass);
wbda.addToBeanClazzes(beanClass.getName());
return wbda;

}
//if the cl is null, which means the classloader is the root classloader
//for this kind of bda, its id ends with CDIUtils.BDA_FOR_CLASSES_LOADED_BY_ROOT_CLASSLOADER
//all classes loaded by the root classloader should be in a bda with the id ends with CDIUtils.BDA_FOR_CLASSES_LOADED_BY_ROOT_CLASSLOADER
if ((beanClass.getClassLoader() == null) && (wbda.getId().endsWith(CDIUtils.BDA_FOR_CLASSES_LOADED_BY_ROOT_CLASSLOADER))) {
wbda.addToBeanClazzes(beanClass);
wbda.addToBeanClazzes(beanClass.getName());
return wbda;
}

Expand Down Expand Up @@ -517,7 +517,7 @@ public WebSphereBeanDeploymentArchive getBeanDeploymentArchive(Class<?> beanClas
// Note this method looks for BDA containing a **bean** of the given class
// We think this is the correct behavior for the weld CDI11Deployment interfaces
for (WebSphereBeanDeploymentArchive bda : deploymentDBAs.values()) {
if (bda.containsBeanClass(beanClass)) {
if (bda.containsBeanClass(beanClass.getName())) {
return bda;
}
}
Expand All @@ -534,10 +534,23 @@ public WebSphereBeanDeploymentArchive getBeanDeploymentArchiveFromClass(Class<?>

if (wbda == null) {
for (WebSphereBeanDeploymentArchive bda : orderedBDAs) {
if ((bda.getAllClazzes().containsKey(clazz.getName())) && (bda.getAllClazzes().containsValue(clazz))) {
wbda = bda;
classBDAMap.put(clazz, bda);
break;
if (bda.getAllClazzes().contains(clazz.getName())) {

Class<?> bdaClazz = null;
try {
bdaClazz = CDIUtils.loadClass(bda.getClassLoader(), clazz.getName());
} catch (CDIException e) {
// TODO Auto-generated catch block
// Do you need FFDC here? Remember FFDC instrumentation and @FFDCIgnore
// https://websphere.pok.ibm.com/~liberty/secure/docs/dev/API/com.ibm.ws.ras/com/ibm/ws/ffdc/annotation/FFDCIgnore.html
e.printStackTrace();
}
if (bdaClazz == clazz) {

wbda = bda;
classBDAMap.put(clazz, bda);
break;
}
}
}
}
Expand Down

0 comments on commit d6c14c0

Please sign in to comment.