/*
* Copyright 2008 Alin Dreghiciu.
*
* 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 org.ops4j.pax.exam;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.ops4j.pax.exam.options.CompositeOption;
/**
* Utility methods related to {@link Option}s.
*
* @author Alin Dreghiciu (adreghiciu@gmail.com)
* @since 0.3.0, December 08, 2008
*/
public class OptionUtils {
/**
* Utility class. Ment to be used via the static factory methods.
*/
private OptionUtils() {
// utility class
}
/**
* Expand options to one level by expanding eventual {@link CompositeOption}. During this
* process null options are eliminated.
*
* @param options
* options to be expanded (can be null or an empty array)
*
* @return expanded options (never null). In case that the options to be expanded is null an
* empty array is returned
*/
public static Option[] expand(final Option... options) {
final List<Option> expanded = new ArrayList<Option>();
if (options != null) {
for (Option option : options) {
if (option != null) {
if (option instanceof CompositeOption) {
expanded.addAll(Arrays.asList(((CompositeOption) option).getOptions()));
}
else {
expanded.add(option);
}
}
}
}
return expanded.toArray(new Option[expanded.size()]);
}
/**
* Combines two arrays of options in one array containing both provided arrays in order they are
* provided.
*
* @param options1
* array of options (can be null or empty array)
* @param options2
* array of options (can be null or empty array)
*
* @return combined array of options (never null). In case that both arrays are null or empty an
* empty array is returned
*/
public static Option[] combine(final Option[] options1, final Option... options2) {
int size1 = 0;
if (options1 != null && options1.length > 0) {
size1 += options1.length;
}
int size2 = 0;
if (options2 != null && options2.length > 0) {
size2 += options2.length;
}
final Option[] combined = new Option[size1 + size2];
if (size1 > 0) {
System.arraycopy(options1, 0, combined, 0, size1);
}
if (size2 > 0) {
System.arraycopy(options2, 0, combined, size1, size2);
}
return combined;
}
/**
* Filters the provided options by class returning an array of those option that are instance of
* the provided class. Before filtering the options are expanded {@link #expand(Option[])}.
*
* @param optionType
* class of the desired options
* @param options
* options to be filtered (can be null or empty array)
* @param <T>
* type of desired options
*
* @return array of desired option type (never null). In case that the array of filtered options
* is null, empty or there is no option that matches the desired type an empty array is
* returned
*/
@SuppressWarnings("unchecked")
public static <T extends Option> T[] filter(final Class<T> optionType, final Option... options) {
final List<T> filtered = new ArrayList<T>();
for (Option option : expand(options)) {
if (optionType.isAssignableFrom(option.getClass())) {
filtered.add((T) option);
}
}
final T[] result = (T[]) Array.newInstance(optionType, filtered.size());
return filtered.toArray(result);
}
/**
* Removes from the provided options all options that are instance of the provided class,
* returning the remaining options.
*
* @param optionType
* class of the desired options to be removed
* @param options
* options to be filtered (can be null or empty array)
*
* @return array of remaining options (never null) after removing the desired type
*/
public static Option[] remove(final Class<? extends Option> optionType, final Option... options) {
final List<Option> filtered = new ArrayList<Option>();
for (Option option : expand(options)) {
if (!optionType.isAssignableFrom(option.getClass())) {
filtered.add(option);
}
}
return filtered.toArray(new Option[filtered.size()]);
}
}