6
6
*/
7
7
package org .mule .runtime .module .deployment .impl .internal .policy ;
8
8
9
+ import static org .mule .runtime .api .config .MuleRuntimeFeature .ENABLE_POLICY_ISOLATION ;
9
10
import static org .mule .runtime .api .util .Preconditions .checkArgument ;
10
11
import static org .mule .runtime .deployment .model .internal .DefaultRegionPluginClassLoadersFactory .getArtifactPluginId ;
11
12
import static org .mule .runtime .module .artifact .api .classloader .DefaultArtifactClassLoaderFilter .NULL_CLASSLOADER_FILTER ;
13
+ import static org .mule .runtime .module .artifact .internal .util .FeatureFlaggingUtils .isFeatureEnabled ;
12
14
import static org .mule .runtime .module .deployment .impl .internal .artifact .ArtifactFactoryUtils .validateArtifactLicense ;
13
15
14
16
import static java .lang .String .format ;
15
17
import static java .util .Collections .emptySet ;
16
18
import static java .util .stream .Collectors .toList ;
17
19
import static java .util .stream .Collectors .toSet ;
18
20
21
+ import org .mule .runtime .container .internal .IsolatedPolicyClassLoader ;
22
+ import org .mule .runtime .container .internal .FilteringContainerClassLoader ;
19
23
import org .mule .runtime .deployment .model .api .application .Application ;
20
24
import org .mule .runtime .deployment .model .api .plugin .ArtifactPlugin ;
21
25
import org .mule .runtime .deployment .model .api .plugin .resolver .PluginDependenciesResolver ;
22
26
import org .mule .runtime .deployment .model .api .policy .PolicyTemplate ;
23
27
import org .mule .runtime .deployment .model .api .policy .PolicyTemplateDescriptor ;
24
28
import org .mule .runtime .module .artifact .api .Artifact ;
25
29
import org .mule .runtime .module .artifact .api .classloader .MuleDeployableArtifactClassLoader ;
30
+ import org .mule .runtime .module .artifact .api .classloader .RegionClassLoader ;
26
31
import org .mule .runtime .module .artifact .api .descriptor .ArtifactPluginDescriptor ;
27
32
import org .mule .runtime .module .deployment .impl .internal .plugin .DefaultArtifactPlugin ;
28
33
import org .mule .runtime .module .license .api .LicenseValidator ;
@@ -61,24 +66,47 @@ public DefaultPolicyTemplateFactory(PolicyTemplateClassLoaderBuilderFactory poli
61
66
public PolicyTemplate createArtifact (Application application , PolicyTemplateDescriptor descriptor ) {
62
67
MuleDeployableArtifactClassLoader ownPolicyClassLoader ;
63
68
MuleDeployableArtifactClassLoader policyClassLoader ;
69
+ RegionClassLoader regionClassLoader ;
70
+ MuleDeployableArtifactClassLoader parentClassLoader ;
71
+ FilteringContainerClassLoader containerClassLoader =
72
+ policyTemplateClassLoaderBuilderFactory .getFilteringContainerClassLoader ();
73
+
64
74
65
75
final List <ArtifactPluginDescriptor > resolvedPolicyPluginsDescriptors =
66
76
resolvePolicyPluginDescriptors (application , descriptor );
67
77
final List <ArtifactPluginDescriptor > ownResolvedPluginDescriptors =
68
78
pluginDependenciesResolver .resolve (emptySet (), new ArrayList <>(descriptor .getPlugins ()), false );
69
79
70
80
try {
81
+ if (containerClassLoader != null && isPolicyIsolationEnabled (descriptor ) && hasRequiredPlugin (descriptor )) {
82
+ // When policy isolation is enabled, a new RegionClassLoader provides a separate
83
+ // classloading environment for the policy, preventing potential classloader
84
+ // conflicts (when using the same dependency in both policy and domain).
85
+ // IsolatedPolicyClassLoader then enforces this isolation.
86
+ regionClassLoader =
87
+ new RegionClassLoader (containerClassLoader .getArtifactId (),
88
+ containerClassLoader .getArtifactDescriptor (),
89
+ containerClassLoader ,
90
+ containerClassLoader .getClassLoaderLookupPolicy ());
91
+ parentClassLoader = IsolatedPolicyClassLoader
92
+ .getInstance (regionClassLoader );
93
+ } else {
94
+ parentClassLoader = application .getRegionClassLoader ();
95
+ }
96
+
71
97
ownPolicyClassLoader = policyTemplateClassLoaderBuilderFactory .createArtifactClassLoaderBuilder ()
72
98
.addArtifactPluginDescriptors (ownResolvedPluginDescriptors
73
99
.toArray (new ArtifactPluginDescriptor [ownResolvedPluginDescriptors .size ()]))
74
- .setParentClassLoader (application .getRegionClassLoader ()).setArtifactDescriptor (descriptor ).build ();
100
+ .setParentClassLoader (parentClassLoader )
101
+ .setArtifactDescriptor (descriptor ).build ();
75
102
76
103
// This classloader needs to be created after ownPolicyClassLoader so its inner classloaders override the entries in the
77
104
// ClassLoaderRepository for the application
78
105
policyClassLoader = policyTemplateClassLoaderBuilderFactory .createArtifactClassLoaderBuilder ()
79
106
.addArtifactPluginDescriptors (resolvedPolicyPluginsDescriptors
80
107
.toArray (new ArtifactPluginDescriptor [resolvedPolicyPluginsDescriptors .size ()]))
81
- .setParentClassLoader (application .getRegionClassLoader ()).setArtifactDescriptor (descriptor ).build ();
108
+ .setParentClassLoader (parentClassLoader )
109
+ .setArtifactDescriptor (descriptor ).build ();
82
110
} catch (Exception e ) {
83
111
throw new PolicyTemplateCreationException (createPolicyTemplateCreationErrorMessage (descriptor .getName ()), e );
84
112
}
@@ -95,6 +123,24 @@ public PolicyTemplate createArtifact(Application application, PolicyTemplateDesc
95
123
ownPolicyClassLoader ));
96
124
}
97
125
126
+ private boolean isPolicyIsolationEnabled (PolicyTemplateDescriptor descriptor ) {
127
+ return isFeatureEnabled (ENABLE_POLICY_ISOLATION , descriptor );
128
+ }
129
+
130
+ //
131
+ private boolean hasRequiredPlugin (PolicyTemplateDescriptor descriptor ) {
132
+ if (descriptor == null || descriptor .getPlugins () == null ) {
133
+ return false ;
134
+ }
135
+ Set <ArtifactPluginDescriptor > plugins = descriptor .getPlugins ();
136
+ for (ArtifactPluginDescriptor plugin : plugins ) {
137
+ if (plugin .getName ().equals ("HTTP" )) {
138
+ return true ;
139
+ }
140
+ }
141
+ return false ;
142
+ }
143
+
98
144
// Need all the plugins that the policy itself depends on, while keeping a relationship with the appropriate classloader.
99
145
private List <ArtifactPlugin > resolveOwnArtifactPlugins (List <ArtifactPlugin > artifactPlugins ,
100
146
List <ArtifactPluginDescriptor > ownResolvedPluginDescriptors ,
0 commit comments