Docjar: A Java Source and Docuemnt Enginecom.*    java.*    javax.*    org.*    all    new    plug-in

Quick Search    Search Deep

Source code: org/media/mn8/util/cron/CronMultiplier.java


1   /* 
2    * $COPYRIGHT$
3    * $Id: CronMultiplier.java,v 1.1 2002/10/25 20:40:49 atech Exp $
4    *
5    * Date        Author            Changes 
6    * May 16 2002 Antal Attila      Created
7    */
8   
9   package org.media.mn8.util.cron;
10  
11  import java.util.Vector;
12  import java.util.StringTokenizer;
13  
14  /**
15   * This is the multiplier for crons to make crons with (*), intervals (3-12),
16   * selectors (2-8/2) and lists (3,4,8).
17   *
18   * @author <a href="mailto:atech@nolimits.ro">Antal Attila</a>
19   */
20  public class CronMultiplier {
21                                                                                  
22    CronElement ce = new CronElement();
23      private Vector avalonCrons = new Vector();
24    private Vector repMins = new Vector();
25    private Vector repHours = new Vector();
26    private Vector repDays = new Vector();
27    private Vector repMonths = new Vector();
28    private Vector repWeekDays = new Vector();
29    private boolean weekDaysFound = true;
30    private boolean mnthDaysFound = true;
31    private byte paramNr = 1;
32    private String errMsg;
33    public boolean ignored = false;
34                                                                                  
35    public CronMultiplier() {}
36    
37    public void setMaker( String cron ) {                                   
38      StringTokenizer st = new StringTokenizer( cron, " " );              
39      while (st.hasMoreTokens() && paramNr <= 5 ) {                       
40        comaParser( st.nextToken() );                                   
41        paramNr++;                                                      
42      }                                                                   
43      wormCollector();                                                    
44    }
45    
46    public void wormCollector() {                                           
47      if ( weekDaysFound ) makeCronElements( repWeekDays, true );         
48      if ( mnthDaysFound ) makeCronElements( repDays, false );            
49      if ( !weekDaysFound && !mnthDaysFound )                             
50        makeCronElements( repDays, false );                             
51    }
52  
53    public void makeCronElements( Vector days, boolean week) {              
54      byte min, hour, day, month;                                         
55      for ( int i = 0; i < repMins.size(); i++ ) {                        
56        min = ((Integer)repMins.get(i)).byteValue();                    
57        for ( int j = 0; j < repHours.size(); j++ ) {                   
58          hour = ((Integer)repHours.get(j)).byteValue();              
59          for ( int k = 0; k < days.size(); k++ ) {                   
60            day = ((Integer)days.get(k)).byteValue();               
61            for ( int l = 0; l < repMonths.size(); l++ ) {          
62              month = ((Integer)repMonths.get(l)).byteValue();    
63              CronElement newCE = new CronElement();              
64              newCE.min = min;                                    
65              newCE.hour = hour;                                  
66              newCE.day = day;                                    
67              newCE.month = month;                                
68              newCE.week = week;                                  
69              avalonCrons.addElement( newCE );                    
70            }                                                       
71          }                                                           
72        }                                                               
73      }                                                                   
74    }
75    
76    public void setCurrent( int current ) {                                 
77      ce = ( CronElement )avalonCrons.elementAt( current );               
78    }                                                                       
79    
80    
81    public int getSize() {                                                  
82      return avalonCrons.size();                                          
83    }                                                                       
84                                                                                  
85    
86    public int getMin() {                                                   
87      return ce.min;                                                      
88    }                                                                       
89    
90                                                                                  
91    public int getHour() {                                                  
92      return ce.hour;                                                     
93    }
94    
95  
96    public int getDay() {                                                   
97      return ce.day;                                                      
98    }                                                                       
99  
100   
101   public int getMonth() {                                                 
102     return ce.month;                                                    
103   }                                                                       
104                                                                                 
105                                                                                 
106   public boolean getIsDayOfWeek() {                                       
107     return ce.week;                                                     
108   }                                                                       
109 
110 
111   public String getErrMsg() {
112     return errMsg;
113   }
114   
115   
116   private byte paramLow( byte par ) {                                     
117     if ( par == 1 || par == 2 || par == 5 ) return 0;                   
118     else return 1;                                                      
119   }
120   
121 
122   private byte paramHigh( byte par ) {                                    
123     if ( par == 1 ) return 59;                                          
124     else if ( par == 2 ) return 23;                                     
125     else if ( par == 3 ) return 31;                                     
126     else if ( par == 4 ) return 12;                                     
127     else return 7;                                                      
128   }
129   
130 
131   private void comaParser( String worm ) {                                
132     byte avalonTypeOfAll = -1;                                          
133     StringTokenizer coma = new StringTokenizer( worm, ",");             
134     while ( coma.hasMoreTokens() ) {                                    
135       String _coma = coma.nextToken();                                
136       if ( _coma.equals("*") ) {                                      
137         wormMaker( avalonTypeOfAll );                               
138         if ( paramNr == 5 ) weekDaysFound = false;                  
139         if ( paramNr == 3 ) mnthDaysFound = false;                  
140         break;                                                      
141       }                                                               
142       else if ( convert(_coma) >= 0 ) {                               
143         wormMaker( convert(_coma) );                                
144       }                                                               
145       else {                                                          
146         slashParser(_coma);                                         
147       }                                                               
148     }                                                                   
149   }
150   
151 
152   private void slashParser ( String slash ) {                             
153     StringTokenizer _slash =                                            
154       new StringTokenizer( slash, "/");                               
155     String interval = "";                                               
156     byte count = 1;                                                     
157     int step = 1;                                                       
158     while ( _slash.hasMoreTokens() ) {                                  
159       if ( count == 1 ) interval = _slash.nextToken();                
160       if ( count == 2 ) {                                             
161         step = convert(_slash.nextToken());                         
162         break;                                                      
163       }                                                               
164       count++;                                                        
165     }                                                                   
166     if ( interval.equals("*") ) {                                       
167       for ( byte cx = paramLow(paramNr);                              
168           cx <= paramHigh(paramNr);                                 
169           cx += step ) {                                            
170         wormMaker( cx );                                            
171       }                                                               
172     }
173     else if ( convert( interval ) >= 0 ) {                              
174       wormMaker( convert(interval) );                                 
175     }                                                                   
176     else {                                                              
177       minusParser ( interval, step );                                 
178     }                                                                   
179   }
180 
181 
182   private void minusParser ( String interval, int step ) {                
183     StringTokenizer minus =                                             
184       new StringTokenizer( interval, "-");                            
185     int first = 0, last = 0;                                            
186     byte count = 1;                                                     
187     while ( minus.hasMoreTokens() ) {                                   
188       if ( count == 1 ) first = convert( minus.nextToken() );         
189       if ( count == 2 ) {                                             
190         last = convert( minus.nextToken() );                        
191         break;                                                      
192       }                                                               
193       count++;                                                        
194     }                                                                   
195     for ( int cx = first; cx <= last; cx += step ) {                    
196       wormMaker( cx );                                                
197     }                                                                   
198   }
199 
200 
201   private void wormMaker( int worm ) {                                    
202     if (!ignored) {                                                     
203       switch ( paramNr ) {                                            
204       case 1 : repMins.add( new Integer(worm) ); break;               
205       case 2 : repHours.add( new Integer(worm) ); break;              
206       case 3 : repDays.add( new Integer(worm) ); break;               
207       case 4 : repMonths.add( new Integer(worm) ); break;             
208       case 5 : repWeekDays.add( new Integer(worm) ); break;           
209       }                                                               
210     }                                                                   
211   }
212 
213 
214   private int convert( String conv ) {                                    
215     int retValue = -1;                                                  
216     try {                                                               
217       retValue = new Integer( conv ).intValue();                      
218       if ( (retValue < paramLow(paramNr) ||                           
219           retValue > paramHigh(paramNr)) && !ignored ) {            
220         ignoreCron( conv );                                         
221       }                                                               
222     }                                                                   
223     catch ( Exception e ) {                                             
224       if ( conv.indexOf(',') == -1 &&                                 
225          conv.indexOf('-') == -1 &&                                 
226          conv.indexOf('/') == -1 && !ignored ) {                    
227         ignoreCron( conv );                                         
228       }                                                               
229     }                                                                   
230     return retValue;                                                    
231   }
232 
233   
234   private void ignoreCron( String ignoredParam ) {                        
235     String paramWord = "";                                              
236     switch(paramNr) {                                                   
237     case 1: paramWord = "MINUTE"; break;                                
238     case 2: paramWord = "HOUR"; break;                                  
239     case 3: paramWord = "DAY"; break;                                   
240     case 4: paramWord = "MONTH"; break;                                 
241     case 5: paramWord = "DAY OF WEEK"; break;                           
242     }                                                                   
243     errMsg =  "Bad " +paramWord+ " parameter:" + ignoredParam;
244     ignored = true;                                                     
245   }
246 
247 
248   class CronElement {                                                         
249         public int min;                                                         
250         public int hour;                                                        
251         public int day;                                                         
252         public int month;                                                       
253         public boolean week;                                                    
254         private CronElement() {                                                 
255         }                                                                       
256     }                                                                           
257                                                                                 
258                                                                                 
259     class CronCollector {                                                       
260         public String targetName  = "";                                         
261         public String cronString  = "";                                         
262         public String targetClass = "";                                         
263         private CronCollector() {                                               
264         }                                                                       
265     }
266 }