Skip to content

Commit bac423f

Browse files
rafaelweingartneryadvr
authored andcommitted
CLOUDSTACK-10184: Re-work method QuotaResponseBuilderImpl.startOfNextDay (#2326)
Also, removed @Local annotation that is not needed and add test cases.
1 parent e5f0a68 commit bac423f

File tree

2 files changed

+80
-67
lines changed

2 files changed

+80
-67
lines changed

plugins/database/quota/src/org/apache/cloudstack/api/response/QuotaResponseBuilderImpl.java

Lines changed: 43 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,22 @@
1616
//under the License.
1717
package org.apache.cloudstack.api.response;
1818

19-
import com.cloud.domain.DomainVO;
20-
import com.cloud.domain.dao.DomainDao;
21-
import com.cloud.exception.InvalidParameterValueException;
22-
import com.cloud.user.Account;
23-
import com.cloud.user.AccountManager;
24-
import com.cloud.user.AccountVO;
25-
import com.cloud.user.User;
26-
import com.cloud.user.dao.AccountDao;
27-
import com.cloud.user.dao.UserDao;
19+
import java.math.BigDecimal;
20+
import java.math.RoundingMode;
21+
import java.time.LocalDate;
22+
import java.time.ZoneId;
23+
import java.util.ArrayList;
24+
import java.util.Calendar;
25+
import java.util.Collection;
26+
import java.util.Collections;
27+
import java.util.Comparator;
28+
import java.util.Date;
29+
import java.util.HashMap;
30+
import java.util.Iterator;
31+
import java.util.List;
32+
import java.util.ListIterator;
33+
34+
import javax.inject.Inject;
2835

2936
import org.apache.cloudstack.api.command.QuotaBalanceCmd;
3037
import org.apache.cloudstack.api.command.QuotaEmailTemplateListCmd;
@@ -53,24 +60,17 @@
5360
import org.apache.log4j.Logger;
5461
import org.springframework.stereotype.Component;
5562

56-
import javax.ejb.Local;
57-
import javax.inject.Inject;
58-
59-
import java.math.BigDecimal;
60-
import java.math.RoundingMode;
61-
import java.util.ArrayList;
62-
import java.util.Calendar;
63-
import java.util.Collection;
64-
import java.util.Collections;
65-
import java.util.Comparator;
66-
import java.util.Date;
67-
import java.util.HashMap;
68-
import java.util.Iterator;
69-
import java.util.List;
70-
import java.util.ListIterator;
63+
import com.cloud.domain.DomainVO;
64+
import com.cloud.domain.dao.DomainDao;
65+
import com.cloud.exception.InvalidParameterValueException;
66+
import com.cloud.user.Account;
67+
import com.cloud.user.AccountManager;
68+
import com.cloud.user.AccountVO;
69+
import com.cloud.user.User;
70+
import com.cloud.user.dao.AccountDao;
71+
import com.cloud.user.dao.UserDao;
7172

7273
@Component
73-
@Local(value = QuotaResponseBuilderImpl.class)
7474
public class QuotaResponseBuilderImpl implements QuotaResponseBuilder {
7575
private static final Logger s_logger = Logger.getLogger(QuotaResponseBuilderImpl.class);
7676

@@ -141,7 +141,9 @@ public List<QuotaSummaryResponse> createQuotaSummaryResponse(Boolean listAll) {
141141
} else {
142142
for (final QuotaAccountVO quotaAccount : _quotaAccountDao.listAllQuotaAccount()) {
143143
AccountVO account = _accountDao.findById(quotaAccount.getId());
144-
if (account == null) continue;
144+
if (account == null) {
145+
continue;
146+
}
145147
QuotaSummaryResponse qr = getQuotaSummaryResponse(account);
146148
result.add(qr);
147149
}
@@ -181,6 +183,7 @@ public QuotaBalanceResponse createQuotaBalanceResponse(List<QuotaBalanceVO> quot
181183
throw new InvalidParameterValueException("The request period does not contain balance entries.");
182184
}
183185
Collections.sort(quotaBalance, new Comparator<QuotaBalanceVO>() {
186+
@Override
184187
public int compare(QuotaBalanceVO o1, QuotaBalanceVO o2) {
185188
o1 = o1 == null ? new QuotaBalanceVO() : o1;
186189
o2 = o2 == null ? new QuotaBalanceVO() : o2;
@@ -287,13 +290,15 @@ public QuotaStatementResponse createQuotaStatementResponse(final List<QuotaUsage
287290
if (s_logger.isDebugEnabled()) {
288291
s_logger.debug(
289292
"createQuotaStatementResponse Type=" + quotaUsage.get(0).getUsageType() + " usage=" + quotaUsage.get(0).getQuotaUsed().setScale(2, RoundingMode.HALF_EVEN)
290-
+ " rec.id=" + quotaUsage.get(0).getUsageItemId() + " SD=" + quotaUsage.get(0).getStartDate() + " ED=" + quotaUsage.get(0).getEndDate());
293+
+ " rec.id=" + quotaUsage.get(0).getUsageItemId() + " SD=" + quotaUsage.get(0).getStartDate() + " ED=" + quotaUsage.get(0).getEndDate());
291294
}
292295

293296
Collections.sort(quotaUsage, new Comparator<QuotaUsageVO>() {
297+
@Override
294298
public int compare(QuotaUsageVO o1, QuotaUsageVO o2) {
295-
if (o1.getUsageType() == o2.getUsageType())
299+
if (o1.getUsageType() == o2.getUsageType()) {
296300
return 0;
301+
}
297302
return o1.getUsageType() < o2.getUsageType() ? -1 : 1;
298303
}
299304
});
@@ -508,29 +513,21 @@ public List<QuotaUsageVO> getQuotaUsage(QuotaStatementCmd cmd) {
508513
public List<QuotaBalanceVO> getQuotaBalance(QuotaBalanceCmd cmd) {
509514
return _quotaService.findQuotaBalanceVO(cmd.getAccountId(), cmd.getAccountName(), cmd.getDomainId(), cmd.getStartDate(), cmd.getEndDate());
510515
}
511-
512516
@Override
513-
public Date startOfNextDay(Date dt) {
514-
Calendar c = Calendar.getInstance();
515-
c.setTime(dt);
516-
c.add(Calendar.DATE, 1);
517-
c.set(Calendar.HOUR, 0);
518-
c.set(Calendar.MINUTE, 0);
519-
c.set(Calendar.SECOND, 0);
520-
c.set(Calendar.MILLISECOND, 0);
521-
return c.getTime();
517+
public Date startOfNextDay(Date date) {
518+
LocalDate localDate = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
519+
return createDateAtTheStartOfNextDay(localDate);
522520
}
523521

524522
@Override
525523
public Date startOfNextDay() {
526-
Calendar c = Calendar.getInstance();
527-
c.setTime(new Date());
528-
c.add(Calendar.DATE, 1);
529-
c.set(Calendar.HOUR, 0);
530-
c.set(Calendar.MINUTE, 0);
531-
c.set(Calendar.SECOND, 0);
532-
c.set(Calendar.MILLISECOND, 0);
533-
return c.getTime();
524+
LocalDate localDate = LocalDate.now();
525+
return createDateAtTheStartOfNextDay(localDate);
526+
}
527+
528+
private Date createDateAtTheStartOfNextDay(LocalDate localDate) {
529+
LocalDate nextDayLocalDate = localDate.plusDays(1);
530+
return Date.from(nextDayLocalDate.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant());
534531
}
535532

536533
}

plugins/database/quota/test/org/apache/cloudstack/api/response/QuotaResponseBuilderImplTest.java

Lines changed: 37 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,17 @@
1616
// under the License.
1717
package org.apache.cloudstack.api.response;
1818

19-
import com.cloud.exception.InvalidParameterValueException;
20-
import com.cloud.user.Account;
21-
import com.cloud.user.AccountManager;
22-
import com.cloud.user.AccountVO;
23-
import com.cloud.user.dao.AccountDao;
24-
import com.cloud.user.dao.UserDao;
25-
import com.cloud.utils.db.TransactionLegacy;
26-
import junit.framework.TestCase;
19+
import java.lang.reflect.Field;
20+
import java.math.BigDecimal;
21+
import java.time.LocalDate;
22+
import java.time.LocalDateTime;
23+
import java.time.ZoneId;
24+
import java.util.ArrayList;
25+
import java.util.Date;
26+
import java.util.List;
27+
28+
import javax.inject.Inject;
29+
2730
import org.apache.cloudstack.api.command.QuotaEmailTemplateListCmd;
2831
import org.apache.cloudstack.api.command.QuotaEmailTemplateUpdateCmd;
2932
import org.apache.cloudstack.quota.QuotaService;
@@ -36,21 +39,23 @@
3639
import org.apache.cloudstack.quota.vo.QuotaCreditsVO;
3740
import org.apache.cloudstack.quota.vo.QuotaEmailTemplatesVO;
3841
import org.apache.cloudstack.quota.vo.QuotaTariffVO;
39-
import org.joda.time.DateTime;
42+
import org.junit.Assert;
4043
import org.junit.Before;
4144
import org.junit.Test;
4245
import org.junit.runner.RunWith;
4346
import org.mockito.Mock;
4447
import org.mockito.Mockito;
4548
import org.mockito.runners.MockitoJUnitRunner;
4649

47-
import java.lang.reflect.Field;
48-
import java.math.BigDecimal;
49-
import java.util.ArrayList;
50-
import java.util.Date;
51-
import java.util.List;
50+
import com.cloud.exception.InvalidParameterValueException;
51+
import com.cloud.user.Account;
52+
import com.cloud.user.AccountManager;
53+
import com.cloud.user.AccountVO;
54+
import com.cloud.user.dao.AccountDao;
55+
import com.cloud.user.dao.UserDao;
56+
import com.cloud.utils.db.TransactionLegacy;
5257

53-
import javax.inject.Inject;
58+
import junit.framework.TestCase;
5459

5560
@RunWith(MockitoJUnitRunner.class)
5661
public class QuotaResponseBuilderImplTest extends TestCase {
@@ -218,13 +223,24 @@ public void testCreateQuotaLastBalanceResponse() {
218223
}
219224

220225
@Test
221-
public void testStartOfNextDay() {
222-
DateTime now = new DateTime();
223-
DateTime nextDay = new DateTime(quotaResponseBuilder.startOfNextDay(now.toDate()));
224-
DateTime nextDay2 = new DateTime(quotaResponseBuilder.startOfNextDay());
225-
assertTrue(now.toLocalDate().equals(nextDay.minusDays(1).toLocalDate()));
226-
assertTrue(now.toLocalDate().equals(nextDay2.minusDays(1).toLocalDate()));
226+
public void testStartOfNextDayWithoutParameters() {
227+
Date nextDate = quotaResponseBuilder.startOfNextDay();
228+
229+
LocalDateTime tomorrowAtStartOfTheDay = LocalDate.now().atStartOfDay().plusDays(1);
230+
Date expectedNextDate = Date.from(tomorrowAtStartOfTheDay.atZone(ZoneId.systemDefault()).toInstant());
231+
232+
Assert.assertEquals(expectedNextDate, nextDate);
227233
}
228234

235+
@Test
236+
public void testStartOfNextDayWithParameter() {
237+
Date anyDate = new Date(1242421545757532l);
238+
239+
Date nextDayDate = quotaResponseBuilder.startOfNextDay(anyDate);
229240

241+
LocalDateTime nextDayLocalDateTimeAtStartOfTheDay = anyDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDate().plusDays(1).atStartOfDay();
242+
Date expectedNextDate = Date.from(nextDayLocalDateTimeAtStartOfTheDay.atZone(ZoneId.systemDefault()).toInstant());
243+
244+
Assert.assertEquals(expectedNextDate, nextDayDate);
245+
}
230246
}

0 commit comments

Comments
 (0)