--- a/usr/src/java/vpanels/client/org/opensolaris/os/vp/client/common/LoginHistoryManager.java Tue Nov 23 15:54:20 2010 -0800
+++ b/usr/src/java/vpanels/client/org/opensolaris/os/vp/client/common/LoginHistoryManager.java Wed Nov 24 12:03:59 2010 -0500
@@ -44,15 +44,17 @@
// Used to format logins as host:user:role
private static final String LOGIN_DELIMITER = ":";
+ // Default login history size.
+ private static final int LOGIN_SIZE = 256;
+
+ // Login history size.
+ private int loginSize;
+
// File used to persist login history.
private File loginFile;
- // The size of persisted login history.
- // Note: Current login not displayed.
- private static final int LOGINS_SIZE = 6;
-
- // Array used to maintain login history.
- private Stack<LoginInfo> logins = new Stack<LoginInfo>();
+ // List used to maintain login history.
+ private LinkedList<LoginInfo> logins = new LinkedList<LoginInfo>();
// ConnectionManager used for logins.
private ConnectionManager connManager = null;
@@ -93,13 +95,25 @@
/**
* Create an instance of this class.
*
- * @param connManager The {@code ConnectionManager} associated with logins.
- * @param loginFile The {@code File} used to persist login history.
+ * @param manager The {@code ConnectionManager} associated with logins.
+ * @param file The {@code File} used to persist login history.
*/
- public LoginHistoryManager(ConnectionManager connManager, File loginFile) {
- this.loginFile = loginFile;
- this.connManager = connManager;
+ public LoginHistoryManager(ConnectionManager manager, File file) {
+ this(manager, file, LOGIN_SIZE);
+ }
+
+ /**
+ * Create an instance of this class.
+ *
+ * @param manager The {@code ConnectionManager} associated with logins.
+ * @param file The {@code File} used to persist login history.
+ * @param size The size of the persisted login history.
+ */
+ public LoginHistoryManager(ConnectionManager manager, File file, int size) {
+ loginFile = file;
+ connManager = manager;
connManager.addConnectionListListener(connListener);
+ setSize(size);
readLogins();
}
@@ -119,22 +133,53 @@
return new ArrayList<LoginInfo>(logins);
}
+ @Override
+ public List<LoginInfo> getLogins(int size) {
+ List<LoginInfo> list = getLogins();
+ try {
+ return list.subList(0, size);
+ } catch (IndexOutOfBoundsException e) {
+ return list;
+ }
+ }
+
+ @Override
+ public void addChangeListener(ChangeListener listener) {
+ listeners.add(listener);
+ }
+
+ @Override
+ public void removeChangeListener(ChangeListener listener) {
+ listeners.remove(listener);
+ }
+
//
// LoginHistoryManager methods
//
/**
- * Adds a {@code ChangeListener} to be notified upon changes in state.
+ * Get the size of persisted login history.
*/
- public void addChangeListener(ChangeListener listener) {
- listeners.add(listener);
+ public int getSize() {
+ return loginSize;
}
/**
- * Removes a {@code ChangeListener} from notification.
+ * Set the size of persisted login history. If size is negative, the default
+ * size shall be used.
+ *
+ * @param size The login history size.
*/
- public void removeChangeListener(ChangeListener listener) {
- listeners.remove(listener);
+ public void setSize(int size) {
+ loginSize = (size < 0) ? LOGIN_SIZE : size;
+
+ if (logins.size() > loginSize) {
+ for (int i = logins.size() - 1; i >= loginSize; i--) {
+ logins.remove(i);
+ }
+ writeLogins();
+ fireStateChanged();
+ }
}
//
@@ -144,9 +189,9 @@
// Add logins in FIFO order.
private void addLogin(LoginInfo info) {
removeLogin(info);
- logins.insertElementAt(info, 0);
- if (logins.size() > LOGINS_SIZE) {
- logins.remove(LOGINS_SIZE - 1);
+ logins.addFirst(info);
+ if (logins.size() > loginSize) {
+ logins.removeLast();
}
}
@@ -158,18 +203,18 @@
// Push logins in LIFO order.
private void pushLogin(LoginInfo info) {
removeLogin(info);
- logins.push(info);
- if (logins.size() > LOGINS_SIZE) {
- logins.remove(0);
+ logins.addLast(info);
+ if (logins.size() > loginSize) {
+ logins.removeFirst();
}
}
// Remove existing login.
private void removeLogin(LoginInfo info) {
for (int i = 0; i < logins.size(); i++) {
- LoginInfo login = logins.elementAt(i);
+ LoginInfo login = logins.get(i);
if (info.matches(login)) {
- logins.removeElementAt(i);
+ logins.remove(i);
return;
}
}
@@ -194,8 +239,7 @@
String line = null;
// Read login history
- while ((line = reader.readLine()) != null
- && i < LOGINS_SIZE) {
+ while ((line = reader.readLine()) != null && i < loginSize) {
StringTokenizer st = new StringTokenizer(line, LOGIN_DELIMITER);
// Login history formated as host:user:role
--- a/usr/src/java/vpanels/panel/org/opensolaris/os/vp/panel/common/LoginHistory.java Tue Nov 23 15:54:20 2010 -0800
+++ b/usr/src/java/vpanels/panel/org/opensolaris/os/vp/panel/common/LoginHistory.java Wed Nov 24 12:03:59 2010 -0500
@@ -45,12 +45,24 @@
public List<LoginInfo> getLogins();
/**
+ * Gets a list of {@code LoginInfo} objects.
+ *
+ * @param size The number of most recently used {@code LoginInfo} objects
+ * to return.
+ */
+ public List<LoginInfo> getLogins(int size);
+
+ /**
* Adds a {@code ChangeListener} to be notified upon changes in state.
+ *
+ * @param listener The {@code ChangeListener} to add.
*/
public void addChangeListener(ChangeListener listener);
/**
* Removes a {@code ChangeListener} from notification.
+ *
+ * @param listener The {@code ChangeListener} to remove.
*/
public void removeChangeListener(ChangeListener listener);
}
--- a/usr/src/java/vpanels/panel/org/opensolaris/os/vp/panel/swing/control/PanelFrameControl.java Tue Nov 23 15:54:20 2010 -0800
+++ b/usr/src/java/vpanels/panel/org/opensolaris/os/vp/panel/swing/control/PanelFrameControl.java Wed Nov 24 12:03:59 2010 -0500
@@ -59,6 +59,9 @@
// Login menu item count.
private int loginItemCount = 0;
+ // Login history size.
+ private int loginSize = 6;
+
private String title;
private ConnectionListener connListener =
@@ -349,7 +352,7 @@
*/
protected void createLoginItems() {
ClientContext context = getClientContext();
- List<LoginInfo> logins = context.getLoginHistory().getLogins();
+ List<LoginInfo> logins = context.getLoginHistory().getLogins(loginSize);
// Remove existing login menu items.
while (loginItemCount > 0) {