1 28 29 package org.jibx.binding.classes; 30 31 import org.apache.bcel.Constants; 32 import org.apache.bcel.generic.*; 33 import org.jibx.runtime.JiBXException; 34 35 43 44 public class UnmarshalBuilder extends MarshalUnmarshalBuilder 45 { 46 49 private static final String UNMARSHALCONTEXT_CLASS = 50 "org.jibx.runtime.impl.UnmarshallingContext"; 51 protected static final String UNMARSHAL_EXCEPTION_TEXT = 52 "Error while unmarshalling "; 53 protected static final String UNMARSHALLING_POSITION_METHOD = 54 "org.jibx.runtime.impl.UnmarshallingContext.buildPositionString"; 55 protected static final String UNMARSHALLING_POSITION_SIGNATURE = 56 "()Ljava/lang/String;"; 57 protected static final Type[] UNMARSHAL_METHOD_ARGS = 58 { 59 new ObjectType("org.jibx.runtime.impl.UnmarshallingContext") 60 }; 61 protected static final Type[] SINGLE_STRING_ARGS = 62 { 63 Type.STRING 64 }; 65 66 77 78 public UnmarshalBuilder(String name, ClassFile cf, ClassFile mf) 79 throws JiBXException { 80 super(name, Type.VOID, 81 (mf == cf) ? UNMARSHAL_METHOD_ARGS : 82 new Type[] {ClassItem.typeFromName(cf.getName()), 83 UNMARSHAL_METHOD_ARGS[0]}, 84 mf, (mf == cf) ? Constants.ACC_PUBLIC | Constants.ACC_FINAL : 85 Constants.ACC_PUBLIC | Constants.ACC_STATIC, 0, cf.getName(), 86 1, UNMARSHALCONTEXT_CLASS); 87 } 88 89 96 97 public InstructionHandle genExceptionHandler() throws JiBXException { 98 99 initStackState(new String [] {"java.lang.Exception"}); 103 InstructionHandle start = 104 internalAppendCreateNew(FRAMEWORK_EXCEPTION_CLASS); 105 appendDUP_X1(); 106 appendSWAP(); 107 108 appendCreateNew("java.lang.StringBuffer"); 113 appendDUP(); 114 appendLoadConstant(UNMARSHAL_EXCEPTION_TEXT); 115 appendCallInit("java.lang.StringBuffer", "(Ljava/lang/String;)V"); 116 loadContext(); 117 appendCallVirtual(UNMARSHALLING_POSITION_METHOD, 118 UNMARSHALLING_POSITION_SIGNATURE); 119 appendCallVirtual("java.lang.StringBuffer.append", 120 "(Ljava/lang/String;)Ljava/lang/StringBuffer;"); 121 appendCallVirtual("java.lang.StringBuffer.toString", 122 "()Ljava/lang/String;"); 123 124 appendSWAP(); 127 appendCallInit(FRAMEWORK_EXCEPTION_CLASS, 128 EXCEPTION_CONSTRUCTOR_SIGNATURE2); 129 appendThrow(); 130 return start; 131 } 132 } | Popular Tags |