package hermes.renderers;
import hermes.util.DumpUtils;
import hermes.util.MessageUtils;
import java.awt.Font;
import java.io.StringWriter;
import javax.jms.Message;
import javax.swing.JComponent;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import org.apache.log4j.Logger;
/**
* A renderer that displays EBCDIC Data in ASCII Format on a JMS message in a
* text area.
*
* @author sxchapma@yahoo.com
* @version $Id: EBCDICRenderer.java,v 1.0 2008/10/03 15:59:54
*/
public class EBCDICMessageRenderer extends AbstractMessageRenderer {
private static final Logger log = Logger.getLogger(EBCDICMessageRenderer.class);
private static String MAX_MESSAGE_SIZE = "maxMessageSize";
private static String MAX_MESSAGE_SIZE_INFO = "Maximum message size";
private static String UNDISPLAYABLE_CHAR = ".";
private static String ROW_LENGTH = "rowLength";
private static String ROW_LENGTH_INFO = "Row length to display on screen";
private static String UNDISPLAYABLE_CHAR_INFO = "Character to display when the EBCDIC character cannot be represented in ASCII";
public static final int DUMP_AS_EBCDIC = 5;
public char[] chart = null;
public MyConfig config = new MyConfig();
static {
}
public class MyConfig extends AbstractMessageRenderer.BasicConfig {
private int maxMessageSize = 5 * 1024 * 1024;;
private int rowLength = 16;
private boolean active = false;
private String name = "EBCDIC";
private String undisplayableChar = ".";
@Override
public String getName() {
return name;
}
@Override
public String getPropertyDescription(String propertyName) {
if (MAX_MESSAGE_SIZE.equals(propertyName)) {
return MAX_MESSAGE_SIZE_INFO;
}
if (ROW_LENGTH.equals(propertyName)) {
return ROW_LENGTH_INFO;
}
if (UNDISPLAYABLE_CHAR.equals(propertyName)) {
return UNDISPLAYABLE_CHAR_INFO;
}
return propertyName;
}
public String getUndisplayableChar() {
return undisplayableChar;
}
public void setUndisplayableChar(String undisplayableChar) {
this.undisplayableChar = undisplayableChar;
}
@Override
public boolean isActive() {
return active;
}
@Override
public void setActive(boolean active) {
this.active = active;
}
@Override
public void setName(String name) {
this.name = name;
}
public int getMaxMessageSize() {
return maxMessageSize;
}
public void setMaxMessageSize(int maxMessageSize) {
this.maxMessageSize = maxMessageSize;
}
public int getRowLength() {
return rowLength;
}
public void setRowLength(int rowLength) {
this.rowLength = rowLength;
}
}
public EBCDICMessageRenderer() {
super();
}
@Override
public Config createConfig() {
return new MyConfig();
}
@Override
public void setConfig(Config config) {
this.config = (MyConfig) config;
updateMappings();
super.setConfig(config);
}
private void updateMappings() {
chart = new char[255];
for (int i = 0; i < 255; i++) {
chart[i] = config.getUndisplayableChar().charAt(0);
}
chart[64] = ' ';
chart[76] = '<';
chart[77] = '(';
chart[78] = '+';
chart[79] = '|';
chart[80] = '&';
chart[90] = '!';
chart[91] = '$';
chart[92] = '*';
chart[93] = ')';
chart[94] = ';';
chart[95] = '_';
chart[96] = '-';
chart[97] = '/';
chart[107] = ',';
chart[108] = '%';
chart[109] = '_';
chart[110] = '>';
chart[111] = '?';
chart[122] = ':';
chart[123] = '#';
chart[124] = '@';
chart[125] = '`';
chart[126] = '=';
chart[127] = '\"';
chart[129] = 'a';
chart[130] = 'b';
chart[131] = 'c';
chart[132] = 'd';
chart[133] = 'e';
chart[134] = 'f';
chart[135] = 'g';
chart[136] = 'h';
chart[137] = 'i';
chart[145] = 'j';
chart[146] = 'k';
chart[147] = 'l';
chart[148] = 'm';
chart[149] = 'n';
chart[150] = 'o';
chart[151] = 'p';
chart[152] = 'q';
chart[153] = 'r';
chart[162] = 's';
chart[163] = 't';
chart[164] = 'u';
chart[165] = 'v';
chart[166] = 'w';
chart[167] = 'x';
chart[168] = 'y';
chart[169] = 'z';
chart[193] = 'A';
chart[194] = 'B';
chart[195] = 'C';
chart[196] = 'D';
chart[197] = 'E';
chart[198] = 'F';
chart[199] = 'G';
chart[200] = 'H';
chart[201] = 'I';
chart[209] = 'J';
chart[210] = 'K';
chart[211] = 'L';
chart[212] = 'M';
chart[213] = 'N';
chart[214] = 'O';
chart[215] = 'P';
chart[216] = 'Q';
chart[217] = 'R';
chart[226] = 'S';
chart[227] = 'T';
chart[228] = 'U';
chart[229] = 'V';
chart[230] = 'W';
chart[231] = 'X';
chart[232] = 'Y';
chart[233] = 'Z';
chart[240] = '0';
chart[241] = '1';
chart[242] = '2';
chart[243] = '3';
chart[244] = '4';
chart[245] = '5';
chart[246] = '6';
chart[247] = '7';
chart[248] = '8';
chart[249] = '9';
}
@Override
public JComponent render(JScrollPane parent, Message m) {
final JTextArea myRender = new JTextArea();
myRender.setEditable(false);
myRender.setFont(Font.decode("Monospaced-PLAIN-12"));
byte[] messagebytes = null;
try {
messagebytes = MessageUtils.asBytes(m);
} catch (Exception j) {
log.error(j.getMessage(), j);
}
try {
myRender.setText(dumpBinaryEx(messagebytes, DUMP_AS_EBCDIC, config.getMaxMessageSize()));
myRender.setCaretPosition(0);
} catch (Exception e) {
log.error(e.getMessage(), e);
}
return myRender;
}
private String dumpBinaryEx(byte[] data, int mode, int maxSize) {
StringWriter b = new StringWriter();
int c = 0;
if (data != null) {
while (c < data.length) {
int max = Math.min(config.getRowLength(), data.length - c);
byte[] row = new byte[max];
for (int i = 0; i < row.length; i++)
row[i] = data[c + i];
switch (mode) {
case DUMP_AS_EBCDIC:
DumpUtils.dumpBinaryLineAsHexAndEBCDIC(b, c, chart, row, config.getRowLength());
break;
}
c += config.getRowLength();
if (c > maxSize) {
b.append("Message too big");
break;
}
}
} else {
b.append("No payload.");
}
return b.toString();
}
/**
* Any JMS message is readable.
*/
@Override
public boolean canRender(Message message) {
return true;
}
@Override
public String getDisplayName() {
return "EBCDIC";
}
}