[Uml-devel] [Bug 131528] crash on adding operation to class with Advanced Code Generators enabled

Oliver Kellogg okellogg at users.sourceforge.net
Thu Mar 22 23:12:00 UTC 2007


------- You are receiving this mail because: -------
You are the assignee for the bug, or are watching the assignee.
         
http://bugs.kde.org/show_bug.cgi?id=131528         
okellogg users sourceforge net changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|NEW                         |RESOLVED
         Resolution|                            |FIXED



------- Additional Comments From okellogg users sourceforge net  2007-03-23 00:11 -------
SVN commit 645578 by okellogg:

Add missing calls to initCodeClassFields() and synchronize() on newly 
 constructed ClassifierCodeDocument child class instances.
BUG:131528


 M  +3 -0      ChangeLog  
 M  +15 -11    umbrello/codegenerator.cpp  
 M  +8 -1      umbrello/codegenerator.h  
 M  +8 -2      umbrello/codegenerators/codegenfactory.cpp  
 M  +3 -1      umbrello/codegenerators/cppcodegenerator.cpp  


--- branches/KDE/3.5/kdesdk/umbrello/ChangeLog #645577:645578
 @ -5,11 +5,14  @
 * Java interface inheritance, abstract classes and generics in code generation
   (53376)
 * Code generation ignores unidirectional association (72042)
+* Design bug in advanced code generators (84739)
 * %date% and %time% not being parsed (96612)
 * Operations of the Interface are not implemented in the class automatically
   (111593)
 * Relationships for entities do not live outside of the diagram (125146)
 * Multiplicity labels often are placed incorrectly (127628)
+* Crash on adding operation to class with Advanced Code Generators enabled
+  (131528)
 * Javascript wrong Code Generation (135527)
 * Javascript Code Generation creates bad format methods (135540)
 * Incorrect Association Properties text (139872)
--- branches/KDE/3.5/kdesdk/umbrello/umbrello/codegenerator.cpp #645577:645578
 @ -5,7 +5,7  @
  *   the Free Software Foundation; either version 2 of the License, or     *
  *   (at your option) any later version.                                   *
  *                                                                         *
- *   copyright (C) 2004-2006                                               *
+ *   copyright (C) 2004-2007                                               *
  *   Umbrello UML Modeller Authors <uml-devel uml sf net>                  *
  ***************************************************************************/
 
 @ -57,16 +57,14  @
 CodeGenerator::CodeGenerator ()
         : QObject (UMLApp::app()->getDocument())
 {
-    initFields(UMLApp::app()->getDocument());
-    CodeGenerationPolicy *commonPolicy = UMLApp::app()->getCommonPolicy();
-    connect(commonPolicy,SIGNAL(modifiedCodeContent()),this,SLOT(syncCodeToDocument()));
+    initFields();
 }
 
 // FIX
 // hmm. this should be pure virtual so that implemented in sub-class
 CodeGenerator::CodeGenerator (QDomElement & element )
         : QObject (UMLApp::app()->getDocument()) {
-    initFields(UMLApp::app()->getDocument());
+    initFields();
     loadFromXMI(element); // hmm. cant call this here.. its 'pure' virtual
 }
 
 @ -653,9 +651,9  @
     return output;
 }
 
-void CodeGenerator::initFields ( UMLDoc * doc ) {
+void CodeGenerator::initFields() {
 
-    m_document = doc;
+    m_document = UMLApp::app()->getDocument();
     m_codeDocumentDictionary.setAutoDelete(false);
     m_codedocumentVector.setAutoDelete(false);
     m_applyToAllRemaining = true;
 @ -667,11 +665,17  @
     // We should only call from the child
     // initFromParentDocument();
 
-    connect(doc,SIGNAL(sigObjectCreated(UMLObject*)),this,SLOT(checkAddUMLObject(UMLObject*)));
-    connect(doc,SIGNAL(sigObjectRemoved(UMLObject*)),this,SLOT(checkRemoveUMLObject(UMLObject*)));
+}
+
+void CodeGenerator::connect_newcodegen_slots() {
+    UMLDoc *doc = UMLApp::app()->getDocument();
+    connect(doc, SIGNAL(sigObjectCreated(UMLObject*)),
+            this, SLOT(checkAddUMLObject(UMLObject*)));
+    connect(doc, SIGNAL(sigObjectRemoved(UMLObject*)),
+            this, SLOT(checkRemoveUMLObject(UMLObject*)));
     CodeGenerationPolicy *commonPolicy = UMLApp::app()->getCommonPolicy();
-    connect(commonPolicy,SIGNAL(modifiedCodeContent()),this,SLOT(syncCodeToDocument()));
-
+    connect(commonPolicy, SIGNAL(modifiedCodeContent()),
+            this, SLOT(syncCodeToDocument()));
 }
 
 // these are utility methods for accessing the default
--- branches/KDE/3.5/kdesdk/umbrello/umbrello/codegenerator.h #645577:645578
 @ -312,6 +312,13  @
     */
     virtual void initFromParentDocument( );
 
+    /**
+     * Connect additional slots.
+     * Only required for Advanced Code Generators.
+     * To be called after constructing the code generator (see CodeGenFactory)
+     */
+    void connect_newcodegen_slots();
+
 protected:
 
     /**
 @ -378,7 +385,7  @
     CodeDocumentList m_codedocumentVector;
     int lastIDIndex;
 
-    void initFields ( UMLDoc * doc ) ;
+    void initFields() ;
 
 public slots:
 
--- branches/KDE/3.5/kdesdk/umbrello/umbrello/codegenerators/codegenfactory.cpp #645577:645578
 @ -102,10 +102,12  @
             obj = new ASWriter();
             break;
         case Uml::pl_Cpp:
-            if (optionState.generalState.newcodegen)
+            if (optionState.generalState.newcodegen) {
                 obj = new CPPCodeGenerator();
-            else
+                obj->connect_newcodegen_slots();
+            } else {
                 obj = new CppWriter();
+            }
             {
                 CPPCodeGenerationPolicy *p =
                     new CPPCodeGenerationPolicy(UMLApp::app()->getConfig());
 @ -121,6 +123,7  @
         case Uml::pl_Java:
             if (optionState.generalState.newcodegen) {
                 obj = new JavaCodeGenerator();
+                obj->connect_newcodegen_slots();
                 JavaCodeGenerationPolicy *p =
                     new JavaCodeGenerationPolicy(UMLApp::app()->getConfig());
                 UMLApp::app()->setPolicyExt(p);
 @ -148,6 +151,7  @
         case Uml::pl_Ruby:
             if (optionState.generalState.newcodegen) {
                 obj = new RubyCodeGenerator();
+                obj->connect_newcodegen_slots();
                 RubyCodeGenerationPolicy *p =
                     new RubyCodeGenerationPolicy(UMLApp::app()->getConfig());
                 UMLApp::app()->setPolicyExt(p);
 @ -191,6 +195,8  @
         default:
             break;
     }
+    retval->initCodeClassFields();
+    retval->synchronize();
     return retval;
 }
 
--- branches/KDE/3.5/kdesdk/umbrello/umbrello/codegenerators/cppcodegenerator.cpp #645577:645578
 @ -282,7 +282,8  @
         CodeDocument * codeDoc = findCodeDocumentByClassifier(c);
         if (!codeDoc)
         {
-            codeDoc = new CPPSourceCodeDocument(c);
+            codeDoc = newClassifierCodeDocument(c);
+            codeDoc->synchronize();
             addCodeDocument(codeDoc); // this will also add a unique tag to the code document
         }
 
 @ -290,6 +291,7  @
         if (!hcodeDoc)
         {
             hcodeDoc = newHeaderClassifierCodeDocument(c);
+            hcodeDoc->synchronize();
             addHeaderCodeDocument(hcodeDoc); // this will also add a unique tag to the code document
         }
     }




More information about the umbrello-devel mailing list