Skip to content

Commit

Permalink
ui improvements, prepared to reuse content viewer in rest client. bug…
Browse files Browse the repository at this point in the history
… fix on version check
  • Loading branch information
mdeanda committed Apr 5, 2016
1 parent 3d8b4ff commit b48132f
Show file tree
Hide file tree
Showing 10 changed files with 506 additions and 226 deletions.
1 change: 1 addition & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ dependencies {
compile 'com.j256.ormlite:ormlite-jdbc:4.48'

testCompile 'junit:junit:4.+'
testCompile 'com.thedeanda:lorem:2.+'
}
jar {
manifest {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,12 +21,14 @@ public SimpleHttpClient() {

public String getString(String url) {
byte[] bytes = getBytes(url);
if (bytes == null)
return null;
try {
return new String(bytes, "UTF-8");
} catch (UnsupportedEncodingException e) {
log.warn(e.getMessage(), e);
return null;
}
return null;
}

public byte[] getBytes(String url) {
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/com/thedeanda/ajaxproxy/ui/MainFrame.java
Original file line number Diff line number Diff line change
Expand Up @@ -181,7 +181,7 @@ private void initWindow() {
URL imgUrl = ClassLoader.getSystemClassLoader().getResource("icon.png");
this.image = Toolkit.getDefaultToolkit().getImage(imgUrl);
this.setIconImage(image);
setPreferredSize(new Dimension(980, 700));
setPreferredSize(new Dimension(1150, 700));
}

private void initTray() {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,36 +1,26 @@
package com.thedeanda.ajaxproxy.ui;
package com.thedeanda.ajaxproxy.ui.resourceviewer;

import java.awt.BorderLayout;
import java.io.StringWriter;
import java.util.Iterator;
import java.util.concurrent.ExecutionException;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.JTextArea;
import javax.swing.JTextPane;
import javax.swing.JTree;
import javax.swing.SwingWorker;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.text.WrappedPlainView;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreeNode;

import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.StringUtils;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.thedeanda.javajson.JsonArray;
import com.thedeanda.javajson.JsonObject;
import com.thedeanda.javajson.JsonValue;
import com.thedeanda.ajaxproxy.ui.resourceviewer.util.DocumentContainer;
import com.thedeanda.ajaxproxy.ui.resourceviewer.util.DocumentParser;

/**
* this is a content viewer used to show input/ouput content of http requests.
Expand All @@ -41,6 +31,7 @@
*/
public class ContentViewer extends JPanel {
private static final long serialVersionUID = 1L;
private static final int MAX_TEXT_SIZE = 300000;
private static final Logger log = LoggerFactory
.getLogger(ContentViewer.class);
private JTabbedPane tabs;
Expand All @@ -55,224 +46,85 @@ public ContentViewer() {
tabs.setBorder(BorderFactory.createEmptyBorder());
}

private class WorkerData {
public String rawText;
public String formattedText;
public TreeNode treeNode;
}

public void setContent(final String input) {
log.trace("setting content");
public void setContent(final byte[] input) {
tabs.removeAll();

if (StringUtils.isBlank(input)) {
if (ArrayUtils.isEmpty(input)) {
log.debug("empty content, stop here");
return;
}

log.debug("setting content");
new TreeLoader(input).execute();
}

private class TreeLoader extends SwingWorker<WorkerData, WorkerData> {
private class TreeLoader extends
SwingWorker<DocumentContainer, DocumentContainer> {

private String input;
private byte[] bytes;

public TreeLoader(byte[] input) {
this.bytes = input;
}

public TreeLoader(String input) {
this.input = input;
}

@Override
protected WorkerData doInBackground() throws Exception {
WorkerData data = new WorkerData();
data.rawText = input;

TreeNode node = null;
String formattedText = null;
Document doc = null;
if (input != null) {
if (input.trim().startsWith("{")) {
try {
JsonObject json = JsonObject.parse(input);
DefaultMutableTreeNode rootNode = new DefaultMutableTreeNode(
"{}");
initTree(rootNode, json);
node = rootNode;

formattedText = json.toString(4);
} catch (Exception e) {
log.trace(e.getMessage(), e);
}
}
if (formattedText == null && input.trim().startsWith("[")) {
try {
JsonArray json = JsonArray.parse(input);
DefaultMutableTreeNode rootNode = new DefaultMutableTreeNode(
"[]");
initTree(rootNode, json);
node = rootNode;

formattedText = json.toString(4);
} catch (Exception e) {
log.trace(e.getMessage(), e);
}
}

if (formattedText == null && !"".equals(formattedText)) {
if (input.trim().startsWith("<")) {
// try xml formatting
try {
doc = DocumentHelper.parseText(input);
node = initTree(doc);
formattedText = formatXml(doc);
} catch (DocumentException e) {
log.trace(e.getMessage(), e);
}
}
}
protected DocumentContainer doInBackground() throws Exception {
log.info("start parsing");

DocumentParser parser = new DocumentParser();
DocumentContainer document;
if (bytes != null) {
document = parser.parse(bytes);
} else {
document = parser.parse(input);
}
data.formattedText = formattedText;
data.treeNode = node;

return data;
log.info("done parsing");

return document;
}

@Override
protected void done() {
WorkerData data;
log.info("start of done");
DocumentContainer data;
try {
data = get();
} catch (InterruptedException | ExecutionException e) {
log.error(e.getMessage(), e);
return;
}

if (data.rawText != null) {
tabs.add("Raw Text", new JScrollPane(
new JTextArea(data.rawText)));
}
if (data.formattedText != null) {
tabs.add("Formatted", new JScrollPane(new JTextArea(
data.formattedText)));
log.info("setting formatted");
tabs.add("Formatted", data.formattedTextArea);
}

if (data.treeNode != null) {
log.info("setting tree");
JTree tree = new JTree(new DefaultTreeModel(data.treeNode));
tree.setBorder(BorderFactory.createEmptyBorder());
tree.setShowsRootHandles(true);
JScrollPane scroll = new JScrollPane(tree);
scroll.setBorder(BorderFactory.createEmptyBorder());
tabs.add("Tree View", scroll);
}
if (tabs.getTabCount() > 1) {
tabs.setSelectedIndex(1);
if (data.rawText != null && data.rawText.length() < MAX_TEXT_SIZE) {
log.info("setting raw: " + data.rawText.length());
tabs.add("Raw Text", data.rawTextArea);
}
}

private DefaultMutableTreeNode initTree(Document doc) {
Element rootEl = doc.getRootElement();
DefaultMutableTreeNode rootNode = createElementNodes(rootEl);
initTree(rootNode, rootEl);
return rootNode;
}

@SuppressWarnings("rawtypes")
private void initTree(DefaultMutableTreeNode root, Element element) {
for (Iterator i = element.elementIterator(); i.hasNext();) {
Element el = (Element) i.next();
DefaultMutableTreeNode tmp = createElementNodes(el);
if (tmp == null)
continue;
root.add(tmp);
initTree(tmp, el);

String txt = el.getTextTrim();
if (txt != null && !"".equals(txt)) {
DefaultMutableTreeNode txtNode = new DefaultMutableTreeNode(
txt);
tmp.add(txtNode);
}
}
}

@SuppressWarnings("rawtypes")
private DefaultMutableTreeNode createElementNodes(Element element) {
String name = element.getName();
if (name == null || "".equals(name))
return null;
DefaultMutableTreeNode ret = new DefaultMutableTreeNode(name);

for (Iterator i = element.attributeIterator(); i.hasNext();) {
Attribute attr = (Attribute) i.next();

DefaultMutableTreeNode tmp = new DefaultMutableTreeNode(
attr.getName() + " = " + attr.getText());
ret.add(tmp);
}
return ret;
}

private void initTree(DefaultMutableTreeNode top, JsonObject obj) {
for (String key : obj) {
JsonValue val = obj.get(key);
if (val.isJsonObject()) {
String name = String.format("%s: {%d}", key, val
.getJsonObject().size());
DefaultMutableTreeNode node = new DefaultMutableTreeNode(
name);
top.add(node);
initTree(node, val.getJsonObject());
} else if (val.isJsonArray()) {
String name = String.format("%s: [%d]", key, val
.getJsonArray().size());
DefaultMutableTreeNode node = new DefaultMutableTreeNode(
name);
top.add(node);
initTree(node, val.getJsonArray());
} else {
DefaultMutableTreeNode node = new DefaultMutableTreeNode(
key + "=" + val.toString());
top.add(node);
}
if (data.hex != null) {
log.info("setting hex");
tabs.add("Hex", data.hex);
}
}

private void initTree(DefaultMutableTreeNode top, JsonArray arr) {
int i = 0;
for (JsonValue val : arr) {
if (val.isJsonObject()) {
String name = String.format("%s: {%d}", String.valueOf(i),
val.getJsonObject().size());
DefaultMutableTreeNode node = new DefaultMutableTreeNode(
name);
top.add(node);
initTree(node, val.getJsonObject());
} else if (val.isJsonArray()) {
String name = String.format("%s: [%d]", i, val
.getJsonArray().size());
DefaultMutableTreeNode node = new DefaultMutableTreeNode(
name);
top.add(node);
initTree(node, val.getJsonArray());
} else {
DefaultMutableTreeNode node = new DefaultMutableTreeNode(
val.toString());
top.add(node);
}
i++;
}
log.info("end of done");
}

private String formatXml(Document doc) {
StringWriter out = new StringWriter();
try {
OutputFormat outformat = OutputFormat.createPrettyPrint();
outformat.setEncoding("UTF-8");
XMLWriter writer = new XMLWriter(out, outformat);
writer.write(doc);
writer.flush();
} catch (Exception e) {
}
return out.toString();
}
}

}
Loading

0 comments on commit b48132f

Please sign in to comment.