Skip to content

Commit bec6420

Browse files
Use TylerEnv on all parsing boundaries (#296)
I.e., anytime we read the env var, immediately turn it into the enum. Throws a quick `IllegalArgumentExeception` at those points, so the server should immediately stop if invalid. * also exposes the hack that the JSON parser depends on if Tyler's env is stage or prod. This is something that we still need to resolve elsewhere, but at least we aren't grabbing env vars deep inside that class anymore. The only place that could have had more refactorings but didn't was `SoapClientChooser`. Could have introduced a String jurisdiction TylerEnv object to handle the mappings instead of a single string, but I would have had to retype all of the jurisdiction keys, which would have meant potential unnecessary errors. A second attempt at #293, which got too big (had tried to include jurisdiction to fix the `SoapClientChooser` as described above, but jurisdiction has a much larger footprint, and needs to handle non-Tyler jurisdictions as well, becomes dependent on deprecating JeffNet code, etc.). Fix #283.
1 parent 65ddc4b commit bec6420

24 files changed

Lines changed: 93 additions & 70 deletions

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

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,23 +7,28 @@ public enum TylerEnv {
77
/// to "deploy patches and new releases prior to introduction into" PROD
88
STAGE("stage");
99

10-
private String path;
10+
private String name;
1111

12-
private TylerEnv(String path) {
13-
this.path = path;
12+
private TylerEnv(String name) {
13+
this.name = name;
1414
}
1515

16+
// ** Used for when the env determines a URL / filepath. */
1617
public String getPath() {
17-
return path;
18+
return name;
19+
}
20+
21+
public String getName() {
22+
return name;
1823
}
1924

2025
public static TylerEnv parse(String value) {
21-
if (value.equalsIgnoreCase(STAGE.getPath())) {
26+
if (value.equalsIgnoreCase(STAGE.getName())) {
2227
return STAGE;
23-
} else if (value.equalsIgnoreCase(PROD.getPath())) {
28+
} else if (value.equalsIgnoreCase(PROD.getName())) {
2429
return PROD;
2530
} else {
26-
throw new IllegalArgumentException("Can't make a `TylerEnv` from: " + value);
31+
throw new IllegalArgumentException("Can't make a `TylerEnv` from: `" + value + "`'");
2732
}
2833
}
2934
}

proxyserver/src/main/java/edu/suffolk/litlab/efsp/docassemble/DocassembleToFilingInformationConverter.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,27 +5,34 @@
55
import com.fasterxml.jackson.databind.module.SimpleModule;
66
import com.hubspot.algebra.Result;
77
import edu.suffolk.litlab.efsp.model.FilingInformation;
8+
import edu.suffolk.litlab.efsp.tyler.TylerEnv;
89
import edu.suffolk.litlab.efsp.utils.FilingError;
910
import edu.suffolk.litlab.efsp.utils.InfoCollector;
1011
import edu.suffolk.litlab.efsp.utils.InterviewToFilingInformationConverter;
1112
import java.io.InputStream;
13+
import java.util.Optional;
1214
import org.slf4j.Logger;
1315
import org.slf4j.LoggerFactory;
1416

1517
public class DocassembleToFilingInformationConverter extends InterviewToFilingInformationConverter {
1618

1719
private static Logger log =
1820
LoggerFactory.getLogger(DocassembleToFilingInformationConverter.class);
21+
private final Optional<TylerEnv> tylerEnv;
1922

20-
public DocassembleToFilingInformationConverter(InputStream taxonomyCsv) {}
23+
public DocassembleToFilingInformationConverter(
24+
InputStream taxonomyCsv, Optional<TylerEnv> tylerEnv) {
25+
this.tylerEnv = tylerEnv;
26+
}
2127

2228
@Override
2329
public Result<FilingInformation, FilingError> traverseInterview(
2430
String interviewContents, InfoCollector collector) {
2531
SimpleModule module = new SimpleModule();
2632
module.addDeserializer(
2733
FilingInformation.class,
28-
new FilingInformationDocassembleJacksonDeserializer(FilingInformation.class, collector));
34+
new FilingInformationDocassembleJacksonDeserializer(
35+
FilingInformation.class, collector, tylerEnv));
2936
ObjectMapper mapper = new ObjectMapper();
3037
mapper.registerModule(module);
3138
try {

proxyserver/src/main/java/edu/suffolk/litlab/efsp/docassemble/FilingInformationDocassembleJacksonDeserializer.java

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
package edu.suffolk.litlab.efsp.docassemble;
22

3-
import static edu.suffolk.litlab.efsp.stdlib.StdLib.GetEnv;
4-
53
import com.fasterxml.jackson.core.JsonParser;
64
import com.fasterxml.jackson.core.JsonProcessingException;
75
import com.fasterxml.jackson.databind.DeserializationContext;
@@ -16,6 +14,7 @@
1614
import edu.suffolk.litlab.efsp.model.LowerCourtInfo;
1715
import edu.suffolk.litlab.efsp.model.PartyId;
1816
import edu.suffolk.litlab.efsp.model.Person;
17+
import edu.suffolk.litlab.efsp.tyler.TylerEnv;
1918
import edu.suffolk.litlab.efsp.utils.FilingError;
2019
import edu.suffolk.litlab.efsp.utils.InfoCollector;
2120
import edu.suffolk.litlab.efsp.utils.InterviewVariable;
@@ -42,10 +41,14 @@ public class FilingInformationDocassembleJacksonDeserializer
4241
private static final long serialVersionUID = 1L;
4342
private final InfoCollector classCollector;
4443

44+
/** If Tyler is setup on this server, this is the env we're submitting to. */
45+
private final Optional<TylerEnv> tylerEnv;
46+
4547
public FilingInformationDocassembleJacksonDeserializer(
46-
Class<FilingInformation> t, InfoCollector collector) {
48+
Class<FilingInformation> t, InfoCollector collector, Optional<TylerEnv> env) {
4749
super(t);
4850
this.classCollector = collector;
51+
this.tylerEnv = env;
4952
}
5053

5154
/**
@@ -92,8 +95,7 @@ private static List<Person> collectPeople(
9295
return List.copyOf(people);
9396
}
9497

95-
public static FilingInformation fromNode(JsonNode node, InfoCollector collector)
96-
throws FilingError {
98+
public FilingInformation fromNode(JsonNode node, InfoCollector collector) throws FilingError {
9799
if (!node.isObject()) {
98100
FilingError err = FilingError.malformedInterview("interview isn't a json object");
99101
collector.error(err);
@@ -492,7 +494,7 @@ private static Optional<LocalDate> extractReturnDate(
492494
return maybeReturnDate;
493495
}
494496

495-
private static Optional<LowerCourtInfo> extractLowerCourt(JsonNode node, InfoCollector collector)
497+
private Optional<LowerCourtInfo> extractLowerCourt(JsonNode node, InfoCollector collector)
496498
throws FilingError {
497499
if (node == null) {
498500
return Optional.empty();
@@ -523,8 +525,7 @@ private static Optional<LowerCourtInfo> extractLowerCourt(JsonNode node, InfoCol
523525
Optional<String> maybeCodeText = Optional.empty();
524526
// TODO(brycew): HACK HACK HACK! Should be a better way to handle lower court codes than
525527
// this, but it's broken on prod
526-
var tylerEnv = GetEnv("TYLER_ENV");
527-
if (tylerEnv.orElse("").equalsIgnoreCase("prod")) {
528+
if (tylerEnv.isPresent() && tylerEnv.get() == TylerEnv.PROD) {
528529
maybeCodeText =
529530
JsonHelpers.getStringMember(node.get("trial_court"), "tyler_prod_lower_court_code");
530531
} else {

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

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -514,9 +514,8 @@ public boolean replaceSome(
514514

515515
/** Sets up the WSDL connection to Tyler, used for `getPolicy` to get the URL. */
516516
private static FilingReviewMDEPort loginWithTyler(
517-
String jurisdiction, String env, String userEmail, String userPassword) {
518-
Optional<TylerUserFactory> userFactory =
519-
TylerClients.getEfmUserFactory(jurisdiction, TylerEnv.parse(env));
517+
String jurisdiction, TylerEnv env, String userEmail, String userPassword) {
518+
Optional<TylerUserFactory> userFactory = TylerClients.getEfmUserFactory(jurisdiction, env);
520519
if (userFactory.isEmpty()) {
521520
throw new RuntimeException("Can't find " + jurisdiction + " in Soap chooser for EFMUser");
522521
}
@@ -541,7 +540,7 @@ private static FilingReviewMDEPort loginWithTyler(
541540
}
542541

543542
/** Downloads a single codes zip. For Debugging. */
544-
public boolean downloadIndiv(List<String> args, String jurisdiction, String env) {
543+
public boolean downloadIndiv(List<String> args, String jurisdiction, TylerEnv env) {
545544
if (args.size() < 3) {
546545
log.error(
547546
"Need to pass in args: downloadIndiv <jurisdiction> <table> <location or blank for"
@@ -557,7 +556,7 @@ public boolean downloadIndiv(List<String> args, String jurisdiction, String env)
557556
String table = args.get(2);
558557
String location = (args.size() == 4) ? args.get(3) : "";
559558
HeaderSigner hs = new HeaderSigner(this.pathToKeystore, this.x509Password);
560-
String endpoint = TylerClients.getTylerServerRootUrl(jurisdiction, TylerEnv.parse(env));
559+
String endpoint = TylerClients.getTylerServerRootUrl(jurisdiction, env);
561560
return downloadAndProcessZip(
562561
makeCodeUrl(endpoint, table, location),
563562
hs.signedCurrentTime().get(),
@@ -574,12 +573,12 @@ public boolean downloadIndiv(List<String> args, String jurisdiction, String env)
574573
}
575574

576575
public static boolean executeCommand(
577-
CodeDatabase cd, String jurisdiction, String env, List<String> args, String x509Password) {
576+
CodeDatabase cd, String jurisdiction, TylerEnv env, List<String> args, String x509Password) {
578577
SoapX509CallbackHandler.setX509Password(x509Password);
579578
String command = args.get(0);
580579
try {
581580
cd.setAutoCommit(false);
582-
String codesSite = TylerClients.getTylerServerRootUrl(jurisdiction, TylerEnv.parse(env));
581+
String codesSite = TylerClients.getTylerServerRootUrl(jurisdiction, env);
583582
FilingReviewMDEPort filingPort =
584583
loginWithTyler(
585584
jurisdiction,
@@ -632,7 +631,7 @@ public static void main(String[] args) throws Exception {
632631
100);
633632

634633
List<String> jurisdictions = List.of(System.getenv("TYLER_JURISDICTIONS").split(" "));
635-
String env = System.getenv("TYLER_ENV");
634+
var env = TylerEnv.parse(System.getenv("TYLER_ENV"));
636635
for (String jurisdiction : jurisdictions) {
637636
try (Connection conn = ds.getConnection()) {
638637
executeCommand(

proxyserver/src/main/java/edu/suffolk/litlab/efsp/ecfcodes/tyler/CodeDatabase.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import edu.suffolk.litlab.efsp.ecfcodes.CodeDatabaseAPI;
44
import edu.suffolk.litlab.efsp.stdlib.SQLFunction;
5+
import edu.suffolk.litlab.efsp.tyler.TylerEnv;
56
import jakarta.xml.bind.JAXBException;
67
import java.io.InputStream;
78
import java.sql.Connection;
@@ -43,12 +44,12 @@ public class CodeDatabase extends CodeDatabaseAPI {
4344
/** The DNS domain (tyler jurisdiction + tyler environment, illinois-stage). */
4445
private final String tylerDomain;
4546

46-
public CodeDatabase(String jurisdiction, String env, Connection conn) {
47+
public CodeDatabase(String jurisdiction, TylerEnv env, Connection conn) {
4748
super(conn);
48-
this.tylerDomain = jurisdiction + "-" + env;
49+
this.tylerDomain = jurisdiction + "-" + env.getName();
4950
}
5051

51-
public static CodeDatabase fromDS(String jurisdiction, String env, DataSource ds) {
52+
public static CodeDatabase fromDS(String jurisdiction, TylerEnv env, DataSource ds) {
5253
try {
5354
CodeDatabase cd = new CodeDatabase(jurisdiction, env, ds.getConnection());
5455
return cd;

proxyserver/src/main/java/edu/suffolk/litlab/efsp/server/EfspServer.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import edu.suffolk.litlab.efsp.server.utils.SendMessage;
2929
import edu.suffolk.litlab.efsp.server.utils.ServiceHelpers;
3030
import edu.suffolk.litlab.efsp.server.utils.SoapExceptionMapper;
31+
import edu.suffolk.litlab.efsp.tyler.TylerEnv;
3132
import edu.suffolk.litlab.efsp.utils.InterviewToFilingInformationConverter;
3233
import jakarta.ws.rs.core.MediaType;
3334
import java.security.NoSuchAlgorithmException;
@@ -194,9 +195,10 @@ public static void main(String[] args) throws Exception {
194195

195196
setupDatabases(codeDs, userDs);
196197

198+
Optional<TylerEnv> tylerEnv = GetEnv("TYLER_ENV").map(TylerEnv::parse);
197199
InterviewToFilingInformationConverter daJsonConverter =
198200
new DocassembleToFilingInformationConverter(
199-
EfspServer.class.getResourceAsStream("/taxonomy.csv"));
201+
EfspServer.class.getResourceAsStream("/taxonomy.csv"), tylerEnv);
200202
Map<String, InterviewToFilingInformationConverter> converterMap =
201203
Map.of(
202204
"application/json", daJsonConverter,
@@ -211,7 +213,6 @@ public static void main(String[] args) throws Exception {
211213

212214
Optional<String> tylerJurisdictions = GetEnv("TYLER_JURISDICTIONS");
213215
Optional<String> togaKeyStr = GetEnv("TOGA_CLIENT_KEYS");
214-
Optional<String> tylerEnv = GetEnv("TYLER_ENV");
215216
List<String> jurisdictions = List.of(tylerJurisdictions.orElse("").split(" "));
216217
List<String> togaKeys = List.of(togaKeyStr.orElse("").split(" "));
217218
if (jurisdictions.size() > 0 && jurisdictions.size() != togaKeys.size()) {

proxyserver/src/main/java/edu/suffolk/litlab/efsp/server/auth/SecurityHub.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import edu.suffolk.litlab.efsp.db.LoginDatabase;
55
import edu.suffolk.litlab.efsp.db.model.AtRest;
66
import edu.suffolk.litlab.efsp.db.model.NewTokens;
7+
import edu.suffolk.litlab.efsp.tyler.TylerEnv;
78
import java.sql.SQLException;
89
import java.util.HashMap;
910
import java.util.List;
@@ -41,7 +42,7 @@ public class SecurityHub {
4142
* @param jurisdictions a list of Tyler jurisdictions to connect to. See SoapClientChooser.
4243
*/
4344
public SecurityHub(
44-
Supplier<LoginDatabase> ldSupplier, Optional<String> env, List<String> jurisdictions) {
45+
Supplier<LoginDatabase> ldSupplier, Optional<TylerEnv> env, List<String> jurisdictions) {
4546
this.ldSupplier = ldSupplier;
4647
if (env.isEmpty() || jurisdictions.isEmpty()) {
4748
this.tylerLoginObjs = List.of();

proxyserver/src/main/java/edu/suffolk/litlab/efsp/server/auth/TylerLogin.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,9 @@ public class TylerLogin implements LoginInterface {
2020
private static final String HEADER_KEY_PREFIX = "TYLER-TOKEN";
2121
private final String jurisdiction;
2222

23-
public TylerLogin(String jurisdiction, String env) {
23+
public TylerLogin(String jurisdiction, TylerEnv env) {
2424
this.jurisdiction = jurisdiction;
25-
Optional<TylerUserFactory> maybeUserFactory =
26-
TylerClients.getEfmUserFactory(jurisdiction, TylerEnv.parse(env));
25+
Optional<TylerUserFactory> maybeUserFactory = TylerClients.getEfmUserFactory(jurisdiction, env);
2726
if (maybeUserFactory.isPresent()) {
2827
userServiceFactory = maybeUserFactory.get();
2928
} else {

proxyserver/src/main/java/edu/suffolk/litlab/efsp/server/ecf4/SoapClientChooser.java

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package edu.suffolk.litlab.efsp.server.ecf4;
22

3+
import edu.suffolk.litlab.efsp.tyler.TylerEnv;
34
import https.docs_oasis_open_org.legalxml_courtfiling.ns.v5_0.wsdl.courtschedulingmde.CourtSchedulingMDE_Service;
45
import java.net.URL;
56
import java.util.Map;
@@ -18,6 +19,7 @@ public class SoapClientChooser {
1819

1920
private static final Logger log = LoggerFactory.getLogger(SoapClientChooser.class);
2021

22+
// TODO(#284): finish this refactor to use TylerEnvs instead of strings
2123
static final Map<String, String> serviceMDEWsdls =
2224
Map.of(
2325
"illinois-stage", "wsdl/stage/illinois-ECF-4.0-ServiceMDEService.wsdl",
@@ -63,17 +65,17 @@ public static Optional<FilingReviewMDEService> getFilingReviewFactory(String wsd
6365
}
6466

6567
public static Optional<FilingReviewMDEService> getFilingReviewFactory(
66-
String jurisdiction, String env) {
67-
return getFilingReviewFactory(jurisdiction + "-" + env);
68+
String jurisdiction, TylerEnv env) {
69+
return getFilingReviewFactory(jurisdiction + "-" + env.getName());
6870
}
6971

7072
public static Optional<ServiceMDEService> getServiceFactory(String wsdlDomain) {
7173
Optional<URL> url = urlFromString(wsdlDomain, serviceMDEWsdls);
7274
return url.map(u -> new ServiceMDEService(u));
7375
}
7476

75-
public static Optional<ServiceMDEService> getServiceFactory(String jurisdiction, String env) {
76-
return getServiceFactory(jurisdiction + "-" + env);
77+
public static Optional<ServiceMDEService> getServiceFactory(String jurisdiction, TylerEnv env) {
78+
return getServiceFactory(jurisdiction + "-" + env.getName());
7779
}
7880

7981
public static Optional<CourtRecordMDEService> getCourtRecordFactory(String wsdlDomain) {
@@ -82,8 +84,8 @@ public static Optional<CourtRecordMDEService> getCourtRecordFactory(String wsdlD
8284
}
8385

8486
public static Optional<CourtRecordMDEService> getCourtRecordFactory(
85-
String jurisdiction, String env) {
86-
return getCourtRecordFactory(jurisdiction + "-" + env);
87+
String jurisdiction, TylerEnv env) {
88+
return getCourtRecordFactory(jurisdiction + "-" + env.getName());
8789
}
8890

8991
public static Optional<CourtSchedulingMDE_Service> getCourtSchedulingFactory(String wsdlDomain) {
@@ -92,8 +94,8 @@ public static Optional<CourtSchedulingMDE_Service> getCourtSchedulingFactory(Str
9294
}
9395

9496
public static Optional<CourtSchedulingMDE_Service> getCourtSchedulingFactory(
95-
String jurisdiction, String env) {
96-
return getCourtSchedulingFactory(jurisdiction + "-" + env);
97+
String jurisdiction, TylerEnv env) {
98+
return getCourtSchedulingFactory(jurisdiction + "-" + env.getName());
9799
}
98100

99101
private static Optional<URL> urlFromString(String wsdlDomain, Map<String, String> domainToWsdl) {

proxyserver/src/main/java/edu/suffolk/litlab/efsp/server/services/AdminUserService.java

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -123,21 +123,19 @@ public class AdminUserService {
123123

124124
public AdminUserService(
125125
String jurisdiction,
126-
String env,
126+
TylerEnv env,
127127
Supplier<LoginDatabase> ldSupplier,
128128
Supplier<CodeDatabase> cdSupplier,
129129
Function<String, Result<NullValue, String>> passwordChecker) {
130130
this.jurisdiction = jurisdiction;
131131
this.passwordChecker = passwordChecker;
132-
Optional<TylerUserFactory> maybeUserFactory =
133-
TylerClients.getEfmUserFactory(jurisdiction, TylerEnv.parse(env));
132+
Optional<TylerUserFactory> maybeUserFactory = TylerClients.getEfmUserFactory(jurisdiction, env);
134133
if (maybeUserFactory.isEmpty()) {
135134
throw new RuntimeException(
136135
"Can't find " + jurisdiction + " in the SoapClientChooser for EfmUser");
137136
}
138137
this.userFactory = maybeUserFactory.get();
139-
Optional<TylerFirmFactory> maybeFirmFactory =
140-
TylerClients.getEfmFirmFactory(jurisdiction, TylerEnv.parse(env));
138+
Optional<TylerFirmFactory> maybeFirmFactory = TylerClients.getEfmFirmFactory(jurisdiction, env);
141139
if (maybeFirmFactory.isEmpty()) {
142140
throw new RuntimeException(
143141
"Can't find " + jurisdiction + " in the SoapClientChooser for EfmFirm factory");

0 commit comments

Comments
 (0)