001 /*
002 * Copyright 2010-2013 JetBrains s.r.o.
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016
017 package com.sampullara.cli;
018
019 import com.intellij.openapi.util.text.StringUtil;
020 import com.intellij.util.Function;
021 import com.intellij.util.containers.ComparatorUtil;
022 import org.jetbrains.annotations.NotNull;
023
024 import java.lang.reflect.Field;
025 import java.util.ArrayList;
026 import java.util.List;
027
028 public class ArgumentUtils {
029
030 private ArgumentUtils() {}
031
032 @NotNull
033 public static <T> List<String> convertArgumentsToStringList(@NotNull T arguments, @NotNull T defaultArguments) {
034 List<String> result = new ArrayList<String>();
035 convertArgumentsToStringList(arguments, defaultArguments, result);
036 return result;
037 }
038
039 public static <T> void convertArgumentsToStringList(@NotNull T arguments, @NotNull T defaultArguments, @NotNull List<String> result) {
040 convertArgumentsToStringList(arguments, defaultArguments, arguments.getClass(), result);
041 }
042
043 private static <T> void convertArgumentsToStringList(T arguments, T defaultArguments, Class clazz, List<String> result) {
044 Class superClazz = clazz.getSuperclass();
045 if (superClazz != null) {
046 convertArgumentsToStringList(arguments, defaultArguments, superClazz, result);
047 }
048
049 for (Field field : clazz.getDeclaredFields()) {
050 Argument argument = field.getAnnotation(Argument.class);
051 if (argument == null) continue;
052
053 Object value;
054 Object defaultValue;
055 try {
056 value = field.get(arguments);
057 defaultValue = field.get(defaultArguments);
058 }
059 catch (IllegalAccessException ignored) {
060 // skip this field
061 continue;
062 }
063
064 if (ComparatorUtil.equalsNullable(value, defaultValue)) continue;
065
066 String name = Args.getAlias(argument);
067 if (name == null) {
068 name = Args.getName(argument, field);
069 }
070
071 Class<?> fieldType = field.getType();
072
073 if (fieldType.isArray()) {
074 Object[] values = (Object[]) value;
075 if (values.length == 0) continue;
076 value = StringUtil.join(values, Function.TO_STRING, argument.delimiter());
077 }
078
079 result.add(argument.prefix() + name);
080
081 if (fieldType == boolean.class || fieldType == Boolean.class) continue;
082
083 result.add(value.toString());
084 }
085 }
086
087 }