Reactor Design Pattern

Total Page:16

File Type:pdf, Size:1020Kb

Reactor Design Pattern TEM Journal. Volume 10, Issue 1, Pages 18-30, ISSN 2217-8309, DOI: 10.18421/TEM101-03, February 2021. Reactor Design Pattern Marko Mijač 1, Antonio García-Cabot 2, Vjeran Strahonja 1 1University of Zagreb, Faculty of Organization and Informatics, Varaždin, Croatia 2University of Alcalá, Computer Science Department, Alcalá de Henares, Spain Abstract – In object-oriented (OO) applications, paradigm is "object", which encapsulates state objects collaborate through message passing, which (attributes) and associated behavior (methods) of results in these objects being coupled and mutually concepts in the problem domain. Each object has its dependent. These dependencies can be reactive, i.e. responsibility and is expected to contribute to the such that, for example, the state change of one object, overall goal of the application. In this process, requires automatic reaction in all dependent objects. Examples of such reactive dependencies can be found objects collaborate in a form of message passing, i.e. in various software systems, including rich graphical invoking other objects’ behavior, or fetching their interfaces, spreadsheet systems, animation, robotics, state. This results in objects being coupled and etc. Unlike the reactive paradigm which natively mutually dependent. provides abstractions and mechanisms for the Dependencies between objects can sometimes be management of reactive dependencies, the OO reactive, i.e. such that for example the state change in paradigm lacks proper support. Object-oriented one object, automatically triggers an update of state applications developers often resort to the use of ad- in all dependent objects. Dependent objects need to hoc solutions or design patterns such as the well-known recognize the occurrence of something interesting Observer pattern, which are not suitable for managing happening and react accordingly. Examples of such more complex scenarios. In this paper we offer a novel design pattern (REACTOR), which utilizes a graph reactive dependencies can be found in several data structure to improve the management of reactive software systems, including rich graphical user dependencies in OO applications. interfaces, spreadsheets, animation, modeling, etc. OO paradigm lacks native support for managing Keywords – design patterns, design science, object- reactive dependencies. Instead, the well-known oriented paradigm, reactive paradigm Observer design pattern (or some variant of it) is mostly used as a solution. Observer’s overall idea is 1. Introduction to “Define a one-to-many dependency between objects so that when one object changes state, all its The Object-oriented (OO) paradigm dominates in dependents are notified and updated automatically" the modeling and development of large and complex [1]. This coincides with the idea of reactive software systems. The central abstraction of this dependencies, however, the use of Observer has several shortcomings that made it heavily criticized as unfit for complex use (e.g. in [2], [3] and [4]). DOI: 10.18421/TEM101-03 Indeed, when managing a large number of mutually https://doi.org/10.18421/TEM101-03 interconnected reactive dependencies, the following Corresponding author: Marko Mijač, issues may arise: (1) failing to react and update Department of Information Systems Development, Faculty dependent objects when there is a need for it; (2) of Organization and Informatics, Pavlinska 2, Varaždin, reacting and updating defensively and redundantly Croatia. when there is no need for it; (3) updating in the Email: [email protected] wrong order and thus causing inconsistencies (so- called glitches); (4) forming circular dependencies Received: 10 November 2020. which cause infinite loops, etc. In order to address Revised: 09 December 2020. these issues, we propose a novel design pattern, Accepted: 16 December 2020. Published: 27 February 2021. which uses well-known graph structures to express reactive dependencies and support related operations. © 2021 Marko Mijač, Antonio García-Cabot & The rest of the paper starts with presenting related Vjeran Strahonja; published by UIKTEN. This work is work (section 2), followed by a description of the licensed under the Creative Commons Attribution- chosen research paradigm and methodological NonCommercial-NoDerivs 4.0 License. framework (section 3). Outcomes of activities and The article is published with Open Access at steps prescribed by the methodological framework www.temjournal.com are contained in section 4. Finally, contributions are discussed and conclusions offered in section 5. 18 TEM Journal – Volume 10 / Number 1 / 2021. TEM Journal. Volume 10, Issue 1, Pages 18-30, ISSN 2217-8309, DOI: 10.18421/TEM101-03, February 2021. 2. Related Work "event-triggered signal sent to a run-time recipient" [8]. This signal is usually sent either by transferring The concept of reactive dependencies described in data or transferring execution control. the previous section has been recognized by both Faison [8] describes two principal roles essential in academy and industry and is related to several fields event-based interaction. The first role is commonly of research. Reactive programming, event-based referred to as event publisher/sender and it describes programming, and aspect-oriented programming are an entity able to produce an event and send a examples of relevant research fields. Solutions notification. The second role, commonly referred to offered in these fields differ in approach and scale as event subscriber/receiver, describes an entity able and take different forms, ranging from design to receive notification and react to it. The act of patterns, libraries and frameworks, specialized sending the notification is often called firing the programming languages, and language extensions. event, while the act of establishing the link between Bainomugisha et al. [5] in their extensive survey sender and receiver is called subscription or define reactive programming as a paradigm centered registration [8]. Similarly, Hinze et al. [9] classify around the issues of continuous time-varying values parts of the event-based system into (1) monitoring and propagation of change. These issues are tackled component, (2) transmission mechanism, and (3) by providing abstractions able to express and reactive component. While monitoring and reactive automate the flow of time, as well as abstractions for components correspond to event sender and event expressing data and computational dependencies. receiver roles respectively, transmission mechanisms Thus, they identify two distinguishing abstractions describe how notifications are sent and received. If offered by reactive programming languages: (1) notifications are exchanged directly between sender behaviors or signals and (2) events. Based on these and receiver, we talk about decentralized, point-to- built-in abstractions some solutions from the fields of point systems. However, often a separate, third reactive programming provide a mechanism for component is introduced to decouple senders and automated management of reactive dependencies. receivers and route notifications throughout the Most of the research in the field of reactive system. Such an approach is called a centralized or programming stems from representatives of middleware approach. functional-reactive languages such as Fran [6], which At the core of event-based programming is the idea is why reactive programming has a strong functional- of implicit invocation, which according to Steimann declarative flavor as opposed to the imperative style et al. [10] can be considered as both an architectural of OO programming. Recent trends, however, style and programming paradigm. Since being acknowledge the advantages and disadvantages of introduced by Garlan and Notkin [11], it is frequently both reactive and object-oriented paradigm and aim used to implement inversion of control and achieve at reconciling them. Boix et al. [7] identify two loose integration of objects and components. While approaches for this: the first taking reactive in traditional systems the components usually interact programming, and the second taking OO by explicitly invoking each other's methods, implicit programming as a starting point. Their ROAM invocation relies on events instead. A component, framework implemented in AmbientTalk acting as a sender, can publish one or more events as programming language is an example of the second a means of informing other components that some approach. Conversely, REScala is an example of the significant change happened. Other components, first approach [2]. acting as receivers, can express their interest in these Event-driven programming is a paradigm events by subscribing to it. Whenever the sender specifically suited for the development of event- component triggers an event, all subscribed based systems. According to Faison [8], these are the components invoke their event handling methods systems whose elements primarily interact through (thus the name implicit). Now, instead of sender event notifications. Similarly, Hinze et al. [9] component being required to know its receivers, describe them as systems in which observed events receivers are required to know the sender (thus the cause reactions. Most of today's software systems, name inversion of control). According to Notkin et especially the ones with graphical user interfaces, are al. [12], implicit invocation makes it easier to add, event-based. modify, and integrate new components, without the At the core of the event-based paradigm is the
Recommended publications
  • Design Pattern Interview Questions
    DDEESSIIGGNN PPAATTTTEERRNN -- IINNTTEERRVVIIEEWW QQUUEESSTTIIOONNSS http://www.tutorialspoint.com/design_pattern/design_pattern_interview_questions.htm Copyright © tutorialspoint.com Dear readers, these Design Pattern Interview Questions have been designed specially to get you acquainted with the nature of questions you may encounter during your interview for the subject of Design Pattern. As per my experience good interviewers hardly plan to ask any particular question during your interview, normally questions start with some basic concept of the subject and later they continue based on further discussion and what you answer: What are Design Patterns? Design patterns represent the best practices used by experienced object-oriented software developers. Design patterns are solutions to general problems that software developers faced during software development. These solutions were obtained by trial and error by numerous software developers over quite a substantial period of time. What is Gang of Four GOF? In 1994, four authors Erich Gamma, Richard Helm, Ralph Johnson and John Vlissides published a book titled Design Patterns - Elements of Reusable Object-Oriented Software which initiated the concept of Design Pattern in Software development. These authors are collectively known as Gang of Four GOF. Name types of Design Patterns? Design patterns can be classified in three categories: Creational, Structural and Behavioral patterns. Creational Patterns - These design patterns provide a way to create objects while hiding the creation logic, rather than instantiating objects directly using new opreator. This gives program more flexibility in deciding which objects need to be created for a given use case. Structural Patterns - These design patterns concern class and object composition. Concept of inheritance is used to compose interfaces and define ways to compose objects to obtain new functionalities.
    [Show full text]
  • Design Patterns in PHP and Laravel — Kelt Dockins Design Patterns in PHP and Laravel
    Design Patterns in PHP and Laravel — Kelt Dockins Design Patterns in PHP and Laravel Kelt Dockins [email protected] Design Patterns in PHP and Laravel Kelt Dockins Dolph, Arkansas USA ISBN-13 (pbk): 978-1-4842-2450-2 ISBN-13 (electronic): 978-1-4842-2451-9 DOI 10.1007/978-1-4842-2451-9 Library of Congress Control Number: 2016961807 Copyright © 2017 by Kelt Dockins This work is subject to copyright. All rights are reserved by the Publisher, whether the whole or part of the material is concerned, specifically the rights of translation, reprinting, reuse of illustrations, recitation, broadcasting, reproduction on microfilms or in any other physical way, and transmission or information storage and retrieval, electronic adaptation, computer software, or by similar or dissimilar methodology now known or hereafter developed. Trademarked names, logos, and images may appear in this book. Rather than use a trademark symbol with every occurrence of a trademarked name, logo, or image we use the names, logos, and images only in an editorial fashion and to the benefit of the trademark owner, with no intention of infringement of the trademark. The use in this publication of trade names, trademarks, service marks, and similar terms, even if they are not identified as such, is not to be taken as an expression of opinion as to whether or not they are subject to proprietary rights. While the advice and information in this book are believed to be true and accurate at the date of publication, neither the authors nor the editors nor the publisher can accept any legal responsibility for any errors or omissions that may be made.
    [Show full text]
  • Enterprise Development with Flex
    Enterprise Development with Flex Enterprise Development with Flex Yakov Fain, Victor Rasputnis, and Anatole Tartakovsky Beijing • Cambridge • Farnham • Köln • Sebastopol • Taipei • Tokyo Enterprise Development with Flex by Yakov Fain, Victor Rasputnis, and Anatole Tartakovsky Copyright © 2010 Yakov Fain, Victor Rasputnis, and Anatole Tartakovsky.. All rights reserved. Printed in the United States of America. Published by O’Reilly Media, Inc., 1005 Gravenstein Highway North, Sebastopol, CA 95472. O’Reilly books may be purchased for educational, business, or sales promotional use. Online editions are also available for most titles (http://my.safaribooksonline.com). For more information, contact our corporate/institutional sales department: (800) 998-9938 or [email protected]. Editor: Mary E. Treseler Indexer: Ellen Troutman Development Editor: Linda Laflamme Cover Designer: Karen Montgomery Production Editor: Adam Zaremba Interior Designer: David Futato Copyeditor: Nancy Kotary Illustrator: Robert Romano Proofreader: Sada Preisch Printing History: March 2010: First Edition. Nutshell Handbook, the Nutshell Handbook logo, and the O’Reilly logo are registered trademarks of O’Reilly Media, Inc. Enterprise Development with Flex, the image of red-crested wood-quails, and related trade dress are trademarks of O’Reilly Media, Inc. Many of the designations used by manufacturers and sellers to distinguish their products are claimed as trademarks. Where those designations appear in this book, and O’Reilly Media, Inc. was aware of a trademark claim, the designations have been printed in caps or initial caps. While every precaution has been taken in the preparation of this book, the publisher and authors assume no responsibility for errors or omissions, or for damages resulting from the use of the information con- tained herein.
    [Show full text]
  • Learning Javascript Design Patterns
    Learning JavaScript Design Patterns Addy Osmani Beijing • Cambridge • Farnham • Köln • Sebastopol • Tokyo Learning JavaScript Design Patterns by Addy Osmani Copyright © 2012 Addy Osmani. All rights reserved. Revision History for the : 2012-05-01 Early release revision 1 See http://oreilly.com/catalog/errata.csp?isbn=9781449331818 for release details. ISBN: 978-1-449-33181-8 1335906805 Table of Contents Preface ..................................................................... ix 1. Introduction ........................................................... 1 2. What is a Pattern? ...................................................... 3 We already use patterns everyday 4 3. 'Pattern'-ity Testing, Proto-Patterns & The Rule Of Three ...................... 7 4. The Structure Of A Design Pattern ......................................... 9 5. Writing Design Patterns ................................................. 11 6. Anti-Patterns ......................................................... 13 7. Categories Of Design Pattern ............................................ 15 Creational Design Patterns 15 Structural Design Patterns 16 Behavioral Design Patterns 16 8. Design Pattern Categorization ........................................... 17 A brief note on classes 17 9. JavaScript Design Patterns .............................................. 21 The Creational Pattern 22 The Constructor Pattern 23 Basic Constructors 23 Constructors With Prototypes 24 The Singleton Pattern 24 The Module Pattern 27 iii Modules 27 Object Literals 27 The Module Pattern
    [Show full text]
  • Leader/Followers
    Leader/Followers Douglas C. Schmidt, Carlos O’Ryan, Michael Kircher, Irfan Pyarali, and Frank Buschmann {schmidt, coryan}@uci.edu, {Michael.Kircher, Frank.Buschmann}@mchp.siemens.de, [email protected] University of California at Irvine, Siemens AG, and Washington University in Saint Louis The Leader/Followers architectural pattern provides an efficient concurrency model where multiple threads take turns sharing a set of event sources in order to detect, de- multiplex, dispatch, and process service requests that occur on these event sources. Example Consider the design of a multi-tier, high-volume, on-line transaction processing (OLTP) system. In this design, front-end communication servers route transaction requests from remote clients, such as travel agents, claims processing centers, or point-of-sales terminals, to back-end database servers that process the requests transactionally. After a transaction commits, the database server returns its results to the associated communication server, which then forwards the results back to the originating remote client. This multi-tier architecture is used to improve overall system throughput and reliability via load balancing and redundancy, respectively.It LAN WAN Front-End Back-End Clients Communication Servers Database Servers also relieves back-end servers from the burden of managing different communication protocols with clients. © Douglas C. Schmidt 1998 - 2000, all rights reserved, © Siemens AG 1998 - 2000, all rights reserved 19.06.2000 lf.doc 2 Front-end communication servers are actually ``hybrid'' client/server applications that perform two primary tasks: 1 They receive requests arriving simultaneously from hundreds or thousands of remote clients over wide area communication links, such as X.25 or TCP/IP.
    [Show full text]
  • A Survey of Architectural Styles.V4
    Survey of Architectural Styles Alexander Bird, Bianca Esguerra, Jack Li Liu, Vergil Marana, Jack Kha Nguyen, Neil Oluwagbeminiyi Okikiolu, Navid Pourmantaz Department of Software Engineering University of Calgary Calgary, Canada Abstract— In software engineering, an architectural style is a and implementation; the capabilities and experience of highest-level description of an accepted solution to a common developers; and the infrastructure and organizational software problem. This paper describes and compares a selection constraints [30]. These styles are not presented as out-of-the- of nine accepted architectural styles selected by the authors and box solutions, but rather a framework within which a specific applicable in various domains. Each pattern is presented in a software design may be made. If one were to say “that cannot general sense and with a domain example, and then evaluated in be called a layered architecture because the such and such a terms of benefits and drawbacks. Then, the styles are compared layer must communicate with an object other than the layer in a condensed table of advantages and disadvantages which is above and below it” then one would have missed the point of useful both as a summary of the architectural styles as well as a architectural styles and design patterns. They are not intended tool for selecting a style to apply to a particular project. The to be definitive and final, but rather suggestive and a starting paper is written to accomplish the following purposes: (1) to give readers a general sense of several architectural styles and when point, not to be used as a rule book but rather a source of and when not to apply them, (2) to facilitate software system inspiration.
    [Show full text]
  • The Need for Hardware/Software Codesign Patterns - a Toolbox for the New Digital Designer
    The need for Hardware/Software CoDesign Patterns - a toolbox for the new Digital Designer By Senior Consultant Carsten Siggaard, Danish Technological Institute May 30. 2008 Abstract Between hardware and software the level of abstraction has always differed a lot, this is not a surprise, hardware is an abstraction for software and the topics which is considered important by either a hardware developer or a software developer are quite different, making the communication between software and hardware developers (or even departments) difficult. In this report the software concept of design patterns is expanded into hardware, and the need for a new kind of design pattern, The Digital Design Pattern, is announced. Copyright © 2008 Danish Technological Institute Page 1 of 20 Contents Contents ............................................................................................................................................... 2 Background .......................................................................................................................................... 4 What is a design pattern ....................................................................................................................... 4 Three Disciplines when using Design Patterns ................................................................................ 5 Pattern Hatching ........................................................................................................................... 6 Pattern Mining.............................................................................................................................
    [Show full text]
  • Active Object
    Active Object an Object Behavioral Pattern for Concurrent Programming R. Greg Lavender Douglas C. Schmidt [email protected] [email protected] ISODE Consortium Inc. Department of Computer Science Austin, TX Washington University, St. Louis An earlier version of this paper appeared in a chapter in the book ªPattern Languages of Program Design 2º ISBN 0-201-89527-7, edited by John Vlissides, Jim Coplien, and Norm Kerth published by Addison-Wesley, 1996. : Output : Input Handler Handler : Routing Table : Message Abstract Queue This paper describes the Active Object pattern, which decou- 3: enqueue(msg) ples method execution from method invocation in order to : Output 2: find_route(msg) simplify synchronized access to a shared resource by meth- Handler ods invoked in different threads of control. The Active Object : Message : Input pattern allows one or more independent threads of execution Queue Handler 1: recv(msg) to interleave their access to data modeled as a single ob- ject. A broad class of producer/consumer and reader/writer OUTGOING OUTGOING MESSAGES GATEWAY problems are well-suited to this model of concurrency. This MESSAGES pattern is commonly used in distributed systems requiring INCOMING INCOMING multi-threaded servers. In addition,client applications (such MESSAGES MESSAGES as windowing systems and network browsers), are increas- DST DST ingly employing active objects to simplify concurrent, asyn- SRC SRC chronous network operations. 1 Intent Figure 1: Connection-Oriented Gateway The Active Object pattern decouples method execution from method invocation in order to simplify synchronized access to a shared resource by methods invoked in different threads [2]. Sources and destinationscommunicate with the Gateway of control.
    [Show full text]
  • Design Pattern Implementation in Java and Aspectj
    Design Pattern Implementation in Java and AspectJ Jan Hannemann Gregor Kiczales University of British Columbia University of British Columbia 201-2366 Main Mall 201-2366 Main Mall Vancouver B.C. V6T 1Z4 Vancouver B.C. V6T 1Z4 jan [at] cs.ubc.ca gregor [at] cs.ubc.ca ABSTRACT successor in the chain. The event handling mechanism crosscuts the Handlers. AspectJ implementations of the GoF design patterns show modularity improvements in 17 of 23 cases. These improvements When the GoF patterns were first identified, the sample are manifested in terms of better code locality, reusability, implementations were geared to the current state of the art in composability, and (un)pluggability. object-oriented languages. Other work [19, 22] has shown that implementation language affects pattern implementation, so it seems The degree of improvement in implementation modularity varies, natural to explore the effect of aspect-oriented programming with the greatest improvement coming when the pattern solution techniques [11] on the implementation of the GoF patterns. structure involves crosscutting of some form, including one object As an initial experiment we chose to develop and compare Java playing multiple roles, many objects playing one role, or an object [27] and AspectJ [25] implementations of the 23 GoF patterns. playing roles in multiple pattern instances. AspectJ is a seamless aspect-oriented extension to Java, which means that programming in AspectJ is effectively programming in Categories and Subject Descriptors Java plus aspects. D.2.11 [Software Engineering]: Software Architectures – By focusing on the GoF patterns, we are keeping the purpose, patterns, information hiding, and languages; D.3.3 intent, and applicability of 23 well-known patterns, and only allowing [Programming Languages]: Language Constructs and Features – the solution structure and solution implementation to change.
    [Show full text]
  • Performance Analysis of the Reactor Pattern in Network Services
    Performance Analysis of the Reactor Pattern in Network Services Swapna Gokhale1, Aniruddha Gokhale2, Jeff Gray3, Paul Vandal1, Upsorn Praphamontripong1 1University of Connecticut 2Vanderbilt University Dept. of Computer Science Dept. of Electrical Engineering and Engineering and Computer Science Storrs, CT 06269 USA Nashville, TN 37235 USA [email protected] [email protected] 3University of Alabama at Birmingham Dept of Computer and Information Science Birmingham, AL USA [email protected] Abstract 1. Introduction Service oriented computing (SoC), which is made feasi- ble by middleware-based distributed systems, is an emerg- ing technology to provide the next-generation services to meet societal needs ranging from basic necessities, such as The growing reliance on services provided by software education, energy, communications and healthcare to emer- applications places a high premium on the reliable and ef- gency and disaster management. For SOC to be successful ficient operation of these applications. A number of these in meeting the demands of society, assurance on the perfor- applications follow the event-driven software architecture mance of these services is necessary. Since these services style since this style fosters evolvability by separating event are primarily built using communication middleware, the handling from event demultiplexing and dispatching func- problem reduces to the issue of performance assurance of tionality. The event demultiplexing capability, which ap- the middleware platforms. pears repeatedly across a class of event-driven applica- Middleware typically comprises a number of building tions, can be codified into a reusable pattern, such as the blocks, which are essentially patterns-based reusable soft- Reactor pattern. In order to enable performance analysis of ware frameworks.
    [Show full text]
  • The Design and Use of the ACE Reactor an Object-Oriented Framework for Event Demultiplexing
    The Design and Use of the ACE Reactor An Object-Oriented Framework for Event Demultiplexing Douglas C. Schmidt and Irfan Pyarali g fschmidt,irfan @cs.wustl.edu Department of Computer Science Washington University, St. Louis 631301 1 Introduction create concrete event handlers by inheriting from the ACE Event Handler base class. This class specifies vir- This article describes the design and implementation of the tual methods that handle various types of events, such as Reactor pattern [1] contained in the ACE framework [2]. The I/O events, timer events, signals, and synchronization events. Reactor pattern handles service requests that are delivered Applications that use the Reactor framework create concrete concurrently to an application by one or more clients. Each event handlers and register them with the ACE Reactor. service of the application is implemented by a separate event Figure 1 shows the key components in the ACE Reactor. handler that contains one or more methods responsible for This figure depicts concrete event handlers that implement processing service-specific requests. In the implementation of the Reactor pattern described in this paper, event handler dispatching is performed REGISTERED 2: accept() by an ACE Reactor.TheACE Reactor combines OBJECTS 5: recv(request) 3: make_handler() the demultiplexing of input and output (I/O) events with 6: process(request) other types of events, such as timers and signals. At Logging Logging Logging Logging Handler Acceptor LEVEL thecoreoftheACE Reactor implementation is a syn- LEVEL Handler Handler chronous event demultiplexer, such as select [3] or APPLICATION APPLICATION Event Event WaitForMultipleObjects [4]. When the demulti- Event Event Handler Handler Handler plexer indicates the occurrence of designated events, the Handler ACE Reactor automatically dispatches the method(s) of 4: handle_input() 1: handle_input() pre-registered event handlers, which perform application- specified services in response to the events.
    [Show full text]
  • Java Design Patterns I
    Java Design Patterns i Java Design Patterns Java Design Patterns ii Contents 1 Introduction to Design Patterns 1 1.1 Introduction......................................................1 1.2 What are Design Patterns...............................................1 1.3 Why use them.....................................................2 1.4 How to select and use one...............................................2 1.5 Categorization of patterns...............................................3 1.5.1 Creational patterns..............................................3 1.5.2 Structural patterns..............................................3 1.5.3 Behavior patterns...............................................3 2 Adapter Design Pattern 5 2.1 Adapter Pattern....................................................5 2.2 An Adapter to rescue.................................................6 2.3 Solution to the problem................................................7 2.4 Class Adapter..................................................... 11 2.5 When to use Adapter Pattern............................................. 12 2.6 Download the Source Code.............................................. 12 3 Facade Design Pattern 13 3.1 Introduction...................................................... 13 3.2 What is the Facade Pattern.............................................. 13 3.3 Solution to the problem................................................ 14 3.4 Use of the Facade Pattern............................................... 16 3.5 Download the Source Code.............................................
    [Show full text]