Skip to content

Commit

Permalink
Move manifest Class-Path entries to EAR for legacy behavior
Browse files Browse the repository at this point in the history
  • Loading branch information
tjwatson committed Aug 13, 2024
1 parent fd968d1 commit aa6137c
Show file tree
Hide file tree
Showing 4 changed files with 52 additions and 4 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,12 @@
import java.util.HashSet;
import java.util.Hashtable;
import java.util.IdentityHashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.Future;
import java.util.function.Predicate;

import org.osgi.framework.BundleContext;
import org.osgi.framework.FrameworkUtil;
Expand Down Expand Up @@ -177,6 +179,17 @@ public ModuleContainerInfoBase(ModuleHandler moduleHandler, List<ModuleMetaDataE
if (moduleClassesInfo != null) {
this.classesContainerInfo.addAll(moduleClassesInfo.getClassesContainers(moduleContainer));
}
NonPersistentCache cache = container.adapt(NonPersistentCache.class);
cache.addToCache(ModuleClassesContainerInfo.class, this);
}

public void moveClassesContainerInfos(Predicate<ContainerInfo> shouldMove) {
Iterator<ContainerInfo> containerInfos = classesContainerInfo.iterator();
while (containerInfos.hasNext()) {
if (shouldMove.test(containerInfos.next())) {
containerInfos.remove();
}
}
}

public ModuleMetaData createModuleMetaData(ApplicationInfo appInfo, SimpleDeployedAppInfoBase deployedApp) throws MetaDataException {
Expand Down
3 changes: 2 additions & 1 deletion dev/com.ibm.ws.app.manager.war/bnd.bnd
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,8 @@ instrument.classesExcludes: com/ibm/ws/app/manager/war/internal/resources/*.clas
com.ibm.ws.container.service;version=latest,\
com.ibm.ws.classloading;version=latest,\
com.ibm.ws.javaee.ddmodel;version=latest,\
com.ibm.ws.javaee.dd.common;version=latest
com.ibm.ws.javaee.dd.common;version=latest,\
com.ibm.ws.classloading.configuration;version=latest

-testpath: \
../build.sharedResources/lib/junit/old/junit.jar;version=file, \
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,12 +38,14 @@
import com.ibm.ws.app.manager.module.internal.DeployedModuleInfoImpl;
import com.ibm.ws.app.manager.module.internal.ModuleHandler;
import com.ibm.ws.app.manager.module.internal.ModuleInfoUtils;
import com.ibm.ws.classloading.configuration.GlobalClassloadingConfiguration;
import com.ibm.ws.container.service.annocache.AnnotationsBetaHelper;
// import com.ibm.ws.container.service.annotations.ContainerAnnotations; // PreBeta
// import com.ibm.ws.container.service.annocache.ContainerAnnotations; // PostBeta
import com.ibm.ws.container.service.app.deploy.ClientModuleInfo;
import com.ibm.ws.container.service.app.deploy.ConnectorModuleInfo;
import com.ibm.ws.container.service.app.deploy.ContainerInfo;
import com.ibm.ws.container.service.app.deploy.ContainerInfo.Type;
import com.ibm.ws.container.service.app.deploy.EJBModuleInfo;
import com.ibm.ws.container.service.app.deploy.ModuleClassesContainerInfo;
import com.ibm.ws.container.service.app.deploy.ModuleInfo;
Expand Down Expand Up @@ -76,6 +78,8 @@ public class EARDeployedAppInfo extends DeployedAppInfoBase {
private final ModuleHandler clientModuleHandler;
private final ModuleHandler connectorModuleHandler;

private final GlobalClassloadingConfiguration globalClassloadingConfig;

private final DeployedAppMBeanRuntime appMBeanRuntime;
private ServiceRegistration<?> mbeanServiceReg;

Expand Down Expand Up @@ -206,6 +210,7 @@ private ClassLoader basicCreateAppClassLoader() {
this.clientModuleHandler = factory.clientModuleHandler;
this.connectorModuleHandler = factory.connectorModuleHandler;
this.appMBeanRuntime = factory.appMBeanRuntime;
this.globalClassloadingConfig = factory.globalClassloadingConfig;

this.appDD = appDD;
this.altDDEnabled = (factory.platformVersion.compareTo(JavaEEVersion.VERSION_7_0) >= 0); // JavaEE7 or higher
Expand Down Expand Up @@ -498,9 +503,29 @@ private boolean createModules() {
Tr.debug(_tc, appPrefix + "Modules [ " + Integer.valueOf(moduleContainerInfos.size()) + " ]");
}

moveManifestClassPathToEar();
return true;
}

private void moveManifestClassPathToEar() {
if (!globalClassloadingConfig.useLegacyEARClassPath()) {
// Don't move unless configured to do so
return;
}
final Set<String> alreadyAdded = new HashSet<>();
for (ModuleContainerInfoBase moduleContainerInfo : moduleContainerInfos) {
moduleContainerInfo.moveClassesContainerInfos((c) -> {
if (c.getType() == Type.MANIFEST_CLASSPATH) {
if (alreadyAdded.add(c.getName())) {
this.manifestClassPathInfos.add(c);
}
return true;
}
return false;
});
}
}

// TODO: This is terribly ugly, but don't have clear rules
// on container paths: Handle paths with and without a
// trailing slash.
Expand Down Expand Up @@ -1002,6 +1027,7 @@ public ApplicationMonitoringInformation createApplicationMonitoringInformation()
//

private List<ContainerInfo> classpathContainerInfos;
private final List<ContainerInfo> manifestClassPathInfos = new ArrayList<>();

private List<ContainerInfo> getClasspathContainerInfos() {
if (classpathContainerInfos == null) {
Expand All @@ -1011,12 +1037,17 @@ private List<ContainerInfo> getClasspathContainerInfos() {
addEARLibContainerInfos(containerInfos);
addConnectorContainerInfos(containerInfos);
checkClientJarContainerInfos(containerInfos);
addModuleClassPathInfos(containerInfos);

classpathContainerInfos = containerInfos;
}
return classpathContainerInfos;
}

private void addModuleClassPathInfos(List<ContainerInfo> containerInfos) {
containerInfos.addAll(manifestClassPathInfos);
}

private void addEJBJarContainerInfos(List<ContainerInfo> classpathContainerInfos) {
try {
for (ModuleContainerInfoBase modInfo : moduleContainerInfos) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-2.0/
*
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
Expand Down Expand Up @@ -36,17 +36,17 @@
import com.ibm.ws.app.manager.module.DeployedAppServices;
import com.ibm.ws.app.manager.module.internal.ModuleHandler;
import com.ibm.ws.app.manager.war.internal.ZipUtils;
import com.ibm.ws.classloading.configuration.GlobalClassloadingConfiguration;
import com.ibm.ws.container.service.app.deploy.extended.ApplicationInfoForContainer;
import com.ibm.ws.javaee.dd.app.Application;
import com.ibm.ws.javaee.dd.app.Module;
import com.ibm.ws.javaee.version.JavaEEVersion;
import com.ibm.wsspi.adaptable.module.Container;
import com.ibm.wsspi.adaptable.module.InterpretedContainer;
import com.ibm.wsspi.adaptable.module.UnableToAdaptException;
import com.ibm.wsspi.adaptable.module.NonPersistentCache;
import com.ibm.wsspi.adaptable.module.UnableToAdaptException;
import com.ibm.wsspi.application.handler.ApplicationInformation;
import com.ibm.wsspi.kernel.service.location.WsResource;
import com.ibm.ws.container.service.app.deploy.extended.ApplicationInfoForContainer;

@Component(service = DeployedAppInfoFactory.class,
property = { "service.vendor=IBM", "type:String=ear" })
Expand All @@ -72,6 +72,9 @@ public class EARDeployedAppInfoFactoryImpl extends AbstractDeployedAppInfoFactor

private final String DEFAULT_APP_LOCATION = "${server.config.dir}/apps/expanded/";

@Reference
GlobalClassloadingConfiguration globalClassloadingConfig;

@Reference(service = JavaEEVersion.class,
cardinality = ReferenceCardinality.OPTIONAL,
policy = ReferencePolicy.DYNAMIC, policyOption = ReferencePolicyOption.GREEDY)
Expand Down

0 comments on commit aa6137c

Please sign in to comment.