Skip to content

Commit b8fc42c

Browse files
committed
[>] Create operations
1 parent 6480c33 commit b8fc42c

11 files changed

+176
-20
lines changed

README.md

+34-16
Original file line numberDiff line numberDiff line change
@@ -4,24 +4,42 @@ A repository for my live-coding talk [Modern Java in Action](https://nipafx.dev/
44

55
## Next
66

7-
Sealed types:
8-
* `sealed interface Page permits ErrorPage, SuccessfulPage` with `URI url()`
9-
* `sealed interface SuccessfulPage extends Page permits ExternalPage, GitHubPage` with `String content()`
10-
* `sealed interface GitHubPage extends SuccessfulPage permits GitHubIssuePage, GitHubPrPage` with `Set<Page> links()` and
7+
Operations:
8+
* implement methods in `Pretty`:
119
```java
12-
default Stream<Page> subtree() {
13-
var subtree = new ArrayList<Page>(Set.of(this));
14-
var upcomingPages = new LinkedHashSet<>(this.links());
10+
public static String pageList(Page rootPage) {
11+
if (!(rootPage instanceof GitHubPage ghPage))
12+
return pageName(rootPage);
1513

16-
while (!upcomingPages.isEmpty()) {
17-
var nextPage = upcomingPages.removeFirst();
18-
if (!subtree.contains(nextPage) && nextPage instanceof GitHubPage nextGhPage)
19-
new LinkedHashSet<>(nextGhPage.links())
20-
.reversed()
21-
.forEach(upcomingPages::addFirst);
22-
subtree.add(nextPage);
23-
}
14+
return ghPage
15+
.subtree()
16+
.map(Pretty::pageName)
17+
.collect(joining("\n"));
18+
}
19+
20+
public static String pageName(Page page) {
21+
return switch (page) {
22+
case ErrorPage(URI url, _) -> "💥 ERROR: " + url.getHost();
23+
case ExternalPage(URI url, _) -> "💤 EXTERNAL: " + url.getHost();
24+
case GitHubIssuePage(_, _, _, int nr) -> "🐈 ISSUE #" + nr;
25+
case GitHubPrPage(_, _, _, int nr) -> "🐙 PR #" + nr;
26+
};
27+
}
28+
```
29+
* implement `Statistician::evaluatePage`:
30+
```java
31+
private void evaluatePage(Page page) {
32+
if (evaluatedPages.contains(page))
33+
return;
34+
evaluatedPages.add(page);
2435

25-
return subtree.stream();
36+
switch (page) {
37+
case ErrorPage _ -> numberOfErrors++;
38+
case ExternalPage _ -> numberOfExternalLinks++;
39+
case GitHubIssuePage _ -> numberOfIssues++;
40+
case GitHubPrPage _ -> numberOfPrs++;
41+
}
2642
}
2743
```
44+
45+
Run `GitHubCrawl`.

src/main/java/dev/nipafx/demo/modern/GitHubCrawl.java

+15
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,14 @@
11
package dev.nipafx.demo.modern;
22

3+
import dev.nipafx.demo.modern.operations.Pretty;
4+
import dev.nipafx.demo.modern.operations.Statistician;
5+
import dev.nipafx.demo.modern.page.ExternalPage;
6+
import dev.nipafx.demo.modern.page.GitHubIssuePage;
7+
import dev.nipafx.demo.modern.page.GitHubPrPage;
8+
39
import java.net.URI;
410
import java.net.URISyntaxException;
11+
import java.util.Set;
512

613
public class GitHubCrawl {
714

@@ -12,6 +19,14 @@ public class GitHubCrawl {
1219
public static void main(String[] args) throws Exception {
1320
var config = Configuration.parse(args);
1421

22+
var rootPage = new GitHubIssuePage(URI.create("https://github.com/junit-pioneer/junit-pioneer/issues/624"), "",
23+
Set.of(
24+
new GitHubPrPage(URI.create("https://github.com/junit-pioneer/junit-pioneer/pull/629"), "", Set.of(), 629),
25+
new ExternalPage(URI.create("https://fasterxml.github.io/jackson-databind/javadoc/2.7/com/fasterxml/jackson/databind/ObjectMapper.html#findAndRegisterModules()"), "")
26+
), 624);
27+
28+
System.out.println(Statistician.evaluate(rootPage));
29+
System.out.println(Pretty.pageList(rootPage));
1530
}
1631

1732
private record Configuration(URI seedUrl, int depth) {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package dev.nipafx.demo.modern.operations;
2+
3+
import dev.nipafx.demo.modern.page.ErrorPage;
4+
import dev.nipafx.demo.modern.page.ExternalPage;
5+
import dev.nipafx.demo.modern.page.GitHubIssuePage;
6+
import dev.nipafx.demo.modern.page.GitHubPage;
7+
import dev.nipafx.demo.modern.page.GitHubPrPage;
8+
import dev.nipafx.demo.modern.page.Page;
9+
10+
import java.net.URI;
11+
12+
import static java.util.stream.Collectors.joining;
13+
14+
public class Pretty {
15+
16+
private Pretty() {
17+
// private constructor to prevent instantiation
18+
}
19+
20+
public static String pageList(Page rootPage) {
21+
// TODO
22+
return "";
23+
}
24+
25+
public static String pageName(Page page) {
26+
// TODO
27+
return "";
28+
}
29+
30+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package dev.nipafx.demo.modern.operations;
2+
3+
import dev.nipafx.demo.modern.page.ErrorPage;
4+
import dev.nipafx.demo.modern.page.ExternalPage;
5+
import dev.nipafx.demo.modern.page.GitHubIssuePage;
6+
import dev.nipafx.demo.modern.page.GitHubPage;
7+
import dev.nipafx.demo.modern.page.GitHubPrPage;
8+
import dev.nipafx.demo.modern.page.Page;
9+
10+
import java.util.HashSet;
11+
import java.util.Set;
12+
13+
public class Statistician {
14+
15+
private final Set<Page> evaluatedPages;
16+
17+
private int numberOfIssues;
18+
private int numberOfPrs;
19+
private int numberOfExternalLinks;
20+
private int numberOfErrors;
21+
22+
private Statistician() {
23+
this.evaluatedPages = new HashSet<>();
24+
}
25+
26+
public static Stats evaluate(Page rootPage) {
27+
Statistician statistician = new Statistician();
28+
statistician.evaluateTree(rootPage);
29+
return statistician.result();
30+
}
31+
32+
private void evaluateTree(Page page) {
33+
if (page instanceof GitHubPage ghPage)
34+
ghPage.subtree().forEach(this::evaluatePage);
35+
else
36+
evaluatePage(page);
37+
}
38+
39+
private void evaluatePage(Page page) {
40+
// TODO
41+
}
42+
43+
private Stats result() {
44+
return new Stats(numberOfIssues, numberOfPrs, numberOfExternalLinks, numberOfErrors);
45+
}
46+
47+
public record Stats(int numberOfIssues, int numberOfPrs, int numberOfExternalLinks, int numberOfErrors) { }
48+
49+
}

src/main/java/dev/nipafx/demo/modern/page/ErrorPage.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
import static java.util.Objects.requireNonNull;
77

8-
public record ErrorPage(URI url, Exception ex) {
8+
public record ErrorPage(URI url, Exception ex) implements Page {
99

1010
public ErrorPage {
1111
requireNonNull(url);

src/main/java/dev/nipafx/demo/modern/page/ExternalPage.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
import static java.util.Objects.requireNonNull;
77

8-
public record ExternalPage(URI url, String content) {
8+
public record ExternalPage(URI url, String content) implements SuccessfulPage {
99

1010
public ExternalPage {
1111
requireNonNull(url);

src/main/java/dev/nipafx/demo/modern/page/GitHubIssuePage.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
import static java.util.Objects.requireNonNull;
99

10-
public record GitHubIssuePage(URI url, String content, Set<URI> links, int issueNumber) {
10+
public record GitHubIssuePage(URI url, String content, Set<Page> links, int issueNumber) implements GitHubPage {
1111

1212
public GitHubIssuePage {
1313
requireNonNull(url);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package dev.nipafx.demo.modern.page;
2+
3+
import java.util.ArrayList;
4+
import java.util.LinkedHashSet;
5+
import java.util.Set;
6+
import java.util.stream.Stream;
7+
8+
public sealed interface GitHubPage extends SuccessfulPage permits GitHubIssuePage, GitHubPrPage {
9+
10+
Set<Page> links();
11+
12+
default Stream<Page> subtree() {
13+
var subtree = new ArrayList<Page>(Set.of(this));
14+
var upcomingPages = new LinkedHashSet<>(this.links());
15+
16+
while (!upcomingPages.isEmpty()) {
17+
var nextPage = upcomingPages.removeFirst();
18+
if (!subtree.contains(nextPage) && nextPage instanceof GitHubPage nextGhPage)
19+
new LinkedHashSet<>(nextGhPage.links())
20+
.reversed()
21+
.forEach(upcomingPages::addFirst);
22+
subtree.add(nextPage);
23+
}
24+
25+
return subtree.stream();
26+
}
27+
28+
}

src/main/java/dev/nipafx/demo/modern/page/GitHubPrPage.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
import static java.util.Objects.requireNonNull;
99

10-
public record GitHubPrPage(URI url, String content, Set<URI> links, int prNumber) {
10+
public record GitHubPrPage(URI url, String content, Set<Page> links, int prNumber) implements GitHubPage {
1111

1212
public GitHubPrPage {
1313
requireNonNull(url);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package dev.nipafx.demo.modern.page;
2+
3+
import java.net.URI;
4+
5+
public sealed interface Page permits ErrorPage, SuccessfulPage {
6+
7+
URI url();
8+
9+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package dev.nipafx.demo.modern.page;
2+
3+
public sealed interface SuccessfulPage extends Page permits ExternalPage, GitHubPage {
4+
5+
String content();
6+
7+
}

0 commit comments

Comments
 (0)