• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /**
2  * Copyright 2003-2007 Jive Software.
3  *
4  * All rights reserved. Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *     http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package org.jivesoftware.smackx.workgroup.util;
18 
19 import java.util.*;
20 
21 /**
22  * Utility methods frequently used by data classes and design-time
23  * classes.
24  */
25 public final class ModelUtil {
ModelUtil()26     private ModelUtil() {
27         //  Prevents instantiation.
28     }
29 
30     /**
31      * This is a utility method that compares two objects when one or
32      * both of the objects might be <CODE>null</CODE>  The result of
33      * this method is determined as follows:
34      * <OL>
35      * <LI>If <CODE>o1</CODE> and <CODE>o2</CODE> are the same object
36      * according to the <CODE>==</CODE> operator, return
37      * <CODE>true</CODE>.
38      * <LI>Otherwise, if either <CODE>o1</CODE> or <CODE>o2</CODE> is
39      * <CODE>null</CODE>, return <CODE>false</CODE>.
40      * <LI>Otherwise, return <CODE>o1.equals(o2)</CODE>.
41      * </OL>
42      * <p/>
43      * This method produces the exact logically inverted result as the
44      * {@link #areDifferent(Object, Object)} method.<P>
45      * <p/>
46      * For array types, one of the <CODE>equals</CODE> methods in
47      * {@link java.util.Arrays} should be used instead of this method.
48      * Note that arrays with more than one dimension will require some
49      * custom code in order to implement <CODE>equals</CODE> properly.
50      */
areEqual(Object o1, Object o2)51     public static final boolean areEqual(Object o1, Object o2) {
52         if (o1 == o2) {
53             return true;
54         }
55         else if (o1 == null || o2 == null) {
56             return false;
57         }
58         else {
59             return o1.equals(o2);
60         }
61     }
62 
63     /**
64      * This is a utility method that compares two Booleans when one or
65      * both of the objects might be <CODE>null</CODE>  The result of
66      * this method is determined as follows:
67      * <OL>
68      * <LI>If <CODE>b1</CODE> and <CODE>b2</CODE> are both TRUE or
69      * neither <CODE>b1</CODE> nor <CODE>b2</CODE> is TRUE,
70      * return <CODE>true</CODE>.
71      * <LI>Otherwise, return <CODE>false</CODE>.
72      * </OL>
73      * <p/>
74      */
areBooleansEqual(Boolean b1, Boolean b2)75     public static final boolean areBooleansEqual(Boolean b1, Boolean b2) {
76         // !jwetherb treat NULL the same as Boolean.FALSE
77         return (b1 == Boolean.TRUE && b2 == Boolean.TRUE) ||
78                 (b1 != Boolean.TRUE && b2 != Boolean.TRUE);
79     }
80 
81     /**
82      * This is a utility method that compares two objects when one or
83      * both of the objects might be <CODE>null</CODE>.  The result
84      * returned by this method is determined as follows:
85      * <OL>
86      * <LI>If <CODE>o1</CODE> and <CODE>o2</CODE> are the same object
87      * according to the <CODE>==</CODE> operator, return
88      * <CODE>false</CODE>.
89      * <LI>Otherwise, if either <CODE>o1</CODE> or <CODE>o2</CODE> is
90      * <CODE>null</CODE>, return <CODE>true</CODE>.
91      * <LI>Otherwise, return <CODE>!o1.equals(o2)</CODE>.
92      * </OL>
93      * <p/>
94      * This method produces the exact logically inverted result as the
95      * {@link #areEqual(Object, Object)} method.<P>
96      * <p/>
97      * For array types, one of the <CODE>equals</CODE> methods in
98      * {@link java.util.Arrays} should be used instead of this method.
99      * Note that arrays with more than one dimension will require some
100      * custom code in order to implement <CODE>equals</CODE> properly.
101      */
areDifferent(Object o1, Object o2)102     public static final boolean areDifferent(Object o1, Object o2) {
103         return !areEqual(o1, o2);
104     }
105 
106 
107     /**
108      * This is a utility method that compares two Booleans when one or
109      * both of the objects might be <CODE>null</CODE>  The result of
110      * this method is determined as follows:
111      * <OL>
112      * <LI>If <CODE>b1</CODE> and <CODE>b2</CODE> are both TRUE or
113      * neither <CODE>b1</CODE> nor <CODE>b2</CODE> is TRUE,
114      * return <CODE>false</CODE>.
115      * <LI>Otherwise, return <CODE>true</CODE>.
116      * </OL>
117      * <p/>
118      * This method produces the exact logically inverted result as the
119      * {@link #areBooleansEqual(Boolean, Boolean)} method.<P>
120      */
areBooleansDifferent(Boolean b1, Boolean b2)121     public static final boolean areBooleansDifferent(Boolean b1, Boolean b2) {
122         return !areBooleansEqual(b1, b2);
123     }
124 
125 
126     /**
127      * Returns <CODE>true</CODE> if the specified array is not null
128      * and contains a non-null element.  Returns <CODE>false</CODE>
129      * if the array is null or if all the array elements are null.
130      */
hasNonNullElement(Object[] array)131     public static final boolean hasNonNullElement(Object[] array) {
132         if (array != null) {
133             final int n = array.length;
134             for (int i = 0; i < n; i++) {
135                 if (array[i] != null) {
136                     return true;
137                 }
138             }
139         }
140         return false;
141     }
142 
143     /**
144      * Returns a single string that is the concatenation of all the
145      * strings in the specified string array.  A single space is
146      * put between each string array element.  Null array elements
147      * are skipped.  If the array itself is null, the empty string
148      * is returned.  This method is guaranteed to return a non-null
149      * value, if no expections are thrown.
150      */
concat(String[] strs)151     public static final String concat(String[] strs) {
152         return concat(strs, " ");  //NOTRANS
153     }
154 
155     /**
156      * Returns a single string that is the concatenation of all the
157      * strings in the specified string array.  The strings are separated
158      * by the specified delimiter.  Null array elements are skipped.  If
159      * the array itself is null, the empty string is returned.  This
160      * method is guaranteed to return a non-null value, if no expections
161      * are thrown.
162      */
concat(String[] strs, String delim)163     public static final String concat(String[] strs, String delim) {
164         if (strs != null) {
165             final StringBuilder buf = new StringBuilder();
166             final int n = strs.length;
167             for (int i = 0; i < n; i++) {
168                 final String str = strs[i];
169                 if (str != null) {
170                     buf.append(str).append(delim);
171                 }
172             }
173             final int length = buf.length();
174             if (length > 0) {
175                 //  Trim trailing space.
176                 buf.setLength(length - 1);
177             }
178             return buf.toString();
179         }
180         else {
181             return ""; // NOTRANS
182         }
183     }
184 
185     /**
186      * Returns <CODE>true</CODE> if the specified {@link String} is not
187      * <CODE>null</CODE> and has a length greater than zero.  This is
188      * a very frequently occurring check.
189      */
hasLength(String s)190     public static final boolean hasLength(String s) {
191         return (s != null && s.length() > 0);
192     }
193 
194 
195     /**
196      * Returns <CODE>null</CODE> if the specified string is empty or
197      * <CODE>null</CODE>.  Otherwise the string itself is returned.
198      */
nullifyIfEmpty(String s)199     public static final String nullifyIfEmpty(String s) {
200         return ModelUtil.hasLength(s) ? s : null;
201     }
202 
203     /**
204      * Returns <CODE>null</CODE> if the specified object is null
205      * or if its <CODE>toString()</CODE> representation is empty.
206      * Otherwise, the <CODE>toString()</CODE> representation of the
207      * object itself is returned.
208      */
nullifyingToString(Object o)209     public static final String nullifyingToString(Object o) {
210         return o != null ? nullifyIfEmpty(o.toString()) : null;
211     }
212 
213     /**
214      * Determines if a string has been changed.
215      *
216      * @param oldString is the initial value of the String
217      * @param newString is the new value of the String
218      * @return true If both oldString and newString are null or if they are
219      *         both not null and equal to each other.  Otherwise returns false.
220      */
hasStringChanged(String oldString, String newString)221     public static boolean hasStringChanged(String oldString, String newString) {
222         if (oldString == null && newString == null) {
223             return false;
224         }
225         else if ((oldString == null && newString != null)
226                 || (oldString != null && newString == null)) {
227             return true;
228         }
229         else {
230             return !oldString.equals(newString);
231         }
232     }
233 
getTimeFromLong(long diff)234     public static String getTimeFromLong(long diff) {
235         final String HOURS = "h";
236         final String MINUTES = "min";
237         final String SECONDS = "sec";
238 
239         final long MS_IN_A_DAY = 1000 * 60 * 60 * 24;
240         final long MS_IN_AN_HOUR = 1000 * 60 * 60;
241         final long MS_IN_A_MINUTE = 1000 * 60;
242         final long MS_IN_A_SECOND = 1000;
243         diff = diff % MS_IN_A_DAY;
244         long numHours = diff / MS_IN_AN_HOUR;
245         diff = diff % MS_IN_AN_HOUR;
246         long numMinutes = diff / MS_IN_A_MINUTE;
247         diff = diff % MS_IN_A_MINUTE;
248         long numSeconds = diff / MS_IN_A_SECOND;
249         diff = diff % MS_IN_A_SECOND;
250 
251         StringBuilder buf = new StringBuilder();
252         if (numHours > 0) {
253             buf.append(numHours + " " + HOURS + ", ");
254         }
255 
256         if (numMinutes > 0) {
257             buf.append(numMinutes + " " + MINUTES + ", ");
258         }
259 
260         buf.append(numSeconds + " " + SECONDS);
261 
262         String result = buf.toString();
263         return result;
264     }
265 
266 
267     /**
268      * Build a List of all elements in an Iterator.
269      */
iteratorAsList(Iterator<T> i)270     public static <T> List<T> iteratorAsList(Iterator<T> i) {
271         ArrayList<T> list = new ArrayList<T>(10);
272         while (i.hasNext()) {
273             list.add(i.next());
274         }
275         return list;
276     }
277 
278     /**
279      * Creates an Iterator that is the reverse of a ListIterator.
280      */
reverseListIterator(ListIterator<T> i)281     public static <T> Iterator<T> reverseListIterator(ListIterator<T> i) {
282         return new ReverseListIterator<T>(i);
283     }
284 }
285 
286 /**
287  * An Iterator that is the reverse of a ListIterator.
288  */
289 class ReverseListIterator<T> implements Iterator<T> {
290     private ListIterator<T> _i;
291 
ReverseListIterator(ListIterator<T> i)292     ReverseListIterator(ListIterator<T> i) {
293         _i = i;
294         while (_i.hasNext())
295             _i.next();
296     }
297 
hasNext()298     public boolean hasNext() {
299         return _i.hasPrevious();
300     }
301 
next()302     public T next() {
303         return _i.previous();
304     }
305 
remove()306     public void remove() {
307         _i.remove();
308     }
309 
310 }
311 
312 
313 
314 
315 
316 
317 
318 
319 
320 
321 
322 
323