001// Copyright 2011 The Apache Software Foundation 002// 003// Licensed under the Apache License, Version 2.0 (the "License"); 004// you may not use this file except in compliance with the License. 005// You may obtain a copy of the License at 006// 007// http://www.apache.org/licenses/LICENSE-2.0 008// 009// Unless required by applicable law or agreed to in writing, software 010// distributed under the License is distributed on an "AS IS" BASIS, 011// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 012// See the License for the specific language governing permissions and 013// limitations under the License. 014 015package org.apache.tapestry5.internal.plastic; 016 017public class PlasticClassLoader extends ClassLoader 018{ 019 static 020 { 021 // TAP5-2546 022 ClassLoader.registerAsParallelCapable(); 023 } 024 025 private final ClassLoaderDelegate delegate; 026 027 public PlasticClassLoader(ClassLoader parent, ClassLoaderDelegate delegate) 028 { 029 super(parent); 030 031 this.delegate = delegate; 032 } 033 034 @Override 035 protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException 036 { 037 synchronized(getClassLoadingLock(name)) 038 { 039 Class<?> loadedClass = findLoadedClass(name); 040 041 if (loadedClass != null) 042 return loadedClass; 043 044 if (delegate.shouldInterceptClassLoading(name)) 045 { 046 Class<?> c = delegate.loadAndTransformClass(name); 047 048 if (resolve) 049 resolveClass(c); 050 051 return c; 052 } else 053 { 054 return super.loadClass(name, resolve); 055 } 056 } 057 } 058 059 public synchronized Class<?> defineClassWithBytecode(String className, byte[] bytecode) 060 { 061 synchronized(getClassLoadingLock(className)) 062 { 063 return defineClass(className, bytecode, 0, bytecode.length); 064 } 065 } 066}