From ec214b7d3dd1970eeff4f1cca8730e4ee95cba70 Mon Sep 17 00:00:00 2001 From: Geoffrey Frogeye Date: Sun, 5 Feb 2017 01:47:39 +0100 Subject: [PATCH] Implémentation JSON : Sous objets --- .gitignore | 1 + src/main/java/etunicorn/BaseController.java | 47 ++++++++++++++++++++++++++++++++++++++++++----- src/main/java/etunicorn/NotEnoughDataException.java | 9 +++++++++ src/main/java/etunicorn/ObjectNotFoundException.java | 9 +++++++++ src/main/java/etunicorn/PersonneController.java | 4 ++++ src/main/java/etunicorn/generated/TransactionController.java | 42 +++++++++++++++++++++--------------------- src/main/java/etunicorn/generated/model/UpdateCreditRequest.java | 104 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/main/java/etunicorn/generated/model/UpdatePersonneRequest.java | 18 +++++++----------- 8 files changed, 197 insertions(+), 37 deletions(-) create mode 100644 src/main/java/etunicorn/NotEnoughDataException.java create mode 100644 src/main/java/etunicorn/ObjectNotFoundException.java create mode 100644 src/main/java/etunicorn/generated/model/UpdateCreditRequest.java diff --git a/.gitignore b/.gitignore index 1ad7e35..fb890aa 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,4 @@ demo*/ .idea/dictionaries/ etunicorn.db .idea/dataSources +!/src/main/java/etunicorn/NotEnoughtDataException.java diff --git a/src/main/java/etunicorn/BaseController.java b/src/main/java/etunicorn/BaseController.java index e650755..d21466f 100644 --- a/src/main/java/etunicorn/BaseController.java +++ b/src/main/java/etunicorn/BaseController.java @@ -3,14 +3,18 @@ package etunicorn; import com.fasterxml.jackson.annotation.JsonProperty; import net.minidev.json.JSONObject; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.repository.Repository; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.RestController; +import javax.persistence.Entity; import javax.servlet.http.HttpServletRequest; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; +import java.util.LinkedHashMap; +import java.util.Map; /** * etunicorn-server @@ -20,6 +24,9 @@ import java.lang.reflect.Method; @RestController public class BaseController { + // Utilités pour merger un request dans une entity + @Autowired + Map repositories; // Permettent la vérification de permissions dans les méthodes de controlleur @Autowired private HttpServletRequest request; @@ -66,12 +73,35 @@ public class BaseController { return generateError(HttpStatus.INTERNAL_SERVER_ERROR, exception, exception.getLocalizedMessage()); } - // Utilités pour merger un request dans une entity - void mergeRequestInEntity(Object request, Object entity) throws EntityRequestMismatchException { + protected Object getEntityFromObject(String className, LinkedHashMap object) throws NotEnoughDataException { + Object repository = repositories.get(className + "Repository"); + for (Method findMethod : repository.getClass().getMethods()) { + String findMethodName = findMethod.getName(); + if (findMethodName.startsWith("findBy")) { + String key = Character.toLowerCase(findMethodName.charAt(6)) + findMethodName.substring(7); + if (object.containsKey(key)) { + try { + Object data = object.get(key); + return findMethod.invoke(repository, data); + } catch (IllegalAccessException e) { + continue; + } catch (InvocationTargetException e) { + continue; + } + } else { + continue; + } + } + } + throw new NotEnoughDataException(); + } + + protected void mergeRequestInEntity(Object request, Object entity) throws EntityRequestMismatchException, NotEnoughDataException, ObjectNotFoundException { for (Method getMethode : request.getClass().getMethods()) { String getMethodName = getMethode.getName(); JsonProperty annotation = getMethode.getAnnotation(JsonProperty.class); if (getMethodName.startsWith("get") && annotation != null) { + String fieldName = annotation.value(); String setMethodName = "s" + getMethodName.substring(1); Method setMethode; Class fieldClass; @@ -85,9 +115,16 @@ public class BaseController { if (getMethode.invoke(request) != null) { Object data = getMethode.invoke(request); if (data.getClass() != fieldClass) { - Constructor constructor = fieldClass.getConstructor(data.getClass()); - if (constructor != null) { - data = constructor.newInstance(data); + if (fieldClass.getAnnotation(Entity.class) != null) { + data = getEntityFromObject(fieldName, (LinkedHashMap) data); + if (data == null) { + throw new ObjectNotFoundException(); + } + } else { + Constructor constructor = fieldClass.getConstructor(data.getClass()); + if (constructor != null) { + data = constructor.newInstance(data); + } } } setMethode.invoke(entity, data); diff --git a/src/main/java/etunicorn/NotEnoughDataException.java b/src/main/java/etunicorn/NotEnoughDataException.java new file mode 100644 index 0000000..9167e07 --- /dev/null +++ b/src/main/java/etunicorn/NotEnoughDataException.java @@ -0,0 +1,9 @@ +package etunicorn; + +/** + * etunicorn-server + * Copyright © 2017 Le Club Info Polytech Lille + * Tous droits réservés + */ +public class NotEnoughDataException extends Exception { +} diff --git a/src/main/java/etunicorn/ObjectNotFoundException.java b/src/main/java/etunicorn/ObjectNotFoundException.java new file mode 100644 index 0000000..e05149e --- /dev/null +++ b/src/main/java/etunicorn/ObjectNotFoundException.java @@ -0,0 +1,9 @@ +package etunicorn; + +/** + * etunicorn-server + * Copyright © 2017 Le Club Info Polytech Lille + * Tous droits réservés + */ +public class ObjectNotFoundException extends Exception { +} diff --git a/src/main/java/etunicorn/PersonneController.java b/src/main/java/etunicorn/PersonneController.java index f4c9228..66f27db 100644 --- a/src/main/java/etunicorn/PersonneController.java +++ b/src/main/java/etunicorn/PersonneController.java @@ -74,6 +74,10 @@ public class PersonneController extends BaseController implements etunicorn.gene mergeRequestInEntity(updatePersonneRequest, personne); } catch (EntityRequestMismatchException e) { return generateError(e); + } catch (NotEnoughDataException e) { + return generateError(HttpStatus.BAD_REQUEST, e, "Il n'y a pas suffisament de données pour identifier un sous-objet"); + } catch (ObjectNotFoundException e) { + return generateError(HttpStatus.NOT_FOUND, e, "Sous-objet non trouvé"); } return new ResponseEntity(personne, HttpStatus.CREATED); } diff --git a/src/main/java/etunicorn/generated/TransactionController.java b/src/main/java/etunicorn/generated/TransactionController.java index 1985da5..5ded9e6 100644 --- a/src/main/java/etunicorn/generated/TransactionController.java +++ b/src/main/java/etunicorn/generated/TransactionController.java @@ -2,7 +2,7 @@ package etunicorn.generated; import etunicorn.generated.model.UpdateConsommationRequest; -import etunicorn.generated.model.UpdateEvenementCreditRequest; +import etunicorn.generated.model.UpdateCreditRequest; import etunicorn.generated.model.UpdateEvenementRequest; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.PathVariable; @@ -26,54 +26,54 @@ public interface TransactionController { * */ @RequestMapping(value = "", method = RequestMethod.GET) - public ResponseEntity getTransaction(); + ResponseEntity getTransaction(); /** * Achat d'une consomation (id) par un participant à un acteur * */ @RequestMapping(value = "/consommation", method = RequestMethod.POST) - public ResponseEntity updateConsommation( - @javax.validation.Valid - @org.springframework.web.bind.annotation.RequestBody - UpdateConsommationRequest updateConsommationRequest); + ResponseEntity updateConsommation( + @javax.validation.Valid + @org.springframework.web.bind.annotation.RequestBody + UpdateConsommationRequest updateConsommationRequest); /** * No description * */ @RequestMapping(value = "/evenement", method = RequestMethod.POST) - public ResponseEntity updateEvenement( - @javax.validation.Valid - @org.springframework.web.bind.annotation.RequestBody - UpdateEvenementRequest updateEvenementRequest); + ResponseEntity updateEvenement( + @javax.validation.Valid + @org.springframework.web.bind.annotation.RequestBody + UpdateEvenementRequest updateEvenementRequest); /** * Permet de recharger ou debiter un compte * */ - @RequestMapping(value = "/evenement/credit", method = RequestMethod.POST) - public ResponseEntity updateEvenementCredit( - @javax.validation.Valid - @org.springframework.web.bind.annotation.RequestBody - UpdateEvenementCreditRequest updateEvenementCreditRequest); + @RequestMapping(value = "/credit", method = RequestMethod.POST) + ResponseEntity updateCredit( + @javax.validation.Valid + @org.springframework.web.bind.annotation.RequestBody + UpdateCreditRequest updateCreditRequest); /** * Permet de recuperer la liste des transaction d'une personne * */ @RequestMapping(value = "/{idPersonne}", method = RequestMethod.GET) - public ResponseEntity getTransactionByIdPersonne( - @PathVariable - Long idPersonne); + ResponseEntity getTransactionByIdPersonne( + @PathVariable + Long idPersonne); /** * Permet de recuperer la liste des transaction d'une personne * */ @RequestMapping(value = "/acteur/{idPersonne}", method = RequestMethod.GET) - public ResponseEntity getActeurByIdPersonne( - @PathVariable - Long idPersonne); + ResponseEntity getActeurByIdPersonne( + @PathVariable + Long idPersonne); } diff --git a/src/main/java/etunicorn/generated/model/UpdateCreditRequest.java b/src/main/java/etunicorn/generated/model/UpdateCreditRequest.java new file mode 100644 index 0000000..ee1c901 --- /dev/null +++ b/src/main/java/etunicorn/generated/model/UpdateCreditRequest.java @@ -0,0 +1,104 @@ + +package etunicorn.generated.model; + +import com.fasterxml.jackson.annotation.*; +import org.apache.commons.lang.builder.EqualsBuilder; +import org.apache.commons.lang.builder.HashCodeBuilder; +import org.apache.commons.lang.builder.ToStringBuilder; + +import java.util.HashMap; +import java.util.Map; + +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonPropertyOrder({ + "participant", + "prix" +}) +public class UpdateCreditRequest { + + /** + * (Required) + */ + @JsonProperty("participant") + private Object participant; + /** + * (Required) + */ + @JsonProperty("prix") + private Float prix; + @JsonIgnore + private Map additionalProperties = new HashMap(); + + /** + * (Required) + * + * @return The participant + */ + @JsonProperty("participant") + public Object getParticipant() { + return participant; + } + + /** + * (Required) + * + * @param participant The participant + */ + @JsonProperty("participant") + public void setParticipant(Object participant) { + this.participant = participant; + } + + /** + * (Required) + * + * @return The prix + */ + @JsonProperty("prix") + public Float getPrix() { + return prix; + } + + /** + * (Required) + * + * @param prix The prix + */ + @JsonProperty("prix") + public void setPrix(Float prix) { + this.prix = prix; + } + + @Override + public String toString() { + return ToStringBuilder.reflectionToString(this); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + @JsonAnySetter + public void setAdditionalProperty(String name, Object value) { + this.additionalProperties.put(name, value); + } + + @Override + public int hashCode() { + return new HashCodeBuilder().append(participant).append(prix).append(additionalProperties).toHashCode(); + } + + @Override + public boolean equals(Object other) { + if (other == this) { + return true; + } + if ((other instanceof UpdateCreditRequest) == false) { + return false; + } + UpdateCreditRequest rhs = ((UpdateCreditRequest) other); + return new EqualsBuilder().append(participant, rhs.participant).append(prix, rhs.prix).append(additionalProperties, rhs.additionalProperties).isEquals(); + } + +} diff --git a/src/main/java/etunicorn/generated/model/UpdatePersonneRequest.java b/src/main/java/etunicorn/generated/model/UpdatePersonneRequest.java index 4f404c6..dba1fc2 100644 --- a/src/main/java/etunicorn/generated/model/UpdatePersonneRequest.java +++ b/src/main/java/etunicorn/generated/model/UpdatePersonneRequest.java @@ -1,18 +1,14 @@ package etunicorn.generated.model; -import java.util.HashMap; -import java.util.Map; -import com.fasterxml.jackson.annotation.JsonAnyGetter; -import com.fasterxml.jackson.annotation.JsonAnySetter; -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import com.fasterxml.jackson.annotation.*; import org.apache.commons.lang.builder.EqualsBuilder; import org.apache.commons.lang.builder.HashCodeBuilder; import org.apache.commons.lang.builder.ToStringBuilder; +import java.util.HashMap; +import java.util.Map; + @JsonInclude(JsonInclude.Include.NON_NULL) @JsonPropertyOrder({ "carte", @@ -36,7 +32,7 @@ public class UpdatePersonneRequest { * */ @JsonProperty("login") - private Object login; + private String login; /** * */ @@ -91,7 +87,7 @@ public class UpdatePersonneRequest { * The login */ @JsonProperty("login") - public Object getLogin() { + public String getLogin() { return login; } @@ -101,7 +97,7 @@ public class UpdatePersonneRequest { * The login */ @JsonProperty("login") - public void setLogin(Object login) { + public void setLogin(String login) { this.login = login; } -- libgit2 0.21.2