File tree Expand file tree Collapse file tree 7 files changed +175
-0
lines changed Expand file tree Collapse file tree 7 files changed +175
-0
lines changed Original file line number Diff line number Diff line change @@ -33,6 +33,8 @@ version '1.0'
33
33
dependencies {
34
34
implementation " com.google.protobuf:protobuf-java:$protobufVersion "
35
35
36
+ implementation(' org.glassfish.jersey.containers:jersey-container-servlet:3.1.0' )
37
+
36
38
// jOOQ & Postgres impl deps
37
39
implementation " org.jooq:jooq:$jooqVersion "
38
40
implementation " org.jooq:jooq-meta:$jooqVersion "
@@ -42,6 +44,9 @@ dependencies {
42
44
43
45
implementation " com.google.inject:guice:$guiceVersion "
44
46
47
+ compileOnly ' org.projectlombok:lombok:1.18.24'
48
+ annotationProcessor ' org.projectlombok:lombok:1.18.24'
49
+
45
50
testImplementation " org.junit.jupiter:junit-jupiter-api:$junitVersion "
46
51
testRuntimeOnly " org.junit.jupiter:junit-jupiter-engine:$junitVersion "
47
52
testImplementation " org.hamcrest:hamcrest-library:2.2"
Original file line number Diff line number Diff line change
1
+ package org .vss ;
2
+
3
+ import jakarta .ws .rs .ApplicationPath ;
4
+ import org .glassfish .jersey .server .ResourceConfig ;
5
+
6
+ @ ApplicationPath ("/" )
7
+ public class VSSApplication extends ResourceConfig {
8
+ public VSSApplication () {
9
+ }
10
+ }
Original file line number Diff line number Diff line change
1
+ package org .vss .api ;
2
+
3
+ import com .google .protobuf .GeneratedMessageV3 ;
4
+ import com .google .protobuf .InvalidProtocolBufferException ;
5
+ import jakarta .inject .Inject ;
6
+ import jakarta .ws .rs .core .Response ;
7
+ import org .vss .ErrorCode ;
8
+ import org .vss .ErrorResponse ;
9
+ import org .vss .KVStore ;
10
+ import org .vss .exception .ConflictException ;
11
+
12
+ public abstract class AbstractVssApi {
13
+ final KVStore kvStore ;
14
+
15
+ @ Inject
16
+ public AbstractVssApi (KVStore kvStore ) {
17
+ this .kvStore = kvStore ;
18
+ }
19
+
20
+ Response toResponse (GeneratedMessageV3 protoResponse ) {
21
+
22
+ return Response
23
+ .status (Response .Status .OK )
24
+ .entity (protoResponse .toByteArray ())
25
+ .build ();
26
+ }
27
+
28
+ Response toErrorResponse (Exception e ) {
29
+ ErrorCode errorCode ;
30
+ if (e instanceof ConflictException ) {
31
+ errorCode = ErrorCode .CONFLICT_EXCEPTION ;
32
+ } else if (e instanceof IllegalArgumentException
33
+ || e instanceof InvalidProtocolBufferException ) {
34
+ errorCode = ErrorCode .INVALID_REQUEST_EXCEPTION ;
35
+ } else {
36
+ errorCode = ErrorCode .INTERNAL_SERVER_EXCEPTION ;
37
+ }
38
+
39
+ ErrorResponse errorResponse = ErrorResponse .newBuilder ()
40
+ .setErrorCode (errorCode )
41
+ .setMessage (e .getMessage ())
42
+ .build ();
43
+
44
+ return Response .status (errorCode .getNumber ())
45
+ .entity (errorResponse .toByteArray ())
46
+ .build ();
47
+ }
48
+ }
Original file line number Diff line number Diff line change
1
+ package org .vss .api ;
2
+
3
+ import jakarta .inject .Inject ;
4
+ import jakarta .ws .rs .POST ;
5
+ import jakarta .ws .rs .Path ;
6
+ import jakarta .ws .rs .Produces ;
7
+ import jakarta .ws .rs .core .MediaType ;
8
+ import jakarta .ws .rs .core .Response ;
9
+ import lombok .extern .slf4j .Slf4j ;
10
+ import org .vss .GetObjectRequest ;
11
+ import org .vss .GetObjectResponse ;
12
+ import org .vss .KVStore ;
13
+
14
+ @ Path (VssApiEndpoint .GET_OBJECT )
15
+ @ Slf4j
16
+ public class GetObjectApi extends AbstractVssApi {
17
+
18
+ @ Inject
19
+ public GetObjectApi (KVStore kvstore ) {
20
+ super (kvstore );
21
+ }
22
+
23
+ @ POST
24
+ @ Produces (MediaType .APPLICATION_OCTET_STREAM )
25
+ public Response execute (byte [] payload ) {
26
+ try {
27
+ GetObjectRequest request = GetObjectRequest .parseFrom (payload );
28
+ GetObjectResponse response = kvStore .get (request );
29
+ return toResponse (response );
30
+ } catch (Exception e ) {
31
+ log .error ("Exception in GetObjectApi: " , e );
32
+ return toErrorResponse (e );
33
+ }
34
+ }
35
+ }
Original file line number Diff line number Diff line change
1
+ package org .vss .api ;
2
+
3
+ import jakarta .inject .Inject ;
4
+ import jakarta .ws .rs .POST ;
5
+ import jakarta .ws .rs .Path ;
6
+ import jakarta .ws .rs .Produces ;
7
+ import jakarta .ws .rs .core .MediaType ;
8
+ import jakarta .ws .rs .core .Response ;
9
+ import lombok .extern .slf4j .Slf4j ;
10
+ import org .vss .KVStore ;
11
+ import org .vss .ListKeyVersionsRequest ;
12
+ import org .vss .ListKeyVersionsResponse ;
13
+
14
+ @ Path (VssApiEndpoint .LIST_KEY_VERSIONS )
15
+ @ Slf4j
16
+ public class ListKeyVersionsApi extends AbstractVssApi {
17
+
18
+ @ Inject
19
+ public ListKeyVersionsApi (KVStore kvStore ) {
20
+ super (kvStore );
21
+ }
22
+
23
+ @ POST
24
+ @ Produces (MediaType .APPLICATION_OCTET_STREAM )
25
+ public Response execute (byte [] payload ) {
26
+ try {
27
+ ListKeyVersionsRequest request = ListKeyVersionsRequest .parseFrom (payload );
28
+ ListKeyVersionsResponse response = kvStore .listKeyVersions (request );
29
+ return toResponse (response );
30
+ } catch (Exception e ) {
31
+ log .error ("Exception in ListKeyVersionsApi: " , e );
32
+ return toErrorResponse (e );
33
+ }
34
+ }
35
+ }
Original file line number Diff line number Diff line change
1
+ package org .vss .api ;
2
+
3
+ import jakarta .inject .Inject ;
4
+ import jakarta .ws .rs .POST ;
5
+ import jakarta .ws .rs .Path ;
6
+ import jakarta .ws .rs .Produces ;
7
+ import jakarta .ws .rs .core .MediaType ;
8
+ import jakarta .ws .rs .core .Response ;
9
+ import lombok .extern .slf4j .Slf4j ;
10
+ import org .vss .KVStore ;
11
+ import org .vss .PutObjectRequest ;
12
+ import org .vss .PutObjectResponse ;
13
+
14
+ @ Path (VssApiEndpoint .PUT_OBJECTS )
15
+ @ Slf4j
16
+ public class PutObjectsApi extends AbstractVssApi {
17
+
18
+ @ Inject
19
+ public PutObjectsApi (KVStore kvStore ) {
20
+ super (kvStore );
21
+ }
22
+
23
+ @ POST
24
+ @ Produces (MediaType .APPLICATION_OCTET_STREAM )
25
+ public Response execute (byte [] payload ) {
26
+ try {
27
+ PutObjectRequest putObjectRequest = PutObjectRequest .parseFrom (payload );
28
+ PutObjectResponse response = kvStore .put (putObjectRequest );
29
+ return toResponse (response );
30
+ } catch (Exception e ) {
31
+ log .error ("Exception in PutObjectsApi: " , e );
32
+ return toErrorResponse (e );
33
+ }
34
+ }
35
+ }
Original file line number Diff line number Diff line change
1
+ package org .vss .api ;
2
+
3
+ public class VssApiEndpoint {
4
+ public static final String GET_OBJECT = "/getObject" ;
5
+ public static final String PUT_OBJECTS = "/putObjects" ;
6
+ public static final String LIST_KEY_VERSIONS = "/listKeyVersions" ;
7
+ }
You can’t perform that action at this time.
0 commit comments