/*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
* Copyright (c) 2015, MPL CodeInside http://codeinside.ru
*/
package ru.codeinside.log;
import org.apache.commons.codec.binary.Base64;
import ru.codeinside.adm.AdminServiceProvider;
import ru.codeinside.gses.API;
import ru.codeinside.gses.activiti.forms.Signatures;
import ru.codeinside.gses.webui.Flash;
import ru.codeinside.gses.webui.form.SignatureType;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* Логирует подписи СП и ОВ
*/
public class SignatureLogger {
private static final java.util.logging.Logger logger = java.util.logging.Logger.getLogger(SignatureLogger.class.getName());
private static final String basePath = System.getProperty("com.sun.aas.instanceRoot");
private final Long bidId;
private final String taskId;
public SignatureLogger(Long bidId, String taskId) {
this.taskId = taskId;
this.bidId = bidId;
}
public void log(String data, Signatures signatures, SignatureType signatureType, String rawXml) {
if (noMatter(signatureType)) {
return;
}
File logFile;
try {
logFile = prepareToLog(signatureType);
} catch (IOException e) {
logger.severe("IOException when prepare to logging: " + e);
logger.severe("bidId = " + bidId + " signatureType = " + signatureType + " taskId = " + taskId);
return;
}
if (logFile == null) {
logger.warning("Log file already exist: bidId = " + bidId + " signatureType = " + signatureType.name()
+ ". WHY!?");
return;
}
try {
writeToFile(logFile, data, signatures, rawXml);
} catch (IOException e) {
logger.severe("IOException when write data: " + e);
logger.severe("bidId = " + bidId + " signatureType = " + signatureType + " taskId = " + taskId);
}
}
private boolean noMatter(SignatureType signatureType) {
if (SignatureType.SP == signatureType) {
return !Boolean.parseBoolean(AdminServiceProvider.get().getSystemProperty(API.LOG_SP_SIGN));
} else if (SignatureType.OV == signatureType) {
return !Boolean.parseBoolean(AdminServiceProvider.get().getSystemProperty(API.LOG_OV_SIGN));
}
return true;
}
private void writeToFile(File logFile, String data, Signatures signatures, String rawXml) throws IOException {
Writer fw = null;
try {
fw = new FileWriter(logFile)
.append(String.format("Дата: %s%n%n", new SimpleDateFormat("dd.MM.yyyy HH:mm:ss").format(new Date())))
.append(String.format("Логин: %s%n%n", Flash.login()))
.append(String.format("Данные: %s%n%n", data))
.append(String.format("Сертификат: %s%n%n", Base64.encodeBase64String(signatures.certificate)))
.append(String.format("Подпись: %s%n%n", Base64.encodeBase64String(signatures.signs[0])))
.append(String.format("XML: %s%n", rawXml));
} finally {
if (fw != null) {
fw.flush();
fw.close();
}
}
}
private File prepareToLog(SignatureType signatureType) throws IOException {
File logsDir = new File(basePath, "logs");
File rootFile = new File(logsDir, "bids");
if (!rootFile.exists()) {
rootFile.mkdirs();
}
File bidFile = new File(rootFile, String.valueOf(bidId));
if (!bidFile.exists()) {
bidFile.mkdir();
}
String suffix = (taskId == null ? "" : "-" + taskId) + ".log";
File signFile = new File(bidFile, signatureType.name() + suffix);
if (!signFile.createNewFile()) {
return null;
}
return signFile;
}
}