01: /*
02: Copyright (c) 2003-2004, Dennis M. Sosnoski
03: All rights reserved.
04:
05: Redistribution and use in source and binary forms, with or without modification,
06: are permitted provided that the following conditions are met:
07:
08: * Redistributions of source code must retain the above copyright notice, this
09: list of conditions and the following disclaimer.
10: * Redistributions in binary form must reproduce the above copyright notice,
11: this list of conditions and the following disclaimer in the documentation
12: and/or other materials provided with the distribution.
13: * Neither the name of JiBX nor the names of its contributors may be used
14: to endorse or promote products derived from this software without specific
15: prior written permission.
16:
17: THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
18: ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19: WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20: DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
21: ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
22: (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
23: LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
24: ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25: (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
26: SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27: */
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: /**
36: * Marshalling method builder. Tracks the creation of a marshalling method,
37: * including special handling of exceptions that may be generated by object
38: * accesses during the marshalling process.
39: *
40: * @author Dennis M. Sosnoski
41: * @version 1.0
42: */
43:
44: public class MarshalBuilder extends MarshalUnmarshalBuilder {
45: //
46: // Constants for code generation.
47:
48: private static final String MARSHALCONTEXT_CLASS = "org.jibx.runtime.impl.MarshallingContext";
49: protected static final String MARSHAL_EXCEPTION_TEXT = "Error while marshalling";
50: protected static final Type[] MARSHAL_METHOD_ARGS = { new ObjectType(
51: "org.jibx.runtime.impl.MarshallingContext") };
52:
53: /**
54: * Constructor. This sets up for constructing a marshalling method with
55: * public access and wrapped exception handling. If the method is being
56: * generated directly to the class being marshalled it's built as a virtual
57: * method; otherwise, it's done as a static method.
58: *
59: * @param name method name to be built
60: * @param cf owning class file information
61: * @param mf method generation class file information
62: * @throws JiBXException on error in initializing method construction
63: */
64:
65: public MarshalBuilder(String name, ClassFile cf, ClassFile mf)
66: throws JiBXException {
67: super (name, Type.VOID, (mf == cf) ? MARSHAL_METHOD_ARGS
68: : new Type[] { ClassItem.typeFromName(cf.getName()),
69: MARSHAL_METHOD_ARGS[0] }, mf,
70: (mf == cf) ? Constants.ACC_PUBLIC | Constants.ACC_FINAL
71: : Constants.ACC_PUBLIC | Constants.ACC_STATIC,
72: 0, cf.getName(), 1, MARSHALCONTEXT_CLASS);
73: }
74:
75: /**
76: * Add exception handler code. The implementation of this abstract base
77: * class method provides handling specific to a marshalling method.
78: *
79: * @return handle for first instruction in handler
80: * @throws JiBXException on error in creating exception handler
81: */
82:
83: public InstructionHandle genExceptionHandler() throws JiBXException {
84:
85: // instruction sequence is create new exception object, duplicate two
86: // down (below caught exception), swap (so order is new, new, caught),
87: // load message, swap again, invoke constructor, and throw exception
88: initStackState(new String[] { "java.lang.Exception" });
89: InstructionHandle start = internalAppendCreateNew(FRAMEWORK_EXCEPTION_CLASS);
90: appendDUP_X1();
91: appendSWAP();
92: appendLoadConstant(MARSHAL_EXCEPTION_TEXT);
93: appendSWAP();
94: appendCallInit(FRAMEWORK_EXCEPTION_CLASS,
95: EXCEPTION_CONSTRUCTOR_SIGNATURE2);
96: appendThrow();
97: return start;
98: }
99: }
|