001: /*
002: Copyright (c) 2007, 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.generator;
030:
031: import java.util.Collections;
032: import java.util.HashMap;
033: import java.util.HashSet;
034: import java.util.Map;
035: import java.util.Set;
036:
037: import org.jibx.binding.model.BindingElement;
038: import org.jibx.binding.model.NamespaceElement;
039:
040: /**
041: * Base class for external data used in constructing a namespaced file which may
042: * reference other files of the same type. This class tracks both the referenced
043: * files and the corresponding namespace references, asigning prefixes for the
044: * latter as appropriate. The namespace associated with this file is always
045: * given the prefix 'tns', while those used for other files get prefixes of the
046: * form 'ns1', 'ns2', etc.
047: */
048: public abstract class HolderBase {
049: private final String m_namespace;
050: private final Map m_nsPrefixMap;
051: private String m_fileName;
052: private Set m_referenceSet;
053:
054: /**
055: * Constructor.
056: *
057: * @param uri (<code>null</code> if no-namespace binding)
058: */
059: public HolderBase(String uri) {
060: m_namespace = uri;
061: m_nsPrefixMap = new HashMap();
062: if (uri != null) {
063: m_nsPrefixMap.put(uri, "tns");
064: }
065: }
066:
067: /**
068: * Get the prefix for a namespace URI. The first time this is called for a
069: * particular namespace URI a prefix is assigned and returned. This assumes
070: * that the default namespace is always the no-namespace.
071: *
072: * @param uri
073: * @return prefix
074: */
075: public String getPrefix(String uri) {
076: if (uri == null) {
077: return "";
078: } else {
079: String prefix = (String) m_nsPrefixMap.get(uri);
080: if (prefix == null) {
081: prefix = "ns" + m_nsPrefixMap.size();
082: m_nsPrefixMap.put(uri, prefix);
083: addNamespaceDecl(prefix, uri);
084: }
085: return prefix;
086: }
087: }
088:
089: /**
090: * Subclass hook method to handle adding a namespace declaration. The
091: * implementation of this method needs to set up the namespace declaration
092: * for output in the generated XML.
093: *
094: * @param prefix
095: * @param uri
096: */
097: protected abstract void addNamespaceDecl(String prefix, String uri);
098:
099: /**
100: * Get namespace URI associated with this file.
101: *
102: * @return namespace
103: */
104: public String getNamespace() {
105: return m_namespace;
106: }
107:
108: /**
109: * Get the file name to be used for this file.
110: *
111: * @return name (<code>null</code> if not set)
112: */
113: public String getFileName() {
114: return m_fileName;
115: }
116:
117: /**
118: * Set the file name to be used for this file.
119: *
120: * @param name
121: */
122: public void setFileName(String name) {
123: m_fileName = name;
124: }
125:
126: /**
127: * Record a reference from this file to another file of the same type. This
128: * adds the reference to the set of references.
129: *
130: * @param ref
131: */
132: public void addReference(HolderBase ref) {
133: if (ref == null) {
134: throw new IllegalArgumentException(
135: "Reference cannot be to null");
136: }
137: if (m_referenceSet == null) {
138: m_referenceSet = new HashSet();
139: }
140: m_referenceSet.add(ref);
141: }
142:
143: /**
144: * Get the set of references from this file to other files of the same type.
145: *
146: * @return references
147: */
148: public Set getReferences() {
149: if (m_referenceSet == null) {
150: return Collections.EMPTY_SET;
151: } else {
152: return m_referenceSet;
153: }
154: }
155:
156: /**
157: * Implementation method for subclasses to handle the references from this
158: * file to other files. This is intended for use after all references have
159: * been added, allowing the subclass to add any necessary structures to the
160: * file representation.
161: */
162: public abstract void fixReferences();
163: }
|