You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by pa...@apache.org on 2022/08/25 03:34:45 UTC
[groovy] branch master updated: GROOVY-10728: Enhance groovy-dateutil extensions to support collections of indices when accessing Calendar/Date
This is an automated email from the ASF dual-hosted git repository.
paulk pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/groovy.git
The following commit(s) were added to refs/heads/master by this push:
new a7d9bc37d1 GROOVY-10728: Enhance groovy-dateutil extensions to support collections of indices when accessing Calendar/Date
a7d9bc37d1 is described below
commit a7d9bc37d118d175ee765a6935d7d4849a6fb6c0
Author: Paul King <pa...@asert.com.au>
AuthorDate: Wed Aug 24 19:20:46 2022 +1000
GROOVY-10728: Enhance groovy-dateutil extensions to support collections of indices when accessing Calendar/Date
---
.../dateutil/extensions/DateUtilExtensions.java | 44 +++++++++++++++++++++-
.../extensions/DateUtilExtensionsTest.java | 12 ++++++
2 files changed, 55 insertions(+), 1 deletion(-)
diff --git a/subprojects/groovy-dateutil/src/main/java/org/apache/groovy/dateutil/extensions/DateUtilExtensions.java b/subprojects/groovy-dateutil/src/main/java/org/apache/groovy/dateutil/extensions/DateUtilExtensions.java
index b2fb898906..a0c57bdeab 100644
--- a/subprojects/groovy-dateutil/src/main/java/org/apache/groovy/dateutil/extensions/DateUtilExtensions.java
+++ b/subprojects/groovy-dateutil/src/main/java/org/apache/groovy/dateutil/extensions/DateUtilExtensions.java
@@ -20,13 +20,17 @@ package org.apache.groovy.dateutil.extensions;
import groovy.lang.Closure;
import groovy.lang.GroovyRuntimeException;
+import org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation;
import java.sql.Timestamp;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
+import java.util.ArrayList;
import java.util.Calendar;
+import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
+import java.util.List;
import java.util.Map;
import java.util.TimeZone;
@@ -35,6 +39,7 @@ import java.util.TimeZone;
* Date and Calendar classes inside the Groovy environment.
*/
public class DateUtilExtensions {
+ private DateUtilExtensions() {}
/**
* Support the subscript operator for a Date.
@@ -48,7 +53,22 @@ public class DateUtilExtensions {
public static int getAt(Date self, int field) {
Calendar cal = Calendar.getInstance();
cal.setTime(self);
- return cal.get(field);
+ return getAt(cal, field);
+ }
+
+ /**
+ * Support the subscript operator for a Date with a collection of indices.
+ *
+ * @param self a Date
+ * @param fields a collection of Calendar fields, e.g. [YEAR, MONTH]
+ * @return the value for the given field, e.g. [2022, FEBRUARY]
+ * @see java.util.Calendar
+ * @since 4.0.5
+ */
+ public static List<Integer> getAt(Date self, Collection fields) {
+ Calendar cal = Calendar.getInstance();
+ cal.setTime(self);
+ return getAt(cal, fields);
}
/**
@@ -77,6 +97,28 @@ public class DateUtilExtensions {
return self.get(field);
}
+ /**
+ * Support the subscript operator for a Calendar with a collection of indices.
+ *
+ * @param self a Calendar
+ * @param fields a collection of Calendar fields, e.g. [YEAR, MONTH]
+ * @return the value for the given field, e.g. [2022, FEBRUARY]
+ * @see java.util.Calendar
+ * @since 4.0.5
+ */
+ public static List<Integer> getAt(Calendar self, Collection fields) {
+ List<Integer> answer = new ArrayList<>(fields.size());
+ for (Object field : fields) {
+ if (field instanceof Collection) {
+ answer.addAll(getAt(self, (Collection) field));
+ } else {
+ int idx = DefaultTypeTransformation.intUnbox(field);
+ answer.add(getAt(self, idx));
+ }
+ }
+ return answer;
+ }
+
/**
* Support the subscript operator for mutating a Calendar.
* Example usage:
diff --git a/subprojects/groovy-dateutil/src/test/java/org/apache/groovy/dateutil/extensions/DateUtilExtensionsTest.java b/subprojects/groovy-dateutil/src/test/java/org/apache/groovy/dateutil/extensions/DateUtilExtensionsTest.java
index 8cecc5b106..e2f21cea7f 100644
--- a/subprojects/groovy-dateutil/src/test/java/org/apache/groovy/dateutil/extensions/DateUtilExtensionsTest.java
+++ b/subprojects/groovy-dateutil/src/test/java/org/apache/groovy/dateutil/extensions/DateUtilExtensionsTest.java
@@ -24,10 +24,13 @@ import org.junit.Test;
import java.sql.Timestamp;
import java.text.ParseException;
import java.text.SimpleDateFormat;
+import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;
+import java.util.List;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
public class DateUtilExtensionsTest {
@Test
@@ -61,4 +64,13 @@ public class DateUtilExtensionsTest {
calendar.setTime(sdf.parse("20180101"));
assertEquals("20171231", sdf.format(DateUtilExtensions.previous(calendar).getTime()));
}
+
+ @Test
+ public void calendarCollectGetAt() {
+ Calendar calendar = Calendar.getInstance();
+ List<Integer> result = DateUtilExtensions.getAt(calendar, Arrays.asList(Calendar.YEAR, Calendar.MONTH, Calendar.DAY_OF_MONTH));
+ assertTrue("Year", result.get(0) >= 2022);
+ assertTrue("Month", result.get(1) <= 11);
+ assertTrue("Day", result.get(2) <= 31);
+ }
}