/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is part of dcm4che, an implementation of DICOM(TM) in
* Java(TM), hosted at https://github.com/gunterze/dcm4che.
*
* The Initial Developer of the Original Code is
* Agfa Healthcare.
* Portions created by the Initial Developer are Copyright (C) 2011
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* See @authors listed below
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
package org.dcm4chee.archive.conf;
import org.dcm4che3.conf.api.extensions.ReconfiguringIterator;
import org.dcm4che3.conf.core.api.ConfigurableClass;
import org.dcm4che3.conf.core.api.ConfigurableProperty;
import org.dcm4che3.conf.core.api.ConfigurableProperty.ConfigurablePropertyType;
import org.dcm4che3.conf.core.api.LDAP;
import org.dcm4che3.data.Code;
import org.dcm4che3.io.TemplatesCache;
import org.dcm4che3.net.ApplicationEntity;
import org.dcm4che3.net.Device;
import org.dcm4che3.net.DeviceExtension;
import org.dcm4che3.soundex.FuzzyStr;
import org.dcm4che3.util.StringUtils;
import javax.xml.transform.Templates;
import javax.xml.transform.TransformerConfigurationException;
import java.util.*;
/**
* @author Gunter Zeilinger <gunterze@gmail.com>
*/
@LDAP(objectClasses = "dcmArchiveDevice", noContainerNode = true)
@ConfigurableClass
public class ArchiveDeviceExtension extends DeviceExtension {
private static final long serialVersionUID = -3611223780276386740L;
@ConfigurableProperty(type = ConfigurablePropertyType.OptimisticLockingHash)
private String olockHash;
@ConfigurableProperty(name = "dcmVisibleImageClasses")
private String[] visibleImageSRClasses = {};
@ConfigurableProperty(name = "dcmNonVisibleImageClasses")
private String[] nonVisibleImageSRClasses = {};
@ConfigurableProperty(name = "dcmUseWhitelistOfVisibleImageSRClasses", defaultValue = "true")
private boolean useWhitelistOfVisibleImageSRClasses;
@ConfigurableProperty(name = "dcmDisabledDecorators")
private String[] disabledDecorators = {};
@ConfigurableProperty(name = "dcmIncorrectWorklistEntrySelectedCode")
private Code incorrectWorklistEntrySelectedCode;
@ConfigurableProperty(name = "dcmFuzzyAlgorithmClass")
private String fuzzyAlgorithmClass;
@LDAP(noContainerNode = true)
@ConfigurableProperty(name = "dcmAttributeFilter")
private final Map<Entity, AttributeFilter> attributeFilters = new EnumMap<Entity, AttributeFilter>(Entity.class);
@ConfigurableProperty(name = "dcmConfigurationStaleTimeout", defaultValue = "0")
private int configurationStaleTimeout;
@ConfigurableProperty(name = "dcmWadoAttributesStaleTimeout", defaultValue = "0")
private int wadoAttributesStaleTimeout;
@ConfigurableProperty(name = "dcmHostnameAEResolution", defaultValue = "false")
private boolean hostnameAEResolution;
@ConfigurableProperty(name = "dcmDeIdentifyLogs", defaultValue = "false")
private boolean deIdentifyLogs;
@ConfigurableProperty(name = "dcmUpdateDbRetries", defaultValue = "3")
private int updateDbRetries = 3;
@ConfigurableProperty(name = "dcmUpdateDbDelay", defaultValue = "1000")
private int updateDbDelay = 1000;
@ConfigurableProperty(name = "dcmDBTimeZone")
private TimeZone dataBaseTimeZone = TimeZone.getTimeZone("GMT+00:00");
@ConfigurableProperty(name = "dcmTimeZoneSupport", defaultValue = "DISABLED")
private TimeZoneOption timeZoneSupport = TimeZoneOption.DISABLED;
@LDAP(noContainerNode = true)
@ConfigurableProperty(name = "dcmPrivateDerivedFields")
private final PrivateDerivedFields privateDerivedFields = new PrivateDerivedFields();
@LDAP(
distinguishingField = "dicomHostName",
mapValueAttribute = "dicomAETitle",
mapEntryObjectClass= "dcmHostNameAEEntry"
)
@ConfigurableProperty(name = "HostNameAETitleMap",
description = "Maps remote hostnames/IP addresses to AE titles. Used for determining the source AE within Web services (STOW/QIDO/...). \"*\" can be used for a default/fallback mapping.")
private final Map<String, String> hostNameToAETitleMap = new TreeMap<String, String>(String.CASE_INSENSITIVE_ORDER);
@LDAP(
distinguishingField = "dcmDeviceName",
mapValueAttribute = "dcmFetchPriority",
mapEntryObjectClass= "dcmExternalArchiveEntry"
)
@ConfigurableProperty(name = "ExternalArchivesMap")
private final Map<String, String> externalArchivesMap = new TreeMap<String, String>(String.CASE_INSENSITIVE_ORDER);
@LDAP(noContainerNode = true)
@ConfigurableProperty(name = "rejectionParams")
private RejectionParam[] rejectionParams = {};
@LDAP(noContainerNode = true)
@ConfigurableProperty(name = "queryRetrieveViews")
private QueryRetrieveView[] queryRetrieveViews = {};
@ConfigurableProperty(name = "dcmRejectedObjectsCleanUpPollInterval")
private int rejectedObjectsCleanUpPollInterval;
@ConfigurableProperty(name = "dcmRejectedObjectsCleanUpMaxNumberOfDeletes")
private int rejectedObjectsCleanUpMaxNumberOfDeletes;
@ConfigurableProperty(name = "dcmMppsEmulationPollInterval",
description = "Interval in seconds that should be used to poll for finished study updates (and therefore mpps emulation candidates)" +
"If set to 0, disables polling.",
defaultValue = "0")
private int mppsEmulationPollInterval;
@ConfigurableProperty(name = "dcmDeletionServicePollInterval", defaultValue = "0")
private int deletionServicePollInterval;
@ConfigurableProperty(name = "dcmArchivingSchedulerPollInterval", defaultValue = "0")
private int archivingSchedulerPollInterval;
@ConfigurableProperty(name = "dcmIocmConfig")
private IOCMConfig iocmConfig;
@ConfigurableProperty(name = "dcmSyncLocationStatusPollInterval", defaultValue = "0")
private int syncLocationStatusPollInterval;
@ConfigurableProperty(name = "dcmSyncLocationStatusCheckDelay", defaultValue = "1440")
private int syncLocationStatusCheckDelay = 1440;
@ConfigurableProperty(name = "dcmSyncLocationStatusMaxNumberPerTask", defaultValue = "1000")
private int syncLocationStatusMaxNumberPerTask = 1000;
@ConfigurableProperty(name = "dcmSyncLocationStatusStorageSystemGroupID")
private String[] syncLocationStatusStorageSystemGroupIDs;
@ConfigurableProperty(name = "dcmSyncLocationStatusVerifyArchived", defaultValue = "true")
private boolean syncLocationStatusVerifyArchived = true;
@ConfigurableProperty(name = "dcmFetchAETitle")
private String fetchAETitle = "DCM4CHEE_FETCH";
@ConfigurableProperty(name = "dcmPriorsCacheMaxResolvedPathEntries", defaultValue = "100")
private int priorsCacheMaxResolvedPathEntries = 100;
@ConfigurableProperty(name = "dcmPriorsCacheDeleteDuplicateLocationsDelay", defaultValue = "60")
private int priorsCacheDeleteDuplicateLocationsDelay = 60;
@ConfigurableProperty(name = "dcmPriorsCacheClearMaxLocationsPerDelete", defaultValue = "1000")
private int priorsCacheClearMaxLocationsPerDelete = 1000;
@ConfigurableProperty(name = "dcmUseNullForEmptyQueryFields", defaultValue = "true")
private boolean useNullForEmptyQueryFields = true;
@LDAP(noContainerNode=true)
@ConfigurableProperty(name = "dcmDeletionRules")
private final DeletionRules deletionRules = new DeletionRules();
@ConfigurableProperty(name = "dcmMaxDeleteServiceRetries", defaultValue = "0")
private int maxDeleteServiceRetries;
@ConfigurableProperty(name = "dcmDeleteServiceAllowedInterval")
private String deleteServiceAllowedInterval;
@ConfigurableProperty(name = "dcmDataVolumePerDayCalculationRange", defaultValue = "23-0")
private String dataVolumePerDayCalculationRange = "23-0";
@ConfigurableProperty(name = "dcmDataVolumePerDayAverageOnNDays", defaultValue = "1")
private int dataVolumePerDayAverageOnNDays = 1;
@LDAP(noContainerNode=true)
@ConfigurableProperty(
label = "MPPS emulation and Study update rules",
name = "dcmMPPSEmulationRules")
private final List<MPPSEmulationAndStudyUpdateRule> mppsEmulationAndStudyUpdateRules = new ArrayList<MPPSEmulationAndStudyUpdateRule>();
@ConfigurableProperty(name = "dcmIgnoreSeriesStudyMissmatchErrorsAETs",
description="List of Application Entities which will not get a C-STORE rejected, if a Series/Study mismatch is detected",
collectionOfReferences=true)
private Collection<ApplicationEntity> ignoreSeriesStudyMissmatchErrorsAETs = new ArrayList<ApplicationEntity>();
@ConfigurableProperty
private WeightWatcherConfiguration weightWatcherConfiguration = new WeightWatcherConfiguration();
private transient FuzzyStr fuzzyStr;
private transient TemplatesCache templatesCache;
public String getOlockHash() {
return olockHash;
}
public void setOlockHash(String olockHash) {
this.olockHash = olockHash;
}
public List<MPPSEmulationAndStudyUpdateRule> getMppsEmulationAndStudyUpdateRules() {
return mppsEmulationAndStudyUpdateRules;
}
private final Map<String, MPPSEmulationAndStudyUpdateRule> mppsEmulationRuleMap =
new HashMap<String, MPPSEmulationAndStudyUpdateRule>();
public void setMppsEmulationAndStudyUpdateRules(List<MPPSEmulationAndStudyUpdateRule> rules) {
// exception
if (rules == mppsEmulationAndStudyUpdateRules) return;
this.mppsEmulationAndStudyUpdateRules.clear();
this.mppsEmulationRuleMap.clear();
for (MPPSEmulationAndStudyUpdateRule rule : rules) {
addMppsEmulationRule(rule);
}
}
public MPPSEmulationAndStudyUpdateRule getMppsEmulationRule(String sourceAET) {
return mppsEmulationRuleMap.get(sourceAET) != null
? mppsEmulationRuleMap.get(sourceAET)
: (mppsEmulationRuleMap.get("*") != null ? mppsEmulationRuleMap.get("*") : null);
}
public void addMppsEmulationRule(MPPSEmulationAndStudyUpdateRule rule) {
mppsEmulationAndStudyUpdateRules.add(rule);
// populate rules by source AE for easy lookup
for (ApplicationEntity applicationEntity : rule.getSourceAEs())
mppsEmulationRuleMap.put(applicationEntity.getAETitle(), rule);
// if no AEs specified - consider it a default rule
if (rule.getSourceAEs().isEmpty())
mppsEmulationRuleMap.put("*", rule);
}
public boolean isHostnameAEResolution() {
return hostnameAEResolution;
}
public void setHostnameAEResolution(boolean hostnameAEResolution) {
this.hostnameAEResolution = hostnameAEResolution;
}
public Map<String, String> getHostNameToAETitleMap() {
return hostNameToAETitleMap;
}
public Map<String, String> getExternalArchivesMap() {
return externalArchivesMap;
}
public void setHostNameToAETitleMap(Map<String, String> hostNameToAETitleMap) {
this.hostNameToAETitleMap.clear();
if (hostNameToAETitleMap!=null)
this.hostNameToAETitleMap.putAll(hostNameToAETitleMap);
}
public void setExternalArchivesMap(Map<String, String> externalArchivesMap) {
this.externalArchivesMap.clear();
if (externalArchivesMap!=null)
this.externalArchivesMap.putAll(externalArchivesMap);
}
public TimeZoneOption getTimeZoneSupport() {
return timeZoneSupport;
}
public void setTimeZoneSupport(TimeZoneOption timeZoneSupport) {
this.timeZoneSupport = timeZoneSupport;
}
public Code getIncorrectWorklistEntrySelectedCode() {
return incorrectWorklistEntrySelectedCode;
}
public void setIncorrectWorklistEntrySelectedCode(Code code) {
this.incorrectWorklistEntrySelectedCode = code;
}
public RejectionParam[] getRejectionParams() {
return rejectionParams;
}
public void setRejectionParams(RejectionParam... rejectionParams) {
this.rejectionParams = rejectionParams;
}
public String getFuzzyAlgorithmClass() {
return fuzzyAlgorithmClass;
}
public void setFuzzyAlgorithmClass(String fuzzyAlgorithmClass) {
this.fuzzyStr = fuzzyStr(fuzzyAlgorithmClass);
this.fuzzyAlgorithmClass = fuzzyAlgorithmClass;
}
public TimeZone getDataBaseTimeZone() {
return dataBaseTimeZone;
}
public void setDataBaseTimeZone(TimeZone dataBaseTimeZone) {
this.dataBaseTimeZone = dataBaseTimeZone;
}
public boolean isDeIdentifyLogs() {
return deIdentifyLogs;
}
public void setDeIdentifyLogs(boolean deIdentifyLogs) {
this.deIdentifyLogs = deIdentifyLogs;
}
public int getUpdateDbRetries() {
return updateDbRetries;
}
public void setUpdateDbRetries(int updateDbRetries) {
this.updateDbRetries = updateDbRetries;
}
public int getUpdateDbDelay() {
return updateDbDelay;
}
public void setUpdateDbDelay(int updateDbDelay) {
this.updateDbDelay = updateDbDelay;
}
public FuzzyStr getFuzzyStr() {
if (fuzzyStr == null)
if (fuzzyAlgorithmClass == null)
throw new IllegalStateException("No Fuzzy Algorithm Class configured");
else
fuzzyStr = fuzzyStr(fuzzyAlgorithmClass);
return fuzzyStr;
}
private static FuzzyStr fuzzyStr(String s) {
try {
return (FuzzyStr) Class.forName(s).newInstance();
} catch (RuntimeException e) {
throw e;
} catch (Exception e) {
throw new IllegalArgumentException(s);
}
}
public int getConfigurationStaleTimeout() {
return configurationStaleTimeout;
}
public void setConfigurationStaleTimeout(int configurationStaleTimeout) {
this.configurationStaleTimeout = configurationStaleTimeout;
}
public int getWadoAttributesStaleTimeout() {
return wadoAttributesStaleTimeout;
}
public void setWadoAttributesStaleTimeout(int wadoAttributesStaleTimeout) {
this.wadoAttributesStaleTimeout = wadoAttributesStaleTimeout;
}
public int getRejectedObjectsCleanUpPollInterval() {
return rejectedObjectsCleanUpPollInterval;
}
public void setRejectedObjectsCleanUpPollInterval(
int rejectedObjectsCleanUpPollInterval) {
this.rejectedObjectsCleanUpPollInterval = rejectedObjectsCleanUpPollInterval;
}
public int getRejectedObjectsCleanUpMaxNumberOfDeletes() {
return rejectedObjectsCleanUpMaxNumberOfDeletes;
}
public void setRejectedObjectsCleanUpMaxNumberOfDeletes(
int rejectedObjectsCleanUpMaxNumberOfDeletes) {
this.rejectedObjectsCleanUpMaxNumberOfDeletes = rejectedObjectsCleanUpMaxNumberOfDeletes;
}
public int getMppsEmulationPollInterval() {
return mppsEmulationPollInterval;
}
public void setMppsEmulationPollInterval(int mppsEmulationPollInterval) {
this.mppsEmulationPollInterval = mppsEmulationPollInterval;
}
public int getArchivingSchedulerPollInterval() {
return archivingSchedulerPollInterval;
}
public void setArchivingSchedulerPollInterval(int archivingPollInterval) {
this.archivingSchedulerPollInterval = archivingPollInterval;
}
public int getSyncLocationStatusPollInterval() {
return syncLocationStatusPollInterval;
}
public void setSyncLocationStatusPollInterval(int syncLocationStatusPollInterval) {
this.syncLocationStatusPollInterval = syncLocationStatusPollInterval;
}
public int getSyncLocationStatusCheckDelay() {
return syncLocationStatusCheckDelay;
}
public void setSyncLocationStatusCheckDelay(int syncLocationStatusCheckDelay) {
this.syncLocationStatusCheckDelay = syncLocationStatusCheckDelay;
}
public int getSyncLocationStatusMaxNumberPerTask() {
return syncLocationStatusMaxNumberPerTask;
}
public void setSyncLocationStatusMaxNumberPerTask(
int syncLocationStatusMaxNumberPerTask) {
this.syncLocationStatusMaxNumberPerTask = syncLocationStatusMaxNumberPerTask;
}
public String[] getSyncLocationStatusStorageSystemGroupIDs() {
return syncLocationStatusStorageSystemGroupIDs;
}
public void setSyncLocationStatusStorageSystemGroupIDs(
String... syncLocationStatusStorageSystemGroupIDs) {
this.syncLocationStatusStorageSystemGroupIDs = syncLocationStatusStorageSystemGroupIDs;
}
public String[] getDisabledDecorators() {
return disabledDecorators;
}
public void setDisabledDecorators(String ... disabledDecorators) {
this.disabledDecorators = disabledDecorators;
}
public boolean isSyncLocationStatusVerifyArchived() {
return syncLocationStatusVerifyArchived;
}
public void setSyncLocationStatusVerifyArchived(
boolean syncLocationStatusVerifyArchived) {
this.syncLocationStatusVerifyArchived = syncLocationStatusVerifyArchived;
}
public void clearTemplatesCache() {
TemplatesCache cache = templatesCache;
if (cache != null)
cache.clear();
}
public Templates getTemplates(String uri) throws TransformerConfigurationException {
TemplatesCache tmp = templatesCache;
if (tmp == null)
templatesCache = tmp = new TemplatesCache();
return tmp.get(StringUtils.replaceSystemProperties(uri));
}
public void setAttributeFilter(Entity entity, AttributeFilter filter) {
attributeFilters.put(entity,filter);
}
public AttributeFilter getAttributeFilter(Entity entity) {
return attributeFilters.get(entity);
}
public Map<Entity, AttributeFilter> getAttributeFilters() {
return attributeFilters;
}
public QueryRetrieveView[] getQueryRetrieveViews() {
return queryRetrieveViews;
}
public void setAttributeFilters(Map<Entity, AttributeFilter> attributeFilters) {
this.attributeFilters.clear();
this.attributeFilters.putAll(attributeFilters);
}
public void setQueryRetrieveViews(QueryRetrieveView... queryRetrieveViews) {
this.queryRetrieveViews = queryRetrieveViews;
}
public QueryRetrieveView getQueryRetrieveView(String viewID) {
for (QueryRetrieveView view : queryRetrieveViews) {
if (view.getViewID().equals(viewID))
return view;
}
return null;
}
public IOCMConfig getIocmConfig() {
return iocmConfig;
}
public void setIocmConfig(IOCMConfig cfg) {
iocmConfig = cfg;
}
@Override
public void reconfigure(DeviceExtension from) {
ArchiveDeviceExtension arcdev = (ArchiveDeviceExtension) from;
ReconfiguringIterator.reconfigure(arcdev, this, ArchiveDeviceExtension.class);
}
public StoreParam getStoreParam() {
StoreParam storeParam = new StoreParam();
storeParam.setFuzzyStr(getFuzzyStr());
storeParam.setAttributeFilters(attributeFilters);
storeParam.setDeIdentifyLogs(isDeIdentifyLogs());
storeParam.setNullValueForQueryFields(getNullValueForQueryFields());
storeParam.setIssuerOfPatientID(getDevice().getIssuerOfPatientID());
return storeParam;
}
public QueryParam getQueryParam() {
QueryParam queryParam = new QueryParam();
queryParam.setFuzzyStr(getFuzzyStr());
queryParam.setAttributeFilters(attributeFilters);
queryParam.setDeIdentifyLogs(isDeIdentifyLogs());
queryParam.setNullValueForQueryFields(getNullValueForQueryFields());
return queryParam;
}
public String getFetchAETitle() {
return fetchAETitle;
}
public void setFetchAETitle(String fetchAETitle) {
this.fetchAETitle = fetchAETitle;
}
public PrivateDerivedFields getPrivateDerivedFields() {
return privateDerivedFields;
}
public void addPrivateDerivedField(PrivateTag tag) {
privateDerivedFields.add(tag);
}
public void setPrivateDerivedFields(PrivateDerivedFields tags) {
privateDerivedFields.clear();
if (tags != null)
privateDerivedFields.add(tags);
}
public boolean removePrivateDerivedField(PrivateTag tag) {
return privateDerivedFields.remove(tag);
}
/**
* The property was moved to device level and converted to AE reference. Please access it directly through {@link Device#getDefaultAE()}
*/
@Deprecated
public String getDefaultAETitle() {
return getDevice().getDefaultAE() == null ? "" : getDevice().getDefaultAE().getAETitle();
}
public int getPriorsCacheMaxResolvedPathEntries() {
return priorsCacheMaxResolvedPathEntries;
}
public void setPriorsCacheMaxResolvedPathEntries(
int priorsCacheMaxResolvedPathEntries) {
this.priorsCacheMaxResolvedPathEntries = priorsCacheMaxResolvedPathEntries;
}
public int getPriorsCacheDeleteDuplicateLocationsDelay() {
return priorsCacheDeleteDuplicateLocationsDelay;
}
public void setPriorsCacheDeleteDuplicateLocationsDelay(
int priorsCacheDeleteDuplicateLocationsDelay) {
this.priorsCacheDeleteDuplicateLocationsDelay = priorsCacheDeleteDuplicateLocationsDelay;
}
public int getPriorsCacheClearMaxLocationsPerDelete() {
return priorsCacheClearMaxLocationsPerDelete;
}
public void setPriorsCacheClearMaxLocationsPerDelete(
int priorsCacheClearMaxLocationsPerDelete) {
this.priorsCacheClearMaxLocationsPerDelete = priorsCacheClearMaxLocationsPerDelete;
}
public int getDeletionServicePollInterval() {
return deletionServicePollInterval;
}
public void setDeletionServicePollInterval(int deletionServicePollInterval) {
this.deletionServicePollInterval = deletionServicePollInterval;
}
public String[] getVisibleImageSRClasses() {
return visibleImageSRClasses;
}
public void setVisibleImageSRClasses(String[] visibleImageSRClasses) {
this.visibleImageSRClasses = visibleImageSRClasses;
}
public String[] getNonVisibleImageSRClasses() {
return nonVisibleImageSRClasses;
}
public void setNonVisibleImageSRClasses(String[] nonVisibleImageSRClasses) {
this.nonVisibleImageSRClasses = nonVisibleImageSRClasses;
}
public boolean getUseWhitelistOfVisibleImageSRClasses() {
return useWhitelistOfVisibleImageSRClasses;
}
public void setUseWhitelistOfVisibleImageSRClasses(boolean useWhitelistOfVisibleImageSRClasses) {
this.useWhitelistOfVisibleImageSRClasses = useWhitelistOfVisibleImageSRClasses;
}
public boolean isVisibleSOPClass(String sopClassUID) {
if (getUseWhitelistOfVisibleImageSRClasses()) {
return doesImageSRListContainSOPClass(sopClassUID, getVisibleImageSRClasses());
} else {
return !doesImageSRListContainSOPClass(sopClassUID, getNonVisibleImageSRClasses());
}
}
public boolean isUseNullForEmptyQueryFields() {
return useNullForEmptyQueryFields;
}
public String getNullValueForQueryFields() {
return isUseNullForEmptyQueryFields() ? null : "*";
}
public void setUseNullForEmptyQueryFields(boolean useNullForEmptyQueryFields) {
this.useNullForEmptyQueryFields = useNullForEmptyQueryFields;
}
private boolean doesImageSRListContainSOPClass(String sopClassUID, String[] arrayOfSOPClasses) {
return arrayOfSOPClasses != null && arrayOfSOPClasses.length>0 &&
Arrays.asList(arrayOfSOPClasses).contains(sopClassUID);
}
public DeletionRules getDeletionRules() {
return deletionRules;
}
public void addDeletionRule(DeletionRule rule) {
deletionRules.add(rule);
}
public void setDeletionRules(DeletionRules rules) {
deletionRules.clear();
if (rules != null)
deletionRules.add(rules);
}
public boolean removeDeletionRule(DeletionRule rule) {
return deletionRules.remove(rule);
}
public int getMaxDeleteServiceRetries() {
return maxDeleteServiceRetries;
}
public void setMaxDeleteServiceRetries(int maxDeleteServiceRetries) {
this.maxDeleteServiceRetries = maxDeleteServiceRetries;
}
public String getDeleteServiceAllowedInterval() {
return deleteServiceAllowedInterval;
}
public void setDeleteServiceAllowedInterval(String deleteServiceAllowedInterval) {
this.deleteServiceAllowedInterval = deleteServiceAllowedInterval;
}
public int getDataVolumePerDayAverageOnNDays() {
return dataVolumePerDayAverageOnNDays;
}
public void setDataVolumePerDayAverageOnNDays(int dataVolumePerDayAverageOnNDays) {
this.dataVolumePerDayAverageOnNDays = dataVolumePerDayAverageOnNDays;
}
public String getDataVolumePerDayCalculationRange() {
return dataVolumePerDayCalculationRange;
}
public void setDataVolumePerDayCalculationRange(
String dataVolumePerDayCalculationRange) {
this.dataVolumePerDayCalculationRange = dataVolumePerDayCalculationRange;
}
public Collection<ApplicationEntity> getIgnoreSeriesStudyMissmatchErrorsAETs() {
return ignoreSeriesStudyMissmatchErrorsAETs;
}
public void setIgnoreSeriesStudyMissmatchErrorsAETs(Collection<ApplicationEntity> ignoreSeriesStudyMissmatchErrorsAETs) {
this.ignoreSeriesStudyMissmatchErrorsAETs = ignoreSeriesStudyMissmatchErrorsAETs;
}
public void addIgnoreSeriesStudyMissmatchErrorsAET(ApplicationEntity ae) {
this.ignoreSeriesStudyMissmatchErrorsAETs.add(ae);
}
public boolean removeIgnoreSeriesStudyMissmatchErrorsAET(ApplicationEntity ae) {
return this.ignoreSeriesStudyMissmatchErrorsAETs.remove(ae);
}
public WeightWatcherConfiguration getWeightWatcherConfiguration() {
return weightWatcherConfiguration;
}
public void setWeightWatcherConfiguration(WeightWatcherConfiguration weightWatcherConfiguration) {
this.weightWatcherConfiguration = weightWatcherConfiguration;
}
}