LT-67; OHIF-78: Merging server configuration and CINE dialog changes from downstream (Ascend)

This commit is contained in:
Bruno Alves de Faria committed 2016-09-29 12:25:04 -03:00
1 parent da7202de0f
commit 8d5d1ee360
47 files changed
+516 -333

No files matched your search

@@ -6,16 +6,17 @@ Meteor.methods({
GetStudyMetadata: function(studyInstanceUid) {
log.info('GetStudyMetadata(%s)', studyInstanceUid);
if (!Meteor.settings.servers.dicomWeb) {
throw 'No properly configured server was available over DICOMWeb';
// Get the server data. This is user-defined in the config.json files or through servers
// configuration modal
const server = getCurrentServer();
if (!server) {
throw 'No properly configured server was available over DICOMWeb or DIMSE.';
}
if (Meteor.settings.servers.dicomWeb && Meteor.settings.defaultServiceType === 'dicomWeb') {
// Get the server data. This is user-defined in the
// config.json files used to run the Meteor server
var server = Meteor.settings.servers.dicomWeb[0];
if (server.type === 'dicomWeb') {
return Services.WADO.RetrieveMetadata(server, studyInstanceUid);
} else if (Meteor.settings.servers.dimse && Meteor.settings.defaultServiceType === 'dimse') {
} else if (server.type === 'dimse') {
return Services.DIMSE.RetrieveMetadata(studyInstanceUid);
}
}
@@ -39,7 +39,8 @@ Meteor.methods({
* @returns {boolean}
*/
importSupported: function() {
if (Meteor.settings.servers.dimse && Meteor.settings.defaultServiceType === 'dimse') {
const server = getCurrentServer();
if (server && server.type === 'dimse') {
return true;
}
},
@@ -53,13 +54,17 @@ Meteor.methods({
return;
}
if (Meteor.settings.servers.dicomWeb && Meteor.settings.defaultServiceType === 'dicomWeb') {
const server = getCurrentServer();
if (!server) {
throw 'No properly configured server was available over DICOMWeb or DIMSE.';
}
if (server.type === 'dicomWeb') {
//TODO: Support importing studies into dicomWeb
console.log('Importing studies into dicomWeb is currently not supported.');
} else if (Meteor.settings.servers.dimse && Meteor.settings.defaultServiceType === 'dimse') {
} else if (server.type === 'dimse') {
importStudiesDIMSE(studiesToImport, studyImportStatusId);
} else {
throw 'No properly configured server was available over DICOMWeb or DIMSE.';
}
},
/**
@@ -1,19 +1,22 @@
Meteor.methods({
/**
* Use the specified filter to conduct a search from the DICOM server
*
* @param filter
*/
WorklistSearch: function(filter) {
if (Meteor.settings.servers.dicomWeb && Meteor.settings.defaultServiceType === 'dicomWeb') {
// Get the server data. This is user-defined in the
// config.json files used to run the Meteor server
var server = Meteor.settings.servers.dicomWeb[0];
WorklistSearch(filter) {
// Get the server data. This is user-defined in the config.json files or through servers
// configuration modal
const server = getCurrentServer();
return Services.QIDO.Studies(server, filter);
} else if (Meteor.settings.servers.dimse && Meteor.settings.defaultServiceType === 'dimse') {
return Services.DIMSE.Studies(filter);
} else {
if (!server) {
throw 'No properly configured server was available over DICOMWeb or DIMSE.';
}
if (server.type === 'dicomWeb') {
return Services.QIDO.Studies(server, filter);
} else if (server.type === 'dimse') {
return Services.DIMSE.Studies(filter);
}
}
});
+9 -1
View File
@@ -1,3 +1,11 @@
Meteor.publish('studyImportStatus', () => {
return StudyImportStatus.find();
});
});
Meteor.publish('servers', () => {
return Servers.find();
});
Meteor.publish('currentServer', () => {
return CurrentServer.find();
});
+92
View File
@@ -0,0 +1,92 @@
import { Meteor } from 'meteor/meteor';
Meteor.startup(function() {
Servers.remove({
origin: 'json'
});
_.each(Meteor.settings.servers, function(endpoints, serverType) {
_.each(endpoints, function(endpoint) {
var server = _.clone(endpoint);
server.origin = 'json';
server.type = serverType;
Servers.insert(server);
});
});
ServersControl.resetCurrentServer();
});
class ServersControl {
static writeCallback(error, affected) {
if (error) {
throw new Meteor.Error('data-write', error);
}
}
static resetCurrentServer() {
const currentServer = CurrentServer.findOne();
if (currentServer && Servers.find({ _id: currentServer.serverId }).count()) {
return;
}
const newServer = Servers.findOne({
origin: 'json',
type: Meteor.settings.defaultServiceType || 'dicomWeb'
});
if (newServer) {
CurrentServer.remove({});
CurrentServer.insert({
serverId: newServer._id
});
}
}
static find(query) {
return Servers.find(query).fetch();
}
static save(serverSettings) {
const query = {
_id: serverSettings._id
};
const options = {
upsert: true
};
if (!serverSettings._id) {
delete serverSettings._id;
}
return Servers.update(query, serverSettings, options, this.writeCallback);
}
static setActive(serverId) {
CurrentServer.remove({});
CurrentServer.insert({
serverId: serverId
});
}
static remove(serverId) {
var query = {
_id: serverId
};
const removeStatus = Servers.remove(query, this.writeCallback);
ServersControl.resetCurrentServer();
return removeStatus;
}
}
Meteor.methods({
serverFind: query => ServersControl.find(query),
serverSave: serverSettings => ServersControl.save(serverSettings),
serverSetActive: serverId => ServersControl.setActive(serverId),
serverRemove: serverId => ServersControl.remove(serverId)
});
@@ -1,68 +1,66 @@
/**
* Parses data returned from a study search and transforms it into
* an array of series that are present in the study
*
* @param resultData
* @returns {Array} Series List
*/
function resultDataToStudyMetadata(resultData) {
var seriesMap = {};
var seriesList = [];
resultData.forEach(function(instanceRaw) {
var instance = instanceRaw.toObject();
// Use seriesMap to cache series data
// If the series instance UID has already been used to
// process series data, continue using that series
var seriesInstanceUid = instance[0x0020000E];
var series = seriesMap[seriesInstanceUid];
// If no series data exists in the seriesMap cache variable,
// process any available series data
if (!series) {
series = {
seriesInstanceUid: seriesInstanceUid,
seriesNumber: instance[0x00200011],
instances: []
};
// Save this data in the seriesMap cache variable
seriesMap[seriesInstanceUid] = series;
seriesList.push(series);
}
// TODO: [custom-servers] Check which peer it should point to
var server = Meteor.settings.servers.dimse[0].peers[0];
var host = Meteor.settings.servers.dimse.host,
port = Meteor.settings.servers.dimse.port;
var serverRoot = host + ':' + port;
var sopInstanceUid = instance[0x00080018];
var uri = serverRoot + '/studies/' + studyInstanceUid + '/series/' + seriesInstanceUid + '/instances/' + sopInstanceUid + '/frames/1';
// Add this instance to the current series
series.instances.push({
sopClassUid: instance[0x00080016],
sopInstanceUid: sopInstanceUid,
uri: uri,
instanceNumber: instance[0x00200013]
});
});
return seriesList;
}
/**
* Retrieve a set of instances using a DIMSE call
* @param studyInstanceUid
* @returns {{wadoUriRoot: String, studyInstanceUid: String, seriesList: Array}}
*/
Services.DIMSE.Instances = function(studyInstanceUid) {
//var url = buildUrl(server, studyInstanceUid);
var result = DIMSE.retrieveInstances(studyInstanceUid);
return {
studyInstanceUid: studyInstanceUid,
seriesList: resultDataToStudyMetadata(result)
};
};
/**
* Parses data returned from a study search and transforms it into
* an array of series that are present in the study
*
* @param resultData
* @returns {Array} Series List
*/
function resultDataToStudyMetadata(resultData) {
var seriesMap = {};
var seriesList = [];
resultData.forEach(function(instanceRaw) {
var instance = instanceRaw.toObject();
// Use seriesMap to cache series data
// If the series instance UID has already been used to
// process series data, continue using that series
var seriesInstanceUid = instance[0x0020000E];
var series = seriesMap[seriesInstanceUid];
// If no series data exists in the seriesMap cache variable,
// process any available series data
if (!series) {
series = {
seriesInstanceUid: seriesInstanceUid,
seriesNumber: instance[0x00200011],
instances: []
};
// Save this data in the seriesMap cache variable
seriesMap[seriesInstanceUid] = series;
seriesList.push(series);
}
// TODO: Check which peer it should point to
var server = getCurrentServer().peers[0];
var serverRoot = server.host + ':' + server.port;
var sopInstanceUid = instance[0x00080018];
var uri = serverRoot + '/studies/' + studyInstanceUid + '/series/' + seriesInstanceUid + '/instances/' + sopInstanceUid + '/frames/1';
// Add this instance to the current series
series.instances.push({
sopClassUid: instance[0x00080016],
sopInstanceUid: sopInstanceUid,
uri: uri,
instanceNumber: instance[0x00200013]
});
});
return seriesList;
}
/**
* Retrieve a set of instances using a DIMSE call
* @param studyInstanceUid
* @returns {{wadoUriRoot: String, studyInstanceUid: String, seriesList: Array}}
*/
Services.DIMSE.Instances = function(studyInstanceUid) {
//var url = buildUrl(server, studyInstanceUid);
var result = DIMSE.retrieveInstances(studyInstanceUid);
return {
studyInstanceUid: studyInstanceUid,
seriesList: resultDataToStudyMetadata(result)
};
};
@@ -110,8 +110,8 @@ function resultDataToStudyMetadata(studyInstanceUid, resultData) {
};
// Retrieve the actual data over WADO-URI
var server = Meteor.settings.servers.dicomWeb[0];
instanceSummary.wadouri = WADOProxy.convertURL(server.wadoUriRoot + '?requestType=WADO&studyUID=' + studyInstanceUid + '&seriesUID=' + seriesInstanceUid + '&objectUID=' + sopInstanceUid + "&contentType=application%2Fdicom", server.requestOptions);
var server = getCurrentServer();
instanceSummary.wadouri = WADOProxy.convertURL(server.wadoUriRoot + '?requestType=WADO&studyUID=' + studyInstanceUid + '&seriesUID=' + seriesInstanceUid + '&objectUID=' + sopInstanceUid + '&contentType=application%2Fdicom', server.requestOptions);
series.instances.push(instanceSummary);
});
@@ -127,8 +127,8 @@ function resultDataToStudyMetadata(studyInstanceUid, resultData) {
* @returns {{seriesList: Array, patientName: *, patientId: *, accessionNumber: *, studyDate: *, modalities: *, studyDescription: *, imageCount: *, studyInstanceUid: *}}
*/
Services.DIMSE.RetrieveMetadata = function(studyInstanceUid) {
// TODO: Find active server
const activeServer = Meteor.settings.servers.dimse[0].peers[0];
// TODO: Check which peer it should point to
const activeServer = getCurrentServer().peers[0];
const supportsInstanceRetrievalByStudyUid = activeServer.supportsInstanceRetrievalByStudyUid;
let results;
@@ -0,0 +1,38 @@
import { Meteor } from 'meteor/meteor';
const setupDIMSE = () => {
// Terminate existing DIMSE servers and sockets and clean up the connection object
DIMSE.connection.reset();
// Get the new server configuration
const server = getCurrentServer();
// Stop here if the new server is not of DIMSE type
if (server.type !== 'dimse') {
return;
}
// Check if peers were defined in the server configuration and throw an error if not
const peers = server.peers;
if (!peers || !peers.length) {
console.error('dimse-config: ' + 'No DIMSE Peers provided.');
throw new Meteor.Error('dimse-config', 'No DIMSE Peers provided.');
}
// Add all the DIMSE peers, establishing the connections
console.log('Adding DIMSE peers');
try {
peers.forEach(peer => DIMSE.connection.addPeer(peer));
} catch(error) {
console.error('dimse-addPeers: ' + error);
throw new Meteor.Error('dimse-addPeers', error);
}
};
// Setup the DIMSE connections on startup or when the current server is changed
Meteor.startup(() => {
CurrentServer.find().observe({
added: setupDIMSE,
changed: setupDIMSE
});
});