01: /*
02: Copyright (c) 2003-2007, 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.def;
30:
31: import org.jibx.binding.classes.*;
32: import org.jibx.runtime.JiBXException;
33:
34: /**
35: * Component decorator for optional structure with associated property. This
36: * just handles necessary glue code generation for the marshalling operations,
37: * where the presence of the structure needs to be tested before actually
38: * handling tag generation.
39: */
40: public class OptionalStructureWrapper extends PassThroughComponent {
41: /** Property definition. */
42: private final PropertyDefinition m_property;
43:
44: /** Load object for marshalling code generation flag. */
45: private final boolean m_loadMarshal;
46:
47: /**
48: * Constructor.
49: *
50: * @param wrap wrapped binding component
51: * @param load flag for need to load object for marshalling code
52: */
53:
54: public OptionalStructureWrapper(IComponent wrap,
55: PropertyDefinition prop, boolean load) {
56: super (wrap);
57: m_property = prop;
58: m_loadMarshal = load;
59: }
60:
61: //
62: // IComponent interface method definitions
63:
64: public void genAttributeMarshal(ContextMethodBuilder mb)
65: throws JiBXException {
66: mb.loadObject();
67: BranchWrapper ifmiss = m_property.genTest(mb);
68: super .genAttributeMarshal(mb);
69: mb.targetNext(ifmiss);
70: }
71:
72: public void genContentMarshal(ContextMethodBuilder mb)
73: throws JiBXException {
74: mb.loadObject();
75: BranchWrapper ifmiss = m_property.genTest(mb);
76: if (m_loadMarshal) {
77: mb.loadObject();
78: m_property.genLoad(mb);
79: }
80: super .genContentMarshal(mb);
81: mb.targetNext(ifmiss);
82: }
83:
84: // DEBUG
85: public void print(int depth) {
86: BindingDefinition.indent(depth);
87: System.out.print("optional structure wrapper "
88: + m_property.toString());
89: if (m_loadMarshal) {
90: System.out.print(" (load marshal)");
91: }
92: System.out.println();
93: m_component.print(depth + 1);
94: }
95: }
|