1 package org.maxur.perfmodel.backend.rest.resources;
2
3 import com.fasterxml.jackson.core.JsonFactory;
4 import com.fasterxml.jackson.core.type.TypeReference;
5 import com.fasterxml.jackson.databind.ObjectMapper;
6 import com.google.common.base.Charsets;
7 import com.google.common.io.Resources;
8 import org.jsondoc.core.annotation.*;
9 import org.jsondoc.core.pojo.ApiVerb;
10 import org.maxur.perfmodel.backend.service.Application;
11 import org.slf4j.Logger;
12 import org.slf4j.LoggerFactory;
13
14 import javax.inject.Inject;
15 import javax.inject.Named;
16 import javax.ws.rs.*;
17 import javax.ws.rs.core.MediaType;
18 import javax.ws.rs.core.Response;
19 import java.io.IOException;
20 import java.net.URL;
21 import java.util.HashMap;
22 import java.util.Map;
23
24 import static org.maxur.perfmodel.backend.rest.WebException.badRequestException;
25 import static org.maxur.perfmodel.backend.utils.DateTimeUtils.schedule;
26
27
28
29
30
31
32 @Path("/{a:application}")
33 @Api(name = "Application Resource", description = "Methods for managing PMC Application")
34 @ApiVersion(since = "1.0")
35 public class ApplicationResource {
36
37 private static final Logger LOGGER = LoggerFactory.getLogger(ApplicationResource.class);
38
39 @Inject
40 private Application application;
41
42 @SuppressWarnings("unused")
43 @Named("api.url")
44 private String apiUrl;
45
46 @SuppressWarnings("unused")
47 @Named("delay.before.stop")
48 private Integer delayBeforeStop;
49
50
51 @GET
52 @Path("/jsondoc")
53 @Produces(MediaType.APPLICATION_JSON)
54 @ApiMethod(
55 path = "/application/jsondoc",
56 verb = ApiVerb.GET,
57 description = "Gets a application documentation",
58 produces = { MediaType.APPLICATION_JSON },
59 responsestatuscode = "200 - OK"
60 )
61 @ApiErrors(apierrors={
62 @ApiError(code="500", description="Application critical error")
63 })
64 @ApiResponseObject
65 public String getJsonDoc() {
66 URL url = Resources.getResource("jsondoc.json");
67 try {
68 final String jsonDoc = Resources.toString(url, Charsets.UTF_8);
69 return jsonDoc.replaceAll("http://127.0.0.1:8080/api", apiUrl);
70 } catch (IOException e) {
71 throw new IllegalStateException(e);
72 }
73 }
74
75 @GET
76 @Path("/version")
77 @Produces(MediaType.APPLICATION_JSON)
78 @ApiMethod(
79 path = "/application/version",
80 verb = ApiVerb.GET,
81 description = "Gets a application version",
82 produces = { MediaType.APPLICATION_JSON },
83 responsestatuscode = "200 - OK"
84 )
85 @ApiErrors(apierrors={
86 @ApiError(code="500", description="Application critical error")
87 })
88 @ApiResponseObject
89 public String getVersion() {
90 return application.version();
91 }
92
93 @PUT
94 @Path("/status")
95 @Consumes(MediaType.APPLICATION_JSON)
96 @Produces(MediaType.APPLICATION_JSON)
97 @ApiMethod(
98 path = "/application/status",
99 verb = ApiVerb.PUT,
100 description = "Sets a application status to stopped",
101 produces = { MediaType.APPLICATION_JSON },
102 consumes = { MediaType.APPLICATION_JSON },
103 responsestatuscode = "200 - OK"
104 )
105 @ApiErrors(apierrors={
106 @ApiError(code="500", description="Application critical error")
107 })
108 public Response action(@ApiBodyObject final String object) {
109 try {
110 final ObjectMapper mapper = new ObjectMapper(new JsonFactory());
111 final Map<String, Object> map = mapper.readValue(object, new TypeReference<HashMap<String, Object>>() {
112 });
113 final String status = (String) map.get("status");
114 switch (status) {
115 case "stopped":
116 schedule(application::stop, delayBeforeStop);
117 break;
118 default:
119 throw badRequestException("Status '%s' is not valid", status);
120 }
121 return Response.status(Response.Status.ACCEPTED).build();
122 } catch (IOException e) {
123 LOGGER.error("Operation is not valid", e);
124 throw badRequestException("Operation is not valid", e.getMessage());
125 }
126 }
127 }