automatically extracting view models from component-based

38
Software Engineering for Business Information Systems (sebis) Department of Informatics Technische Universität München, Germany wwwmatthes.in.tum.de Automatically extracting view models from component-based web applications Andreas Tielitz, 05. Dec 2016

Upload: others

Post on 21-Apr-2022

5 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Automatically extracting view models from component-based

Software Engineering for Business Information Systems (sebis) Department of InformaticsTechnische Universität München, Germany

wwwmatthes.in.tum.de

Automatically extracting view models from component-based web applications Andreas Tielitz, 05. Dec 2016

Page 2: Automatically extracting view models from component-based

1. Introduction§ Motivation§ Research§ Development Process

2. Conceptual§ View Model§ Extraction Process

3. Design & Implementation§ Columbus

4. Evaluation

Overview

© sebis161205 Andreas Tielitz 2

Page 3: Automatically extracting view models from component-based

Motivation

© sebis161205 Andreas Tielitz 3

Presentation Layer

Business Layer

Persistence Layer

Database

§ IDE§ UML modelling tools (Visual Paradigm, …)

§ ERM modelling tools§ Microsoft Visio§ Visual Paradigm

§ ??

§ IDE§ UML modelling tools (Visual Paradigm, …)

Page 4: Automatically extracting view models from component-based

§ A lot of research is going on§ Pattern-based reverse-engineering of design components§ Reverse Engineering of Graphical User Interfaces§ Towards automated support for extraction of reusable components§ User Interface Reverse Engineering in Support of Interface Migration to the Web§ …

§ What about the web?

Relevance of Research

© sebis161205 Andreas Tielitz 4

Page 5: Automatically extracting view models from component-based

Development Process

© sebis161205 Andreas Tielitz 5

DefineView Model

DevelopExtraction Process

Implementation

Evaluation

Q1: What is a view model of a web component?

Q2: How can a model be extracted from existing web components code snippets?

Q3: How do existing technologies support the model extraction process?

Future work

Page 6: Automatically extracting view models from component-based

1. Introduction§ Motivation§ Research§ Development Process

2. Conceptual§ View Model§ Extraction Process

3. Design & Implementation§ Columbus

4. Evaluation

Overview

© sebis161205 Andreas Tielitz 6

Page 7: Automatically extracting view models from component-based

User Interface Modeling Language (UIML)

© sebis161205 Andreas Tielitz 7

UIML4.0 specification, http://docs.oasis-open.org/uiml/v4.0/cd01/uiml-4.0-cd01.pdf

§ XML-based markup language

§ 15 years old§ >30 entities

Page 8: Automatically extracting view models from component-based

A more up-to-date Model

© sebis161205 Andreas Tielitz 8

Adapted from UIML4.0 specification, http://docs.oasis-open.org/uiml/v4.0/cd01/uiml-4.0-cd01.pdf, 2008

DOMDependencies

EventsLife cycle

AttributesText

i18n

Page 9: Automatically extracting view models from component-based

A more up-to-date Model

name : StringComponent

Structure

PartReference

id : String class : String

AbstractPart

id : StringContent

id : String value : String

Constant

Style

id : String name : String value : String type : String

Property

Behaviour

Rule

Condit ion Act ion

class : String partName : String

Event componentId : String methodId : String

Call

name : String value : String

Param

0..*

parts

0..*

0..*0..* 0..*

1

1

0..*

0..*

1 1

1

© sebis161205 Andreas Tielitz 9

Page 10: Automatically extracting view models from component-based

Extraction Process

© sebis161205 Andreas Tielitz 10

Source Code

View Model

ExtractionProcess

AST Information Extraction

ModelGeneration

Semantic Analyser Information Base View Composer

E. J. Chikofsky and J. H. Cross, "Reverse engineering and design recovery: a taxonomy," in IEEE Software, vol. 7, no. 1, pp. 13-17, Jan. 1990.

Extraction Process

Page 11: Automatically extracting view models from component-based

Limitations

§ ECMAScript 5 JavaScript + JSX§ 1 file per component definition § Dependencies: import statements with “import React from ‘react’”

§ + Framework / library specific limitations

© sebis161205 Andreas Tielitz 11

Page 12: Automatically extracting view models from component-based

1. Introduction§ Motivation§ Research§ Development Process

2. Conceptual§ View Model§ Extraction Process

3. Design & Implementation§ Columbus

4. Evaluation

Overview

© sebis161205 Andreas Tielitz 12

Page 13: Automatically extracting view models from component-based

Semantic Analyser

© sebis161205 Andreas Tielitz 13

Page 14: Automatically extracting view models from component-based

Information Extraction

© sebis161205 Andreas Tielitz 14

Information Base

Page 15: Automatically extracting view models from component-based

Model Generation

© sebis161205 Andreas Tielitz 15

Page 16: Automatically extracting view models from component-based

Example View Model – HelloReact Project

© sebis161205 Andreas Tielitz 16

name = HelloReact

: Component

: Structure

class = div

: Part

class = divid = f9c4a825

: Part

class = img

: Part

class = divid = body

: Part

class = p

: Part

id = 6ee941ca

: Part

id = 586f587b

: Part

class = i

: Part

id = e80105f5

: Part

id = 3c24460f

: Part

class = SecondComponentid = ff783c43

: Reference

: Content : Behaviour

: Rule : Condition

class = componentWillMount

: Event

: Action

methodId = componentWillMount

: Call

: Rule : Condition

class = componentDidMount

: Event

: Rule : Conditionclass = componentWillReceiveProps

: Event

: Rule : Condition

class = shouldComponentUpdate

: Event

: Rule : Condition

class = componentWillUpdate

: Event

: Rule : Condition

class = componentDidUpdate

: Event

: Rule : Condition

class = componentWillUnmount

: Event

: Rule : Condition

partName = f9c4a825class = onClick

: Event

: Action

methodId = greet

: Call

: Style

id = 586f587bvalue = " "

: Property

id = e80105f5value = this.props.name

: Property

id = 3c24460fvalue = "!"

: Property

name = greetingvalue = true

: Property

name = namevalue = "Dummy"

: Property

HelloReact1

1 https://github.com/tielitz/columbus-react-example

Page 17: Automatically extracting view models from component-based

Columbus

© sebis161205 Andreas Tielitz 17

https://dev.thr3.de/columbus

Page 18: Automatically extracting view models from component-based

Columbus Process

Extraction Process

Repository contents

<<structured>>Loop

next file

Semantic analyser

Information extraction

Information baseFetch GitHub contents Model generation

© sebis161205 Andreas Tielitz 18

Page 19: Automatically extracting view models from component-based

Columbus

Live Demo

© sebis161205 Andreas Tielitz 19

Page 20: Automatically extracting view models from component-based

1. Introduction§ Motivation§ Research§ Development Process

2. Conceptual§ View Model§ Extraction Process

3. Design & Implementation§ Columbus

4. Evaluation

Overview

© sebis161205 Andreas Tielitz 20

Page 21: Automatically extracting view models from component-based

Evaluation

© sebis161205 Andreas Tielitz 21

Contacts Manager

Page 22: Automatically extracting view models from component-based

TodoMVC

§ Todo application

§ Implemented 64 times in variousMV* frameworks

§ Reacthttp://todomvc.com/examples/react/

§ Polymerhttp://todomvc.com/examples/polymer/

§ AngularJShttp://todomvc.com/examples/angularjs/

© sebis161205 Andreas Tielitz 22

http://todomvc.com

TodoApp

TodoItem

TodoItem

Page 23: Automatically extracting view models from component-based

Comparison: View Model TodoApp Reactname = TodoApp

: Component

: Structure : Content : Behaviour: Style

class = div

: Part

class = header

: Part

class = h1

: Part

id = a1

: Part

class = inputid = a2

: Part

class = section

: Part

id = a1value = "todos"

: Property

name = model

: Property

name = nowShowingvalue = app.ALL_TODOS

: Property

name = editing

: Property

name = newTodovalue = ""

: Property

class = inputid = a3

: Part

class = ul

: Part

class = TodoFooterid = a4

: Reference

class = TodoItemid = a5

: Reference

: Rule : Condition

partName = a2class = onKeyDown

: Event

: Action

methodId = handleNewTodoKeyDown

: Call

: Rule : Condition

partName = a2class = onChange

: Event

: Action

methodId = handleChange

: Call

: Rule : Condition

partName = a3class = onChange

: Event

: Action

methodId = toggleAll

: Call

: Rule : Condition

partName = a4class = onClearCompleted

: Event

: Action

methodId = clearCompleted

: Call

: Rule : Condition

partName = a5class = onToggle

: Event

: Action

methodId = toggle

: Call

value = todo

: Param

: Rule : Condition

partName = a5class = onEdit

: Event

: Action

methodId = edit

: Call

value = todo

: Param

: Rule : Condition

partName = a5class = onDestroy

: Event

: Action

methodId = destroy

: Call

value = todo

: Param

: Rule : Condition

partName = a5class = onCancel

: Event

: Action

methodId = cancel

: Call

value = todo

: Param

: Rule : Condition

partName = a5class = onSave

: Event

: Action

methodId = save

: Call

value = todo

: Param

© sebis161205 Andreas Tielitz 23

Page 24: Automatically extracting view models from component-based

Comparison: View Model TodoApp Reactname = TodoApp

: Component

: Structure : Content : Behaviour: Style

class = div

: Part

class = header

: Part

class = h1

: Part

id = a1

: Part

class = inputid = a2

: Part

class = section

: Part

id = a1value = "todos"

: Property

name = model

: Property

name = nowShowingvalue = app.ALL_TODOS

: Property

name = editing

: Property

name = newTodovalue = ""

: Property

class = inputid = a3

: Part

class = ul

: Part

class = TodoFooterid = a4

: Reference

class = TodoItemid = a5

: Reference

: Rule : Condition

partName = a2class = onKeyDown

: Event

: Action

methodId = handleNewTodoKeyDown

: Call

: Rule : Condition

partName = a2class = onChange

: Event

: Action

methodId = handleChange

: Call

: Rule : Condition

partName = a3class = onChange

: Event

: Action

methodId = toggleAll

: Call

: Rule : Condition

partName = a4class = onClearCompleted

: Event

: Action

methodId = clearCompleted

: Call

: Rule : Condition

partName = a5class = onToggle

: Event

: Action

methodId = toggle

: Call

value = todo

: Param

: Rule : Condition

partName = a5class = onEdit

: Event

: Action

methodId = edit

: Call

value = todo

: Param

: Rule : Condition

partName = a5class = onDestroy

: Event

: Action

methodId = destroy

: Call

value = todo

: Param

: Rule : Condition

partName = a5class = onCancel

: Event

: Action

methodId = cancel

: Call

value = todo

: Param

: Rule : Condition

partName = a5class = onSave

: Event

: Action

methodId = save

: Call

value = todo

: Param

© sebis161205 Andreas Tielitz 24

Page 25: Automatically extracting view models from component-based

Results of Evaluation

© sebis161205 Andreas Tielitz 25

§ TodoMVC React

§ Comparison: TodoMVC Polymer

↘↘

Page 26: Automatically extracting view models from component-based

Evaluation Results

© sebis161205 Andreas Tielitz 26

Template Life cycle events

Events Properties Dependen-cies

React + JSX ✅ ✅ ✅ ✅ ✅

Polymer ❌ ✅ ⚠ ️ ⚠ ️ ✅

Angular ❌ ✅ ⚠ ️ ⚠ ️ ⚠ ️

Page 27: Automatically extracting view models from component-based

Future Work

§ Update view model based on evaluation

§ Extend Columbus§ Add more rules§ Compiler for Polymer & AngularJS templates§ Add conventions

© sebis161205 Andreas Tielitz 27

DefineView Model

DevelopExtraction Process

Implementation

Evaluation

Page 28: Automatically extracting view models from component-based

Technische Universität MünchenDepartment of InformaticsChair of Software Engineering for Business Information Systems

Boltzmannstraße 385748 Garching bei München

Tel +49.89.289.Fax +49.89.289.17136

wwwmatthes.in.tum.de

Andreas Tielitz

Thank you

Page 29: Automatically extracting view models from component-based

Columbus – Demo

© sebis161205 Andreas Tielitz 29

Page 30: Automatically extracting view models from component-based

Columbus – Demo

© sebis161205 Matthes Slides sebis 2016 30

Page 31: Automatically extracting view models from component-based

Columbus – Demo

© sebis161205 Andreas Tielitz 31

Page 32: Automatically extracting view models from component-based

Columbus – Demo

© sebis161205 Andreas Tielitz 32

Page 33: Automatically extracting view models from component-based

View model missing herename = TodoApp

: Component

: Structure : Content : Behaviour: Style

class = divid = 7ec6d974

: Part

class = headerid = cf00f3b0

: Part

class = h1id = 1e845658

: Part

id = 4b6afbd3

: Part

class = inputid = d3a93c85

: Part

id = 802fb3f1

: Part

id = 06091929

: Part

id = 4b6afbd3name = "todos"

: Property

name = model

: Property

name = nowShowing

: Property

name = editing

: Property

name = newTodovalue = ""

: Property

: Rule : Condition

partName = 069de051class = onToggle

: Event

: Action

methodId = toggle

: Call

value = todo

: Param

: Rule : Condition

partName = 069de051class = onDestroy

: Event

: Action

methodId = destroy

: Call

value = todo

: Param

: Rule : Condition

partName = 069de051class = onEdit

: Event

: Action

methodId = edit

: Call

value = todo

: Param

: Rule : Condition

partName = 069de051class = onSave

: Event

: Action

methodId = save

: Call

value = todo

: Param

: Rule : Condition

partName = 069de051class = onCancel

: Event

: Action

methodId = cancel

: Call

value = todo

: Param

: Rule : Condition

partName = d3a93c85class = onKeyDown

: Event

: Action

methodId = handleNewTodoKeyDown

: Call

: Rule : Condition

partName = d3a93c85class = onChange

: Event

: Action

methodId = handleChange

: Call

: Rule : Condition

partName = ccde4f30class = onClearCompleted

: Event

: Action

methodId = clearCompleted

: Call

: Rule : Condition

partName = 109ce8f9class = onChange

: Event

: Action

methodId = toggleAll

: Call

© sebis161205 Andreas Tielitz 33

Page 34: Automatically extracting view models from component-based

Columbus – Architecture

-informationBase : string[]-componentModel : string[]

AppCtr lGithubEndpoint

+queryAst(query : string) : Ast+getComponents() : Ast []

As t

ReactAst PolymerAst AngularAst

+extractExpression(expr : Ast) : stringAstHelper

+parse(code : string) : AstAstParser

+parse(code : string) : Ast()TokenParser

+transform(code : string) : Ast()()JsxParser

-metaData : string[]-tree : string[]

GithubRepositoryContainer

-extractors : AbstractExtractor[]+apply(input : Ast) : string []

SharedModelExtractorChain

+extract(input : Ast) : string []AbstractExtractor

+extractFromComponent(component : Ast) : string []AbstractComponentBasedExtractor

FileImportExtractor

+generate(informationBase : string []) : string []+createDependencyGraphModel(informationBase : string []) : string []

AbstractModelGenerator

-name : string-structure : string[]-behaviour : string[]-style : string[]-content : string[]

ComponentModel

-models : ComponentModel[]ComponentModelContainer

0..*0..*

< < u s e > >

< < u s e > >

< < u s e > >

< < u s e > >

< < u s e > >

< < u s e > >

< < u s e > >

< < u s e > >

© sebis161205 Andreas Tielitz 34

Page 35: Automatically extracting view models from component-based

Columbus – Overview

l oop

[repositoryTree.hasNext()]

AbstractModelGeneratorAstParser SharedModelExtractorChainJsxParserGithubEndpoint

Actor

AppCtrl

1.13: model1.12: dependencyGraphModel

1.11: createDependencyGraphModel (informationBase)

1.10: componentModel

1.9: generate (informationBase)

1.8: informationBase

1.6: ast

1.5: parse (transformedSourceCode)

1.7: apply (ast)

1.4: transformedSourceCode

1.2: repositoryTree

1.3: transform (fileContents)

1.1: getTreeRecursively (repo)1: parse (repo)

© sebis161205 Andreas Tielitz 35

Page 36: Automatically extracting view models from component-based

Columbus – GitHub

l oop

[repositoryTree.hasNext()]

GithubRepositoryContainer

GitHub APIAppCtrl GithubEndpoint

Actor

1.1.10: githubRepositoryContainer

1.1.9: filter(regex)

1.1.8: setContents(file, contents)

1.1.5: file

1.1.4: next()

1.1.3: constructor(repositoryTree)

1.1.7: contents

1.1.6: GET contents(file)

1.1.2: repositoryTree

1.1.1: GET owner, repo, sha1.1: getTreeRecursively(owner, repo, sha, regex)

1: fetch(owner, repo, sha, regex)

© sebis161205 Andreas Tielitz 36

Page 37: Automatically extracting view models from component-based

Columbus – Information Extraction

l oop

[component in ast.getComponents()]

ReactComponentProptypesExtractor

ReactComponentNameExtractor

SharedModelExtractorChain

2.1: extractedInformation

2: extract(component)

1.1: extractedInformation

1: extract(input)

© sebis161205 Andreas Tielitz 37

Page 38: Automatically extracting view models from component-based

Columbus – Model Generation

l oop

loop

[information in informationBase]

[component in informationBase.ComponentDependencyExtractor]

ComponentModelContainer

AbstractModelGenerator

6.1: containerObject

6: toObject()

5.1: componentModel

5: updateComponentModel(componentModel)

4.1: componentModel

4: getComponentModel(information.component)

3: addDefaultLifeCycleBehaviourRules(componetModel)

2.1: componentModel

2: addComponentModel(componentModel)

1: createModelContainer()

© sebis161205 Andreas Tielitz 38