dmg.util.command.AnnotatedCommandUtils.java Source code

Java tutorial

Introduction

Here is the source code for dmg.util.command.AnnotatedCommandUtils.java

Source

/* dCache - http://www.dcache.org/
 *
 * Copyright (C) 2013 Deutsches Elektronen-Synchrotron
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as
 * published by the Free Software Foundation, either version 3 of the
 * License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
package dmg.util.command;

import com.google.common.base.Function;
import com.google.common.collect.Lists;
import com.google.common.collect.Multimap;
import com.google.common.collect.Ordering;
import com.google.common.collect.TreeMultimap;

import java.lang.reflect.Field;
import java.util.Collections;
import java.util.List;

public class AnnotatedCommandUtils {
    private static final Function<Field, Integer> GET_ARGUMENT_INDEX = new Function<Field, Integer>() {
        @Override
        public Integer apply(Field field) {
            return field.getAnnotation(Argument.class).index();
        }
    };
    private static final Function<Field, String> GET_NAME = new Function<Field, String>() {
        @Override
        public String apply(Field field) {
            Option option = field.getAnnotation(Option.class);
            return option != null ? option.name() : String.valueOf(Character.MAX_VALUE);
        }
    };

    private AnnotatedCommandUtils() {
    }

    /**
     * Returns the option fields grouped by category of a given command class.
     */
    public static Multimap<String, Field> getOptionsByCategory(Class<?> clazz) {
        Multimap<String, Field> options = TreeMultimap.create(Ordering.natural(),
                Ordering.natural().onResultOf(GET_NAME));
        for (Class<?> c = clazz; c != null; c = c.getSuperclass()) {
            for (Field field : c.getDeclaredFields()) {
                Option option = field.getAnnotation(Option.class);
                if (option != null) {
                    options.put(option.category(), field);
                }
                CommandLine cmd = field.getAnnotation(CommandLine.class);
                if (cmd != null) {
                    options.put(cmd.category(), field);
                }
            }
        }
        return options;
    }

    /**
     * Returns the arguments fields of a given command class.
     */
    public static List<Field> getArguments(Class<?> clazz) {
        List<Field> arguments = Lists.newArrayList();
        for (Class<?> c = clazz; c != null; c = c.getSuperclass()) {
            for (Field field : c.getDeclaredFields()) {
                if (field.isAnnotationPresent(Argument.class)) {
                    arguments.add(field);
                }
            }
        }
        Collections.sort(arguments, Ordering.natural().onResultOf(GET_ARGUMENT_INDEX));
        return arguments;
    }
}