Skip to content

Commit 487e528

Browse files
authored
Merge pull request #360 from icatproject/move-checkjpql
Move checkJPQL out of GateKeeper
2 parents 19a66d8 + 31530b8 commit 487e528

File tree

4 files changed

+39
-31
lines changed

4 files changed

+39
-31
lines changed

src/main/java/org/icatproject/core/entity/Rule.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import org.icatproject.core.oldparser.OldTokenizer;
2828
import org.icatproject.core.parser.ParserException;
2929
import org.icatproject.core.parser.RuleWhat;
30+
import org.icatproject.core.utils.JpqlChecker;
3031
import org.slf4j.Logger;
3132
import org.slf4j.LoggerFactory;
3233

@@ -146,7 +147,7 @@ private void fixup(EntityManager manager, GateKeeper gateKeeper) throws IcatExce
146147
logger.debug("New style rule: " + query);
147148
} else {
148149
/* This should be pure JPQL so can check it */
149-
gateKeeper.checkJPQL(query);
150+
JpqlChecker.checkJPQL(query, manager);
150151
}
151152

152153
RuleWhat rw;

src/main/java/org/icatproject/core/manager/EntityBeanManager.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@
8989
import org.icatproject.core.parser.SearchQuery;
9090
import org.icatproject.core.parser.Token;
9191
import org.icatproject.core.parser.Tokenizer;
92+
import org.icatproject.core.utils.JpqlChecker;
9293
import org.icatproject.utils.IcatSecurity;
9394
import org.slf4j.Logger;
9495
import org.slf4j.LoggerFactory;
@@ -1023,7 +1024,7 @@ private EntitySetResult getEntitySet(String userId, String query, EntityManager
10231024
sb.append(token.getValue());
10241025
token = input.consume();
10251026
}
1026-
gateKeeper.checkJPQL(sb.toString());
1027+
JpqlChecker.checkJPQL(sb.toString(), manager);
10271028

10281029
} catch (ParserException e1) {
10291030
throw new IcatException(IcatException.IcatExceptionType.INTERNAL,

src/main/java/org/icatproject/core/manager/GateKeeper.java

Lines changed: 0 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,6 @@
1515
import java.util.concurrent.Executors;
1616
import java.util.concurrent.Future;
1717
import java.util.concurrent.TimeUnit;
18-
import java.util.regex.Matcher;
19-
import java.util.regex.Pattern;
2018

2119
import jakarta.annotation.PostConstruct;
2220
import jakarta.annotation.PreDestroy;
@@ -27,7 +25,6 @@
2725
import jakarta.json.JsonObject;
2826
import jakarta.json.JsonValue;
2927
import jakarta.persistence.EntityManager;
30-
import jakarta.persistence.PersistenceContext;
3128
import jakarta.persistence.TypedQuery;
3229

3330
import org.apache.http.client.methods.CloseableHttpResponse;
@@ -65,12 +62,6 @@ public int compare(String o1, String o2) {
6562
}
6663
};
6764

68-
private final static Pattern tsRegExp = Pattern
69-
.compile("\\{\\s*ts\\s+\\d{4}-\\d{2}-\\d{2}\\s+\\d{2}:\\d{2}:\\d{2}\\s*\\}");
70-
71-
@PersistenceContext(unitName = "icat")
72-
private EntityManager gateKeeperManager;
73-
7465
private final Logger logger = LoggerFactory.getLogger(GateKeeper.class);
7566
Marker fatal = MarkerFactory.getMarker("FATAL");
7667

@@ -121,26 +112,6 @@ public boolean allowed(Relationship r) {
121112
return false;
122113
}
123114

124-
public void checkJPQL(String query) throws IcatException {
125-
126-
Matcher m = tsRegExp.matcher(query);
127-
128-
query = m.replaceAll(" CURRENT_TIMESTAMP ");
129-
try {
130-
gateKeeperManager.createQuery(query);
131-
} catch (Exception e) {
132-
m.reset();
133-
if (m.find()) {
134-
throw new IcatException(IcatExceptionType.BAD_PARAMETER,
135-
"Timestamp literals have been replaced... " + e.getMessage());
136-
} else {
137-
throw new IcatException(IcatExceptionType.BAD_PARAMETER, e.getMessage());
138-
}
139-
140-
}
141-
142-
}
143-
144115
@PreDestroy()
145116
private void exit() {
146117
logger.info("GateKeeper closing down");
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package org.icatproject.core.utils;
2+
3+
import java.util.regex.Matcher;
4+
import java.util.regex.Pattern;
5+
6+
import jakarta.persistence.EntityManager;
7+
8+
import org.icatproject.core.IcatException;
9+
import org.icatproject.core.IcatException.IcatExceptionType;
10+
11+
public class JpqlChecker {
12+
13+
// Pattern that matches the timestamp format accepted by Icat
14+
private static final Pattern TS_PATTERN = Pattern.compile("\\{\\s*ts\\s+\\d{4}-\\d{2}-\\d{2}\\s+\\d{2}:\\d{2}:\\d{2}\\s*\\}");
15+
16+
public static void checkJPQL(String query, EntityManager entityManager) throws IcatException {
17+
18+
// Icat does not accept the JDBC standard timestamp format (Icat's format is without quotes). Therefore, we
19+
// must replace any timestamps before checking whether the query is valid JPQL, because the timestamps will not
20+
// be valid JPQL.
21+
Matcher m = TS_PATTERN.matcher(query);
22+
query = m.replaceAll(" CURRENT_TIMESTAMP ");
23+
24+
try {
25+
entityManager.createQuery(query);
26+
} catch (IllegalArgumentException e) {
27+
m.reset();
28+
if (m.find()) {
29+
throw new IcatException(IcatExceptionType.BAD_PARAMETER, "Timestamp literals have been replaced... " + e.getMessage());
30+
} else {
31+
throw new IcatException(IcatExceptionType.BAD_PARAMETER, e.getMessage());
32+
}
33+
}
34+
}
35+
}

0 commit comments

Comments
 (0)