package etunicorn; import com.fasterxml.jackson.annotation.JsonProperty; import net.minidev.json.JSONObject; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.RestController; import javax.servlet.http.HttpServletRequest; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; /** * etunicorn-server * Copyright © 2017 Le Club Info Polytech Lille * Tous droits réservés */ @RestController public class BaseController { // 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); } // 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()); } // Utilités pour merger un request dans une entity void mergeRequestInEntity(Object request, Object entity) throws EntityRequestMismatchException { for (Method getMethode : request.getClass().getMethods()) { String getMethodName = getMethode.getName(); JsonProperty annotation = getMethode.getAnnotation(JsonProperty.class); if (getMethodName.startsWith("get") && annotation != null) { 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) { Constructor constructor = fieldClass.getConstructor(data.getClass()); if (constructor != null) { data = constructor.newInstance(data); } } 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(); } } } } }