/* * 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()] ); } }