grpc-wiremock

Форк
0
/
build.gradle 
130 строк · 5.5 Кб
1
plugins {
2
    id 'org.springframework.boot' version '2.6.2'
3
    id 'io.spring.dependency-management' version '1.0.11.RELEASE'
4
    id 'java'
5
    id 'com.google.protobuf' version '0.8.16'
6
}
7

8
group = 'io.adven.grpc.wiremock'
9
version = '0.0.1-SNAPSHOT'
10
sourceCompatibility = '17'
11

12
repositories {
13
    mavenCentral()
14
}
15

16
def grpcVersion = '1.44.1'
17
def wiremockVersion = '2.32.0'
18
def protobufVersion = '3.16.0'
19
def protocVersion = protobufVersion
20

21
dependencies {
22
    implementation 'org.springframework.boot:spring-boot-starter'
23
    implementation 'org.springframework.boot:spring-boot-starter-aop'
24
    implementation "io.grpc:grpc-all:$grpcVersion"
25
    implementation "com.github.tomakehurst:wiremock-jre8-standalone:$wiremockVersion"
26
    implementation 'org.xerial.snappy:snappy-java:1.1.8.4'
27
}
28

29
protobuf {
30
    protoc { artifact = "com.google.protobuf:protoc:${protocVersion}" }
31
    plugins { grpc { artifact = "io.grpc:protoc-gen-grpc-java:${grpcVersion}" } }
32
    generateProtoTasks { all()*.plugins { grpc { outputSubDir = 'java' } } }
33
    generatedFilesBaseDir = 'src'
34
}
35

36
clean {
37
    delete fileTree(dir: "src/main/java", exclude: "io/adven/grpc/wiremock")
38
    delete "src/main/java/io/adven/grpc/wiremock/Translator.java"
39
}
40

41
sourceSets.main.proto.srcDir '/proto'
42
/*
43
sourceSets {
44
    main {
45
        resources {
46
            srcDir 'example'
47
        }
48
        proto {
49
            srcDir 'example/proto'
50
        }
51
    }
52
}
53
*/
54

55
task generateJava(type: Copy) {
56
    def decorate_services = ""
57
    def import_services = ""
58
    def services = ""
59
    doFirst {
60
        def callDecoratorTemplate = """
61
        private final Map<String, Class> @fullServiceName@RespTypes = new HashMap<>(){{
62
            @resp_types@
63
        }}; 
64
        private final Map<String, String> @fullServiceName@MethodTypes = new HashMap<>(){{
65
            @method_types@
66
        }}; 
67
        @Around("execution(* @package@.@serviceName@Grpc.@serviceName@ImplBase.*(..))")
68
        public void redirect@fullServiceName@(ProceedingJoinPoint jp) throws Throwable { redirect(jp, "@serviceName@", @fullServiceName@RespTypes, @fullServiceName@MethodTypes); }
69
        """
70

71
        def importServiceTemplate = "import @package@.@serviceName@Grpc;\n"
72
        def serviceTemplate = "@Service class @fullServiceName@ extends @package@.@serviceName@Grpc.@serviceName@ImplBase {}\n"
73
        new FileNameFinder().getFileNames("$projectDir/src/main/java", '**/*Grpc.java').forEach {
74
            def file = new File(it)
75
            def relativePath = file.path.split("src/main/java/")[1]
76
            def pkg = relativePath.substring(0, relativePath.lastIndexOf("/")).replace("/", ".")
77
            def serviceName = relativePath.substring(relativePath.lastIndexOf("/") + 1).replace("Grpc.java", "")
78
            def fullServiceName = pkg.replaceAll( "([\\._])([A-Za-z0-9])", { Object[] s -> s[2].toUpperCase() } ).capitalize() + serviceName
79

80
            println "Found $relativePath: "
81
            println "Parsed package = [$pkg], serviceName = [$serviceName] and fullServiceName = [$fullServiceName]"
82

83
            def text = file.text
84

85
            // Even though the file name looked like a grpc service class, dont process it
86
            // if you dont find a reference to an abstract class.
87
            if (text.indexOf('public static abstract class') == -1) {
88
                println "Skipping processing $file.path because its not a Service class."
89
                return
90
            }
91

92
            def rpcMethodAnnotation = "@io.grpc.stub.annotations.RpcMethod("
93
            Map<String, String> respTypes = new HashMap<>()
94
            Map<String, String> methodTypes = new HashMap<>()
95
            while (text.indexOf(rpcMethodAnnotation) >= 0) {
96
                def rest = text.substring(text.indexOf(rpcMethodAnnotation) + rpcMethodAnnotation.length())
97
                def descriptor = rest.substring(0, rest.indexOf(")")).split(',').inject([:]) { map, token ->
98
                    token.split('=').with { map[it[0].trim()] = it[1].trim() }
99
                    map
100
                }
101
                def method = descriptor.fullMethodName.substring("SERVICE_NAME + '/' + \"".length(), descriptor.fullMethodName.length() - 1)
102
                respTypes[method] = descriptor.responseType
103
                methodTypes[method] = descriptor.methodType.tokenize('.').last()
104
                text = rest
105
            }
106
            decorate_services += callDecoratorTemplate
107
                    .replace("@package@", pkg)
108
                    .replace("@serviceName@", serviceName)
109
                    .replace("@fullServiceName@", fullServiceName)
110
                    .replace("@resp_types@", respTypes.collect { k, v -> "put(\"${k.toLowerCase()}\", $v);" }.join("\n"))
111
                    .replace("@method_types@", methodTypes.collect { k, v -> "put(\"${k.toLowerCase()}\", \"$v\");" }.join("\n"))
112

113
            import_services += importServiceTemplate.replace("@package@", pkg).replace("@serviceName@", serviceName)
114
            services += serviceTemplate
115
                    .replace("@package@", pkg)
116
                    .replace("@serviceName@", serviceName)
117
                    .replace("@fullServiceName@", fullServiceName)
118
        }
119
    }
120
    from "src/template/java"
121
    into "src/main/java/io/adven/grpc/wiremock"
122
    filter { it.replace("@import_services@", import_services).replace("@services@", services).replace("@decorate_services@", decorate_services) }
123
}
124

125
compileJava.dependsOn 'generateJava'
126
generateJava.dependsOn 'generateProto'
127

128
bootRun {
129
    systemProperty 'jdk.httpclient.allowRestrictedHeaders', 'connection,content-length,expect,host,upgrade'
130
}

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.