- •Table of Contents
- •Mastering UML with Rational Rose 2002
- •Chapter 1: Introduction to UML
- •Encapsulation
- •Inheritance
- •Polymorphism
- •What Is Visual Modeling?
- •Systems of Graphical Notation
- •Booch Notation
- •Object Management Technology (OMT)
- •Unified Modeling Language (UML)
- •Understanding UML Diagrams
- •Business Use Case Diagrams
- •Use Case Diagrams
- •Activity Diagrams
- •Sequence Diagrams
- •Collaboration Diagrams
- •Class Diagrams
- •Statechart Diagrams
- •Component Diagrams
- •Deployment Diagrams
- •Visual Modeling and the Software Development Process
- •Inception
- •Elaboration
- •Construction
- •Transition
- •Summary
- •Chapter 2: A Tour of Rose
- •What Is Rose?
- •Getting Around in Rose
- •Parts of the Screen
- •Exploring Four Views in a Rose Model
- •Use Case View
- •Logical View
- •Component View
- •Deployment View
- •Working with Rose
- •Creating Models
- •Saving Models
- •Exporting and Importing Models
- •Publishing Models to the Web
- •Working with Controlled Units
- •Using the Model Integrator
- •Working with Notes
- •Working with Packages
- •Adding Files and URLs to Rose Model Elements
- •Adding and Deleting Diagrams
- •Setting Global Options
- •Working with Fonts
- •Working with Colors
- •Summary
- •Chapter 3: Business Modeling
- •Introduction to Business Modeling
- •Why Model the Business?
- •Do I Need to Do Business Modeling?
- •Business Modeling in an Iterative Process
- •Business Actors
- •Business Workers
- •Business Use Cases
- •Business Use Case Diagrams
- •Activity Diagrams
- •Business Entities
- •Organization Unit
- •Where Do I Start?
- •Identifying the Business Actors
- •Identifying the Business Workers
- •Identifying the Business Use Cases
- •Showing the Interactions
- •Documenting the Details
- •Creating Business Use Case Diagrams
- •Deleting Business Use Case Diagrams
- •The Use Case Diagram Toolbar
- •Adding Business Use Cases
- •Business Use Case Specifications
- •Assigning a Priority to a Business Use Case
- •Viewing Diagrams for a Business Use Case
- •Viewing Relationships for a Business Use Case
- •Working with Business Actors
- •Adding Business Actors
- •Adding Actor Specifications
- •Assigning an Actor Stereotype
- •Setting Business Actor Multiplicity
- •Viewing Relationships for a Business Actor
- •Working with Relationships
- •Association Relationship
- •Generalization Relationship
- •Working with Organization Units
- •Adding Organization Units
- •Deleting Organization Units
- •Activity Diagrams
- •Adding an Activity Diagram
- •Adding Details to an Activity Diagram
- •Summary
- •Chapter 4: Use Cases and Actors
- •Use Case Modeling Concepts
- •Actors
- •Use Cases
- •Traceability
- •Flow of Events
- •Relationships
- •Use Case Diagrams
- •Activity Diagrams
- •Activity
- •Start and End States
- •Objects and Object Flows
- •Transitions
- •Synchronization
- •Working with Use Cases in Rational Rose
- •The Use Case Diagram Toolbar
- •Creating Use Case Diagrams
- •Deleting Use Case Diagrams
- •Adding Use Cases
- •Deleting Use Cases
- •Use Case Specifications
- •Naming a Use Case
- •Viewing Participants of a Use Case
- •Assigning a Use Case Stereotype
- •Assigning a Priority to a Use Case
- •Creating an Abstract Use Case
- •Viewing Diagrams for a Use Case
- •Viewing Relationships for a Use Case
- •Working with Actors
- •Adding Actors
- •Deleting Actors
- •Actor Specifications
- •Naming Actors
- •Assigning an Actor Stereotype
- •Setting Actor Multiplicity
- •Creating an Abstract Actor
- •Viewing Relationships for an Actor
- •Viewing an Actor's Instances
- •Working with Relationships
- •Association Relationship
- •Includes Relationship
- •Extends Relationship
- •Generalization Relationship
- •Working with Activity Diagrams
- •The Activity Diagram Toolbar
- •Creating Activity Diagrams
- •Deleting Activity Diagrams
- •Exercise
- •Problem Statement
- •Create a Use Case Diagram
- •Summary
- •Chapter 5: Object Interaction
- •Interaction Diagrams
- •What Is an Object?
- •What Is a Class?
- •Where Do I Start?
- •Finding Objects
- •Finding the Actor
- •Using Interaction Diagrams
- •Sequence Diagrams
- •The Sequence Diagram Toolbar
- •Collaboration Diagrams
- •The Collaboration Diagram Toolbar
- •Working with Actors on an Interaction Diagram
- •Working with Objects
- •Adding Objects to an Interaction Diagram
- •Deleting Objects from an Interaction Diagram
- •Setting Object Specifications
- •Naming an Object
- •Mapping an Object to a Class
- •Setting Object Persistence
- •Using Multiple Instances of an Object
- •Working with Messages
- •Adding Messages to an Interaction Diagram
- •Adding Messages to a Sequence Diagram
- •Deleting Messages from a Sequence Diagram
- •Reordering Messages in a Sequence Diagram
- •Message Numbering in a Sequence Diagram
- •Viewing the Focus of Control in a Sequence Diagram
- •Adding Messages to a Collaboration Diagram
- •Deleting Messages from a Collaboration Diagram
- •Message Numbering in a Collaboration Diagram
- •Adding Data Flows to a Collaboration Diagram
- •Setting Message Specifications
- •Naming a Message
- •Mapping a Message to an Operation
- •Setting Message Synchronization Options
- •Setting Message Frequency
- •End of a Lifeline
- •Working with Scripts
- •Switching Between Sequence and Collaboration Diagrams
- •Exercise
- •Problem Statement
- •Create Interaction Diagrams
- •Summary
- •Chapter 6: Classes and Packages
- •Logical View of a Rose Model
- •Class Diagrams
- •What Is a Class?
- •Finding Classes
- •Creating Class Diagrams
- •Deleting Class Diagrams
- •Organizing Items on a Class Diagram
- •Using the Class Diagram Toolbar
- •Working with Classes
- •Adding Classes
- •Class Stereotypes
- •Analysis Stereotypes
- •Class Types
- •Interfaces
- •Web Modeling Stereotypes
- •Other Language Stereotypes
- •Class Specifications
- •Naming a Class
- •Setting Class Visibility
- •Setting Class Multiplicity
- •Setting Storage Requirements for a Class
- •Setting Class Persistence
- •Setting Class Concurrency
- •Creating an Abstract Class
- •Viewing Class Attributes
- •Viewing Class Operations
- •Viewing Class Relationships
- •Using Nested Classes
- •Viewing the Interaction Diagrams That Contain a Class
- •Setting Java Class Specifications
- •Setting CORBA Class Specifications
- •Working with Packages
- •Adding Packages
- •Deleting Packages
- •Exercise
- •Problem Statement
- •Creating a Class Diagram
- •Summary
- •Chapter 7: Attributes and Operations
- •Working with Attributes
- •Finding Attributes
- •Adding Attributes
- •Deleting Attributes
- •Setting Attribute Specifications
- •Setting the Attribute Containment
- •Making an Attribute Static
- •Specifying a Derived Attribute
- •Working with Operations
- •Finding Operations
- •Adding Operations
- •Deleting Operations
- •Setting Operation Specifications
- •Adding Arguments to an Operation
- •Specifying the Operation Protocol
- •Specifying the Operation Qualifications
- •Specifying the Operation Exceptions
- •Specifying the Operation Size
- •Specifying the Operation Time
- •Specifying the Operation Concurrency
- •Specifying the Operation Preconditions
- •Specifying the Operation Postconditions
- •Specifying the Operation Semantics
- •Displaying Attributes and Operations on Class Diagrams
- •Showing Attributes
- •Showing Operations
- •Showing Visibility
- •Showing Stereotypes
- •Mapping Operations to Messages
- •Mapping an Operation to a Message on an Interaction Diagram
- •Exercise
- •Problem Statement
- •Add Attributes and Operations
- •Summary
- •Chapter 8: Relationships
- •Relationships
- •Types of Relationships
- •Finding Relationships
- •Associations
- •Using Web Association Stereotypes
- •Creating Associations
- •Deleting Associations
- •Dependencies
- •Creating Dependencies
- •Deleting Dependencies
- •Package Dependencies
- •Creating Package Dependencies
- •Deleting Package Dependencies
- •Aggregations
- •Creating Aggregations
- •Deleting Aggregations
- •Generalizations
- •Creating Generalizations
- •Deleting Generalizations
- •Working with Relationships
- •Setting Multiplicity
- •Using Relationship Names
- •Using Stereotypes
- •Using Roles
- •Setting Export Control
- •Using Static Relationships
- •Using Friend Relationships
- •Setting Containment
- •Using Qualifiers
- •Using Link Elements
- •Using Constraints
- •Exercise
- •Problem Statement
- •Adding Relationships
- •Summary
- •Chapter 9: Object Behavior
- •Statechart Diagrams
- •Creating a Statechart Diagram
- •Adding States
- •Adding State Details
- •Adding Transitions
- •Adding Transition Details
- •Adding Special States
- •Using Nested States and State History
- •Exercise
- •Problem Statement
- •Create a Statechart Diagram
- •Summary
- •Chapter 10: Component View
- •What Is a Component?
- •Types of Components
- •Component Diagrams
- •Creating Component Diagrams
- •Adding Components
- •Adding Component Details
- •Adding Component Dependencies
- •Exercise
- •Problem Statement
- •Summary
- •Chapter 11: Deployment View
- •Deployment Diagrams
- •Opening the Deployment Diagram
- •Adding Processors
- •Adding Processor Details
- •Adding Devices
- •Adding Device Details
- •Adding Connections
- •Adding Connection Details
- •Adding Processes
- •Exercise
- •Problem Statement
- •Create Deployment Diagram
- •Summary
- •Chapter 12: Introduction to Code Generation and Reverse Engineering Using Rational Rose
- •Preparing for Code Generation
- •Step One: Check the Model
- •Step Two: Create Components
- •Step Three: Map Classes to Components
- •Step Five: Select a Class, Component, or Package
- •Step Six: Generate Code
- •What Gets Generated?
- •Introduction to Reverse Engineering Using Rational Rose
- •Model Elements Created During Reverse Engineering
- •Summary
- •Chapter 13: ANSI C++ and Visual C++ Code Generation and Reverse Engineering
- •Generating Code in ANSI C++ and Visual C++
- •Converting a C++ Model to an ANSI C++ Model
- •Class Properties
- •Attribute Properties
- •Operation Properties
- •Package (Class Category) Properties
- •Component (Module Specification) Properties
- •Role Properties
- •Generalization Properties
- •Class Model Assistant
- •Component Properties
- •Project Properties
- •Visual C++ and ATL Objects
- •Generated Code
- •Code Generated for Classes
- •Code Generated for Attributes
- •Code Generated for Operations
- •Visual C++ Code Generation
- •Reverse Engineering ANSI C++
- •Reverse Engineering Visual C++
- •Summary
- •Overview
- •Introduction to Rose J
- •Beginning a Java Project
- •Selecting a Java Framework
- •Linking to IBM VisualAge for Java
- •Linking to Microsoft Visual J++
- •Project Properties
- •Class Properties
- •Attribute Properties
- •Operation Properties
- •Module Properties
- •Role Properties
- •Generating Code
- •Generated Code
- •Classes
- •Attributes
- •Operations
- •Bidirectional Associations
- •Unidirectional Associations
- •Associations with a Multiplicity of One to Many
- •Associations with a Multiplicity of Many to Many
- •Reflexive Associations
- •Aggregations
- •Dependency Relationships
- •Generalization Relationships
- •Interfaces
- •Java Beans
- •Support for J2EE
- •EJBs
- •Servlets
- •JAR and WAR Files
- •Automated J2EE Deployment
- •Reverse Engineering
- •Summary
- •Starting a Visual Basic Project
- •Class Properties
- •Attribute Properties
- •Operation Properties
- •Module Specification Properties
- •Role Properties
- •Generalization Properties
- •Generated Code
- •Classes
- •Attributes
- •Operations
- •Bidirectional Associations
- •Unidirectional Associations
- •Associations with a Multiplicity of One to Many
- •Associations with a Multiplicity of Many to Many
- •Reflexive Associations
- •Aggregations
- •Dependency Relationships
- •Generalization Relationships
- •Reverse Engineering
- •Summary
- •Overview
- •Introduction to XML DTD
- •Elements
- •Attributes
- •Entities and Notations
- •Project Properties
- •Class Properties
- •Attribute Properties
- •Role Properties
- •Component Properties
- •Generating Code
- •Generated Code
- •Classes
- •Attributes
- •Reverse Engineering DTD
- •Summary
- •Project Properties
- •Class Properties
- •Attribute Properties
- •Operation Properties
- •Module Properties
- •Association (Role) Properties
- •Dependency Properties
- •Generated Code
- •Classes
- •Attributes
- •Operations
- •Bidirectional Associations
- •Unidirectional Associations
- •Associations with a Multiplicity of One to Many
- •Associations with a Multiplicity of Many to Many
- •Associations with Bounded Multiplicity
- •Reflexive Associations
- •Aggregations
- •Dependency Relationships
- •Generalization Relationships
- •Reverse Engineering CORBA Source Code
- •Summary
- •Chapter 18: Rose Data Modeler
- •Object Models and Data Models
- •Creating a Data Model
- •Logic in a Data Model
- •Adding a Database
- •Adding Tablespaces
- •Adding a Schema
- •Creating a Data Model Diagram
- •Creating Domain Packages and Domains
- •Adding Tables
- •Adding Columns
- •Setting a Primary Key
- •Adding Constraints
- •Adding Triggers
- •Adding Indexes
- •Adding Stored Procedures
- •Adding Relationships
- •Adding Referential Integrity Rules
- •Working with Views
- •Generating an Object Model from a Data Model
- •Generating a Data Model from an Object Model
- •Generating a Database from a Data Model
- •Updating an Existing Database
- •Reverse Engineering a Database
- •Summary
- •Chapter 19: Web Modeling
- •Modeling a Web Application
- •Web Class Stereotypes
- •Relationships
- •Reverse Engineering a Web Application
- •Generating Code for a Web Application
- •Summary
- •Appendix: Getting Started with UML
- •Building a Business Use Case Diagram
- •Building a Workflow (Activity) Diagram
- •Building a Use Case Diagram
- •Building an Interaction Diagram
- •Building a Class Diagram
- •Web Modeling
- •Adding Class Relationships
- •Building a Statechart Diagram
- •Building a Component Diagram
- •Building a Deployment Diagram
Chapter 17: CORBA/IDL Code Generation and Reverse Engineering
There are two places to set the dependency property. To set the property for all dependencies, select Tools → Options, then click the CORBA tab and select Dependency from the drop−down list box. To set the property for only one dependency, select the CORBA tab on the dependency specification window and edit the properties there. There is only one dependency property, GenerateForwardReference, which controls whether a referenced interface is included with an #include statement or a forward reference. By default, a #include statement is used.
Generated Code
In the following sections, we'll examine the CORBA that is generated from the various types of model elements. Rose will use the information you entered in the specification windows for the various model elements when generating the CORBA/IDL.
Let's begin by looking at the code generated for a typical class.
Classes
A class in your object model will generate a single IDL file. The file that is generated will look something like the following:
Interface TheClass
{
};
A great deal of additional information, such as configuration management statements, copyright notices, and include statements, will also be generated in the code. We'll look at a complete file in the following section, "Standard Code Generation."
581
Chapter 17: CORBA/IDL Code Generation and Reverse Engineering
All of the attributes, operations, and relationships of the class will be reflected in the generated code. The major elements generated for each class include:
∙
Class name
∙
Attributes
∙
Operations
∙
Relationships
∙
Documentation
When generating code, Rose will use the package structure you established in the Component view of your model to generate the appropriate directories. A directory will be created for each package in the model. Within each of the directories Rose creates will be the files for the classes in that package.
Much of the information in your Rose model will be used directly when generating code. For example, the attributes, operations, relationships, and class name of each class will directly affect the code generated. Other model properties, such as the documentation entered for the class, will not directly affect the code. These properties are created as comments in the generated code.
Table 17.7 lists the properties available in the class specification window and notes which of these properties will directly affect the IDL that is generated.
Table 17.7: Effect of Class Specifications on IDL
Property |
Effect on Code |
Name |
Name in model will become class name |
Type |
No effect |
Stereotype |
No effect |
Export Control |
No effect |
Documentation |
Comment |
Cardinality |
No effect |
Space |
No effect |
Persistence |
No effect |
Concurrency |
No effect |
Abstract |
No effect |
Formal Arguments |
No effect |
Operations |
Generated in code |
Attributes |
Generated in code |
582
Chapter 17: CORBA/IDL Code Generation and Reverse Engineering
Relationships |
Generated in code |
Standard Code Generation
Let's look at the code generated for the following class.
The following IDL file was generated for the SampleClass:
//Source file: C:/corba/SampleClass.idl
#ifndef __SAMPLECLASS__DEFINED #define __SAMPLECLASS__DEFINED
/* CmIdentification %X% %Q% %Z% %W% */
#include "IncludedClass.idl"
interface SampleClass { };
#endif
Let's examine each piece of this file, one at a time.
Module Section
The module section contains some basic information about the class being generated. It includes the following line:
//Source file: C:/corba/SampleClass.idl
This section includes comments that describe what class is being generated and where the IDL file is located.
Configuration Management Section
The configuration management section is provided to support integration with your configuration management software. It includes the following lines:
/* CmIdentification %X% %Q% %Z% %W% */
This section of the file includes information about your configuration management settings. The properties on the second line (%X% %Q% %Z% %W%) are the default configuration management settings. To change the configuration management settings, select Tools → Options from the menu. In the CORBA tab, select Module Specification from the drop−down list box to display the module specification code−generation properties. You can use the CmIdentification property to change the default values on this second line. Using this property, you can set the Change Management settings to a string that your configuration management software will recognize.
Some sample values you can place in this setting include:
∙ |
583 |
Chapter 17: CORBA/IDL Code Generation and Reverse Engineering
$date, which inserts the date the code was generated
∙
$time, which inserts the time the code was generated
∙
$module, which inserts the component name
∙
$file, which inserts the component's file
Preprocessor Directives Section
The preprocessor directives include the following lines:
#ifndef __SAMPLECLASS_DEFINED #define __SAMPLECLASS_DEFINED
These lines are inserted into the code to prevent the file from being included more than once.
Includes Section
The includes section is the area of the generated code that shows any entries you added in the AdditionalIncludes code−generation property for the component and any entries you added in the Includes section of the specification window for the component.
The includes section for the SampleClass is as follows:
#include "IncludedClass.idl"
In this example, only one other class, called IncludedClass, was included.
Class Definition Section
This section contains information about the class itself, including the class name, its attributes, its operations, and its relationships. For the class example above, the definition section includes the following:
interface SampleClass { };
If you entered any documentation for the class using the documentation window or the documentation area of the class specification window, this documentation will be included as a comment in the code.
Code Generated for Different Types of CORBA/IDL
The code that is generated depends directly upon the stereotype (interface, union, const, etc.) of the class. Let's examine the code generated for the following class, with each of the different CORBA/IDL stereotype options.
584
Chapter 17: CORBA/IDL Code Generation and Reverse Engineering
TypeDef Generation
If the class stereotype is set to CORBATypeDef, an interface will not be generated for the class. Instead, a typedef will be created. In the Implementation Type property on the Class Specification window, enter the definition that this typedef will be aliasing. The code generated for the SampleClass class looks like this:
//Source file: C:/corba/SampleClass.idl
#ifndef __SAMPLECLASS_DEFINED #define __SAMPLECLASS_DEFINED
/* CmIdentification %X% %Q% %Z% %W% */
#include "IncludedClass.idl"
typedef long SampleClass;
#endif
Enumeration Generation
The second CORBA type you can generate is an enumeration. If you select this option, Rose will use the keyword "enum" in the generated file. The following is the code generated for the class above, but with the stereotype set to CORBAEnum.
//Source file: C:/corba/SampleClass.idl
#ifndef __SAMPLECLASS_DEFINED #define __SAMPLECLASS_DEFINED
/* CmIdentification %X% %Q% %Z% %W% */
#include "IncludedClass.idl"
enum SampleClass {
Attribute1,
Attribute2
};
#endif
Constant Generation
The third CORBA type that you can generate is a constant. In this case, Rose will include the keyword "const" in the generated IDL. To generate a constant, set the class stereotype to CORBAConstant. In the Class Specification window, set the Implementation Type field to the data type you wish to use and the Constant Value field to the value of the constant.
585
Chapter 17: CORBA/IDL Code Generation and Reverse Engineering
The following is the file generated for SampleClass.
//Source file: C:/corba/SampleClass.idl
#ifndef __SAMPLECLASS_DEFINED #define __SAMPLECLASS_DEFINED
/* CmIdentification %X% %Q% %Z% %W% */
#include "IncludedClass.idl"
const long SampleClass = 4;
#endif
Exception Generation
The fourth CORBA type you can generate is an exception. If the class stereotype is set to CORBA−Exception, Rose will include the keyword "exception" in the code. Here is the file generated for SampleClass:
//Source file: C:/corba/SampleClass.idl
#ifndef __SAMPLECLASS_DEFINED #define __SAMPLECLASS_DEFINED
/* CmIdentification %X% %Q% %Z% %W% */
#include "IncludedClass.idl"
exception SampleClass { string Attribute1; string Attribute2;
};
#endif
Structure Generation
Another CORBA type you can generate is a structure. Rose will include the "struct" keyword in the generated file if the stereotype of the class is set to CORBAStruct. The attributes of the class will appear as data
586
Chapter 17: CORBA/IDL Code Generation and Reverse Engineering
members in the generated file. The code generated for SampleClass is:
//Source file: C:/corba/SampleClass.idl
#ifndef __SAMPLECLASS_DEFINED #define __SAMPLECLASS_DEFINED
/* CmIdentification %X% %Q% %Z% %W% */
#include "IncludedClass.idl"
struct SampleClass { string Attribute1; string Attribute2;
};
#endif
ValueType Generation
By setting the stereotype to CORBAValue, you can generate a valuetype. Here is the code generated for the SampleClass class with a stereotype of CORBAValue:
//Source file: C:/corba/SampleClass.idl
#ifndef __SAMPLECLASS_DEFINED #define __SAMPLECLASS_DEFINED
/* CmIdentification %X% %Q% %Z% %W% */
#include "IncludedClass.idl"
valuetype SampleClass {
;
;
};
#endif
Union Generation
Finally, you can generate a union in CORBA by setting the class stereotype to CORBAUnion. The generated code looks like this:
//Source file: C:/corba/SampleClass.idl
#ifndef __SAMPLECLASS_DEFINED #define __SAMPLECLASS_DEFINED
/* CmIdentification %X% %Q% %Z% %W% */
#include "IncludedClass.idl"
union SampleClass switch(long) { case 1: string Attribute1; case 2: string Attribute2;
587