未验证 提交 208060a8 编写于 作者: P Phodal Huang

api: make first version

上级 1f0d4ddc
......@@ -59,4 +59,6 @@ apis.json
output.dot
call.dot
call.svg
output
\ No newline at end of file
output
api.dot
api.svg
\ No newline at end of file
......@@ -2,9 +2,13 @@ package cmd
import (
. "coca/src/adapter/api"
"coca/src/adapter/models"
. "coca/src/utils"
"encoding/json"
"github.com/spf13/cobra"
"coca/src/domain"
"log"
"os/exec"
)
var apiCmd *cobra.Command = &cobra.Command{
......@@ -21,6 +25,30 @@ var apiCmd *cobra.Command = &cobra.Command{
cModel, _ := json.MarshalIndent(restApis, "", "\t")
WriteToFile("apis.json", string(cModel))
var parsedDeps []models.JClassNode
file := ReadFile(dependence)
if file == nil {
log.Fatal("lost file:" + dependence)
}
_ = json.Unmarshal(file, &parsedDeps)
var apiCallers []string
for _, api := range restApis {
apiCaller := api.PackageName + "." + api.ClassName + "." + api.MethodName
apiCallers = append(apiCallers, apiCaller)
}
analyser := domain.NewCallGraph()
dotContent := analyser.AnalysisByFiles(apiCallers, parsedDeps)
WriteToFile("api.dot", dotContent)
cmd := exec.Command("dot", []string{"-Tsvg", "api.dot", "-o", "api.svg"}...)
_, err := cmd.CombinedOutput()
if err != nil {
log.Fatalf("cmd.Run() failed with %s\n", err)
}
}
},
}
......
......@@ -43,8 +43,7 @@ func (j *JavaApiApp) AnalysisPath(codeDir string, depPath string) []RestApi {
antlr.NewParseTreeWalker().Walk(listener, context)
apis := listener.getClassApis()
allApis = append(allApis, apis...)
allApis = listener.getClassApis()
}
return allApis
......
......@@ -30,7 +30,6 @@ var localVars = make(map[string]string)
var currentRestApi RestApi
var RestApis []RestApi
var pathVars = make(map[string]string)
var currentClz string
var currentPkg string
......@@ -205,3 +204,7 @@ func (s *JavaApiListener) appendClasses(classes []models2.JClassNode) {
func (s *JavaApiListener) getClassApis() []RestApi {
return RestApis
}
func (s *JavaApiListener) getCurrentApi() RestApi {
return currentRestApi
}
......@@ -2,6 +2,7 @@ package domain
import (
"coca/src/adapter/models"
"fmt"
)
type CallGraph struct {
......@@ -14,7 +15,6 @@ func NewCallGraph() CallGraph {
func (c CallGraph) Analysis(funcName string, clzs []models.JClassNode) string {
methodMap := c.BuildMethodMap(clzs)
BuildCallChain(funcName, methodMap)
chain := BuildCallChain(funcName, methodMap)
dotContent := toGraphviz(chain)
return dotContent
......@@ -43,6 +43,18 @@ func BuildCallChain(funcName string, methodMap map[string][]string) string {
return "\n"
}
func (c CallGraph) AnalysisByFiles(callers []string, deps []models.JClassNode) string {
methodMap := c.BuildMethodMap(deps)
results := "digraph G { \n"
for _, caller := range callers {
fmt.Println(caller)
chain := BuildCallChain(caller, methodMap)
results = results + "\n" + chain
}
return results + "}\n"
}
func (c CallGraph) BuildMethodMap(clzs []models.JClassNode) map[string][]string {
var methodMap = make(map[string][]string)
for _, clz := range clzs {
......@@ -60,3 +72,4 @@ func (c CallGraph) BuildMethodMap(clzs []models.JClassNode) map[string][]string
return methodMap
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册