[ 
https://issues.apache.org/jira/browse/CLOUDSTACK-10184?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16286260#comment-16286260
 ] 

ASF GitHub Bot commented on CLOUDSTACK-10184:
---------------------------------------------

rhtyd closed pull request #2326: [CLOUDSTACK-10184] Re-work method 
QuotaResponseBuilderImpl.startOfNextDay and its test cases
URL: https://github.com/apache/cloudstack/pull/2326
 
 
   

This is a PR merged from a forked repository.
As GitHub hides the original diff on merge, it is displayed below for
the sake of provenance:

As this is a foreign pull request (from a fork), the diff is supplied
below (as it won't show otherwise due to GitHub magic):

diff --git 
a/plugins/database/quota/src/org/apache/cloudstack/api/response/QuotaResponseBuilderImpl.java
 
b/plugins/database/quota/src/org/apache/cloudstack/api/response/QuotaResponseBuilderImpl.java
index 5748de58965..76a68cf7f0e 100644
--- 
a/plugins/database/quota/src/org/apache/cloudstack/api/response/QuotaResponseBuilderImpl.java
+++ 
b/plugins/database/quota/src/org/apache/cloudstack/api/response/QuotaResponseBuilderImpl.java
@@ -16,15 +16,22 @@
 //under the License.
 package org.apache.cloudstack.api.response;
 
-import com.cloud.domain.DomainVO;
-import com.cloud.domain.dao.DomainDao;
-import com.cloud.exception.InvalidParameterValueException;
-import com.cloud.user.Account;
-import com.cloud.user.AccountManager;
-import com.cloud.user.AccountVO;
-import com.cloud.user.User;
-import com.cloud.user.dao.AccountDao;
-import com.cloud.user.dao.UserDao;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.time.LocalDate;
+import java.time.ZoneId;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.ListIterator;
+
+import javax.inject.Inject;
 
 import org.apache.cloudstack.api.command.QuotaBalanceCmd;
 import org.apache.cloudstack.api.command.QuotaEmailTemplateListCmd;
@@ -53,24 +60,17 @@
 import org.apache.log4j.Logger;
 import org.springframework.stereotype.Component;
 
-import javax.ejb.Local;
-import javax.inject.Inject;
-
-import java.math.BigDecimal;
-import java.math.RoundingMode;
-import java.util.ArrayList;
-import java.util.Calendar;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.ListIterator;
+import com.cloud.domain.DomainVO;
+import com.cloud.domain.dao.DomainDao;
+import com.cloud.exception.InvalidParameterValueException;
+import com.cloud.user.Account;
+import com.cloud.user.AccountManager;
+import com.cloud.user.AccountVO;
+import com.cloud.user.User;
+import com.cloud.user.dao.AccountDao;
+import com.cloud.user.dao.UserDao;
 
 @Component
-@Local(value = QuotaResponseBuilderImpl.class)
 public class QuotaResponseBuilderImpl implements QuotaResponseBuilder {
     private static final Logger s_logger = 
Logger.getLogger(QuotaResponseBuilderImpl.class);
 
@@ -141,7 +141,9 @@ public QuotaTariffResponse 
createQuotaTariffResponse(QuotaTariffVO tariff) {
         } else {
             for (final QuotaAccountVO quotaAccount : 
_quotaAccountDao.listAllQuotaAccount()) {
                 AccountVO account = _accountDao.findById(quotaAccount.getId());
-                if (account == null) continue;
+                if (account == null) {
+                    continue;
+                }
                 QuotaSummaryResponse qr = getQuotaSummaryResponse(account);
                 result.add(qr);
             }
@@ -181,6 +183,7 @@ public QuotaBalanceResponse 
createQuotaBalanceResponse(List<QuotaBalanceVO> quot
             throw new InvalidParameterValueException("The request period does 
not contain balance entries.");
         }
         Collections.sort(quotaBalance, new Comparator<QuotaBalanceVO>() {
+            @Override
             public int compare(QuotaBalanceVO o1, QuotaBalanceVO o2) {
                 o1 = o1 == null ? new QuotaBalanceVO() : o1;
                 o2 = o2 == null ? new QuotaBalanceVO() : o2;
@@ -287,13 +290,15 @@ public QuotaStatementResponse 
createQuotaStatementResponse(final List<QuotaUsage
         if (s_logger.isDebugEnabled()) {
             s_logger.debug(
                     "createQuotaStatementResponse Type=" + 
quotaUsage.get(0).getUsageType() + " usage=" + 
quotaUsage.get(0).getQuotaUsed().setScale(2, RoundingMode.HALF_EVEN)
-                            + " rec.id=" + quotaUsage.get(0).getUsageItemId() 
+ " SD=" + quotaUsage.get(0).getStartDate() + " ED=" + 
quotaUsage.get(0).getEndDate());
+                    + " rec.id=" + quotaUsage.get(0).getUsageItemId() + " SD=" 
+ quotaUsage.get(0).getStartDate() + " ED=" + quotaUsage.get(0).getEndDate());
         }
 
         Collections.sort(quotaUsage, new Comparator<QuotaUsageVO>() {
+            @Override
             public int compare(QuotaUsageVO o1, QuotaUsageVO o2) {
-                if (o1.getUsageType() == o2.getUsageType())
+                if (o1.getUsageType() == o2.getUsageType()) {
                     return 0;
+                }
                 return o1.getUsageType() < o2.getUsageType() ? -1 : 1;
             }
         });
@@ -508,29 +513,21 @@ public QuotaBalanceResponse 
createQuotaLastBalanceResponse(List<QuotaBalanceVO>
     public List<QuotaBalanceVO> getQuotaBalance(QuotaBalanceCmd cmd) {
         return _quotaService.findQuotaBalanceVO(cmd.getAccountId(), 
cmd.getAccountName(), cmd.getDomainId(), cmd.getStartDate(), cmd.getEndDate());
     }
-
     @Override
-    public Date startOfNextDay(Date dt) {
-        Calendar c = Calendar.getInstance();
-        c.setTime(dt);
-        c.add(Calendar.DATE, 1);
-        c.set(Calendar.HOUR, 0);
-        c.set(Calendar.MINUTE, 0);
-        c.set(Calendar.SECOND, 0);
-        c.set(Calendar.MILLISECOND, 0);
-        return c.getTime();
+    public Date startOfNextDay(Date date) {
+        LocalDate localDate = 
date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
+        return createDateAtTheStartOfNextDay(localDate);
     }
 
     @Override
     public Date startOfNextDay() {
-        Calendar c = Calendar.getInstance();
-        c.setTime(new Date());
-        c.add(Calendar.DATE, 1);
-        c.set(Calendar.HOUR, 0);
-        c.set(Calendar.MINUTE, 0);
-        c.set(Calendar.SECOND, 0);
-        c.set(Calendar.MILLISECOND, 0);
-        return c.getTime();
+        LocalDate localDate = LocalDate.now();
+        return createDateAtTheStartOfNextDay(localDate);
+    }
+
+    private Date createDateAtTheStartOfNextDay(LocalDate localDate) {
+        LocalDate nextDayLocalDate = localDate.plusDays(1);
+        return 
Date.from(nextDayLocalDate.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant());
     }
 
 }
diff --git 
a/plugins/database/quota/test/org/apache/cloudstack/api/response/QuotaResponseBuilderImplTest.java
 
b/plugins/database/quota/test/org/apache/cloudstack/api/response/QuotaResponseBuilderImplTest.java
index 4a76052f69f..de961f63b20 100644
--- 
a/plugins/database/quota/test/org/apache/cloudstack/api/response/QuotaResponseBuilderImplTest.java
+++ 
b/plugins/database/quota/test/org/apache/cloudstack/api/response/QuotaResponseBuilderImplTest.java
@@ -16,14 +16,17 @@
 // under the License.
 package org.apache.cloudstack.api.response;
 
-import com.cloud.exception.InvalidParameterValueException;
-import com.cloud.user.Account;
-import com.cloud.user.AccountManager;
-import com.cloud.user.AccountVO;
-import com.cloud.user.dao.AccountDao;
-import com.cloud.user.dao.UserDao;
-import com.cloud.utils.db.TransactionLegacy;
-import junit.framework.TestCase;
+import java.lang.reflect.Field;
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+import javax.inject.Inject;
+
 import org.apache.cloudstack.api.command.QuotaEmailTemplateListCmd;
 import org.apache.cloudstack.api.command.QuotaEmailTemplateUpdateCmd;
 import org.apache.cloudstack.quota.QuotaService;
@@ -36,7 +39,7 @@
 import org.apache.cloudstack.quota.vo.QuotaCreditsVO;
 import org.apache.cloudstack.quota.vo.QuotaEmailTemplatesVO;
 import org.apache.cloudstack.quota.vo.QuotaTariffVO;
-import org.joda.time.DateTime;
+import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -44,13 +47,15 @@
 import org.mockito.Mockito;
 import org.mockito.runners.MockitoJUnitRunner;
 
-import java.lang.reflect.Field;
-import java.math.BigDecimal;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
+import com.cloud.exception.InvalidParameterValueException;
+import com.cloud.user.Account;
+import com.cloud.user.AccountManager;
+import com.cloud.user.AccountVO;
+import com.cloud.user.dao.AccountDao;
+import com.cloud.user.dao.UserDao;
+import com.cloud.utils.db.TransactionLegacy;
 
-import javax.inject.Inject;
+import junit.framework.TestCase;
 
 @RunWith(MockitoJUnitRunner.class)
 public class QuotaResponseBuilderImplTest extends TestCase {
@@ -218,13 +223,24 @@ public void testCreateQuotaLastBalanceResponse() {
     }
 
     @Test
-    public void testStartOfNextDay() {
-        DateTime now = new DateTime();
-        DateTime nextDay = new 
DateTime(quotaResponseBuilder.startOfNextDay(now.toDate()));
-        DateTime nextDay2 = new 
DateTime(quotaResponseBuilder.startOfNextDay());
-        
assertTrue(now.toLocalDate().equals(nextDay.minusDays(1).toLocalDate()));
-        
assertTrue(now.toLocalDate().equals(nextDay2.minusDays(1).toLocalDate()));
+    public void testStartOfNextDayWithoutParameters() {
+        Date nextDate = quotaResponseBuilder.startOfNextDay();
+
+        LocalDateTime tomorrowAtStartOfTheDay = 
LocalDate.now().atStartOfDay().plusDays(1);
+        Date expectedNextDate = 
Date.from(tomorrowAtStartOfTheDay.atZone(ZoneId.systemDefault()).toInstant());
+
+        Assert.assertEquals(expectedNextDate, nextDate);
     }
 
+    @Test
+    public void testStartOfNextDayWithParameter() {
+        Date anyDate = new Date(1242421545757532l);
+
+        Date nextDayDate = quotaResponseBuilder.startOfNextDay(anyDate);
 
+        LocalDateTime nextDayLocalDateTimeAtStartOfTheDay = 
anyDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDate().plusDays(1).atStartOfDay();
+        Date expectedNextDate = 
Date.from(nextDayLocalDateTimeAtStartOfTheDay.atZone(ZoneId.systemDefault()).toInstant());
+
+        Assert.assertEquals(expectedNextDate, nextDayDate);
+    }
 }


 

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
[email protected]


> Re-work method QuotaResponseBuilderImpl.startOfNextDay and its test cases
> -------------------------------------------------------------------------
>
>                 Key: CLOUDSTACK-10184
>                 URL: https://issues.apache.org/jira/browse/CLOUDSTACK-10184
>             Project: CloudStack
>          Issue Type: Bug
>      Security Level: Public(Anyone can view this level - this is the 
> default.) 
>    Affects Versions: 4.10.0.0
>            Reporter: Rafael Weingärtner
>            Assignee: Rafael Weingärtner
>
> Changed method 
> org.apache.cloudstack.api.response.QuotaResponseBuilderImpl.startOfNextDay(Date)
>  to use the Java 8 Date and time API. I also changed the test cases to stop 
> using JodaTime, which can cause problems sometimes.
> We found this problem while checking a problem when compiling ACS 4.10 source 
> code [1]
> [1] 
> http://mail-archives.apache.org/mod_mbox/cloudstack-users/201711.mbox/%3CCAA%2B3ouLGRPicr8oxQdaLEX01uzRJN1kwL5%3DT_a3LinTgy%2ByQBg%40mail.gmail.com%3E



--
This message was sent by Atlassian JIRA
(v6.4.14#64029)

Reply via email to