/*
 * Copyright 2012 gitblit.com.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.gitblit.utils;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;


/**
 * Utility class for arrays and collections.
 *
 * @author James Moger
 *
 */
public class ArrayUtils {

	public static boolean isEmpty(byte [] array) {
		return array == null || array.length == 0;
	}

	public static boolean isEmpty(char [] array) {
		return array == null || array.length == 0;
	}

	public static boolean isEmpty(Object [] array) {
		return array == null || array.length == 0;
	}

	public static boolean isEmpty(Collection<?> collection) {
		return collection == null || collection.size() == 0;
	}

	public static String toString(Collection<?> collection) {
		if (isEmpty(collection)) {
			return "";
		}
		StringBuilder sb = new StringBuilder();
		for (Object o : collection) {
			sb.append(o.toString()).append(", ");
		}
		// trim trailing comma-space
		sb.setLength(sb.length() - 2);
		return sb.toString();
	}

	public static Collection<String> fromString(String value) {
		if (StringUtils.isEmpty(value)) {
			value = "";
		}
		List<String> list = new ArrayList<String>();
		String [] values = value.split(",|;");
		for (String v : values) {
			String string = v.trim();
			if (!StringUtils.isEmpty(string)) {
				list.add(string);
			}
		}
		return list;
	}

	public static <X> List<X> join(List<X>... elements) {
		List<X> list = new ArrayList<X>();
		for (List<X> element : elements) {
			list.addAll(element);
		}
		return list;
	}

	public static <X> List<X> join(X[]... elements) {
		List<X> list = new ArrayList<X>();
		for (X[] element : elements) {
			list.addAll(Arrays.asList(element));
		}
		return list;
	}
}
