GlobalParameter.java 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272
  1. package com.uas.kanban.model;
  2. import java.io.IOException;
  3. import java.util.ArrayList;
  4. import java.util.List;
  5. import java.util.Objects;
  6. import org.mongodb.morphia.annotations.Embedded;
  7. import org.mongodb.morphia.annotations.Entity;
  8. import com.uas.kanban.annotation.FieldProperty;
  9. import com.uas.kanban.base.BaseEntity;
  10. import com.uas.kanban.util.CollectionUtils;
  11. import com.uas.kanban.util.ObjectUtils;
  12. /**
  13. * 公共参数
  14. *
  15. * @author sunyj
  16. * @since 2017年9月7日 下午4:04:04
  17. */
  18. @Entity
  19. public class GlobalParameter extends BaseEntity {
  20. private static final long serialVersionUID = 1L;
  21. /**
  22. * 临时变量,用来存储 value(防止 type 未初始化时,value 无法设置)
  23. */
  24. private transient Object tempValue;
  25. /**
  26. * 临时变量,用来存储 optionalValues(防止 type 未初始化时,value 无法设置)
  27. */
  28. private transient List<Object> tempOptionalValues;
  29. /**
  30. * 参数名称,需要和模板中保持一致
  31. */
  32. @FieldProperty(nullable = false)
  33. private String name;
  34. /**
  35. * 参数类型
  36. */
  37. @FieldProperty(nullable = false)
  38. private Type type;
  39. /**
  40. * 输入方式
  41. */
  42. @FieldProperty(nullable = false)
  43. private InputMode inputMode;
  44. /**
  45. * 输入方式为 {@link InputMode#Radio} 或 {@link InputMode#DropDownBox}
  46. * 时,可选择的值,此时不可为空
  47. */
  48. @Embedded
  49. private List<Value> optionalValues;
  50. /**
  51. * 输入方式为 {@link InputMode#Radio} 或 {@link InputMode#DropDownBox} 时,默认值的序号
  52. */
  53. private Integer defaultOptionalValueIndex;
  54. /**
  55. * 应用模版时,选择或者输入的值
  56. */
  57. @Embedded
  58. private Value value;
  59. @Override
  60. public void init() {
  61. if (!ObjectUtils.isEmpty(getValue())) {
  62. throw new IllegalArgumentException("不能指定value:" + this.toString());
  63. }
  64. super.init();
  65. }
  66. public String getName() {
  67. return name;
  68. }
  69. public void setName(String name) {
  70. this.name = name;
  71. }
  72. public Type getType() {
  73. return type;
  74. }
  75. public void setType(Type type) {
  76. this.type = type;
  77. setValue(tempValue);
  78. setOptionalValues(tempOptionalValues);
  79. }
  80. public InputMode getInputMode() {
  81. return inputMode;
  82. }
  83. public void setInputMode(InputMode inputMode) {
  84. this.inputMode = inputMode;
  85. }
  86. public Integer getDefaultOptionalValueIndex() {
  87. return defaultOptionalValueIndex;
  88. }
  89. public void setDefaultOptionalValueIndex(Integer defaultOptionalValueIndex) {
  90. this.defaultOptionalValueIndex = defaultOptionalValueIndex;
  91. }
  92. @Override
  93. public String toString() {
  94. return "GlobalParameter [name=" + name + ", type=" + type + ", inputMode=" + inputMode + ", optionalValues="
  95. + optionalValues + ", defaultOptionalValueIndex=" + defaultOptionalValueIndex + ", value=" + value
  96. + ", id=" + id + ", createTime=" + createTime + ", lastModified=" + lastModified + ", version="
  97. + version + ", code=" + code + "]";
  98. }
  99. /**
  100. * 对于 optionalValues 的操作需注意,因为通过该方法得到的 optionalValues 与 this.optionalValues
  101. * 实际上是两个独立的对象,所以更改了返回值 optionalValues 之后,需要重新调用该方法以便应用更改
  102. *
  103. * @return
  104. */
  105. public List<Object> getOptionalValues() {
  106. if (CollectionUtils.isEmpty(optionalValues)) {
  107. return null;
  108. }
  109. checkType();
  110. List<Object> values = new ArrayList<>();
  111. for (Value v : optionalValues) {
  112. values.add(v == null ? null : v.getValue(type));
  113. }
  114. return values;
  115. }
  116. /**
  117. * 对于 optionalValues 的操作需注意,因为该方法的参数 optionalValues 与 this.optionalValues
  118. * 实际上是两个独立的对象,更改参数 optionalValues 之后,需要重新调用该方法以便应用更改
  119. *
  120. * @param optionalValues
  121. */
  122. public void setOptionalValues(List<Object> optionalValues) {
  123. if (type == null) {
  124. tempOptionalValues = optionalValues;
  125. return;
  126. }
  127. if (!CollectionUtils.isEmpty(optionalValues)) {
  128. this.optionalValues = new ArrayList<>();
  129. for (Object object : optionalValues) {
  130. Value v = new Value();
  131. v.setValue(type, object);
  132. this.optionalValues.add(v);
  133. }
  134. }
  135. }
  136. public Object getValue() {
  137. if (value == null) {
  138. return null;
  139. }
  140. checkType();
  141. return value.getValue(type);
  142. }
  143. public void setValue(Object value) {
  144. if (type == null) {
  145. tempValue = value;
  146. return;
  147. }
  148. if (this.value == null) {
  149. this.value = new Value();
  150. }
  151. this.value.setValue(type, value);
  152. }
  153. private void checkType() {
  154. if (type == null) {
  155. throw new IllegalStateException("type 为空:" + this);
  156. }
  157. }
  158. /**
  159. * 初始化参数值(如果已填写,不初始化)
  160. */
  161. public void mayInitValue(){
  162. if (!ObjectUtils.isEmpty(getValue())) {
  163. return;
  164. }
  165. if((inputMode == InputMode.Radio || inputMode == InputMode.DropDownBox) && optionalValues != null){
  166. try {
  167. value = ObjectUtils.clone(optionalValues.get(defaultOptionalValueIndex == null ? 0 : defaultOptionalValueIndex - 1));
  168. } catch (IOException | ClassNotFoundException e) {
  169. throw new IllegalStateException("初始化公共参数出错", e);
  170. }
  171. }
  172. }
  173. /**
  174. * 检查参数
  175. *
  176. * @throws IllegalArgumentException
  177. * 必填参数没有填写时,报错
  178. */
  179. public void checkValue() throws IllegalArgumentException {
  180. // 检查参数值是否已填写
  181. if (ObjectUtils.isEmpty(getValue())) {
  182. if((inputMode == InputMode.Radio || inputMode == InputMode.DropDownBox) && optionalValues != null){
  183. value = optionalValues.get(defaultOptionalValueIndex == null ? 0 : defaultOptionalValueIndex - 1);
  184. }
  185. else{
  186. throw new IllegalArgumentException("需填写公共参数:code=" + code + ", name=" + name);
  187. }
  188. }
  189. // 通过单选或下拉框方式填写参数时,参数值必须是可选项中的一个值
  190. if ((inputMode == InputMode.Radio || inputMode == InputMode.DropDownBox) && optionalValues != null) {
  191. for (Object obj : optionalValues) {
  192. if (Objects.equals(obj, value)) {
  193. return;
  194. }
  195. }
  196. }
  197. throw new IllegalArgumentException("参数值 " + value + " 不属于 " + optionalValues);
  198. }
  199. @Override
  200. public boolean equals(Object obj) {
  201. if (this == obj) {
  202. return true;
  203. }
  204. if (obj == null || getClass() != obj.getClass() || !(obj instanceof GlobalParameter)) {
  205. return false;
  206. }
  207. GlobalParameter other = (GlobalParameter) obj;
  208. return Objects.equals(code, other.getCode()) && Objects.equals(name, other.getName())
  209. && Objects.equals(type, other.getType()) && Objects.equals(inputMode, other.getInputMode())
  210. && Objects.equals(getOptionalValues(), other.getOptionalValues())
  211. && Objects.equals(defaultOptionalValueIndex, other.getDefaultOptionalValueIndex())
  212. && Objects.equals(getValue(), other.getValue());
  213. }
  214. /**
  215. * 输入方式
  216. *
  217. * @author sunyj
  218. * @since 2017年9月1日 下午8:01:53
  219. */
  220. public enum InputMode {
  221. /**
  222. * 单选
  223. */
  224. Radio,
  225. /**
  226. * 下拉框
  227. */
  228. DropDownBox,
  229. /**
  230. * 手输
  231. */
  232. Manual;
  233. }
  234. }