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 define how instances of a particular class
038: * are converted to or from XML. This includes both <b>mapping</b> and
039: * <b>template</b> elements.
040: *
041: * @author Dennis M. Sosnoski
042: */
043: public abstract class TemplateElementBase extends ContainerElementBase {
044: /** Enumeration of allowed attribute names */
045: public static final StringArray s_allowedAttributes = new StringArray(
046: new String[] { "class" },
047: ContainerElementBase.s_allowedAttributes);
048:
049: /** Name of handled class. */
050: private String m_className;
051:
052: /** Handled class information. */
053: private IClass m_handledClass;
054:
055: /** List of child elements. */
056: protected ArrayList m_topChildren;
057:
058: /** Templates or mappings that can be used in place of this one (as
059: * substitution group using mapping, or xsi:type with template). */
060: private ArrayList m_extensionTypes;
061:
062: /**
063: * Constructor.
064: *
065: * @param type element type code
066: */
067: public TemplateElementBase(int type) {
068: super (type);
069: m_extensionTypes = new ArrayList();
070: }
071:
072: /**
073: * Set mapped class name.
074: *
075: * @param name mapped class name
076: */
077: public void setClassName(String name) {
078: m_className = name;
079: }
080:
081: /**
082: * Get mapped class name.
083: *
084: * @return class name
085: */
086: public String getClassName() {
087: return m_className;
088: }
089:
090: /**
091: * Get handled class information. This call is only meaningful after
092: * prevalidation.
093: *
094: * @return mapped class information
095: */
096: public IClass getHandledClass() {
097: return m_handledClass;
098: }
099:
100: /**
101: * Add template or mapping which derives from this one.
102: *
103: * @param ext derived template or mapping information
104: */
105: protected void addExtensionType(TemplateElementBase ext) {
106: m_extensionTypes.add(ext);
107: }
108:
109: /**
110: * Get templates or mappings which derive from this one.
111: *
112: * @return list of derived templates or mappings
113: */
114: public ArrayList getExtensionTypes() {
115: return m_extensionTypes;
116: }
117:
118: /**
119: * Check if default template for type. Needs to be implemented by subclasses
120: * for common handling.
121: *
122: * @return <code>true</code> if default for type, <code>false</code> if not
123: */
124: public abstract boolean isDefaultTemplate();
125:
126: /**
127: * Add top-level child element.
128: *
129: * @param child element to be added as child of this element
130: */
131: public void addTopChild(Object child) {
132: m_topChildren.add(child);
133: }
134:
135: /**
136: * Get list of top-level child elements.
137: *
138: * @return list of child elements, or <code>null</code> if none
139: */
140: public ArrayList topChildren() {
141: return m_topChildren;
142: }
143:
144: /**
145: * Get iterator for top-level child elements.
146: *
147: * @return iterator for child elements
148: */
149: public Iterator topChildIterator() {
150: return m_topChildren.iterator();
151: }
152:
153: //
154: // Overrides of base class methods
155:
156: /* (non-Javadoc)
157: * @see org.jibx.binding.model.ElementBase#isOptional()
158: */
159: public boolean isOptional() {
160: throw new IllegalStateException(
161: "Internal error: method should never be called");
162: }
163:
164: /* (non-Javadoc)
165: * @see org.jibx.binding.model.IContextObj#getType()
166: */
167: public IClass getType() {
168: return m_handledClass;
169: }
170:
171: /* (non-Javadoc)
172: * @see org.jibx.binding.model.ContainerElementBase#isImplicit()
173: */
174: public boolean isImplicit() {
175: return false;
176: }
177:
178: /* (non-Javadoc)
179: * @see org.jibx.binding.model.ContainerElementBase#hasObject()
180: */
181: public boolean hasObject() {
182: return true;
183: }
184:
185: /* (non-Javadoc)
186: * @see org.jibx.binding.model.ContainerElementBase#getObjectType()
187: */
188: public IClass getObjectType() {
189: return m_handledClass;
190: }
191:
192: //
193: // Validation methods
194:
195: /* (non-Javadoc)
196: * @see org.jibx.binding.model.ElementBase#prevalidate(org.jibx.binding.model.ValidationContext)
197: */
198: public void prevalidate(ValidationContext vctx) {
199: if (m_className == null) {
200: vctx.addFatal("Class name is required");
201: } else {
202: m_handledClass = vctx.getClassInfo(m_className);
203: if (m_handledClass == null) {
204: vctx.addFatal("Cannot find information for class "
205: + m_className);
206: } else {
207: super .prevalidate(vctx);
208: }
209: }
210: }
211:
212: /* (non-Javadoc)
213: * @see org.jibx.binding.model.ContainerElementBase#validate(org.jibx.binding.model.ValidationContext)
214: */
215: public void validate(ValidationContext vctx) {
216:
217: // check each child component for compatible type
218: ArrayList children = children();
219: checkCompatibleChildren(vctx, m_handledClass, children);
220: super.validate(vctx);
221: }
222: }
|