Skip to content
/ coca Public

Coca is a toolbox which is design for legacy system refactoring and analysis, includes call graph, concept analysis, api tree, design patterns suggest. Coca là một cái dùng cho hệ thống trọng cấu, hệ thống di chuyển cùng hệ thống phân tích thùng dụng cụ. Nó có thể phân tích số hiệu trung thí nghiệm hư hương vị, mô khối hoá phân tích, hành số thống kê, phân tích thuyên chuyển cùng ỷ lại, Git phân tích cùng với tự động hoá trọng cấu chờ.

License

Notifications You must be signed in to change notification settings

phodal/coca

Repository files navigation

Coca - toolbox for system refactoring and analysis

GitHub release (latest SemVer) Maintainability codecov GitHub go.mod Go version Build

Cocais a toolbox which is design for legacy system refactoring and analysis, includes call graph, concept analysis, api tree, design patterns suggest. CocaLà một cái dùng cho hệ thống trọng cấu, hệ thống di chuyển cùng hệ thống phân tích thùng dụng cụ. Nó có thể phân tích số hiệu trung thí nghiệm hư hương vị, mô khối hoá phân tích, hành số thống kê, phân tích thuyên chuyển cùng ỷ lại, Git phân tích cùng với tự động hoá trọng cấu chờ.

Related Tools:Cocois an effective DevOps analysis and auto-suggest tool.

Kotlin version:Chapi

Migration Guide (Chinese Version): 《Hệ thống trọng cấu cùng di chuyển chỉ nam

Inspired by:newlee&Tequila

Refactoring Modeling:

Refactoring Modeling

  • Languages Support: Java (full features)

Features List:

Available Commands:
analysis analysis code
api scan HTTP api from annotation
arch project package visualization
bs generate bad smell list and suggestions
call show call graph with specific method
cloc count lines of code with complexity estimation
concept build domain concept from source code
count count most refs function
evaluate evaluate code situation and refactor effort
git analysis git commit history for revs count, summary and suggest
help Help about any command
rcall reverse call graph visualization
refactor auto refactor code
suggest find usable Design Patterns from code
tbs generate tests bad smell
todo scan all todo, and list with time
version version

Getting started

Requirements:graphvizfor dot file to image (such as svg, png)

The easiest way to get coca is to use one of the pre-built release binaries which are available for OSX, Linux, Windows on therelease page.

You can also install yourself:

go install github /modernizing/coca@latest

Usage

Analysis

coca analysis

Arch

coca arch

Android Studio Gradle DSL Module (merge header)

command:coca arch -x "com.android.tools.idea.gradle.dsl" -H true

Gradle Demo

Android Studio Gradle DSL Module Elements Part:

command:coca arch -x "com.android.tools.idea.gradle.dsl.parser.elements"

Gradle Demo

Find Bad Smells

coca bs -stype

Examples Result:

{
"dataClass":[
{
"File":"examples/api/BookController.java",
"BS":"dataClass"
}
],
"lazyElement":[
{
"File":"examples/api/model/BookRepresentaion.java",
"BS":"lazyElement"
}
]
}

Code Line Count

coca cloc

Results:

───────────────────────────────────────────────────────────────────────────────
Language Files Lines Blanks Comments Code Complexity
───────────────────────────────────────────────────────────────────────────────
Go 58 31763 7132 890 23741 2847
Java 44 971 208 21 742 62
Markdown 8 238 75 0 163 0
Gherkin Specificati… 2 32 2 16 14 0
Document Type Defin… 1 293 36 0 257 0
License 1 201 32 0 169 0
SQL 1 2 0 0 2 0
SVG 1 199 0 34 165 0
Shell 1 3 1 1 1 0
XML 1 13 0 0 13 0
gitignore 1 61 8 4 49 0
───────────────────────────────────────────────────────────────────────────────
Total 119 33776 7494 966 25316 2909
───────────────────────────────────────────────────────────────────────────────
Estimated Cost to Develop $803,822
Estimated Schedule Effort 14.120551 months
Estimated People Required 6.743156
───────────────────────────────────────────────────────────────────────────────

Results to json

coca cloc --by-file --format json

Cloc by directory

coca cloc~/intellij-community/android/ --by-directory --include-ext=java,kt --not-match=".*(Test|Tests)\.(kt|java)"

results csv:

module,summary
adt-branding,169
adt-testutils,257
adt-ui,21987
adt-ui-model,3450
android,361270
android-adb,497
android-common,3280
android-debuggers,3030
android-kotlin,8816
android-lang,24796
android-lang-databinding,6392
android-layout-inspector,2533
...

Cloc Top File

coca cloc~/intellij-community/android/designer/src/com/android/tools/idea --top-file --top-size 10

output to:coca_reporter/sort_cloc.jsonand also:

|LENGTH|COMPLEXITY|LOCATION|
|--------|------------|-----------------------------------|
|1642|236|ConstraintLayoutHandler.java|
|1492|375|ConstraintComponentUtilities.java|
|1189|166|CommonActions.java|
|1184|325|ConstraintWidget.java|
|1169|129|SingleWidgetView.java|
|1115|213|ScoutArrange.java|
|1097|281|ScoutWidget.java|
|1081|224|3d/Rasterize.java|
|1016|159|LayoutlibSceneManager.java|
|1014|220|TimeLinePanel.java|

Build Deps Tree

coca call -c com.phodal.pholedge.book.BookController.createBook -r com.phodal.pholedge.

Examples Results:

Call Demo

Identify Spring API

coca api -f

API Demo

With Count

coca api -r com.phodal.pholedge. -c

or multi package:

coca api -r com.macro.mall.demo.controller.,com.zheng.cms.admin.,com.phodal.pholedge -c

+------+--------+------------------------------------------------+------------------------------------------------------------------------+
|SIZE|METHOD|URI|CALLER|
+------+--------+------------------------------------------------+------------------------------------------------------------------------+
|36|GET|/aliyun/oss/policy|controller.OssController.policy|
|21|POST|/aliyun/osscallback|controller.OssController.callback|
|17|GET|/subject/list|controller.CmsSubjectController.getList|
|17|GET|/esProduct/search|search.controller.EsProductController.search|
|17|GET|/order/list|controller.OmsOrderController.list|
|17|GET|/productAttribute/list/{cid}|controller.PmsProductAttributeController.getList|
|17|GET|/productCategory/list/{parentId}|controller.PmsProductCategoryController.getList|
|17|GET|/brand/list|controller.PmsBrandController.getList|
|17|GET|/esProduct/search/simple|search.controller.EsProductController.search|
+------+--------+------------------------------------------------+------------------------------------------------------------------------+

Git Analysis

coca git -t

Results:

+---------------------------------------------------------------------------------------------------------------------+-----------+-------------+
|ENTITYNAME|REVSCOUNT|AUTHORCOUNT|
+---------------------------------------------------------------------------------------------------------------------+-----------+-------------+
|build.gradle|1326|36|
|src/asciidoc/index.adoc|239|20|
|build-spring-framework/resources/changelog.txt|187|10|
|spring-core/src/main/java/org/springframework/core/annotation/AnnotationUtils.java|170|10|
|spring-beans/src/main/java/org/springframework/beans/factory/support/DefaultListableBeanFactory.java|159|15|
|src/docs/asciidoc/web/webmvc.adoc|121|24|
|spring-context/src/main/java/org/springframework/context/annotation/ConfigurationClassParser.java|118|9|
|src/dist/changelog.txt|118|9|
|spring-webmvc/src/main/java/org/springframework/web/servlet/config/annotation/WebMvcConfigurationSupport.java|116|15|
|spring-beans/src/main/java/org/springframework/beans/factory/support/AbstractAutowireCapableBeanFactory.java|113|15|
|spring-web/src/main/java/org/springframework/http/HttpHeaders.java|111|18|
|src/docs/asciidoc/web/webflux.adoc|108|21|
|spring-core/src/main/java/org/springframework/core/annotation/AnnotatedElementUtils.java|107|9|
|spring-test/spring-test.gradle|105|7|
|spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/RequestMappingHandlerAdapter.java|105|13|
|spring-messaging/src/main/java/org/springframework/messaging/simp/stomp/StompBrokerRelayMessageHandler.java|101|12|
|spring-web/src/main/java/org/springframework/web/client/RestTemplate.java|98|17|
|spring-webmvc/src/main/java/org/springframework/web/servlet/resource/ResourceHttpRequestHandler.java|96|14|
|org.springframework.core/src/main/java/org/springframework/core/convert/TypeDescriptor.java|93|4|
|spring-core/src/main/java/org/springframework/core/ResolvableType.java|92|10|
+---------------------------------------------------------------------------------------------------------------------+-----------+-------------+

Concept Analyser

coca concept

Results Examples:

+------------------+--------+
| WORDS | COUNTS |
+------------------+--------+
| context | 590 |
| resolve | 531 |
| path | 501 |
| content | 423 |
| code | 416 |
| resource | 373 |
| property | 372 |
| session | 364 |
| attribute | 349 |
| properties | 343 |
| headers | 330 |
+------------------+--------+

Count Refs

coca count

Results:

+------------+--------------------------------------------------------------------------+
| REFS COUNT | METHOD |
+------------+--------------------------------------------------------------------------+
| 2 | com.phodal.pholedge.book.BookRepository.byId |
| 2 | com.phodal.pholedge.book.model.Book.toRepresentation |
| 2 | com.phodal.pholedge.book.BookRepository.save |
| 2 | com.phodal.coca.analysis.JavaCallApp.parse |
| 2 | com.phodal.pholedge.book.BookRepository.save |
| 2 | com.phodal.coca.analysis.JavaCallApp.parse |
| 1 | com.phodal.pholedge.book.model.Book.save |
| 1 | evolution.analysis.jv.calls.JavaCallVisitor.parseNewType |
| 1 | evolution.analysis.jv.calls.JavaCallVisitor.isNotSpecialNewWord |
| 1 | com.phodal.pholedge.book.BookMapper.byId |
| 1 | com.phodal.pholedge.book.BookService.updateBook |
| 1 | com.phodal.pholedge.book.BookService.getBooksLists |
| 1 | com.phodal.pholedge.book.BookService.getBookById |
| 1 | com.phodal.pholedge.book.BookMapper.doSave |
| 1 | com.phodal.pholedge.book.BookMapper.list |
| 1 | com.phodal.pholedge.book.BookService.createBook |
| 1 | com.phodal.pholedge.book.BookFactory.create |
| 1 | com.phodal.pholedge.book.BookRepository.list |
| 1 | com.phodal.pholedge.book.model.Book.create |
+------------+--------------------------------------------------------------------------+

Reverse Call Graph

coca rcall -c org.bytedeco.javacpp.tools.TokenIndexer.get

Results:

digraph G {
edge [dir= "back" ];

"org.bytedeco.javacpp.tools.Parser.extern" -> "org.bytedeco.javacpp.tools.Parser.declarations";
"org.bytedeco.javacpp.tools.Parser.declarations" -> "org.bytedeco.javacpp.tools.Parser.extern";
...
}

RCall Demo

Auto Refactor

support:

  • rename
  • move
  • remove unused import
  • remove unused class
coca refactor -R rename.coca -p src/main
coca refactor -m move.config -p.

Evaluate

coca evaluate

Arduino Results(Old Version):

+--------------------------------+-------+-----------------------+-------+-----------+
| TYPE | COUNT | LEVEL | TOTAL | RATE |
+--------------------------------+-------+-----------------------+-------+-----------+
| Nullable / Return Null | 0 | Method | 1615 | 0.00% |
| Utils | 7 | Class | 252 | 2.78% |
| Static Method | 0 | Method | 1615 | 0.43% |
| Average Method Num. | 1615 | Method/Class | 252 | 6.408730 |
| Method Num. Std Dev / tiêu chuẩn kém | 1615 | Class | - | 7.344917 |
| Average Method Length | 13654 | Without Getter/Setter | 1100 | 12.412727 |
| Method Length Std Dev / tiêu chuẩn kém | 1615 | Method | - | 20.047092 |
+--------------------------------+-------+-----------------------+-------+-----------+

New Version:

| TYPE | TYPE COUNT | LEVEL | LEVEL TOTAL | VALUE = COUNT / TOTAL |
|--------------------------------|------------|-----------------------|-------------|-----------------------|
| Nullable / Return Null | 0 | Method | 6 | 0.00% |
| Utils | 0 | Class | 14 | 0.00% |
| Static Method | 1 | Method | 6 | 0.00% |
| Average Method Num. | 6 | Method/Class | 14 | 0.428571 |
| Method Num. Std Dev / tiêu chuẩn kém | 6 | Class | - | 0.646206 |
| Average Method Length | 0 | Without Getter/Setter | 0 | NaN |
| Method Length Std Dev / tiêu chuẩn kém | 0 | Method | - | NaN |

Evaluate.json examples

{
"Nullable":{
"Items":[
"nonnull.Name.testNull",
"nonnull.Name.orElseNull",
"org.ofbiz.base.util.UtilURL.fromResource",
"org.ofbiz.base.util.UtilURL.getOfbizHomeRelativeLocationFromFilePath",
"study.huhao.demo.adapters.outbound.persistence.blog.BlogPO.toDomainModel",
"study.huhao.demo.adapters.outbound.persistence.blog.BlogPO.toDomainModel",
"study.huhao.demo.adapters.outbound.persistence.blog.BlogPO.of",
"study.huhao.demo.infrastructure.persistence.blog.BlogPO.convertDomain"
]
},
"ServiceSummary":{
"LifecycleMap":null,
"ReturnTypeMap":{
"BookRepresentaion":[
"com.phodal.pholedge.book.BookService.getBookById",
"com.phodal.pholedge.book.BookService.updateBook"
]
},
"RelatedMethod":null
},
"UtilsSummary":{},
"Summary":{
"UtilsCount":1,
"ClassCount":64,
"MethodCount":161,
"StaticMethodCount":19
}
}

Todo

coca todo

results:

+------------+-----------------+--------------------------------+--------------------------------------------------------------------------------------+------+
| DATE | AUTHOR | MESSAGES | FILENAME | LINE |
+------------+-----------------+--------------------------------+--------------------------------------------------------------------------------------+------+
| 2019-12-09 | Cristian Maglie | happens on macosx, don't know | app/src/cc/arduino/contributions/libraries/ui/ContributedLibraryTableCellJPanel.java | 118 |
| | | why | | |
| 2019-12-09 | Cristian Maglie | Make this a method of Theme | app/src/cc/arduino/contributions/libraries/ui/ContributedLibraryTableCellJPanel.java | 233 |
| 2019-12-09 | Cristian Maglie | Do a better job in refreshing | app/src/cc/arduino/contributions/libraries/ui/LibraryManagerUI.java | 241 |
| | | only the needed element | | |
| 2019-12-09 | Cristian Maglie | Do a better job in refreshing | app/src/cc/arduino/contributions/libraries/ui/LibraryManagerUI.java | 273 |
| | | only the needed element | | |
| 2019-12-09 | Cristian Maglie | Make this a method of Theme | app/src/cc/arduino/contributions/libraries/ui/MultiLibraryInstallDialog.java | 149 |
| 2019-12-09 | Cristian Maglie | happens on macosx, don't know | app/src/cc/arduino/contributions/packages/ui/ContributedPlatformTableCellJPanel.java | 183 |
| | | why | | |
| 2019-12-09 | Cristian Maglie | show error | app/src/processing/app/Base.java | 1440 |
| 2019-12-09 | Cristian Maglie | error when importing. ignoring | app/src/processing/app/Base.java | 2423 |
| | |:( | | |
| 2019-12-09 | Cristian Maglie | Improve / move error handling | app/src/processing/app/Editor.java | 1541 |
| 2019-12-09 | Cristian Maglie | Should be a Theme value? | app/src/processing/app/EditorHeader.java | 78 |
| 2019-12-09 | Cristian Maglie | Should be a Theme value? | app/src/processing/app/EditorStatus.java | 73 |
| 2019-12-09 | Cristian Maglie | Improve decoupling | app/src/processing/app/EditorTab.java | 465 |
+------------+-----------------+--------------------------------+--------------------------------------------------------------------------------------+------+```

Suggest

coca suggest

results:

+--------+------------------+--------------------------------+
| CLASS | PATTERN | REASON |
+--------+------------------+--------------------------------+
| Insect | factory | too many constructor |
| Bee | factory, builder | complex constructor, too |
| | | many constructor, too many |
| | | parameters |
+--------+------------------+--------------------------------+

Test Bad Smells

coca tbs

results

+---------------------+---------------------------------------------------------------+------+
|TYPE|FILENAME|LINE|
+---------------------+---------------------------------------------------------------+------+
|DuplicateAssertTest|app/test/cc/arduino/i18n/ExternalProcessOutputParserTest.java|107|
|DuplicateAssertTest|app/test/cc/arduino/i18n/ExternalProcessOutputParserTest.java|41|
|DuplicateAssertTest|app/test/cc/arduino/i18n/ExternalProcessOutputParserTest.java|63|
|RedundantPrintTest|app/test/cc/arduino/i18n/I18NTest.java|71|
|RedundantPrintTest|app/test/cc/arduino/i18n/I18NTest.java|72|
|RedundantPrintTest|app/test/cc/arduino/i18n/I18NTest.java|77|
|DuplicateAssertTest|app/test/cc/arduino/net/PACSupportMethodsTest.java|19|
|DuplicateAssertTest|app/test/processing/app/macosx/SystemProfilerParserTest.java|51|
|DuplicateAssertTest|app/test/processing/app/syntax/PdeKeywordsTest.java|41|
|DuplicateAssertTest|app/test/processing/app/tools/ZipDeflaterTest.java|57|
|DuplicateAssertTest|app/test/processing/app/tools/ZipDeflaterTest.java|83|
|DuplicateAssertTest|app/test/processing/app/tools/ZipDeflaterTest.java|109|
+---------------------+---------------------------------------------------------------+------+

Find unused deps

coca deps -p _fixtures/deps/maven_sample

results:

+---------------------------+----------------------------------------+---------+
| GROUPID | ARTIFACTID | SCOPE |
+---------------------------+----------------------------------------+---------+
| org.flywaydb | flyway-core | |
| mysql | mysql-connector-java | runtime |
| org.springframework.cloud | spring-cloud-starter-contract-verifier | test |
+---------------------------+----------------------------------------+---------+

Showcases

Android Studio Analysis Examples. Call withlookup:coca call -l

Call Examples

Roadmap

  • bad smell support
    • sort method size
    • type
      • longParameterList
      • longMethod
      • repeatedSwitches
      • complexIf
      • largeClass
      • refusedBequest
      • dataClass
  • CLOC
  • HTTP API Visualization
    • Spring Support
    • @Service Support
    • API Call Size
  • Git
  • Concept
    • words NLP
    • to domain
  • Call & rcall graph
    • Count Refs
  • AutoRefactor
    • remove unused
    • move files
  • Evaluate
    • nullable count
    • static count
    • method num /length count
  • Todo Summary
    • Todo with History & Author
  • Suggest API for Design Patterns
    • factory pattern
    • strategy
    • builder
    • cycle-deps -> adapter / agency
    • bad patterns
      • singleton
  • Evaluate API
    • Average Method Length
    • Average Class Method Count
  • Tests
    • Testable?
    • Test badsmell -> list [https://testsmells.github.io/pages/testsmells.html]
      • IgnoreTest: @Ingore
      • EmptyTest: not call in test
      • RedundantPrintTest: system.out.println
      • SleepyTest: Time.sleep
      • RedundantAssertionTest: assertTrue(True)
      • UnknownTest: not assert
      • DuplicateAssertTest: assert > 5
      • TestersOnly: method only call by test
      • CrossBorderTest: test method which not in system
      • General Fixture: JUnit classes having at least one method not using the entire test fixture defined in the setUp() method
  • Arch
    • Architecture Visualization
    • Architecture Guard
      • DSL Design
  • Tech Debt from Source Code
    • auto create story
  • TBD
  • Online Code Analysis
    • WASM support
    • expose WASM API
    • GitHub search code
  • Pluggable
    • plugin support (Windows Issues)
  • Dependence Analysis
    • Deps Related Counts
    • 3rd-party analysis XML or Groovy Scripts
    • Groovy Support
      • migrate to Golang Styles
  • Story Cmd
    • Auto create refactor story
  • Clean Code Suggest
  • More CodeSmells

Documents Todo:

  • Docs
    • Lifecycle for new projects: evaluate (cloc, bad smell, api, git, todo) -> design -> patterns (suggest) -> refactoring ()
  • Date Collections
    • monolithic
    • microservice
    • big data

Tech Debt

  • Test for Windows
  • Duplicate Code
    • cmd/ -> user builder to refactoring

Dev

Install Go

brew install go

Env

exportGOROOT=/usr/local/opt/go/libexec
exportGOPATH=$HOME/.go
exportPATH=$PATH:$GOROOT/bin:$GOPATH/bin

clone

git clone https://github /modernizing/coca

Test Frameworks

go get github /onsi/ginkgo
go get github /onsi/g Omega

License

Arch based onTequila

Git Analysis inspired byCode Maat

Test bad smells inspired byTest Smell Examples

Phodal's Idea

@ 2019 APhodal Huang'sIdea.This code is distributed under the MPL license. SeeLICENSEin this directory.

About

Coca is a toolbox which is design for legacy system refactoring and analysis, includes call graph, concept analysis, api tree, design patterns suggest. Coca là một cái dùng cho hệ thống trọng cấu, hệ thống di chuyển cùng hệ thống phân tích thùng dụng cụ. Nó có thể phân tích số hiệu trung thí nghiệm hư hương vị, mô khối hoá phân tích, hành số thống kê, phân tích thuyên chuyển cùng ỷ lại, Git phân tích cùng với tự động hoá trọng cấu chờ.

Topics

Resources

License

Code of conduct

Stars

Watchers

Forks

Packages

No packages published