source: trunk/quest-jfcmonitor/src/main/java/de/ugoe/cs/quest/jfcmonitor/JFCListener.java @ 825

Last change on this file since 825 was 825, checked in by sherbold, 12 years ago
  • changed name of quest-jfcmonitor package from de.ugoe.cs.eventbench.jfcmonitor to de.ugoe.cs.quest.jfcmonitor
  • Property svn:mime-type set to text/plain
File size: 5.6 KB
Line 
1
2package de.ugoe.cs.quest.jfcmonitor;
3
4import java.awt.AWTEvent;
5import java.awt.Component;
6import java.awt.event.AWTEventListener;
7import java.awt.event.FocusEvent;
8import java.awt.event.KeyEvent;
9import java.awt.event.MouseEvent;
10import java.io.IOException;
11import java.io.OutputStreamWriter;
12
13import de.ugoe.cs.util.StringTools;
14
15/**
16 * <p>
17 * This class implements monitoring of AWT and Swing mouse and keyboard events. Each of the events
18 * is written to an output stream.
19 * </p>
20 *
21 * @author Steffen Herbold
22 * @version 1.0
23 */
24public class JFCListener implements AWTEventListener {
25
26    /**
27     * <p>
28     * Writer for logging events.
29     * </p>
30     */
31    final private OutputStreamWriter outputWriter;
32
33    /**
34     * <p>
35     * Constructor. Creates a new JFCListener with a given {@link OutputStreamWriter}, where the
36     * monitored information is logged.
37     * </p>
38     *
39     * @param outputWriter
40     *            writer for the logged information
41     */
42    public JFCListener(OutputStreamWriter outputWriter) {
43        this.outputWriter = outputWriter;
44        try {
45            outputWriter.write("<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + StringTools.ENDLINE);
46            outputWriter.write("<sessions>" + StringTools.ENDLINE);
47        }
48        catch (IOException e) {
49            System.err.println("JFCMONITOR -- Failure writing to log: " + e.getMessage());
50        }
51    }
52
53    /**
54     * <p>
55     * Writes all received {@link MouseEvent}s and {@link KeyEvent}s to the {@link #outputWriter}.
56     * </p>
57     *
58     * @see java.awt.event.AWTEventListener#eventDispatched(java.awt.AWTEvent)
59     */
60    @Override
61    public void eventDispatched(AWTEvent event) {
62        StringBuilder builder = new StringBuilder();
63
64        if (event instanceof MouseEvent) {
65            if (!isMouseMovement(event.getID())) {
66                MouseEvent mouseEvent = (MouseEvent) event;
67                builder.append("<event id=\"" + event.getID() + "\">" + StringTools.ENDLINE);
68                builder.append(" <param name=\"X\" value=\"" + mouseEvent.getX() + "\" />" +
69                    StringTools.ENDLINE);
70                builder.append(" <param name=\"Y\" value=\"" + mouseEvent.getY() + "\" />" +
71                    StringTools.ENDLINE);
72                builder.append(" <param name=\"Button\" value=\"" + mouseEvent.getButton() +
73                    "\" />" + StringTools.ENDLINE);
74                builder.append(" <param name=\"Modifiers\" value=\"" + mouseEvent.getModifiers() +
75                    "\" />" + StringTools.ENDLINE);
76                addSourceInfo(builder, event);
77                builder.append("</event>" + StringTools.ENDLINE);
78            }
79        }
80        else if (event instanceof KeyEvent) {
81            if (event.getID() == KeyEvent.KEY_PRESSED || event.getID() == KeyEvent.KEY_RELEASED) {
82                KeyEvent keyEvent = (KeyEvent) event;
83                builder.append("<event id=\"" + event.getID() + "\">" + StringTools.ENDLINE);
84                builder.append(" <param name=\"KeyCode\" value=\"" + keyEvent.getKeyCode() +
85                    "\" />" + StringTools.ENDLINE);
86                builder.append(" <param name=\"Modifiers\" value=\"" + keyEvent.getModifiers() +
87                    "\" />" + StringTools.ENDLINE);
88                addSourceInfo(builder, event);
89                builder.append("</event>" + StringTools.ENDLINE);
90            }
91        }
92        else if (event instanceof FocusEvent) {
93            if (event.getID() == FocusEvent.FOCUS_GAINED) {
94                builder.append("<event id=\"" + event.getID() + "\">" + StringTools.ENDLINE);
95                addSourceInfo(builder, event);
96                builder.append("</event>" + StringTools.ENDLINE);
97            }
98        }
99        if (builder.length() > 0 && outputWriter != null) {
100            try {
101                outputWriter.write(builder.toString());
102                outputWriter.flush();
103            }
104            catch (IOException e) {
105                System.err.println("JFCMONITOR -- Failure writing to log: " + e.getMessage());
106            }
107        }
108    }
109
110    /**
111     * <p>
112     * Appends information about the event to a {@link StringBuilder}.
113     * </p>
114     *
115     * @param builder
116     *            {@link StringBuilder} where the information is appended
117     * @param event
118     *            event whose information is appended
119     */
120    private void addSourceInfo(StringBuilder builder, AWTEvent event) {
121        builder.append(" <source>" + StringTools.ENDLINE);
122        builder.append("  <param name=\"toString\" value=\"" +
123            StringTools.xmlEntityReplacement(event.getSource().toString()) + "\" />" +
124            StringTools.ENDLINE);
125        if (event.getSource() instanceof Component) {
126            Component source = (Component) event.getSource();
127            JFCComponent jfcComponent = JFCComponent.find(source);
128            if (jfcComponent != null) {
129                builder.append(jfcComponent.getXML());
130            }
131        }
132        builder.append(" </source>" + StringTools.ENDLINE);
133    }
134
135    /**
136     * <p>
137     * Checks if the Id of an {@link AWTEvent} is a mouse movement Id.
138     * </p>
139     *
140     * @param eventId
141     *            id of the {@link AWTEvent}
142     * @return true, if the event is a mouse movement event; false otherwise
143     */
144    private boolean isMouseMovement(int eventId) {
145        return eventId == MouseEvent.MOUSE_MOVED || eventId == MouseEvent.MOUSE_DRAGGED ||
146            eventId == MouseEvent.MOUSE_ENTERED || eventId == MouseEvent.MOUSE_EXITED;
147    }
148
149}
Note: See TracBrowser for help on using the repository browser.