View Javadoc

1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    * 
9    *      http://www.apache.org/licenses/LICENSE-2.0
10   * 
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
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             // Create a dummy document to parse the file
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 }