Skip to content
This repository was archived by the owner on Aug 31, 2022. It is now read-only.

Commit 200d064

Browse files
committed
allow external task id creation and parsing
1 parent 8e0f27a commit 200d064

File tree

4 files changed

+85
-11
lines changed

4 files changed

+85
-11
lines changed

workflow/src/main/java/io/rouz/task/Task.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,6 @@ static <T> Task<T> create(
9191
EvalClosure<T> code,
9292
String taskName,
9393
Object... args) {
94-
return new AutoValue_Task<>(TaskIds.create(taskName, args), code, inputs);
94+
return new AutoValue_Task<>(TaskId.create(taskName, args), code, inputs);
9595
}
9696
}

workflow/src/main/java/io/rouz/task/TaskId.java

+27
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,31 @@ public interface TaskId {
1414
* @return A hash for the task parameter values
1515
*/
1616
int hash();
17+
18+
/**
19+
* Creates a {@link TaskId}.
20+
*
21+
* The task name can not contain any parenthesis.
22+
*
23+
* @throws IllegalArgumentException if the name contains any parenthesis
24+
* @param name Task name
25+
* @param args Arbitrary task arguments
26+
* @return A task id for the given arguments
27+
*/
28+
static TaskId create(String name, Object... args) {
29+
return TaskIds.create(name, args);
30+
}
31+
32+
/**
33+
* Parses a {@link TaskId} based on a string representation.
34+
*
35+
* A parsed id is equal to a task id that was created using {@link #create(String, Object...)}.
36+
*
37+
* @throws IllegalArgumentException if the string does not conform to a task id
38+
* @param stringId The id to parse
39+
* @return A parsed task id
40+
*/
41+
static TaskId parse(String stringId) {
42+
return TaskIds.parse(stringId);
43+
}
1744
}

workflow/src/main/java/io/rouz/task/TaskIds.java

+29-7
Original file line numberDiff line numberDiff line change
@@ -3,33 +3,55 @@
33
import com.google.auto.value.AutoValue;
44

55
import java.io.Serializable;
6-
import java.util.Arrays;
7-
import java.util.List;
86
import java.util.Objects;
97
import java.util.stream.Collectors;
8+
import java.util.stream.Stream;
109

1110
/**
1211
* {@link AutoValue} implementation of {@link TaskId}
1312
*/
1413
@AutoValue
1514
abstract class TaskIds implements TaskId, Serializable {
1615

17-
abstract List<Object> args();
16+
abstract String args();
1817

1918
static TaskId create(String name, Object... args) {
19+
if (name.contains("(") || name.contains(")")) {
20+
throw new IllegalArgumentException("Name can not contain any parenthesis");
21+
}
22+
2023
return new AutoValue_TaskIds(
2124
name,
2225
name.hashCode() * 1000003 ^ Objects.hash(args),
23-
Arrays.asList(args));
26+
argsString(args));
27+
}
28+
29+
static TaskId parse(String stringId) {
30+
final int pOpen = stringId.indexOf('(');
31+
final int pClose = stringId.lastIndexOf(')');
32+
final int pHash = stringId.lastIndexOf('#');
33+
34+
if (pOpen < 0 || pClose < pOpen || pHash < pClose) {
35+
throw new IllegalArgumentException("Invalid stringId, follow 'Name(foo,bar)#deadbeef'");
36+
}
37+
38+
final String name = stringId.substring(0, pOpen);
39+
final String args = stringId.substring(pOpen + 1, pClose);
40+
final String hash = stringId.substring(pHash + 1);
41+
42+
return new AutoValue_TaskIds(
43+
name,
44+
Integer.parseInt(hash, 16),
45+
args);
2446
}
2547

2648
@Override
2749
public String toString() {
28-
return String.format("%s(%s)#%08x", name(), argsString(), hash());
50+
return String.format("%s(%s)#%08x", name(), args(), hash());
2951
}
3052

31-
private String argsString() {
32-
return args().stream()
53+
private static String argsString(Object... args) {
54+
return Stream.of(args)
3355
.map(Object::toString)
3456
.collect(Collectors.joining(","));
3557
}

workflow/src/test/java/io/rouz/task/TaskIdsTest.java

+28-3
Original file line numberDiff line numberDiff line change
@@ -12,21 +12,46 @@ public class TaskIdsTest {
1212

1313
@Test
1414
public void shouldHaveHumanReadableToString() {
15-
TaskId taskId = TaskIds.create("MyTask", "a", 1, 2.3, new Param(7));
15+
TaskId taskId = TaskId.create("MyTask", "a", 1, 2.3, new Param(7));
1616

1717
assertThat(taskId.toString(), startsWith("MyTask(a,1,2.3,Param{arg=7})"));
1818
}
1919

2020
@Test
2121
public void shouldHaveIdentity() {
22-
TaskId taskId1 = TaskIds.create("MyTask", "a", 1, 2.3, new Param(7));
23-
TaskId taskId2 = TaskIds.create("MyTask", "a", 1, 2.3, new Param(7));
22+
TaskId taskId1 = TaskId.create("MyTask", "a", 1, 2.3, new Param(7));
23+
TaskId taskId2 = TaskId.create("MyTask", "a", 1, 2.3, new Param(7));
2424

2525
assertThat(taskId1, not(sameInstance(taskId2)));
2626
assertThat(taskId1, equalTo(taskId2));
2727
assertThat(taskId2, equalTo(taskId1));
2828
}
2929

30+
@Test
31+
public void parsedIdEqualToActual() throws Exception {
32+
TaskId taskId1 = TaskId.create("MyTask", "a", 1, 2.3, new Param(7));
33+
TaskId taskId2 = TaskId.parse(taskId1.toString());
34+
35+
assertThat(taskId1, not(sameInstance(taskId2)));
36+
assertThat(taskId1, equalTo(taskId2));
37+
assertThat(taskId2, equalTo(taskId1));
38+
}
39+
40+
@Test(expected = IllegalArgumentException.class)
41+
public void shouldNotAllowOpenParenthesisInName() throws Exception {
42+
TaskId.create("MyTa(sk");
43+
}
44+
45+
@Test(expected = IllegalArgumentException.class)
46+
public void shouldNotAllowCloseParenthesisInName() throws Exception {
47+
TaskId.create("MyTa)sk");
48+
}
49+
50+
@Test(expected = IllegalArgumentException.class)
51+
public void shouldNotParseInvalidId() throws Exception {
52+
TaskId.parse("Wat)#(123)#hello");
53+
}
54+
3055
private static class Param {
3156

3257
private final int arg;

0 commit comments

Comments
 (0)