/** * Actualiza la posición del surfero. En caso de que el surfero entre o salga de una playa se * actualizara el estado de estas playas. * * @param surfer * @param latitude * @param longitude */ public static Session updateSurferLocation(Surfer surfer, double latitude, double longitude) { EntityManager em = entityManager(); Session session = null; if (!em.contains(surfer)) { throw new IllegalStateException("El surfero debe ser una untidad gestionada"); // Si no es gestionada no se reflejan los cambios!, asi que gestionala! // TODO esto podria cambiarse por un assert, improved production performance } // Location as a Point Point location = new Point(latitude, longitude); // Generate Geocells List<String> cells = GeocellManager.generateGeoCell(location); // Save instance surfer.setLatitude(latitude); surfer.setLongitude(longitude); surfer.setGeoCellsData(cells); // Se busca si la posicion forma parte de una playa Spot spot = SpotService.findSpotByLocation(latitude, longitude); Session actual = findActiveSession(surfer); // Esta el surfer en una playa? if (SessionService.hasActiveSession(surfer)) { // Ha salido o cambiado de playa el surfer? if (spot == null || spot.getId() != actual.getSpotId()) { SessionService.endSession(surfer); } } // Ha cambiado o entrado en una nueva playa? if (spot != null && (actual == null || spot.getId() != actual.getSpotId())) { session = SessionService.beginSession(surfer, spot); } return session; }
public static void remove(Surfer instance) { EntityManager em = entityManager(); Surfer attached = em.find(Surfer.class, instance.getId()); em.remove(attached); }