Package com.pixelmed.apps

# Class StudyReceiver

java.lang.Object
com.pixelmed.apps.StudyReceiver

public class StudyReceiver extends Object

A class to wait for incoming composite instance storage operations and process when study is complete based on time since last instance received.

External (unsecure) SQL access to the database is possible if the Application.DatabaseServerName property is specified; further details are described in `com.pixelmed.database.DatabaseInformationModel`; for example:

    % java -cp lib/additional/hsqldb.jar org.hsqldb.util.DatabaseManagerSwing --url "jdbc:hsqldb:hsql://localhost/testserverdb"

For how to configure the necessary properties file, see:

See Also:
  - `NetworkApplicationProperties`
  - `DatabaseApplicationProperties`

## Nested Class Summary

Nested Classes
Modifier and Type
Class
Description
`protected class`
`StudyReceiver.OurPatientStudySeriesInstanceModel`
`protected static class`
`StudyReceiver.OurReadTerminationStrategy`
`protected class`
`StudyReceiver.OurReceivedObjectHandler`
`protected class`
`StudyReceiver.ReceivedFileProcessor`
`protected class`
`StudyReceiver.WatchDatabaseAndProcessCompleteStudies`

## Field Summary

Fields
Modifier and Type
Field
Description
`protected String`
`buildDate`
`protected File`
`completedStudiesFolder`
`protected DatabaseInformationModel`
`databaseInformationModel`
`protected String`
`defaultCompletedStudiesFolderName`
`protected String`
`defaultIntervalAfterLastInstanceReceivedToWaitBeforeProcessingStudy`
`protected static String`
`defaultPropertiesFileName`
`protected String`
`defaultSleepTimeBetweenPassesToProcessReceivedFiles`
`protected String`
`instanceHasBeenProcessedColumnName`
`protected String`
`instanceLocalFileNameColumnName`
`protected String`
`instanceLocalFileReferenceTypeColumnName`
`protected String`
`instanceLocalPrimaryKeyColumnName`
`protected static int`
`intervalAfterLastInstanceReceivedToWaitBeforeProcessingStudy`
`protected NetworkApplicationInformationFederated`
`networkApplicationInformation`
`protected NetworkApplicationProperties`
`networkApplicationProperties`
`protected String`
`ourCalledAETitle`
`protected Properties`
`properties`
`protected static String`
`propertyName_CompletedStudiesFolderName`
`protected static String`
`propertyName_IntervalAfterLastInstanceReceivedToWaitBeforeProcessingStudy`
`protected static String`
`propertyName_SleepTimeBetweenPassesToProcessReceivedFiles`
`protected File`
`savedImagesFolder`
`protected String`
`seriesLocalPrimaryKeyColumnName`
`protected static int`
`sleepTimeBetweenPassesToProcessReceivedFiles`
`protected String`
`sopClassUIDColumnName`
`protected StoredFilePathStrategy`
`storedFilePathStrategy`
`protected String`
`studyHasBeenProcessedColumnName`
`protected String`
`studyInstanceUIDColumnName`
`protected String`
`studyMostRecentInsertionTimeColumnName`
`protected static final AttributeList.ReadTerminationStrategy`
`terminateAfterRelationshipGroup`

## Constructor Summary

Constructors
Constructor
Description
`StudyReceiver(String propertiesFileName)`
Wait for incoming composite instance storage operations and process when study is complete based on time since last instance received.

## Method Summary

Modifier and Type
Method
Description
`void`
`activateStorageSCP()`
Start or restart DICOM storage listener.
`protected void`
`doSomethingWithProcessedDicomFile(String processedFileName)`
Do something with the processed DICOM file.
`protected void`
`doSomethingWithReceivedDicomFile(String receivedFileName, String sourceApplicationEntityTitle, String transferSyntaxUID, String sopClassUID)`
Do something with the received DICOM file.
`protected String`
`getBuildDate()`
Get the date the package was built.
`protected File`
`getCompletedStudiesFolderNameCreatingItIfNecessary(String completedStudiesFolderName)`
Return the folder, creating it if necessary.
`protected void`
`loadProperties(String propertiesFileName)`
Load properties.
`static void`
`main(String[] arg)`
Wait for incoming composite instance storage operations and process when study is complete based on time since last instance received.
`protected boolean`
`processStudy(String studyLocalPrimaryKeyValue)`
`protected boolean`
`processStudyIfComplete(String studyLocalPrimaryKeyValue)`
`protected String`
`renameFileWithHierarchicalPathFromAttributes(File file, AttributeList list, String hierarchicalFolderName, String duplicatesFolderNamePrefix)`
Rename a DICOM file into a folder hierarchy based on its attributes that are already available.
`void`
`shutdownStorageSCP()`
Shutdown DICOM storage listener.
`protected void`
`updateStudyMostRecentInsertionTime(String studyInstanceUID, long insertionTime)`

### Methods inherited from class java.lang.Object

`clone, equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

## Field Details

### defaultPropertiesFileName

protected static String defaultPropertiesFileName

### propertyName_CompletedStudiesFolderName

protected static String propertyName_CompletedStudiesFolderName

### propertyName_SleepTimeBetweenPassesToProcessReceivedFiles

protected static String propertyName_SleepTimeBetweenPassesToProcessReceivedFiles

### propertyName_IntervalAfterLastInstanceReceivedToWaitBeforeProcessingStudy

protected static String propertyName_IntervalAfterLastInstanceReceivedToWaitBeforeProcessingStudy

### defaultCompletedStudiesFolderName

protected String defaultCompletedStudiesFolderName

### defaultSleepTimeBetweenPassesToProcessReceivedFiles

protected String defaultSleepTimeBetweenPassesToProcessReceivedFiles

### defaultIntervalAfterLastInstanceReceivedToWaitBeforeProcessingStudy

protected String defaultIntervalAfterLastInstanceReceivedToWaitBeforeProcessingStudy

### sleepTimeBetweenPassesToProcessReceivedFiles

protected static int sleepTimeBetweenPassesToProcessReceivedFiles

### intervalAfterLastInstanceReceivedToWaitBeforeProcessingStudy

protected static int intervalAfterLastInstanceReceivedToWaitBeforeProcessingStudy

### properties

protected Properties properties

### networkApplicationProperties

protected NetworkApplicationProperties networkApplicationProperties

### networkApplicationInformation

protected NetworkApplicationInformationFederated networkApplicationInformation

### ourCalledAETitle

protected String ourCalledAETitle

### databaseInformationModel

protected DatabaseInformationModel databaseInformationModel

### buildDate

protected String buildDate

### completedStudiesFolder

protected File completedStudiesFolder

### savedImagesFolder

protected File savedImagesFolder

### storedFilePathStrategy

protected StoredFilePathStrategy storedFilePathStrategy

### studyHasBeenProcessedColumnName

protected String studyHasBeenProcessedColumnName

### studyMostRecentInsertionTimeColumnName

protected String studyMostRecentInsertionTimeColumnName

### instanceHasBeenProcessedColumnName

protected String instanceHasBeenProcessedColumnName

### studyInstanceUIDColumnName

protected String studyInstanceUIDColumnName

### sopClassUIDColumnName

protected String sopClassUIDColumnName

### instanceLocalFileNameColumnName

protected String instanceLocalFileNameColumnName

### instanceLocalFileReferenceTypeColumnName

protected String instanceLocalFileReferenceTypeColumnName

### instanceLocalPrimaryKeyColumnName

protected String instanceLocalPrimaryKeyColumnName

### seriesLocalPrimaryKeyColumnName

protected String seriesLocalPrimaryKeyColumnName

### terminateAfterRelationshipGroup

protected static final AttributeList.ReadTerminationStrategy terminateAfterRelationshipGroup

## Constructor Details

### StudyReceiver

public StudyReceiver(String propertiesFileName) throws DicomException, DicomNetworkException, IOException, InterruptedException

Wait for incoming composite instance storage operations and process when study is complete based on time since last instance received.

Parameters:
  `propertiesFileName` -
Throws:
  `DicomException`
  `DicomNetworkException`
  `IOException`
  `InterruptedException`

## Method Details

### getBuildDate

protected String getBuildDate()

Get the date the package was built.

Returns:
  the build date

### loadProperties

protected void loadProperties(String propertiesFileName) throws IOException

Load properties.

Throws:
  `IOException` - thrown if properties file is missing

### renameFileWithHierarchicalPathFromAttributes

protected String renameFileWithHierarchicalPathFromAttributes(File file, AttributeList list, String hierarchicalFolderName, String duplicatesFolderNamePrefix) throws IOException, DicomException, NoSuchAlgorithmException

Rename a DICOM file into a folder hierarchy based on its attributes that are already available.

Called by `processStudy()` for each file that has been received for a completed study.

Override this method in a sub-class if you want to override the default folder structure used to store the received files, otherwise creates a folder structure using `com.pixelmed.dicom.MoveDicomFilesIntoHierarchy.renameFileWithHierarchicalPathFromAttributes()`.

Parameters:
  `file` - the DICOM file
  `list` - the attributes of the file (already read in)
  `hierarchicalFolderName` - where to store the renamed file
  `duplicatesFolderNamePrefix` - where to store the renamed file if it is a non-identical duplicate of the existing file
Returns:
  the path to the new file if successful, null if not
Throws:
  `IOException` - if an error occurs renaming the files
  `DicomException` - if there is an error parsing the attribute list
  `NoSuchAlgorithmException` - if there is an error checking duplicate files contain identical content caused by absence of a hash algorithm

### doSomethingWithProcessedDicomFile

protected void doSomethingWithProcessedDicomFile(String processedFileName)

Do something with the processed DICOM file.

This method may be implemented in a sub-class to do something useful even if it is only logging to the user interface.

The default method does nothing.

This method is called on the WatchDatabaseAndProcessCompleteStudies thread.

This method does not define any exceptions and hence must handle any errors locally.

Parameters:
  `processedFileName` - the path name to a DICOM file

### processStudy

protected boolean processStudy(String studyLocalPrimaryKeyValue) throws DicomException, IOException, Exception

Throws:
  `DicomException`
  `IOException`
  `Exception`

### processStudyIfComplete

protected boolean processStudyIfComplete(String studyLocalPrimaryKeyValue) throws DicomException, IOException, Exception

Throws:
  `DicomException`
  `IOException`
  `Exception`

### updateStudyMostRecentInsertionTime

protected void updateStudyMostRecentInsertionTime(String studyInstanceUID, long insertionTime) throws DicomException

Throws:
  `DicomException`

### doSomethingWithReceivedDicomFile

protected void doSomethingWithReceivedDicomFile(String receivedFileName, String sourceApplicationEntityTitle, String transferSyntaxUID, String sopClassUID)

Do something with the received DICOM file.

This method may be implemented in a sub-class to do something useful even if it is only logging to the user interface.

The default method does nothing.

This method is called on the ReceivedFileProcessor thread.

This method does not define any exceptions and hence must handle any errors locally.

Parameters:
  `receivedFileName` - the path name to a DICOM file
  `sourceApplicationEntityTitle` - the Application Entity from which the file was received
  `transferSyntaxUID` - the Transfer Syntax of the Data Set in the DICOM file
  `sopClassUID` - the SOP Class of the Data Set in the DICOM file

### getCompletedStudiesFolderNameCreatingItIfNecessary

protected File getCompletedStudiesFolderNameCreatingItIfNecessary(String completedStudiesFolderName) throws IOException

Return the folder, creating it if necessary.

If not an absolute path, will be sought or created relative to the current user's home directory.

Returns:
  the folder
Throws:
  `IOException`

### activateStorageSCP

public void activateStorageSCP() throws DicomException, IOException

Start or restart DICOM storage listener.

Shuts down existing listener, if any, so may be used to restart after configuration change.

Throws:
  `DicomException`
  `IOException`

### shutdownStorageSCP

public void shutdownStorageSCP()

Shutdown DICOM storage listener.

### main

public static void main(String[] arg)

Wait for incoming composite instance storage operations and process when study is complete based on time since last instance received.

Parameters:
  `arg` - none