Java tutorial
/* * Copyright 2011, MyCellar * * This file is part of MyCellar. * * MyCellar is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * MyCellar is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with MyCellar. If not, see <http://www.gnu.org/licenses/>. */ package fr.mycellar.application.user.impl; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.security.SecureRandom; import javax.inject.Inject; import javax.inject.Named; import javax.inject.Singleton; import javax.mail.internet.MimeMessage; import jpasearch.repository.query.builder.SearchBuilder; import org.jasypt.contrib.org.apache.commons.codec_1_3.binary.Base64; import org.joda.time.LocalDateTime; import org.springframework.mail.javamail.JavaMailSender; import org.springframework.mail.javamail.MimeMessageHelper; import org.springframework.mail.javamail.MimeMessagePreparator; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.transaction.annotation.Transactional; import fr.mycellar.application.admin.ConfigurationService; import fr.mycellar.application.shared.AbstractSimpleService; import fr.mycellar.application.user.ResetPasswordRequestService; import fr.mycellar.domain.shared.exception.BusinessError; import fr.mycellar.domain.shared.exception.BusinessException; import fr.mycellar.domain.user.ResetPasswordRequest; import fr.mycellar.domain.user.ResetPasswordRequest_; import fr.mycellar.domain.user.User; import fr.mycellar.infrastructure.user.repository.ResetPasswordRequestRepository; /** * @author speralta */ @Named @Singleton public class ResetPasswordRequestServiceImpl extends AbstractSimpleService<ResetPasswordRequest, ResetPasswordRequestRepository> implements ResetPasswordRequestService { private static SecureRandom secureRandom = new SecureRandom(); private ResetPasswordRequestRepository resetPasswordRequestRepository; private ConfigurationService configurationService; private JavaMailSender javaMailSender; @Override @Scheduled(cron = "0 0 0 * * *") @Transactional public void cleanOldRequests() { resetPasswordRequestRepository.deleteOldRequests(); } @Override public void createAndSendEmail(User user, String url) { // Create request ResetPasswordRequest request = new ResetPasswordRequest(); request.setDateTime(new LocalDateTime()); request.setKey(new String(Base64.encodeBase64(secureRandom.generateSeed(128), false)).substring(0, 32)); request.setUser(user); // Merge it in repository resetPasswordRequestRepository.save(request); // Send email to email final String email = user.getEmail(); final String address; try { address = url + "?key=" + URLEncoder.encode(request.getKey(), "UTF-8"); } catch (UnsupportedEncodingException e) { throw new RuntimeException("UTF-8 encoding not supported.", e); } MimeMessagePreparator mimeMessagePreparator = new MimeMessagePreparator() { @Override public void prepare(MimeMessage mimeMessage) throws Exception { MimeMessageHelper helper = new MimeMessageHelper(mimeMessage); helper.setTo(email); helper.setFrom(configurationService.getMailAddressSender()); helper.setSubject("Changement de mot de passe"); helper.setText("Allez l'adresse suivante : " + address); } }; try { javaMailSender.send(mimeMessagePreparator); } catch (Exception e) { throw new RuntimeException("Cannot send email.", e); } } @Override public ResetPasswordRequest getByKey(String key) { ResetPasswordRequest request = resetPasswordRequestRepository.findUniqueOrNone( // new SearchBuilder<ResetPasswordRequest>() // .on(ResetPasswordRequest_.key).equalsTo(key).build()); return (request != null) && request.getDateTime().isAfter(new LocalDateTime().minusHours(1)) ? request : null; } @Override public void deleteAllForUser(User user) { resetPasswordRequestRepository.deleteAllForUser(user); } @Override public String getEmailFromResetPasswordRequestByKey(String key) throws BusinessException { ResetPasswordRequest request = getByKey(key); if (request == null) { throw new BusinessException(BusinessError.RESETPASSWORDREQUEST_00001); } return request.getUser().getEmail(); } @Override public void validate(ResetPasswordRequest entity) throws BusinessException { } @Override protected ResetPasswordRequestRepository getRepository() { return resetPasswordRequestRepository; } @Inject public void setResetPasswordRequestRepository(ResetPasswordRequestRepository resetPasswordRequestRepository) { this.resetPasswordRequestRepository = resetPasswordRequestRepository; } @Inject public void setJavaMailSender(JavaMailSender javaMailSender) { this.javaMailSender = javaMailSender; } @Inject public void setConfigurationService(ConfigurationService configurationService) { this.configurationService = configurationService; } }