README.md 16.3 KB
Newer Older
P
Phodal Huang 已提交
1
# Coca - toolbox for system refactoring and analaysis
P
Phodal HUANG 已提交
2

P
Phodal Huang 已提交
3
[![Build Status](https://travis-ci.org/phodal/coca.svg?branch=master)](https://travis-ci.org/phodal/coca)
P
Phodal Huang 已提交
4 5
[![Maintainability](https://api.codeclimate.com/v1/badges/d5a5e060522403b1f79b/maintainability)](https://codeclimate.com/github/phodal/coca/maintainability)
[![codecov](https://codecov.io/gh/phodal/coca/branch/master/graph/badge.svg)](https://codecov.io/gh/phodal/coca)
P
Phodal Huang 已提交
6

P
Phodal Huang 已提交
7
> Coca is a toolbox which is design for legacy system refactoring. Coca 是一个用于系统重构、系统迁移和系统分析的瑞士军刀。它可以分析代码中的 badsmell,行数统计,分析调用与依赖,进行 Git 分析,以及自动化重构等。
P
Phodal Huang 已提交
8

P
Phodal Huang 已提交
9
Refactoring Modeling:
P
Phodal Huang 已提交
10

P
Phodal Huang 已提交
11
![Refactoring Modeling](docs/images/model.svg)
P
Phodal Huang 已提交
12

P
Phodal Huang 已提交
13 14
Todo:

P
Phodal Huang 已提交
15
 - [x] Show all todos and history
P
Phodal Huang 已提交
16 17 18
 - [ ] Suggest API for Design Patterns
   - [x] factory pattern
   - [ ] strategy 
P
Phodal Huang 已提交
19

P
Phodal Huang 已提交
20 21 22 23
## Usage

install 

P
Phodal Huang 已提交
24
```bash
P
Phodal Huang 已提交
25
go get -u github.com/phodal/coca
P
Phodal Huang 已提交
26 27
```

P
Phodal Huang 已提交
28 29
help:

P
Phodal Huang 已提交
30
```bash
P
Phodal Huang 已提交
31 32 33
Usage:
  coca [command]

P
Phodal Huang 已提交
34

P
Phodal Huang 已提交
35 36 37
Available Commands:
  analysis    analysis package
  api         scan api
P
Phodal Huang 已提交
38
  bs          bad smell analysis
P
Phodal Huang 已提交
39
  call        call graph api
P
Phodal Huang 已提交
40
  cloc        cloc [FILE or DIRECTORY]
P
Phodal Huang 已提交
41
  concept     concept api
P
Phodal Huang 已提交
42
  count       count code
P
Phodal Huang 已提交
43
  evaluate    evaluate refactor effort
P
Phodal Huang 已提交
44
  git         git analysis
P
Phodal Huang 已提交
45
  help        Help about any command
P
Phodal Huang 已提交
46
  rcall       reverse call
P
Phodal Huang 已提交
47
  refactor    auto refactor code
P
Phodal Huang 已提交
48 49 50 51
  suggest     simple holmes
  todo        scan todo
  version     print the version number of Coca

P
Phodal Huang 已提交
52

P
Phodal Huang 已提交
53 54
```

P
Phodal Huang 已提交
55
### Analysis
P
Phodal Huang 已提交
56 57

```
P
Phodal Huang 已提交
58
coca analysis
P
Phodal Huang 已提交
59 60
```

P
Phodal Huang 已提交
61 62
### Find Bad Smells

P
Phodal Huang 已提交
63
```bash
P
Phodal Huang 已提交
64
coca bs -s type
P
Phodal Huang 已提交
65 66
```

P
Phodal Huang 已提交
67 68
Examples Result:

P
Phodal Huang 已提交
69
```json
P
Phodal Huang 已提交
70
{
P
Phodal Huang 已提交
71 72 73 74 75 76 77 78 79 80 81 82 83 84
   "dataClass": [
      {
         "File": "examples/api/BookController.java",
         "BS": "dataClass"
      }
      ...
   ],
   "lazyElement": [
      {
         "File": "examples/api/model/BookRepresentaion.java",
         "BS": "lazyElement"
      }
      ...
   ]
P
Phodal Huang 已提交
85 86 87
}
```

P
Phodal Huang 已提交
88 89 90
### Code Line Count

```
P
Phodal Huang 已提交
91
coca cloc
P
Phodal Huang 已提交
92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116
```

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
P
Phodal Huang 已提交
117
───────────────────────────────────────────────────────────────────────────────
P
Phodal Huang 已提交
118 119
```

P
Phodal Huang 已提交
120 121 122 123 124 125
Results to json

```
coca cloc --by-file --format json
```

P
Phodal Huang 已提交
126 127 128
### Build Deps Tree

```
P
Phodal Huang 已提交
129
coca call -c com.phodal.pholedge.book.BookController.createBook -r com.phodal.pholedge.
P
Phodal Huang 已提交
130 131
```

P
Phodal Huang 已提交
132 133
Examples Results:

P
Phodal Huang 已提交
134 135 136 137 138
![Call Demo](docs/sample/call_demo.svg)

### Identify Spring API

```
P
Phodal Huang 已提交
139
coca api -f
P
Phodal Huang 已提交
140 141
```

P
Phodal Huang 已提交
142 143
![API Demo](docs/sample/api.svg)

P
Phodal Huang 已提交
144 145 146
With Count

```
P
Phodal Huang 已提交
147
coca api -r com.phodal.pholedge. -c 
P
Phodal Huang 已提交
148 149
``` 

P
Phodal Huang 已提交
150 151
or multi package:

P
Phodal Huang 已提交
152
`coca api  -r com.macro.mall.demo.controller.,com.zheng.cms.admin.,com.phodal.pholedge -c` 
P
Phodal Huang 已提交
153

P
Phodal Huang 已提交
154
```bash
P
Phodal Huang 已提交
155 156 157 158 159 160 161 162 163 164 165 166 167
+------+--------+------------------------------------------------+------------------------------------------------------------------------+
| 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                           |
+------+--------+------------------------------------------------+------------------------------------------------------------------------+
P
Phodal Huang 已提交
168 169
```

P
Phodal Huang 已提交
170 171 172
### Git Analysis

```
P
Phodal Huang 已提交
173
coca git -t
P
Phodal Huang 已提交
174 175
```

P
Phodal Huang 已提交
176 177 178
Results: 

```bash
P
Phodal Huang 已提交
179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202
+---------------------------------------------------------------------------------------------------------------------+-----------+-------------+
|                                                     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 |
+---------------------------------------------------------------------------------------------------------------------+-----------+-------------+
P
Phodal Huang 已提交
203 204
```

P
Phodal Huang 已提交
205 206 207
### Concept Analyser

```
P
Phodal Huang 已提交
208
coca concept
P
Phodal Huang 已提交
209 210 211 212 213
```

Results Examples:

```
P
Phodal Huang 已提交
214 215 216 217 218 219 220 221 222 223 224 225 226 227 228
+------------------+--------+
|      WORDS       | COUNTS |
+------------------+--------+
| context          |    590 |
| resolve          |    531 |
| path             |    501 |
| content          |    423 |
| code             |    416 |
| resource         |    373 |
| property         |    372 |
| session          |    364 |
| attribute        |    349 |
| properties       |    343 |
| headers          |    330 |
+------------------+--------+
P
Phodal Huang 已提交
229 230
```

P
Phodal Huang 已提交
231 232 233
### Count Refs

```
P
Phodal Huang 已提交
234
coca count
P
Phodal Huang 已提交
235 236 237 238 239
```

Results:

```
P
Phodal Huang 已提交
240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262
+------------+--------------------------------------------------------------------------+
| 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                               |
+------------+--------------------------------------------------------------------------+
P
Phodal Huang 已提交
263 264
```

P
Phodal Huang 已提交
265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284
### 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](docs/sample/rcall.svg)

P
Phodal Huang 已提交
285
### Auto Refactor
P
Phodal Huang 已提交
286 287 288 289 290 291 292

support: 

 - rename
 - move
 - remove unused import
 - remove unused class
P
Phodal Huang 已提交
293 294

```
P
Phodal Huang 已提交
295
coca refactor -R rename.coca -p src/main
P
Phodal Huang 已提交
296 297 298
coca refactor -m move.config -p .
```

P
Phodal Huang 已提交
299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317
### Evaluate

```
coca evaluate
```

```
custom [customKeyGenerator customCacheManager]
throw [throwUnchecked throwCheckedSync throwUncheckedSync throwChecked]
evict [evictWithException evictAllEarly evictAll evict evictEarly]
multi [multiCacheAndEvict multiCache multiUpdate multiEvict multiConditionalCacheAndEvict]
conditional [conditional conditionalUpdate conditionalSync]
unknown [unknownCustomCacheManager unknownCustomKeyGenerator]
throw [throwException throwCheckedException]
put [putWithException put]
early [earlyRemoveWithException earlyRemoveAllWithException earlyRemoveAll earlyPut earlyPutWithException earlyRemove]
evict [evictAll evictWithException evict evictEarly evictAllEarly]
```

P
Phodal Huang 已提交
318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341
### Todo

```
coca todo
```

results:

```
+------------+--------------+--------------------------------+---------------------------------------------------+-------+
|    DATE    |    AUTHOR    |            MESSAGES            |                     FILENAME                      | LINE  |
+------------+--------------+--------------------------------+---------------------------------------------------+-------+
| 2019-12-19 | Phodal Huang | 支持 interface 在同一个包内    | core/adapter/api/JavaApiListener.go               |   200 |
| 2019-12-21 | Phodal Huang | 处理链试调用                   | core/adapter/bs/BadSmellListener.go               |   305 |
| 2019-12-18 | Phodal Huang | update this reflect            | core/adapter/bs/BadSmellListener.go               |   363 |
| 2019-12-15 | Phodal Huang | update for array               | core/adapter/bs/BadSmellListener.go               |   388 |
| 2019-12-24 | Phodal Huang | 支持依赖注入                   | core/adapter/call/JavaCallListener.go             |   108 |
| 2019-12-24 | Phodal Huang | add inner creator examples     | core/adapter/call/JavaCallListener.go             |   209 |
| 2019-12-24 | Phodal Huang | add inner creator examples     | core/adapter/call/JavaCallListener.go             |   215 |
| 2019-12-24 | Phodal Huang |                                | core/adapter/call/JavaCallListener.go             |   270 |
| 2019-12-20 | Phodal Huang | 处理链试调用                   | core/adapter/call/JavaCallListener.go             |   324 |
+------------+--------------+--------------------------------+---------------------------------------------------+-------+
```

P
Phodal Huang 已提交
342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357
### Suggest

```
coca suggest
```

results:

```
+--------+---------+---------------------+
| CLASS  | PATTERN |       REASON        |
+--------+---------+---------------------+
| Insect | factory | to many constructor |
| Bee    | factory | to many constructor |
+--------+---------+---------------------+
```
P
Phodal Huang 已提交
358

P
Phodal HUANG 已提交
359 360
## Dev

P
Phodal Huang 已提交
361
Install Go
P
Phodal HUANG 已提交
362 363 364 365 366

```bash
brew install go
```

P
Phodal Huang 已提交
367
Env
P
Phodal HUANG 已提交
368 369 370 371 372 373 374

```bash
export GOROOT=/usr/local/opt/go/libexec
export GOPATH=$HOME/.go
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
```

P
Phodal Huang 已提交
375
clone
P
Phodal HUANG 已提交
376 377

```
P
Phodal Huang 已提交
378
git clone https://github.com/phodal/coca
P
Phodal HUANG 已提交
379 380
```

P
Phodal Huang 已提交
381
Test Frameworks
P
Phodal HUANG 已提交
382 383 384 385

```
go get github.com/onsi/ginkgo
go get github.com/onsi/gomega
P
Phodal HUANG 已提交
386 387
```

P
Phodal Huang 已提交
388 389 390 391 392
License
---

[![Phodal's Idea](http://brand.phodal.com/shields/idea-small.svg)](http://ideas.phodal.com/)

P
Phodal Huang 已提交
393
@ 2019 A [Phodal Huang](https://www.phodal.com)'s [Idea](http://github.com/phodal/ideas).  This code is distributed under the MPL license. See `LICENSE` in this directory.