You are on page 1of 14

Open-Source UML Modeling

Learn to use the NetBeans UML Modeling Project by reverse engineering a complete Java application
Fernando Lozano

Java EE 5 in Action with NetBeans

ing full UML support in NetBeans IDE. This article showcases NetBeans UML support, going through a case study where we reverse engineer a working Java application, highlighting the IDEs modeling features in the process.

he UML Modeling Project (uml.netbeans.org), which started as a part of the Enterprise Pack is now a separate download provid-

and MDA tools like AndroMDA (andromda.org) have been quite sucthe NetBeans UML modules provide many features absent from other open-source CASE tools, and even come with an extensible Design Pattern Catalog, including not only classical GoF patterns but also many Java EE Blueprints out-of-the-box.

Installing NetBeans UML Modeling


UML Modeling is available as a feature from the NetBeans Update

Center (accessible through the IDEs Tools menu). At the time of


writing, you had to check the NetBeans Update Center Beta (see Figure 1) to download it, but readers will probably find the UML Modeling Project on the stable NetBeans Update Center when this edition is out. In NetBeans, select UML Modeling in the Features category and click Add (Figure 2). Youll see there are many modules to install

UML and the Java developer


If you are an Agile Modeling advocate like me, your first thought might be why should I care about UML support in a Java IDE? Today, leading software engineer authors and even UML early adopters like Martin Fowler and Scott Ambler stand by modeling on a napkin: using models only as sketches before building the real software (i.e. the source code). Indeed some developers today dismiss modeling as unnecessary and bureaucratic. However, UML modeling will be useful at some point to most Java developers, whether theyre involved in enterprise, desktop or mobile projects. Modeling has its role even in radical XP development, as no significant piece of software can be built with a minimum level of quality without some planning and design. Traveling light doesnt mean you should not model at all, but that you should do all the modeling that adds value to your project. Not all Java developers are Agile Modeling converts though. Many prefer to embrace the MDA paradigm, at the other end of the modeling spectrum. In Model-Driven Architecture the idea is that your models will generate most if not all source code,

A1

A2

uml.netbeans.org

cessful in the Java arena. MDA advocates will be happy to find that

NetBeans UML Modeling Project web site

A
Figure 1. Selecting the Update Center for modules still in beta

A
Figure 2. Selecting the UML Modeling feature

Second Edition N 41

(Figure 3). After you agree to a few licenses, NetBeans starts

Java code generation Java packages, classes and interfaces can be generated directly from the UML model; Round-trip engineering if a UML project is linked to a Java project, changes in code are automatically reflected in the model; Ability to nest diagrams and packages inside other model elements; A Design Center, which provides an extensible design pattern catalog; Rich-text documentation for model elements created directly inside the IDE; Operations and attributes can be shown in class elements using either standard UML notation or Java syntax; Generation of model reports in JavaDoc format.

Official OMG site dedicated to UML, where you can download UML specifications and find about other UML CASE tools and tutorials

UML Modeling

uml.org

downloading. When the downloads are done, click Finish to install the modules (see Figure 4). (If you are not the only user of your development workstation, be sure to check the Global option for all modules.) Finally, after restarting NetBeans youll find new UML project templates and configuration options in the IDE.

UML features overview


The NetBeans UML Modeling Project supports ten standard UML diagrams: Use Case, Class, Collaboration, Sequence, Activity, State, Component, Deployment, Object and Robustness. Even though theyre not displayed in the New Diagram wizard, Object diagrams can be built as a Collaboration diagram, and Robustness diagrams as Class diagrams (the standard stereotype icons for Boundary, Control and Entity are provided). Other features worth noticing are:

A
Figure 3. Modules to install for the UML Modeling feature

A3

The Case Study


Well use the reverse engineering of an existing desktop application as a case study for exploring NetBeans UML features. During the process, we also show hints that are useful for forward-engineering projects (from model to source). Readers are not expected to be proficient in UML modeling to follow this tutorial, but basic modeling knowledge will be helpful.

A
Figure 4. Click Finish to install all UML modeling modules

A4

The application used for the case study was created for NetBeans Magazine Issue One. Its a simple Task Manager, similar to those provided in a PIM suite. The Todo application has two windows: a task list (Figure 5) and a task editing form (Figure 6). The task list window displays tasks ordered either by priority or by due date, and it can filter out completed tasks. Tasks are colored to indicate completed, late or alert status. The complete application is available as a download in the NetBeans Magazines website.

42 N NetBeans Magazine

Java EE 5 in Action with NetBeans

Our application is quite simple, so reverse engineering it wont be a complex task. Even so, it is complex enough for us to demonstrate many of NetBeans UML features. Well work through the application as if we didnt know how it was designed, using UML diagrams to understand its structure and design ideas.

the sources and populate the project with model elements for Java packages, classes and interfaces. (Note that for large projects this may take a long time and eat up a large amount of memory.)

E If you experience OutOfMemory errors while reverse engineering, you can


edit the file etc/netbeans.conf inside your NetBeans installation and change the value for Xmx, increasing the maximum heap size from 128M to 256M or bigger.
While scanning, the IDE shows a log window detailing the prog-

Creating the reverse-engineering project


Installing the UML modeling project adds a new project category to NetBeans, with three project templates (Figure 7).

ress for each source file. When the scanning finishes, click Done to dismiss this window, and youll end up with a new UML project as shown in Figure 9.

Anatomy of a UML Project


A UML project is organized into three containers: Model, Diagrams and Imported Elements. The Model container holds all elements created as part of the model. Elements can be Classes, Interfaces, Packages, Actors,

Platform-Independent Model projects use


standard UML notation for class attributes and operations, and do no code generation. This template is useful in the initial stages of the development process, when all models are conceptual and not physical.

A5

Java-Platform Model projects use Java


syntax for class attributes and operations and must be linked to a Java Application or Library project. NetBeans will keep both projects in sync: If you edit the code, the UML model will change to reflect new or changed classes, attributes and operations, and if you change the UML model, the source code will be modified accordingly. Well use the third project template, which populates a Java-Platform Model from an existing Java project. Click the

A6

New Project icon and choose the UML category. Then select Java-Platform Model by

Reverse Engineering a Java Project. Accept


the defaults for the next step, except for selecting the Todo Java project; then click

Finish (see Figure 8). NetBeans will scan

The Unified Process Explained, Kendall Scott

How to use UML as part of a traditional software development process

A
Figure 5. The task list window

A
Figure 6. The task form window

Second Edition N 43

A
UML Modeling
Figure 7. UML project templates

A7

with conceptual modeling and then move on to physical modeling, and keep track of which physical elements realize which conceptual elements1.

Exploring the reverse-engineered model


Expand the Model container and youll see that it includes both application-specific and standard Java packages and classes (Figure 10). As a UML model cannot reference anything it does not contain or import, NetBeans creates model elements for Java SE classes. (An alternative would be having a UML model with the Java SE API and import elements from it.) Sometimes NetBeans will create duplicates, like the many List<Task> elements you see in Figure 10. Its better to leave them as they are, as removing them may delete attributes from the Java project.

A
Figure 8. Creating a UML Project for reverseengineering a Java Project

A8

A
Figure 9. The new UML project

A9

Diagrams, Notes, Data Types, Associations and anything else that can be defined as part of the UML project itself. The Diagrams container provides quick access to all diagrams created

Generating a class diagram


The Todo application has only a few classes, all of which are inside the todo package and its subpackages. It would be possible to create a complete Class Diagram, but for most real-world applications the resulting diagram would be very hard to read and therefore mostly useless. Its usually better to start by creating a class diagram for each package, and then check the dependencies between packages or between a few important classes. Lets start with the todo.model package. Select all its elements, right click on the selection and choose Create Diagram from Selected Elements from the context menu. Then choose Class Diagram in the wizard (see Figure 11).

as part of the model. You may be surprised to see there are no diagrams in our reverse-engineering project. Thats because a UML model consists of model elements, which may or may not be shown as diagrams. Every UML diagram is a partial view of a model, and youll need to choose which details to show and which to leave
F1 A realize UML relationship between two model elements states that one element represents an abstract concept in the problem domain, while the related element represents a software construct implementing that concept, making it physical in the softwares point of view.

out. So NetBeans populates the reverse-engineered model with elements but leaves the diagram creation to the developer. Finally, the Imported Elements container allows a model to reference elements created as part of another model (i.e. another UML Project). This is useful for organizing large models as a set of UML projects; for example one for business logic and another for GUI elements. Its also useful for reusing model elements in various projects. And it allows for a Platform-independent UML Model thats referenced by a Java Platform UML Model. This way, you can start

44 N NetBeans Magazine

Java EE 5 in Action with NetBeans

A 10

partment or expand it to select specific fields to hide. After hiding an elements details, you can right-click Resize Element to Contents to optimally resize it (Figure 14). (You can also hide/show a compartment by double-clicking the compartment separators.) After these changes, the diagram will probably need some rearrangement. NetBeans can do this using four different auto-layouts, accessible through the last four buttons in the Diagram Editor toolbar (see Figure 15). Click the first button, for Hierarchical Layout. This is the default layout NetBeans uses when generating a diagram from model elements. The results are shown in Figure 16.

A
Figure 10. The new UML project, showing a few model elements

Inferring meaning from a generated diagram


Notice I deleted the List<Task> element from the diagram, as well as all exception classes. When deleting an element, NetBeans Note that the Namespace combobox lists what seem to be all the packages in the current model. In fact, every UML package (and most other UML elements) corresponds to a UML Namespace. You can use namespaces for any kind of model element. Leaving the class diagram for the todo.model package inside the todo:: gives you the choice of removing it from the diagram only, or from the diagram and the model (see Figure 17). Ive shown only public methods for Parameters and TaskManager,

A 11

A
Figure 11. Creating a class diagram from model elements

model namespace makes the diagram


easier to find. It also makes it clear that the diagram refers to elements of that package. The resulting diagram is shown in Figure 12. Note that NetBeans is pretty smart in laying out its elements. But even with an optimized layout and a small set of classes, the generated diagram is quite large. The fact is theres too much detail, especially if we just want to understand the relationships between elements in the package. Fortunately you can hide most of the excess information. A good start is hiding all private fields and methods (Figure 13). Right-click on each class and select Compartment>Customize, then uncheck the entire Attributes com-

martinfowler.com/articles.html objectmentor.com/resources/publishedArticles.html thoughtworks.com/byline-articles.html

Articles about UML, modeling, application design and agile modeling

Second Edition N 45

A
UML Modeling
Figure 12. The NetBeansgenerated model for all elements inside the todo. model namespace.

A 12

and only attributes (all private) for the Task class. Thats because I assume Task is a DTO (Data Transfer Obect) or Value Object, and showing accessor methods wouldnt help in understanding the class. But for

Parameters the attributes do not map


exactly to the getters, so I assume the class has some intelligence of its own. I also assume TaskManager is a DAO class, and that it uses Pa-

UML User Guide, Grady Booch, James Rumbaugh, Ivar Jacobson

The UML standard, by its creators

rameters to get JDBC connection


parameters. As you can see, reverse-engineering a model from Java code involves a lot of assumptions and common sense. Youll always be making educated guesses about the role played by each element in the application, and using these decisions to create your diagrams to best effect.

A
Figure 13. Hiding details from classes

A 13

Enhancing the generated model


Based on the reverse engineering done so far, we have identified the use of common design patterns in the application. UML provides a nice feature to make these explicit in a model: stereotypes2. A few standard stereotypes are defined in the UML standard, and you can create new ones freely. Well create the VO and DTO stereotypes so our interpretation of the purpose of each class is explicit in the model. To add a stereotype to a class, use the properties window, as shown in Figure 18. An editor allows you to select existing stereotypes or create new ones. Note that an element can have many stereotypes, although this is not common.

A
Figure 14. Optimally resizing a class

A 14

46 N NetBeans Magazine

Java EE 5 in Action with NetBeans

Now, if our conclusions are OK, the model generated by NetBeans is not entirely correct. There is no part/whole relationship between TaskManager and Parameters, so they should not be connected by an aggregation. This should be changed to a simple association. Right-click on the aggregation (it should turn blue) and select Transform>Remove Aggregate from the context menu (see Figure 19). I fact, you should expect NetBeans (or any other UML CASE tool) to generate a few incorrect associations when reverse engineering Java sources. Thats because UML associations have much richer semantics than Java references. All structural associations between Java classes originate from attributes referencing other classes/interfaces (or collections and arrays of these). Similarly to most other programming languages, Java does not distinguish between composites, aggregates and simple associations. Also, a reference to an instance of another class could be there just for convenience, and not be a structural association at all. Now, if TaskManager is a DAO class, responsible for persisting instances of

A 15

A
Figure 15. Auto-layout diagram buttons from the NetBeans diagram editor toolbar

A 16

A
Figure 16. Class diagram for the todo. model package, after hiding details, deleting elements and applying an auto-layout

A 17

A
Figure 17. By default, deleting an element from a diagram doesnt remove it from the model

Task, its clear that these two classes are


strongly coupled. Changes in Task fields will probably require changes in TaskMan-

Generating Dependency Diagrams


From our understanding so far, it looks like TaskManager is the main class of the todo.model package. But does our model show everything important about this package and about TaskManager? NetBeans helps us check this by generating a dependency diagram, a type of class diagram that shows everything thats referenced by a given class. Right-click a class in either the Projects window or the class diagram and select Generate Dependency Diagram. The diagram generated for TaskManager is shown in Figure 21. Its created inside the namespace defined by the class itself, so it shows in the Projects window as a child node of the class. You can see that the only elements in the diagram that are not in our todo.model class diagram come from the Java SE APIs. Youd
F2 A UML stereotype is a label you can add to elements to highlight specific semantics. You can think of a stereotype as a subclass or role of a kind of model element.

agers behavior. This can be made explicit


in a UML diagram by a Dependency relationship, which is available in the UML Class Diagram Palette in the Dependencies category. Click on the Dependency tool, then on TaskManager in the diagram and on Task (also in the diagram). This creates a dependency connecting the two classes. The end result is shown in Figure 20.

Second Edition N 47

get similar results with other classes from the same package, so its

is the controller for some secondary usage scenarios, so we should examine ListEdit-

UML Modeling

safe to assume the class diagram built for the package has enough information. The dependency diagram for TaskManager is an example of a disposable diagram. Theres no value in keeping it around after using it to verify that other related diagrams have enough information. You should delete the diagram from the model, and also the dependency diagrams for other classes in the same package (if you generated them). The key is not to pollute your model with useless diagrams.

Tasks the same way we did with TaskManager.


If we have found the main controller class, the dependency diagrams for the window classes should not add much new information. Surprisingly, the dependency diagrams for TaskList and TaskForm do not show any connection with ListEditTasks. But they do show a new connection with Action-

E NetBeans-generated dependency diagrams dont take into account classes

A
Figure 18. Adding a stereotype to a class

referenced inside a method body. Only attribute and method declarations are followed, so there will be cases when youll need to inspect the code to find additional dependencies and add them manually.

A 18

The todo.controller package


The todo.controller package has only two classes. A class diagram for this simple package would be of little use, but lets see what a dependency diagram tells us. Figure 22 shows the dependency diagram for the ListEditTask class, already simplified as we did with the todo.model package class diagram. Here we see many classes coming from different packages. Either we have found a crucial class for the application, or the application design is a mess. Method signatures may help us understand how these classes are related to each other. They suggest ListE-

A
Figure 19. Transforming an aggregation into a simple association

A 19

ditTasks is an event listener for both TaskList

A
Figure 20. Class diagram model for the todo.model package after changing associations between elements. Note the dependency from TaskManager to Task, and that the association from TaskManager to Parameter is no longer an aggregation. Note also the stereotypes for TaskManager and Task.

and TaskForm. It looks like ListEditTasks reacts to those events by calling TaskManager methods, acting as a workflow controller for the application. Note also that TaskList and TaskForm are the two windows in the application. The fact that both are connected to ListEditTasks strongly suggests its the main controller class for the application. The dependency diagram for

A 20

CreateOpenTaskList shows connections to TaskList and TaskManager, similar to the ones


from ListEditTasks. It seems CreateOpenTaskList

48 N NetBeans Magazine

Java EE 5 in Action with NetBeans

Support, which is a Swing ActionListener. ListEditTasks is also an ActionListener, so


there may be some indirect connection from the window classes to the main controller class. Event-driven programming is meant to reduce coupling between classes, and it succeeds so well that theres no way, just by analyzing Java method signatures and

attribute declarations, to find a connection from TaskList (or

TaskForm)

to

ListEditTasks.

A diagram for the application UI


Figure 23 shows what weve learnt (and guessed) so far about the Todo application user interface. The diagram was built by merging information from ListEditTasks, TaskList and Task-

A 21

A
Figure 21. Dependency Diagram for TaskManager

Form dependency diagrams.


Starting with the ListEditTask dependency diagram, I added the

ActionSupport and Task by dragging these from the Projects window


to the diagram area. NetBeans automatically adds connections to others elements in the diagram. Then I simplified the classes presentation, corrected associations and added new dependency links, as done before for the todo.model package class diagram. The finished diagram is more than just a ListEditTask dependencies diagram, so I renamed it to CoreTodoDiagram and moved it to the todo package. It gives us a pretty good picture of the application structure, but still doesnt help understanding how the ListEditTasks class actually reacts to user interface events from

A 22

A
Figure 22. Dependency Diagram for ListEditTasks

TaskList and TaskForm. We


could guess ActionSupport has a role in this, but so far we dont know exactly what role. Perhaps its a utility class that could be deleted from the diagram The fact is, UML class diagrams are good to show static structure, but not dynamic behavior. Fortunately, the UML provides other diagrams that help us understand how an application behaves at runtime.

Extreme Programming Explained, Kent Beck

If you want to use an Agile Modeling process instead of a traditional one

Second Edition N 49

A
UML Modeling
Figure 23. Class diagram for the Todo application user interface

A 23

Generating Sequence Diagrams


bdn.borland.com/article/0,1410,31863,00.html sparxsystems.com.au/UML_Tutorial.htm Some freely available UML tutorials
Weve been working under the assumption that the window classes (TaskList and TaskForm) generate Swing Action events, which are somehow dispatched by ListEditTasks. ListEditTasks should register itself as an ActionListener for TaskList, and then TaskList should fire

of objects during the execution of an operation. Note that it refers to class instances and not to the classes themselves. A solid arrow represents a message, that is, a Java method call (in UML terms, an operation call). A dashed arrow is either a message return or a create message, i.e. the creation of a new object. Again, the automatically generated diagram comes with too much detail. Removing the args, length, err and System objects, and moving the elements around should solve this (see the result in Figure 25). The diagram shows that main() just constructs instances of the classes we have already identified as being the main ones for the application, and that all are connected by the ListEditTasks constructor. So

Action events to ListEditTasks.


Note that ListEditTasks has only a constructor that receives a view (ListTasks) and a model (the DAO class, TaskManager) as parameters. Looking at the constructor code in the source Java project we can see this listener registration happening. Who calls the ListEditTasks constructor? The application main() method is a good candidate. Expand the todo.Main class node to show the main() operation (UML calls operation what Java calls method), then right-click and choose Reverse-Engineer operation. In the wizard chose a Sequence Diagram and accept all defaults. The result will be a new diagram node under the operations node. Figure 24 shows the diagram that NetBeans creates. An UML sequence diagram shows the message flow among a set

50 N NetBeans Magazine

Java EE 5 in Action with NetBeans

far weve gleaned the same information we had expressed in the class diagrams. But its important to confirm our guesses. The fact the main() operation creates no instances of other classes, and that it doesnt call operations other than constructors and setVisible() for the TaskList window, makes us confident of not missing any important class.

addActionListener(), confirming that ListEditTasks handles Action TaskList to ListEditTasks.


NetBeans wont follow a nested class from one operation to another. So the message addActionListener from ListEditTasks to

TaskList is missing in the sequence diagram. Its helpful to add this


message manually, to get a complete picture of all connections between the Todo application main classes. NetBeans also wont create a sequence diagram from multiple operations (as it can from multiple classes). If it could, a sequence diagram generated from both main() and the ListEditTasks constructor would show all connections that are being made. Thats understandable, as a sequence diagram following nested calls would probably be very big (how many levels down are enough?). It would also probably create a diagram where one operation sees the inner workings of others, violating OO encapsulation. We still need a diagram showing event handling. We also need to clarify the role ActionSupport plays in the Todo application. Again looking at the code, we can see the window classes delegate all

Interpreting sequence diagrams


The main() method sequence diagram shows connections made from ListE-

ditTasks to TaskManager and TaskList


(were ignoring the connections from

CreateOpenTaskList to TaskList and Parameters). But the diagram doesnt show


connections going the other way, that is, from TaskList to ListEditTasks to dispatch

Action event dispatching to the ActionSupport class. This is done


so the window classes themselves dont have to manage multiple event listeners. This way TaskList can send Action events to both controller classes, ListEditTasks and CreateOpenTaskList. By digging a little deeper into the code, we can see that each button or menu item from the window classes provides a different

Action events. We know a view class has


to send events to its controller, and that a model class has no knowledge about its controller so there are no other missing connections. If you follow the code, youll see that the

actionCommand string. The controller classes use this property to


know which operation was requested by the user and then execute

ListEditTasks constructor calls TaskList.

A 24

Fundamentals of Object-Oriented Design in UML, Meilir Page-Jones

events generated by TaskList. This is the missing connection from

About UML and OO design

A
Figure 24. Sequence diagram generated by NetBeans for the main() operation

Second Edition N 51

UML Modeling

it. So they dont need to know which Swing component (from the window classes) generated which event. This isolates the controller classes from the internal structure of the view (window) classes.

more clearly to other developers. If you are serious about reverse engineering applications, youll inevitably have to create some diagrams on your own. A cross-level sequence diagram is useful in understanding complex interactions among objects like event handling for the Todo application, which involves TaskList,

A hand-made diagram
We cant fully automate reverse engineering, but we can document the knowledge gleaned from the reverse-engineering process in the form of UML diagrams, and communicate it

ListEditTask, ActionSupport and TaskManager. NetBeans makes it easy to create


such diagrams. First, select the todo package, right-click and select New Diagram. Choose Sequence

A
Figure 25. Sequence diagram for the main() operation with excess detail removed

A 25

A
Figure 26. Sequence diagram for the event handling between view and controller classes

A 26

52 N NetBeans Magazine

Java EE 5 in Action with NetBeans

Diagram, and name it ActionEventSequence. From the Projects window, drag the elements JButton (javax.

swing), ActionEvent (java.awt.event), ActionSupport (todo.view), ListEditTasks (todo. control), TaskForm (todo.view), Task (todo. model) and TaskManager (todo.model).
Connect these from left to right, using either the Syncronous Message or the Create Message from the Sequence Diagram Palette. Then, for each message, right-click it and select Operations from the context menu to see all operations supported by the messages target. The sequence of messages is create, it is representative of all other

Action events for the Todo


application. Theres no need to build sequence diagrams for each remaining button or menu item. If a developer understands this diagram and how the Save button

Action event is handled by the application, he can figure out how all
other Action events are handled. This ends our case study. We now have a model rich enough so any developer can understand and maintain the Todo application. We could consider drawing other UML diagrams, like Use Case or Deployment, but these would probably add little value in our case. An important part of doing good modeling is knowing when to stop modeling.

C
Fernando Lozano (fernando@lozano.eti. br) is an independent consultant and has worked with information systems since 1991. Hes the Community Leader of the Linux Community at Java.net, webmaster for the Free Software Foundation and counselor to the Linux Professional Institute. Lozano helps many open-source projects and teaches at undergraduate and postgraduate college courses. Hes also a technical writer and book author, as well as Contributing Editor at Java Magazine (Brazil) and freelance writer for other leading IT publications.

actionPerformed(),

actionPerformed(),

getActionCommand(), getTask(), create, isNewTask(), and finally addTask(). The


end result should be like Figure 26. The diagram shows how the core classes collaborate to perform a user action. As a sequence diagram should describe a specific sequence of messages, we chose the Save button (a JButton) from TaskForm when its used to add a new task. Clicking Save starts the sequence, and the resulting event is routed by Action-

Conclusions
In the past, modeling was done using expensive proprietary tools with steep learning curves. This prevented most development teams to effectively use UML models and hindered adoption by most small and medium shops. Modeling was performed mainly by Business Experts and System Analysts, sometimes by a Software Architect. And many of those never came close to real Java source code. Also CASE tool developers were often unaware of the state-of-the-art in enterprise software development in general and the Java platform in particular. All this is changing with the full open-source UML support in NetBeans. Having UML modeling seamlessly integrated in the IDE encourages developers to use models and diagrams, improving both communication between team members and the quality of OO designs. The UML Modeling Project provides developers, from Agile Modeling fans to MDA advocates, with a powerful toolset that enables ubiquitous and effective modeling.

Support to ListEditTask, which queries the actionCommand property from ActionEvent


object (e) for which operation to perform. Then it asks the TaskForm for the updated

Task object, which is sent to the TaskManager to be saved to the database.


Although this sequence diagram was created to describe a specific message sequence (a click on the Save button)

Second Edition N 53

You might also like