class DicomConnection {
private final Device device = new Device("tvs");
private final ApplicationEntity ae = new ApplicationEntity("TVS");
private final Connection conn = new Connection();
private final Connection remote = new Connection();
private final AAssociateRQ rq = new AAssociateRQ();
private Attributes keys = new Attributes();
private Association as;
private OutputStream out = null;//System.out;
public DicomConnection() {
device.addConnection(conn);
device.addApplicationEntity(ae);
ae.addConnection(conn);
}
public void configureConnect(String aet, String host, int port) {
//CLIUtils.configureConnect(main.remote, main.rq, cl);
rq.setCalledAET(aet);
remote.setHostname(host);
remote.setPort(port);
}
public void configureBind(String aet, String host, int port) {
//CLIUtils.configureBind(main.conn,
main.ae, cl);
ae.setAETitle(aet);
conn.setHostname(host);
conn.setPort(port);
}
public void configure() {
//CLIUtils.configure(main.conn, cl);
//..
remote.setTlsProtocols(conn.getTlsProtocols());
remote.setTlsCipherSuites(conn.getTlsCipherSuites());
//configureServiceClass(main, cl);
String cuid = UID.StudyRootQueryRetrieveInformationModelFIND; // InformationModel.StudyRoot
String[] tss = {UID.ImplicitVRLittleEndian, UID.ExplicitVRLittleEndian, UID.ExplicitVRBigEndian }; //IVR_LE_FIRST
rq.addPresentationContext(new PresentationContext(1, cuid, tss));
}
public void query(String level, String patientId) {
// search query
keys.setString(Tag.QueryRetrieveLevel, VR.CS, level);
keys.setString(Tag.PatientID, VR.LO, patientId);
// tags to return
keys.setString(Tag.PatientID, VR.LO);
keys.setString(Tag.PatientName,
VR.PN);
keys.setString(Tag.StudyDate, VR.DA);
keys.setString(Tag.StudyTime,
VR.TM);
keys.setString(Tag.StudyInstanceUID, VR.UI);
keys.setString(Tag.StudyID, VR.SH);
keys.setString(Tag.SeriesDate, VR.DA);
keys.setString(Tag.SeriesTime,
VR.TM);
keys.setString(Tag.SeriesDescription,
VR.PN);
keys.setString(Tag.SeriesInstanceUID, VR.UI);
}
public void request(String level, String patientId) {
keys.setString(Tag.QueryRetrieveLevel, VR.CS, level);
keys.setString(Tag.PatientID, VR.LO, patientId);
}
public void go() {
ExecutorService executorService = Executors.newSingleThreadExecutor();
ScheduledExecutorService scheduledExecutorService = Executors.newSingleThreadScheduledExecutor();
device.setExecutor(executorService);
device.setScheduledExecutor(scheduledExecutorService);
try {
open();
handle();
}
catch(Exception ex) {
String str = ex.toString();
}
finally {
try { close(); }
catch(Exception ex) {}
executorService.shutdown();
scheduledExecutorService.shutdown();
}
}
public void open() throws IOException, InterruptedException, IncompatibleConnectionException, GeneralSecurityException {
as = ae.connect(conn, remote, rq);
}
public void close() throws IOException, InterruptedException {
if (as != null && as.isReadyForDataTransfer()) {
as.waitForOutstandingRSP();
as.release();
}
SafeClose.close(out);
out = null;
}
private void handle() throws IOException, InterruptedException {
DimseRSPHandler rspHandler = new DimseRSPHandler(as.nextMessageID()) {
public void onDimseRSP(Association as, Attributes cmd, Attributes data) {
super.onDimseRSP(as, cmd, data);
int status = cmd.getInt(Tag.Status, -1);
if (Status.isPending(status)) {
onResult(data);
}
}
};
String cuid = UID.StudyRootQueryRetrieveInformationModelFIND;
int priority = Priority.NORMAL;
//as.cecho();
as.cfind(cuid, priority, keys, null, rspHandler);
}
private void writeln(String name, int tag, Attributes data) throws IOException {
if(data.contains(tag)) {
String str = data.getString(tag);
out.write((name+": "+str+"\\n").getBytes());
}
}
private void onResult(Attributes data) {
try {
if (out == null) {
File f = new File("C:\\tvs.out.txt");
out = new BufferedOutputStream(new FileOutputStream(f));
}
out.write("== Dicom Result ==\\n".getBytes());
writeln("PatientID", Tag.PatientID, data);
writeln("PatientName", Tag.PatientName, data);
writeln("StudyDate", Tag.StudyDate, data);
writeln("StudyTime", Tag.StudyTime, data);
writeln("StudyInstanceUID", Tag.StudyInstanceUID, data);
writeln("StudyID", Tag.StudyID, data);
writeln("SeriesDate", Tag.SeriesDate, data);
writeln("SeriesTime", Tag.SeriesTime, data);
writeln("SeriesDescription", Tag.SeriesDescription, data);
writeln("SeriesInstanceUID", Tag.SeriesInstanceUID, data);
out.flush();
}
catch (Exception e) {
e.printStackTrace();
SafeClose.close(out);
out = null;
}
}
}
public void dicomQuery() {
// findscu -b JONASPC@localhost:5678 -c MOP...@xxx.xxx.xxx.xxx:4000 -m PatientID=yyyy -L STUDY -r PatientName
DicomConnection main = new DicomConnection();
main.configureConnect("MOP_SCP", "xxx.xxx.xxx.xxx", 4000); // "-c" options
main.configureBind("JONASPC", "localhost", 5678); // "-b" options
main.configure();
main.query("STUDY", "yyyy"); // "-m" options (search query)
main.go();
}