[Trunk | Orcid Service]:

1. orcidservice.properties: Added properties "apiURL", "tokenURL", "clientId", "clientSecret" for ORCID API.
2. log4j.properties: Added configuration for ORCID log file "uoa-orcid-service-orcid.log".
3. UoaOrcidServiceApplication.java: Added "OrcidConfig.class" in "@EnableConfigurationProperties".
4. SimpleErrorController.java: If body.path.contains("/uoa-orcid-service/orcid"), log error in ORCID log file too.
5. UserTokensService.java: Added method "getEncryptedUserTokensByAai()".
6. UserTokensController.java: 
	a. Added ORCID log file for responses by ORCID API.
	b. Added @Autowired OrcidConfig for getting ORICD token url, client and secret from properties.
	c. Added method "getUserOrcidId()" (/local/orcidId)
	d. Added method "getPersonalDetailsFromOrcid()" (/orcid/personal-details)
	e. Renamed "/orcid/tokens/decrypt" to "/local/tokens/decrypt" & "/orcid/tokens/encrypt" to "/local/tokens/encrypt".
7. Work.java: Added field "updateDate".
8. WorkDAO.java & MongoDBWorkDAO.java: Added methods "List<Work> findByOrcidOrderByCreationDateDesc(String Orcid);" and "Work findByPutCode(String putCode);".
9. WorkService.java: 
	a. Added method "getLocalWorkByPutCode()".
	b. Method "getLocalWorks()" returns works ordered by most recent creation date.
10. WorkController.java:
	a. Added ORCID log file for responses by ORCID API.
	b. Added @Autowired OrcidConfig for getting ORICD token url, client and secret from properties.
	c. Added "charset=UTF-8" in all Content-Type request headers.
	d. Renamed "/orcid/put-code" to "/local/put-code".
	e. Added method "List<List<Work>> getLocalWorks(@RequestBody String[][] pids)" (/local/works).
	f. Added method "List<Work> getMyLocalWorks()" (/local/works).
	g. Added method "updateWork()" (/orcid/work/update/{putCode}).
	h. Added method "getWorksByPutCodes()" (/orcid/works).
This commit is contained in:
Konstantina Galouni 2021-02-08 09:54:52 +00:00
parent 93acb15d2d
commit d86ea2a8fa
12 changed files with 381 additions and 281 deletions

View File

@ -3,6 +3,7 @@ package eu.dnetlib.uoaorcidservice;
import eu.dnetlib.uoaauthorizationlibrary.configuration.AuthorizationConfiguration;
import eu.dnetlib.uoaorcidservice.configuration.properties.MongoConfig;
//import eu.dnetlib.uoaauthorizationlibrary.configuration.AuthorizationConfiguration;
import eu.dnetlib.uoaorcidservice.configuration.properties.OrcidConfig;
import eu.dnetlib.uoaorcidservice.handlers.utils.AESUtils;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@ -16,7 +17,7 @@ import org.springframework.context.annotation.PropertySources;
@PropertySource("classpath:orcidservice.properties"),
@PropertySource(value = "classpath:dnet-override.properties", ignoreResourceNotFound = true)
})
@EnableConfigurationProperties({MongoConfig.class, AESUtils.class})
@EnableConfigurationProperties({MongoConfig.class, AESUtils.class, OrcidConfig.class})
@Import(AuthorizationConfiguration.class)
public class UoaOrcidServiceApplication {

View File

@ -24,6 +24,7 @@ import java.util.Map;
@RequestMapping("/error")
public class SimpleErrorController implements ErrorController {
private final Logger log = Logger.getLogger(this.getClass());
private final Logger orcid_log = Logger.getLogger("ORCID-"+this.getClass().getName());
private final ErrorAttributes errorAttributes;
@ -57,15 +58,18 @@ public class SimpleErrorController implements ErrorController {
// message=Unknown status code [525] Origin SSL Handshake Error,
// path=/uoa-orcid-service/orcid/work/save}
log.debug(body);
log.debug(body.get("status"));
String path = (String)body.get("path");
if(path.contains("/uoa-orcid-service/orcid")) {
orcid_log.error(body);
} else {
log.error(body);
}
Integer status = (Integer)body.get("status");
log.debug("status: "+status);
HttpStatus statusCode = HttpStatus.INTERNAL_SERVER_ERROR;
if (status != null) {
statusCode = HttpStatus.valueOf(status);
log.debug(statusCode);
}
ExceptionResponse response = new ExceptionResponse();
@ -73,7 +77,7 @@ public class SimpleErrorController implements ErrorController {
response.setErrorMessage((String)body.get("exception"));
response.setErrors((String)body.get("message"));
response.setStatus(statusCode);
log.error((String)body.get("exception")+" : "+ (String)body.get("message"));
// log.error((String)body.get("exception")+" : "+ (String)body.get("message"));
return new ResponseEntity<ExceptionResponse>(response, statusCode);
// return body;

View File

@ -1,11 +1,14 @@
package eu.dnetlib.uoaorcidservice.controllers;
import eu.dnetlib.uoaorcidservice.configuration.properties.OrcidConfig;
import eu.dnetlib.uoaorcidservice.entities.UserTokens;
import eu.dnetlib.uoaorcidservice.handlers.utils.AESUtils;
import eu.dnetlib.uoaorcidservice.responses.SingleValueWrapperResponse;
import eu.dnetlib.uoaorcidservice.services.UserTokensService;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.*;
import org.springframework.security.access.AuthorizationServiceException;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.client.DefaultResponseErrorHandler;
@ -23,10 +26,14 @@ import java.util.ArrayList;
import java.util.List;
@RestController
@RequestMapping("/orcid")
//@RequestMapping("/orcid")
@CrossOrigin(origins = "*")
public class UserTokensController {
private final Logger log = Logger.getLogger(this.getClass());
private final Logger orcid_log = Logger.getLogger("ORCID-"+this.getClass().getName());
@Autowired
private OrcidConfig orcidConfig;
@Autowired
private UserTokensService userTokensService;
@ -41,14 +48,26 @@ public class UserTokensController {
// return "\""+userTokensService.getUserAccessToken(orcid)+"\"";
// }
@RequestMapping(value = "/local/orcidId", method = RequestMethod.GET)
public SingleValueWrapperResponse<String> getUserOrcidId() throws BadPaddingException, InvalidKeyException, NoSuchAlgorithmException, IllegalBlockSizeException, IOException, NoSuchPaddingException, InvalidAlgorithmParameterException, InvalidKeySpecException {
UserTokens userTokens = userTokensService.getUserTokens();
if(userTokens == null) {
throw new AuthorizationServiceException("User is not registered");
}
String userOrcid = userTokens.getOrcid();
return new SingleValueWrapperResponse<String>(userOrcid);
}
@PreAuthorize("isAuthenticated()")
@RequestMapping(value = "/token/save", method = RequestMethod.GET)
public String saveUserTokens(@RequestParam String code) throws BadPaddingException, InvalidAlgorithmParameterException, NoSuchAlgorithmException, IllegalBlockSizeException, NoSuchPaddingException, InvalidKeyException, InvalidKeySpecException, IOException {
@RequestMapping(value = "/orcid/token/save", method = RequestMethod.GET)
public String saveUserTokens(@RequestParam String code
// , @RequestParam String redirect_uri
) throws BadPaddingException, InvalidAlgorithmParameterException, NoSuchAlgorithmException, IllegalBlockSizeException, NoSuchPaddingException, InvalidKeyException, InvalidKeySpecException, IOException {
log.debug("saveUserTokens: code="+code);
String url = "https://sandbox.orcid.org/oauth/token";
String clientId = "APP-A5M3KTX6NCN67L91";
String clientSecret = "96b20d71-ae06-4286-bb00-9172536c1ad4";
String url = orcidConfig.getTokenURL();//"https://sandbox.orcid.org/oauth/token";
String clientId = orcidConfig.getClientId();//"APP-A5M3KTX6NCN67L91";
String clientSecret = orcidConfig.getClientSecret();//"96b20d71-ae06-4286-bb00-9172536c1ad4";
RestTemplate restTemplate = new RestTemplate();
@ -64,96 +83,85 @@ public class UserTokensController {
"client_id="+clientId
+"&client_secret="+clientSecret
+"&grant_type=authorization_code"
+"&code="+code
+"&redirect_uri=http://duffy.di.uoa.gr:4300/orcid";
log.debug(inputString);
+"&code="+code;
// +"&redirect_uri="+redirect_uri;//http://duffy.di.uoa.gr:4300/orcid";
HttpEntity<String> request = new HttpEntity<>(inputString, headers);
//logger.info(restTemplate.exchange(fooResourceUrl, HttpMethod.GET, request, Object.class));
orcid_log.info("url: "+url);
orcid_log.info("request: "+request);
ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.POST, request, String.class);
if(response.getStatusCode() != HttpStatus.OK) {
log.debug("User tokens response code is: " + response.getStatusCode());
log.debug(response.getBody());
orcid_log.error("User tokens response code is: " + response.getStatusCode());
orcid_log.error("Unexpected Response: "+response.getBody());
return null;
} else {
log.debug(response);
orcid_log.info("Response: "+response);
UserTokens userTokens = userTokensService.json2UserTokens(response.getBody().toString());
userTokensService.saveUserTokens(userTokens);
return "\""+userTokens.getAccessToken()+"\"";
}
// try {
// URL obj = new URL(url);
//
// HttpURLConnection con = (HttpURLConnection) obj.openConnection();
// con.setRequestMethod("POST");
// con.setDoOutput(true);
// con.setInstanceFollowRedirects(true);
// con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
// con.setRequestProperty("Accept", "application/json");
//
// String inputString =
// "client_id="+clientId
// +"&client_secret="+clientSecret
// +"&grant_type=authorization_code"
// +"&code="+code
// +"&redirect_uri=http://duffy.di.uoa.gr:4300/orcid";
//
// log.debug(inputString);
//
// try(OutputStream os = con.getOutputStream()) {
//// byte[] input = inputString.getBytes();
//// os.write(inputString, 0, inputString.length());
//
// OutputStreamWriter osw = new OutputStreamWriter(os);
// osw.write(inputString);
// osw.flush();
// osw.close();
//
// os.close(); //don't forget to close the OutputStream
// log.debug("http request body added");
// } catch (Exception e) {
// log.error("Failed to add http request body", e);
// }
//
// con.connect();
//
//// log.debug(con.getRequestMethod());
//// log.debug(con.getErrorStream());
//// log.debug(con.getContent());
//
//
// if (con.getResponseCode() != 200) {
// log.debug("User tokens response code is: " + con.getResponseCode());
// return null;
// } else {
// BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
// StringBuilder response = new StringBuilder();
// String inputLine;
// while ((inputLine = in.readLine()) != null) {
// response.append(inputLine).append("\n");
// }
// in.close();
// log.debug(response);
//
// UserTokens userTokens = userTokensService.json2UserTokens(response.toString());
// userTokensService.saveUserTokens(userTokens);
//
// return "\""+userTokens.getAccessToken()+"\"";
// }
//
// } catch (Exception e) {
// log.error("An error occured while trying to fetch user tokens ", e);
// return null;
// }
}
@RequestMapping(value = "/orcid/personal-details", method = RequestMethod.GET)
public String getPersonalDetailsFromOrcid() throws BadPaddingException, InvalidKeyException, NoSuchAlgorithmException, IllegalBlockSizeException, IOException, NoSuchPaddingException, InvalidAlgorithmParameterException, InvalidKeySpecException {
log.debug("getPersonalDetailsFromOrcid");
UserTokens userTokens = userTokensService.getUserTokens();
if(userTokens == null) {
throw new AuthorizationServiceException("User is not registered");
}
String userOrcid = userTokens.getOrcid();
String userAccessToken = userTokens.getAccessToken();
if(userOrcid == null || userAccessToken == null) {
throw new AuthorizationServiceException("User is not registered");
}
// log.debug("Access token: " + userAccessToken);
// log.debug("User orcid: " + userOrcid);
String url = orcidConfig.getApiURL()+userOrcid+"/personal-details";
RestTemplate restTemplate = new RestTemplate();
restTemplate.setErrorHandler(new DefaultResponseErrorHandler() {
protected boolean hasError(HttpStatus statusCode) {
return false;
}
});
HttpHeaders headers = new HttpHeaders();
headers.add("Accept", "application/json");
headers.add("Authorization", "Bearer " + userAccessToken);
headers.add("Content-Type", "application/orcid+json");
HttpEntity<String> request = new HttpEntity<>(headers);
orcid_log.info("request: "+request);
orcid_log.info("url: "+url);
ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.GET, request, String.class);
if (response.getStatusCode() != HttpStatus.OK) {
orcid_log.error("Getting user details response code is: " + response.getStatusCode());
orcid_log.error("Unexpected Response: "+response.getBody());
return null;
} else {
orcid_log.info("response: "+response);
return response.getBody().toString();
}
}
@PreAuthorize("isAuthenticated()")
@RequestMapping(value = "/tokens/decrypt", method = RequestMethod.GET)
@RequestMapping(value = "/local/tokens/decrypt", method = RequestMethod.GET)
public UserTokens decryptToken(@RequestParam String aaiId) throws NoSuchPaddingException, InvalidKeyException, NoSuchAlgorithmException, IllegalBlockSizeException, BadPaddingException, InvalidAlgorithmParameterException, InvalidKeySpecException, IOException {
return userTokensService.getUserTokensByAai(aaiId);
}
@PreAuthorize("isAuthenticated()")
@RequestMapping(value = "/local/tokens/encrypt", method = RequestMethod.GET)
public UserTokens encryptToken(@RequestParam String aaiId) throws NoSuchPaddingException, InvalidKeyException, NoSuchAlgorithmException, IllegalBlockSizeException, BadPaddingException, InvalidAlgorithmParameterException, InvalidKeySpecException, IOException {
UserTokens userTokens = userTokensService.getEncryptedUserTokensByAai(aaiId);
return userTokensService.encryptTokens(userTokens);
}
}

View File

@ -2,6 +2,7 @@ package eu.dnetlib.uoaorcidservice.controllers;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import eu.dnetlib.uoaorcidservice.configuration.properties.OrcidConfig;
import eu.dnetlib.uoaorcidservice.entities.ResultIdAndWork;
import eu.dnetlib.uoaorcidservice.entities.UserTokens;
import eu.dnetlib.uoaorcidservice.entities.Work;
@ -11,8 +12,10 @@ import eu.dnetlib.uoaorcidservice.services.UserTokensService;
import eu.dnetlib.uoaorcidservice.services.WorkService;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.util.Pair;
import org.springframework.http.*;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.security.access.AccessDeniedException;
import org.springframework.security.access.AuthorizationServiceException;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;
@ -28,15 +31,17 @@ import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.spec.InvalidKeySpecException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.*;
@RestController
@RequestMapping("/orcid")
//@RequestMapping("/orcid")
@CrossOrigin(origins = "*")
public class WorkController {
private final Logger log = Logger.getLogger(this.getClass());
private final Logger orcid_log = Logger.getLogger("ORCID-"+this.getClass().getName());
@Autowired
private OrcidConfig orcidConfig;
@Autowired
private UserTokensService userTokensService;
@ -45,7 +50,7 @@ public class WorkController {
private WorkService workService;
@PreAuthorize("isAuthenticated()")
@RequestMapping(value = "put-code", method = RequestMethod.GET)
@RequestMapping(value = "/local/put-code", method = RequestMethod.GET)
public List<String> getPutCode(@RequestParam String[] pids) {
String userOrcid = userTokensService.getCurrentUserOrcid();
List<Work> works = workService.getWorks(pids, userOrcid);
@ -60,7 +65,7 @@ public class WorkController {
}
@PreAuthorize("isAuthenticated()")
@RequestMapping(value = "put-codes", method = RequestMethod.POST)
@RequestMapping(value = "/local/put-codes", method = RequestMethod.POST)
public List<List<String>> getPutCodes(@RequestBody String[][] pids) {
String userOrcid = userTokensService.getCurrentUserOrcid();
List<List<String>> putCodes = new ArrayList();
@ -80,8 +85,24 @@ public class WorkController {
}
@PreAuthorize("isAuthenticated()")
@RequestMapping(value = "/work/save", method = RequestMethod.POST)
public String saveWork(@RequestBody String resultString) throws IOException, BadPaddingException, InvalidKeyException, NoSuchAlgorithmException, IllegalBlockSizeException, NoSuchPaddingException, InvalidAlgorithmParameterException, InvalidKeySpecException {
@RequestMapping(value = "/local/works", method = RequestMethod.POST)
public List<List<Work>> getLocalWorks(@RequestBody String[][] pids) {
String userOrcid = userTokensService.getCurrentUserOrcid();
if(userOrcid == null) {
throw new AuthorizationServiceException("User is not registered");
}
List<List<Work>> returnedWorks = new ArrayList();
for(int i=0; i<pids.length; i++) {
List<Work> works = workService.getWorks(pids[i], userOrcid);
returnedWorks.add(works);
}
return returnedWorks;
}
@PreAuthorize("isAuthenticated()")
@RequestMapping(value = "/orcid/work/save", method = RequestMethod.POST)
public Work saveWork(@RequestBody String resultString) throws Exception {
log.debug("saveWork: result = " + resultString);
Gson gson = new GsonBuilder().create();
@ -98,8 +119,8 @@ public class WorkController {
throw new AuthorizationServiceException("User is not registered");
}
log.debug("Access token: " + userAccessToken);
log.debug("User orcid: " + userOrcid);
// log.debug("Access token: " + userAccessToken);
// log.debug("User orcid: " + userOrcid);
String url = "https://api.sandbox.orcid.org/v3.0/" + userOrcid + "/work";
@ -109,6 +130,7 @@ public class WorkController {
restTemplate.setErrorHandler(new DefaultResponseErrorHandler() {
protected boolean hasError(HttpStatus statusCode) {
if(statusCode == HttpStatus.UNAUTHORIZED) {
orcid_log.error("ORCID service returned UNAUTHORIZED: "+HttpStatus.UNAUTHORIZED);
throw new AuthorizationServiceException("User is not registered");
}
return false;
@ -117,186 +139,164 @@ public class WorkController {
HttpHeaders headers = new HttpHeaders();
headers.add("Authorization", "Bearer " + userAccessToken);
headers.add("Content-Type", "application/orcid+json;charset=UTF-8");
log.debug(headers.get("Authorization"));
HttpEntity<String> request = new HttpEntity<>(gson.toJson(result.getWork()), headers);
//logger.info(restTemplate.exchange(fooResourceUrl, HttpMethod.GET, request, Object.class));
orcid_log.info("request: "+request);
orcid_log.info("url: "+url);
ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.POST, request, String.class);
if (response.getStatusCode() != HttpStatus.CREATED) {
log.debug("Saving work response code is: " + response.getStatusCode());
log.debug(response.getBody());
orcid_log.error("Saving work response code is: " + response.getStatusCode());
orcid_log.error("Unexpected Response: "+response.getBody());
if(response.getStatusCode() == HttpStatus.UNAUTHORIZED) {
throw new AuthorizationServiceException("You are not allowed to save work");
}
if(response.getStatusCode() == HttpStatus.CONFLICT) {
} else if(response.getStatusCode() == HttpStatus.CONFLICT) {
throw new ConflictException("Work is already saved");
} else {
throw new Exception("Internal server error");
}
return null;
// return null;
} else {
orcid_log.info("Response: "+response);
// log.debug("[success] Saving work response code is: " + response.getStatusCode());
// log.debug(response.toString());
log.debug("[success] Saving work response code is: " + response.getStatusCode());
log.debug(response.toString());
Date date = new Date();
Work workToSave = new Work();
workToSave.setPids(result.getPids());
workToSave.setOrcid(userOrcid);
workToSave.setCreationDate(new Date());
workToSave.setCreationDate(date);
workToSave.setUpdateDate(date);
HttpHeaders responseHeaders = response.getHeaders();
String locationPath = responseHeaders.getLocation().toString();
String[] locationPathArray = locationPath.split("/");
workToSave.setPutCode(locationPathArray[locationPathArray.length - 1]);
log.debug(gson.toJson(result.getPids()));
log.debug(responseHeaders.getLocation().toString());
log.debug(gson.toJson(workToSave));
// log.debug(gson.toJson(result.getPids()));
// log.debug(responseHeaders.getLocation().toString());
// log.debug(gson.toJson(workToSave));
workService.saveWork(workToSave);
return "\""+workToSave.getPutCode()+"\"";
return workToSave;
// return "\""+workToSave.getPutCode()+"\"";
}
}
// @RequestMapping(value = "/{orcid}/work/{putCode}", method = RequestMethod.PUT)
// public String updateWork(@PathVariable String orcid,
// @PathVariable String putCode,
// @RequestBody String work) throws AccessDeniedException {
// log.debug("updateWork: orcid = " + orcid + " - putCode = " + putCode);
//
// String userAccessToken = userTokensService.getUserAccessToken(orcid);
// log.debug("Access token: " + userAccessToken);
//
//// String url = "https://sandbox.orcid.org/v3.0/" + orcid.toString() + "/works";
// String url = "https://api.sandbox.orcid.org/v3.0/" + orcid + "/work/" + putCode;
//
// RestTemplate restTemplate = new RestTemplate();
// restTemplate.setErrorHandler(new DefaultResponseErrorHandler() {
// protected boolean hasError(HttpStatus statusCode) {
// return false;
// }
// });
// HttpHeaders headers = new HttpHeaders();
//// headers.add("Accept", "application/json");
// headers.add("Authorization", "Bearer " + userAccessToken);
// headers.add("Content-Type","application/orcid+json");
//
// HttpEntity<String> request = new HttpEntity<>(work, headers);
// //logger.info(restTemplate.exchange(fooResourceUrl, HttpMethod.GET, request, Object.class));
// ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.PUT, request, String.class);
// if (response.getStatusCode() != HttpStatus.OK) {
// log.debug("Updating work response code is: " + response.getStatusCode());
// return null;
// } else {
// log.debug(response);
//
// return null;
// }
//
// }
@RequestMapping(value = "/orcid/work/update/{putCode}", method = RequestMethod.POST)
public Work updateWork(@PathVariable String putCode,
@RequestBody String resultString) throws AccessDeniedException, BadPaddingException, InvalidKeyException, NoSuchAlgorithmException, IllegalBlockSizeException, IOException, NoSuchPaddingException, InvalidAlgorithmParameterException, InvalidKeySpecException {
log.debug("updateWork: putCode = " + putCode);
// @RequestMapping(value = "/works/save", method = RequestMethod.POST)
// public String saveWorks(@RequestBody String works) {
// log.debug("saveWorks");
//
// String userAccessToken = userTokensService.getUserAccessToken(null);
// log.debug("Access token: " + userAccessToken);
// log.debug(works);
//
// String url = "https://api.sandbox.orcid.org/v3.0/0000-0001-9541-4617/work";
//
// RestTemplate restTemplate = new RestTemplate();
// restTemplate.setErrorHandler(new DefaultResponseErrorHandler() {
// protected boolean hasError(HttpStatus statusCode) {
// return false;
// }
// });
// HttpHeaders headers = new HttpHeaders();
// headers.add("Authorization", "Bearer " + userAccessToken);
// headers.add("Content-Type", "application/json");
//// List<MediaType> list = new ArrayList();
//// list.add(MediaType.TEXT_HTML);
//// headers.setAccept(list);
//
//
// HttpEntity<String> request = new HttpEntity<>(works.toString(), headers);
//
//// log.debug(restTemplate.exchange(url, HttpMethod.POST, request, Object.class));
//
// ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.POST, request, String.class);
// if (response.getStatusCode() != HttpStatus.OK) {
// log.debug("Saving works response code is: " + response.getStatusCode());
// log.debug(response.getBody().toString());
// return null;
// } else {
// log.debug("[success] Saving works response code is: " + response.getStatusCode());
// log.debug(response.toString());
//
// return response.toString();
// }
// }
Gson gson = new GsonBuilder().create();
ResultIdAndWork result = gson.fromJson(resultString, ResultIdAndWork.class);
UserTokens userTokens = userTokensService.getUserTokens();
if(userTokens == null) {
throw new AuthorizationServiceException("User is not registered");
}
String userOrcid = userTokens.getOrcid();
String userAccessToken = userTokens.getAccessToken();
if(userOrcid == null || userAccessToken == null) {
throw new AuthorizationServiceException("User is not registered");
}
// @RequestMapping(value = "/works", method = RequestMethod.GET)
// public String getAllWorks(@RequestParam String orcid) {
// log.debug("getAllWorks: orcid = |" + orcid + "|");
//
// String userAccessToken = userTokensService.getUserAccessToken(orcid);
// log.debug("Access token: " + userAccessToken);
//
//// String url = "https://sandbox.orcid.org/v3.0/" + orcid.toString() + "/works";
// String url = "https://api.sandbox.orcid.org/v3.0/"+orcid+"/works";
//
// RestTemplate restTemplate = new RestTemplate();
// restTemplate.setErrorHandler(new DefaultResponseErrorHandler() {
// protected boolean hasError(HttpStatus statusCode) {
// return false;
// }
// });
// HttpHeaders headers = new HttpHeaders();
// log.debug("User orcid: " + userOrcid);
// String url = "https://sandbox.orcid.org/v3.0/" + orcid.toString() + "/works";
// String url = "https://api.sandbox.orcid.org/v3.0/" + userOrcid + "/work/" + putCode;
String url = orcidConfig.getApiURL() + userOrcid + "/work/" + putCode;
RestTemplate restTemplate = new RestTemplate();
restTemplate.setErrorHandler(new DefaultResponseErrorHandler() {
protected boolean hasError(HttpStatus statusCode) {
return false;
}
});
HttpHeaders headers = new HttpHeaders();
// headers.add("Accept", "application/json");
// headers.add("Authorization", "Bearer " + userAccessToken);
// headers.add("Content-Type", "application/orcid+json");
// log.debug(headers.get("Authorization"));
// HttpEntity<String> request = new HttpEntity<>(headers);
// //logger.info(restTemplate.exchange(fooResourceUrl, HttpMethod.GET, request, Object.class));
// ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.GET, request, String.class);
// if (response.getStatusCode() != HttpStatus.OK) {
// log.debug("Getting works response code is: " + response.getStatusCode());
headers.add("Authorization", "Bearer " + userAccessToken);
headers.add("Content-Type", "application/orcid+json;charset=UTF-8");
HttpEntity<String> request = new HttpEntity<>(gson.toJson(result.getWork()), headers);
orcid_log.info("request: "+request);
orcid_log.info("url: "+url);
ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.PUT, request, String.class);
if (response.getStatusCode() != HttpStatus.OK) {
orcid_log.error("Updating work response code is: " + response.getStatusCode());
orcid_log.error("Unexpected Response: "+response.getBody());
return null;
} else {
orcid_log.info("Response: "+response);
Date date = new Date();
Work localWork = workService.getLocalWorkByPutCode(putCode);
localWork.setPids(result.getPids());
localWork.setUpdateDate(date);
workService.saveWork(localWork);
return localWork;
// return null;
// } else {
// log.debug(response);
// return response.getBody().toString();
// }
//
//// try {
//// URL obj = new URL(url);
////
//// HttpURLConnection con = (HttpURLConnection) obj.openConnection();
//// con.setRequestProperty("Accept", "application/json");
//// con.setRequestProperty("Content-Type", "application/orcid+json");
//// con.setRequestProperty("Authorization", "Bearer "+userAccessToken);
////
//// if (con.getResponseCode() != 200) {
//// log.debug("Getting works response code is: " + con.getResponseCode());
//// return null;
//// }
//// BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
//// StringBuilder response = new StringBuilder();
//// String inputLine;
//// while ((inputLine = in.readLine()) != null) {
//// response.append(inputLine).append("\n");
//// }
//// in.close();
//// log.debug(response);
//// return response;
//// } catch (Exception e) {
//// log.error("An error occured while trying to fetch works for orcid: "+orcid, e);
//// return null;
//// }
// }
}
}
@RequestMapping(value = "/orcid/works", method = RequestMethod.GET)
public String getWorksByPutCodes(@RequestParam String put_codes) throws BadPaddingException, InvalidKeyException, NoSuchAlgorithmException, IllegalBlockSizeException, IOException, NoSuchPaddingException, InvalidAlgorithmParameterException, InvalidKeySpecException {
log.debug("getWorksByPutCodes: put_codes = " + put_codes);
UserTokens userTokens = userTokensService.getUserTokens();
if(userTokens == null) {
throw new AuthorizationServiceException("User is not registered");
}
String userOrcid = userTokens.getOrcid();
String userAccessToken = userTokens.getAccessToken();
if(userOrcid == null || userAccessToken == null) {
throw new AuthorizationServiceException("User is not registered");
}
// log.debug("Access token: " + userAccessToken);
// log.debug("User orcid: " + userOrcid);
// String url = "https://sandbox.orcid.org/v3.0/" + orcid.toString() + "/works";
String url = orcidConfig.getApiURL()+userOrcid+"/works/"+put_codes;
RestTemplate restTemplate = new RestTemplate();
restTemplate.setErrorHandler(new DefaultResponseErrorHandler() {
protected boolean hasError(HttpStatus statusCode) {
return false;
}
});
HttpHeaders headers = new HttpHeaders();
headers.add("Accept", "application/json");
headers.add("Authorization", "Bearer " + userAccessToken);
headers.add("Content-Type", "application/orcid+json;charset=UTF-8");
HttpEntity<String> request = new HttpEntity<>(headers);
orcid_log.info("request: "+request);
orcid_log.info("url: "+url);
ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.GET, request, String.class);
if (response.getStatusCode() != HttpStatus.OK) {
orcid_log.error("Getting works response code is: " + response.getStatusCode());
orcid_log.error("Unexpected Response: "+response.getBody());
return null;
} else {
orcid_log.info("Response: "+response);
return response.getBody().toString();
}
}
@PreAuthorize("isAuthenticated()")
@RequestMapping(value = "/work/{putCode}/delete", method = RequestMethod.DELETE)
@RequestMapping(value = "/orcid/work/{putCode}/delete", method = RequestMethod.DELETE)
public String deleteWork(@PathVariable String putCode) throws IOException, BadPaddingException, InvalidKeyException, NoSuchAlgorithmException, IllegalBlockSizeException, NoSuchPaddingException, InvalidAlgorithmParameterException, InvalidKeySpecException {
log.debug("deleteWork: putCode = " + putCode);
@ -311,10 +311,9 @@ public class WorkController {
throw new AuthorizationServiceException("User is not registered");
}
log.debug("Access token: " + userAccessToken);
log.debug("User orcid: " + userOrcid);
// log.debug("Access token: " + userAccessToken);
// log.debug("User orcid: " + userOrcid);
// String url = "https://sandbox.orcid.org/v3.0/" + orcid.toString() + "/works";
String url = "https://api.sandbox.orcid.org/v3.0/"+userOrcid+"/work/" + putCode;
RestTemplate restTemplate = new RestTemplate();
@ -326,13 +325,17 @@ public class WorkController {
HttpHeaders headers = new HttpHeaders();
// headers.add("Accept", "application/json");
headers.add("Authorization", "Bearer " + userAccessToken);
headers.add("Content-Type","application/orcid+json");
headers.add("Content-Type", "application/orcid+json;charset=UTF-8");
HttpEntity<String> request = new HttpEntity<>(headers);
//logger.info(restTemplate.exchange(fooResourceUrl, HttpMethod.GET, request, Object.class));
orcid_log.info("request: "+request);
orcid_log.info("url: "+url);
ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.DELETE, request, String.class);
if (response.getStatusCode() != HttpStatus.NO_CONTENT) {
log.debug("Deleting work response code is: " + response.getStatusCode());
orcid_log.error("Deleting work response code is: " + response.getStatusCode());
orcid_log.error("Unexpected Response: "+response.getBody());
if(response.getStatusCode() == HttpStatus.NOT_FOUND) {
workService.deleteWork(putCode);
return putCode;
@ -342,7 +345,7 @@ public class WorkController {
}
return null;
} else {
log.debug(response);
orcid_log.info("Response: "+response);
workService.deleteWork(putCode);
@ -352,7 +355,7 @@ public class WorkController {
}
@PreAuthorize("isAuthenticated()")
@RequestMapping(value = "/works/delete", method = RequestMethod.POST)
@RequestMapping(value = "/orcid/works/delete", method = RequestMethod.POST)
public List<String> deleteWorks(@RequestBody List<String> putCodes) throws IOException, BadPaddingException, InvalidKeyException, NoSuchAlgorithmException, IllegalBlockSizeException, NoSuchPaddingException, InvalidAlgorithmParameterException, InvalidKeySpecException {
log.debug("deleteWorks: putCodes = " + putCodes);
@ -367,8 +370,8 @@ public class WorkController {
throw new AuthorizationServiceException("User is not registered");
}
log.debug("Access token: " + userAccessToken);
log.debug("User orcid: " + userOrcid);
// log.debug("Access token: " + userAccessToken);
// log.debug("User orcid: " + userOrcid);
RestTemplate restTemplate = new RestTemplate();
restTemplate.setErrorHandler(new DefaultResponseErrorHandler() {
@ -379,10 +382,9 @@ public class WorkController {
HttpHeaders headers = new HttpHeaders();
// headers.add("Accept", "application/json");
headers.add("Authorization", "Bearer " + userAccessToken);
headers.add("Content-Type","application/orcid+json");
headers.add("Content-Type", "application/orcid+json;charset=UTF-8");
HttpEntity<String> request = new HttpEntity<>(headers);
//logger.info(restTemplate.exchange(fooResourceUrl, HttpMethod.GET, request, Object.class));
List<String> deletedPutCodes = new ArrayList<>();
int index = 0;
@ -390,9 +392,14 @@ public class WorkController {
String url = "https://api.sandbox.orcid.org/v3.0/"+userOrcid+"/work/" + putCode;
// UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(url);
orcid_log.info("request: "+request);
orcid_log.info("url: "+url);
ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.DELETE, request, String.class);
if (response.getStatusCode() != HttpStatus.NO_CONTENT) {
log.debug("Deleting work response code is: " + response.getStatusCode());
orcid_log.error("Deleting work response code is: " + response.getStatusCode());
orcid_log.error("Unexpected Response: "+response.getBody());
if(index == 0 && response.getStatusCode() == HttpStatus.UNAUTHORIZED) {
throw new AuthorizationServiceException("You are not allowed to delete work");
}
@ -403,7 +410,7 @@ public class WorkController {
deletedPutCodes.add(null);
}
} else {
log.debug(response);
orcid_log.info("Response: "+response);
workService.deleteWork(putCode);
@ -415,14 +422,14 @@ public class WorkController {
}
@PreAuthorize("isAuthenticated()")
@RequestMapping(value = "/work", method = RequestMethod.GET)
@RequestMapping(value = "/orcid/work", method = RequestMethod.GET)
public List<String> getWorksOfReuslt(@RequestParam String[] pids, @RequestParam String orcid) throws BadPaddingException, InvalidKeyException, NoSuchAlgorithmException, IllegalBlockSizeException, NoSuchPaddingException, InvalidAlgorithmParameterException, InvalidKeySpecException, IOException {
log.debug("getWorks: pids = " + pids + " - orcid = "+orcid);
List<Work> works = workService.getWorks(pids, orcid);
String userAccessToken = userTokensService.getUserAccessToken(orcid);
log.debug("Access token: " + userAccessToken);
// log.debug("Access token: " + userAccessToken);
RestTemplate restTemplate = new RestTemplate();
restTemplate.setErrorHandler(new DefaultResponseErrorHandler() {
@ -433,23 +440,22 @@ public class WorkController {
HttpHeaders headers = new HttpHeaders();
headers.add("Accept", "application/json");
headers.add("Authorization", "Bearer " + userAccessToken);
headers.add("Content-Type", "application/orcid+json");
log.debug(headers.get("Authorization"));
headers.add("Content-Type", "application/orcid+json;charset=UTF-8");
HttpEntity<String> request = new HttpEntity<>(headers);
List<String> responseValues = new ArrayList<>();
for(Work work : works) {
// String url = "https://api.sandbox.orcid.org/v3.0/0000-0001-9541-4617/work/"+work.getPutCode();
String url = "https://api.sandbox.orcid.org/v3.0/" + orcid + "/work/" + work.getPutCode();
log.debug(url);
String url = orcidConfig.getApiURL() + orcid + "/work/" + work.getPutCode();
UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(url);
orcid_log.info("request: "+request);
orcid_log.info("url: "+url);
//logger.info(restTemplate.exchange(fooResourceUrl, HttpMethod.GET, request, Object.class));
ResponseEntity<String> response = restTemplate.exchange(builder.toUriString(), HttpMethod.GET, request, String.class);
// ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.GET, request, String.class);
if (response.getStatusCode() != HttpStatus.OK) {
log.debug("Getting work response code is: " + response.getStatusCode());
orcid_log.error("Getting work response code is: " + response.getStatusCode());
orcid_log.error("Unexpected Response: "+response.getBody());
if (response.getStatusCode() == HttpStatus.NOT_FOUND) {
// work.setPutCode(null);
@ -459,28 +465,69 @@ public class WorkController {
responseValues.add(null);
} else {
log.debug(response);
orcid_log.info("Response: "+response);
responseValues.add(response.getBody().toString());
}
}
return responseValues;
}
// @PreAuthorize("isAuthenticated()")
// @RequestMapping(value = "/local/works", method = RequestMethod.GET)
// public Map<String, Object> getLocalWorks(@RequestParam(required = false) Integer page, @RequestParam(required = false) Integer size)
// throws BadPaddingException, InvalidKeyException, NoSuchAlgorithmException, IllegalBlockSizeException, NoSuchPaddingException, InvalidAlgorithmParameterException, InvalidKeySpecException, IOException {
// log.debug("getWorks: page="+page+ " - size="+size);
//
// String userOrcid = userTokensService.getCurrentUserOrcid();
// if(userOrcid == null) {
// throw new AuthorizationServiceException("User is not registered");
// }
//
// List<Work> works = workService.getLocalWorks(userOrcid);
//
// Map<String, Object> response = new HashMap<>();
// response.put("total", works.size());
//
// if(page != null && page > 0 && size != null && size > 0) {
// int from = (page-1)*size;
// int to = page*size;
//
//// log.debug("size: "+works.size());
// if(to > works.size()) {
// to = works.size();
// }
//// log.debug("from="+from+" - to="+to);
//
//// int index = 0;
//// Iterator<Work> iterator = works.iterator();
//// while(iterator.hasNext()) {
//// iterator.next();
//// if(index < from || index > to) {
//// iterator.remove();
//// }
//// index++;
//// }
// if(from < to) {
// response.put("results", works.subList(from, to));
// return response;
// }
// }
// response.put("results", works);
// return response;
// }
@PreAuthorize("isAuthenticated()")
@RequestMapping(value = "/works/local", method = RequestMethod.GET)
public List<Work> getLocalWorks() throws BadPaddingException, InvalidKeyException, NoSuchAlgorithmException, IllegalBlockSizeException, NoSuchPaddingException, InvalidAlgorithmParameterException, InvalidKeySpecException, IOException {
log.debug("getWorks");
UserTokens userTokens = userTokensService.getUserTokens();
if(userTokens == null) {
throw new AuthorizationServiceException("User is not registered");
}
String userOrcid = userTokens.getOrcid();
@RequestMapping(value = "/local/works", method = RequestMethod.GET)
public List<Work> getMyLocalWorks() {
log.debug("getMyWorks");
//
String userOrcid = userTokensService.getCurrentUserOrcid();
if(userOrcid == null) {
throw new AuthorizationServiceException("User is not registered");
}
return workService.getLocalWorks(userOrcid);
//
List<Work> works = workService.getLocalWorks(userOrcid);
//
return works;
}
}

View File

@ -17,8 +17,11 @@ public interface MongoDBWorkDAO extends WorkDAO, MongoRepository<Work, String> {
List<Work> findByPidsInAndOrcid(List<String> Pids, String Orcid);
List<Work> findByOrcidOrderByCreationDateDesc(String Orcid);
List<Work> findByOrcid(String Orcid);
Work findByPutCode(String putCode);
Work save(Work work);
void deleteAll();

View File

@ -15,8 +15,11 @@ public interface WorkDAO {
List<Work> findByPidsInAndOrcid(String[] Pids, String Orcid);
List<Work> findByOrcidOrderByCreationDateDesc(String Orcid);
List<Work> findByOrcid(String Orcid);
Work findByPutCode(String putCode);
Work save(Work work);
void deleteAll();

View File

@ -14,6 +14,7 @@ public class Work {
private String putCode;
private String orcid;
private Date creationDate;
private Date updateDate;
public String getId() {
return id;
@ -54,4 +55,12 @@ public class Work {
public void setCreationDate(Date creationDate) {
this.creationDate = creationDate;
}
public Date getUpdateDate() {
return updateDate;
}
public void setUpdateDate(Date updateDate) {
this.updateDate = updateDate;
}
}

View File

@ -87,7 +87,7 @@ public class ExceptionsHandler {
// @ExceptionHandler(Exception.class)
// public ResponseEntity<ExceptionResponse> exception(Exception ex) {
// ExceptionResponse response = new ExceptionResponse();
// response.setErrorCode();
// response.setErrorCode("Internal server error");
// response.setErrorMessage("Exception");
// response.setErrors(ex.getMessage());
// response.setStatus(HttpStatus.INTERNAL_SERVER_ERROR);

View File

@ -160,4 +160,9 @@ public class UserTokensService {
UserTokens userTokens = userTokensDAO.findByAaiId(aaiId);
return decryptTokens(userTokens);
}
public UserTokens getEncryptedUserTokensByAai(String aaiId) {
log.debug("getEncryptedUserTokensByAai");
return userTokensDAO.findByAaiId(aaiId);
}
}

View File

@ -35,6 +35,11 @@ public class WorkService {
}
public List<Work> getLocalWorks(String orcid) {
return workDAO.findByOrcid(orcid);
return workDAO.findByOrcidOrderByCreationDateDesc(orcid);
// return workDAO.findByOrcid(orcid);
}
public Work getLocalWorkByPutCode(String puutCode) {
return workDAO.findByPutCode(puutCode);
}
}

View File

@ -1,6 +1,7 @@
log4j.rootLogger = DEBUG, R
log4j.logger.eu.dnetlib = DEBUG
log4j.logger.ORCID-eu.dnetlib = DEBUG, ORCID
log4j.logger.org.springframework = DEBUG, S
log4j.additivity.org.springframework = false
@ -17,4 +18,12 @@ log4j.appender.S.File=/var/log/dnet/uoa-orcid-service/uoa-orcid-service-spring.l
log4j.appender.S.MaxFileSize=10MB
log4j.appender.S.MaxBackupIndex=10
log4j.appender.S.layout=org.apache.log4j.PatternLayout
log4j.appender.S.layout.ConversionPattern= %d %p %t [%c] - %m%n
log4j.appender.S.layout.ConversionPattern= %d %p %t [%c] - %m%n
#log4j.ORCID.name = ORCID
log4j.appender.ORCID=org.apache.log4j.RollingFileAppender
log4j.appender.ORCID.File=/var/log/dnet/uoa-orcid-service/uoa-orcid-service-orcid.log
log4j.appender.ORCID.MaxFileSize=10MB
log4j.appender.ORCID.MaxBackupIndex=10
log4j.appender.ORCID.layout=org.apache.log4j.PatternLayout
log4j.appender.ORCID.layout.ConversionPattern= %d %p %t [%c] - %m%n

View File

@ -2,6 +2,12 @@
orcidservice.mongodb.host=localhost
orcidservice.mongodb.port=27017
orcidservice.mongodb.database=openaire_orcid
orcidservice.orcid.apiURL=https://api.sandbox.orcid.org/v3.0/
orcidservice.orcid.tokenURL=https://sandbox.orcid.org/oauth/token
orcidservice.orcid.clientId=APP-A5M3KTX6NCN67L91
orcidservice.orcid.clientSecret=96b20d71-ae06-4286-bb00-9172536c1ad4
#orcidservice.encryption.password=...
#beta