1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.log4j.chainsaw;
18
19 import java.awt.event.ActionEvent;
20 import java.io.File;
21 import java.io.IOException;
22 import java.io.StringReader;
23 import javax.swing.AbstractAction;
24 import javax.swing.JFileChooser;
25 import javax.swing.JFrame;
26 import javax.swing.JOptionPane;
27 import javax.xml.parsers.ParserConfigurationException;
28 import javax.xml.parsers.SAXParserFactory;
29 import org.apache.log4j.Logger;
30 import org.xml.sax.InputSource;
31 import org.xml.sax.SAXException;
32 import org.xml.sax.XMLReader;
33
34 /***
35 * Encapsulates the action to load an XML file.
36 *
37 * @author <a href="mailto:oliver@puppycrawl.com">Oliver Burn</a>
38 * @version 1.0
39 */
40 class LoadXMLAction
41 extends AbstractAction
42 {
43 /*** use to log messages **/
44 private static final Logger LOG = Logger.getLogger(LoadXMLAction.class);
45
46 /*** the parent frame **/
47 private final JFrame mParent;
48
49 /***
50 * the file chooser - configured to allow only the selection of a
51 * single file.
52 */
53 private final JFileChooser mChooser = new JFileChooser();
54 {
55 mChooser.setMultiSelectionEnabled(false);
56 mChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
57 }
58
59 /*** parser to read XML files **/
60 private final XMLReader mParser;
61 /*** the content handler **/
62 private final XMLFileHandler mHandler;
63
64
65 /***
66 * Creates a new <code>LoadXMLAction</code> instance.
67 *
68 * @param aParent the parent frame
69 * @param aModel the model to add events to
70 * @exception SAXException if an error occurs
71 * @throws ParserConfigurationException if an error occurs
72 */
73 LoadXMLAction(JFrame aParent, MyTableModel aModel)
74 throws SAXException, ParserConfigurationException
75 {
76 mParent = aParent;
77 mHandler = new XMLFileHandler(aModel);
78 mParser = SAXParserFactory.newInstance().newSAXParser().getXMLReader();
79 mParser.setContentHandler(mHandler);
80 }
81
82 /***
83 * Prompts the user for a file to load events from.
84 * @param aIgnore an <code>ActionEvent</code> value
85 */
86 public void actionPerformed(ActionEvent aIgnore) {
87 LOG.info("load file called");
88 if (mChooser.showOpenDialog(mParent) == JFileChooser.APPROVE_OPTION) {
89 LOG.info("Need to load a file");
90 final File chosen = mChooser.getSelectedFile();
91 LOG.info("loading the contents of " + chosen.getAbsolutePath());
92 try {
93 final int num = loadFile(chosen.getAbsolutePath());
94 JOptionPane.showMessageDialog(
95 mParent,
96 "Loaded " + num + " events.",
97 "CHAINSAW",
98 JOptionPane.INFORMATION_MESSAGE);
99 } catch (Exception e) {
100 LOG.warn("caught an exception loading the file", e);
101 JOptionPane.showMessageDialog(
102 mParent,
103 "Error parsing file - " + e.getMessage(),
104 "CHAINSAW",
105 JOptionPane.ERROR_MESSAGE);
106 }
107 }
108 }
109
110 /***
111 * Loads the contents of file into the model
112 *
113 * @param aFile the file to extract events from
114 * @return the number of events loaded
115 * @throws SAXException if an error occurs
116 * @throws IOException if an error occurs
117 */
118 private int loadFile(String aFile)
119 throws SAXException, IOException
120 {
121 synchronized (mParser) {
122
123 final StringBuffer buf = new StringBuffer();
124 buf.append("<?xml version=\"1.0\" standalone=\"yes\"?>\n");
125 buf.append("<!DOCTYPE log4j:eventSet ");
126 buf.append("[<!ENTITY data SYSTEM \"file:///");
127 buf.append(aFile);
128 buf.append("\">]>\n");
129 buf.append("<log4j:eventSet xmlns:log4j=\"Claira\">\n");
130 buf.append("&data;\n");
131 buf.append("</log4j:eventSet>\n");
132
133 final InputSource is =
134 new InputSource(new StringReader(buf.toString()));
135 mParser.parse(is);
136 return mHandler.getNumEvents();
137 }
138 }
139 }