Blame view

src/main/java/etunicorn/controller/BaseController.java 6.35 KB
2f1f76a9   Geoffrey PREUD'HOMME   Mise sous packages
1
  package etunicorn.controller;
8f35fffd   Geoffrey PREUD'HOMME   Ajout de la sécurité
2
  
5596f9d9   Geoffrey PREUD'HOMME   Début de l'implém...
3
  import com.fasterxml.jackson.annotation.JsonProperty;
2f1f76a9   Geoffrey PREUD'HOMME   Mise sous packages
4
5
6
7
8
9
10
  import etunicorn.entity.Permission;
  import etunicorn.entity.Session;
  import etunicorn.exception.EntityRequestMismatchException;
  import etunicorn.exception.NotEnoughDataException;
  import etunicorn.exception.ObjectNotFoundException;
  import etunicorn.repository.PermissionRepository;
  import etunicorn.service.SessionService;
5596f9d9   Geoffrey PREUD'HOMME   Début de l'implém...
11
  import net.minidev.json.JSONObject;
8f35fffd   Geoffrey PREUD'HOMME   Ajout de la sécurité
12
  import org.springframework.beans.factory.annotation.Autowired;
ec214b7d   Geoffrey PREUD'HOMME   Implémentation JS...
13
  import org.springframework.data.repository.Repository;
5596f9d9   Geoffrey PREUD'HOMME   Début de l'implém...
14
15
  import org.springframework.http.HttpStatus;
  import org.springframework.http.ResponseEntity;
8f35fffd   Geoffrey PREUD'HOMME   Ajout de la sécurité
16
17
  import org.springframework.web.bind.annotation.RestController;
  
ec214b7d   Geoffrey PREUD'HOMME   Implémentation JS...
18
  import javax.persistence.Entity;
8f35fffd   Geoffrey PREUD'HOMME   Ajout de la sécurité
19
  import javax.servlet.http.HttpServletRequest;
5596f9d9   Geoffrey PREUD'HOMME   Début de l'implém...
20
21
22
  import java.lang.reflect.Constructor;
  import java.lang.reflect.InvocationTargetException;
  import java.lang.reflect.Method;
ec214b7d   Geoffrey PREUD'HOMME   Implémentation JS...
23
24
  import java.util.LinkedHashMap;
  import java.util.Map;
8f35fffd   Geoffrey PREUD'HOMME   Ajout de la sécurité
25
26
27
28
29
30
31
32
33
  
  /**
   * etunicorn-server
   * Copyright © 2017 Le Club Info Polytech Lille
   * Tous droits réservés
   */
  @RestController
  public class BaseController {
  
ec214b7d   Geoffrey PREUD'HOMME   Implémentation JS...
34
35
36
      // Utilités pour merger un request dans une entity
      @Autowired
      Map<String, Repository> repositories;
8f35fffd   Geoffrey PREUD'HOMME   Ajout de la sécurité
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
      // Permettent la vérification de permissions dans les méthodes de controlleur
      @Autowired
      private HttpServletRequest request;
      @Autowired
      private SessionService sessionService;
      @Autowired
      private PermissionRepository permissionRepository;
  
      protected boolean hasPermission(Permission permission) {
          Session session = sessionService.getSession(request);
          if (session == null || permission == null) {
              return false;
          }
          return session.hasPermission(permission);
      }
  
      protected boolean hasPermission(String nomPermission) {
          Permission permission = permissionRepository.findByNom(nomPermission);
          return hasPermission(permission);
      }
5596f9d9   Geoffrey PREUD'HOMME   Début de l'implém...
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
  
      // Utilités pour générer des erreurs
      ResponseEntity generateError(HttpStatus status, String message) {
          JSONObject json = new JSONObject();
          json.put("status", status.value());
          json.put("message", message);
          return new ResponseEntity(json, status);
      }
  
      ResponseEntity generateError(HttpStatus status) {
          return generateError(status, String.format("Erreur de type %d", status.value()));
      }
  
      ResponseEntity generateError(HttpStatus status, Exception exception, String message) {
          JSONObject json = new JSONObject();
          json.put("status", status.value());
          json.put("message", message);
          json.put("errorMessage", exception.getLocalizedMessage());
          json.put("stacktrace", exception.getStackTrace().toString());
          return new ResponseEntity(json, status);
      }
  
      ResponseEntity generateError(Exception exception) {
          return generateError(HttpStatus.INTERNAL_SERVER_ERROR, exception, exception.getLocalizedMessage());
      }
  
ec214b7d   Geoffrey PREUD'HOMME   Implémentation JS...
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
      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 {
5596f9d9   Geoffrey PREUD'HOMME   Début de l'implém...
107
108
109
110
          for (Method getMethode : request.getClass().getMethods()) {
              String getMethodName = getMethode.getName();
              JsonProperty annotation = getMethode.getAnnotation(JsonProperty.class);
              if (getMethodName.startsWith("get") && annotation != null) {
ec214b7d   Geoffrey PREUD'HOMME   Implémentation JS...
111
                  String fieldName = annotation.value();
5596f9d9   Geoffrey PREUD'HOMME   Début de l'implém...
112
113
114
115
116
117
118
119
120
121
122
123
124
                  String setMethodName = "s" + getMethodName.substring(1);
                  Method setMethode;
                  Class fieldClass;
                  try {
                      fieldClass = entity.getClass().getMethod(getMethodName).getReturnType();
                      setMethode = entity.getClass().getMethod(setMethodName, fieldClass);
                  } catch (NoSuchMethodException e) {
                      throw new EntityRequestMismatchException();
                  }
                  try {
                      if (getMethode.invoke(request) != null) {
                          Object data = getMethode.invoke(request);
                          if (data.getClass() != fieldClass) {
ec214b7d   Geoffrey PREUD'HOMME   Implémentation JS...
125
126
127
128
129
130
131
132
133
134
                              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);
                                  }
5596f9d9   Geoffrey PREUD'HOMME   Début de l'implém...
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
                              }
                          }
                          setMethode.invoke(entity, data);
                      }
                  } catch (IllegalAccessException e) {
                      throw new EntityRequestMismatchException();
                  } catch (InvocationTargetException e) {
                      throw new EntityRequestMismatchException();
                  } catch (NoSuchMethodException e) {
                      throw new EntityRequestMismatchException();
                  } catch (InstantiationException e) {
                      throw new EntityRequestMismatchException();
                  }
              }
  
          }
      }
8f35fffd   Geoffrey PREUD'HOMME   Ajout de la sécurité
152
  }