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:
033: import org.jibx.runtime.IMarshaller;
034: import org.jibx.runtime.IMarshallingContext;
035: import org.jibx.runtime.IUnmarshaller;
036: import org.jibx.runtime.IUnmarshallingContext;
037: import org.jibx.runtime.IXMLReader;
038: import org.jibx.runtime.JiBXException;
039: import org.jibx.runtime.impl.UnmarshallingContext;
040: import org.w3c.dom.DocumentFragment;
041: import org.w3c.dom.Node;
042:
043: /**
044: * <p>Custom content list marshaller/unmarshaller to DOM 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 of <code>org.w3c.dom.DocumentFragment</code> (the actual
048: * runtime type - the declared type is ignored and can be anything). When
049: * unmarshalling it will create a fragment to hold any content up to the close
050: * tag for the enclosing element in the list. When marshalling, it will simply
051: * write out any content directly.</p>
052: *
053: * @author Dennis M. Sosnoski
054: * @version 1.0
055: */
056:
057: public class DomFragmentMapper extends DomMapperBase implements
058: IMarshaller, IUnmarshaller {
059: /**
060: * Default constructor.
061: *
062: * @throws JiBXException on configuration error
063: */
064: public DomFragmentMapper() throws JiBXException {
065: super ();
066: }
067:
068: /* (non-Javadoc)
069: * @see org.jibx.runtime.IMarshaller#isExtension(int)
070: */
071:
072: public boolean isExtension(int index) {
073: return false;
074: }
075:
076: /* (non-Javadoc)
077: * @see org.jibx.runtime.IMarshaller#marshal(java.lang.Object,
078: * org.jibx.runtime.IMarshallingContext)
079: */
080:
081: public void marshal(Object obj, IMarshallingContext ictx)
082: throws JiBXException {
083:
084: // make sure the parameters are as expected
085: if (!(obj instanceof DocumentFragment)) {
086: throw new JiBXException(
087: "Mapped object not an org.w3c.dom.DocumentFragment");
088: } else {
089: try {
090:
091: // marshal document fragment with no indentation
092: m_xmlWriter = ictx.getXmlWriter();
093: int indent = ictx.getIndent();
094: ictx.setIndent(-1);
095: m_defaultNamespaceURI = null;
096: marshalContent(((DocumentFragment) obj).getChildNodes());
097: ictx.setIndent(indent);
098:
099: } catch (IOException e) {
100: throw new JiBXException("Error writing to document", e);
101: }
102: }
103: }
104:
105: /* (non-Javadoc)
106: * @see org.jibx.runtime.IUnmarshaller#isPresent(org.jibx.runtime.IUnmarshallingContext)
107: */
108:
109: public boolean isPresent(IUnmarshallingContext ctx)
110: throws JiBXException {
111: if (!(ctx instanceof UnmarshallingContext)) {
112: throw new JiBXException(
113: "Unmarshalling context not of expected type");
114: } else {
115: return ((UnmarshallingContext) ctx).currentEvent() != IXMLReader.END_TAG;
116: }
117: }
118:
119: /* (non-Javadoc)
120: * @see org.jibx.runtime.IUnmarshaller#unmarshal(java.lang.Object,
121: * org.jibx.runtime.IUnmarshallingContext)
122: */
123:
124: public Object unmarshal(Object obj, IUnmarshallingContext ictx)
125: throws JiBXException {
126:
127: // verify the entry conditions
128: boolean created = false;
129: DocumentFragment frag = null;
130: if (obj == null) {
131: frag = m_document.createDocumentFragment();
132: created = true;
133: } else if (obj instanceof DocumentFragment) {
134: frag = (DocumentFragment) obj;
135: } else {
136: throw new JiBXException(
137: "Supplied object is not an org.w3c.dom.DocumentFragment");
138: }
139: if (!(ictx instanceof UnmarshallingContext)) {
140: throw new JiBXException(
141: "Unmarshalling context not of expected type");
142: }
143:
144: // unmarshal content to document model
145: m_unmarshalContext = (UnmarshallingContext) ictx;
146: try {
147: Node node;
148: while ((node = unmarshalNode()) != null) {
149: frag.appendChild(node);
150: }
151: if (created && !frag.hasChildNodes()) {
152: return null;
153: } else {
154: return frag;
155: }
156: } catch (IOException e) {
157: throw new JiBXException("Error reading from document", e);
158: }
159: }
160: }
|