001package gu.dtalk;
002
003import java.util.Arrays;
004import java.util.Collections;
005import java.util.List;
006import java.util.Set;
007
008import com.alibaba.fastjson.annotation.JSONField;
009import com.google.common.base.MoreObjects;
010import com.google.common.base.Predicate;
011import com.google.common.base.Predicates;
012import static com.google.common.base.Preconditions.*;
013
014/**
015 * 单选列表选项
016 * @author guyadong
017 *
018 * @param <E>
019 */
020public class SwitchOption<E> extends CheckOption<E> {
021        @JSONField(serialize = false,deserialize = false)
022        private final Predicate<Set<Integer>> switchValidator = new Predicate<Set<Integer>>() {
023
024                @Override
025                public boolean apply(Set<Integer> input) {                        
026                        return input.size() == 1;
027                }
028        };
029        public SwitchOption() {
030                super();
031                super.setValidator(switchValidator);
032        }
033
034        @Override
035        public final OptionType getType() {
036                return OptionType.SWITCH;
037        }
038
039        @Override
040        public BaseOption<Set<Integer>> setValidator(Predicate<Set<Integer>> validator) {
041                return super.setValidator(Predicates.and(switchValidator, validator));
042        }
043
044        @JSONField(serialize = false,deserialize = false)
045        public E getSwitch(){
046                List<E> list = getSelected();
047                return list.size()>0 ? list.get(0) : null;
048        }
049        @JSONField(serialize = false,deserialize = false)
050        public CheckOption<E> setSwitch(E value){
051                return setSelected(Arrays.asList(value));
052        }
053
054        @JSONField(serialize = false,deserialize = false)
055        @Override
056        public CheckOption<E> setSelected(List<E> sel) {
057                sel = MoreObjects.firstNonNull(sel, Collections.<E>emptyList());
058                if(!sel.isEmpty()){
059                        checkArgument(sel.size()==1,"TOO MANY SELECTED OPTIONS");
060                }
061                return super.setSelected(sel);
062        }
063
064}