package ch.elexis.icpc.coding;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Optional;
import org.osgi.service.component.annotations.Component;
import ch.elexis.core.findings.ICoding;
import ch.elexis.core.findings.codes.CodingSystem;
import ch.elexis.core.findings.codes.ICodingContribution;
import ch.elexis.core.findings.util.model.TransientCoding;
import ch.elexis.data.PersistentObject;
import ch.rgw.tools.JdbcLink.Stm;
@Component
public class DatabaseICPCCodingContribution implements ICodingContribution {
private HashMap<String, ICoding> codesMap;
@Override
public String getCodeSystem(){
return CodingSystem.ICPC2_CODESYSTEM.getSystem();
}
@Override
public Optional<ICoding> getCode(String code){
if (codesMap == null && isPresent()) {
initialize();
}
return Optional.ofNullable(codesMap.get(code));
}
@Override
public synchronized List<ICoding> getCodes(){
if (isPresent()) {
if (codesMap == null) {
initialize();
}
return new ArrayList<>(codesMap.values());
}
return Collections.emptyList();
}
private boolean isPresent(){
if (PersistentObject.getDefaultConnection() != null) {
return PersistentObject.tableExists("ICD10");
}
return true;
}
private void initialize(){
codesMap = new HashMap<>();
Stm statement = PersistentObject.getDefaultConnection().getStatement();
try {
ResultSet result = statement
.query("SELECT ID, short FROM ch_elexis_icpc WHERE ID <> 1 AND short IS NOT NULL");
while (result.next()) {
String code = result.getString(1);
String text = result.getString(2);
codesMap.put(code,
new TransientCoding(CodingSystem.ICPC2_CODESYSTEM.getSystem(), code, text));
}
result.close();
} catch (SQLException e) {
// ignore
} finally {
PersistentObject.getDefaultConnection().releaseStatement(statement);
}
}
}