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