001: /*
002: Copyright (c) 2004, 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.extras;
030:
031: import java.io.IOException;
032: import java.util.ArrayList;
033: import java.util.List;
034:
035: import org.jibx.runtime.IMarshaller;
036: import org.jibx.runtime.IMarshallingContext;
037: import org.jibx.runtime.IUnmarshaller;
038: import org.jibx.runtime.IUnmarshallingContext;
039: import org.jibx.runtime.IXMLReader;
040: import org.jibx.runtime.JiBXException;
041: import org.jibx.runtime.impl.UnmarshallingContext;
042:
043: /**
044: * <p>Custom content list marshaller/unmarshaller to dom4j representation. This
045: * allows you to mix data binding and document model representations for XML
046: * within the same application. You simply use this marshaller/unmarshaller with
047: * a linked object type that implements <code>java.util.List</code> (the actual
048: * runtime type - the declared type is ignored and can be anything). When
049: * unmarshalling it will create an instance of <code>java.util.ArrayList</code>
050: * if a list is not passed in and any content is present, then return all the
051: * content up to the close tag for the enclosing element in the list. When
052: * marshalling, it will simply write out any content directly.</p>
053: *
054: * @author Dennis M. Sosnoski
055: * @version 1.0
056: */
057:
058: public class Dom4JListMapper extends Dom4JMapperBase implements
059: IMarshaller, IUnmarshaller {
060: /* (non-Javadoc)
061: * @see org.jibx.runtime.IMarshaller#isExtension(int)
062: */
063:
064: public boolean isExtension(int index) {
065: return false;
066: }
067:
068: /* (non-Javadoc)
069: * @see org.jibx.runtime.IMarshaller#marshal(java.lang.Object,
070: * org.jibx.runtime.IMarshallingContext)
071: */
072:
073: public void marshal(Object obj, IMarshallingContext ictx)
074: throws JiBXException {
075:
076: // make sure the parameters are as expected
077: if (!(obj instanceof List)) {
078: throw new JiBXException(
079: "Mapped object not a java.util.List");
080: } else {
081: try {
082:
083: // marshal all content with no indentation
084: m_xmlWriter = ictx.getXmlWriter();
085: int indent = ictx.getIndent();
086: ictx.setIndent(-1);
087: m_defaultNamespaceURI = null;
088: marshalContent((List) obj);
089: ictx.setIndent(indent);
090:
091: } catch (IOException e) {
092: throw new JiBXException("Error writing to document", e);
093: }
094: }
095: }
096:
097: /* (non-Javadoc)
098: * @see org.jibx.runtime.IUnmarshaller#isPresent(org.jibx.runtime.IUnmarshallingContext)
099: */
100:
101: public boolean isPresent(IUnmarshallingContext ctx)
102: throws JiBXException {
103: if (!(ctx instanceof UnmarshallingContext)) {
104: throw new JiBXException(
105: "Unmarshalling context not of expected type");
106: } else {
107: return ((UnmarshallingContext) ctx).currentEvent() != IXMLReader.END_TAG;
108: }
109: }
110:
111: /* (non-Javadoc)
112: * @see org.jibx.runtime.IUnmarshaller#unmarshal(java.lang.Object,
113: * org.jibx.runtime.IUnmarshallingContext)
114: */
115:
116: public Object unmarshal(Object obj, IUnmarshallingContext ictx)
117: throws JiBXException {
118:
119: // verify the entry conditions
120: boolean created = false;
121: List list = null;
122: if (obj == null) {
123: list = new ArrayList();
124: created = true;
125: } else if (obj instanceof List) {
126: list = (List) obj;
127: } else {
128: throw new JiBXException(
129: "Supplied object is not a java.util.List");
130: }
131: if (!(ictx instanceof UnmarshallingContext)) {
132: throw new JiBXException(
133: "Unmarshalling context not of expected type");
134: }
135:
136: // unmarshal content to document model
137: m_unmarshalContext = (UnmarshallingContext) ictx;
138: try {
139: unmarshalContent(list);
140: if (created && list.isEmpty()) {
141: return null;
142: } else {
143: return list;
144: }
145: } catch (IOException e) {
146: throw new JiBXException("Error reading from document", e);
147: }
148: }
149: }
|