}
// find or create the schema element and namespace
String sns = service.getNamespace();
SchemaHolder holder = m_schemaGenerator.findSchema(sns);
SchemaElement schema = holder.getSchema();
// process messages and operations used by service
ArrayList ops = service.getOperations();
Map fltmap = new HashMap();
Set imports = new InsertionOrderedSet();
Map typemap = new HashMap(ptypemap);
for (int i = 0; i < ops.size(); i++) {
// get information for operation
OperationCustom odef = (OperationCustom)ops.get(i);
String oname = odef.getOperationName();
Operation op = new Operation(oname);
op.setDocumentation(odef.getDocumentation());
op.setSoapAction(odef.getSoapAction());
// generate input message information
Message rqmsg = new Message(odef.getRequestMessageName(), wns);
op.addInputMessage(rqmsg);
def.addMessage(rqmsg);
QName rqelem = null;
if (m_generationParameters.isDocLit()) {
// check if input parameter defined for method
ArrayList parms = odef.getParameters();
if (parms.size() > 0) {
// check for existing element definition matching the parameter type
ValueCustom parm = (ValueCustom)parms.get(0);
rqelem = (QName)classelems.get(parm.getWorkingType());
if (rqelem == null) {
// create new element for parameter
ElementElement pelem = buildValueElement(parm, ptypemap, typeschemas, holder);
schema.getTopLevelChildren().add(pelem);
rqelem = pelem.getQName();
} else {
// import and use existing element definition
imports.add(elemschemas.get(rqelem));
addSchemaReference(rqelem, elemschemas, holder);
}
}
} else {
// construct a sequence for wrapped method parameters
SequenceElement seq = new SequenceElement();
ArrayList parms = odef.getParameters();
for (int j = 0; j < parms.size(); j++) {
ValueCustom parm = (ValueCustom)parms.get(j);
String type = parm.getWorkingType();
ElementElement pelem;
if (!typemap.containsKey(type)) {
// add predefined mapping type to known types and require schema import
QName tname = (QName)classtypes.get(type);
if (tname != null) {
typemap.put(type, tname);
imports.add(typeschemas.get(tname));
}
}
pelem = buildValueElement(parm, ptypemap, typeschemas, holder);
seq.getParticleList().add(pelem);
}
// add corresponding schema definition to schema
ComplexTypeElement tdef = new ComplexTypeElement();
tdef.setContentDefinition(seq);
ElementElement elem = new ElementElement();
String wname = odef.getRequestWrapperName();
elem.setName(wname);
elem.setTypeDefinition(tdef);
schema.getTopLevelChildren().add(elem);
rqelem = new QName(sns, wname);
}
// add part definition to message (if present)
if (rqelem != null) {
MessagePart part = new MessagePart("part", rqelem);
rqmsg.getParts().add(part);
def.addNamespace(rqelem.getUri());
}
// generate output message information
Message rsmsg = new Message(odef.getResponseMessageName(), wns);
op.addOutputMessage(rsmsg);
def.addMessage(rsmsg);
ValueCustom rtrn = odef.getReturn();
QName rselem = null;
if (m_generationParameters.isDocLit()) {
// check if return value defined for method
if (!"void".equals(rtrn.getWorkingType())) {
// check for existing element definition matching the return type
rselem = (QName)classelems.get(rtrn.getWorkingType());
if (rselem == null) {
// create new element for return
ElementElement relem = buildValueElement(rtrn, ptypemap, typeschemas, holder);
schema.getTopLevelChildren().add(relem);
rselem = relem.getQName();
} else {
// import and use existing element definition
imports.add(elemschemas.get(rselem));
addSchemaReference(rqelem, elemschemas, holder);
}
}
} else {
// add corresponding schema definition to schema
SequenceElement seq = new SequenceElement();
if (!"void".equals(rtrn.getWorkingType())) {
ElementElement relem = buildValueElement(rtrn, ptypemap, typeschemas, holder);
seq.getParticleList().add(relem);
}
ComplexTypeElement tdef = new ComplexTypeElement();
tdef.setContentDefinition(seq);
ElementElement elem = new ElementElement();
String wname = odef.getResponseWrapperName();
elem.setName(wname);
elem.setTypeDefinition(tdef);
schema.getTopLevelChildren().add(elem);
rselem = new QName(sns, wname);
}
// add part definition to message (if present)
if (rselem != null) {
MessagePart part = new MessagePart("part", rselem);
rsmsg.getParts().add(part);
def.addNamespace(rselem.getUri());
}
// process fault message(s) for operation
ArrayList thrws = odef.getThrows();
WsdlCustom wsdlcustom = m_generationParameters.getWsdlCustom();
for (int j = 0; j < thrws.size(); j++) {
ThrowsCustom thrw = (ThrowsCustom)thrws.get(j);
String type = thrw.getType();
Message fmsg = (Message)fltmap.get(type);
if (fmsg == null) {
// first time for this throwable, create the message
FaultCustom fault = wsdlcustom.forceFaultCustomization(type);
QName fqname = new QName(sns, fault.getElementName());
MessagePart part = new MessagePart("fault", fqname);
fmsg = new Message(fault.getFaultName(), wns);
fmsg.getParts().add(part);
def.addMessage(fmsg);
def.addNamespace(sns);
// make sure the corresponding mapping exists
BindingMappingDetail detail = m_bindingGenerator.getMappingDetail(fault.getDataType());
if (detail == null) {
throw new IllegalStateException("No mapping found for type " + type);
}
// record that the fault has been defined
fltmap.put(type, fmsg);
}
// add fault to operation definition
op.addFaultMessage(fmsg);
}
// add operation to list of definitions
def.addOperation(op);
}
// include embedded schema for message definitions only if needed
if (holder.getReferences().size() > 0 || schema.getChildCount() > 0) {
def.getSchemas().add(schema);
}
return def;
}