package com.uas.kanban.model; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Objects; import org.mongodb.morphia.annotations.Embedded; import org.mongodb.morphia.annotations.Entity; import com.uas.kanban.annotation.FieldProperty; import com.uas.kanban.base.BaseEntity; import com.uas.kanban.util.CollectionUtils; import com.uas.kanban.util.ObjectUtils; /** * 公共参数 * * @author sunyj * @since 2017年9月7日 下午4:04:04 */ @Entity public class GlobalParameter extends BaseEntity { private static final long serialVersionUID = 1L; /** * 临时变量,用来存储 value(防止 type 未初始化时,value 无法设置) */ private transient Object tempValue; /** * 临时变量,用来存储 optionalValues(防止 type 未初始化时,value 无法设置) */ private transient List tempOptionalValues; /** * 参数名称,需要和模板中保持一致 */ @FieldProperty(nullable = false) private String name; /** * 参数类型 */ @FieldProperty(nullable = false) private Type type; /** * 输入方式 */ @FieldProperty(nullable = false) private InputMode inputMode; /** * 输入方式为 {@link InputMode#Radio} 或 {@link InputMode#DropDownBox} * 时,可选择的值,此时不可为空 */ @Embedded private List optionalValues; /** * 输入方式为 {@link InputMode#Radio} 或 {@link InputMode#DropDownBox} 时,默认值的序号 */ private Integer defaultOptionalValueIndex; /** * 应用模版时,选择或者输入的值 */ @Embedded private Value value; @Override public void init() { if (!ObjectUtils.isEmpty(getValue())) { throw new IllegalArgumentException("不能指定value:" + this.toString()); } super.init(); } public String getName() { return name; } public void setName(String name) { this.name = name; } public Type getType() { return type; } public void setType(Type type) { this.type = type; setValue(tempValue); setOptionalValues(tempOptionalValues); } public InputMode getInputMode() { return inputMode; } public void setInputMode(InputMode inputMode) { this.inputMode = inputMode; } public Integer getDefaultOptionalValueIndex() { return defaultOptionalValueIndex; } public void setDefaultOptionalValueIndex(Integer defaultOptionalValueIndex) { this.defaultOptionalValueIndex = defaultOptionalValueIndex; } @Override public String toString() { return "GlobalParameter [name=" + name + ", type=" + type + ", inputMode=" + inputMode + ", optionalValues=" + optionalValues + ", defaultOptionalValueIndex=" + defaultOptionalValueIndex + ", value=" + value + ", id=" + id + ", createTime=" + createTime + ", lastModified=" + lastModified + ", version=" + version + ", code=" + code + "]"; } /** * 对于 optionalValues 的操作需注意,因为通过该方法得到的 optionalValues 与 this.optionalValues * 实际上是两个独立的对象,所以更改了返回值 optionalValues 之后,需要重新调用该方法以便应用更改 * * @return */ public List getOptionalValues() { if (CollectionUtils.isEmpty(optionalValues)) { return null; } checkType(); List values = new ArrayList<>(); for (Value v : optionalValues) { values.add(v == null ? null : v.getValue(type)); } return values; } /** * 对于 optionalValues 的操作需注意,因为该方法的参数 optionalValues 与 this.optionalValues * 实际上是两个独立的对象,更改参数 optionalValues 之后,需要重新调用该方法以便应用更改 * * @param optionalValues */ public void setOptionalValues(List optionalValues) { if (type == null) { tempOptionalValues = optionalValues; return; } if (!CollectionUtils.isEmpty(optionalValues)) { this.optionalValues = new ArrayList<>(); for (Object object : optionalValues) { Value v = new Value(); v.setValue(type, object); this.optionalValues.add(v); } } } public Object getValue() { if (value == null) { return null; } checkType(); return value.getValue(type); } public void setValue(Object value) { if (type == null) { tempValue = value; return; } if (this.value == null) { this.value = new Value(); } this.value.setValue(type, value); } private void checkType() { if (type == null) { throw new IllegalStateException("type 为空:" + this); } } /** * 初始化参数值(如果已填写,不初始化) */ public void mayInitValue(){ if (!ObjectUtils.isEmpty(getValue())) { return; } if((inputMode == InputMode.Radio || inputMode == InputMode.DropDownBox) && optionalValues != null){ try { value = ObjectUtils.clone(optionalValues.get(defaultOptionalValueIndex == null ? 0 : defaultOptionalValueIndex - 1)); } catch (IOException | ClassNotFoundException e) { throw new IllegalStateException("初始化公共参数出错", e); } } } /** * 检查参数 * * @throws IllegalArgumentException * 必填参数没有填写时,报错 */ public void checkValue() throws IllegalArgumentException { // 检查参数值是否已填写 if (ObjectUtils.isEmpty(getValue())) { if((inputMode == InputMode.Radio || inputMode == InputMode.DropDownBox) && optionalValues != null){ value = optionalValues.get(defaultOptionalValueIndex == null ? 0 : defaultOptionalValueIndex - 1); } else{ throw new IllegalArgumentException("需填写公共参数:code=" + code + ", name=" + name); } } // 通过单选或下拉框方式填写参数时,参数值必须是可选项中的一个值 if ((inputMode == InputMode.Radio || inputMode == InputMode.DropDownBox) && optionalValues != null) { for (Object obj : optionalValues) { if (Objects.equals(obj, value)) { return; } } } throw new IllegalArgumentException("参数值 " + value + " 不属于 " + optionalValues); } @Override public boolean equals(Object obj) { if (this == obj) { return true; } if (obj == null || getClass() != obj.getClass() || !(obj instanceof GlobalParameter)) { return false; } GlobalParameter other = (GlobalParameter) obj; return Objects.equals(code, other.getCode()) && Objects.equals(name, other.getName()) && Objects.equals(type, other.getType()) && Objects.equals(inputMode, other.getInputMode()) && Objects.equals(getOptionalValues(), other.getOptionalValues()) && Objects.equals(defaultOptionalValueIndex, other.getDefaultOptionalValueIndex()) && Objects.equals(getValue(), other.getValue()); } /** * 输入方式 * * @author sunyj * @since 2017年9月1日 下午8:01:53 */ public enum InputMode { /** * 单选 */ Radio, /** * 下拉框 */ DropDownBox, /** * 手输 */ Manual; } }