Beispiel #1
0
        void AddSubelementsOfSkippedElement(TableNode parentNode, string xpath)
        {
            if (parentNode.Table.Skipped)
            {
                TableNode pparentNode = (TableNode)parentNode.UserData["parentnode"];
                string    path        = xpath + '/' + parentNode.Name;
                AddSubelementsOfSkippedElement(pparentNode, path);
                return;
                //-------
            }

            CodeCompileUnit     cunit          = (CodeCompileUnit)parentNode.UserData["cunit"];
            CodeNamespace       ns             = cunit.Namespaces[0];
            CodeTypeDeclaration persClass      = ns.Types[0];
            CodeConstructor     xmlConstructor = null;
            CodeMemberMethod    xmlSaveMethod  = null;

            foreach (CodeTypeMember member in persClass.Members)
            {
                if (member.Name == ".ctor")
                {
                    CodeConstructor cc = (CodeConstructor)member;
                    if (cc.Parameters.Count > 0)
                    {
                        xmlConstructor = cc;
                    }
                }
                else if (member.Name == "Save")
                {
                    CodeMemberMethod cmm = (CodeMemberMethod)member;
                    if (cmm.Parameters.Count == 1 && cmm.Parameters[0].Type.BaseType == "XmlNode")
                    {
                        xmlSaveMethod = cmm;
                    }
                }
                if (xmlConstructor != null && xmlSaveMethod != null)
                {
                    break;
                }
            }

            /*
             *                      XmlElement subElement = parentNode.OwnerDocument.CreateElement("MyElement");
             *                      newElement.AppendChild(subElement);
             *                      newElement = subElement;
             */
            int    p           = xpath.LastIndexOf(':');
            string namespc     = this.namespaceWrapper[NamespaceWrapper.GetPrefixFromQualifiedName(xpath)];
            string elementName = NamespaceWrapper.GetXpathFromQualifiedName(xpath);

            CodePrimitiveExpression         myElementName = new CodePrimitiveExpression(elementName);
            CodePrimitiveExpression         myNamespace   = new CodePrimitiveExpression(namespc);
            CodeVariableReferenceExpression newElement    = new CodeVariableReferenceExpression("myElement");
            CodeVariableReferenceExpression subElement    = new CodeVariableReferenceExpression("subElement");
            CodeVariableReferenceExpression ownerDoc      = new CodeVariableReferenceExpression("parentNode.OwnerDocument");
            CodeMethodInvokeExpression      createElementCall;

            if (namespc != null)
            {
                createElementCall = new CodeMethodInvokeExpression(ownerDoc, "CreateElement", myElementName, myNamespace);
            }
            else
            {
                createElementCall = new CodeMethodInvokeExpression(ownerDoc, "CreateElement", myElementName);
            }
            CodeVariableDeclarationStatement newElementAssign = new CodeVariableDeclarationStatement(new CodeTypeReference("XmlElement"), "subElement", createElementCall);

            xmlSaveMethod.Statements.Add(newElementAssign);

            CodeMethodInvokeExpression appendChild = new CodeMethodInvokeExpression(newElement, "AppendChild", subElement);

            xmlSaveMethod.Statements.Add(appendChild);

            CodeAssignStatement backAssign = new CodeAssignStatement(newElement, subElement);

            xmlSaveMethod.Statements.Add(backAssign);

            /*
             * xmlNode = xmlNode.SelectSingleNode("xpath");
             */
            CodeVariableReferenceExpression xmlNode       = new CodeVariableReferenceExpression("xmlNode");
            CodePrimitiveExpression         xPathExpr     = new CodePrimitiveExpression(xpath);
            CodeVariableReferenceExpression nsManager     = new CodeVariableReferenceExpression("NamespaceManager");
            CodePropertyReferenceExpression nsInstance    = new CodePropertyReferenceExpression(nsManager, "Instance");
            CodeMethodInvokeExpression      selectNodes   = new CodeMethodInvokeExpression(xmlNode, "SelectSingleNode", xPathExpr, nsInstance);
            CodeAssignStatement             xmlNodeAssign = new CodeAssignStatement(xmlNode, selectNodes);

            xmlConstructor.Statements.Add(xmlNodeAssign);

            GenerateMembers(persClass, xmlConstructor, xmlSaveMethod);


            // xmlNode = xmlNode.ParentNode;
            CodePropertyReferenceExpression parentNodeProperty = new CodePropertyReferenceExpression(xmlNode, "ParentNode");

            xmlNodeAssign = new CodeAssignStatement(xmlNode, parentNodeProperty);
            xmlConstructor.Statements.Add(xmlNodeAssign);

            // newElement = (XmlElement) newElement.ParentNode;
            parentNodeProperty = new CodePropertyReferenceExpression(newElement, "ParentNode");
            CodeCastExpression xmlElementCast = new CodeCastExpression("XmlElement", parentNodeProperty);

            backAssign = new CodeAssignStatement(newElement, xmlElementCast);
            xmlSaveMethod.Statements.Add(backAssign);
        }
Beispiel #2
0
        private void GenerateXmlLoadAndSaveCode(CodeConstructor xmlConstructor, CodeMemberMethod saveToXmlMethod, Relation relation, string foreignClassShort)
        {
            /*
             *      XmlNodeList nodeList = xmlNode.SelectNodes("SubNodeName");
             *      for(int i = 0; i < nodeList.Count; i = i + 1)
             *      {
             *              XmlNode subNode = nodeList[i];
             *              this.relationField.Add(new RelatedType(subNode));
             *      }
             */
            TargetLanguage targetLanguage = ApplicationController.Instance.AssemblyNode.Assembly.TargetLanguage;
            string         xpath          = null;

            if (relation.IsForeign)
            {
                xpath = ((ForeignFkRelation)relation).XPath;
            }
            else
            {
                throw new Exception("Internal Error 132 in RelationGenerator: Relation is not a ForeignFkRelation.");
            }

            string nodeListName = relation.FieldName + "NodeList";
            CodeVariableReferenceExpression nsManager  = new CodeVariableReferenceExpression("NamespaceManager");
            CodePropertyReferenceExpression nsInstance = new CodePropertyReferenceExpression(nsManager, "Instance");

            CodeVariableDeclarationStatement nodeListDecl = new CodeVariableDeclarationStatement("XmlNodeList", nodeListName,
                                                                                                 new CodeMethodInvokeExpression(new CodeVariableReferenceExpression("xmlNode"), "SelectNodes", new CodePrimitiveExpression(xpath), nsInstance));

            xmlConstructor.Statements.Add(nodeListDecl);

            CodeVariableReferenceExpression iExpr         = new CodeVariableReferenceExpression("i");
            CodeFieldReferenceExpression    relationField = new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), relation.FieldName);

            CodeIterationStatement forLoop = new CodeIterationStatement(
                new CodeAssignStatement(iExpr, new CodePrimitiveExpression(0)),
                new CodeBinaryOperatorExpression(
                    iExpr,
                    CodeBinaryOperatorType.LessThan,
                    new CodeVariableReferenceExpression(nodeListName + ".Count")),                 // should work in C# and VB
                new CodeAssignStatement(
                    iExpr,
                    new CodeBinaryOperatorExpression(
                        iExpr,
                        CodeBinaryOperatorType.Add,
                        new CodePrimitiveExpression(1))),
                new CodeVariableDeclarationStatement("XmlNode", "subNode",
                                                     new CodeIndexerExpression(
                                                         new CodeVariableReferenceExpression(nodeListName),
                                                         iExpr)),
                new CodeExpressionStatement(
                    new CodeMethodInvokeExpression(relationField, "Add",
                                                   new CodeObjectCreateExpression(foreignClassShort,
                                                                                  new CodeVariableReferenceExpression("subNode")))));

            xmlConstructor.Statements.Add(forLoop);

            /*
             * for ( int i = 0; i < relatedContainer.Count; i = i + 1 )
             * {
             *      RelatedType relObject = relContainer[i];
             *      relObject.Save(newElement, "Elementname", "Namespace");
             * }
             */
            string elementNodeName = null;

            string[] xpathParts = xpath.Split('/');
            if (xpath.IndexOf('/') > -1)
            {
                elementNodeName = GenerateNestedXpathCode(xpathParts, saveToXmlMethod);
            }
            else
            {
                elementNodeName = "myElement";
            }

            string elementPath = xpathParts[xpathParts.Length - 1];
            string namespc     = this.namespaceWrapper[NamespaceWrapper.GetPrefixFromQualifiedName(elementPath)];

            elementPath = NamespaceWrapper.GetXpathFromQualifiedName(elementPath);

            CodeExpression namespcExpr = new CodePrimitiveExpression(namespc);

            forLoop = new CodeIterationStatement(
                new CodeAssignStatement(iExpr, new CodePrimitiveExpression(0)),
                new CodeBinaryOperatorExpression(
                    iExpr,
                    CodeBinaryOperatorType.LessThan,
                    new CodePropertyReferenceExpression(relationField, "Count")),
                new CodeAssignStatement(
                    iExpr,
                    new CodeBinaryOperatorExpression(
                        iExpr,
                        CodeBinaryOperatorType.Add,
                        new CodePrimitiveExpression(1))),
                new CodeVariableDeclarationStatement(foreignClassShort, "relObject",
                                                     new CodeIndexerExpression(relationField, iExpr)),
                new CodeExpressionStatement(
                    new CodeMethodInvokeExpression(
                        new CodeVariableReferenceExpression("relObject"), "Save",
                        new CodeVariableReferenceExpression(elementNodeName),
                        new CodePrimitiveExpression(elementPath), namespcExpr)));

            saveToXmlMethod.Statements.Add(forLoop);
        }