11package org .jenkinsci .plugins .parameterizedscheduler ;
22
3+ import edu .umd .cs .findbugs .annotations .CheckForNull ;
34import hudson .scheduler .CronTabList ;
45import hudson .scheduler .Hash ;
56
67import java .util .ArrayList ;
78import java .util .Calendar ;
9+ import java .util .Collections ;
810import java .util .List ;
911import java .util .stream .Collectors ;
1012
@@ -22,6 +24,10 @@ public ParameterizedCronTabList(List<ParameterizedCronTab> cronTabs) {
2224 this .cronTabs = cronTabs ;
2325 }
2426
27+ public List <ParameterizedCronTab > getCronTabs () {
28+ return Collections .unmodifiableList (cronTabs );
29+ }
30+
2531 public static ParameterizedCronTabList create (String cronTabSpecification ) {
2632 return create (cronTabSpecification , null );
2733 }
@@ -63,4 +69,63 @@ public String checkSanity() {
6369 }
6470 return null ;
6571 }
72+
73+ public @ CheckForNull Calendar previous () {
74+ Calendar nearest = null ;
75+ for (ParameterizedCronTab tab : cronTabs ) {
76+ Calendar next = tab .next ();
77+ if (next == null || next .before (nearest )) {
78+ nearest = next ;
79+ }
80+ }
81+ return nearest ;
82+ }
83+
84+ public @ CheckForNull Calendar next () {
85+ Calendar nearest = null ;
86+ for (ParameterizedCronTab tab : cronTabs ) {
87+ Calendar previous = tab .previous ();
88+ if (nearest == null || nearest .after (previous )) {
89+ nearest = previous ;
90+ }
91+ }
92+ return nearest ;
93+ }
94+
95+ public @ CheckForNull ParameterizedCronTab nextParameterizedCronTab () {
96+ Calendar nearest = null ;
97+ ParameterizedCronTab next = null ;
98+ for (ParameterizedCronTab tab : cronTabs ) {
99+ Calendar previous = tab .previous ();
100+ if (nearest == null || nearest .after (previous )) {
101+ nearest = previous ;
102+ next = tab ;
103+ }
104+ }
105+ return next ;
106+ }
107+
108+ @ CheckForNull
109+ public Calendar ceil (long timestamp ) {
110+ Calendar ceil = null ;
111+ for (ParameterizedCronTab wrapper : cronTabs ) {
112+ Calendar scheduled = wrapper .ceil (timestamp );
113+ if (ceil == null || (scheduled != null && ceil .after (scheduled ))) {
114+ ceil = scheduled ;
115+ }
116+ }
117+ return ceil ;
118+ }
119+
120+ @ CheckForNull
121+ public Calendar floor (long timestamp ) {
122+ Calendar floor = null ;
123+ for (ParameterizedCronTab wrapper : cronTabs ) {
124+ Calendar scheduled = wrapper .floor (timestamp );
125+ if (floor == null || (scheduled != null && floor .before (scheduled ))) {
126+ floor = scheduled ;
127+ }
128+ }
129+ return floor ;
130+ }
66131}
0 commit comments