17448 - size of AppLoginHistory's history list should be settable
authorDan Labrecque <Dan.Labrecque@oracle.com>
Wed, 24 Nov 2010 12:03:59 -0500
changeset 605 c5fc1a2832c4
parent 604 20d9acfeb7fb
child 606 4d7df244a2b6
17448 - size of AppLoginHistory's history list should be settable
usr/src/java/vpanels/client/org/opensolaris/os/vp/client/common/LoginHistoryManager.java
usr/src/java/vpanels/panel/org/opensolaris/os/vp/panel/common/LoginHistory.java
usr/src/java/vpanels/panel/org/opensolaris/os/vp/panel/swing/control/PanelFrameControl.java
--- 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) {