001: /*
002: Copyright (c) 2004-2005, 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 org.jibx.binding.util.StringArray;
032: import org.jibx.runtime.ITrackSource;
033: import org.jibx.runtime.IUnmarshallingContext;
034: import org.jibx.runtime.JiBXException;
035: import org.jibx.runtime.impl.UnmarshallingContext;
036:
037: /**
038: * Base class for all element structures in binding definition model. This just
039: * provides the linkages for the binding definition tree structure and related
040: * validation hooks.
041: *
042: * @author Dennis M. Sosnoski
043: * @version 1.0
044: */
045:
046: public abstract class ElementBase {
047: //
048: // Element type definitions.
049:
050: public static final int BINDING_ELEMENT = 0;
051: public static final int COLLECTION_ELEMENT = 1;
052: public static final int FORMAT_ELEMENT = 2;
053: public static final int MAPPING_ELEMENT = 3;
054: public static final int NAMESPACE_ELEMENT = 4;
055: public static final int STRUCTURE_ELEMENT = 5;
056: public static final int TEMPLATE_ELEMENT = 6;
057: public static final int VALUE_ELEMENT = 7;
058: // special elements eliminated during splitting
059: public static final int INCLUDE_ELEMENT = 8;
060: public static final int SPLIT_ELEMENT = 9;
061: public static final int INPUT_ELEMENT = 10;
062: public static final int OUTPUT_ELEMENT = 11;
063:
064: public static final String[] ELEMENT_NAMES = { "binding",
065: "collection", "format", "mapping", "namespace",
066: "structure", "template", "value", "include", "split",
067: "input", "output" };
068:
069: //
070: // Instance data.
071:
072: /** Element type. */
073: private final int m_type;
074:
075: /** Comment associated with element. */
076: private String m_comment;
077:
078: /**
079: * Constructor.
080: *
081: * @param type element type code
082: */
083: protected ElementBase(int type) {
084: m_type = type;
085: }
086:
087: /**
088: * Get element type.
089: *
090: * @return type code for this element
091: */
092: public final int type() {
093: return m_type;
094: }
095:
096: /**
097: * Get element name.
098: *
099: * @return type code for this element
100: */
101: public final String name() {
102: return ELEMENT_NAMES[m_type];
103: }
104:
105: /**
106: * Get element comment.
107: *
108: * @return comment for this element
109: */
110: public final String getComment() {
111: return m_comment;
112: }
113:
114: /**
115: * Set element comment.
116: *
117: * @param text comment for this element
118: */
119: public final void setComment(String text) {
120: m_comment = text;
121: }
122:
123: /**
124: * Validate attributes of element. This is designed to be called during
125: * unmarshalling as part of the pre-set method processing when a subclass
126: * instance is being created.
127: *
128: * @param vctx validation context
129: * @param attrs attributes array
130: * @exception JiBXException on unmarshalling error
131: */
132: protected void validateAttributes(IUnmarshallingContext ictx,
133: StringArray attrs) throws JiBXException {
134:
135: // setup for attribute access
136: int count = ictx.getStackDepth();
137: BindingElement.UnmarshalWrapper wrapper = (BindingElement.UnmarshalWrapper) ictx
138: .getStackObject(count - 1);
139: ValidationContext vctx = wrapper.getValidation();
140: UnmarshallingContext uctx = (UnmarshallingContext) ictx;
141:
142: // loop through all attributes of current element
143: for (int i = 0; i < uctx.getAttributeCount(); i++) {
144:
145: // check if nonamespace attribute is in the allowed set
146: String name = uctx.getAttributeName(i);
147: if (uctx.getAttributeNamespace(i).length() == 0) {
148: if (attrs.indexOf(name) < 0) {
149: vctx
150: .addWarning("Undefined attribute " + name,
151: this );
152: }
153: }
154: }
155: }
156:
157: /**
158: * Prevalidate element information. The prevalidation step is used to
159: * check isolated aspects of an element, such as the settings for enumerated
160: * values on the element and attributes. This empty base class
161: * implementation should be overridden by each subclass that requires
162: * prevalidation handling.
163: *
164: * @param vctx validation context
165: */
166: public void prevalidate(ValidationContext vctx) {
167: }
168:
169: /**
170: * Validate element information. The validation step is used for checking
171: * the interactions between elements, such as name references to other
172: * elements. The {@link #prevalidate} method will always be called for every
173: * element in the binding definition before this method is called for any
174: * element. This empty base class implementation should be overridden by
175: * each subclass that requires validation handling.
176: *
177: * @param vctx validation context
178: */
179: public void validate(ValidationContext vctx) {
180: }
181:
182: /**
183: * Simple text representation of binding definition element. This uses the
184: * element name, along with position information if present.
185: *
186: * @return text representation
187: */
188: public String toString() {
189: StringBuffer buff = new StringBuffer();
190: buff.append('<');
191: buff.append(name());
192: buff.append('>');
193: buff.append(" element");
194: if (this instanceof ITrackSource) {
195: ITrackSource track = (ITrackSource) this ;
196: int line = track.jibx_getLineNumber();
197: if (line >= 0) {
198: buff.append(" (line ");
199: buff.append(line);
200: buff.append(", column ");
201: buff.append(track.jibx_getColumnNumber());
202: String dname = track.jibx_getDocumentName();
203: if (dname == null) {
204: buff.append(')');
205: } else {
206: buff.append(" in '");
207: buff.append(dname);
208: buff.append("')");
209: }
210: }
211: }
212: return buff.toString();
213: }
214: }
|