001: /*
002: Copyright (c) 2003-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.binding.def;
030:
031: import java.util.ArrayList;
032:
033: import org.jibx.binding.classes.BoundClass;
034: import org.jibx.binding.classes.ClassFile;
035: import org.jibx.runtime.JiBXException;
036:
037: /**
038: * Direct mapping using supplied marshaller and unmarshaller.
039: *
040: * @author Dennis M. Sosnoski
041: */
042: public class MappingDirect extends MappingBase {
043: /** Direct mapping implementation. */
044: private final DirectObject m_mappingImpl;
045:
046: /** Class file to use for added code. */
047: private final BoundClass m_boundClass;
048:
049: /** Flag for abstract mapping. */
050: private final boolean m_isAbstract;
051:
052: /** Flag for code added to class (if appropriate). */
053: private boolean m_isGenerated;
054:
055: /**
056: * Constructor.
057: *
058: * @param contain containing binding definition structure
059: * @param type bound class name
060: * @param tname qualified type name (<code>null</code> if not specified)
061: * @param dir direct object information
062: * @param abs abstract mapping flag
063: * @throws JiBXException on mapping definition conflict
064: */
065: public MappingDirect(IContainer contain, String type, String tname,
066: DirectObject dir, boolean abs) throws JiBXException {
067: super (contain, type, tname, dir);
068: m_mappingImpl = dir;
069: m_boundClass = BoundClass.getInstance(type, null);
070: m_isAbstract = abs;
071: }
072:
073: /**
074: * Get the mapped class information. This implements the method used by the
075: * base class.
076: *
077: * @return information for mapped class
078: */
079: public BoundClass getBoundClass() {
080: return m_boundClass;
081: }
082:
083: //
084: // IMapping interface method definitions
085:
086: public String getBoundType() {
087: return m_mappingImpl.getTargetClass().getName();
088: }
089:
090: public String getReferenceType() {
091: return getBoundType();
092: }
093:
094: public IComponent getImplComponent() {
095: return m_component;
096: }
097:
098: public ClassFile getMarshaller() throws JiBXException {
099: return m_mappingImpl.getMarshaller();
100: }
101:
102: public ClassFile getUnmarshaller() throws JiBXException {
103: return m_mappingImpl.getUnmarshaller();
104: }
105:
106: public NameDefinition getName() {
107: return m_mappingImpl.getWrapperName();
108: }
109:
110: public void addNamespace(NamespaceDefinition ns) {
111: throw new IllegalStateException(
112: "Internal error: no namespace definition possible");
113: }
114:
115: public boolean isAbstract() {
116: return m_isAbstract;
117: }
118:
119: public boolean isBase() {
120: return false;
121: }
122:
123: public void addExtension(MappingDefinition mdef) {
124: throw new IllegalStateException(
125: "Internal error: no extension possible");
126: }
127:
128: public IComponent buildRef(IContainer parent, IContextObj objc,
129: String type, PropertyDefinition prop) throws JiBXException {
130: return new DirectProperty(prop, m_mappingImpl);
131: }
132:
133: public ArrayList getNamespaces() {
134: return null;
135: }
136:
137: public void generateCode(boolean force) throws JiBXException {
138: if (!m_isGenerated) {
139: if (m_boundClass.isDirectAccess()) {
140: addIMarshallableMethod();
141: addIUnmarshallableMethod();
142: }
143: m_isGenerated = true;
144: }
145: }
146:
147: public NameDefinition getWrapperName() {
148: return null;
149: }
150:
151: public void setLinkages() throws JiBXException {
152: m_mappingImpl.setLinkages();
153: }
154:
155: // DEBUG
156: public void print(int depth) {
157: BindingDefinition.indent(depth);
158: System.out.println("mapping direct "
159: + m_mappingImpl.getTargetClass().getName());
160: }
161: }
|