/
QueueLocation.java
159 lines (141 loc) · 4.14 KB
/
QueueLocation.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
package ru.yoomoney.tech.dbqueue.settings;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.util.Objects;
import java.util.Optional;
import java.util.regex.Pattern;
/**
* Queue location in the database.
*
* @author Oleg Kandaurov
* @since 10.07.2017
*/
public final class QueueLocation {
/**
* Regexp for SQL injection prevention
*/
private static final Pattern DISALLOWED_CHARS = Pattern.compile("[^a-zA-Z0-9_\\.]*");
@Nonnull
private final String tableName;
@Nonnull
private final QueueId queueId;
@Nullable
private final String idSequence;
private QueueLocation(@Nonnull QueueId queueId, @Nonnull String tableName,
@Nullable String idSequence) {
this.queueId = Objects.requireNonNull(queueId, "queueId must not be null");
this.tableName = DISALLOWED_CHARS.matcher(
Objects.requireNonNull(tableName, "tableName must not be null")).replaceAll("");
this.idSequence = idSequence != null ? DISALLOWED_CHARS.matcher(idSequence).replaceAll("") : null;
}
/**
* Get queue table name.
*
* @return Table name.
*/
@Nonnull
public String getTableName() {
return tableName;
}
/**
* Get queue identifier.
*
* @return Queue identifier.
*/
@Nonnull
public QueueId getQueueId() {
return queueId;
}
/**
* Get id sequence name.
* <p>
* Use for databases which doesn't have automatically incremented primary keys, for example Oracle 11g
*
* @return database sequence name for generating primary key of tasks table.
*/
public Optional<String> getIdSequence() {
return Optional.ofNullable(idSequence);
}
@Override
public String toString() {
return '{' +
"id=" + queueId +
",table=" + tableName +
(idSequence != null ? ",idSequence=" + idSequence : "") +
'}';
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null || getClass() != obj.getClass()) {
return false;
}
QueueLocation that = (QueueLocation) obj;
return Objects.equals(tableName, that.tableName) &&
Objects.equals(queueId, that.queueId) &&
Objects.equals(idSequence, that.idSequence);
}
@Override
public int hashCode() {
return Objects.hash(tableName, queueId, idSequence);
}
/**
* Create a new builder for queue location.
*
* @return A builder for queue location.
*/
public static Builder builder() {
return new Builder();
}
/**
* A builder for class {@link QueueLocation}.
*/
public static class Builder {
private String tableName;
private QueueId queueId;
@Nullable
private String idSequence;
private Builder() {
}
/**
* Set table name for queue tasks.
*
* @param tableName Table name.
* @return Reference to the same builder.
*/
public Builder withTableName(@Nonnull String tableName) {
this.tableName = tableName;
return this;
}
/**
* Set queue identifier.
*
* @param queueId Queue identifier.
* @return Reference to the same builder.
*/
public Builder withQueueId(@Nonnull QueueId queueId) {
this.queueId = queueId;
return this;
}
/**
* Set id sequence name.
*
* @param idSequence database sequence name for generating primary key of tasks table.
* @return Reference to the same builder.
*/
public Builder withIdSequence(@Nullable String idSequence) {
this.idSequence = idSequence;
return this;
}
/**
* Build queue location object.
*
* @return Queue location object.
*/
public QueueLocation build() {
return new QueueLocation(queueId, tableName, idSequence);
}
}
}