| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272 |
- 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<Object> 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<Value> 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<Object> getOptionalValues() {
- if (CollectionUtils.isEmpty(optionalValues)) {
- return null;
- }
- checkType();
- List<Object> 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<Object> 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;
- }
- }
|