blob: d858219deb426a464e2aeeab14401762ab8133b7 [file] [log] [blame]
// Copyright 2004 The Apache Software Foundation
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package org.apache.tapestry.enhance.javassist;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.LoaderClassPath;
import javassist.NotFoundException;
import org.apache.tapestry.IResourceResolver;
import org.apache.tapestry.enhance.CodeGenerationException;
import org.apache.tapestry.enhance.EnhancedClassLoader;
import org.apache.tapestry.enhance.IEnhancedClass;
import org.apache.tapestry.enhance.IEnhancedClassFactory;
/**
* This class defines the factory for creation of new Javassist enhanced classes.
* There is typically only one object of this class in the system.
* Common functionality objects for Javassist enhancement are stored here.
*
* @author Mindbridge
* @version $Id$
* @since 3.0
*/
public class EnhancedClassFactory implements IEnhancedClassFactory
{
private IResourceResolver _resourceResolver;
private EnhancedClassLoader _enhancedClassLoader;
private ClassPool _classPool;
private ClassMapping _typeMap = null;
public EnhancedClassFactory(IResourceResolver resourceResolver)
{
_resourceResolver = resourceResolver;
reset();
}
protected ClassPool createClassPool()
{
ClassLoader loader = _resourceResolver.getClassLoader();
// create a new ClassPool and make sure it uses the application resource resolver
ClassPool classPool = new ClassPool(null);
classPool.insertClassPath(new LoaderClassPath(loader));
return classPool;
}
/**
* @see org.apache.tapestry.enhance.IEnhancedClassFactory#reset()
*/
public synchronized void reset()
{
// create a new class pool and discard the previous one
_classPool = createClassPool();
_typeMap = new ClassMapping(_classPool);
ClassLoader loader = _resourceResolver.getClassLoader();
_enhancedClassLoader = new EnhancedClassLoader(loader);
}
/**
* @see org.apache.tapestry.enhance.IEnhancedClassFactory#createEnhancedClass(java.lang.String, java.lang.Class)
*/
public IEnhancedClass createEnhancedClass(String className, Class parentClass)
{
return new EnhancedClass(className, parentClass, this);
}
public ClassPool getClassPool()
{
return _classPool;
}
public ClassMapping getClassMapping()
{
return _typeMap;
}
/**
* Given the java class, returns the equivalent {@link CtClass type}. In addition,
* knows about scalar types, arrays of scalar types, java.lang.Object[] and
* java.lang.String[].
*
**/
public CtClass getObjectType(String type)
{
synchronized (this) {
CtClass result = getClassMapping().getType(type);
if (result == null)
{
try
{
result = _classPool.get(type);
getClassMapping().recordType(type, result);
}
catch (NotFoundException e)
{
throw new CodeGenerationException(e);
}
}
return result;
}
}
/**
* @return The class loader to be used to create the enhanced class
*/
public EnhancedClassLoader getEnhancedClassLoader()
{
return _enhancedClassLoader;
}
}