/plugins/XML/tags/release-0-1/XmlDaemon.java

# · Java · 171 lines · 123 code · 26 blank · 22 comment · 9 complexity · abda260c84ded2bd082696f592c89137 MD5 · raw file

  1. /*
  2. * XmlDaemon.java
  3. * Copyright (C) 2000 Slava Pestov
  4. *
  5. * This program is free software; you can redistribute it and/or
  6. * modify it under the terms of the GNU General Public License
  7. * as published by the Free Software Foundation; either version 2
  8. * of the License, or any later version.
  9. *
  10. * This program is distributed in the hope that it will be useful,
  11. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. * GNU General Public License for more details.
  14. *
  15. * You should have received a copy of the GNU General Public License
  16. * along with this program; if not, write to the Free Software
  17. * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  18. */
  19. import com.microstar.xml.*;
  20. import javax.swing.text.BadLocationException;
  21. import javax.swing.tree.*;
  22. import javax.swing.SwingUtilities;
  23. import java.io.StringReader;
  24. import java.util.Stack;
  25. import org.gjt.sp.jedit.*;
  26. import org.gjt.sp.util.Log;
  27. public class XmlDaemon extends Thread
  28. {
  29. public XmlDaemon(Buffer buffer)
  30. {
  31. super("XML parser thread");
  32. this.buffer = buffer;
  33. root = new DefaultMutableTreeNode(buffer.getName());
  34. model = new DefaultTreeModel(root);
  35. try
  36. {
  37. text = buffer.getText(0,buffer.getLength());
  38. }
  39. catch(BadLocationException ble)
  40. {
  41. Log.log(Log.ERROR,this,ble);
  42. return;
  43. }
  44. }
  45. public void run()
  46. {
  47. parse();
  48. SwingUtilities.invokeLater(new Runnable()
  49. {
  50. public void run()
  51. {
  52. model.reload(root);
  53. EditBus.send(new XmlTreeParsed(buffer,model));
  54. }
  55. });
  56. XmlPlugin.daemonFinished();
  57. }
  58. // private members
  59. private Buffer buffer;
  60. private String text;
  61. private DefaultTreeModel model;
  62. private DefaultMutableTreeNode root;
  63. private XmlParser parser;
  64. private void parse()
  65. {
  66. parser = new XmlParser();
  67. parser.setHandler(new Handler());
  68. try
  69. {
  70. parser.parse(null,null,new StringReader(text));
  71. }
  72. catch(Exception e)
  73. {
  74. XmlPlugin.addError(buffer.getPath(),0,e.toString());
  75. //Log.log(Log.ERROR,this,e);
  76. }
  77. }
  78. class Handler extends HandlerBase
  79. {
  80. Stack currentNodeStack = new Stack();
  81. public void startElement(String name) throws Exception
  82. {
  83. int line = parser.getLineNumber() - 1;
  84. int column = parser.getColumnNumber() - 1;
  85. int offset = buffer.getDefaultRootElement()
  86. .getElement(line).getStartOffset() + column;
  87. offset = findTagStart(offset);
  88. DefaultMutableTreeNode newNode = new DefaultMutableTreeNode(
  89. new XmlTag(name,buffer.createPosition(offset)));
  90. if(!currentNodeStack.isEmpty())
  91. {
  92. DefaultMutableTreeNode node = (DefaultMutableTreeNode)
  93. currentNodeStack.peek();
  94. node.insert(newNode,node.getChildCount());
  95. }
  96. else
  97. root.insert(newNode,0);
  98. currentNodeStack.push(newNode);
  99. }
  100. public void endElement(String name) throws Exception
  101. {
  102. DefaultMutableTreeNode node = (DefaultMutableTreeNode)
  103. currentNodeStack.peek();
  104. XmlTag tag = (XmlTag)node.getUserObject();
  105. int line = parser.getLineNumber() - 1;
  106. int column = parser.getColumnNumber() - 1;
  107. int offset = buffer.getDefaultRootElement()
  108. .getElement(line).getStartOffset() + column;
  109. offset = findTagEnd(offset);
  110. tag.end = buffer.createPosition(offset);
  111. currentNodeStack.pop();
  112. }
  113. public void error(String message, String systemId, int line, int column)
  114. {
  115. if(systemId == null)
  116. systemId = buffer.getPath();
  117. XmlPlugin.addError(systemId,line - 1,message);
  118. }
  119. public Object resolveEntity(String publicId, String systemId)
  120. throws java.lang.Exception
  121. {
  122. // hack
  123. return new StringReader("<!-- yo -->");
  124. }
  125. // private members
  126. private int findTagStart(int offset)
  127. {
  128. for(int i = offset; i >= 0; i--)
  129. {
  130. if(text.charAt(i) == '<')
  131. return i;
  132. }
  133. return 0;
  134. }
  135. private int findTagEnd(int offset)
  136. {
  137. for(int i = offset; i < text.length(); i++)
  138. {
  139. if(text.charAt(i) == '>')
  140. return i + 1;
  141. }
  142. return 0;
  143. }
  144. }
  145. }