codegenerationutility.java
来自「开源的axis2框架的源码。用于开发WEBSERVER」· Java 代码 · 共 1,193 行 · 第 1/4 页
JAVA
1,193 行
Element detail = doc.createElement("binding-namespace");
detail.setAttribute("ns", ns);
detail.setAttribute("prefix", prefix);
bindinit.appendChild(detail);
}
details.add(bindinit);
// add details for all objects used as inputs/outputs/faults
for (Iterator iter = objins.iterator(); iter.hasNext();) {
String classname = (String)iter.next();
Element detail = doc.createElement("object-input");
detail.setAttribute("type", classname);
details.add(detail);
}
for (Iterator iter = objouts.iterator(); iter.hasNext();) {
String classname = (String)iter.next();
Element detail = doc.createElement("object-output");
detail.setAttribute("type", classname);
details.add(detail);
}
for (Iterator iter = objfaults.iterator(); iter.hasNext();) {
String classname = (String)iter.next();
Element detail = doc.createElement("object-fault");
detail.setAttribute("type", classname);
details.add(detail);
}
codeGenConfig.getAxisService()
.addParameter(new Parameter(Constants.DATABINDING_SERVICE_DETAILS, details));
} catch (FileNotFoundException e) {
throw new RuntimeException(e);
} catch (JiBXException e) {
throw new RuntimeException(e);
} catch (ParserConfigurationException e) {
throw new RuntimeException(e);
} catch (AxisFault e) {
throw new RuntimeException(e);
} catch (MalformedURLException e) {
throw new RuntimeException(e);
}
}
/**
* Check if a class is potentially usable for looking up binding information.
*
* @param type fully-qualified type name
* @return <code>true</code> if potentially usable, <code>false</code> if not
*/
private static boolean isLookupClass(String type) {
return !type.startsWith("java.") && !type.startsWith("javax.") &&
!type.startsWith("org.w3c.");
}
/**
* Add format definition for type with built-in JiBX handling to map.
*
* @param stype schema type name
* @param jtype java type name
* @param sname serializer method name
* @param dname deserializer method name
* @param dflt default value
* @param map schema type qname to format definition map
*/
private static void buildFormat(String stype, String jtype, String sname,
String dname, String dflt, Map map) {
FormatElement format = new FormatElement();
format.setTypeName(jtype);
format.setSerializerName(sname);
format.setDeserializerName(dname);
format.setDefaultText(dflt);
map.put(new QName(SCHEMA_NAMESPACE, stype), format);
}
/**
* Handles unwrapping a message. This generates and returns the detailed description of how the
* message is to be unwrapped. It also creates the data structures expected by the code
* generation in order to be somewhat compatible with ADB unwrapping.
*
* @param msg message to be unwrapped
* @param isout output message flag (wrapper inherits inner type, for XSLTs)
* @param simpleTypeMap binding formats
* @param elementMap map from element names to concrete mapping components of binding
* @param complexTypeMap binding mappings
* @param typeMappedClassMap map from type qname to index
* @param bindingMap map from mapping components to containing binding definition
* @param nameset parameter variable names used in method
* @param nsmap mapr from URI to prefix for namespaces to be defined on wrapper
* element
* @param doc document used for DOM components
* @return detailed description element for code generation
*/
private Element unwrapMessage(AxisMessage msg, boolean isout,
Map simpleTypeMap, Map elementMap, Map complexTypeMap, Map typeMappedClassMap,
Map bindingMap, Set nameset, Map nsmap, Document doc) {
// find the schema definition for this message element
QName qname = msg.getElementQName();
if (qname == null) {
throw new RuntimeException("No element reference in message " + msg.getName());
}
XmlSchemaElement wrapdef = codeGenConfig.getAxisService().getSchemaElement(qname);
if (wrapdef == null) {
throw new RuntimeException("Cannot unwrap - no definition found for element " + qname);
}
XmlSchemaType type = wrapdef.getSchemaType();
// create document to hold data binding details for element
Element wrapdetail = doc.createElement(isout ? "out-wrapper" : "in-wrapper");
wrapdetail.setAttribute("ns", qname.getNamespaceURI());
wrapdetail.setAttribute("name", qname.getLocalPart());
// dig down to the complexType particle
List partNameList = new ArrayList();
String wrappertype = "";
boolean nons = qname.getNamespaceURI().length() == 0;
boolean dfltns = false;
boolean complex = false;
if (type instanceof XmlSchemaComplexType) {
XmlSchemaComplexType ctype = (XmlSchemaComplexType)type;
if (ctype.getAttributes().getCount() != 0) {
throw new RuntimeException("Cannot unwrap element " +
qname + ": attributes not allowed on type to be unwrapped");
}
XmlSchemaParticle particle = ctype.getParticle();
if (particle != null) {
// if there's a particle present, it must be a sequence
if (!(particle instanceof XmlSchemaSequence)) {
throw new RuntimeException("Cannot unwrap element " +
qname + ": type to be unwrapped must be a sequence");
}
if (particle.getMinOccurs() != 1 || particle.getMaxOccurs() != 1) {
throw new RuntimeException("Cannot unwrap element " +
qname +
": contained sequence must have minOccurs='1' and maxOccurs='1'");
}
XmlSchemaSequence sequence = (XmlSchemaSequence)particle;
// add child param element matching each child of wrapper element
QName opName = msg.getAxisOperation().getName();
XmlSchemaObjectCollection items = sequence.getItems();
boolean first = true;
for (Iterator iter = items.getIterator(); iter.hasNext();) {
// check that child item obeys the unwrapping rules
XmlSchemaParticle item = (XmlSchemaParticle)iter.next();
if (!(item instanceof XmlSchemaElement)) {
throw new RuntimeException("Cannot unwrap element " +
qname + ": only element items allowed in sequence");
}
XmlSchemaElement element = (XmlSchemaElement)item;
QName refname = element.getRefName();
QName typename = element.getSchemaTypeName();
if (refname == null && typename == null) {
throw new RuntimeException("Cannot unwrap element " +
qname +
": all elements in contained sequence must be element references or reference a named type");
}
if (first) {
first = false;
} else if (isout) {
throw new RuntimeException("Cannot unwrap element " +
qname +
": only one child element allowed in sequence for wrapped output");
}
// add element to output with details of this element handling
Element param =
doc.createElement(isout ? "return-element" : "parameter-element");
QName itemname = (refname == null) ? element.getQName() : refname;
nons = nons || itemname.getNamespaceURI().length() == 0;
param.setAttribute("ns", itemname.getNamespaceURI());
param.setAttribute("name", itemname.getLocalPart());
String javaname = toJavaName(itemname.getLocalPart(), nameset);
param.setAttribute("java-name", javaname);
param.setAttribute("nillable", Boolean.toString(element.isNillable()));
boolean optional = element.getMinOccurs() == 0;
param.setAttribute("optional", Boolean.toString(optional));
boolean isarray = element.getMaxOccurs() > 1;
param.setAttribute("array", Boolean.toString(isarray));
String javatype;
String createtype = null;
if (element.getSchemaType() instanceof XmlSchemaSimpleType) {
// simple type translates to format element in binding
FormatElement format = (FormatElement)simpleTypeMap.get(typename);
if (format == null) {
// check for restriction with simple base, and treat as base if so
XmlSchemaSimpleType stype = (XmlSchemaSimpleType)element.getSchemaType();
XmlSchemaSimpleTypeContent content = stype.getContent();
if (content instanceof XmlSchemaSimpleTypeRestriction) {
QName tname = ((XmlSchemaSimpleTypeRestriction)content).getBaseTypeName();
if (SCHEMA_NAMESPACE.equals(tname.getNamespaceURI())) {
format = (FormatElement)simpleTypeMap.get(tname);
if (format != null) {
typename = tname;
}
}
}
}
if (format == null) {
throw new RuntimeException("Cannot unwrap element " +
qname + ": no format definition found for type " +
typename + " (used by element " + itemname + ')');
}
javatype = format.getTypeName();
param.setAttribute("form", "simple");
param.setAttribute("serializer", format.getSerializerName());
param.setAttribute("deserializer", format.getDeserializerName());
// convert primitive types to wrapper types for nillable
if ((optional || element.isNillable()) &&
s_wrapperMap.containsKey(javatype)) {
param.setAttribute("wrapped-primitive", "true");
param.setAttribute("value-method", javatype + "Value");
javatype = (String)s_wrapperMap.get(javatype);
} else {
param.setAttribute("wrapped-primitive", "false");
String dflt = element.getDefaultValue();
if (dflt == null) {
dflt = format.getDefaultText();
if (javatype.equals("float")) {
dflt = dflt + 'F';
}
}
if (dflt != null) {
param.setAttribute("default", dflt);
}
}
} else {
// conversion must be defined by mapping
MappingElement mapping;
if (refname == null) {
// complex type reference translates to abstract mapping in binding
mapping = (MappingElement)complexTypeMap.get(typename);
if (mapping == null) {
throw new RuntimeException("Cannot unwrap element " +
qname + ": no abstract mapping definition found for type " +
typename + " (used by element " + itemname + ')');
}
Integer tindex = (Integer)typeMappedClassMap.get(typename);
if (tindex == null) {
tindex = new Integer(typeMappedClassMap.size());
typeMappedClassMap.put(typename, tindex);
}
param.setAttribute("type-index", tindex.toString());
} else {
// element reference translates to concrete mapping
mapping = (MappingElement)elementMap.get(refname);
if (mapping == null) {
throw new RuntimeException("Cannot unwrap element " +
qname + ": no concrete mapping definition found for element " +
refname + " (used by element " + itemname + ')');
}
param.setAttribute("type-index", "");
}
// configure based on the mapping information
param.setAttribute("form", "complex");
complex = true;
javatype = mapping.getClassName();
createtype = mapping.getCreateType();
if (createtype == null && mapping.isAbstract() &&
mapping.getExtensionTypes().isEmpty()) {
// abstract mapping with no extensions requires instance
// this assumes the mapped type can be created, but no easy way to check
createtype = javatype;
}
// merge contained namespace definitions into set for operation
Iterator citer = mapping.topChildIterator();
while (citer.hasNext()) {
ElementBase child = (ElementBase)citer.next();
if (child.type() == ElementBase.NAMESPACE_ELEMENT) {
dfltns = mapNamespace((NamespaceElement)child, dfltns, nsmap);
} else {
break;
}
}
// also merge namespace definitions from binding
BindingElement binding = (BindingElement)bindingMap.get(mapping);
citer = binding.topChildIterator();
while (citer.hasNext()) {
ElementBase child = (ElementBase)citer.next();
if (child.type() == ElementBase.NAMESPACE_ELEMENT) {
dfltns = mapNamespace((NamespaceElement)child, dfltns, nsmap);
} else if (child.type() != ElementBase.INCLUDE_ELEMENT) {
break;
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?