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

Last change on this file since 354 was 354, checked in by sherbold, 12 years ago
  • code documentation
  • Property svn:mime-type set to text/plain
File size: 6.1 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.KeyEvent;
7import java.awt.event.MouseEvent;
8import java.io.IOException;
9import java.io.OutputStreamWriter;
10import java.lang.reflect.InvocationTargetException;
11import java.lang.reflect.Method;
12
13import de.ugoe.cs.util.StringTools;
14
15/**
16 * <p>
17 * This class implements monitoring of AWT and Swing mouse and keyboard events.
18 * Each of the events 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         * Convenience variable.
29         * </p>
30         */
31        final static private String ENDLINE = System.getProperty("line.separator");
32
33        /**
34         * <p>
35         * Writer for logging events.
36         * </p>
37         */
38        final private OutputStreamWriter outputWriter;
39
40        /**
41         * <p>
42         * Constructor. Creates a new JFCListener with a given
43         * {@link OutputStreamWriter}, where the monitored information is logged.
44         * </p>
45         *
46         * @param outputWriter
47         *            writer for the logged information
48         */
49        public JFCListener(OutputStreamWriter outputWriter) {
50                this.outputWriter = outputWriter;
51                try {
52                        outputWriter.write("<?xml version=\"1.0\" encoding=\"UTF-16\"?>"
53                                        + ENDLINE);
54                        outputWriter.write("<sessions>" + ENDLINE);
55                } catch (IOException e) {
56                        System.err.println("JFCMONITOR -- Failure writing to log: "
57                                        + e.getMessage());
58                }
59        }
60
61        /**
62         * <p>
63         * Writes all received {@link MouseEvent}s and {@link KeyEvent}s to the
64         * {@link #outputWriter}.
65         * </p>
66         *
67         * @see java.awt.event.AWTEventListener#eventDispatched(java.awt.AWTEvent)
68         */
69        @Override
70        public void eventDispatched(AWTEvent event) {
71                StringBuilder builder = new StringBuilder();
72
73                if (event instanceof MouseEvent) {
74                        MouseEvent mouseEvent = (MouseEvent) event;
75                        if (!isMouseMovement(event.getID())) {
76                                builder.append("<event id=\"" + event.getID() + "\">" + ENDLINE);
77                                builder.append(" <param name=\"X\" value=\""
78                                                + mouseEvent.getX() + "\" />" + ENDLINE);
79                                builder.append(" <param name=\"Y\" value=\""
80                                                + mouseEvent.getY() + "\" />" + ENDLINE);
81                                builder.append(" <param name=\"Button\" value=\""
82                                                + mouseEvent.getButton() + "\" />" + ENDLINE);
83                                builder.append(" <param name=\"Modifiers\" value=\""
84                                                + mouseEvent.getModifiers() + "\" />" + ENDLINE);
85                                addSourceInfo(builder, event);
86                                builder.append("</event>" + ENDLINE);
87                        }
88                }
89                if (event instanceof KeyEvent) {
90                        KeyEvent keyEvent = (KeyEvent) event;
91                        if (keyEvent.getID() == KeyEvent.KEY_TYPED) {
92                                builder.append("<event id=\"" + event.getID() + "\">" + ENDLINE);
93                                builder.append(" <param name=\"KeyCode\" value=\""
94                                                + keyEvent.getKeyCode() + "\" />" + ENDLINE);
95                                builder.append(" <param name=\"Modifiers\" value=\""
96                                                + keyEvent.getModifiers() + "\" />" + ENDLINE);
97                                addSourceInfo(builder, event);
98                                builder.append("</event>" + ENDLINE);
99                        }
100                }
101                if (builder.length() > 0 && outputWriter != null) {
102                        try {
103                                outputWriter.write(builder.toString());
104                                outputWriter.flush();
105                        } catch (IOException e) {
106                                System.err.println("JFCMONITOR -- Failure writing to log: "
107                                                + e.getMessage());
108                        }
109                }
110        }
111
112        /**
113         * <p>
114         * Appends information about the event to a {@link StringBuilder}.
115         * </p>
116         *
117         * @param builder
118         *            {@link StringBuilder} where the information is appended
119         * @param event
120         *            event whose information is appended
121         */
122        private void addSourceInfo(StringBuilder builder, AWTEvent event) {
123                builder.append(" <source>" + ENDLINE);
124                builder.append("  <param name=\"toString\" value=\""
125                                + StringTools
126                                                .xmlEntityReplacement(event.getSource().toString())
127                                + "\" />" + ENDLINE);
128                if (event.getSource() instanceof Component) {
129                        Component source = (Component) event.getSource();
130                        addComponentInfo(builder, source);
131                        builder.append(" <parent>" + ENDLINE);
132                        addComponentInfo(builder, source.getParent());
133                        builder.append(" </parent>" + ENDLINE);
134                }
135                builder.append(" </source>" + ENDLINE);
136        }
137
138        /**
139         * <p>
140         * Appends information about the component to the a {@link StringBuilder}.
141         * The prefix can be used to give further information about the component.
142         * </p>
143         *
144         * @param builder
145         *            {@link StringBuilder} where the information is appended
146         * @param component
147         *            component whose information is appended
148         */
149        private void addComponentInfo(StringBuilder builder, Component component) {
150                builder.append("  <param name=\"getName\" value=\""
151                                + StringTools.xmlEntityReplacement(component.getName())
152                                + "\" />" + ENDLINE);
153                for (Method method : component.getClass().getMethods()) {
154                        try {
155                                if (method.getName() == "getText") {
156                                        String text = (String) method.invoke(component,
157                                                        new Object[] {});
158                                        if (text != null) {
159                                                builder.append("  <param name=\"getText\" value=\""
160                                                                + StringTools.xmlEntityReplacement(text)
161                                                                + "\" />" + ENDLINE);
162                                        }
163                                }
164                                if (method.getName() == "getTitle") {
165                                        String title = (String) method.invoke(component,
166                                                        new Object[] {});
167                                        if (title != null) {
168                                                builder.append("  <param name=\"getTitle\" value=\""
169                                                                + StringTools.xmlEntityReplacement(title)
170                                                                + "\" />" + ENDLINE);
171                                        }
172                                }
173                        } catch (IllegalArgumentException e) {
174                        } catch (IllegalAccessException e) {
175                        } catch (InvocationTargetException e) {
176                                System.err.println("Found method with name " + method.getName()
177                                                + " but could not access it.");
178                        }
179                }
180        }
181
182        /**
183         * <p>
184         * Checks if the Id of an {@link AWTEvent} is a mouse movement Id.
185         * </p>
186         *
187         * @param eventId
188         *            id of the {@link AWTEvent}
189         * @return true, if the event is a mouse movement event; false otherwise
190         */
191        private boolean isMouseMovement(int eventId) {
192                return eventId == MouseEvent.MOUSE_MOVED
193                                || eventId == MouseEvent.MOUSE_DRAGGED
194                                || eventId == MouseEvent.MOUSE_ENTERED
195                                || eventId == MouseEvent.MOUSE_EXITED;
196        }
197
198}
Note: See TracBrowser for help on using the repository browser.