Inline Visualization of Concerns Nalin Saigal, Jay Ligatti Department of Computer Science and Engineering, University of South Florida 1/56 Introduction Code modularization provides softwareengineering benefits Modularizing code helps separate different functionalities of software from one another 2/56 More Specifically… GUI Modularize Security Authentication Networking All the code implementing one functionality, which otherwise might be scattered, gets organized into the same module, e.g., function, class, package, or aspect The programmer can deal with all invariants of one functionality in one place This makes code easier to write, locate, understand, 3/56 and maintain Stack Example int stack[MAX_SIZE]; int size = 0; ... //Pushing a onto stack stack[size] = a; size++; //Pushing b onto stack stack[size] = b; size++; We can modularize the operations being performed here by defining a class called stack. //Popping b size--; int a1 = stack[size]; //Popping a size--; int a2 = stack[size]; ... 4/56 Stack Example ... class stack { my_stack.push(a); int a[MAX_SIZE]; my_stack.push(b); int size = 0; int a1 = my_stack.pop(); void push(int data) int a2 = my_stack.pop(); stack[size] = data; ... size++; { } Application developer’s code Modularized stack implementation int pop() { size--; return stack[size]; } }my_stack; An application developer does not need to know how the stack is implemented We can make changes to the stack implementation without even letting the application developer know 5/56 Stack Example ... class stack { my_stack.push(a); int a[MAX_SIZE]; my_stack.push(b); int size = 0; int a1 = my_stack.pop(); void push(int data) int a2 = my_stack.pop(); { if (size == MAX_SIZE–1) printErr(“Overflow”); ... stack[size] = data; size++; Observe that code written by the application developer doesn’t change } int pop() { if (size == 0) printErr(“Underflow”); size--; return stack[size]; } }my_stack; 6/56 Problem Conventionally, software engineers try to separate code segments that are orthogonal in their functionality into distinct modules In practice, this doesn’t happen Example This code implements login, security, GUI, and authentication concerns: JOptionPane.showMessageDialog(null,“Login Attempt Failed.”,“Error”,JOptionPane.ERROR_MESSAGE); Which module out of login, security, GUI, and authentication should this code be present in? Peri Tarr et al. call this problem the “tyranny of dominant decomposition” 7/56 Converse Problem Previous problem: one code segment may implement many concerns Converse problem: one concern may be implemented by many code segments (i.e., the concern is scattered) If the code implementing C is scattered throughout code implementing other concerns, we say that C crosscuts through other functional concerns 8/56 Example String passWord =(String)JOptionPane.showInputDialog(...); boolean allow = this.authenticate(passWord); File file = new File(“output.log”); if (allow) { file.write(“Access granted.”); file.close(); else } { file.write(“Access Denied”); file.close(); return; } The security concern crosscuts the rest of the code Therefore, the security concern is called a CrossCutting Concern (CCC). 9/56 Example A security engineer would have to go through the whole program to locate code that implements security However, if code is isolated, the security engineer only needs to locate the security module Security 10/56 IVCon (Inline Visualization of Concerns) GUI-based tool to modularize CCCs. Users can switch back and forth between two equivalent views of their code: Woven view Unwoven view Users can also edit code in both these views 11/56 1. Woven view: Displays program code in colors that indicate which concerns various code segments implement 12/56 2. Unwoven view: Displays code in two panels, one showing the core of the program, and the other showing all the modularized concerns (each displayed in isolation) 13/56 IVCon Feature: Relationships between Concerns and Code Users can assign scattered code to the same concern The same code can be assigned to multiple concerns IVCon allows users to define many-to-many relationships between concerns and code 14/56 Another IVCon Feature: Concernassignment Granularity IVCon enforces token-level granularity in concern assignments Code assigned to a concern must begin and end at the beginning and ending of language-level tokens accessLog.append("About to read from file “ + this.toString()); accessLog.append("About to read from file “ + this.toString()); accessLog.append("About to read from file “ + this.toString()); accessLog.append("About to read from file “ + this.toString()); accessLog.append("About to read from file “ + this.toString()); 15/56 Motivation for Token-level Granularity Finer granularity levels are inappropriate because tokens are the core semantic units of programming languages It won’t make sense to start concerns from the middle of a token IVCon is the first concern-management tool we know of that enforces token-level granularity Coarser granularity in concern assignment would reduce precision in concern assignments 16/56 Outline Introduction Motivation Related work User Interface Woven view Unwoven view Display of Multi-concern code Implementation Data structures Performance evaluation Conclusion and Future Work 17/56 Related Work IVCon relates most closely to Aspectoriented programming (AOP) and aspectvisualization tools AOP strives to ease the specification and manipulation of CCCs in software AOPLs use aspects to do so Aspect Advice Code that implements CCCs Joinpoints Locations in program where the advice should be executed 18/56 Related Work: AOPLs Typical Aspect-oriented program: Aspects AOPL Compiler Core program Programmer’s view View during execution IVCon’s unwoven view corresponds to a programmer’s view of an aspect-oriented program IVCon’s woven view corresponds to the runtime view of the aspect-oriented program 19/56 Related Work: Aspect-visualization Tools Unlike existing tools, IVCon does all of the following: Provides dual views (woven and unwoven) of user code Enforces token-level granularity in concern assignments Enables users to modify identical concern-code in one place Isolates concerns into modules Enables users to define many-to-many relationships between concerns and code Provides a GUI 20/56 Comparison of IVCon with Related Work Tool Edit code in dual views AspectBrowser No Characterlevel No No One-to-many Yes Aspect-jEdit Yes Line-level No Yes One-to-many Yes Visualizer No Line-level No No One-to-many Yes CIDE No Nodes in ASTs No No Many-to-many Yes Hyper/J No Declarationlevel No Yes Many-to-many No C4 Yes Line-level No Yes One-to-many No IVCon Yes Token-level Yes Yes Many-to-many Yes Level of granularity Modify identical concern code in one place Isolates concerns Relationship between concerns and code GUI 21/56 Outline Introduction Motivation Related work User Interface Woven view Unwoven view Display of Multi-concern code Implementation Data structures Performance evaluation Conclusion and Future Work 22/56 Woven View Woven-body panel is where users write and view their complete code. 23/56 Woven View Concern-legend panel lists all the concerns defined by the user 24/56 Woven View Concerns-at-current-position panel displays the concerns implemented by the code at the current cursor position. 25/56 Woven View Users explicitly assign code to concerns Each time users assigns code to a concern, they define a region Code gets displayed in color of the concern it implements If code implements multiple concerns, it’s displayed in white text over a multi-concern background Users can edit code, including concern code, without restrictions 26/56 Other Operations in IVCon’s Woven View Edit concerns (name and/or color) De-assign concerns from code. Remove concerns Rename code regions Change multi-concern background 27/56 Outline Introduction Motivation Related work User Interface Woven view Unwoven view Display of Multi-concern code Implementation Data structures Performance evaluation Conclusion and Future Work 28/56 Unwoven View The concern-legend panel and the concerns-at-currentposition panel remain the same as in the woven view The woven-body panel gets divides into two panels: the unwoven-body panel, and the unwoven-concerns panel 29/56 Unwoven View Unwoven-body panel displays the core of the user’s program i.e., code that has not been assigned to any concerns 30/56 Unwoven View Unwoven-concerns panel shows each concern in an isolated module 31/56 Concern Modules Concern modules display various code segments that implement a concern along with the names of the regions where they appear 32/56 Concern Modules Concern modules can also contain constructs called Flags, which are used to indicate overlap between concerns 33/56 Centralized Code Updates Syntactically equal code assigned to the same concern gets displayed only once in the unwoven-concerns panel Enables users to modify syntactically equal code segments centrally 34/56 Centralized Code Updates - Example if (buffer.getSize() > 512) buffer.truncate(512); if (getTimeElapsed() > 2000) JOptionPane.showMessageDialog(frame, "Request timed out","Error", JOptionPane.ERROR_MESSAGE); Unweave if (buffer.getSize() > □) buffer.truncate(□); if (getTimeElapsed() > □) JOptionPane.showMessageDialog(frame, "Request timed out","Error", JOptionPane.ERROR_MESSAGE); concern constant { subconcern @ max_buffer_size_0 @ max_buffer_size_1 § 512 § subconcern @ timeout_ms_0 § 2000 § } 35/56 Centralized Code Updates - Example if (buffer.getSize() > 1024) buffer.truncate(1024); if (getTimeElapsed() > 2000) JOptionPane.showMessageDialog(frame, "Request timed out","Error", JOptionPane.ERROR_MESSAGE); Weave if (buffer.getSize() > □) buffer.truncate(□); if (getTimeElapsed() > □) JOptionPane.showMessageDialog(frame, "Request timed out","Error", JOptionPane.ERROR_MESSAGE); concern constant { subconcern @ max_buffer_size_0 @ max_buffer_size_1 § 1024 § subconcern @ timeout_ms_0 § 2000 § } 36/56 Outline Introduction Motivation Related work User Interface Woven view Unwoven view Display of Multi-concern code Implementation Data structures Performance evaluation Conclusion and Future Work 37/56 Display of Multi-concern Code: Woven view Displayed in white text over multiconcern background Concern information is present in concerns-at-current-position panel 38/56 Display of Multi-concern Code: Unwoven view Unwoven-body panel uses white holes(□) over the multi-concern background Unwoven-concerns panel uses Flags Appear when there is overlap between two concerns Two types of flags: Green Flags and Red Flags Green flags indicate the beginning of nested concerns Red flags indicate the end of nested concerns 39/56 Flags – An Example We assign all this code to the security concern 40/56 Flags – An Example We assign the two accessLog.append(..) statements to the audit concern 41/56 Flags – An Example 42/56 Outline Introduction Motivation Related work User Interface Woven view Unwoven view Display of Multi-concern code Implementation Data structures Performance evaluation Conclusion and Future Work 43/56 Data Structures IVCon stores information about concern assignments in three key data structures: regionMap concernMap regionTree 44/56 regionMap (HashTable) User-visible name Unique Region Indentifier Beginning and ending positions of the region List of concerns to which region has been assigned 45/56 concernMap (HashTable) Unique Concern Name Concern’s display color List of regions assigned to that concern 46/56 regionTree (R-tree) R-trees dynamically store data about potentially overlapping regions in space. Upon querying about a region r, an R-tree can efficiently return the set of stored regions that overlap r. We use R-trees to determine the regions that overlap the current cursor position. From those regions, regionMap tells us the concerns assigned to the current cursor position. 47/56 Outline Introduction Motivation Related work User Interface Woven view Unwoven view Display of Multi-concern code Implementation Data structures Performance evaluation Conclusion and Future Work 48/56 Performance Evaluation Tested IVCon by assigning code to concerns in three of IVCon’s source-code files: IVCON.java FileUtilities.java ConcernManipulation.java Also, created an impractically large file (StressTest.java) of 100,000 lines, each containing 20 randomly generated single-character tokens 49/56 Test-file Characteristics Total # of Regions Avg Region Size (chars) Max Region Size (chars) File Name File Size (LoC) Total # of Concerns IVCON.java 49 5 7 135.9 337 FileUtilities.java 313 11 25 155.7 788 ConcernManipulation.java 3,342 36 182 269.9 3,461 StressTest.java 100,000 1,000 5,000 1,016 1,996 Measured time taken for the following operations: assign code to a concern, edit a concern, remove a concern, weaving, and unweaving 50/56 Performance Evaluation File Name Assign Code Edit a to a Concern Concern (ms) (ms) Remove a Concern (ms) Weaving (ms) Unweaving (ms) IVCON.java 17.35 5.31 7.02 20.7 4.37 FileUtilities.java 50.58 14.49 20.58 88.71 21.7 ConcernManipulation.java 519.1 30 84.02 566.8 501.9 StressTest.java 312,519 2,276 3,742 465,000 481,737 IVCon performed all operations tolerably quickly on reasonably-sized files. 51/56 Outline Introduction Motivation Related work User Interface Woven view Unwoven view Display of Multi-concern code Implementation Data structures Performance evaluation Conclusion and Future Work 52/56 Conclusion IVCon attempts to help users conveniently create, examine, and modify code in the presence of crosscutting concerns IVCon differs from existing aspect-visualization tools by providing a combination of: Translations between woven and unwoven views Token-level granularity in concern assignment Central code-updates for syntactically equal code segments Isolation of concerns into distinct modules Many-to-many relationships between concerns and code GUI designed to make all of the above convenient 53/56 Future Work Case study: Gain experience using IVCon by using IVCon to extend IVCon New features to add in case study Search for text in code (ctrl-f) Handle multiple source-code files simultaneously Display flags in the woven view Use tooltips to display concerns implemented by the code at the current cursor position 54/56 Thanks/Questions? 55/56 References [1] C. Kastner. CIDE: Decomposing legacy applications into features. In Proceedings of the 11th International Software Product Line Conference (SPLC), second volume (Demonstration), pages 149–150, 2007. [2] H. Ossher and P. Tarr. Hyper/J: Multi-dimensional separation of concerns for Java. In Proceedings of the International Conference on Software Engineering, pages 734–737, 2000. [3] T. Panas, J. Karlsson, and M. Hogberg. Aspect-jEdit for inline aspect support. In Proceedings of the Third German Workshop on Aspect Oriented Software Development, 2003. [4] M. Shonle, J. Neddenriep, andW. Griswold. AspectBrowser for eclipse: A case study in plug-in retargeting. In Proceedings of the 2004 OOPSLA workshop on eclipse technology eXchange, pages 78–82, 2004. [5] The Visualiser, 2008. http://www.eclipse.org/ajdt/visualiser/. [6] M.Yuen, M. E. Fiuczynski, R. Grimm, Y. Coady, and D. Walker. Making extensibility of system software practical with the C4 toolkit. In Proceedings of the Workshop on Software Engineering Properties of Languages and Aspect Technologies, March 2006. 56/56