source: trunk/JFCMonitor/src/de/ugoe/cs/eventbench/jfcmonitor/JFCListener.java @ 421

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