// Beállítja a megfelelő referenciákat private void Linking() { foreach (StoreItem coll in store) { XElement def = coll.definition; switch (coll.objectType) { case StoreItemType.service: { Wr("Processing: (" + coll.objectType + ")" + coll.name); Endpoint ep = (Endpoint)coll.objRef; // binding beállítása: string bindingName = (string)def.Element(wsdlNS + "port").Attribute("binding"); StoreItem bindingObject = SearchObject(StoreItemType.binding, bindingName, def); ep.Binding = (Binding)bindingObject.objRef; Wr(" -add binding: " + ep.Binding.Name); // interface beállítása string interfaceName = (string)bindingObject.definition.Attribute("type"); StoreItem interfaceObject = SearchObject(StoreItemType.portType, interfaceName, bindingObject.definition); ep.Interface = (Interface)interfaceObject.objRef; Wr(" -add interface: " + ep.Interface.Name); // Address beállítása string location = ""; try { location = (string)def.Element(wsdlNS + "port").Element(soapNS + "address").Attribute("location"); } catch (Exception) { } try { location = (string)def.Element(wsdlNS + "port").Element(soap12NS + "address").Attribute("location"); } catch (Exception) { } EndpointAddress epa = new EndpointAddress(location); ep.Address = epa; Wr(" -add address: " + ep.Address.Uri); ep.Namespace = nsDictionary[coll.ownNS]; } break; case StoreItemType.binding: { Wr("Processing: (" + coll.objectType + ")" + coll.name); Binding bi = (Binding)coll.objRef; // interface beállítása //string interfaceName = (string)def.Attribute("type"); //StoreItem interfaceObject = SearchObject(StoreItemType.portType, interfaceName, def); //bi.Interface = (Interface)interfaceObject.objRef; //Wr(" -add interface: " + interfaceName); string transport = ""; SoapEncodingBindingElement sebe = new SoapEncodingBindingElement(); try { transport = (string)def.Element(soapNS + "binding").Attribute("transport"); sebe.Version = SoapVersion.Soap11; } catch (Exception) { } try { transport = (string)def.Element(soap12NS + "binding").Attribute("transport"); sebe.Version = SoapVersion.Soap12; } catch (Exception) { } HttpTransportBindingElement htbe = new HttpTransportBindingElement(); bi.Encoding = sebe; Wr(" -set SOAP version: " + sebe.Version.ToString()); bi.Transport = htbe; bi.Namespace = nsDictionary[coll.ownNS]; } break; case StoreItemType.portType: { Wr("Processing: (" + coll.objectType + ")" + coll.name); Interface ifa = (Interface)coll.objRef; var operations = from c in def.Descendants(wsdlNS + "operation") select c; foreach (XElement operation in operations) { string operationName = (string)operation.Attribute("name"); Operation op = new Operation() { Name = operationName }; Wr(" -add operation: " + op.Name); XElement input = operation.Element(wsdlNS + "input"); if (input == null) { Wr(" -no inputs"); } else { string inputName = (string)input.Attribute("name"); string messageName = (string)input.Attribute("message"); StoreItem messageObject = SearchObject(StoreItemType.message, messageName, def); var operationInputs = from c in messageObject.definition.Descendants(wsdlNS + "part") select c; Wr(" -inputs:"); foreach (XElement operationInput in operationInputs) { string inputMsgPartName = (string)operationInput.Attribute("name"); string typeName = (string)operationInput.Attribute("type"); string elementName = (string)operationInput.Attribute("element"); if (typeName != null) { SoaMetaModel.Type type = SearchType(typeName, def); OperationParameter opParam = new OperationParameter() { Name = inputMsgPartName, Type = type, Operation = op }; op.Parameters.Add(opParam); Wr(" -add parameter: (" + type.Name + ")" + opParam.Name); } else if (elementName != null) { StoreItem element = TrySearchObject(StoreItemType.unNamedElementType, elementName, def); if (operationInputs.Count<XElement>() == 1 && elementName.Split(char.Parse(":")).GetValue(1).Equals(operationName)) { // Ekkor a formázási stílus Document/wrapped StoreItem concrateType; if (element == null) { concrateType = TrySearchObject(StoreItemType.structType, elementName, def); if (concrateType == null) { concrateType = SearchObject(StoreItemType.arrayType, elementName, def); } var elementsInReferencedType = from c in concrateType.definition.Descendants(xsdNS + "element") select c; foreach (XElement elementInReferencedType in elementsInReferencedType) { string elementInReferencedTypeName = (string)elementInReferencedType.Attribute("name"); string elementInReferencedTypeType = (string)elementInReferencedType.Attribute("type"); SoaMetaModel.Type type = SearchType(elementInReferencedTypeType, elementInReferencedType); OperationParameter opParam = new OperationParameter() { Name = elementInReferencedTypeName, Type = type, Operation = op }; op.Parameters.Add(opParam); Wr(" -add parameter: (" + type.Name + ")" + opParam.Name); } } else { string referencedTypeName = (string)element.definition.Attribute("type"); SoaMetaModel.Type type = SearchType(referencedTypeName, element.definition); OperationParameter opParam = new OperationParameter() { Name = inputMsgPartName, Type = type, Operation = op }; op.Parameters.Add(opParam); Wr(" -add parameter: (" + type.Name + ")" + opParam.Name); } } else { SoaMetaModel.Type type; if (element == null) { type = SearchType(elementName, def); } else { string referencedTypeName = (string)element.definition.Attribute("type"); type = SearchType(referencedTypeName, element.definition); } OperationParameter opParam = new OperationParameter() { Name = inputMsgPartName, Type = type, Operation = op }; op.Parameters.Add(opParam); Wr(" -add parameter: (" + type.Name + ")" + opParam.Name); } } else { // TODO } } } XElement output = operation.Element(wsdlNS + "output"); if (output == null) { Wr(" -no output"); } else { string outputName = (string)output.Attribute("name"); string messageName = (string)output.Attribute("message"); StoreItem messageObject = SearchObject(StoreItemType.message, messageName, def); XElement operationOutput = messageObject.definition.Element(wsdlNS + "part"); string typeName = (string)operationOutput.Attribute("type"); string elementName = (string)operationOutput.Attribute("element"); SoaMetaModel.Type type = null; if (typeName != null) { type = SearchType(typeName, def); } else if (elementName != null) { StoreItem element = TrySearchObject(StoreItemType.unNamedElementType, elementName, def); if (element == null) { type = SearchType(elementName, def); } else { string referencedTypeName = (string)element.definition.Attribute("type"); type = SearchType(referencedTypeName, element.definition); } } else { //TODO } op.ReturnType = type; Wr(" -return type: " + type.Name); } var faults = from c in operation.Descendants(wsdlNS + "fault") select c; if (faults.Count<XElement>() == 0) { Wr(" -no faults"); } else { Wr(" -faults:"); foreach (XElement fault in faults) { string faultName = (string)fault.Attribute("name"); string messageName = (string)fault.Attribute("message"); StoreItem messageObject = SearchObject(StoreItemType.message, messageName, def); var operationFaults = from c in messageObject.definition.Descendants(wsdlNS + "part") select c; foreach (XElement operationFault in operationFaults) { string FaultMsgPartName = (string)operationFault.Attribute("name"); string typeName = (string)operationFault.Attribute("type"); string elementName = (string)operationFault.Attribute("element"); SoaMetaModel.Type type = null; if (typeName != null) { type = SearchType(typeName, def); } else if (elementName != null) { StoreItem element = TrySearchObject(StoreItemType.unNamedElementType, elementName, def); if (element == null) { type = SearchType(elementName, def); } else { string referencedTypeName = (string)element.definition.Attribute("type"); type = SearchType(referencedTypeName, element.definition); } } else { //TODO } op.Exceptions.Add((ExceptionType)type); Wr(" -add exception: " + type.Name); } } } ifa.Operations.Add(op); } ifa.Namespace = nsDictionary[coll.ownNS]; } break; case StoreItemType.enumType: { Wr("Processing: (" + coll.objectType + ")" + coll.name); EnumType et = (EnumType)coll.objRef; var enumValues = from c in def.Descendants(xsdNS + "enumeration") select c; foreach (XElement enumValue in enumValues) { string value = (string)enumValue.Attribute("value"); EnumValue ev = new EnumValue() { Enum = et, Name = value }; Wr(" -add enumValue: " + ev.Name); } et.Namespace = nsDictionary[coll.ownNS]; } break; case StoreItemType.exceptionType: { Wr("Processing: (" + coll.objectType + ")" + coll.name); ExceptionType ex = (ExceptionType)coll.objRef; try { string extensionBase = (string)def.Element(xsdNS + "complexContent").Element(xsdNS + "extension").Attribute("base"); SoaMetaModel.Type extType = SearchType(extensionBase, def); ex.SuperType = (ExceptionType)extType; Wr(" -set extension: " + ex.SuperType.Name); } catch (Exception) { Wr(" -no extension"); } var elements = from c in def.Descendants(xsdNS + "element") select c; foreach (XElement element in elements) { string elementName = (string)element.Attribute("name"); string elementType = (string)element.Attribute("type"); SoaMetaModel.Type type = SearchType(elementType, def); ExceptionField sf = new ExceptionField() { Name = elementName, Exception = ex, Type = type, }; ex.Fields.Add(sf); } ex.Namespace = nsDictionary[coll.ownNS]; } break; case StoreItemType.structType: { Wr("Processing: (" + coll.objectType + ")" + coll.name); StructType st = (StructType)coll.objRef; try { string extensionBase = (string)def.Element(xsdNS + "complexContent").Element(xsdNS + "extension").Attribute("base"); SoaMetaModel.Type extType = SearchType(extensionBase, def); st.SuperType = (StructType)extType; Wr(" -set extension: " + st.SuperType.Name); } catch (Exception) { Wr(" -no extension"); } var elements = from c in def.Descendants(xsdNS + "element") select c; foreach (XElement element in elements) { string elementName = (string)element.Attribute("name"); string elementType = (string)element.Attribute("type"); SoaMetaModel.Type type = SearchType(elementType, def); StructField sf = new StructField() { Name = elementName, Struct = st, Type = type }; st.Fields.Add(sf); } st.Namespace = nsDictionary[coll.ownNS]; } break; case StoreItemType.arrayType: { Wr("Processing: (" + coll.objectType + ")" + coll.name); ArrayType at = (ArrayType)coll.objRef; try { string typeName = (string)def.Element(xsdNS + "sequence").Element(xsdNS + "element").Attribute("type"); SoaMetaModel.Type type = SearchType(typeName, def); at.ItemType = type; Wr(" -set array type: " + at.ItemType.Name); } catch (Exception) { Wr(" -no array type"); } at.Namespace = nsDictionary[coll.ownNS]; } break; default: //throw new Exception(); break; } coll.isReady = true; } }
// Beállítja a megfelelő referenciákat private void Linking() { foreach (Collective coll in readedElements) { XElement def = coll.definition; switch (coll.objectType) { case ObjectTypes.service: { Wr("Processing: (" + coll.objectType + ")" + coll.name); Endpoint ep = (Endpoint)coll.objRef; // binding beállítása: string bindingName = (string)def.Element(wsdlNS + "port").Attribute("binding"); Collective bindingObject = SearchObject(ObjectTypes.binding, bindingName, def); ep.Binding = (Binding)bindingObject.objRef; Wr(" -add binding: " + ep.Binding.Name); // interface beállítása string interfaceName = (string)bindingObject.definition.Attribute("type"); Collective interfaceObject = SearchObject(ObjectTypes.porttype, interfaceName, bindingObject.definition); ep.Interface = (Interface)interfaceObject.objRef; Wr(" -add interface: " + ep.Interface.Name); // Address beállítása string location = ""; try { location = (string)def.Element(wsdlNS + "port").Element(soapNS + "address").Attribute("location"); } catch (Exception) { } try { location = (string)def.Element(wsdlNS + "port").Element(soap12NS + "address").Attribute("location"); } catch (Exception e) { } EndpointAddress epa = new EndpointAddress(location); ep.Address = epa; Wr(" -add address: " + ep.Address.Uri); } break; case ObjectTypes.binding: { Wr("Processing: (" + coll.objectType + ")" + coll.name); Binding bi = (Binding)coll.objRef; //// interface beállítása //string interfaceName = (string)def.Attribute("type"); //Collective interfaceObject = SearchObject(ObjectTypes.porttype, interfaceName, def); //bi.Interface = (Interface)interfaceObject.objRef; //Wr(" -add interface: " + bi.Interface.Name); //string transport = ""; //EncodingBindingElement ebe = new EncodingBindingElement(); //try //{ // transport = (string)def.Element(soapNS + "binding").Attribute("transport"); // // ebe beállítása //} //catch (Exception e) { } //try //{ // transport = (string)def.Element(soap12NS + "binding").Attribute("transport"); // // ebe beállítása //} //catch (Exception e) { } //TransportBindingElement tbe = new TransportBindingElement(); //// tbe beállítása //bi.Encoding = ebe; //bi.Transport = tbe; } break; case ObjectTypes.porttype: { Wr("Processing: (" + coll.objectType + ")" + coll.name); Interface ifa = (Interface)coll.objRef; var operations = from c in def.Descendants(wsdlNS + "operation") select c; foreach (XElement operation in operations) { string name = (string)operation.Attribute("name"); Operation op = new Operation() { Name = name }; Wr(" -add operation: " + op.Name); try { XElement input = operation.Element(wsdlNS + "input"); string inputName = (string)input.Attribute("name"); // !!! EZ ITT MINEK LEGYEN A NEVE ??? string messageName = (string)input.Attribute("message"); Collective messageObject = SearchObject(ObjectTypes.message, messageName, def); var operationInputs = from c in messageObject.definition.Descendants(wsdlNS + "part") select c; Wr(" -inputs:"); foreach (XElement operationInput in operationInputs) { string inputMsgPartName = (string)operationInput.Attribute("name"); string typeName = (string)operationInput.Attribute("element"); SoaMetaModel.Type type = SearchType(typeName, def); OperationParameter opParam = new OperationParameter() { Name = inputName, Type = type, Operation = op }; op.Parameters.Add(opParam); Wr(" -add parameter: (" + typeName + ")" + opParam.Name); } } catch (Exception e) { Wr(" -no inputs"); } try { XElement output = operation.Element(wsdlNS + "output"); string outputName = (string)output.Attribute("name"); // !!! EZ ITT MINEK LEGYEN A NEVE ??? string messageName = (string)output.Attribute("message"); Collective messageObject = SearchObject(ObjectTypes.message, messageName, def); XElement operationOutput = messageObject.definition.Element(wsdlNS + "part"); string typeName = (string)operationOutput.Attribute("element"); SoaMetaModel.Type type = SearchType(typeName, def); op.ReturnType = type; Wr(" -return type: " + type.Name); } catch (Exception e) { Wr(" -no output"); } try { XElement fault = operation.Element(wsdlNS + "fault"); string faultName = (string)fault.Attribute("name"); // !!! EZ ITT MINEK LEGYEN A NEVE ??? string messageName = (string)fault.Attribute("message"); Collective messageObject = SearchObject(ObjectTypes.message, messageName, def); var operationFaults = from c in messageObject.definition.Descendants(wsdlNS + "part") select c; Wr(" -faults:"); foreach (XElement operationFault in operationFaults) { string FaultMsgPartName = (string)operationFault.Attribute("name"); string typeName = (string)operationFault.Attribute("element"); SoaMetaModel.Type type = SearchType(typeName, def); op.Exceptions.Add((ExceptionType)type); Wr(" -add exception: " + type.Name); } } catch (Exception e) { Wr(" -no faults"); } // ??? op.InputType // ??? op.OutputType } } break; case ObjectTypes.enumType: { Wr("Processing: (" + coll.objectType + ")" + coll.name); EnumType et = (EnumType)coll.objRef; // ??? et.UnderlyingType var enumValues = from c in def.Descendants(xmlNS + "enumeration") select c; foreach (XElement enumValue in enumValues) { string value = (string)enumValue.Attribute("value"); EnumValue ev = new EnumValue() { Enum = et, Name = value }; Wr(" -add enumValue: " + ev.Name); } } break; case ObjectTypes.exceptionType: { Wr("Processing: (" + coll.objectType + ")" + coll.name); ExceptionType ex = (ExceptionType)coll.objRef; try { string extensionBase = (string)def.Element(xmlNS + "complexContent").Element(xmlNS + "extension").Attribute("base"); SoaMetaModel.Type extType = SearchType(extensionBase, def); ex.SuperType = (ExceptionType)extType; Wr(" -set extension: " + ex.SuperType.Name); } catch (Exception e) { Wr(" -no extension"); } var elements = from c in def.Descendants(xmlNS + "element") select c; foreach (XElement element in elements) { string elementName = (string)element.Attribute("name"); string elementType = (string)element.Attribute("type"); SoaMetaModel.Type type = SearchType(elementType, def); ExceptionField sf = new ExceptionField() { Name = elementName, Exception = ex, Type = type, }; ex.Fields.Add(sf); } } break; case ObjectTypes.structType: { Wr("Processing: (" + coll.objectType + ")" + coll.name); StructType st = (StructType)coll.objRef; try { string extensionBase = (string)def.Element(xmlNS + "complexContent").Element(xmlNS + "extension").Attribute("base"); SoaMetaModel.Type extType = SearchType(extensionBase, def); st.SuperType = (StructType)extType; Wr(" -set extension: " + st.SuperType.Name); } catch (Exception e) { Wr(" -no extension"); } var elements = from c in def.Descendants(xmlNS + "element") select c; foreach (XElement element in elements) { string elementName = (string)element.Attribute("name"); string elementType = (string)element.Attribute("type"); SoaMetaModel.Type type = SearchType(elementType, def); StructField sf = new StructField() { Name = elementName, Struct = st, Type = type }; st.Fields.Add(sf); } } break; case ObjectTypes.arrayType: { Wr("Processing: (" + coll.objectType + ")" + coll.name); ArrayType at = (ArrayType)coll.objRef; try { string typeName = (string)def.Element(xmlNS + "sequence").Element(xmlNS + "element").Attribute("type"); SoaMetaModel.Type type = SearchType(typeName, def); at.ItemType = type; Wr(" -set array type: " + at.ItemType.Name); } catch (Exception e) { Wr(" -no array type"); } } break; default: //throw new Exception(); break; } coll.isReady = true; } }