/modules/apps/segments/segments-api/src/main/java/com/liferay/segments/constants/SegmentsExperimentConstants.java

https://github.com/kiyoshilee/liferay-portal · Java · 323 lines · 232 code · 74 blank · 17 comment · 14 complexity · 1883f883bd8bef8cb1cadbb6ef4362bf MD5 · raw file

  1. /**
  2. * Copyright (c) 2000-present Liferay, Inc. All rights reserved.
  3. *
  4. * This library is free software; you can redistribute it and/or modify it under
  5. * the terms of the GNU Lesser General Public License as published by the Free
  6. * Software Foundation; either version 2.1 of the License, or (at your option)
  7. * any later version.
  8. *
  9. * This library is distributed in the hope that it will be useful, but WITHOUT
  10. * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
  11. * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
  12. * details.
  13. */
  14. package com.liferay.segments.constants;
  15. import com.liferay.portal.kernel.util.SetUtil;
  16. import com.liferay.portal.kernel.util.Validator;
  17. import com.liferay.segments.exception.SegmentsExperimentStatusException;
  18. import java.util.Arrays;
  19. import java.util.Collections;
  20. import java.util.Objects;
  21. import java.util.Optional;
  22. import java.util.Set;
  23. import java.util.stream.Stream;
  24. /**
  25. * @author Eduardo García
  26. * @author Sarai Díaz
  27. */
  28. public class SegmentsExperimentConstants {
  29. public static final int NOTIFICATION_TYPE_UPDATE_STATUS = 0;
  30. public static final int STATUS_COMPLETED = 2;
  31. public static final int STATUS_DRAFT = 0;
  32. public static final int STATUS_FINISHED_NO_WINNER = 4;
  33. public static final int STATUS_FINISHED_WINNER = 3;
  34. public static final int STATUS_PAUSED = 5;
  35. public static final int STATUS_RUNNING = 1;
  36. public static final int STATUS_SCHEDULED = 7;
  37. public static final int STATUS_TERMINATED = 6;
  38. public enum Goal {
  39. BOUNCE_RATE("bounce-rate"), CLICK_RATE("click"),
  40. MAX_SCROLL_DEPTH("max-scroll-depth"), TIME_ON_PAGE("time-on-page");
  41. public static Goal parse(String label) {
  42. if (Validator.isNull(label)) {
  43. return null;
  44. }
  45. for (Goal goal : values()) {
  46. if (label.equals(goal.getLabel())) {
  47. return goal;
  48. }
  49. }
  50. return null;
  51. }
  52. public String getLabel() {
  53. return _label;
  54. }
  55. private Goal(String label) {
  56. _label = label;
  57. }
  58. private final String _label;
  59. }
  60. public enum Status {
  61. COMPLETED(
  62. STATUS_COMPLETED, "COMPLETED", "completed", true, false, true,
  63. false),
  64. DRAFT(STATUS_DRAFT, "DRAFT", "draft", true) {
  65. @Override
  66. public Set<Status> validTransitions() {
  67. return SetUtil.fromCollection(
  68. Arrays.asList(Status.RUNNING, Status.SCHEDULED));
  69. }
  70. },
  71. FINISHED_NO_WINNER(
  72. STATUS_FINISHED_NO_WINNER, "FINISHED_NO_WINNER", "no-winner", false,
  73. true, false, true) {
  74. @Override
  75. public Set<Status> validTransitions() {
  76. return Collections.singleton(Status.COMPLETED);
  77. }
  78. },
  79. FINISHED_WINNER_DECLARED(
  80. STATUS_FINISHED_WINNER, "FINISHED_WINNER", "winner", false, true,
  81. true, true) {
  82. @Override
  83. public Set<Status> validTransitions() {
  84. return Collections.singleton(Status.COMPLETED);
  85. }
  86. },
  87. PAUSED(STATUS_PAUSED, "PAUSED", "paused", false) {
  88. @Override
  89. public Set<Status> validTransitions() {
  90. return Collections.singleton(Status.RUNNING);
  91. }
  92. },
  93. RUNNING(
  94. STATUS_RUNNING, "RUNNING", "running", false, true, false, true) {
  95. @Override
  96. public Set<Status> validTransitions() {
  97. return SetUtil.fromCollection(
  98. Arrays.asList(
  99. Status.FINISHED_NO_WINNER,
  100. Status.FINISHED_WINNER_DECLARED, Status.PAUSED,
  101. Status.TERMINATED));
  102. }
  103. },
  104. SCHEDULED(STATUS_SCHEDULED, "SCHEDULED", "scheduled", false) {
  105. @Override
  106. public Set<Status> validTransitions() {
  107. return Collections.singleton(Status.RUNNING);
  108. }
  109. },
  110. TERMINATED(
  111. STATUS_TERMINATED, "TERMINATED", "terminated", true, false, false,
  112. false);
  113. public static int[] getExclusiveStatusValues() {
  114. Stream<Status> stream = Arrays.stream(Status.values());
  115. return stream.filter(
  116. Status::isExclusive
  117. ).mapToInt(
  118. Status::getValue
  119. ).toArray();
  120. }
  121. public static int[] getLockedStatusValues() {
  122. Stream<Status> stream = Arrays.stream(Status.values());
  123. return stream.filter(
  124. status -> !status.isEditable()
  125. ).mapToInt(
  126. Status::getValue
  127. ).toArray();
  128. }
  129. public static int[] getNonexclusiveStatusValues() {
  130. Stream<Status> stream = Arrays.stream(Status.values());
  131. return stream.filter(
  132. status -> !status.isExclusive()
  133. ).mapToInt(
  134. Status::getValue
  135. ).toArray();
  136. }
  137. public static int[] getSplitStatusValues() {
  138. Stream<Status> stream = Arrays.stream(Status.values());
  139. return stream.filter(
  140. Status::isSplit
  141. ).mapToInt(
  142. Status::getValue
  143. ).toArray();
  144. }
  145. public static Optional<Status> parse(int value) {
  146. for (Status status : values()) {
  147. if (status.getValue() == value) {
  148. return Optional.of(status);
  149. }
  150. }
  151. return Optional.empty();
  152. }
  153. public static Optional<Status> parse(String stringValue) {
  154. if (Validator.isNull(stringValue)) {
  155. return Optional.empty();
  156. }
  157. for (Status status : values()) {
  158. if (stringValue.equals(status.toString())) {
  159. return Optional.of(status);
  160. }
  161. }
  162. return Optional.empty();
  163. }
  164. public static void validateTransition(
  165. final int fromStatusValue, final int toStatusValue)
  166. throws SegmentsExperimentStatusException {
  167. Optional<Status> fromStatusOptional = Status.parse(fromStatusValue);
  168. Status fromStatus = fromStatusOptional.orElseThrow(
  169. () -> new SegmentsExperimentStatusException(
  170. "Invalid initial status value " + fromStatusValue));
  171. Optional<Status> toStatusOptional = Status.parse(toStatusValue);
  172. Status toStatus = toStatusOptional.orElseThrow(
  173. () -> new SegmentsExperimentStatusException(
  174. "Invalid final status value " + toStatusValue));
  175. if (Objects.equals(fromStatus, toStatus)) {
  176. return;
  177. }
  178. Set<Status> validTransitions = fromStatus.validTransitions();
  179. if (!validTransitions.contains(toStatus)) {
  180. throw new SegmentsExperimentStatusException(
  181. String.format(
  182. "Invalid status transition: from %s to %s",
  183. fromStatus.name(), toStatus.name()));
  184. }
  185. }
  186. public static Status valueOf(int value) {
  187. for (Status status : values()) {
  188. if (status.getValue() == value) {
  189. return status;
  190. }
  191. }
  192. throw new IllegalArgumentException("Invalid status value " + value);
  193. }
  194. public String getLabel() {
  195. return _label;
  196. }
  197. public int getValue() {
  198. return _value;
  199. }
  200. public boolean isEditable() {
  201. return _editable;
  202. }
  203. public boolean isExclusive() {
  204. return _exclusive;
  205. }
  206. public boolean isSplit() {
  207. return _split;
  208. }
  209. public boolean requiresWinnerExperience() {
  210. return _requiresWinnerExperience;
  211. }
  212. @Override
  213. public String toString() {
  214. return _stringValue;
  215. }
  216. public Set<Status> validTransitions() {
  217. return Collections.emptySet();
  218. }
  219. private Status(
  220. int value, String stringValue, String label, boolean editable) {
  221. _value = value;
  222. _stringValue = stringValue;
  223. _label = label;
  224. _editable = editable;
  225. _exclusive = true;
  226. _requiresWinnerExperience = false;
  227. _split = false;
  228. }
  229. private Status(
  230. int value, String stringValue, String label, boolean editable,
  231. boolean exclusive, boolean requiresWinnerExperience,
  232. boolean split) {
  233. _value = value;
  234. _stringValue = stringValue;
  235. _label = label;
  236. _editable = editable;
  237. _exclusive = exclusive;
  238. _requiresWinnerExperience = requiresWinnerExperience;
  239. _split = split;
  240. }
  241. private final boolean _editable;
  242. private final boolean _exclusive;
  243. private final String _label;
  244. private final boolean _requiresWinnerExperience;
  245. private final boolean _split;
  246. private final String _stringValue;
  247. private final int _value;
  248. }
  249. }