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.ws.wsdl;
030:
031: import java.util.Collection;
032: import java.util.HashMap;
033: import java.util.Map;
034:
035: import org.jibx.binding.generator.CustomBase;
036: import org.jibx.binding.generator.SharedNestingBase;
037: import org.jibx.runtime.IUnmarshallingContext;
038:
039: /**
040: * Base class for nested WSDL customizations that can contain other
041: * customizations.
042: */
043: public abstract class NestingBase extends SharedNestingBase {
044: // values inherited through nesting
045: private Boolean m_wrapped;
046: private Boolean m_setActions;
047: private Boolean m_useNillable;
048: private String m_serviceBase;
049:
050: // set of unique names at level
051: private final Map m_namedChildMap;
052:
053: // TODO: add WSDL namespace prefix, schema namespace prefix, WSDL structuring
054:
055: /**
056: * Constructor.
057: *
058: * @param parent
059: */
060: public NestingBase(SharedNestingBase parent) {
061: super (parent);
062: m_namedChildMap = new HashMap();
063: }
064:
065: //
066: // Getters for values inherited through nesting
067:
068: /**
069: * Check wrapped flag.
070: *
071: * @return wrapped flag
072: */
073: public boolean isWrapped() {
074: if (m_wrapped == null) {
075: if (this instanceof WsdlCustom || getParent() == null) {
076: return true;
077: } else {
078: return ((NestingBase) getParent()).isWrapped();
079: }
080: } else {
081: return m_wrapped.booleanValue();
082: }
083: }
084:
085: /**
086: * Check if soapAction should be set.
087: *
088: * @return soapAction flag
089: */
090: public boolean isSoapAction() {
091: if (m_setActions == null) {
092: if (this instanceof WsdlCustom || getParent() == null) {
093: return true;
094: } else {
095: return ((NestingBase) getParent()).isSoapAction();
096: }
097: } else {
098: return m_setActions.booleanValue();
099: }
100: }
101:
102: /**
103: * Check if xsi:nillable should be used for optional values (rather than
104: * minOccurs='0').
105: *
106: * @return xsi:nillable flag
107: */
108: public boolean isNillable() {
109: if (m_useNillable == null) {
110: if (this instanceof WsdlCustom || getParent() == null) {
111: return false;
112: } else {
113: return ((NestingBase) getParent()).isNillable();
114: }
115: } else {
116: return m_useNillable.booleanValue();
117: }
118: }
119:
120: /**
121: * Get the service base address.
122: *
123: * @return base address
124: */
125: public String getServiceBase() {
126: if (m_serviceBase == null) {
127: if (this instanceof WsdlCustom || getParent() == null) {
128: return "http://localhost:8080/axis2";
129: } else {
130: return ((NestingBase) getParent()).getServiceBase();
131: }
132: } else {
133: return m_serviceBase;
134: }
135: }
136:
137: /**
138: * Get child by name.
139: *
140: * @param name
141: * @return named child, <code>null</code> if name not registered
142: */
143: public CustomBase getChild(String name) {
144: return (CustomBase) m_namedChildMap.get(name);
145: }
146:
147: /**
148: * Register a child name. If the base name supplied has already been used
149: * by a different child, the name will be modified by adding a numeric
150: * suffix to make it unique. Once a name has been registered for a child,
151: * calling this method again with that name is guaranteed to just return
152: * that same name. Depending on the nesting level, the type of child may
153: * take different forms. This doesn't care what the names represent, it just
154: * makes sure they're unique.
155: *
156: * @param base proposed name
157: * @param child named child
158: * @return allowed name
159: */
160: public String registerName(String base, CustomBase child) {
161: int index = 0;
162: String name = base;
163: Object value;
164: while ((value = m_namedChildMap.get(name)) != null
165: && value != child) {
166: name = base + ++index;
167: }
168: m_namedChildMap.put(name, child);
169: return name;
170: }
171:
172: /**
173: * Get WSDL definitions namespace.
174: *
175: * @return WSDL namespace
176: */
177: public abstract String getWsdlNamespace();
178:
179: /**
180: * Gets the parent element link from the unmarshalling stack. This method is
181: * for use by factories during unmarshalling.
182: *
183: * @param ictx unmarshalling context
184: * @return containing class
185: */
186: protected static SharedNestingBase getContainingClass(
187: IUnmarshallingContext ictx) {
188: Object parent = ictx.getStackTop();
189: int depth = 0;
190: if (parent instanceof Collection) {
191: parent = ictx.getStackObject(++depth);
192: }
193: return (SharedNestingBase) parent;
194: }
195: }
|