{
Instruction i = ih.getInstruction();
if ((i instanceof GETFIELD) || (i instanceof PUTFIELD))
{
Field f;
FieldInstruction field = (FieldInstruction) i;
Constant c = m.getConstantPool().getConstant(field.getIndex());
ConstantFieldref fieldRef = (ConstantFieldref) c;
ConstantClass cclass = (ConstantClass) m.getConstantPool().getConstant(fieldRef.getClassIndex());
ConstantUtf8 utfClassName = (ConstantUtf8) m.getConstantPool().getConstant(cclass.getNameIndex());
String utfClassNameString = StringUtils.replaceAll(utfClassName.getBytes().toString(), "/", ".");
JavaClass fieldJavaClass = null;
try
{
fieldJavaClass = Repository.lookupClass(utfClassNameString);
}
catch (Throwable ex)
{
// catch Throwable, so it is compatible with latest BCEL changes in methods signature.
// It nows raises ClassNotFoundException. In order to be able to compible this code
// with bcel-5.1 or bcel-5.1+, we catch as throwable
JPOXLogger.ENHANCER.error(LOCALISER.msg("Enhancer.ClassNotFound", utfClassNameString, ex));
throw new JDOFatalException(LOCALISER.msg("Enhancer.ClassNotFound", utfClassNameString, ex));
}
if (fieldJavaClass == null)
{
throw new JDOFatalException(LOCALISER.msg("Enhancer.ClassNotFound", utfClassNameString,
new NullPointerException()));
}
f = BCELUtils.getFieldByName(field.getName(constantPoolGen), fieldJavaClass);
if (f == null)
{
String message = LOCALISER.msg("Enhancer.FieldIsNull", className, m.getName(), field.getName(constantPoolGen));
JPOXLogger.ENHANCER.error(message);
throw new NullPointerException(message);
}
ClassGen cg = BCELUtils.getClassByFieldByName(field.getName(constantPoolGen), fieldJavaClass);
BCELFieldPropertyMetaData fieldConfig = null;
BCELClassMetaData jdoConfigClass = ((BCELClassMetaData) cmd);
// the accessing class is not this
if (!cg.getClassName().equals(newClass.getClassName()))
{
jdoConfigClass = (BCELClassMetaData) cmd.getPackageMetaData().getFileMetaData().getMetaDataManager().getMetaDataForClass(
cg.getClassName(), clr);
}
if( jdoConfigClass != null )
{
AbstractMemberMetaData apmd = jdoConfigClass.findField(f);
if (apmd == null)
{
//check if a property(getter,setter) exists with this field name
if( jdoConfigClass.findProperty(f)==null )
{
//no fields netiher properties in the class, so something is wrong
String message = LOCALISER.msg("Enhancer.FieldConfigIsNullError", className + "." + f.getName());
JPOXLogger.ENHANCER.fatal(message);
throw new RuntimeException(message);
}
}
if( apmd != null && apmd.getPersistenceModifier() != FieldPersistenceModifier.NONE )
{
// do nothing
}
if (!isFieldAccessInPersistenceCapableClass(ih, m.getConstantPool()))
{
// do nothing
}
else if (fieldConfig != null && fieldConfig.getJdoFieldFlag() == 0)
{
// do nothing
}
else if (f.isStatic() || f.isFinal())
{
// do nothing
}
else if (BCELUtils.isSynthetic(f))
{
// do nothing
}
else
{
if (isDebugEnabled)
{
JPOXLogger.ENHANCER.debug(LOCALISER.msg("Enhancer.EnhanceOriginalMethod",
className + "." + m.getName(), f.getName()));
}
if( apmd != null && !apmd.isProperty() && apmd.getPersistenceModifier() != FieldPersistenceModifier.NONE)
{
//properties do not use jdoXXX methods
if (i instanceof GETFIELD)