· 7 years ago · Oct 22, 2017, 12:04 PM
1package com.sap.ngom.collection.client;
2
3import java.io.File;
4import java.io.IOException;
5import java.io.UnsupportedEncodingException;
6import java.net.URI;
7import java.net.URISyntaxException;
8import java.net.URL;
9import java.net.URLEncoder;
10
11import org.cloudfoundry.uaa.tokens.AbstractToken;
12import org.cloudfoundry.uaa.tokens.GetTokenByPasswordResponse;
13import org.springframework.beans.factory.annotation.Autowired;
14import org.springframework.http.HttpHeaders;
15import org.springframework.http.HttpMethod;
16import org.springframework.http.HttpStatus;
17import org.springframework.http.MediaType;
18import org.springframework.http.RequestEntity;
19import org.springframework.http.ResponseEntity;
20import org.springframework.stereotype.Service;
21import org.springframework.web.client.RestOperations;
22
23import com.fasterxml.jackson.core.JsonParseException;
24import com.fasterxml.jackson.databind.JsonMappingException;
25import com.fasterxml.jackson.databind.JsonNode;
26import com.fasterxml.jackson.databind.ObjectMapper;
27
28
29@Service
30public class ElasticSearchClient {
31
32 private static final String CF_TOKEN_URL = "https://uaa.cf.us10.hana.ondemand.com";
33 private static final String CF_LOGS_URL = "https://logs.cf.us10.hana.ondemand.com";
34 private static ObjectMapper mapper = new ObjectMapper();
35
36 String username = System.getenv("USER");
37 String password = System.getenv("PWD");
38 String token = "";
39
40 @Autowired
41 private RestOperations restOperations;
42
43 public JsonNode getLogsByElasticSearch() throws JsonParseException, JsonMappingException, IOException{
44
45 String query = mapper.readValue(new File(getFileURI("/query.json")), JsonNode.class).toString();
46 String index = mapper.readValue(new File(getFileURI("/index.json")), JsonNode.class).toString();
47 String queryBody = index + "n" + query + "n" + index + "n" + query;
48
49 ResponseEntity responseEntity = retrieveLog(queryBody);
50
51 if (responseEntity.getStatusCode() == HttpStatus.FOUND){
52
53 dealWithRedirect(responseEntity);
54 }
55
56 return null;
57 }
58
59 private void dealWithRedirect(ResponseEntity responseEntity){
60 HttpHeaders responseHeaders = responseEntity.getHeaders();
61 String loction = responseHeaders.get("Location").toString();
62 String loginUrl = loction.substring(1, loction.length()-1);
63
64 String setCookie = responseHeaders.get("Set-Cookie").toString();
65 setCookie = setCookie.substring(1, loction.length()-1);
66
67 HttpHeaders loginHeaders = new HttpHeaders();
68 loginHeaders.set("Cookie", setCookie);
69 loginHeaders.set(HttpHeaders.AUTHORIZATION, "Basic Y2Y6");
70 loginHeaders.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
71
72 String body = "grant_type=password&username=jane.wang03@sap.com&password="+ System.getenv("PWD") + "&response_type=user_token";
73
74 RequestEntity<String> loginRequestEntity = new RequestEntity<>(body, loginHeaders, HttpMethod.POST, URI.create(loginUrl));
75 ResponseEntity loginResponse = restOperations.exchange(loginRequestEntity, Object.class);
76
77 String temp = "";
78 }
79
80 private void passAuthentication(String state){
81 String url = CF_TOKEN_URL + "/oauth/authorize?grant_type=authorization_code&client_id=sleeve-app-logs&response_type=code&state=" + state;
82
83 HttpHeaders headers = new HttpHeaders();
84 headers.set(HttpHeaders.AUTHORIZATION, "bearer " + token);
85
86 RequestEntity<String> requestEntity = new RequestEntity<>(headers, HttpMethod.GET, URI.create(url));
87
88 HttpStatus responseEntity = restOperations.exchange(requestEntity, Object.class).getStatusCode();
89 }
90
91
92 private ResponseEntity retrieveLog(String queryBody){
93
94 if (token == ""){
95 token = getToken();
96 }
97
98 HttpHeaders headers = new HttpHeaders();
99 headers.set(HttpHeaders.AUTHORIZATION, "bearer " + token);
100 headers.set("kbn-xsrf", "reporting");
101
102 String url = CF_LOGS_URL + "/elasticsearch/_msearch";
103 RequestEntity<String> requestEntity = new RequestEntity<>(queryBody, headers, HttpMethod.POST, URI.create(url));
104 ResponseEntity responseEntity = restOperations.exchange(requestEntity, Object.class);
105
106 return responseEntity;
107 }
108
109
110 private String getToken() {
111
112 String body = "grant_type=password";
113 try {
114 body += "&username=" + URLEncoder.encode(username, "UTF-8");
115 body += "&password=" + URLEncoder.encode(password, "UTF-8");
116 body += "&response_type=user_token";
117 } catch (UnsupportedEncodingException ex) {
118 throw new RuntimeException(ex);
119 }
120
121 HttpHeaders headers = new HttpHeaders();
122 headers.set(HttpHeaders.AUTHORIZATION, "Basic Y2Y6");
123 headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
124
125 RequestEntity<String> requestEntity = new RequestEntity<>(body, headers, HttpMethod.POST, URI.create(CF_TOKEN_URL + "/oauth/token"));
126 ResponseEntity<GetTokenByPasswordResponse> responseEntity = restOperations.exchange(requestEntity, GetTokenByPasswordResponse.class);
127 AbstractToken token = responseEntity.getBody();
128
129 return token.getAccessToken();
130 }
131
132
133 private URI getFileURI(String path) {
134 URL ruleURL = ElasticSearchClient.class.getResource(path);
135 URI uri = null;
136
137 try {
138 uri = ruleURL.toURI();
139 } catch (URISyntaxException e) {
140 e.printStackTrace();
141 }
142 return uri;
143 }
144}