View Javadoc

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   * @author Maxim Yunusov
29   * @version 1.0
30   * @since <pre>11/29/13</pre>
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 }