PageRenderTime 31ms CodeModel.GetById 1ms RepoModel.GetById 0ms app.codeStats 0ms

/atlassian-visual-comparison/src/main/java/com/atlassian/selenium/visualcomparison/v2/ComparisonSettings.java

https://bitbucket.org/atlassian/atlassian-selenium
Java | 315 lines | 237 code | 53 blank | 25 comment | 11 complexity | b73416208a06a23c31f57be7213345fe MD5 | raw file
  1. package com.atlassian.selenium.visualcomparison.v2;
  2. import com.atlassian.annotations.ExperimentalApi;
  3. import com.atlassian.selenium.visualcomparison.v2.settings.PagePart;
  4. import com.atlassian.selenium.visualcomparison.v2.settings.Replacement;
  5. import com.atlassian.selenium.visualcomparison.v2.settings.Resolution;
  6. import com.google.common.collect.ImmutableList;
  7. import com.google.common.collect.ImmutableSortedSet;
  8. import javax.annotation.Nonnull;
  9. import javax.annotation.Nullable;
  10. import javax.annotation.concurrent.Immutable;
  11. import java.io.File;
  12. import java.util.Set;
  13. import static java.util.Arrays.asList;
  14. import static java.util.Objects.requireNonNull;
  15. /**
  16. * Represents settings used for visual comparison. This is in essence an immutable bean that holds various settings.
  17. *
  18. * <p>
  19. * A single instance of code {@code ComparisonSettings} can be {@link #merge(ComparisonSettings) merged} with another
  20. * instance, which will result in the other instance 'single' fields overriding this instance's corresponding fields,
  21. * unless they were not set on the other instance at all. Collection fields are merged by combining collections from
  22. * both merged instances.
  23. * </p>
  24. *
  25. * <p>
  26. * A family of short-hand methods is also available on this class (many of them starting with a {@code with} prefix) to
  27. * facilitate creating a new instance of settings overriding, or adding just one specific field from the original
  28. * instance. Those work in essence as if this instance was {@link #merge(ComparisonSettings) merged} with another
  29. * instance of settings that had just that one particular field set.
  30. * </p>
  31. *
  32. * @since 2.3
  33. */
  34. @Immutable
  35. @ExperimentalApi
  36. public final class ComparisonSettings
  37. {
  38. private final Set<Resolution> resolutions;
  39. private final File baselineDir;
  40. private final Boolean reportingEnabled;
  41. private final File reportingDir;
  42. private final Boolean ignoreSingleLineDifferences;
  43. private final Boolean refreshAfterResize;
  44. private final Iterable<PagePart> ignoredParts;
  45. private final Iterable<Replacement> replacements;
  46. private ComparisonSettings()
  47. {
  48. this(new Builder());
  49. }
  50. private ComparisonSettings(Builder builder)
  51. {
  52. resolutions = builder.resolutions.build();
  53. baselineDir = builder.baselineDir;
  54. reportingEnabled = builder.reportingEnabled;
  55. reportingDir = builder.reportingDir;
  56. ignoreSingleLineDifferences = builder.ignoreSingleLineDifferences;
  57. refreshAfterResize = builder.refreshAfterResize;
  58. ignoredParts = builder.ignoredParts.build();
  59. replacements = builder.replacements.build();
  60. }
  61. /**
  62. * Creates a new empty instance of settings. All simple fields are {@code null} (not set) and the collection
  63. * fields are empty collections.
  64. *
  65. * @return new empty instance of {@code ComparisonSettings}.
  66. */
  67. @Nonnull
  68. public static ComparisonSettings emptySettings()
  69. {
  70. return new ComparisonSettings();
  71. }
  72. @Nonnull
  73. public Set<Resolution> getResolutions()
  74. {
  75. return resolutions;
  76. }
  77. @Nullable
  78. public File getBaselineDirectory()
  79. {
  80. return baselineDir;
  81. }
  82. public boolean isReportingEnabled()
  83. {
  84. return reportingEnabled != null && reportingEnabled;
  85. }
  86. @Nullable
  87. public File getReportingDirectory()
  88. {
  89. return reportingDir;
  90. }
  91. public boolean isIgnoreSingleLineDifferences()
  92. {
  93. return ignoreSingleLineDifferences != null && ignoreSingleLineDifferences;
  94. }
  95. public boolean isRefreshAfterResize()
  96. {
  97. return refreshAfterResize != null && refreshAfterResize;
  98. }
  99. @Nonnull
  100. public Iterable<PagePart> getIgnoredParts()
  101. {
  102. return ignoredParts;
  103. }
  104. @Nonnull
  105. public Iterable<Replacement> getReplacements()
  106. {
  107. return replacements;
  108. }
  109. @Nonnull
  110. public ComparisonSettings merge(ComparisonSettings that)
  111. {
  112. return new Builder(this).merge(that).build();
  113. }
  114. @Nonnull
  115. public ComparisonSettings withResolution(@Nonnull Resolution resolution)
  116. {
  117. return new Builder(this).resolution(resolution).build();
  118. }
  119. @Nonnull
  120. public ComparisonSettings withResolutions(@Nonnull Resolution first, @Nonnull Resolution... more)
  121. {
  122. return new Builder(this).resolutions(first, more).build();
  123. }
  124. @Nonnull
  125. public ComparisonSettings withBaselineDirectory(@Nonnull File baselineDirectory)
  126. {
  127. return new Builder(this).baselineDirectory(baselineDirectory).build();
  128. }
  129. @Nonnull
  130. public ComparisonSettings withReportingEnabled(@Nonnull File value)
  131. {
  132. return new Builder(this).enableReporting(value).build();
  133. }
  134. @Nonnull
  135. public ComparisonSettings withReportingDisabled()
  136. {
  137. return new Builder(this).disableReporting().build();
  138. }
  139. @Nonnull
  140. public ComparisonSettings ignoringSingleLineDifferences(boolean value)
  141. {
  142. return new Builder(this).ignoreSingleLineDifferences(value).build();
  143. }
  144. @Nonnull
  145. public ComparisonSettings refreshingAfterResize(boolean refreshAfterResize)
  146. {
  147. return new Builder(this).refreshAfterResize(refreshAfterResize).build();
  148. }
  149. @Nonnull
  150. public ComparisonSettings ignoringPart(@Nonnull PagePart part) {
  151. return new Builder(this).ignorePart(part).build();
  152. }
  153. @Nonnull
  154. public ComparisonSettings withReplacement(@Nonnull Replacement replacement) {
  155. return new Builder(this).replacement(replacement).build();
  156. }
  157. private static final class Builder
  158. {
  159. private final ImmutableSortedSet.Builder<Resolution> resolutions = ImmutableSortedSet.naturalOrder();
  160. private File baselineDir;
  161. private Boolean reportingEnabled;
  162. private File reportingDir;
  163. private Boolean ignoreSingleLineDifferences;
  164. private Boolean refreshAfterResize;
  165. private ImmutableList.Builder<PagePart> ignoredParts = ImmutableList.builder();
  166. private ImmutableList.Builder<Replacement> replacements = ImmutableList.builder();
  167. Builder()
  168. {
  169. }
  170. Builder(@Nonnull ComparisonSettings settings)
  171. {
  172. merge(settings);
  173. }
  174. Builder merge(@Nonnull ComparisonSettings settings)
  175. {
  176. requireNonNull(settings, "settings");
  177. resolutions.addAll(settings.resolutions);
  178. baselineDir = settings.baselineDir != null ? settings.baselineDir : baselineDir;
  179. reportingEnabled = settings.reportingEnabled != null ? settings.reportingEnabled : reportingEnabled;
  180. reportingDir = settings.reportingEnabled != null ? settings.reportingDir : reportingDir;
  181. ignoreSingleLineDifferences = settings.ignoreSingleLineDifferences != null
  182. ? settings.ignoreSingleLineDifferences : ignoreSingleLineDifferences;
  183. refreshAfterResize = settings.refreshAfterResize != null ? settings.refreshAfterResize : refreshAfterResize;
  184. ignoredParts.addAll(settings.ignoredParts);
  185. replacements.addAll(settings.replacements);
  186. return this;
  187. }
  188. @Nonnull
  189. Builder resolution(@Nonnull Resolution resolution)
  190. {
  191. resolutions.add(resolution);
  192. return this;
  193. }
  194. @Nonnull
  195. Builder resolutions(@Nonnull Resolution resolution, @Nonnull Resolution... more)
  196. {
  197. resolutions.add(resolution).addAll(asList(more));
  198. return this;
  199. }
  200. @Nonnull
  201. public Builder baselineDirectory(@Nonnull File value)
  202. {
  203. this.baselineDir = requireNonNull(value, "baselineDirectory");
  204. return this;
  205. }
  206. @Nonnull
  207. Builder enableReporting(@Nonnull File value)
  208. {
  209. requireNonNull(value, "reportingDir");
  210. reportingEnabled = true;
  211. reportingDir = value;
  212. return this;
  213. }
  214. @Nonnull
  215. Builder disableReporting()
  216. {
  217. reportingEnabled = false;
  218. reportingDir = null;
  219. return this;
  220. }
  221. @Nonnull
  222. Builder ignoreSingleLineDifferences(boolean value)
  223. {
  224. ignoreSingleLineDifferences = value;
  225. return this;
  226. }
  227. @Nonnull
  228. Builder refreshAfterResize(boolean value)
  229. {
  230. refreshAfterResize = value;
  231. return this;
  232. }
  233. @Nonnull
  234. Builder ignorePart(@Nonnull PagePart part)
  235. {
  236. ignoredParts.add(part);
  237. return this;
  238. }
  239. @Nonnull
  240. Builder ignoreParts(@Nonnull PagePart first, @Nonnull PagePart... more)
  241. {
  242. ignoredParts.add(first).addAll(asList(more));
  243. return this;
  244. }
  245. @Nonnull
  246. Builder replacement(@Nonnull Replacement replacement)
  247. {
  248. replacements.add(replacement);
  249. return this;
  250. }
  251. @Nonnull
  252. Builder replacements(@Nonnull Replacement first, @Nonnull Replacement... more)
  253. {
  254. replacements.add(first).addAll(asList(more));
  255. return this;
  256. }
  257. public ComparisonSettings build()
  258. {
  259. return new ComparisonSettings(this);
  260. }
  261. }
  262. }