/*******************************************************************************
* Copyright (c) 2007 Spring IDE Developers
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Spring IDE Developers - initial API and implementation
*******************************************************************************/
package org.springframework.ide.eclipse.core.type.asm;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import org.springframework.asm.ClassReader;
import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader;
/**
* Caching implementation of the {@link ClassReaderFactory} interface, caching a
* ClassReader per Spring Resource handle (i.e. per ".class" file).
* @author Christian Dupuis
* @author Juergen Hoeller
* @since 2.0.2
*/
public class CachingClassReaderFactory extends SimpleClassReaderFactory {
private final Map<Resource, ClassReader> classReaderCache =
new HashMap<Resource, ClassReader>();
/**
* Create a new CachingClassReaderFactory for the default class loader.
*/
public CachingClassReaderFactory() {
super();
}
/**
* Create a new CachingClassReaderFactory for the given resource loader.
* @param resourceLoader the Spring ResourceLoader to use (also determines
* the ClassLoader to use)
*/
public CachingClassReaderFactory(ResourceLoader resourceLoader) {
super(resourceLoader);
}
/**
* Create a new CachingClassReaderFactory for the given class loader.
* @param classLoader the ClassLoader to use
*/
public CachingClassReaderFactory(ClassLoader classLoader) {
super(classLoader);
}
public ClassReader getClassReader(Resource resource) throws IOException {
synchronized (this.classReaderCache) {
ClassReader classReader = this.classReaderCache.get(resource);
if (classReader == null) {
classReader = super.getClassReader(resource);
this.classReaderCache.put(resource, classReader);
}
return classReader;
}
}
}