001 /*
002 * Created on May 13, 2007
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
005 * the License. You may obtain a copy of the License at
006 *
007 * http://www.apache.org/licenses/LICENSE-2.0
008 *
009 * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
010 * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
011 * specific language governing permissions and limitations under the License.
012 *
013 * Copyright @2007 the original author or authors.
014 */
015 package org.fest.util;
016
017 import static java.lang.System.arraycopy;
018
019 import java.lang.reflect.Array;
020 import java.util.ArrayList;
021 import java.util.List;
022
023 /**
024 * Understands utility methods related to arrays.
025 *
026 * @author Alex Ruiz
027 * @author Joel Costigliola
028 */
029 public class Arrays {
030
031 private static final ArrayFormatter formatter = new ArrayFormatter();
032
033 /**
034 * Returns <code>true</code> if the given array is <code>null</code> or empty.
035 * @param <T> the type of elements of the array.
036 * @param array the array to check.
037 * @return <code>true</code> if the given array is <code>null</code> or empty, otherwise <code>false</code>.
038 */
039 public static <T> boolean isEmpty(T[] array) {
040 return array == null || array.length == 0;
041 }
042
043 /**
044 * Returns an array containing the given arguments.
045 * @param <T> the type of the array to return.
046 * @param values the values to store in the array.
047 * @return an array containing the given arguments.
048 */
049 public static <T> T[] array(T... values) {
050 return values;
051 }
052
053 /**
054 * Returns the <code>String</code> representation of the given array, or <code>null</code> if the given object is
055 * either <code>null</code> or not an array. This method supports arrays having other arrays as elements.
056 * @param array the object that is expected to be an array.
057 * @return the <code>String</code> representation of the given array.
058 */
059 public static String format(Object array) {
060 return formatter.format(array);
061 }
062
063 /**
064 * Returns a new array composed of the non-null elements of the given array. This method returns an empty array if the
065 * given array has only null elements or if it is empty. This method returns <code>null</code> if the given array is
066 * <code>null</code>.
067 * @param <T> the type of elements of the array.
068 * @param array the array we want to extract the non-null elements.
069 * @return a new array composed of the non-null elements of the given array, or <code>null</code> if the given array
070 * is <code>null</code>.
071 * @since 1.1.3
072 */
073 @SuppressWarnings("unchecked")
074 public static <T> T[] nonNullElements(T[] array) {
075 if (array == null) return null;
076 List<T> nonNullElements = new ArrayList<T>();
077 for (T o : array) if (o != null) nonNullElements.add(o);
078 int elementCount = nonNullElements.size();
079 T[] newArray = (T[]) Array.newInstance(array.getClass().getComponentType(), elementCount);
080 arraycopy(nonNullElements.toArray(), 0, newArray, 0, elementCount);
081 return newArray;
082 }
083
084 /**
085 * Returns <code>true</code> if the given array has only <code>null</code> elements, <code>false</code> otherwise.
086 * If given array is empty, this method returns <code>true</code>.
087 * @param <T> the type of elements of the array.
088 * @param array the given array. <b>It must not be null</b>.
089 * @return <code>true</code> if the given array has only <code>null</code> elements or is empty, <code>false</code>
090 * otherwise.
091 * @throws NullPointerException if the given array is <code>null</code>.
092 * @since 1.1.3
093 */
094 public static <T> boolean hasOnlyNullElements(T[] array) {
095 // TODO return false if array is empty.
096 if (array == null) throw new NullPointerException("The array to check should not be null");
097 for (T o : array) if (o != null) return false;
098 return true;
099 }
100
101 private Arrays() {}
102 }