usr/src/java/vpanels/client/org/opensolaris/os/vp/client/common/LoginHistoryManager.java
changeset 605 c5fc1a2832c4
parent 603 71a20acea802
child 651 eeb57de7d602
equal deleted inserted replaced
604:20d9acfeb7fb 605:c5fc1a2832c4
    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()) {