Example usage for org.apache.commons.lang3.time DateUtils addDays

List of usage examples for org.apache.commons.lang3.time DateUtils addDays

Introduction

In this page you can find the example usage for org.apache.commons.lang3.time DateUtils addDays.

Prototype

public static Date addDays(final Date date, final int amount) 

Source Link

Document

Adds a number of days to a date returning a new object.

Usage

From source file:io.lavagna.service.StatisticsServiceTest.java

@Before
public void prepare() {
    Helper.createUser(userRepository, "test", "test-user");
    user = userRepository.findUserByName("test", "test-user");
    Project p = projectService.create("test", "TEST", "desc");
    board = boardRepository.createNewBoard("test-board", "TEST-BRD", null, p.getId());
    List<BoardColumnDefinition> definitions = projectService
            .findColumnDefinitionsByProjectId(projectService.findByShortName("TEST").getId());

    for (BoardColumnDefinition def : definitions) {
        if (def.getValue() == ColumnDefinition.OPEN) {
            openCol = boardColumnRepository.addColumnToBoard("col1", def.getId(),
                    BoardColumn.BoardColumnLocation.BOARD, board.getId());
        }//from w  w  w  .jav a 2s  .  c  o  m
    }

    today = DateUtils.truncate(new Date(), Calendar.DATE);
    yesterday = DateUtils.addDays(today, -1);
    oneMonthAgo = DateUtils.addMonths(today, -1);

    lastSnapshot = DateUtils.addYears(today, -10);

    card = cardService.createCard("card1", openCol.getId(), today, user);

    assigned = cardLabelRepository.findLabelByName(p.getId(), "ASSIGNED", CardLabel.LabelDomain.SYSTEM);
    customLabel = cardLabelRepository.addLabel(p.getId(), true, CardLabel.LabelType.USER,
            CardLabel.LabelDomain.USER, "Custom label", 0);
    labelValueToUser = new CardLabelValue.LabelValue(null, null, null, null, user.getId(), null);
}

From source file:io.lavagna.web.api.UserController.java

@RequestMapping(value = "/api/user/activity/{provider}/{name}", method = RequestMethod.GET)
public List<Event> getUserActivity(@PathVariable("provider") String provider, @PathVariable("name") String name,
        UserWithPermission currentUser) {

    User user = userRepository.findUserByName(provider, name);

    Date lastWeek = DateUtils.setMinutes(DateUtils.setHours(DateUtils.addDays(new Date(), -6), 0), 0);
    if (currentUser.getBasePermissions().containsKey(Permission.READ)) {
        return eventRepository.getLatestActivity(user.getId(), lastWeek);
    } else {//from w w w  .  ja va  2s  .c  o m
        Collection<Integer> visibleProjectsIds = currentUser.projectsIdWithPermission(Permission.READ);
        return eventRepository.getLatestActivityByProjects(user.getId(), lastWeek, visibleProjectsIds);
    }

}

From source file:com.ibm.watson.developer_cloud.dialog.v1.DialogServiceIT.java

/**
 * Test create conversation.//from  www  .ja v  a  2 s  . c o  m
 * 
 * @throws ParseException the parse exception
 * @throws InterruptedException the interrupted exception
 */
@Test
public void testConverseAndGetConversationData() throws ParseException, InterruptedException {
    Conversation c = service.createConversation(dialogId).execute();
    testConversation(c);
    final String[] messages = new String[] { "large", "onions, pepperoni, cheese", "pickup", "yes" };
    for (final String message : messages) {
        c = service.converse(c, message).execute();
        testConversation(c);
        Thread.sleep(500);
    }

    final List<DialogContent> dialogContent = service.getContent(dialogId).execute();
    assertNotNull(dialogContent);
    assertFalse(dialogContent.isEmpty());
    assertNotNull(dialogContent.get(0));

    Map<String, String> profile = service.getProfile(dialogId, c.getClientId()).execute();

    // update profile
    String variable = profile.keySet().iterator().next();
    profile.put(variable, "foo");
    service.updateProfile(dialogId, c.getClientId(), profile).execute();

    assertEquals(service.getProfile(dialogId, c.getClientId()).execute().get(variable), "foo");
    assertEquals(service.getProfile(dialogId, c.getClientId(), variable).execute().get(variable), "foo");

    ConversationDataOptions options = new ConversationDataOptions.Builder()
            .from(DateUtils.addDays(new Date(), -10)).to(new Date()).dialogId(dialogId).offset(0).limit(10)
            .build();

    List<ConversationData> data = service.getConversationData(options).execute();
    assertNotNull(data);
    assertFalse(data.isEmpty());
}

From source file:com.epam.ta.reportportal.core.job.BaseInterruptTest.java

protected TestItem prepareTestItem(Launch launch) {
    String randomPart = RandomStringUtils.randomAlphabetic(5);

    TestItem item = new TestItem();
    item.setId(ObjectId.get().toString());
    item.setStartTime(DateUtils.addDays(Calendar.getInstance().getTime(), -1));
    item.setName("testItem".concat(randomPart));
    item.setLaunchRef(launch.getId());//from w w w.jav a2s  .  c o  m
    item.setStatus(Status.IN_PROGRESS);
    item.setLastModified(DateUtils.addDays(Calendar.getInstance().getTime(), -1));
    item.setStatistics(new Statistics(new ExecutionCounter(), new IssueCounter()));
    item.setType(TestItemType.TEST);

    return item;
}

From source file:io.lavagna.service.EventRepositoryTest.java

@Test
public void testLastUpdateOnCardChange() {
    assertTrue(cardDataService.findAllCommentsByCardId(card1.getId()).isEmpty());
    assertTrue(cardDataRepo.findCountsByBoardIdAndLocation(board.getId(), BoardColumnLocation.BOARD).isEmpty());

    Date now = new Date();
    Date oneDayAgo = DateUtils.addDays(now, -1);

    // simulate CardDataService here
    CardData commentOld = cardDataRepo.createData(card1.getId(), CardType.COMMENT, "test-comment-old");
    eventRepository.insertCardDataEvent(commentOld.getId(), card1.getId(), EventType.COMMENT_CREATE,
            userAlt.getId(), commentOld.getId(), oneDayAgo);

    CardFull cardBeforeUpdate = cardRepository.findFullBy(card1.getId());
    assertEquals(userAlt.getId(), cardBeforeUpdate.getLastUpdateUserId());

    CardData comment = cardDataRepo.createData(card1.getId(), CardType.COMMENT, "test-comment");
    eventRepository.insertCardDataEvent(comment.getId(), card1.getId(), EventType.COMMENT_CREATE, user.getId(),
            comment.getId(), now);//from w ww.  ja  va2s .co  m

    assertEquals(2, cardDataService.findAllCommentsByCardId(card1.getId()).size());

    CardFull cardAfterUpdate = cardRepository.findFullBy(card1.getId());

    assertEquals(user.getId(), cardAfterUpdate.getLastUpdateUserId());
    assertTrue(cardAfterUpdate.getLastUpdateTime().after(cardBeforeUpdate.getLastUpdateTime()));
}

From source file:alfio.manager.FileUploadManager.java

public void cleanupUnreferencedBlobFiles() {
    int deleted = repository.cleanupUnreferencedBlobFiles(DateUtils.addDays(new Date(), -1));
    log.debug("removed {} unused file_blob", deleted);
}

From source file:com.inkubator.hrm.service.impl.ApprovalActivityNotSendListenerServiceImpl.java

public void sendNotificationApprovalNotSend() throws Exception {
    LOGGER.warn("Proses krim approval activiei karena schcedullerrerere");
    List<ApprovalActivity> dataToSend = approvalActivityDao.getDataNotSendEmailYet();
    for (ApprovalActivity appActivity : dataToSend) {
        Date deadline = DateUtils.addDays(appActivity.getCreatedTime(),
                appActivity.getApprovalDefinition().getDelayTime());
        SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MMMM-yyyy", new Locale(appActivity.getLocale()));
        JsonObject jsonObject = (JsonObject) jsonConverter.getClassFromJson(appActivity.getPendingData(),
                JsonObject.class);
        HrmUser approverUser = hrmUserDao.getByUserId(appActivity.getApprovedBy());
        HrmUser requesterUser = hrmUserDao.getByUserId(appActivity.getRequestBy());
        VelocityTempalteModel vtm = new VelocityTempalteModel();
        List<String> toSend = new ArrayList<>();
        List<String> toSentCC = new ArrayList<String>();
        List<String> toSentBCC = new ArrayList<String>();
        vtm.setFrom(ownerEmail);//from w  w w  .ja v  a  2 s . co m
        /*if(appActivity.getApprovalStatus() == HRMConstant.APPROVAL_STATUS_WAITING) {
         //kirim email ke approver nya jika status waiting
         toSend.add(approverUser.getEmailAddress()); 
         } else {
         //kirim email ke requester nya jika statusnya sudah di approved/rejected. Dan cc email (if any)
                 
         toSentCC = getCcEmailAddressesOnApproveOrReject(appActivity);
         toSend.add(requesterUser.getEmailAddress());
         }
         }*/
        //            toSend.add("deni.arianto24@yahoo.com");
        //            toSentCC.add("amjadicky@gmail.com");
        toSend.add("rizal2_dhfr@yahoo.com");
        //            toSentCC.add("rizkykojek@gmail.com");
        vtm.setTo(toSend.toArray(new String[toSend.size()]));
        vtm.setCc(toSentCC.toArray(new String[toSentCC.size()]));
        vtm.setBcc(toSentBCC.toArray(new String[toSentBCC.size()]));

        Map maptoSend = new HashMap();
        if (StringUtils.equals(appActivity.getLocale(), "en")) {
            vtm.setSubject("Permohonan Perjalanan Dinas");
            //not yet implemented

        } else {
            if (Objects.equals(appActivity.getApprovalStatus(), HRMConstant.APPROVAL_STATUS_WAITING_APPROVAL)) {

                switch (appActivity.getApprovalDefinition().getName()) {
                case HRMConstant.BUSINESS_TRAVEL:
                    double totalAmount = 0;
                    Gson gson = JsonUtil.getHibernateEntityGsonBuilder().create();
                    //                            String pendingData = appActivity.getPendingData();

                    JsonObject businessTravelObj = gson.fromJson(appActivity.getPendingData(),
                            JsonObject.class);
                    List<BusinessTravelComponent> businessTravelComponents = gson.fromJson(
                            businessTravelObj.get("businessTravelComponents"),
                            new TypeToken<List<BusinessTravelComponent>>() {
                            }.getType());
                    for (BusinessTravelComponent btc : businessTravelComponents) {
                        totalAmount = totalAmount + btc.getPayByAmount();
                    }
                    vtm.setSubject("Permohonan Perjalanan Dinas");
                    vtm.setTemplatePath("email_travel_waiting_approval.vm");
                    maptoSend.put("approverName", approverUser.getEmpData().getBioData().getFullName());
                    maptoSend.put("requesterName", requesterUser.getEmpData().getBioData().getFullName());
                    maptoSend.put("nik", requesterUser.getEmpData().getNik());
                    maptoSend.put("businessTravelNo", jsonObject.get("businessTravelNo").getAsString());
                    maptoSend.put("proposeDate", jsonObject.get("proposeDate").getAsString());
                    maptoSend.put("destination", jsonObject.get("destination").getAsString());
                    maptoSend.put("start", jsonObject.get("startDate").getAsString());
                    maptoSend.put("end", jsonObject.get("endDate").getAsString());
                    maptoSend.put("description", jsonObject.get("description").getAsString());
                    maptoSend.put("totalAmount", new DecimalFormat("###,###").format(totalAmount));

                    break;

                case HRMConstant.REIMBURSEMENT:
                    vtm.setSubject("Permohonan Penggantian Biaya");
                    vtm.setTemplatePath("email_reimbursment_waiting_approval.vm");
                    maptoSend.put("approverName", approverUser.getEmpData().getBioData().getFullName());
                    maptoSend.put("requesterName", requesterUser.getEmpData().getBioData().getFullName());
                    maptoSend.put("nik", requesterUser.getEmpData().getNik());
                    Gson gs = JsonUtil.getHibernateEntityGsonBuilder().create();
                    RmbsApplication application = gs.fromJson(appActivity.getPendingData(),
                            RmbsApplication.class);
                    RmbsType rmbsType = rmbsTypeDao.getEntiyByPK(application.getRmbsType().getId());
                    maptoSend.put("reimbursementType", rmbsType.getName());
                    maptoSend.put("applicationDate", jsonObject.get("applicationDate").getAsString());
                    maptoSend.put("nominal", jsonObject.get("nominal").getAsString());
                    maptoSend.put("applicationDate", jsonObject.get("applicationDate").getAsString());
                    maptoSend.put("proposeDate", jsonObject.get("createdOn").getAsString());
                    maptoSend.put("deadline", dateFormat.format(deadline));
                    //                            maptoSend.put("urlLinkToApprove", jsonObject.get(HRMConstant.CONTEXT_PATH).getAsString() + "" + HRMConstant.REIMBURSMENT_APPROVAL_PAGE + "" + "?faces-redirect=true&execution=e" + appActivity.getId());
                    break;

                case HRMConstant.LOAN:
                    vtm.setSubject("Permohonan Pinjaman Lunak");
                    vtm.setTemplatePath("email_loan_waiting_approval.vm");
                    maptoSend.put("approverName", approverUser.getEmpData().getBioData().getFullName());
                    maptoSend.put("requesterName", requesterUser.getEmpData().getBioData().getFullName());
                    maptoSend.put("nik", requesterUser.getEmpData().getNik());
                    maptoSend.put("proposeDate", jsonObject.get("proposeDate").getAsString());
                    maptoSend.put("loanSchemaName", jsonObject.get("loanSchemaName").getAsString());
                    maptoSend.put("nominalPrincipal", jsonObject.get("nominalPrincipal").getAsString());
                    maptoSend.put("interestRate", jsonObject.get("interestRate").getAsString());
                    maptoSend.put("nominalInstallment", jsonObject.get("nominalInstallment").getAsString());
                    maptoSend.put("interestInstallment", jsonObject.get("interestInstallment").getAsString());
                    maptoSend.put("totalNominalInstallment",
                            jsonObject.get("totalNominalInstallment").getAsString());
                    break;

                default:
                    break;
                }
            } else if ((appActivity.getApprovalStatus() == HRMConstant.APPROVAL_STATUS_APPROVED)
                    || (appActivity.getApprovalStatus() == HRMConstant.APPROVAL_STATUS_REJECTED)) {
                //configure email parameter based on approval name   
                switch (appActivity.getApprovalDefinition().getName()) {
                case HRMConstant.BUSINESS_TRAVEL:
                    double totalAmount = 0;
                    Gson gson = JsonUtil.getHibernateEntityGsonBuilder().create();
                    //                            String pendingData = appActivity.getPendingData();

                    JsonObject businessTravelObj = gson.fromJson(appActivity.getPendingData(),
                            JsonObject.class);
                    List<BusinessTravelComponent> businessTravelComponents = gson.fromJson(
                            businessTravelObj.get("businessTravelComponents"),
                            new TypeToken<List<BusinessTravelComponent>>() {
                            }.getType());
                    for (BusinessTravelComponent btc : businessTravelComponents) {
                        totalAmount = totalAmount + btc.getPayByAmount();
                    }
                    vtm.setSubject("Permohonan Perjalanan Dinas");
                    vtm.setTemplatePath("email_travel_approved_or_rejected_approval.vm");
                    maptoSend.put("requesterName", requesterUser.getEmpData().getBioData().getFullName());
                    maptoSend.put("nik", requesterUser.getEmpData().getNik());
                    maptoSend.put("businessTravelNo", jsonObject.get("businessTravelNo").getAsString());
                    maptoSend.put("proposeDate", jsonObject.get("proposeDate").getAsString());
                    maptoSend.put("destination", jsonObject.get("destination").getAsString());
                    maptoSend.put("start", jsonObject.get("startDate").getAsString());
                    maptoSend.put("end", jsonObject.get("endDate").getAsString());
                    maptoSend.put("description", jsonObject.get("description").getAsString());
                    maptoSend.put("totalAmount", new DecimalFormat("###,###").format(totalAmount));
                    if (appActivity.getApprovalStatus() == HRMConstant.APPROVAL_STATUS_APPROVED) {
                        maptoSend.put("statusDesc", "Permohonan Diterima");
                    } else if (appActivity.getApprovalStatus() == HRMConstant.APPROVAL_STATUS_REJECTED) {
                        maptoSend.put("statusDesc", "Permohonan Ditolak");
                    }
                    break;

                case HRMConstant.REIMBURSEMENT:
                    vtm.setSubject("Permohonan Pergantian Biaya");
                    vtm.setTemplatePath("email_reimbursment_approved_or_rejected.vm");
                    maptoSend.put("requesterName", requesterUser.getEmpData().getBioData().getFullName());
                    maptoSend.put("nik", requesterUser.getEmpData().getNik());
                    Gson gs = JsonUtil.getHibernateEntityGsonBuilder().create();
                    RmbsApplication application = gs.fromJson(appActivity.getPendingData(),
                            RmbsApplication.class);
                    RmbsType rmbsType = rmbsTypeDao.getEntiyByPK(application.getRmbsType().getId());
                    maptoSend.put("reimbursementType", rmbsType.getName());
                    maptoSend.put("applicationDate", jsonObject.get("applicationDate").getAsString());
                    maptoSend.put("nominal", jsonObject.get("nominal").getAsString());
                    maptoSend.put("applicationDate", jsonObject.get("applicationDate").getAsString());
                    maptoSend.put("proposeDate", jsonObject.get("createdOn").getAsString());
                    if (appActivity.getApprovalStatus() == HRMConstant.APPROVAL_STATUS_APPROVED) {
                        maptoSend.put("statusDesc", "Permohonan Diterima");
                    } else if (appActivity.getApprovalStatus() == HRMConstant.APPROVAL_STATUS_REJECTED) {
                        maptoSend.put("statusDesc", "Permohonan Ditolak");
                    }
                    break;

                case HRMConstant.LOAN:
                    vtm.setSubject("Permohonan Pinjaman Lunak");
                    vtm.setTemplatePath("email_loan_approved_or_rejected_approval.vm");
                    maptoSend.put("requesterName", requesterUser.getEmpData().getBioData().getFullName());
                    maptoSend.put("nik", requesterUser.getEmpData().getNik());
                    maptoSend.put("proposeDate", jsonObject.get("proposeDate").getAsString());
                    maptoSend.put("loanSchemaName", jsonObject.get("loanSchemaName").getAsString());
                    maptoSend.put("nominalPrincipal", jsonObject.get("nominalPrincipal").getAsString());
                    maptoSend.put("interestRate", jsonObject.get("interestRate").getAsString());
                    maptoSend.put("nominalInstallment", jsonObject.get("nominalInstallment").getAsString());
                    maptoSend.put("interestInstallment", jsonObject.get("interestInstallment").getAsString());
                    maptoSend.put("totalNominalInstallment",
                            jsonObject.get("totalNominalInstallment").getAsString());
                    if (appActivity.getApprovalStatus() == HRMConstant.APPROVAL_STATUS_APPROVED) {
                        maptoSend.put("statusDesc", "Permohonan Diterima");
                    } else if (appActivity.getApprovalStatus() == HRMConstant.APPROVAL_STATUS_REJECTED) {
                        maptoSend.put("statusDesc", "Permohonan Ditolak");
                    }
                    break;

                default:
                    break;
                }
            }
            if (jsonObject.get(HRMConstant.CONTEXT_PATH).getAsString() != null) {
                String urlLinkToApprove = serverName + ""
                        + jsonObject.get(HRMConstant.CONTEXT_PATH).getAsString() + ""
                        + HRMConstant.REIMBURSMENT_APPROVAL_PAGE + "" + "?faces-redirect=true&execution=e"
                        + appActivity.getId();

                maptoSend.put("urlLinkToApprove", urlLinkToApprove);
            } else {
                maptoSend.put("urlLinkToApprove", applicationUrl);
            }
            maptoSend.put("ownerAdministrator", ownerAdministrator);
            maptoSend.put("ownerCompany", ownerCompany);
            maptoSend.put("applicationUrl", applicationUrl);
            maptoSend.put("applicationName", applicationName);
            velocityTemplateSender.sendMail(vtm, maptoSend);

            //update approval activity, set notification true
            if (appActivity.getNotificationSend() == false) {
                appActivity.setNotificationSend(true);
                this.approvalActivityDao.update(appActivity);
            }
        }
    }

}

From source file:io.lavagna.service.NotificationServiceTest.java

@Test
public void testCheck() {
    Set<Integer> noUsersToNotify = notificationService.check(DateUtils.addDays(new Date(), -1));
    Assert.assertTrue(noUsersToNotify.isEmpty());

    // assign card
    labelService.addLabelValueToCard(assignedLabel.getId(), card1.getId(),
            new CardLabelValue.LabelValue(null, null, null, null, user.getId(), null), user, new Date());

    cardDataService.createComment(card1.getId(), "first comment", new Date(), user.getId());

    notificationService.check(DateUtils.addDays(new Date(), 1));
    Assert.assertTrue(notificationService.check(DateUtils.addDays(new Date(), 2)).contains(user.getId()));
}

From source file:eu.ggnet.dwoss.report.assist.gen.ReportLineGenerator.java

/**
 * Makes one special Reportline// w  ww  .j av  a 2  s . co m
 * <p/>
 * @param contractors  the contractor
 * @param posTypes     the allowed types of positions
 * @param starting     a starting date, this is the earlies date a line will have the reporting date set
 * @param maxDeltaDays this is a max delta for days of the reporting date. The date will be between starting and starting+maxDeltaDays.
 * @param docTypes     documetTypes
 * @return the ReportingLine
 */
public ReportLine makeReportLine(List<TradeName> contractors, Date starting, int maxDeltaDays,
        List<PositionType> posTypes, List<DocumentType> docTypes) {
    ReportLine line = new ReportLine();
    line.setName("ReportLine-" + getRandomInt());
    line.setDescription("desription-" + getRandomInt());
    line.setDossierId(getRandomLong());
    line.setDocumentIdentifier("dossierIdentifier-" + getRandomInt());
    line.setDocumentId(getRandomLong());
    line.setDocumentIdentifier("documentIdentifier-" + getRandomInt());
    line.setPositionType(posTypes.get(R.nextInt(posTypes.size())));
    line.setDocumentType(docTypes.get(R.nextInt(docTypes.size())));
    line.setCustomerId(getRandomLong());
    line.setContractorPartNo("123.456");

    line.setAmount(getRandomLong());
    double tax = GlobalConfig.TAX;
    double price = Math.abs(R.nextDouble() * R.nextInt(1500));
    line.setManufacturerCostPrice(price * 1.10);
    line.setContractorReferencePrice(price * 1.10);
    line.setAfterTaxPrice(price + (price * tax));
    line.setPrice(price);
    line.setTax(tax);

    line.setBookingAccount(getRandomInt());
    GeneratedAddress makeAddress = new NameGenerator().makeAddress();
    Name makeName = new NameGenerator().makeName();
    String name = makeName.getFirst() + " " + makeName.getLast();
    line.setCustomerName(name);
    String invoiceAdress = name + ", " + makeAddress.getStreet() + " " + makeAddress.getNumber() + ", "
            + makeAddress.getPostalCode() + " " + makeAddress.getTown();
    line.setCustomerCompany(R.nextInt(10) < 7 ? "" : "TestFirma");
    line.setInvoiceAddress(invoiceAdress);
    line.setRefurbishId("" + R.nextInt(100000));
    line.setUniqueUnitId(getRandomLong());
    line.setSerial("serial" + getRandomInt());
    line.setProductId(getRandomLong());
    line.setPartNo("partNo" + getRandomInt());
    line.setContractor(
            contractors.size() == 1 ? contractors.get(0) : contractors.get(R.nextInt(contractors.size())));
    line.setProductBrand(brands.get(R.nextInt(brands.size())));

    Date pastFiveYears = DateUtils.setYears(new Date(), 2009);
    line.setMfgDate(DateUtils.addDays(pastFiveYears, R.nextInt(2000)));

    line.setReportingDate(maxDeltaDays > 0 ? DateUtils.addDays(starting, R.nextInt(maxDeltaDays)) : starting);

    return line;
}

From source file:gr.abiss.calipso.service.impl.UserServiceImpl.java

@Override
@Transactional(readOnly = false)//w  w w  . j ava 2 s  .  c  o  m
public void expireResetPasswordTokens() {
    // get a hibernate session suitable for read-only access to large datasets
    StatelessSession session = ((Session) this.repository.getEntityManager().getDelegate()).getSessionFactory()
            .openStatelessSession();
    Date yesterday = DateUtils.addDays(new Date(), -1);

    // send email notifications for account confirmation tokens that expired
    org.hibernate.Query query = session.createQuery(
            "SELECT new gr.abiss.calipso.model.UserDTO(u.id, u.firstName, u.lastName,u.username, u.email, u.emailHash) FROM User u "
                    + "WHERE u.password IS NULL and u.resetPasswordTokenCreated IS NOT NULL and u.resetPasswordTokenCreated  < :yesterday");
    query.setParameter("yesterday", yesterday);
    query.setFetchSize(Integer.valueOf(1000));
    query.setReadOnly(true);
    query.setLockMode("a", LockMode.NONE);
    ScrollableResults results = query.scroll(ScrollMode.FORWARD_ONLY);
    while (results.next()) {
        UserDTO dto = (UserDTO) results.get(0);
        // TODO: send expiration email
        this.emailService.sendAccountConfirmationExpired(new User(dto));
    }
    results.close();
    session.close();

    // expire tokens, including password reset requests
    this.repository.expireResetPasswordTokens(yesterday);
}