001: /*
002: Copyright (c) 2004-2007, Dennis M. Sosnoski
003: All rights reserved.
004:
005: Redistribution and use in source and binary forms, with or without modification,
006: are permitted provided that the following conditions are met:
007:
008: * Redistributions of source code must retain the above copyright notice, this
009: list of conditions and the following disclaimer.
010: * Redistributions in binary form must reproduce the above copyright notice,
011: this list of conditions and the following disclaimer in the documentation
012: and/or other materials provided with the distribution.
013: * Neither the name of JiBX nor the names of its contributors may be used
014: to endorse or promote products derived from this software without specific
015: prior written permission.
016:
017: THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
018: ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
019: WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
020: DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
021: ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
022: (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
023: LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
024: ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
025: (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
026: SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
027: */
028:
029: package org.jibx.binding.model;
030:
031: import java.util.ArrayList;
032: import java.util.Iterator;
033:
034: import org.jibx.binding.util.StringArray;
035:
036: /**
037: * Model component for elements that can contain other component elements.
038: * TODO: The list of child elements here conflicts with that in BindingElement;
039: * should change the type hierarchy to better reflect usage
040: *
041: * @author Dennis M. Sosnoski
042: */
043: public abstract class NestingElementBase extends ElementBase {
044: /** Enumeration of allowed attribute names */
045: public static final StringArray s_allowedAttributes = new StringArray(
046: new String[] { "value-style" });
047:
048: /** Value style attribute information. */
049: private NestingAttributes m_nestingAttrs;
050:
051: /** Definition context for this nesting (created by validation). */
052: private DefinitionContext m_defContext;
053:
054: /** List of child elements. */
055: private ArrayList m_children;
056:
057: /**
058: * Constructor.
059: *
060: * @param type element type code
061: */
062: protected NestingElementBase(int type) {
063: super (type);
064: m_nestingAttrs = new NestingAttributes();
065: m_children = new ArrayList();
066: }
067:
068: /**
069: * Add child element.
070: * TODO: should be ElementBase argument, but JiBX doesn't allow yet
071: *
072: * @param child element to be added as child of this element
073: */
074: public final void addChild(Object child) {
075: m_children.add(child);
076: }
077:
078: /**
079: * Get list of child elements.
080: *
081: * @return list of child elements (never <code>null</code>)
082: */
083: public final ArrayList children() {
084: return m_children;
085: }
086:
087: /**
088: * Get iterator for child elements.
089: *
090: * @return iterator for child elements
091: */
092: public final Iterator childIterator() {
093: return m_children.iterator();
094: }
095:
096: /**
097: * Get definition context.
098: *
099: * @return definition context, or <code>null</code> if no definition context
100: * for this element
101: */
102: public final DefinitionContext getDefinitions() {
103: return m_defContext;
104: }
105:
106: /**
107: * Set definition context.
108: *
109: * @param ctx definition context to be set
110: */
111: /*package*/void setDefinitions(DefinitionContext ctx) {
112: m_defContext = ctx;
113: }
114:
115: //
116: // Nesting attribute delegate methods
117:
118: /**
119: * Get style name set on this nesting element.
120: *
121: * @return style string value (<code>null</code> if undefined at this level)
122: */
123: public String getStyleName() {
124: return m_nestingAttrs.getStyleName();
125: }
126:
127: /**
128: * Get style value set on this nesting element. This call is only meaningful
129: * after validation.
130: *
131: * @return style value (<code>-1</code> if undefined at this level)
132: */
133: public int getStyle() {
134: return m_nestingAttrs.getStyle();
135: }
136:
137: /**
138: * Set style name on this nesting element.
139: *
140: * @param name style name (<code>null</code> to undefine style at this
141: * level)
142: */
143: public void setStyleName(String name) {
144: m_nestingAttrs.setStyleName(name);
145: }
146:
147: /**
148: * Get default style value for child components. This call is only
149: * meaningful after validation.
150: *
151: * @return default style value for child components (<code>-1</code> if not
152: * defined at this level)
153: */
154: public int getDefaultStyle() {
155: return m_nestingAttrs.getStyle();
156: }
157:
158: /* (non-Javadoc)
159: * @see org.jibx.binding.model.ElementBase#prevalidate(org.jibx.binding.model.ValidationContext)
160: */
161: public void prevalidate(ValidationContext vctx) {
162: m_nestingAttrs.prevalidate(vctx);
163: super .prevalidate(vctx);
164: }
165:
166: /* (non-Javadoc)
167: * @see org.jibx.binding.model.ElementBase#validate(org.jibx.binding.model.ValidationContext)
168: */
169: public void validate(ValidationContext vctx) {
170: if (m_defContext == null) {
171: m_defContext = vctx.getCurrentDefinitions();
172: }
173: m_nestingAttrs.validate(vctx);
174: super.validate(vctx);
175: }
176: }
|