View Javadoc

1   /**
2    * Copyright (C) 2005-2009 Alfresco Software Limited.
3    *
4    * This file is part of the Spring Surf Extension project.
5    *
6    * Licensed under the Apache License, Version 2.0 (the "License");
7    * you may not use this file except in compliance with the License.
8    * You may obtain a copy of the License at
9    *
10   *  http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing, software
13   * distributed under the License is distributed on an "AS IS" BASIS,
14   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15   * See the License for the specific language governing permissions and
16   * limitations under the License.
17   */
18  
19  package org.springframework.extensions.webscripts;
20  
21  import java.util.Date;
22  import java.util.List;
23  
24  import freemarker.template.TemplateDateModel;
25  import freemarker.template.TemplateMethodModelEx;
26  import freemarker.template.TemplateModelException;
27  import freemarker.template.TemplateNumberModel;
28  import freemarker.template.TemplateScalarModel;
29  
30  /**
31   * @author Kevin Roast
32   * 
33   * Custom FreeMarker Template language method.
34   * <p>
35   * Perform a test to see how two dates compare, optionally offset by a specified number of milliseconds.
36   * <p>
37   * Usage: 
38   *    dateCompare(dateA, dateB) - 1 if dateA if greater than dateB
39   *    dateCompare(dateA, dateB, millis) - 1 if dateA is greater than dateB by at least millis, else 0
40   *    dateCompare(dateA, dateB, millis, test) - same as above, but the 'test' variable is one of the
41   *          following strings ">", "<", "==" - greater than, less than or equal - as the test to perform.
42   */
43  public class DateCompareMethod implements TemplateMethodModelEx
44  {
45      /**
46       * @see freemarker.template.TemplateMethodModel#exec(java.util.List)
47       */
48      public Object exec(List args) throws TemplateModelException
49      {
50          int result = 0;
51          
52          if (args.size() >= 2)
53          {
54              Object arg0 = args.get(0);
55              Object arg1 = args.get(1);
56              long diff = 0;
57              if (args.size() == 3)
58              {
59                 Object arg2 = args.get(2);
60                 if (arg2 instanceof TemplateNumberModel)
61                 {
62                    Number number = ((TemplateNumberModel)arg2).getAsNumber();
63                    diff = number.longValue();
64                 }
65              }
66              String test = null;
67              if (args.size() == 4)
68              {
69                  Object arg3 = args.get(3);
70                  if (arg3 instanceof TemplateScalarModel)
71                  {
72                      test = ((TemplateScalarModel)arg3).getAsString();
73                  }
74              }
75              if (arg0 instanceof TemplateDateModel && arg1 instanceof TemplateDateModel)
76              {
77                  Date dateA = (Date)(((TemplateDateModel)arg0).getAsDate()).clone();
78                  Date dateB = (Date)(((TemplateDateModel)arg1).getAsDate()).clone();
79                  switch (((TemplateDateModel)arg0).getDateType())
80                  {
81                      case TemplateDateModel.DATE:
82                          // clear time part
83                          dateA.setHours(0);
84                          dateA.setMinutes(0);
85                          dateA.setSeconds(0);
86                          dateA = new Date(dateA.getTime() / 1000L * 1000L);
87                          break;
88                      case TemplateDateModel.TIME:
89                          // clear date part
90                          dateA.setDate(1);
91                          dateA.setMonth(0);
92                          dateA.setYear(0);
93                          break;
94                  }
95                  switch (((TemplateDateModel)arg1).getDateType())
96                  {
97                      case TemplateDateModel.DATE:
98                          // clear time part
99                          dateB.setHours(0);
100                         dateB.setMinutes(0);
101                         dateB.setSeconds(0);
102                         dateB = new Date(dateB.getTime() / 1000L * 1000L);
103                         break;
104                     case TemplateDateModel.TIME:
105                         // clear date part
106                         dateB.setDate(1);
107                         dateB.setMonth(0);
108                         dateB.setYear(0);
109                         break;
110                 }
111                 if (test == null || test.equals(">"))
112                 {
113                     if (dateA.getTime() > (dateB.getTime() - diff)) 
114                     {
115                        result = 1;
116                     }
117                 }
118                 else if (test.equals("<"))
119                 {
120                     if (dateA.getTime() < (dateB.getTime() - diff)) 
121                     {
122                        result = 1;
123                     }
124                 }
125                 else if (test.equals("=="))
126                 {
127                     if (dateA.getTime() == (dateB.getTime() - diff)) 
128                     {
129                        result = 1;
130                     }
131                 }
132             }
133         }
134         
135         return result;
136     }
137 }