/***********************************************************************************
*
* Copyright (c) 2014 Kamil Baczkowicz
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* and Eclipse Distribution License v1.0 which accompany this distribution.
*
* The Eclipse Public License is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* The Eclipse Distribution License is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* Contributors:
*
* Kamil Baczkowicz - initial API and implementation and/or initial documentation
*
*/
package pl.baczkowicz.mqttspy.ui.messagelog;
import java.io.File;
import java.util.List;
import javafx.application.Platform;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import pl.baczkowicz.mqttspy.common.generated.LoggedMqttMessage;
import pl.baczkowicz.mqttspy.logger.MqttMessageLogParserUtils;
import pl.baczkowicz.mqttspy.messages.BaseMqttMessage;
import pl.baczkowicz.mqttspy.ui.MainController;
import pl.baczkowicz.mqttspy.ui.connections.ConnectionManager;
import pl.baczkowicz.spy.files.FileUtils;
import pl.baczkowicz.spy.utils.ThreadingUtils;
/**
* Tasks responsible for reading the message log.
*/
public class LogReaderTask extends TaskWithProgressUpdater<List<BaseMqttMessage>>
{
/** Diagnostic logger. */
private final static Logger logger = LoggerFactory.getLogger(LogReaderTask.class);
/** The file to read from. */
private File selectedFile;
/** Connection manager - used for loading the message log tab. */
protected ConnectionManager connectionManager;
/** Main controller. */
protected MainController controller;
/**
* Creates a LogReaderTask with the supplied parameters.
*
* @param selectedFile The file to read from
* @param connectionManager The connection manager
* @param mainController The main controller
*/
public LogReaderTask(final File selectedFile, final ConnectionManager connectionManager, final MainController mainController)
{
this.selectedFile = selectedFile;
this.connectionManager = connectionManager;
this.controller = mainController;
super.updateTitle("Processing message audit log file " + selectedFile.getName());
}
@Override
protected List<BaseMqttMessage> call() throws Exception
{
try
{
// Read the message log
updateMessage("Please wait - reading message audit log [1/4]");
updateProgress(0, 4);
final List<String> fileContent = FileUtils.readFileAsLines(selectedFile);
final long totalItems = fileContent.size();
updateProgress(totalItems, totalItems * 4);
if (isCancelled())
{
logger.info("Task cancelled!");
return null;
}
// Parser the message log (string -> LoggedMqttMessage)
updateMessage("Please wait - parsing " + fileContent.size() + " messages [2/4]");
final List<LoggedMqttMessage> loggedMessages = MqttMessageLogParserUtils.parseMessageLog(fileContent, this, totalItems, totalItems * 4);
updateProgress(totalItems * 2, totalItems * 4);
if (isCancelled())
{
logger.info("Task cancelled!");
return null;
}
// Process the message log (LoggedMqttMessage -> ReceivedMqttMessage)
updateMessage("Please wait - processing " + loggedMessages.size() + " messages [3/4]");
final List<BaseMqttMessage> processedMessages = MqttMessageLogParserUtils.processMessageLog(loggedMessages, this, totalItems * 2, totalItems * 4);
updateProgress(totalItems * 3, totalItems * 4);
if (isCancelled())
{
logger.info("Task cancelled!");
return null;
}
// Display message log
updateMessage("Please wait - displaying " + loggedMessages.size() + " messages [4/4]");
Platform.runLater(new Runnable()
{
@Override
public void run()
{
connectionManager.loadMessageLogTab(controller, selectedFile.getName(), processedMessages);
}
});
// Done!
updateMessage("Finished!");
updateProgress(4, 4);
// Make the last message visible for some time
ThreadingUtils.sleep(500);
return processedMessages;
}
catch (Exception e)
{
logger.error("Cannot process the message audit log - {}", selectedFile.getName(), e);
}
return null;
}
}