package nbtool.gui.logviews.proto; import java.awt.Dimension; import java.util.List; import java.util.Map; import javax.swing.JScrollPane; import javax.swing.JTree; import javax.swing.tree.DefaultMutableTreeNode; import com.google.protobuf.Descriptors.FieldDescriptor; import com.google.protobuf.Message; import nbtool.data.log.Log; import nbtool.util.Debug; import nbtool.util.Utility; public final class ProtoBufView extends nbtool.gui.logviews.misc.ViewParent { private static final long serialVersionUID = 1; @Override public void setupDisplay() { String t = displayedLog.blocks.get(0).type; Class<? extends com.google.protobuf.Message> lClass = Utility.protobufClassFromType(t); Debug.info( "ProtoBufView: using class %s for type %s.\n", lClass.getName(), t); com.google.protobuf.Message msg = displayedLog.blocks.get(0).parseAsProtobufOfClass(lClass); Map<FieldDescriptor, Object> fields = msg.getAllFields(); DefaultMutableTreeNode root = new DefaultMutableTreeNode(msg.getClass().getSimpleName()); for (Map.Entry<FieldDescriptor, Object> entry : fields.entrySet()) { int index = 0; if (entry.getKey().isRepeated()) { List<Object> values = (List<Object>) entry.getValue(); for (Object v : values) { root.add(treeNodeForFD(index++, entry.getKey(), v)); } } else root.add(treeNodeForFD(index++, entry.getKey(), entry.getValue())); } tree = new JTree(root); sp = new JScrollPane(tree); sp.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); sp.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); add(sp); /* try { messages.ParticleSwarmOuterClass.ParticleSwarm p = messages.ParticleSwarmOuterClass.ParticleSwarm.parseFrom(newlog.bytes); } catch (InvalidProtocolBufferException e) { // TODO Auto-generated catch block e.printStackTrace(); } */ } @Override public String[] displayableTypes() { return new String[]{}; } public static Boolean shouldLoadInParallel() {return true;} public ProtoBufView() { super(); sp = null; tree = null; } protected void useSize(Dimension s) { if (sp != null && tree != null) { sp.setBounds(0, 0, s.width, s.height); } } private DefaultMutableTreeNode treeNodeForFD(int index, FieldDescriptor fd, Object val) { //Must assume not repeating. DefaultMutableTreeNode ret = null; if (fd.getJavaType() == FieldDescriptor.JavaType.MESSAGE) { ret = new DefaultMutableTreeNode(index +":" + fd.getName()); Message msg = (Message) val; for (Map.Entry<FieldDescriptor, Object> entry : msg.getAllFields().entrySet()) { int i = 0; if (entry.getKey().isRepeated()) { List<Object> values = (List<Object>) entry.getValue(); for (Object v : values) { ret.add(treeNodeForFD(i++, entry.getKey(), v)); } } else ret.add(treeNodeForFD(i++, entry.getKey(), entry.getValue())); } } else { //leaf ret = new DefaultMutableTreeNode(index +":" + fd.getName() + ":" + val.toString()); } return ret; } private JScrollPane sp; private JTree tree; }