package org.opennaas.extensions.protocols.cli.message;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* This class represents a CLI message
*
* @author edu
*
*/
public class CLIResponseMessage implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
/** Logger */
static private Logger logger = LoggerFactory.getLogger(CLIResponseMessage.class);
/** The raw message before processing it **/
private String rawMessage = null;
/** The processed message (without prompts) **/
private String processedMessage = null;
/** Tells if the response is an error **/
private boolean hasErrors = false;
/**
* Make the constructor private, so that it cannot be instantiated
*/
private CLIResponseMessage() {
}
public String getRawMessage() {
return rawMessage;
}
public void setRawMessage(String rawMessage) {
logger.debug("Received message: " + rawMessage);
this.rawMessage = rawMessage;
}
/**
* Parses the respone message (removes the echos, prompts, look for errors)
*
* @param rawMessage
* @param stringsToRemove
* @param errorPatterns
* @return
*/
public static CLIResponseMessage parse(String rawMessage, List<String> stringsToRemove,
List<String> errorPatterns) {
String processedMessage = rawMessage;
CLIResponseMessage response = new CLIResponseMessage();
// Remove prompts and echoes
for (int i = 0; i < stringsToRemove.size(); i++) {
if (processedMessage.indexOf(stringsToRemove.get(i)) != -1) {
processedMessage = processedMessage.replaceAll(stringsToRemove.get(i), "");
}
}
// Look for errors
for (int i = 0; i < errorPatterns.size(); i++) {
if (processedMessage.indexOf(errorPatterns.get(i)) != -1) {
response.hasErrors = true;
}
}
response.setRawMessage(rawMessage);
response.processedMessage = processedMessage;
return response;
}
public String getProcessedMessage() {
return processedMessage;
}
public boolean hasErrors() {
return hasErrors;
}
/**
* If the response has a table format, this operation returns a list of strings for each row of the table. Each list of strings contains the
* column string values.
*
* @param columnSeparator
* The string used to separate columns
* @return
*/
public List<List<String>> getTableResult(String columnSeparator) {
List<List<String>> result = new ArrayList<List<String>>();
List<String> parsedRow = null;
String row = null;
StringTokenizer columnTokenizer = null;
StringTokenizer rowTokenizer = new StringTokenizer(processedMessage, "\n");
while (rowTokenizer.hasMoreTokens()) {
row = rowTokenizer.nextToken();
parsedRow = new ArrayList<String>();
columnTokenizer = new StringTokenizer(row, columnSeparator);
while (columnTokenizer.hasMoreTokens()) {
parsedRow.add(columnTokenizer.nextToken());
}
result.add(parsedRow);
}
return result;
}
}