README.md 16.7 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
   - [ ] builder
20 21
 - [ ] Docs
   - [ ] Lifecycle for new projects: evaluate (cloc, bad smell, api, git, todo) -> design -> patterns (suggest) -> refactoring () 
P
Phodal Huang 已提交
22

P
Phodal Huang 已提交
23 24 25 26
## Usage

install 

P
Phodal Huang 已提交
27
```bash
P
Phodal Huang 已提交
28
go get -u github.com/phodal/coca
P
Phodal Huang 已提交
29 30
```

P
Phodal Huang 已提交
31 32
help:

P
Phodal Huang 已提交
33
```bash
P
Phodal Huang 已提交
34 35 36
Usage:
  coca [command]

P
Phodal Huang 已提交
37

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

P
Phodal Huang 已提交
55

P
Phodal Huang 已提交
56 57
```

P
Phodal Huang 已提交
58
### Analysis
P
Phodal Huang 已提交
59 60

```
P
Phodal Huang 已提交
61
coca analysis
P
Phodal Huang 已提交
62 63
```

P
Phodal Huang 已提交
64 65
### Find Bad Smells

P
Phodal Huang 已提交
66
```bash
P
Phodal Huang 已提交
67
coca bs -s type
P
Phodal Huang 已提交
68 69
```

P
Phodal Huang 已提交
70 71
Examples Result:

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

P
Phodal Huang 已提交
91 92 93
### Code Line Count

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

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 已提交
120
───────────────────────────────────────────────────────────────────────────────
P
Phodal Huang 已提交
121 122
```

P
Phodal Huang 已提交
123 124 125 126 127 128
Results to json

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

P
Phodal Huang 已提交
129 130 131
### Build Deps Tree

```
P
Phodal Huang 已提交
132
coca call -c com.phodal.pholedge.book.BookController.createBook -r com.phodal.pholedge.
P
Phodal Huang 已提交
133 134
```

P
Phodal Huang 已提交
135 136
Examples Results:

P
Phodal Huang 已提交
137 138 139 140 141
![Call Demo](docs/sample/call_demo.svg)

### Identify Spring API

```
P
Phodal Huang 已提交
142
coca api -f
P
Phodal Huang 已提交
143 144
```

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

P
Phodal Huang 已提交
147 148 149
With Count

```
P
Phodal Huang 已提交
150
coca api -r com.phodal.pholedge. -c 
P
Phodal Huang 已提交
151 152
``` 

P
Phodal Huang 已提交
153 154
or multi package:

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

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

P
Phodal Huang 已提交
173 174 175
### Git Analysis

```
P
Phodal Huang 已提交
176
coca git -t
P
Phodal Huang 已提交
177 178
```

P
Phodal Huang 已提交
179 180 181
Results: 

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

P
Phodal Huang 已提交
208 209 210
### Concept Analyser

```
P
Phodal Huang 已提交
211
coca concept
P
Phodal Huang 已提交
212 213 214 215 216
```

Results Examples:

```
P
Phodal Huang 已提交
217 218 219 220 221 222 223 224 225 226 227 228 229 230 231
+------------------+--------+
|      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 已提交
232 233
```

P
Phodal Huang 已提交
234 235 236
### Count Refs

```
P
Phodal Huang 已提交
237
coca count
P
Phodal Huang 已提交
238 239 240 241 242
```

Results:

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

P
Phodal Huang 已提交
268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287
### 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 已提交
288
### Auto Refactor
P
Phodal Huang 已提交
289 290 291 292 293 294 295

support: 

 - rename
 - move
 - remove unused import
 - remove unused class
P
Phodal Huang 已提交
296 297

```
P
Phodal Huang 已提交
298
coca refactor -R rename.coca -p src/main
P
Phodal Huang 已提交
299 300 301
coca refactor -m move.config -p .
```

P
Phodal Huang 已提交
302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320
### 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 已提交
321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344
### 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 已提交
345 346 347 348 349 350 351 352 353
### Suggest

```
coca suggest
```

results:

```
P
Phodal Huang 已提交
354 355 356 357 358 359 360 361
+--------+------------------+--------------------------------+
| CLASS  |     PATTERN      |             REASON             |
+--------+------------------+--------------------------------+
| Insect | factory          | too many constructor           |
| Bee    | factory, builder | complex constructor, too       |
|        |                  | many constructor, too many     |
|        |                  | parameters                     |
+--------+------------------+--------------------------------+
P
Phodal Huang 已提交
362
```
P
Phodal Huang 已提交
363

P
Phodal HUANG 已提交
364 365
## Dev

P
Phodal Huang 已提交
366
Install Go
P
Phodal HUANG 已提交
367 368 369 370 371

```bash
brew install go
```

P
Phodal Huang 已提交
372
Env
P
Phodal HUANG 已提交
373 374 375 376 377 378 379

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

P
Phodal Huang 已提交
380
clone
P
Phodal HUANG 已提交
381 382

```
P
Phodal Huang 已提交
383
git clone https://github.com/phodal/coca
P
Phodal HUANG 已提交
384 385
```

P
Phodal Huang 已提交
386
Test Frameworks
P
Phodal HUANG 已提交
387 388 389 390

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

P
Phodal Huang 已提交
393 394 395 396 397
License
---

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

P
Phodal Huang 已提交
398
@ 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.