1 /*
2 * Licensed to the Apache Software Foundation (ASF) under one or more
3 * contributor license agreements. See the NOTICE file distributed with
4 * this work for additional information regarding copyright ownership.
5 * The ASF licenses this file to You under the Apache License, Version 2.0
6 * (the "License"); you may not use this file except in compliance with
7 * the License. You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17 package org.apache.catalina.loader;
18
19 import org.apache.catalina.LifecycleException;
20 import org.apache.juli.logging.Log;
21 import org.apache.juli.logging.LogFactory;
22 import org.apache.tomcat.util.compat.JreCompat;
23
24 public class ParallelWebappClassLoader extends WebappClassLoaderBase {
25
26 private static final Log log = LogFactory.getLog(ParallelWebappClassLoader.class);
27
28 static {
29 if (!JreCompat.isGraalAvailable()) {
30 if (!ClassLoader.registerAsParallelCapable()) {
31 log.warn(sm.getString("webappClassLoaderParallel.registrationFailed"));
32 }
33 }
34 }
35
36 public ParallelWebappClassLoader() {
37 super();
38 }
39
40
41 public ParallelWebappClassLoader(ClassLoader parent) {
42 super(parent);
43 }
44
45
46 /**
47 * Returns a copy of this class loader without any class file
48 * transformers. This is a tool often used by Java Persistence API
49 * providers to inspect entity classes in the absence of any
50 * instrumentation, something that can't be guaranteed within the
51 * context of a {@link java.lang.instrument.ClassFileTransformer}'s
52 * {@link java.lang.instrument.ClassFileTransformer#transform(ClassLoader,
53 * String, Class, java.security.ProtectionDomain, byte[]) transform} method.
54 * <p>
55 * The returned class loader's resource cache will have been cleared
56 * so that classes already instrumented will not be retained or
57 * returned.
58 *
59 * @return the transformer-free copy of this class loader.
60 */
61 @Override
62 public ParallelWebappClassLoader copyWithoutTransformers() {
63
64 ParallelWebappClassLoader result = new ParallelWebappClassLoader(getParent());
65
66 super.copyStateWithoutTransformers(result);
67
68 try {
69 result.start();
70 } catch (LifecycleException e) {
71 throw new IllegalStateException(e);
72 }
73
74 return result;
75 }
76 }
77