001: /*
002: * Copyright 2006 Sun Microsystems, Inc. All Rights Reserved.
003: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
004: *
005: * This code is free software; you can redistribute it and/or modify it
006: * under the terms of the GNU General Public License version 2 only, as
007: * published by the Free Software Foundation. Sun designates this
008: * particular file as subject to the "Classpath" exception as provided
009: * by Sun in the LICENSE file that accompanied this code.
010: *
011: * This code is distributed in the hope that it will be useful, but WITHOUT
012: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
013: * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
014: * version 2 for more details (a copy is included in the LICENSE file that
015: * accompanied this code).
016: *
017: * You should have received a copy of the GNU General Public License version
018: * 2 along with this work; if not, write to the Free Software Foundation,
019: * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
020: *
021: * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
022: * CA 95054 USA or visit www.sun.com if you need additional information or
023: * have any questions.
024: */
025:
026: package com.sun.xml.internal.bind.v2.runtime;
027:
028: import java.io.IOException;
029: import java.io.InputStream;
030: import java.io.OutputStream;
031:
032: import javax.xml.bind.JAXBException;
033: import javax.xml.bind.MarshalException;
034: import javax.xml.bind.Marshaller;
035: import javax.xml.bind.UnmarshalException;
036: import javax.xml.bind.Unmarshaller;
037: import javax.xml.bind.annotation.adapters.XmlAdapter;
038: import javax.xml.namespace.NamespaceContext;
039: import javax.xml.stream.XMLStreamException;
040: import javax.xml.stream.XMLStreamReader;
041: import javax.xml.stream.XMLStreamWriter;
042: import javax.xml.transform.Result;
043: import javax.xml.transform.Source;
044:
045: import com.sun.istack.internal.NotNull;
046: import com.sun.xml.internal.bind.api.Bridge;
047: import com.sun.xml.internal.bind.api.TypeReference;
048: import com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl;
049:
050: import org.w3c.dom.Node;
051: import org.xml.sax.ContentHandler;
052: import org.xml.sax.SAXException;
053:
054: /**
055: * {@link Bridge} decorator for {@link XmlAdapter}.
056: *
057: * @author Kohsuke Kawaguchi
058: */
059: final class BridgeAdapter<OnWire, InMemory> extends
060: InternalBridge<InMemory> {
061: private final InternalBridge<OnWire> core;
062: private final Class<? extends XmlAdapter<OnWire, InMemory>> adapter;
063:
064: public BridgeAdapter(InternalBridge<OnWire> core,
065: Class<? extends XmlAdapter<OnWire, InMemory>> adapter) {
066: super (core.getContext());
067: this .core = core;
068: this .adapter = adapter;
069: }
070:
071: public void marshal(Marshaller m, InMemory inMemory,
072: XMLStreamWriter output) throws JAXBException {
073: core.marshal(m, adaptM(m, inMemory), output);
074: }
075:
076: public void marshal(Marshaller m, InMemory inMemory,
077: OutputStream output, NamespaceContext nsc)
078: throws JAXBException {
079: core.marshal(m, adaptM(m, inMemory), output, nsc);
080: }
081:
082: public void marshal(Marshaller m, InMemory inMemory, Node output)
083: throws JAXBException {
084: core.marshal(m, adaptM(m, inMemory), output);
085: }
086:
087: public void marshal(Marshaller context, InMemory inMemory,
088: ContentHandler contentHandler) throws JAXBException {
089: core
090: .marshal(context, adaptM(context, inMemory),
091: contentHandler);
092: }
093:
094: public void marshal(Marshaller context, InMemory inMemory,
095: Result result) throws JAXBException {
096: core.marshal(context, adaptM(context, inMemory), result);
097: }
098:
099: private OnWire adaptM(Marshaller m, InMemory v)
100: throws JAXBException {
101: XMLSerializer serializer = ((MarshallerImpl) m).serializer;
102: serializer.setThreadAffinity();
103: serializer.pushCoordinator();
104: try {
105: return _adaptM(serializer, v);
106: } finally {
107: serializer.popCoordinator();
108: serializer.resetThreadAffinity();
109: }
110: }
111:
112: private OnWire _adaptM(XMLSerializer serializer, InMemory v)
113: throws MarshalException {
114: XmlAdapter<OnWire, InMemory> a = serializer.getAdapter(adapter);
115: try {
116: return a.marshal(v);
117: } catch (Exception e) {
118: serializer.handleError(e, v, null);
119: throw new MarshalException(e);
120: }
121: }
122:
123: public @NotNull
124: InMemory unmarshal(Unmarshaller u, XMLStreamReader in)
125: throws JAXBException {
126: return adaptU(u, core.unmarshal(u, in));
127: }
128:
129: public @NotNull
130: InMemory unmarshal(Unmarshaller u, Source in) throws JAXBException {
131: return adaptU(u, core.unmarshal(u, in));
132: }
133:
134: public @NotNull
135: InMemory unmarshal(Unmarshaller u, InputStream in)
136: throws JAXBException {
137: return adaptU(u, core.unmarshal(u, in));
138: }
139:
140: public @NotNull
141: InMemory unmarshal(Unmarshaller u, Node n) throws JAXBException {
142: return adaptU(u, core.unmarshal(u, n));
143: }
144:
145: public TypeReference getTypeReference() {
146: return core.getTypeReference();
147: }
148:
149: private @NotNull
150: InMemory adaptU(Unmarshaller _u, OnWire v) throws JAXBException {
151: UnmarshallerImpl u = (UnmarshallerImpl) _u;
152: XmlAdapter<OnWire, InMemory> a = u.coordinator
153: .getAdapter(adapter);
154: u.coordinator.setThreadAffinity();
155: u.coordinator.pushCoordinator();
156: try {
157: return a.unmarshal(v);
158: } catch (Exception e) {
159: throw new UnmarshalException(e);
160: } finally {
161: u.coordinator.popCoordinator();
162: u.coordinator.resetThreadAffinity();
163: }
164: }
165:
166: void marshal(InMemory o, XMLSerializer out) throws IOException,
167: SAXException, XMLStreamException {
168: try {
169: core.marshal(_adaptM(XMLSerializer.getInstance(), o), out);
170: } catch (MarshalException e) {
171: // recover from error by not marshalling this element.
172: }
173: }
174: }
|