/* ***** 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) 2013
* 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.dcm4che3.conf.prefs.audit;
import java.util.List;
import java.util.prefs.BackingStoreException;
import java.util.prefs.Preferences;
import org.dcm4che3.conf.api.ConfigurationException;
import org.dcm4che3.conf.prefs.PreferencesDicomConfigurationExtension;
import org.dcm4che3.conf.prefs.PreferencesUtils;
import org.dcm4che3.net.Connection;
import org.dcm4che3.net.Device;
import org.dcm4che3.net.audit.AuditLogger;
import org.dcm4che3.net.audit.AuditSuppressCriteria;
import org.dcm4che3.util.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* @author Gunter Zeilinger <gunterze@gmail.com>
* @author Michael Backhaus <michael.backhaus@agfa.com>
*/
public class PreferencesAuditLoggerConfiguration
extends PreferencesDicomConfigurationExtension {
private static final Logger LOG = LoggerFactory.getLogger(
PreferencesAuditLoggerConfiguration.class);
@Override
protected void storeChilds(Device device, Preferences deviceNode) {
AuditLogger logger =
device.getDeviceExtension(AuditLogger.class);
if (logger != null)
storeTo(logger, deviceNode.node("dcmAuditLogger"));
}
private void storeTo(AuditLogger logger, Preferences prefs) {
PreferencesUtils.storeNotDef(prefs, "dcmAuditFacility",
logger.getFacility().ordinal(), 10);
PreferencesUtils.storeNotDef(prefs, "dcmAuditSuccessSeverity",
logger.getSuccessSeverity().ordinal(), 5);
PreferencesUtils.storeNotDef(prefs, "dcmAuditMinorFailureSeverity",
logger.getMinorFailureSeverity().ordinal(), 4);
PreferencesUtils.storeNotDef(prefs, "dcmAuditSeriousFailureSeverity",
logger.getSeriousFailureSeverity().ordinal(), 3);
PreferencesUtils.storeNotDef(prefs, "dcmAuditMajorFailureSeverity",
logger.getMajorFailureSeverity().ordinal(), 2);
PreferencesUtils.storeNotNull(prefs, "dcmAuditSourceID",
logger.getAuditSourceID());
PreferencesUtils.storeNotNull(prefs, "dcmAuditEnterpriseSiteID",
logger.getAuditEnterpriseSiteID());
PreferencesUtils.storeNotEmpty(prefs, "dcmAuditSourceTypeCode",
logger.getAuditSourceTypeCodes());
PreferencesUtils.storeNotNull(prefs, "dcmAuditApplicationName",
logger.getApplicationName());
PreferencesUtils.storeNotNull(prefs, "dcmAuditMessageID",
StringUtils.nullify(logger.getMessageID(), AuditLogger.MESSAGE_ID));
PreferencesUtils.storeNotNull(prefs, "dcmAuditMessageEncoding",
StringUtils.nullify(logger.getEncoding(), "UTF-8"));
PreferencesUtils.storeNotNull(prefs, "dcmAuditMessageSchemaURI",
logger.getSchemaURI());
PreferencesUtils.storeNotDef(prefs, "dcmAuditMessageBOM",
logger.isIncludeBOM(), true);
PreferencesUtils.storeNotDef(prefs, "dcmAuditMessageFormatXML",
logger.isFormatXML(), false);
PreferencesUtils.storeNotDef(prefs, "dcmAuditTimestampInUTC",
logger.isTimestampInUTC(), false);
PreferencesUtils.storeConnRefs(prefs, logger.getConnections(),
logger.getDevice().listConnections());
PreferencesUtils.storeNotNull(prefs, "dcmAuditRecordRepositoryDeviceReference",
config.deviceRef(logger.getAuditRecordRepositoryDeviceName()));
PreferencesUtils.storeNotDef(prefs, "dcmAuditIncludeInstanceUID",
logger.isIncludeInstanceUID(), false);
PreferencesUtils.storeNotNull(prefs, "dcmAuditLoggerSpoolDirectoryURI",
logger.getSpoolDirectoryURI());
PreferencesUtils.storeNotDef(prefs, "dcmAuditLoggerRetryInterval",
logger.getRetryInterval(), 0);
PreferencesUtils.storeNotNull(prefs, "dicomInstalled", logger.getInstalled());
store(logger.getAuditSuppressCriteriaList(), prefs);
}
private void store(List<AuditSuppressCriteria> list, Preferences parentNode) {
Preferences ascNode = parentNode.node("dcmAuditSuppressCriteria");
for (AuditSuppressCriteria criteria : list) {
storeTo(criteria, ascNode.node(criteria.getCommonName()));
}
}
private void storeTo(AuditSuppressCriteria criteria, Preferences prefs) {
PreferencesUtils.storeNotEmpty(prefs, "dcmAuditEventID",
criteria.getEventIDsAsStringArray());
PreferencesUtils.storeNotEmpty(prefs, "dcmAuditEventTypeCode",
criteria.getEventTypeCodesAsStringArray());
PreferencesUtils.storeNotEmpty(prefs, "dcmAuditEventActionCode",
criteria.getEventActionCodes());
PreferencesUtils.storeNotEmpty(prefs, "dcmAuditEventOutcomeIndicator",
criteria.getEventOutcomeIndicators());
PreferencesUtils.storeNotEmpty(prefs, "dcmAuditUserID",
criteria.getUserIDs());
PreferencesUtils.storeNotEmpty(prefs, "dcmAuditAlternativeUserID",
criteria.getAlternativeUserIDs());
PreferencesUtils.storeNotEmpty(prefs, "dcmAuditUserRoleIDCode",
criteria.getUserRoleIDCodesAsStringArray());
PreferencesUtils.storeNotEmpty(prefs, "dcmAuditNetworkAccessPointID",
criteria.getNetworkAccessPointIDs());
PreferencesUtils.storeNotNull(prefs, "dcmAuditUserIsRequestor",
criteria.getUserIsRequestor());
}
@Override
protected void loadChilds(Device device, Preferences deviceNode)
throws BackingStoreException, ConfigurationException {
if (!deviceNode.nodeExists("dcmAuditLogger"))
return;
List<Connection> devConns = device.listConnections();
Preferences loggerNode = deviceNode.node("dcmAuditLogger");
AuditLogger logger = new AuditLogger();
loadFrom(logger, loggerNode);
int n = loggerNode.getInt("dicomNetworkConnectionReference.#", 0);
for (int i = 0; i < n; i++) {
logger.addConnection(devConns.get(
loggerNode.getInt("dicomNetworkConnectionReference." + (i+1), 0) - 1));
}
String arrDeviceRef =
loggerNode.get("dcmAuditRecordRepositoryDeviceReference", null);
if (arrDeviceRef == null)
throw new ConfigurationException("Missing dcmAuditRecordRepositoryDeviceReference");
logger.setAuditRecordRepositoryDevice(
arrDeviceRef.equals(config.deviceRef(device.getDeviceName()))
? device
: loadAuditRecordRepository(arrDeviceRef));
loadAuditSuppressCriteria(logger, loggerNode);
device.addDeviceExtension(logger);
}
private void loadAuditSuppressCriteria(AuditLogger logger, Preferences loggerNode)
throws BackingStoreException {
Preferences parentNode = loggerNode.node("dcmAuditSuppressCriteria");
for (String cn : parentNode.childrenNames()) {
AuditSuppressCriteria criteria = new AuditSuppressCriteria(cn);
loadAuditSuppressCriteria(criteria, parentNode.node(cn));
logger.addAuditSuppressCriteria(criteria);
}
}
private void loadAuditSuppressCriteria(AuditSuppressCriteria criteria,
Preferences prefs) {
criteria.setEventIDsAsStringArray(
PreferencesUtils.stringArray(prefs, "dcmAuditEventID"));
criteria.setEventTypeCodesAsStringArray(
PreferencesUtils.stringArray(prefs, "dcmAuditEventTypeCode"));
criteria.setEventActionCodes(
PreferencesUtils.stringArray(prefs, "dcmAuditEventActionCode"));
criteria.setEventOutcomeIndicators(
PreferencesUtils.stringArray(prefs, "dcmAuditEventOutcomeIndicator"));
criteria.setUserIDs(
PreferencesUtils.stringArray(prefs, "dcmAuditUserID"));
criteria.setAlternativeUserIDs(
PreferencesUtils.stringArray(prefs, "dcmAuditAlternativeUserID"));
criteria.setUserRoleIDCodesAsStringArray(
PreferencesUtils.stringArray(prefs, "dcmAuditUserRoleIDCode"));
criteria.setNetworkAccessPointIDs(
PreferencesUtils.stringArray(prefs, "dcmAuditNetworkAccessPointID"));
criteria.setUserIsRequestor(PreferencesUtils.booleanValue(
prefs.get("dcmAuditUserIsRequestor", null)));
}
private Device loadAuditRecordRepository(String arrDeviceRef) {
try {
return config.loadDevice(arrDeviceRef);
} catch (ConfigurationException e) {
LOG.info("Failed to load Audit Record Repository "
+ arrDeviceRef + " referenced by Audit Logger", e);
return null;
}
}
private void loadFrom(AuditLogger logger, Preferences prefs) {
logger.setFacility(AuditLogger.Facility.values()
[prefs.getInt("dcmAuditFacility", 10)]);
logger.setSuccessSeverity(AuditLogger.Severity.values()
[prefs.getInt("dcmAuditSuccessSeverity", 5)]);
logger.setMinorFailureSeverity(AuditLogger.Severity.values()
[prefs.getInt("dcmAuditMinorFailureSeverity", 4)]);
logger.setSeriousFailureSeverity(AuditLogger.Severity.values()
[prefs.getInt("dcmAuditSeriousFailureSeverity", 3)]);
logger.setMajorFailureSeverity(AuditLogger.Severity.values()
[prefs.getInt("dcmAuditMajorFailureSeverity", 2)]);
logger.setAuditSourceID(prefs.get("dcmAuditSourceID", null));
logger.setAuditEnterpriseSiteID(
prefs.get("dcmAuditEnterpriseSiteID", null));
logger.setAuditSourceTypeCodes(
PreferencesUtils.stringArray(prefs, "dcmAuditSourceTypeCode"));
logger.setApplicationName(
prefs.get("dcmAuditApplicationName", null));
logger.setMessageID(
prefs.get("dcmAuditMessageID", AuditLogger.MESSAGE_ID));
logger.setEncoding(
prefs.get("dcmAuditMessageEncoding", "UTF-8"));
logger.setSchemaURI(
prefs.get("dcmAuditMessageSchemaURI", null));
logger.setIncludeBOM(
prefs.getBoolean("dcmAuditMessageBOM", true));
logger.setFormatXML(
prefs.getBoolean("dcmAuditMessageFormatXML", false));
logger.setTimestampInUTC(
prefs.getBoolean("dcmAuditTimestampInUTC", false));
logger.setIncludeInstanceUID(
prefs.getBoolean("dcmAuditIncludeInstanceUID", false));
logger.setSpoolDirectoryURI(
prefs.get("dcmAuditLoggerSpoolDirectoryURI", null));
logger.setRetryInterval(
prefs.getInt("dcmAuditLoggerRetryInterval", 0));
logger.setInstalled(PreferencesUtils.booleanValue(prefs.get("dicomInstalled", null)));
}
@Override
protected void mergeChilds(Device prev, Device device, Preferences deviceNode)
throws BackingStoreException {
AuditLogger prevLogger =
prev.getDeviceExtension(AuditLogger.class);
AuditLogger logger =
device.getDeviceExtension(AuditLogger.class);
if (logger == null && prevLogger == null)
return;
Preferences arrNode = deviceNode.node("dcmAuditLogger");
if (logger == null)
arrNode.removeNode();
else if (prevLogger == null)
storeTo(logger, arrNode);
else
storeDiffs(arrNode, prevLogger, logger);
}
private void storeDiffs(Preferences prefs, AuditLogger a, AuditLogger b)
throws BackingStoreException {
PreferencesUtils.storeDiff(prefs, "dcmAuditFacility",
a.getFacility().ordinal(),
b.getFacility().ordinal(),
10);
PreferencesUtils.storeDiff(prefs, "dcmAuditSuccessSeverity",
a.getSuccessSeverity().ordinal(),
b.getSuccessSeverity().ordinal(),
5);
PreferencesUtils.storeDiff(prefs, "dcmAuditMinorFailureSeverity",
a.getMinorFailureSeverity().ordinal(),
b.getMinorFailureSeverity().ordinal(),
4);
PreferencesUtils.storeDiff(prefs, "dcmAuditSeriousFailureSeverity",
a.getSeriousFailureSeverity().ordinal(),
b.getSeriousFailureSeverity().ordinal(),
3);
PreferencesUtils.storeDiff(prefs, "dcmAuditMajorFailureSeverity",
a.getMajorFailureSeverity().ordinal(),
b.getMajorFailureSeverity().ordinal(),
2);
PreferencesUtils.storeDiff(prefs, "dcmAuditSourceID",
a.getAuditSourceID(),
b.getAuditSourceID());
PreferencesUtils.storeDiff(prefs, "dcmAuditEnterpriseSiteID",
a.getAuditEnterpriseSiteID(),
b.getAuditEnterpriseSiteID());
PreferencesUtils.storeDiff(prefs, "dcmAuditSourceTypeCode",
a.getAuditSourceTypeCodes(),
b.getAuditSourceTypeCodes());
PreferencesUtils.storeDiff(prefs, "dcmAuditApplicationName",
a.getApplicationName(),
b.getApplicationName());
PreferencesUtils.storeDiff(prefs, "dcmAuditMessageID",
a.getMessageID(),
b.getMessageID());
PreferencesUtils.storeDiff(prefs, "dcmAuditMessageEncoding",
StringUtils.nullify(a.getEncoding(), "UTF-8"),
StringUtils.nullify(b.getEncoding(), "UTF-8"));
PreferencesUtils.storeDiff(prefs, "dcmAuditMessageSchemaURI",
a.getSchemaURI(),
b.getSchemaURI());
PreferencesUtils.storeDiff(prefs, "dcmAuditMessageBOM",
a.isIncludeBOM(),
b.isIncludeBOM(),
true);
PreferencesUtils.storeDiff(prefs, "dcmAuditMessageFormatXML",
a.isFormatXML(),
b.isFormatXML(),
false);
PreferencesUtils.storeDiff(prefs, "dcmAuditTimestampInUTC",
a.isTimestampInUTC(),
b.isTimestampInUTC(),
false);
PreferencesUtils.storeDiffConnRefs(prefs,
a.getConnections(), a.getDevice().listConnections(),
b.getConnections(), b.getDevice().listConnections());
PreferencesUtils.storeDiff(prefs, "dcmAuditRecordRepositoryDeviceReference",
arrDeviceRef(a),
arrDeviceRef(b));
PreferencesUtils.storeDiff(prefs, "dcmAuditIncludeInstanceUID",
a.isIncludeInstanceUID(),
b.isIncludeInstanceUID(),
false);
PreferencesUtils.storeDiff(prefs, "dcmAuditLoggerSpoolDirectoryURI",
a.getSpoolDirectoryURI(),
b.getSpoolDirectoryURI());
PreferencesUtils.storeDiff(prefs, "dcmAuditLoggerRetryInterval",
a.getRetryInterval(),
b.getRetryInterval(),
0);
PreferencesUtils.storeDiff(prefs, "dicomInstalled",
a.getInstalled(),
b.getInstalled());
mergeAuditSuppressCriteria(a, b, prefs);
}
private String arrDeviceRef(AuditLogger a) {
Device arrDevice = a.getAuditRecordRepositoryDevice();
return arrDevice != null
? config.deviceRef(arrDevice.getDeviceName())
: null;
}
private void mergeAuditSuppressCriteria(AuditLogger prevLogger,
AuditLogger logger, Preferences auditLoggerNode)
throws BackingStoreException {
Preferences parentNode = auditLoggerNode.node("dcmAuditSuppressCriteria");
for (AuditSuppressCriteria prevCriteria : prevLogger.getAuditSuppressCriteriaList()) {
String cn = prevCriteria.getCommonName();
if (logger.findAuditSuppressCriteriaByCommonName(cn) == null)
parentNode.node(cn).removeNode();
}
for (AuditSuppressCriteria criteria : logger.getAuditSuppressCriteriaList()) {
String cn = criteria.getCommonName();
AuditSuppressCriteria prev = prevLogger.findAuditSuppressCriteriaByCommonName(cn);
Preferences node = parentNode.node(cn);
if (prev == null)
storeTo(criteria, node);
else
storeDiffs(prev, criteria, node);
}
}
private void storeDiffs(AuditSuppressCriteria a,
AuditSuppressCriteria b, Preferences prefs) {
PreferencesUtils.storeDiff(prefs, "dcmAuditEventID",
a.getEventIDsAsStringArray(),
b.getEventIDsAsStringArray());
PreferencesUtils.storeDiff(prefs, "dcmAuditEventTypeCode",
a.getEventTypeCodesAsStringArray(),
b.getEventTypeCodesAsStringArray());
PreferencesUtils.storeDiff(prefs, "dcmAuditEventActionCode",
a.getEventActionCodes(),
b.getEventActionCodes());
PreferencesUtils.storeDiff(prefs, "dcmAuditEventOutcomeIndicator",
a.getEventOutcomeIndicators(),
b.getEventOutcomeIndicators());
PreferencesUtils.storeDiff(prefs, "dcmAuditUserID",
a.getUserIDs(),
b.getUserIDs());
PreferencesUtils.storeDiff(prefs, "dcmAuditAlternativeUserID",
a.getAlternativeUserIDs(),
b.getAlternativeUserIDs());
PreferencesUtils.storeDiff(prefs, "dcmAuditUserRoleIDCode",
a.getUserRoleIDCodesAsStringArray(),
b.getUserRoleIDCodesAsStringArray());
PreferencesUtils.storeDiff(prefs, "dcmAuditNetworkAccessPointID",
a.getNetworkAccessPointIDs(),
b.getNetworkAccessPointIDs());
PreferencesUtils.storeDiff(prefs, "dcmAuditUserIsRequestor",
a.getUserIsRequestor(),
b.getUserIsRequestor());
}
}