42 // |
42 // |
43 |
43 |
44 // Used to format logins as host:user:role |
44 // Used to format logins as host:user:role |
45 private static final String LOGIN_DELIMITER = ":"; |
45 private static final String LOGIN_DELIMITER = ":"; |
46 |
46 |
|
47 // Default login history size. |
|
48 private static final int LOGIN_SIZE = 256; |
|
49 |
|
50 // Login history size. |
|
51 private int loginSize; |
|
52 |
47 // File used to persist login history. |
53 // File used to persist login history. |
48 private File loginFile; |
54 private File loginFile; |
49 |
55 |
50 // The size of persisted login history. |
56 // List used to maintain login history. |
51 // Note: Current login not displayed. |
57 private LinkedList<LoginInfo> logins = new LinkedList<LoginInfo>(); |
52 private static final int LOGINS_SIZE = 6; |
|
53 |
|
54 // Array used to maintain login history. |
|
55 private Stack<LoginInfo> logins = new Stack<LoginInfo>(); |
|
56 |
58 |
57 // ConnectionManager used for logins. |
59 // ConnectionManager used for logins. |
58 private ConnectionManager connManager = null; |
60 private ConnectionManager connManager = null; |
59 |
61 |
60 // login history listeners. |
62 // login history listeners. |
91 // |
93 // |
92 |
94 |
93 /** |
95 /** |
94 * Create an instance of this class. |
96 * Create an instance of this class. |
95 * |
97 * |
96 * @param connManager The {@code ConnectionManager} associated with logins. |
98 * @param manager The {@code ConnectionManager} associated with logins. |
97 * @param loginFile The {@code File} used to persist login history. |
99 * @param file The {@code File} used to persist login history. |
98 */ |
100 */ |
99 public LoginHistoryManager(ConnectionManager connManager, File loginFile) { |
101 public LoginHistoryManager(ConnectionManager manager, File file) { |
100 this.loginFile = loginFile; |
102 this(manager, file, LOGIN_SIZE); |
101 this.connManager = connManager; |
103 } |
|
104 |
|
105 /** |
|
106 * Create an instance of this class. |
|
107 * |
|
108 * @param manager The {@code ConnectionManager} associated with logins. |
|
109 * @param file The {@code File} used to persist login history. |
|
110 * @param size The size of the persisted login history. |
|
111 */ |
|
112 public LoginHistoryManager(ConnectionManager manager, File file, int size) { |
|
113 loginFile = file; |
|
114 connManager = manager; |
102 connManager.addConnectionListListener(connListener); |
115 connManager.addConnectionListListener(connListener); |
|
116 setSize(size); |
103 readLogins(); |
117 readLogins(); |
104 } |
118 } |
105 |
119 |
106 // |
120 // |
107 // LoginHistory methods |
121 // LoginHistory methods |
117 @Override |
131 @Override |
118 public List<LoginInfo> getLogins() { |
132 public List<LoginInfo> getLogins() { |
119 return new ArrayList<LoginInfo>(logins); |
133 return new ArrayList<LoginInfo>(logins); |
120 } |
134 } |
121 |
135 |
122 // |
136 @Override |
123 // LoginHistoryManager methods |
137 public List<LoginInfo> getLogins(int size) { |
124 // |
138 List<LoginInfo> list = getLogins(); |
125 |
139 try { |
126 /** |
140 return list.subList(0, size); |
127 * Adds a {@code ChangeListener} to be notified upon changes in state. |
141 } catch (IndexOutOfBoundsException e) { |
128 */ |
142 return list; |
|
143 } |
|
144 } |
|
145 |
|
146 @Override |
129 public void addChangeListener(ChangeListener listener) { |
147 public void addChangeListener(ChangeListener listener) { |
130 listeners.add(listener); |
148 listeners.add(listener); |
131 } |
149 } |
132 |
150 |
133 /** |
151 @Override |
134 * Removes a {@code ChangeListener} from notification. |
|
135 */ |
|
136 public void removeChangeListener(ChangeListener listener) { |
152 public void removeChangeListener(ChangeListener listener) { |
137 listeners.remove(listener); |
153 listeners.remove(listener); |
|
154 } |
|
155 |
|
156 // |
|
157 // LoginHistoryManager methods |
|
158 // |
|
159 |
|
160 /** |
|
161 * Get the size of persisted login history. |
|
162 */ |
|
163 public int getSize() { |
|
164 return loginSize; |
|
165 } |
|
166 |
|
167 /** |
|
168 * Set the size of persisted login history. If size is negative, the default |
|
169 * size shall be used. |
|
170 * |
|
171 * @param size The login history size. |
|
172 */ |
|
173 public void setSize(int size) { |
|
174 loginSize = (size < 0) ? LOGIN_SIZE : size; |
|
175 |
|
176 if (logins.size() > loginSize) { |
|
177 for (int i = logins.size() - 1; i >= loginSize; i--) { |
|
178 logins.remove(i); |
|
179 } |
|
180 writeLogins(); |
|
181 fireStateChanged(); |
|
182 } |
138 } |
183 } |
139 |
184 |
140 // |
185 // |
141 // Private methods |
186 // Private methods |
142 // |
187 // |
143 |
188 |
144 // Add logins in FIFO order. |
189 // Add logins in FIFO order. |
145 private void addLogin(LoginInfo info) { |
190 private void addLogin(LoginInfo info) { |
146 removeLogin(info); |
191 removeLogin(info); |
147 logins.insertElementAt(info, 0); |
192 logins.addFirst(info); |
148 if (logins.size() > LOGINS_SIZE) { |
193 if (logins.size() > loginSize) { |
149 logins.remove(LOGINS_SIZE - 1); |
194 logins.removeLast(); |
150 } |
195 } |
151 } |
196 } |
152 |
197 |
153 // Fire property change event. |
198 // Fire property change event. |
154 private void fireStateChanged() { |
199 private void fireStateChanged() { |
156 } |
201 } |
157 |
202 |
158 // Push logins in LIFO order. |
203 // Push logins in LIFO order. |
159 private void pushLogin(LoginInfo info) { |
204 private void pushLogin(LoginInfo info) { |
160 removeLogin(info); |
205 removeLogin(info); |
161 logins.push(info); |
206 logins.addLast(info); |
162 if (logins.size() > LOGINS_SIZE) { |
207 if (logins.size() > loginSize) { |
163 logins.remove(0); |
208 logins.removeFirst(); |
164 } |
209 } |
165 } |
210 } |
166 |
211 |
167 // Remove existing login. |
212 // Remove existing login. |
168 private void removeLogin(LoginInfo info) { |
213 private void removeLogin(LoginInfo info) { |
169 for (int i = 0; i < logins.size(); i++) { |
214 for (int i = 0; i < logins.size(); i++) { |
170 LoginInfo login = logins.elementAt(i); |
215 LoginInfo login = logins.get(i); |
171 if (info.matches(login)) { |
216 if (info.matches(login)) { |
172 logins.removeElementAt(i); |
217 logins.remove(i); |
173 return; |
218 return; |
174 } |
219 } |
175 } |
220 } |
176 } |
221 } |
177 |
222 |
192 |
237 |
193 int i = 0; |
238 int i = 0; |
194 String line = null; |
239 String line = null; |
195 |
240 |
196 // Read login history |
241 // Read login history |
197 while ((line = reader.readLine()) != null |
242 while ((line = reader.readLine()) != null && i < loginSize) { |
198 && i < LOGINS_SIZE) { |
|
199 StringTokenizer st = new StringTokenizer(line, LOGIN_DELIMITER); |
243 StringTokenizer st = new StringTokenizer(line, LOGIN_DELIMITER); |
200 |
244 |
201 // Login history formated as host:user:role |
245 // Login history formated as host:user:role |
202 String host = null; |
246 String host = null; |
203 if (st.hasMoreTokens()) { |
247 if (st.hasMoreTokens()) { |