Commit ec214b7d3dd1970eeff4f1cca8730e4ee95cba70

Authored by Geoffrey PREUD'HOMME
1 parent f85d84b0

Implémentation JSON : Sous objets

.gitignore
... ... @@ -9,3 +9,4 @@ demo*/
9 9 .idea/dictionaries/
10 10 etunicorn.db
11 11 .idea/dataSources
  12 +!/src/main/java/etunicorn/NotEnoughtDataException.java
... ...
src/main/java/etunicorn/BaseController.java
... ... @@ -3,14 +3,18 @@ package etunicorn;
3 3 import com.fasterxml.jackson.annotation.JsonProperty;
4 4 import net.minidev.json.JSONObject;
5 5 import org.springframework.beans.factory.annotation.Autowired;
  6 +import org.springframework.data.repository.Repository;
6 7 import org.springframework.http.HttpStatus;
7 8 import org.springframework.http.ResponseEntity;
8 9 import org.springframework.web.bind.annotation.RestController;
9 10  
  11 +import javax.persistence.Entity;
10 12 import javax.servlet.http.HttpServletRequest;
11 13 import java.lang.reflect.Constructor;
12 14 import java.lang.reflect.InvocationTargetException;
13 15 import java.lang.reflect.Method;
  16 +import java.util.LinkedHashMap;
  17 +import java.util.Map;
14 18  
15 19 /**
16 20 * etunicorn-server
... ... @@ -20,6 +24,9 @@ import java.lang.reflect.Method;
20 24 @RestController
21 25 public class BaseController {
22 26  
  27 + // Utilités pour merger un request dans une entity
  28 + @Autowired
  29 + Map<String, Repository> repositories;
23 30 // Permettent la vérification de permissions dans les méthodes de controlleur
24 31 @Autowired
25 32 private HttpServletRequest request;
... ... @@ -66,12 +73,35 @@ public class BaseController {
66 73 return generateError(HttpStatus.INTERNAL_SERVER_ERROR, exception, exception.getLocalizedMessage());
67 74 }
68 75  
69   - // Utilités pour merger un request dans une entity
70   - void mergeRequestInEntity(Object request, Object entity) throws EntityRequestMismatchException {
  76 + protected Object getEntityFromObject(String className, LinkedHashMap object) throws NotEnoughDataException {
  77 + Object repository = repositories.get(className + "Repository");
  78 + for (Method findMethod : repository.getClass().getMethods()) {
  79 + String findMethodName = findMethod.getName();
  80 + if (findMethodName.startsWith("findBy")) {
  81 + String key = Character.toLowerCase(findMethodName.charAt(6)) + findMethodName.substring(7);
  82 + if (object.containsKey(key)) {
  83 + try {
  84 + Object data = object.get(key);
  85 + return findMethod.invoke(repository, data);
  86 + } catch (IllegalAccessException e) {
  87 + continue;
  88 + } catch (InvocationTargetException e) {
  89 + continue;
  90 + }
  91 + } else {
  92 + continue;
  93 + }
  94 + }
  95 + }
  96 + throw new NotEnoughDataException();
  97 + }
  98 +
  99 + protected void mergeRequestInEntity(Object request, Object entity) throws EntityRequestMismatchException, NotEnoughDataException, ObjectNotFoundException {
71 100 for (Method getMethode : request.getClass().getMethods()) {
72 101 String getMethodName = getMethode.getName();
73 102 JsonProperty annotation = getMethode.getAnnotation(JsonProperty.class);
74 103 if (getMethodName.startsWith("get") && annotation != null) {
  104 + String fieldName = annotation.value();
75 105 String setMethodName = "s" + getMethodName.substring(1);
76 106 Method setMethode;
77 107 Class fieldClass;
... ... @@ -85,9 +115,16 @@ public class BaseController {
85 115 if (getMethode.invoke(request) != null) {
86 116 Object data = getMethode.invoke(request);
87 117 if (data.getClass() != fieldClass) {
88   - Constructor constructor = fieldClass.getConstructor(data.getClass());
89   - if (constructor != null) {
90   - data = constructor.newInstance(data);
  118 + if (fieldClass.getAnnotation(Entity.class) != null) {
  119 + data = getEntityFromObject(fieldName, (LinkedHashMap) data);
  120 + if (data == null) {
  121 + throw new ObjectNotFoundException();
  122 + }
  123 + } else {
  124 + Constructor constructor = fieldClass.getConstructor(data.getClass());
  125 + if (constructor != null) {
  126 + data = constructor.newInstance(data);
  127 + }
91 128 }
92 129 }
93 130 setMethode.invoke(entity, data);
... ...
src/main/java/etunicorn/NotEnoughDataException.java 0 → 100644
... ... @@ -0,0 +1,9 @@
  1 +package etunicorn;
  2 +
  3 +/**
  4 + * etunicorn-server
  5 + * Copyright © 2017 Le Club Info Polytech Lille
  6 + * Tous droits réservés
  7 + */
  8 +public class NotEnoughDataException extends Exception {
  9 +}
... ...
src/main/java/etunicorn/ObjectNotFoundException.java 0 → 100644
... ... @@ -0,0 +1,9 @@
  1 +package etunicorn;
  2 +
  3 +/**
  4 + * etunicorn-server
  5 + * Copyright © 2017 Le Club Info Polytech Lille
  6 + * Tous droits réservés
  7 + */
  8 +public class ObjectNotFoundException extends Exception {
  9 +}
... ...
src/main/java/etunicorn/PersonneController.java
... ... @@ -74,6 +74,10 @@ public class PersonneController extends BaseController implements etunicorn.gene
74 74 mergeRequestInEntity(updatePersonneRequest, personne);
75 75 } catch (EntityRequestMismatchException e) {
76 76 return generateError(e);
  77 + } catch (NotEnoughDataException e) {
  78 + return generateError(HttpStatus.BAD_REQUEST, e, "Il n'y a pas suffisament de données pour identifier un sous-objet");
  79 + } catch (ObjectNotFoundException e) {
  80 + return generateError(HttpStatus.NOT_FOUND, e, "Sous-objet non trouvé");
77 81 }
78 82 return new ResponseEntity<Object>(personne, HttpStatus.CREATED);
79 83 }
... ...
src/main/java/etunicorn/generated/TransactionController.java
... ... @@ -2,7 +2,7 @@
2 2 package etunicorn.generated;
3 3  
4 4 import etunicorn.generated.model.UpdateConsommationRequest;
5   -import etunicorn.generated.model.UpdateEvenementCreditRequest;
  5 +import etunicorn.generated.model.UpdateCreditRequest;
6 6 import etunicorn.generated.model.UpdateEvenementRequest;
7 7 import org.springframework.http.ResponseEntity;
8 8 import org.springframework.web.bind.annotation.PathVariable;
... ... @@ -26,54 +26,54 @@ public interface TransactionController {
26 26 *
27 27 */
28 28 @RequestMapping(value = "", method = RequestMethod.GET)
29   - public ResponseEntity<?> getTransaction();
  29 + ResponseEntity<?> getTransaction();
30 30  
31 31 /**
32 32 * Achat d'une consomation (id) par un participant à un acteur
33 33 *
34 34 */
35 35 @RequestMapping(value = "/consommation", method = RequestMethod.POST)
36   - public ResponseEntity<?> updateConsommation(
37   - @javax.validation.Valid
38   - @org.springframework.web.bind.annotation.RequestBody
39   - UpdateConsommationRequest updateConsommationRequest);
  36 + ResponseEntity<?> updateConsommation(
  37 + @javax.validation.Valid
  38 + @org.springframework.web.bind.annotation.RequestBody
  39 + UpdateConsommationRequest updateConsommationRequest);
40 40  
41 41 /**
42 42 * No description
43 43 *
44 44 */
45 45 @RequestMapping(value = "/evenement", method = RequestMethod.POST)
46   - public ResponseEntity<?> updateEvenement(
47   - @javax.validation.Valid
48   - @org.springframework.web.bind.annotation.RequestBody
49   - UpdateEvenementRequest updateEvenementRequest);
  46 + ResponseEntity<?> updateEvenement(
  47 + @javax.validation.Valid
  48 + @org.springframework.web.bind.annotation.RequestBody
  49 + UpdateEvenementRequest updateEvenementRequest);
50 50  
51 51 /**
52 52 * Permet de recharger ou debiter un compte
53 53 *
54 54 */
55   - @RequestMapping(value = "/evenement/credit", method = RequestMethod.POST)
56   - public ResponseEntity<?> updateEvenementCredit(
57   - @javax.validation.Valid
58   - @org.springframework.web.bind.annotation.RequestBody
59   - UpdateEvenementCreditRequest updateEvenementCreditRequest);
  55 + @RequestMapping(value = "/credit", method = RequestMethod.POST)
  56 + ResponseEntity<?> updateCredit(
  57 + @javax.validation.Valid
  58 + @org.springframework.web.bind.annotation.RequestBody
  59 + UpdateCreditRequest updateCreditRequest);
60 60  
61 61 /**
62 62 * Permet de recuperer la liste des transaction d'une personne
63 63 *
64 64 */
65 65 @RequestMapping(value = "/{idPersonne}", method = RequestMethod.GET)
66   - public ResponseEntity<?> getTransactionByIdPersonne(
67   - @PathVariable
68   - Long idPersonne);
  66 + ResponseEntity<?> getTransactionByIdPersonne(
  67 + @PathVariable
  68 + Long idPersonne);
69 69  
70 70 /**
71 71 * Permet de recuperer la liste des transaction d'une personne
72 72 *
73 73 */
74 74 @RequestMapping(value = "/acteur/{idPersonne}", method = RequestMethod.GET)
75   - public ResponseEntity<?> getActeurByIdPersonne(
76   - @PathVariable
77   - Long idPersonne);
  75 + ResponseEntity<?> getActeurByIdPersonne(
  76 + @PathVariable
  77 + Long idPersonne);
78 78  
79 79 }
... ...
src/main/java/etunicorn/generated/model/UpdateCreditRequest.java 0 → 100644
... ... @@ -0,0 +1,104 @@
  1 +
  2 +package etunicorn.generated.model;
  3 +
  4 +import com.fasterxml.jackson.annotation.*;
  5 +import org.apache.commons.lang.builder.EqualsBuilder;
  6 +import org.apache.commons.lang.builder.HashCodeBuilder;
  7 +import org.apache.commons.lang.builder.ToStringBuilder;
  8 +
  9 +import java.util.HashMap;
  10 +import java.util.Map;
  11 +
  12 +@JsonInclude(JsonInclude.Include.NON_NULL)
  13 +@JsonPropertyOrder({
  14 + "participant",
  15 + "prix"
  16 +})
  17 +public class UpdateCreditRequest {
  18 +
  19 + /**
  20 + * (Required)
  21 + */
  22 + @JsonProperty("participant")
  23 + private Object participant;
  24 + /**
  25 + * (Required)
  26 + */
  27 + @JsonProperty("prix")
  28 + private Float prix;
  29 + @JsonIgnore
  30 + private Map<String, Object> additionalProperties = new HashMap<String, Object>();
  31 +
  32 + /**
  33 + * (Required)
  34 + *
  35 + * @return The participant
  36 + */
  37 + @JsonProperty("participant")
  38 + public Object getParticipant() {
  39 + return participant;
  40 + }
  41 +
  42 + /**
  43 + * (Required)
  44 + *
  45 + * @param participant The participant
  46 + */
  47 + @JsonProperty("participant")
  48 + public void setParticipant(Object participant) {
  49 + this.participant = participant;
  50 + }
  51 +
  52 + /**
  53 + * (Required)
  54 + *
  55 + * @return The prix
  56 + */
  57 + @JsonProperty("prix")
  58 + public Float getPrix() {
  59 + return prix;
  60 + }
  61 +
  62 + /**
  63 + * (Required)
  64 + *
  65 + * @param prix The prix
  66 + */
  67 + @JsonProperty("prix")
  68 + public void setPrix(Float prix) {
  69 + this.prix = prix;
  70 + }
  71 +
  72 + @Override
  73 + public String toString() {
  74 + return ToStringBuilder.reflectionToString(this);
  75 + }
  76 +
  77 + @JsonAnyGetter
  78 + public Map<String, Object> getAdditionalProperties() {
  79 + return this.additionalProperties;
  80 + }
  81 +
  82 + @JsonAnySetter
  83 + public void setAdditionalProperty(String name, Object value) {
  84 + this.additionalProperties.put(name, value);
  85 + }
  86 +
  87 + @Override
  88 + public int hashCode() {
  89 + return new HashCodeBuilder().append(participant).append(prix).append(additionalProperties).toHashCode();
  90 + }
  91 +
  92 + @Override
  93 + public boolean equals(Object other) {
  94 + if (other == this) {
  95 + return true;
  96 + }
  97 + if ((other instanceof UpdateCreditRequest) == false) {
  98 + return false;
  99 + }
  100 + UpdateCreditRequest rhs = ((UpdateCreditRequest) other);
  101 + return new EqualsBuilder().append(participant, rhs.participant).append(prix, rhs.prix).append(additionalProperties, rhs.additionalProperties).isEquals();
  102 + }
  103 +
  104 +}
... ...
src/main/java/etunicorn/generated/model/UpdatePersonneRequest.java
1 1  
2 2 package etunicorn.generated.model;
3 3  
4   -import java.util.HashMap;
5   -import java.util.Map;
6   -import com.fasterxml.jackson.annotation.JsonAnyGetter;
7   -import com.fasterxml.jackson.annotation.JsonAnySetter;
8   -import com.fasterxml.jackson.annotation.JsonIgnore;
9   -import com.fasterxml.jackson.annotation.JsonInclude;
10   -import com.fasterxml.jackson.annotation.JsonProperty;
11   -import com.fasterxml.jackson.annotation.JsonPropertyOrder;
  4 +import com.fasterxml.jackson.annotation.*;
12 5 import org.apache.commons.lang.builder.EqualsBuilder;
13 6 import org.apache.commons.lang.builder.HashCodeBuilder;
14 7 import org.apache.commons.lang.builder.ToStringBuilder;
15 8  
  9 +import java.util.HashMap;
  10 +import java.util.Map;
  11 +
16 12 @JsonInclude(JsonInclude.Include.NON_NULL)
17 13 @JsonPropertyOrder({
18 14 "carte",
... ... @@ -36,7 +32,7 @@ public class UpdatePersonneRequest {
36 32 *
37 33 */
38 34 @JsonProperty("login")
39   - private Object login;
  35 + private String login;
40 36 /**
41 37 *
42 38 */
... ... @@ -91,7 +87,7 @@ public class UpdatePersonneRequest {
91 87 * The login
92 88 */
93 89 @JsonProperty("login")
94   - public Object getLogin() {
  90 + public String getLogin() {
95 91 return login;
96 92 }
97 93  
... ... @@ -101,7 +97,7 @@ public class UpdatePersonneRequest {
101 97 * The login
102 98 */
103 99 @JsonProperty("login")
104   - public void setLogin(Object login) {
  100 + public void setLogin(String login) {
105 101 this.login = login;
106 102 }
107 103  
... ...