blob: ebf0351a34291d7f700f1addc1264538de76bbe8 [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 org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.tapestry.enhance.BaseEnhancedClass;
import org.apache.tapestry.enhance.EnhancedClassLoader;
import org.apache.tapestry.enhance.IEnhancer;
import org.apache.tapestry.enhance.MethodSignature;
import java.util.HashSet;
import java.util.Set;
/**
* Represents a class to be enhanced using Javassist.
*
* @author Mindbridge
* @version $Id$
* @since 3.0
*/
public class EnhancedClass extends BaseEnhancedClass
{
private static final Log LOG = LogFactory.getLog(EnhancedClass.class);
private String _className;
private Class _parentClass;
private EnhancedClassFactory _classFactory;
private ClassFabricator _classFabricator = null;
private Set _methods = new HashSet();
public EnhancedClass(String className, Class parentClass, EnhancedClassFactory classFactory)
{
_className = className;
_parentClass = parentClass;
_classFactory = classFactory;
}
/**
* @see org.apache.tapestry.enhance.IEnhancedClass#getClassName()
*/
public String getClassName()
{
return _className;
}
public CtClass getObjectType(String type)
{
return _classFactory.getObjectType(type);
}
public ClassFabricator getClassFabricator()
{
if (_classFabricator == null)
{
CtClass jaParentClass = getObjectType(_parentClass.getName());
ClassPool classPool = _classFactory.getClassPool();
_classFabricator = new ClassFabricator(_className, jaParentClass, classPool);
}
return _classFabricator;
}
/**
* @see org.apache.tapestry.enhance.IEnhancedClass#createProperty(java.lang.String, java.lang.String)
*/
public void createProperty(String propertyName, String propertyType)
{
createProperty(propertyName, propertyType, null, false);
}
/**
* @see org.apache.tapestry.enhance.IEnhancedClass#createProperty(java.lang.String, java.lang.String, java.lang.String, boolean)
*/
public void createProperty(
String propertyName,
String propertyType,
String readMethodName,
boolean persistent)
{
IEnhancer enhancer =
new CreatePropertyEnhancer(
propertyName,
getObjectType(propertyType),
readMethodName,
persistent);
addEnhancer(enhancer);
}
/**
* @see org.apache.tapestry.enhance.IEnhancedClass#createAutoParameter(java.lang.String, java.lang.String, java.lang.String, java.lang.String)
*/
public void createAutoParameter(
String propertyName,
String parameterName,
String typeClassName,
String readMethodName)
{
IEnhancer enhancer =
new CreateAutoParameterEnhancer(
this,
propertyName,
parameterName,
getObjectType(typeClassName),
readMethodName);
addEnhancer(enhancer);
}
/**
* @see org.apache.tapestry.enhance.IEnhancedClass#createEnhancedSubclass()
*/
public Class createEnhancedSubclass()
{
performEnhancement();
ClassFabricator cf = getClassFabricator();
cf.commit();
String enhancedClassName = getClassName();
byte[] enhancedClassBytes = cf.getByteCode();
EnhancedClassLoader loader = _classFactory.getEnhancedClassLoader();
return loader.defineClass(
enhancedClassName,
enhancedClassBytes,
_parentClass.getProtectionDomain());
}
public void addInterface(Class type)
{
getClassFabricator().addInterface(type);
}
public void addMethod(int modifiers, MethodSignature signature, String body)
{
getClassFabricator().addMethod(modifiers, signature, body);
_methods.add(signature);
}
public void addField(String name, Class type)
{
getClassFabricator().createField(getClassFabricator().getCtClass(type), name);
}
public void addConstructor(Class[] parameterTypes, Class[] exceptions, String body)
{
getClassFabricator().addConstructor(parameterTypes, exceptions, body);
}
public boolean containsMethod(MethodSignature signature)
{
return _methods.contains(signature);
}
}