codegenerationutility.java
来自「开源的axis2框架的源码。用于开发WEBSERVER」· Java 代码 · 共 1,193 行 · 第 1/4 页
JAVA
1,193 行
}
param.setAttribute("java-type", javatype);
if (createtype != null) {
param.setAttribute("create-type", createtype);
}
boolean isobj = !s_primitiveSet.contains(javatype);
String fulltype = javatype;
if (isarray) {
fulltype += "[]";
isobj = false;
}
param.setAttribute("object", Boolean.toString(isobj));
if (isout) {
wrappertype = fulltype;
} else {
wrappertype = "java.lang.Object";
}
wrapdetail.appendChild(param);
// this magic code comes from org.apache.axis2.wsdl.codegen.extension.SchemaUnwrapperExtension
// it's used here to fit into the ADB-based code generation model
QName partqname = WSDLUtil.getPartQName(opName.getLocalPart(),
WSDLConstants.INPUT_PART_QNAME_SUFFIX,
javaname);
partNameList.add(partqname);
// add type mapping so we look like ADB
codeGenConfig.getTypeMapper().addTypeMappingName(partqname, fulltype);
}
// check namespace prefix usage
if (nons && dfltns) {
throw new RuntimeException("Cannot unwrap element " + qname +
": no-namespace element(s) conflict with default namespace use in binding");
}
wrapdetail.setAttribute("uses-default", Boolean.toString(nons));
// set flag for namespace declarations needed on wrapper
wrapdetail.setAttribute("need-namespaces", Boolean.toString(complex));
}
} else if (type != null) {
throw new RuntimeException("Cannot unwrap element " + qname +
": not a complexType definition");
}
if (wrapdetail.getFirstChild() == null) {
wrapdetail.setAttribute("empty", "true");
wrapdetail.setAttribute("need-namespaces", "false");
wrappertype = "";
} else {
wrapdetail.setAttribute("empty", "false");
}
// this magic code comes from org.apache.axis2.wsdl.codegen.extension.SchemaUnwrapperExtension
// it's used here to fit into the ADB-based code generation model
MessagePartInformationHolder infoHolder = new MessagePartInformationHolder();
infoHolder.setOperationName(msg.getAxisOperation().getName());
infoHolder.setPartsList(partNameList);
try {
msg.addParameter(new Parameter(Constants.UNWRAPPED_DETAILS, infoHolder));
} catch (AxisFault e) {
throw new RuntimeException(e);
}
// set indication for unwrapped message
try {
msg.addParameter(new Parameter(Constants.UNWRAPPED_KEY, Boolean.TRUE));
} catch (AxisFault e) {
throw new RuntimeException(e);
}
// add fake mapping for wrapper name (necessary for current XSLTs)
codeGenConfig.getTypeMapper().addTypeMappingName(qname, wrappertype);
// return the unwrapping details
return wrapdetail;
}
/**
* Add mapping from namespace URI to prefix. In the case where multiple prefixes are used with a
* single URI, this will preserve the last non-empty prefix for that URI.
*
* @param ns namespace definition
* @param dfltns flag for default namespace used in binding
* @param nsmap map from namespace URIs to prefixes
* @return flag for default namespace used in binding
*/
private boolean mapNamespace(NamespaceElement ns, boolean dfltns, Map nsmap) {
String prefix = ns.getPrefix();
if (prefix == null) {
prefix = "";
}
String prior = (String)nsmap.get(ns.getUri());
if (prior != null) {
if (prefix.length() == 0) {
return dfltns;
} else if (prior.length() == 0) {
dfltns = false;
}
}
nsmap.put(ns.getUri(), prefix);
return dfltns || prefix.length() == 0;
}
private static String toJavaName(String name, Set nameset) {
StringBuffer buff = new StringBuffer(name.length());
for (int i = 0; i < name.length(); i++) {
char chr = name.charAt(i);
if ((i == 0 && Character.isJavaIdentifierStart(chr)) ||
(i > 0 && Character.isJavaIdentifierPart(chr))) {
buff.append(chr);
} else if (chr == ':' || chr == '.') {
buff.append('$');
} else {
buff.append('_');
}
}
int count = 0;
String jname = buff.toString();
while (!nameset.add(jname)) {
jname = buff.toString() + count++;
}
return jname;
}
private String mapMessage(AxisMessage msg, Map complexTypeMap) {
QName qname = msg.getElementQName();
if (qname == null) {
throw new RuntimeException("No element reference in message " + msg.getName());
}
return mapQName(qname, complexTypeMap);
}
private String mapMessage(SOAPHeaderMessage msg, Map complexTypeMap) {
QName qname = msg.getElement();
if (qname == null) {
throw new RuntimeException("No element reference in header");
}
return mapQName(qname, complexTypeMap);
}
private String mapQName(QName qname, Map complexTypeMap) throws RuntimeException {
Object obj = complexTypeMap.get(qname);
if (obj == null) {
throw new RuntimeException("No mapping defined for element " + qname);
}
MappingElement mapping = (MappingElement)obj;
String cname = mapping.getClassName();
codeGenConfig.getTypeMapper().addTypeMappingName(qname, cname);
return cname;
}
/**
* Collect mapping from qnames to classes for top level mappings in JiBX binding.
*
* @param binding
* @param dns default namespace to be used unless overridden (empty string if none)
* @param elementMap map from element names to concrete mapping components of binding
* @param complexTypeMap map from type names to abstract mapping components of binding
* @param simpleTypeMap map from type names to format definition components of binding
* @param bindingMap map from mapping components to containing binding definition
*/
private static void collectTopLevelComponents(BindingElement binding,
String dns, Map elementMap, Map complexTypeMap,
Map simpleTypeMap,
Map bindingMap) {
// check default namespace set at top level of binding
String defaultns = findDefaultNS(binding.topChildIterator(), dns);
// add all top level mapping and format definitions to maps
for (Iterator iter = binding.topChildIterator(); iter.hasNext();) {
ElementBase child = (ElementBase)iter.next();
if (child.type() == ElementBase.INCLUDE_ELEMENT) {
// recurse to process included binding definitions
IncludeElement include = (IncludeElement)child;
collectTopLevelComponents(include.getBinding(), defaultns,
elementMap, complexTypeMap, simpleTypeMap, bindingMap);
} else if (child.type() == ElementBase.FORMAT_ELEMENT) {
// register named formats as simple type conversions
FormatElement format = (FormatElement)child;
registerElement(format.getQName(), format, simpleTypeMap);
bindingMap.put(format, binding);
} else if (child.type() == ElementBase.MAPPING_ELEMENT) {
// record only abstract mappings with type names, and mappings with names
MappingElement mapping = (MappingElement)child;
bindingMap.put(mapping, binding);
if (mapping.isAbstract() && mapping.getTypeQName() != null) {
// register named abstract mappings as complex type conversions
registerElement(mapping.getTypeQName(), mapping,
complexTypeMap);
} else if (mapping.getName() != null) {
// register concrete mappings as element conversions
String uri = mapping.getUri();
if (uri == null) {
uri = findDefaultNS(mapping.topChildIterator(),
defaultns);
}
elementMap.put(new QName(uri, mapping.getName()), mapping);
}
}
}
}
/**
* Register binding element by qualified name. This converts the qualified name format used by
* the JiBX binding model to that used by Axis2.
*
* @param qname qualified name in JiBX format (<code>null</code> if none)
* @param element corresponding element of binding definition
* @param map qualified name to element map
*/
private static void registerElement(org.jibx.runtime.QName qname,
ElementBase element, Map map) {
if (qname != null) {
map.put(new QName(qname.getUri(), qname.getName()), element);
}
}
/**
* Find the default namespace within a list of JiBX binding model elements possibly including
* namespace definitions. Once a non-namespace definition element is seen in the list, this just
* returns (since the namespace definitions always come first in JiBX's binding format).
*
* @param iter iterator for elements in list
* @param dns default namespace if not overridden
* @return default namespace
*/
private static String findDefaultNS(Iterator iter, String dns) {
while (iter.hasNext()) {
ElementBase child = (ElementBase)iter.next();
if (child.type() == ElementBase.NAMESPACE_ELEMENT) {
NamespaceElement namespace = (NamespaceElement)child;
String defaultName = namespace.getDefaultName();
if ("elements".equals(defaultName) || "all".equals(defaultName)) {
return namespace.getUri();
}
} else {
break;
}
}
return dns;
}
/**
* Inner class for handling prevalidation of include elements only. Unlike the normal JiBX
* binding definition prevalidation step, this visitor ignores everything except include
* elements.
*/
private class IncludePrevalidationVisitor extends ModelVisitor {
private final ValidationContext m_context;
private IncludePrevalidationVisitor(ValidationContext vctx) {
m_context = vctx;
}
/* (non-Javadoc)
* @see org.jibx.binding.model.ModelVisitor#visit(org.jibx.binding.model.ElementBase)
*/
public boolean visit(IncludeElement node) {
try {
// force creation of defintions context for containing binding
m_context.getFormatDefinitions();
node.prevalidate(m_context);
} catch (Throwable t) {
m_context.addFatal("Error during validation: " +
t.getMessage());
t.printStackTrace();
return false;
}
return true;
}
}
private static class NamedParameterTypeMapper extends JavaTypeMapper {
/**
* Return the real parameter name, not a dummy.
*
* @param qname
* @return local part of name
*/
public String getParameterName(QName qname) {
return qname.getLocalPart();
}
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?