Skip to content

Commit a61eafe

Browse files
Use Jurisdiction, TylerEnv, and TylerDomain internally everywhere
Jurisdiction is vendor agnostic, and also contains info about API type (will be helpful with ECF5 changes). Instead of strings, which could be accidentally switched, or not verified. Yay more solid typings! TylerDomains get used mostly everywhere. Still TODO: * config: many things in environment variables (specifically `TYLER_JURISDICTIONS` and `TOGA_CLIENT_KEYS`) are still Tyler only. This stuff can't easily be fixed until we have a better config / secret setup, which can come after we make it easier to handle jurisdictions. * Setup in JurisdictionSwitch, TylerModuleSetup, JeffNetModuleSetup, etc. can still be simplified based on the Jurisdiction value it gets. Haven't integrated that yet, and the Module setup is still hard-coded to either Tyler or JeffNet. Fix #283, #284
1 parent 0839b47 commit a61eafe

37 files changed

+536
-464
lines changed
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
package edu.suffolk.litlab.efsp;
2+
3+
/**
4+
* The jurisdictions (states) that our code works in and that we support. Even though all possible
5+
* jurisdictions might be listed here, only those set to the <code>TYLER_JURISDICTIONS</code> env
6+
* var are supported at runtime.
7+
*
8+
* <p>At the moment, each jurisdiction is uniquely mapped to a single API and Vendor of that API
9+
* (i.e. ECF, and Tyler). This is for when we expand to having multiple APIs (i.e. ECF v4 and ECF
10+
* v5) and multiple vendors(Tyler and SoftImage).
11+
*/
12+
public enum Jurisdiction {
13+
CALIFORNIA("california", Api.ECF_4, Vendor.TYLER),
14+
INDIANA("indiana", Api.ECF_4, Vendor.TYLER),
15+
ILLINOIS("illinois", Api.ECF_4_Schedule, Vendor.TYLER),
16+
LOUISIANA("louisiana", Api.JEFFNET, Vendor.JEFFERSON_PARISH),
17+
MASSACHUSETTS("massachusetts", Api.ECF_4, Vendor.TYLER),
18+
TEXAS("texas", Api.ECF_4, Vendor.TYLER),
19+
VERMONT("vermont", Api.ECF_4, Vendor.TYLER);
20+
21+
private enum Api {
22+
JEFFNET,
23+
ECF_4,
24+
// Illinois uses a custom Tyler ECF4 version, which includes a pre-release ECF 5
25+
// version of the Court Scheduling MDE.
26+
ECF_4_Schedule;
27+
}
28+
29+
private enum Vendor {
30+
JEFFERSON_PARISH,
31+
TYLER;
32+
}
33+
34+
private String name;
35+
private Api api;
36+
private Vendor vendor;
37+
38+
private Jurisdiction(String name, Api api, Vendor vendor) {
39+
this.name = name;
40+
this.api = api;
41+
this.vendor = vendor;
42+
}
43+
44+
public String getName() {
45+
return name;
46+
}
47+
48+
public Vendor getVendor() {
49+
return vendor;
50+
}
51+
52+
public static Jurisdiction parse(String value) {
53+
for (var jurisdiction : Jurisdiction.values()) {
54+
if (value.equalsIgnoreCase(jurisdiction.getName())) {
55+
return jurisdiction;
56+
}
57+
}
58+
throw new IllegalArgumentException("Can't make a `Jurisdiction` from: `" + value + "`");
59+
}
60+
}

TylerEfmClient/src/main/java/edu/suffolk/litlab/efsp/tyler/TylerClients.java

Lines changed: 40 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package edu.suffolk.litlab.efsp.tyler;
22

3+
import edu.suffolk.litlab.efsp.Jurisdiction;
34
import java.net.URL;
45
import java.util.Map;
56
import java.util.Optional;
@@ -14,80 +15,85 @@ public class TylerClients {
1415
private static final String USER_WSDL = "-EFMUserServiceSingle.svc.wsdl";
1516
private static final String FIRM_WSDL = "-EFMFirmServiceSingle.svc.wsdl";
1617

17-
private static final Map<String, TylerVersion> STAGE_VERSION_MAP =
18+
private static final Map<Jurisdiction, TylerVersion> STAGE_VERSION_MAP =
1819
Map.of(
19-
"california", TylerVersion.v2024_6,
20-
"illinois", TylerVersion.v2024_6,
21-
"indiana", TylerVersion.v2024_6,
22-
"massachusetts", TylerVersion.v2025_0,
23-
"texas", TylerVersion.v2024_6,
24-
"vermont", TylerVersion.v2024_6);
20+
Jurisdiction.CALIFORNIA, TylerVersion.v2024_6,
21+
Jurisdiction.ILLINOIS, TylerVersion.v2024_6,
22+
Jurisdiction.INDIANA, TylerVersion.v2024_6,
23+
Jurisdiction.MASSACHUSETTS, TylerVersion.v2025_0,
24+
Jurisdiction.TEXAS, TylerVersion.v2024_6,
25+
Jurisdiction.VERMONT, TylerVersion.v2024_6);
2526

26-
private static final Map<String, TylerVersion> PROD_VERSION_MAP =
27+
private static final Map<Jurisdiction, TylerVersion> PROD_VERSION_MAP =
2728
Map.of(
28-
"illinois", TylerVersion.v2024_6,
29-
"massachusetts", TylerVersion.v2022_1);
29+
Jurisdiction.ILLINOIS, TylerVersion.v2024_6,
30+
Jurisdiction.MASSACHUSETTS, TylerVersion.v2022_1);
3031

3132
/**
3233
* Gets the EfmUserService from the individual jursdiction and env arguments.
3334
*
34-
* @param jurisdiction e.g. "illinois".
35-
* @param env e.g. "stage", "test", or "prod"
35+
* @param domain e.g. Jurisdiction.ILLINOIS, TylerEnv.STAGE.
3636
*/
37-
public static Optional<TylerUserFactory> getEfmUserFactory(String jurisdiction, TylerEnv env) {
38-
var version = getVersion(jurisdiction, env);
37+
public static Optional<TylerUserFactory> getEfmUserFactory(TylerDomain domain) {
38+
var version = getVersion(domain);
3939
return version.flatMap(
4040
v -> {
41-
var url = createLocalWsdlUrl(jurisdiction, env, v, USER_WSDL);
41+
var url = createLocalWsdlUrl(domain, v, USER_WSDL);
4242
return url.map(u -> new TylerUserFactory(new EfmUserService(u), v));
4343
});
4444
}
4545

46-
public static Optional<TylerFirmFactory> getEfmFirmFactory(String jurisdiction, TylerEnv env) {
47-
var version = getVersion(jurisdiction, env);
46+
public static Optional<TylerFirmFactory> getEfmFirmFactory(TylerDomain domain) {
47+
var version = getVersion(domain);
4848
return version.flatMap(
4949
v -> {
50-
var url = createLocalWsdlUrl(jurisdiction, env, v, FIRM_WSDL);
50+
var url = createLocalWsdlUrl(domain, v, FIRM_WSDL);
5151
return url.map(u -> new TylerFirmFactory(new EfmFirmService(u), v));
5252
});
5353
}
5454

5555
/**
5656
* Gets Tyler server's root URL for a given jurisdiction / Tyler Env (i.e. california stage).
5757
*
58-
* @param jurisdiction
59-
* @param envEnum
58+
* <p>TODO(brycew): turn this into a URL type? Find where it's used.
59+
*
60+
* @param domain
6061
* @return
6162
*/
62-
public static String getTylerServerRootUrl(String jurisdiction, TylerEnv envEnum) {
63-
String env = envEnum.name().toLowerCase();
64-
if (jurisdiction.equalsIgnoreCase("california")) {
65-
return "https://california-efm-" + env + ".tylertech.cloud/";
63+
public static String getTylerServerRootUrl(TylerDomain domain) {
64+
if (domain.jurisdiction() == Jurisdiction.CALIFORNIA) {
65+
return "https://california-efm-" + domain.env().getName() + ".tylertech.cloud/";
6666
}
67-
if (envEnum.equals(TylerEnv.PROD)) {
68-
return "https://" + jurisdiction + ".tylertech.cloud/";
67+
if (domain.env() == TylerEnv.PROD) {
68+
return "https://" + domain.jurisdiction().getName() + ".tylertech.cloud/";
6969
}
70-
return "https://" + jurisdiction + "-" + env + ".tylertech.cloud/";
70+
return "https://" + domain.getName() + ".tylertech.cloud/";
7171
}
7272

73-
private static Optional<TylerVersion> getVersion(String jurisdiction, TylerEnv tylerEnv) {
74-
Map<String, TylerVersion> versionMap =
75-
switch (tylerEnv) {
73+
private static Optional<TylerVersion> getVersion(TylerDomain domain) {
74+
Map<Jurisdiction, TylerVersion> versionMap =
75+
switch (domain.env()) {
7676
case TylerEnv.STAGE -> STAGE_VERSION_MAP;
7777
case TylerEnv.PROD -> PROD_VERSION_MAP;
7878
};
7979

80-
if (!versionMap.containsKey(jurisdiction)) {
80+
if (!versionMap.containsKey(domain.jurisdiction())) {
8181
return Optional.empty();
8282
}
8383

84-
return Optional.of(versionMap.get(jurisdiction));
84+
return Optional.of(versionMap.get(domain.jurisdiction()));
8585
}
8686

8787
private static Optional<URL> createLocalWsdlUrl(
88-
String jurisdiction, TylerEnv env, TylerVersion version, String suffix) {
88+
TylerDomain domain, TylerVersion version, String suffix) {
8989
String wsdlPath =
90-
"wsdl/" + version.getVersionPath() + "/" + env.getPath() + "/" + jurisdiction + suffix;
90+
"wsdl/"
91+
+ version.getVersionPath()
92+
+ "/"
93+
+ domain.env().getName()
94+
+ "/"
95+
+ domain.jurisdiction().getName()
96+
+ suffix;
9197
URL url = TylerClients.class.getClassLoader().getResource(wsdlPath);
9298
if (url == null) {
9399
log.warn("Could not find the wsdl at the classpath:{}", wsdlPath);
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package edu.suffolk.litlab.efsp.tyler;
2+
3+
import edu.suffolk.litlab.efsp.Jurisdiction;
4+
5+
/**
6+
* A combination of a Tyler jurisdiction and env, resulting in a specific set of servers to send
7+
* requests to.
8+
*/
9+
public record TylerDomain(Jurisdiction jurisdiction, TylerEnv env) {
10+
public String getName() {
11+
return jurisdiction.getName() + "-" + env.getName();
12+
}
13+
}

TylerEfmClient/src/main/java/edu/suffolk/litlab/efsp/tyler/TylerEnv.java

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -13,22 +13,16 @@ private TylerEnv(String name) {
1313
this.name = name;
1414
}
1515

16-
// ** Used for when the env determines a URL / filepath. */
17-
public String getPath() {
18-
return name;
19-
}
20-
2116
public String getName() {
2217
return name;
2318
}
2419

2520
public static TylerEnv parse(String value) {
26-
if (value.equalsIgnoreCase(STAGE.getName())) {
27-
return STAGE;
28-
} else if (value.equalsIgnoreCase(PROD.getName())) {
29-
return PROD;
30-
} else {
31-
throw new IllegalArgumentException("Can't make a `TylerEnv` from: `" + value + "`'");
21+
for (var env : TylerEnv.values()) {
22+
if (value.equalsIgnoreCase(env.getName())) {
23+
return env;
24+
}
3225
}
26+
throw new IllegalArgumentException("Can't make a `TylerEnv` from: `" + value + "`");
3327
}
3428
}

TylerEfmClient/src/test/java/edu/suffolk/litlab/efsp/tyler/TylerClientsTest.java

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
package edu.suffolk.litlab.efsp.tyler;
22

3+
import static edu.suffolk.litlab.efsp.Jurisdiction.*;
4+
import static edu.suffolk.litlab.efsp.tyler.TylerEnv.*;
35
import static org.assertj.core.api.Assertions.assertThat;
46

7+
import edu.suffolk.litlab.efsp.Jurisdiction;
58
import java.io.IOException;
69
import java.net.HttpURLConnection;
710
import java.net.URI;
@@ -16,41 +19,41 @@ public class TylerClientsTest {
1619

1720
@Test
1821
public void allFactoriesShouldNotThrow() {
19-
for (String jurisdiction :
20-
List.of("texas", "massachusetts", "illinois", "indiana", "california", "wales")) {
22+
for (Jurisdiction jurisdiction :
23+
List.of(TEXAS, MASSACHUSETTS, ILLINOIS, INDIANA, CALIFORNIA, VERMONT)) {
2124
for (TylerEnv env : TylerEnv.values()) {
22-
assertThat(TylerClients.getEfmFirmFactory(jurisdiction, env)).isNotNull();
23-
assertThat(TylerClients.getEfmUserFactory(jurisdiction, env)).isNotNull();
25+
var domain = new TylerDomain(jurisdiction, env);
26+
assertThat(TylerClients.getEfmFirmFactory(domain)).isNotNull();
27+
assertThat(TylerClients.getEfmUserFactory(domain)).isNotNull();
2428
}
2529
}
26-
assertThat(TylerClients.getEfmUserFactory("antartica", TylerEnv.STAGE)).isEmpty();
27-
assertThat(TylerClients.getEfmUserFactory("massachusetts", TylerEnv.PROD)).isNotEmpty();
28-
assertThat(TylerClients.getEfmUserFactory("illinois", TylerEnv.STAGE)).isNotEmpty();
30+
assertThat(TylerClients.getEfmUserFactory(new TylerDomain(MASSACHUSETTS, PROD))).isNotEmpty();
31+
assertThat(TylerClients.getEfmUserFactory(new TylerDomain(ILLINOIS, STAGE))).isNotEmpty();
2932
}
3033

3134
@Test
3235
public void testJurisdictionEnvUrls() throws IOException, URISyntaxException {
3336
testJurisdictionEnvUrl(
3437
"https://texas-stage.tylertech.cloud/",
35-
TylerClients.getTylerServerRootUrl("texas", TylerEnv.STAGE));
38+
TylerClients.getTylerServerRootUrl(new TylerDomain(TEXAS, STAGE)));
3639
testJurisdictionEnvUrl(
3740
"https://texas.tylertech.cloud/",
38-
TylerClients.getTylerServerRootUrl("texas", TylerEnv.PROD));
41+
TylerClients.getTylerServerRootUrl(new TylerDomain(TEXAS, PROD)));
3942
testJurisdictionEnvUrl(
4043
"https://massachusetts-stage.tylertech.cloud/",
41-
TylerClients.getTylerServerRootUrl("massachusetts", TylerEnv.STAGE));
44+
TylerClients.getTylerServerRootUrl(new TylerDomain(MASSACHUSETTS, STAGE)));
4245
testJurisdictionEnvUrl(
4346
"https://massachusetts.tylertech.cloud/",
44-
TylerClients.getTylerServerRootUrl("massachusetts", TylerEnv.PROD));
47+
TylerClients.getTylerServerRootUrl(new TylerDomain(MASSACHUSETTS, PROD)));
4548
testJurisdictionEnvUrl(
4649
"https://illinois-stage.tylertech.cloud/",
47-
TylerClients.getTylerServerRootUrl("illinois", TylerEnv.STAGE));
50+
TylerClients.getTylerServerRootUrl(new TylerDomain(ILLINOIS, STAGE)));
4851
testJurisdictionEnvUrl(
4952
"https://illinois.tylertech.cloud/",
50-
TylerClients.getTylerServerRootUrl("illinois", TylerEnv.PROD));
53+
TylerClients.getTylerServerRootUrl(new TylerDomain(ILLINOIS, PROD)));
5154
}
5255

53-
public void testJurisdictionEnvUrl(String urlExpected, String urlGenerated)
56+
private void testJurisdictionEnvUrl(String urlExpected, String urlGenerated)
5457
throws IOException, URISyntaxException {
5558
assertThat(urlGenerated).isEqualTo(urlExpected);
5659
URL url = (new URI(urlGenerated)).toURL();

proxyserver/src/main/java/edu/suffolk/litlab/efsp/ecfcodes/CodeDatabaseAPI.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package edu.suffolk.litlab.efsp.ecfcodes;
22

33
import edu.suffolk.litlab.efsp.db.Database;
4+
import edu.suffolk.litlab.efsp.tyler.TylerDomain;
45
import jakarta.xml.bind.JAXBContext;
56
import jakarta.xml.bind.JAXBException;
67
import jakarta.xml.bind.Unmarshaller;
@@ -34,7 +35,7 @@ public CodeDatabaseAPI(Connection conn) {
3435
* The domain (the juristiction + environment, e.g. illinois-stage) that this database is working
3536
* over.
3637
*/
37-
public abstract String getDomain();
38+
public abstract TylerDomain getDomain();
3839

3940
/**
4041
* Gets all court location identifiers (CLI) stored in the database.

0 commit comments

Comments
 (0)