31
31
import io .cdap .cdap .internal .app .runtime .ProgramRuntimeProviderLoader ;
32
32
import io .cdap .cdap .proto .ProgramType ;
33
33
import io .cdap .cdap .security .impersonation .EntityImpersonator ;
34
- import java .io .Closeable ;
35
34
import java .io .File ;
36
35
import java .util .Iterator ;
37
36
import javax .annotation .Nullable ;
@@ -48,21 +47,21 @@ final class ArtifactClassLoaderFactory {
48
47
private static final Logger LOG = LoggerFactory .getLogger (ArtifactClassLoaderFactory .class );
49
48
50
49
private final CConfiguration cConf ;
51
- @ Nullable
52
- private final ProgramRuntimeProviderLoader programRuntimeProviderLoader ;
50
+ @ Nullable private final ProgramRuntimeProviderLoader programRuntimeProviderLoader ;
53
51
private final File tmpDir ;
54
52
55
53
@ VisibleForTesting
56
54
ArtifactClassLoaderFactory (CConfiguration cConf ) {
57
55
this (cConf , null );
58
56
}
59
57
60
- ArtifactClassLoaderFactory (CConfiguration cConf ,
61
- @ Nullable ProgramRuntimeProviderLoader programRuntimeProviderLoader ) {
58
+ ArtifactClassLoaderFactory (
59
+ CConfiguration cConf , @ Nullable ProgramRuntimeProviderLoader programRuntimeProviderLoader ) {
62
60
this .cConf = cConf ;
63
61
this .programRuntimeProviderLoader = programRuntimeProviderLoader ;
64
- this .tmpDir = new File (cConf .get (Constants .CFG_LOCAL_DATA_DIR ),
65
- cConf .get (Constants .AppFabric .TEMP_DIR )).getAbsoluteFile ();
62
+ this .tmpDir =
63
+ new File (cConf .get (Constants .CFG_LOCAL_DATA_DIR ), cConf .get (Constants .AppFabric .TEMP_DIR ))
64
+ .getAbsoluteFile ();
66
65
}
67
66
68
67
/**
@@ -77,35 +76,30 @@ final class ArtifactClassLoaderFactory {
77
76
* {@link ClassLoader}, all temporary resources created for the classloader will be removed
78
77
*/
79
78
CloseableClassLoader createClassLoader (File unpackDir ) {
80
- ClassLoader sparkClassLoader = null ;
79
+ ClassLoader parentClassLoader = null ;
81
80
if (programRuntimeProviderLoader != null ) {
82
81
try {
83
82
// Try to create a ProgramClassLoader from the Spark runtime system if it is available.
84
83
// It is needed because we don't know what program types that an artifact might have.
85
84
// TODO: CDAP-5613. We shouldn't always expose the Spark classes.
86
- sparkClassLoader = programRuntimeProviderLoader .get (ProgramType .SPARK )
87
- .createProgramClassLoader (cConf , ProgramType .SPARK );
85
+ parentClassLoader =
86
+ programRuntimeProviderLoader
87
+ .get (ProgramType .SPARK )
88
+ .getRuntimeClassLoader (ProgramType .SPARK , cConf );
88
89
} catch (Exception e ) {
89
90
// If Spark is not supported, exception is expected. We'll use the default filter.
90
91
LOG .warn ("Spark is not supported. Not using ProgramClassLoader from Spark" );
91
92
LOG .trace ("Failed to create spark program runner with error:" , e );
92
93
}
93
94
}
94
-
95
- ProgramClassLoader programClassLoader = null ;
96
- if (sparkClassLoader != null ) {
97
- programClassLoader = new ProgramClassLoader (cConf , unpackDir , sparkClassLoader );
98
- } else {
99
- programClassLoader = new ProgramClassLoader (cConf , unpackDir ,
100
- FilterClassLoader .create (getClass ().getClassLoader ()));
95
+ if (parentClassLoader == null ) {
96
+ parentClassLoader = FilterClassLoader .create (getClass ().getClassLoader ());
101
97
}
102
98
103
- final ClassLoader finalProgramClassLoader = programClassLoader ;
104
- return new CloseableClassLoader (programClassLoader , () -> {
105
- if (finalProgramClassLoader instanceof Closeable ) {
106
- Closeables .closeQuietly ((Closeable ) finalProgramClassLoader );
107
- }
108
- });
99
+ ProgramClassLoader programClassLoader =
100
+ new ProgramClassLoader (cConf , unpackDir , parentClassLoader );
101
+ return new CloseableClassLoader (
102
+ programClassLoader , () -> Closeables .closeQuietly (programClassLoader ));
109
103
}
110
104
111
105
/**
@@ -117,18 +111,22 @@ CloseableClassLoader createClassLoader(File unpackDir) {
117
111
* {@link ClassLoader}, all temporary resources created for the classloader will be removed
118
112
* @see #createClassLoader(File)
119
113
*/
120
- CloseableClassLoader createClassLoader (Location artifactLocation ,
121
- EntityImpersonator entityImpersonator ) {
114
+ CloseableClassLoader createClassLoader (
115
+ Location artifactLocation , EntityImpersonator entityImpersonator ) {
122
116
try {
123
- ClassLoaderFolder classLoaderFolder = entityImpersonator .impersonate (
124
- () -> BundleJarUtil .prepareClassLoaderFolder (artifactLocation ,
125
- () -> DirUtils .createTempDir (tmpDir )));
117
+ ClassLoaderFolder classLoaderFolder =
118
+ entityImpersonator .impersonate (
119
+ () ->
120
+ BundleJarUtil .prepareClassLoaderFolder (
121
+ artifactLocation , () -> DirUtils .createTempDir (tmpDir )));
126
122
127
123
CloseableClassLoader classLoader = createClassLoader (classLoaderFolder .getDir ());
128
- return new CloseableClassLoader (classLoader , () -> {
129
- Closeables .closeQuietly (classLoader );
130
- Closeables .closeQuietly (classLoaderFolder );
131
- });
124
+ return new CloseableClassLoader (
125
+ classLoader ,
126
+ () -> {
127
+ Closeables .closeQuietly (classLoader );
128
+ Closeables .closeQuietly (classLoaderFolder );
129
+ });
132
130
} catch (Exception e ) {
133
131
throw Throwables .propagate (e );
134
132
}
@@ -143,8 +141,8 @@ CloseableClassLoader createClassLoader(Location artifactLocation,
143
141
* {@link ClassLoader}, all temporary resources created for the classloader will be removed
144
142
* @see #createClassLoader(File)
145
143
*/
146
- CloseableClassLoader createClassLoader (Iterator < Location > artifactLocations ,
147
- EntityImpersonator entityImpersonator ) {
144
+ CloseableClassLoader createClassLoader (
145
+ Iterator < Location > artifactLocations , EntityImpersonator entityImpersonator ) {
148
146
if (!artifactLocations .hasNext ()) {
149
147
throw new IllegalArgumentException ("Cannot create a classloader without an artifact." );
150
148
}
@@ -155,17 +153,20 @@ CloseableClassLoader createClassLoader(Iterator<Location> artifactLocations,
155
153
}
156
154
157
155
try {
158
- ClassLoaderFolder classLoaderFolder = entityImpersonator .impersonate (
159
- () -> BundleJarUtil .prepareClassLoaderFolder (artifactLocation ,
160
- () -> DirUtils .createTempDir (tmpDir )));
161
-
162
- CloseableClassLoader parentClassLoader = createClassLoader (artifactLocations ,
163
- entityImpersonator );
164
- return new CloseableClassLoader (new DirectoryClassLoader (classLoaderFolder .getDir (),
165
- parentClassLoader , "lib" ), () -> {
166
- Closeables .closeQuietly (parentClassLoader );
167
- Closeables .closeQuietly (classLoaderFolder );
168
- });
156
+ ClassLoaderFolder classLoaderFolder =
157
+ entityImpersonator .impersonate (
158
+ () ->
159
+ BundleJarUtil .prepareClassLoaderFolder (
160
+ artifactLocation , () -> DirUtils .createTempDir (tmpDir )));
161
+
162
+ CloseableClassLoader parentClassLoader =
163
+ createClassLoader (artifactLocations , entityImpersonator );
164
+ return new CloseableClassLoader (
165
+ new DirectoryClassLoader (classLoaderFolder .getDir (), parentClassLoader , "lib" ),
166
+ () -> {
167
+ Closeables .closeQuietly (parentClassLoader );
168
+ Closeables .closeQuietly (classLoaderFolder );
169
+ });
169
170
} catch (Exception e ) {
170
171
throw Throwables .propagate (e );
171
172
}
0 commit comments