package jnpf.limsService.provider; import jnpf.exception.DataException; import org.springframework.dao.DuplicateKeyException; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowMapper; import org.springframework.jdbc.datasource.DataSourceTransactionManager; import org.springframework.transaction.support.TransactionTemplate; import javax.sql.DataSource; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; public class JdbcLimsElnSourceStore implements LimsElnSourceCatalog.Store { private static final String VERSION_COLUMNS = "f_id, f_tenant_id, property_code, revision, status, " + "display_name, data_type, definition_json, frozen_definition_json, validation_sample_id, " + "published_by, published_at, edit_version"; private static final RowMapper VERSION = (row, index) -> new LimsElnSourceCatalog.Version(row.getString("f_id"), row.getString("f_tenant_id"), row.getString("property_code"), row.getInt("revision"), row.getString("status"), row.getString("display_name"), row.getString("data_type"), row.getString("definition_json"), row.getString("frozen_definition_json"), row.getString("validation_sample_id"), row.getString("published_by"), row.getString("published_at"), row.getInt("edit_version")); private final JdbcTemplate jdbc; private final TransactionTemplate transactions; public JdbcLimsElnSourceStore(DataSource dataSource) { jdbc = new JdbcTemplate(dataSource); jdbc.setQueryTimeout(5); transactions = new TransactionTemplate(new DataSourceTransactionManager(dataSource)); } @Override public void insert(LimsElnSourceCatalog.Version version) { try { transactions.execute(status -> { if (version.getRevision() == 1) { jdbc.update("INSERT INTO lims_eln_provider_property (f_tenant_id, property_code) VALUES (?, ?)", version.getTenantId(), version.getPropertyCode()); } jdbc.update("INSERT INTO lims_eln_provider_property_version (" + VERSION_COLUMNS + ") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", version.getId(), version.getTenantId(), version.getPropertyCode(), version.getRevision(), version.getStatus(), version.getDisplayName(), version.getDataType(), version.getDefinitionJson(), version.getFrozenDefinitionJson(), version.getValidationSampleId(), version.getPublishedBy(), version.getPublishedAt(), version.getEditVersion()); return null; }); } catch (DuplicateKeyException e) { throw new DataException("Source identity or draft version already exists"); } } @Override public LimsElnSourceCatalog.Version find(String tenantId, String id) { List versions = jdbc.query("SELECT " + VERSION_COLUMNS + " FROM lims_eln_provider_property_version WHERE f_tenant_id = ? AND f_id = ?", VERSION, tenantId, id); return versions.isEmpty() ? null : versions.get(0); } @Override public List list(String tenantId) { return jdbc.query("SELECT " + VERSION_COLUMNS + " FROM lims_eln_provider_property_version WHERE f_tenant_id = ? ORDER BY property_code, revision", VERSION, tenantId); } @Override public boolean replaceDraft(LimsElnSourceCatalog.Version expected, LimsElnSourceCatalog.Version replacement) { return jdbc.update("UPDATE lims_eln_provider_property_version SET status = ?, display_name = ?, " + "data_type = ?, definition_json = ?, frozen_definition_json = ?, validation_sample_id = ?, " + "published_by = ?, published_at = ?, edit_version = ? " + "WHERE f_id = ? AND f_tenant_id = ? AND property_code = ? AND revision = ? " + "AND status = 'DRAFT' AND edit_version = ?", replacement.getStatus(), replacement.getDisplayName(), replacement.getDataType(), replacement.getDefinitionJson(), replacement.getFrozenDefinitionJson(), replacement.getValidationSampleId(), replacement.getPublishedBy(), replacement.getPublishedAt(), replacement.getEditVersion(), expected.getId(), expected.getTenantId(), expected.getPropertyCode(), expected.getRevision(), expected.getEditVersion()) == 1; } @Override public boolean enabled(String tenantId, String code) { List result = jdbc.query("SELECT biz_enabled FROM lims_eln_provider_property " + "WHERE f_tenant_id = ? AND property_code = ?", (row, index) -> row.getBoolean(1), tenantId, code); return result.size() == 1 && result.get(0); } @Override public Map enabledStates(String tenantId) { Map result = new LinkedHashMap<>(); jdbc.query("SELECT property_code, biz_enabled FROM lims_eln_provider_property WHERE f_tenant_id = ?", (org.springframework.jdbc.core.RowCallbackHandler) row -> result.put(row.getString(1), row.getBoolean(2)), tenantId); return result; } @Override public void setEnabled(String tenantId, String code, boolean enabled) { if (jdbc.update("UPDATE lims_eln_provider_property SET biz_enabled = ? " + "WHERE f_tenant_id = ? AND property_code = ?", enabled, tenantId, code) != 1) { throw new DataException("Source property not found"); } } }