Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package edu.suffolk.litlab.efsp.db;

import edu.suffolk.litlab.efsp.db.model.AtRest;
import edu.suffolk.litlab.efsp.ecfcodes.tyler.CodeTableConstants;
import edu.suffolk.litlab.efsp.server.utils.MDCWrappers;
import edu.suffolk.litlab.efsp.ecfcodes.CodeDatabaseUtils;
import edu.suffolk.litlab.efsp.server.logging.MDCWrappers;
import edu.suffolk.litlab.efsp.stdlib.RandomString;
import edu.suffolk.litlab.efsp.utils.Hasher;
import java.sql.Connection;
Expand Down Expand Up @@ -65,7 +65,7 @@ public void createTablesIfAbsent() throws SQLException {

String tableName = "at_rest_keys";
String createQuery = atRestCreate;
String tableExistsQuery = CodeTableConstants.getTableExists();
String tableExistsQuery = CodeDatabaseUtils.getTableExists();
try (PreparedStatement existsSt = conn.prepareStatement(tableExistsQuery)) {
existsSt.setString(1, tableName);
ResultSet rs = existsSt.executeQuery();
Expand All @@ -84,7 +84,7 @@ public void createTablesIfAbsent() throws SQLException {

public boolean tablesExist() throws SQLException {
String tableName = "at_rest_keys";
String tableExistsQuery = CodeTableConstants.getTableExists();
String tableExistsQuery = CodeDatabaseUtils.getTableExists();
try (PreparedStatement existsSt = conn.prepareStatement(tableExistsQuery)) {
existsSt.setString(1, tableName);
ResultSet rs = existsSt.executeQuery();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package edu.suffolk.litlab.efsp.db;

import edu.suffolk.litlab.efsp.db.model.MessageInfo;
import edu.suffolk.litlab.efsp.ecfcodes.tyler.CodeTableConstants;
import edu.suffolk.litlab.efsp.ecfcodes.CodeDatabaseUtils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
Expand Down Expand Up @@ -36,7 +36,7 @@ public void createTablesIfAbsent() throws SQLException {
throw new SQLException();
}

String tableExistsQuery = CodeTableConstants.getTableExists();
String tableExistsQuery = CodeDatabaseUtils.getTableExists();
try (PreparedStatement existsSt = conn.prepareStatement(tableExistsQuery)) {
existsSt.setString(1, "message_settings");
ResultSet rs = existsSt.executeQuery();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package edu.suffolk.litlab.efsp.db;

import edu.suffolk.litlab.efsp.db.model.Transaction;
import edu.suffolk.litlab.efsp.ecfcodes.tyler.CodeTableConstants;
import edu.suffolk.litlab.efsp.ecfcodes.CodeDatabaseUtils;
import edu.suffolk.litlab.efsp.model.EmailTemplates;
import java.sql.Connection;
import java.sql.PreparedStatement;
Expand Down Expand Up @@ -42,7 +42,7 @@ public static UserDatabase fromDS(DataSource ds) {

/** Creates the userdatabase table if it doesn't exist yet. */
public void createTablesIfAbsent() throws SQLException {
String tableExistsQuery = CodeTableConstants.getTableExists();
String tableExistsQuery = CodeDatabaseUtils.getTableExists();
try (PreparedStatement existsSt = conn.prepareStatement(tableExistsQuery)) {
existsSt.setString(1, "submitted_filings");
ResultSet rs = existsSt.executeQuery();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package edu.suffolk.litlab.efsp.docassemble;

import com.fasterxml.jackson.databind.JsonNode;
import edu.suffolk.litlab.efsp.ecfcodes.CodesParser;
import edu.suffolk.litlab.efsp.model.Address;
import edu.suffolk.litlab.efsp.server.ecf4.CodesParser;
import edu.suffolk.litlab.efsp.utils.FilingError;
import edu.suffolk.litlab.efsp.utils.InfoCollector;
import edu.suffolk.litlab.efsp.utils.InterviewVariable;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.hubspot.algebra.Result;
import edu.suffolk.litlab.efsp.ecfcodes.CodesParser;
import edu.suffolk.litlab.efsp.model.FilingInformation;
import edu.suffolk.litlab.efsp.server.ecf4.CodesParser;
import edu.suffolk.litlab.efsp.tyler.TylerEnv;
import edu.suffolk.litlab.efsp.utils.FilingError;
import edu.suffolk.litlab.efsp.utils.InfoCollector;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,19 +10,19 @@

import com.fasterxml.jackson.databind.JsonNode;
import com.hubspot.algebra.Result;
import edu.suffolk.litlab.efsp.ecfcodes.tyler.FilingCode;
import edu.suffolk.litlab.efsp.ecfcodes.tyler.FilingComponent;
import edu.suffolk.litlab.efsp.ecfcodes.CodesParser;
import edu.suffolk.litlab.efsp.ecfcodes.CodesParser.CodeError;
import edu.suffolk.litlab.efsp.ecfcodes.CodesParser.FileExtensionNotAllowed;
import edu.suffolk.litlab.efsp.ecfcodes.CodesParser.FileNameTextError;
import edu.suffolk.litlab.efsp.ecfcodes.CodesParser.InputOptionalService;
import edu.suffolk.litlab.efsp.ecfcodes.CodesParser.TextVarError;
import edu.suffolk.litlab.efsp.model.FilingAction;
import edu.suffolk.litlab.efsp.model.FilingAttachment;
import edu.suffolk.litlab.efsp.model.FilingDoc;
import edu.suffolk.litlab.efsp.model.OptionalService;
import edu.suffolk.litlab.efsp.model.PartyId;
import edu.suffolk.litlab.efsp.server.ecf4.CodesParser;
import edu.suffolk.litlab.efsp.server.ecf4.CodesParser.CodeError;
import edu.suffolk.litlab.efsp.server.ecf4.CodesParser.FileExtensionNotAllowed;
import edu.suffolk.litlab.efsp.server.ecf4.CodesParser.FileNameTextError;
import edu.suffolk.litlab.efsp.server.ecf4.CodesParser.InputOptionalService;
import edu.suffolk.litlab.efsp.server.ecf4.CodesParser.TextVarError;
import edu.suffolk.litlab.efsp.tyler.ecfcodes.FilingCode;
import edu.suffolk.litlab.efsp.tyler.ecfcodes.FilingComponent;
import edu.suffolk.litlab.efsp.utils.FilingError;
import edu.suffolk.litlab.efsp.utils.InfoCollector;
import edu.suffolk.litlab.efsp.utils.InterviewVariable;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,19 +11,19 @@
import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
import com.fasterxml.jackson.databind.node.NullNode;
import com.hubspot.algebra.Result;
import edu.suffolk.litlab.efsp.ecfcodes.tyler.FilingCode;
import edu.suffolk.litlab.efsp.ecfcodes.CodesParser;
import edu.suffolk.litlab.efsp.ecfcodes.CodesParser.AttorneyError;
import edu.suffolk.litlab.efsp.ecfcodes.CodesParser.NoMultipleAttorneys;
import edu.suffolk.litlab.efsp.ecfcodes.CodesParser.RequiredAttorneys;
import edu.suffolk.litlab.efsp.model.CaseServiceContact;
import edu.suffolk.litlab.efsp.model.EmailTemplates;
import edu.suffolk.litlab.efsp.model.FilingDoc;
import edu.suffolk.litlab.efsp.model.FilingInformation;
import edu.suffolk.litlab.efsp.model.LowerCourtInfo;
import edu.suffolk.litlab.efsp.model.PartyId;
import edu.suffolk.litlab.efsp.model.Person;
import edu.suffolk.litlab.efsp.server.ecf4.CodesParser;
import edu.suffolk.litlab.efsp.server.ecf4.CodesParser.AttorneyError;
import edu.suffolk.litlab.efsp.server.ecf4.CodesParser.NoMultipleAttorneys;
import edu.suffolk.litlab.efsp.server.ecf4.CodesParser.RequiredAttorneys;
import edu.suffolk.litlab.efsp.tyler.TylerEnv;
import edu.suffolk.litlab.efsp.tyler.ecfcodes.FilingCode;
import edu.suffolk.litlab.efsp.utils.FilingError;
import edu.suffolk.litlab.efsp.utils.InfoCollector;
import edu.suffolk.litlab.efsp.utils.InterviewVariable;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.NullNode;
import edu.suffolk.litlab.efsp.ecfcodes.CodesParser;
import edu.suffolk.litlab.efsp.model.Name;
import edu.suffolk.litlab.efsp.server.ecf4.CodesParser;
import edu.suffolk.litlab.efsp.utils.FilingError;
import edu.suffolk.litlab.efsp.utils.InfoCollector;
import edu.suffolk.litlab.efsp.utils.InterviewVariable;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,12 @@

import com.fasterxml.jackson.databind.JsonNode;
import com.hubspot.algebra.Result;
import edu.suffolk.litlab.efsp.ecfcodes.CodesParser;
import edu.suffolk.litlab.efsp.model.Address;
import edu.suffolk.litlab.efsp.model.ContactInformation;
import edu.suffolk.litlab.efsp.model.Name;
import edu.suffolk.litlab.efsp.model.Person;
import edu.suffolk.litlab.efsp.model.Person.Gender;
import edu.suffolk.litlab.efsp.server.ecf4.CodesParser;
import edu.suffolk.litlab.efsp.utils.FilingError;
import edu.suffolk.litlab.efsp.utils.InfoCollector;
import java.time.LocalDate;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package edu.suffolk.litlab.efsp.ecfcodes.tyler;
package edu.suffolk.litlab.efsp.ecfcodes;

/**
* The code and location for a Tyler code.
* The code and location for an ECF code.
*
* <p>Returned by the various "search" APIs; you search for all codes with "XYZ" in the name, and
* then do `/filing_code_names/XYZ` to get the code and location, enough to find all of the
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,21 @@
package edu.suffolk.litlab.efsp.ecfcodes;

import edu.suffolk.litlab.efsp.db.Database;
import edu.suffolk.litlab.efsp.stdlib.SQLFunction;
import edu.suffolk.litlab.efsp.stdlib.SQLGetter;
import edu.suffolk.litlab.efsp.tyler.TylerDomain;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
* ECF says that certain parts of the information model of the data that we exchange with the EFM is
Expand All @@ -19,6 +27,8 @@
* jurisiction.
*/
public abstract class CodeDatabaseAPI extends Database {
private static final Logger log = LoggerFactory.getLogger(CodeDatabaseAPI.class);

public CodeDatabaseAPI(Connection conn) {
super(conn);
}
Expand Down Expand Up @@ -61,4 +71,90 @@ public abstract boolean deleteFromTable(String tableName, String courtLocation)
// TODO(brycew): needed for compatibility, but should be renamed to something more general
// i.e. 'postUpdateClean'
public abstract void vacuumAll();

/**
* Gets all distinct case category names that have the search term in them.
*
* @param searchTerm
* @return
*/
public abstract List<String> searchCaseCategory(String searchTerm);

public abstract List<String> courtCoverageCaseCategory(String searchTerm);

/**
* Get the code and court locations of the case categories that match the given name exactly.
*
* @param categoryName
* @return
*/
public abstract List<CodeAndLocation> retrieveCaseCategoryByName(String categoryName);

public abstract List<NameAndCode> getCaseCategoryNames(String courtLocationId);

// Note: to get the full object, need to have the child code database type object.

/**
* Gets all distinct case type names that have the search term in them.
*
* @param searchTerm
* @return
*/
public abstract List<String> searchCaseType(String searchTerm);

public abstract List<String> courtCoverageCaseType(String searchTerm);

/**
* Get the code and court locations of the case types that match the given name exactly.
*
* @param caseTypeName
* @return
*/
public abstract List<CodeAndLocation> retrieveCaseTypeByName(String caseTypeName);

public abstract List<NameAndCode> getCaseTypeNamesFor(
String courtLocationId, String caseCategoryCode, Optional<Boolean> initial);

/** Runs all of the logic for search queries (both name searches and court coverage searches). */
protected List<String> genericSearch(
String searchTerm, SQLFunction<String, PreparedStatement> queryMaker) {
String finalSearchTerm = CodeDatabaseUtils.likeWildcard(searchTerm);
return safetyWrap(
() -> {
try (PreparedStatement st = queryMaker.apply(finalSearchTerm)) {
List<String> types = new ArrayList<>();
ResultSet rs = st.executeQuery();
while (rs.next()) {
types.add(rs.getString(1));
}
return types;
}
});
}

protected <T> List<T> safetyWrap(SQLGetter<List<T>> sup) {
if (conn == null) {
log.error("SQL connection not created yet!");
return List.of();
}
try {
return sup.get();
} catch (SQLException ex) {
log.error("SQL excption: ", ex);
return List.of();
}
}

protected <T> Optional<T> safetyWrapOpt(SQLGetter<Optional<T>> sup) {
if (conn == null) {
log.error("SQL connection not created yet!");
return Optional.empty();
}
try {
return sup.get();
} catch (SQLException ex) {
log.error("SQL excption: ", ex);
return Optional.empty();
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package edu.suffolk.litlab.efsp.ecfcodes;

import java.sql.SQLException;

public class CodeDatabaseUtils {
/** This exception is returned when a given table name isn't in the pre-approved list of names. */
public static class UnsupportedTableException extends SQLException {
public UnsupportedTableException(String message) {
super(message);
}
}

public static String getTableExists() {
return """
SELECT COUNT(*) FROM information_schema.tables WHERE table_schema = 'public'
AND table_name = ? LIMIT 1;""";
}

public static String getIndicesExist() {
return """
SELECT COUNT(*) FROM pg_catalog.pg_indexes where schemaname='public'
AND tablename = ? LIMIT 1;""";
}

/**
* In most cases, we want to find all instances of the search term, not the exact term. It's a
* LIKE compare, so add the 0 or more characters on either side.
*
* @param searchTerm
* @return
*/
public static String likeWildcard(String searchTerm) {
if (searchTerm == null) {
return "%";
}
return "%" + searchTerm + "%";
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ public class CodeDocIterator implements Iterator<Map<String, String>> {
private final XMLEventReader reader;
/// From the Identification / Version tags.
private final String version;
// TODO: factor out these ECF4 specific types, this should be ECF 4 / 5 independent.
private final ColumnSet columnSet;

private Map<String, String> nextRow;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,22 +1,21 @@
package edu.suffolk.litlab.efsp.server.ecf4;
package edu.suffolk.litlab.efsp.ecfcodes;

import com.hubspot.algebra.NullValue;
import com.hubspot.algebra.Result;
import edu.suffolk.litlab.efsp.ecfcodes.tyler.CaseCategory;
import edu.suffolk.litlab.efsp.ecfcodes.tyler.CaseType;
import edu.suffolk.litlab.efsp.ecfcodes.tyler.DocumentTypeTableRow;
import edu.suffolk.litlab.efsp.ecfcodes.tyler.FileType;
import edu.suffolk.litlab.efsp.ecfcodes.tyler.FilerType;
import edu.suffolk.litlab.efsp.ecfcodes.tyler.FilingCode;
import edu.suffolk.litlab.efsp.ecfcodes.tyler.FilingComponent;
import edu.suffolk.litlab.efsp.ecfcodes.tyler.NameAndCode;
import edu.suffolk.litlab.efsp.model.FilingAction;
import edu.suffolk.litlab.efsp.model.FilingDoc;
import edu.suffolk.litlab.efsp.model.OptionalService;
import edu.suffolk.litlab.efsp.model.PartyId;
import edu.suffolk.litlab.efsp.model.PartyInfo;
import edu.suffolk.litlab.efsp.model.Person;
import edu.suffolk.litlab.efsp.model.Person.Gender;
import edu.suffolk.litlab.efsp.tyler.ecfcodes.CaseCategory;
import edu.suffolk.litlab.efsp.tyler.ecfcodes.CaseType;
import edu.suffolk.litlab.efsp.tyler.ecfcodes.DocumentTypeTableRow;
import edu.suffolk.litlab.efsp.tyler.ecfcodes.FileType;
import edu.suffolk.litlab.efsp.tyler.ecfcodes.FilerType;
import edu.suffolk.litlab.efsp.tyler.ecfcodes.FilingCode;
import edu.suffolk.litlab.efsp.tyler.ecfcodes.FilingComponent;
import edu.suffolk.litlab.efsp.utils.FilingError;
import java.math.BigDecimal;
import java.time.LocalDate;
Expand All @@ -28,6 +27,12 @@
import java.util.Set;
import java.util.regex.Pattern;

/**
* Given the strings from an input case, 'parses' them (i.e. checks, confirms, and converts them
* into slightly more strict types).
*
* <p>TODO(brycew): still needs to remove the tyler specific codes from this API
*/
public interface CodesParser extends AutoCloseable {
// Types specifically for errors.
// spotless:off
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package edu.suffolk.litlab.efsp.ecfcodes.tyler;
package edu.suffolk.litlab.efsp.ecfcodes;

import org.apache.commons.lang3.builder.HashCodeBuilder;

Expand Down
Loading
Loading