001package gu.dtalk;
002
003import static com.google.common.base.Preconditions.*;
004
005import java.lang.reflect.Modifier;
006import java.util.Collection;
007import java.util.List;
008
009import com.google.common.base.Throwables;
010
011/**
012 * 菜单条目构造器
013 * @author guyadong
014 *
015 * @param <T>
016 */
017public class ItemBuilder<T extends BaseItem> {
018
019        protected final T item;
020        public ItemBuilder(T item) {
021                super();
022                this.item = item;
023        }
024        public ItemBuilder<T> name(String name) {
025                item.setName(name);
026                return this;
027        }
028
029        public ItemBuilder<T> disable(boolean disable) {
030                item.setDisable(disable);
031                return this;
032        }
033
034        public ItemBuilder<T> description(String description) {
035                item.setDescription(description);
036                return this;
037        }
038
039        public ItemBuilder<T> uiName(String uiName) {
040                item.setUiName(uiName);
041                return this;
042        }
043
044        public ItemBuilder<T> childs(List<BaseItem> childs) {
045                checkState(item.isContainer(),"%s isn't container",item.getClass().getSimpleName());
046                item.setChilds(childs);
047                return this;
048        }
049
050        public ItemBuilder<T> addChilds(BaseItem... childs) {
051                checkState(item.isContainer(),"%s isn't container",item.getClass().getSimpleName());
052                item.addChilds(childs);
053                return this;
054        }
055
056        public ItemBuilder<T> addChilds(Collection<BaseItem> childs) {
057                checkState(item.isContainer(),"%s isn't container",item.getClass().getSimpleName());
058                item.addChilds(childs);
059                return this;
060        }
061
062        public T instance(){
063                return item;
064        }
065        public static <T extends BaseItem>ItemBuilder<T> builder(T instance) {
066                return new ItemBuilder<T>(checkNotNull(instance,"instance is null"));
067        }
068        public static <T extends BaseItem>ItemBuilder<T> builder(Class<T> type) {
069                // 不允许为抽象类
070                checkArgument(!Modifier.isAbstract(type.getModifiers()),"%s is a abstract class",type.getName());
071                try {
072                        return new ItemBuilder<T>(type.newInstance());
073                } catch (Exception e) {
074                        Throwables.throwIfUnchecked(e);
075                        throw new RuntimeException(e);
076                }
077        }
078}