17449 AppLoginHistory's factory method ignores its argument at times
authorDan Labrecque <Dan.Labrecque@oracle.com>
Mon, 22 Nov 2010 10:50:58 -0500
changeset 603 71a20acea802
parent 602 c60ad6a81113
child 604 20d9acfeb7fb
17449 AppLoginHistory's factory method ignores its argument at times 17450 AppLoginHistory instance should not belong to the AppInstance class 17451 AppLoginHistory is too narrowly packaged
usr/src/java/vpanels/client/org/opensolaris/os/vp/client/common/LoginHistoryManager.java
usr/src/java/vpanels/client/org/opensolaris/os/vp/client/swing/App.java
usr/src/java/vpanels/client/org/opensolaris/os/vp/client/swing/AppInstance.java
usr/src/java/vpanels/client/org/opensolaris/os/vp/client/swing/AppLoginHistory.java
usr/src/java/vpanels/panel/org/opensolaris/os/vp/panel/common/ConnectionInfo.java
usr/src/java/vpanels/panel/org/opensolaris/os/vp/panel/common/LoginHistory.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/usr/src/java/vpanels/client/org/opensolaris/os/vp/client/common/LoginHistoryManager.java	Mon Nov 22 10:50:58 2010 -0500
@@ -0,0 +1,269 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+
+/*
+ * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ */
+
+package org.opensolaris.os.vp.client.common;
+
+import java.beans.*;
+import java.io.*;
+import java.net.*;
+import java.util.*;
+import java.util.logging.*;
+import javax.swing.event.*;
+import org.opensolaris.os.vp.client.common.ConnectionManager;
+import org.opensolaris.os.vp.panel.common.*;
+import org.opensolaris.os.vp.util.misc.NetUtil;
+import org.opensolaris.os.vp.util.swing.event.ChangeListeners;
+
+public class LoginHistoryManager implements LoginHistory {
+    //
+    // Instance data
+    //
+
+    // Used to format logins as host:user:role
+    private static final String LOGIN_DELIMITER = ":";
+
+    // 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>();
+
+    // ConnectionManager used for logins.
+    private ConnectionManager connManager = null;
+
+    // login history listeners.
+    private ChangeListeners listeners = new ChangeListeners();
+
+    // ConnectionManager listener.
+    private ConnectionListListener connListener =
+	new ConnectionListListener() {
+	    @Override
+	    public void connectionRemoved(ConnectionEvent event) {
+		// Nothing to do here.
+	    }
+
+	    @Override
+	    public void connectionAdded(ConnectionEvent event) {
+		connectionChanged(event);
+	    }
+
+	    @Override
+	    public void connectionSelected(ConnectionEvent event) {
+		connectionChanged(event);
+	    }
+
+	    private void connectionChanged(ConnectionEvent event) {
+		LoginInfo info = (LoginInfo) event.getConnectionInfo();
+		addLogin(info);
+		writeLogins();
+		fireStateChanged();
+	    }
+	};
+
+    //
+    // Constructors
+    //
+
+    /**
+     * Create an instance of this class.
+     *
+     * @param connManager The {@code ConnectionManager} associated with logins.
+     * @param loginFile The {@code File} used to persist login history.
+     */
+    public LoginHistoryManager(ConnectionManager connManager, File loginFile) {
+        this.loginFile = loginFile;
+	this.connManager = connManager;
+	connManager.addConnectionListListener(connListener);
+	readLogins();
+    }
+
+    //
+    // LoginHistory methods
+    //
+
+    @Override
+    public void clearLogins() {
+	logins.clear();
+	loginFile.delete();
+	fireStateChanged();
+    }
+
+    @Override
+    public List<LoginInfo> getLogins() {
+	return new ArrayList<LoginInfo>(logins);
+    }
+
+    //
+    // LoginHistoryManager methods
+    //
+
+    /**
+     * Adds a {@code ChangeListener} to be notified upon changes in state.
+     */
+    public void addChangeListener(ChangeListener listener) {
+	listeners.add(listener);
+    }
+
+    /**
+     * Removes a {@code ChangeListener} from notification.
+     */
+    public void removeChangeListener(ChangeListener listener) {
+	listeners.remove(listener);
+    }
+
+    //
+    // Private methods
+    //
+
+    // 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);
+	}
+    }
+
+    // Fire property change event.
+    private void fireStateChanged() {
+	listeners.stateChanged(new ChangeEvent(this));
+    }
+
+    // Push logins in LIFO order.
+    private void pushLogin(LoginInfo info) {
+	removeLogin(info);
+	logins.push(info);
+	if (logins.size() > LOGINS_SIZE) {
+	    logins.remove(0);
+	}
+    }
+
+    // Remove existing login.
+    private void removeLogin(LoginInfo info) {
+	for (int i = 0; i < logins.size(); i++) {
+	    LoginInfo login = logins.elementAt(i);
+	    if (info.matches(login)) {
+		logins.removeElementAt(i);
+		return;
+	    }
+	}
+    }
+
+    // Read persistent login history.
+    private void readLogins() {
+	// Ensure file exists.
+	if (loginFile.exists() && !loginFile.canRead()) {
+	    String message = "Cannot read login history: " +
+		loginFile.getAbsolutePath();
+	    Logger.getLogger(getClass().getName()).log(
+		Level.WARNING, message);
+	    return;
+	}
+
+	try {
+	    BufferedReader reader = new BufferedReader(
+		new FileReader(loginFile));
+
+	    int i = 0;
+	    String line = null;
+
+	    // Read login history
+	    while ((line = reader.readLine()) != null
+		    && i < LOGINS_SIZE) {
+		StringTokenizer st = new StringTokenizer(line, LOGIN_DELIMITER);
+
+		// Login history formated as host:user:role
+		String host = null;
+		if (st.hasMoreTokens()) {
+		    host = st.nextToken();
+		}
+		String user = null;
+		if (st.hasMoreTokens()) {
+		    user = st.nextToken();
+		}
+		String role = null;
+		if (st.hasMoreTokens()) {
+		    role = st.nextToken();
+		}
+
+		// Populate logins history.
+		if (host != null && host.length() > 0
+			&& user != null && user.length() > 0) {
+		    ConnectionInfo info = new ConnectionInfo(
+			host, user, role, null);
+		    pushLogin(info);
+		}
+	    }
+	    reader.close();
+	} catch (IOException e) {
+	    String message = "Cannot obtain login history";
+	    Logger.getLogger(getClass().getName()).log(
+		Level.WARNING, message, e);
+	}
+    }
+
+    // Write persistent login history.
+    private void writeLogins() {
+	File loginDir = loginFile.getParentFile();
+
+	// Ensure directory exists.
+	if (!loginDir.exists() && !loginDir.mkdirs()) {
+	    String message = "Cannot create login history directory: " +
+		loginDir.getAbsolutePath();
+	    Logger.getLogger(getClass().getName()).log(
+		Level.WARNING, message);
+	    return;
+	}
+
+	try {
+	    // Write new file.
+	    File tmpFile = File.createTempFile(loginFile.getName(), ".tmp",
+		loginDir);
+	    BufferedWriter writer = new BufferedWriter(new FileWriter(tmpFile));
+
+	    // Format logins as host:user:role
+	    for (LoginInfo login : logins) {
+		if (login.getRole() != null && login.getRole().length() > 0) {
+		    writer.write(login.getHost() + LOGIN_DELIMITER +
+			login.getUser() + LOGIN_DELIMITER + login.getRole());
+		} else {
+		    writer.write(login.getHost() + LOGIN_DELIMITER +
+			login.getUser());
+		}
+		writer.newLine();
+	    }
+	    tmpFile.renameTo(loginFile);
+	    writer.close();
+	} catch (IOException e) {
+	    String message = "Cannot persist login history";
+	    Logger.getLogger(getClass().getName()).log(
+		Level.WARNING, message, e);
+	}
+    }
+}
--- a/usr/src/java/vpanels/client/org/opensolaris/os/vp/client/swing/App.java	Fri Nov 19 10:45:30 2010 -0500
+++ b/usr/src/java/vpanels/client/org/opensolaris/os/vp/client/swing/App.java	Mon Nov 22 10:50:58 2010 -0500
@@ -326,6 +326,8 @@
     private UDSocketServer server;
     private final List<AppInstance> instances = new ArrayList<AppInstance>();
     private ConnectionManager connManager = new ConnectionManager();
+    private LoginHistoryManager loginHistoryManager =
+	new LoginHistoryManager(connManager, new File(VP_USER_DIR, "history"));
 
     //
     // Constructors
@@ -426,6 +428,10 @@
 	return connManager;
     }
 
+    public LoginHistoryManager getLoginHistoryManager() {
+	return loginHistoryManager;
+    }
+
     protected Preferences getPreferences() {
 	return prefs;
     }
--- a/usr/src/java/vpanels/client/org/opensolaris/os/vp/client/swing/AppInstance.java	Fri Nov 19 10:45:30 2010 -0500
+++ b/usr/src/java/vpanels/client/org/opensolaris/os/vp/client/swing/AppInstance.java	Mon Nov 22 10:50:58 2010 -0500
@@ -78,7 +78,6 @@
     //
 
     private App app;
-    private LoginHistory loginHistory;
     private BusyIndicator busy;
     private ConnectionInfo info;
     private HelpBroker helpBroker;
@@ -107,10 +106,6 @@
 		    return SwingNavigator.getLastWindow(getNavigator());
 		}
 	    });
-
-        // Initialize login history.
-        loginHistory = AppLoginHistory.getInstance(
-            app.getConnectionManager());
     }
 
     public AppInstance(App app, Properties hints, ConnectionInfo info) {
@@ -297,7 +292,7 @@
 
     @Override
     public LoginHistory getLoginHistory() {
-        return loginHistory;
+        return app.getLoginHistoryManager();
     }
 
     //
--- a/usr/src/java/vpanels/client/org/opensolaris/os/vp/client/swing/AppLoginHistory.java	Fri Nov 19 10:45:30 2010 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,278 +0,0 @@
-/*
- * CDDL HEADER START
- *
- * The contents of this file are subject to the terms of the
- * Common Development and Distribution License (the "License").
- * You may not use this file except in compliance with the License.
- *
- * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
- * or http://www.opensolaris.org/os/licensing.
- * See the License for the specific language governing permissions
- * and limitations under the License.
- *
- * When distributing Covered Code, include this CDDL HEADER in each
- * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
- * If applicable, add the following below this CDDL HEADER, with the
- * fields enclosed by brackets "[]" replaced with your own identifying
- * information: Portions Copyright [yyyy] [name of copyright owner]
- *
- * CDDL HEADER END
- */
-
-/*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
- */
-
-package org.opensolaris.os.vp.client.swing;
-
-import java.beans.*;
-import java.io.*;
-import java.net.*;
-import java.util.*;
-import java.util.logging.*;
-import javax.swing.event.*;
-import org.opensolaris.os.vp.client.common.ConnectionManager;
-import org.opensolaris.os.vp.panel.common.*;
-import org.opensolaris.os.vp.util.misc.NetUtil;
-import org.opensolaris.os.vp.util.swing.event.ChangeListeners;
-
-public class AppLoginHistory implements LoginHistory {
-    //
-    // Instance data
-    //
-
-    // The only instance of this class.
-    private static AppLoginHistory instance = null;
-
-    // Used to format logins as host:user:role
-    private static final String LOGIN_DELIMITER = ":";
-
-    // File used to persist login history.
-    private File loginFile = new File(App.VP_USER_DIR, "history");
-
-    // 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>();
-
-    // ConnectionManager used for logins.
-    private ConnectionManager connManager = null;
-
-    // login history listeners.
-    private ChangeListeners listeners = new ChangeListeners();
-
-    // ConnectionManager listener.
-    private ConnectionListListener connListener =
-	new ConnectionListListener() {
-	    @Override
-	    public void connectionRemoved(ConnectionEvent event) {
-		// Nothing to do here.
-	    }
-
-	    @Override
-	    public void connectionAdded(ConnectionEvent event) {
-		connectionChanged(event);
-	    }
-
-	    @Override
-	    public void connectionSelected(ConnectionEvent event) {
-		connectionChanged(event);
-	    }
-
-	    private void connectionChanged(ConnectionEvent event) {
-		LoginInfo info = (LoginInfo) event.getConnectionInfo();
-		addLogin(info);
-		writeLogins();
-		fireStateChanged();
-	    }
-	};
-
-    //
-    // Constructors
-    //
-
-    // There is only one instance of this class.
-    private AppLoginHistory(ConnectionManager connManager) {
-	this.connManager = connManager;
-	if (connManager != null) {
-	    connManager.addConnectionListListener(connListener);
-	}
-	readLogins();
-    }
-
-    //
-    // LoginHistory methods
-    //
-
-    @Override
-    public void clearLogins() {
-	logins.clear();
-	loginFile.delete();
-	fireStateChanged();
-    }
-
-    @Override
-    public List<LoginInfo> getLogins() {
-	return new ArrayList<LoginInfo>(logins);
-    }
-
-    //
-    // AppLoginHistory methods
-    //
-
-    /**
-     * Get {@code AppLoginHistory} instance.
-     */
-    public static AppLoginHistory getInstance(ConnectionManager connManager) {
-	if (instance == null) {
-	    instance = new AppLoginHistory(connManager);
-	}
-	return instance;
-    }
-
-    /**
-     * Adds a {@code ChangeListener} to be notified upon changes in state.
-     */
-    public void addChangeListener(ChangeListener listener) {
-	listeners.add(listener);
-    }
-
-    /**
-     * Removes a {@code ChangeListener} from notification.
-     */
-    public void removeChangeListener(ChangeListener listener) {
-	listeners.remove(listener);
-    }
-
-    //
-    // Private methods
-    //
-
-    // 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);
-	}
-    }
-
-    // Fire property change event.
-    private void fireStateChanged() {
-	listeners.stateChanged(new ChangeEvent(this));
-    }
-
-    // Push logins in LIFO order.
-    private void pushLogin(LoginInfo info) {
-	removeLogin(info);
-	logins.push(info);
-	if (logins.size() > LOGINS_SIZE) {
-	    logins.remove(0);
-	}
-    }
-
-    // Remove existing login.
-    private void removeLogin(LoginInfo info) {
-	for (int i = 0; i < logins.size(); i++) {
-	    LoginInfo login = logins.elementAt(i);
-	    if (info.matches(login)) {
-		logins.removeElementAt(i);
-		return;
-	    }
-	}
-    }
-
-    // Read persistent login history.
-    private void readLogins() {
-	// Ensure file exists.
-	if (loginFile.exists() && !loginFile.canRead()) {
-	    String message = "Cannot read login history: " +
-		loginFile.getAbsolutePath();
-	    Logger.getLogger(getClass().getName()).log(
-		Level.WARNING, message);
-	    return;
-	}
-
-	try {
-	    BufferedReader reader = new BufferedReader(
-		new FileReader(loginFile));
-
-	    int i = 0;
-	    String line = null;
-
-	    // Read login history
-	    while ((line = reader.readLine()) != null
-		    && i < LOGINS_SIZE) {
-		StringTokenizer st = new StringTokenizer(line, LOGIN_DELIMITER);
-
-		// Login history formated as host:user:role
-		String host = null;
-		if (st.hasMoreTokens()) {
-		    host = st.nextToken();
-		}
-		String user = null;
-		if (st.hasMoreTokens()) {
-		    user = st.nextToken();
-		}
-		String role = null;
-		if (st.hasMoreTokens()) {
-		    role = st.nextToken();
-		}
-
-		// Populate logins history.
-		if (host != null && host.length() > 0
-			&& user != null && user.length() > 0) {
-		    ConnectionInfo info = new ConnectionInfo(
-			host, user, role, null);
-		    pushLogin(info);
-		}
-	    }
-	    reader.close();
-	} catch (IOException e) {
-	    String message = "Cannot obtain login history";
-	    Logger.getLogger(getClass().getName()).log(
-		Level.WARNING, message, e);
-	}
-    }
-
-    // Write persistent login history.
-    private void writeLogins() {
-	File loginDir = loginFile.getParentFile();
-
-	// Ensure directory exists.
-	if (!loginDir.exists() && !loginDir.mkdirs()) {
-	    String message = "Cannot create login history directory: " +
-		loginDir.getAbsolutePath();
-	    Logger.getLogger(getClass().getName()).log(
-		Level.WARNING, message);
-	    return;
-	}
-
-	try {
-	    // Write new file.
-	    File tmpFile = File.createTempFile(loginFile.getName(), ".tmp",
-		loginDir);
-	    BufferedWriter writer = new BufferedWriter(new FileWriter(tmpFile));
-
-	    // Format logins as host:user:role
-	    for (LoginInfo login : logins) {
-		if (login.getRole() != null && login.getRole().length() > 0) {
-		    writer.write(login.getHost() + LOGIN_DELIMITER +
-			login.getUser() + LOGIN_DELIMITER + login.getRole());
-		} else {
-		    writer.write(login.getHost() + LOGIN_DELIMITER +
-			login.getUser());
-		}
-		writer.newLine();
-	    }
-	    tmpFile.renameTo(loginFile);
-	    writer.close();
-	} catch (IOException e) {
-	    String message = "Cannot persist login history";
-	    Logger.getLogger(getClass().getName()).log(
-		Level.WARNING, message, e);
-	}
-    }
-}
--- a/usr/src/java/vpanels/panel/org/opensolaris/os/vp/panel/common/ConnectionInfo.java	Fri Nov 19 10:45:30 2010 -0500
+++ b/usr/src/java/vpanels/panel/org/opensolaris/os/vp/panel/common/ConnectionInfo.java	Mon Nov 22 10:50:58 2010 -0500
@@ -131,9 +131,9 @@
 
 	// Test for localhost.
 	if (isLocalAddress == null) {
-	    isLocalAddress = new Boolean(NetUtil.isLocalAddress(getHost()));
+	    isLocalAddress = NetUtil.isLocalAddress(getHost());
 	}
-	if (isLocalAddress.booleanValue() && NetUtil.isLocalAddress(host)) {
+	if (isLocalAddress && NetUtil.isLocalAddress(host)) {
 	    return true;
 	}
 
--- a/usr/src/java/vpanels/panel/org/opensolaris/os/vp/panel/common/LoginHistory.java	Fri Nov 19 10:45:30 2010 -0500
+++ b/usr/src/java/vpanels/panel/org/opensolaris/os/vp/panel/common/LoginHistory.java	Mon Nov 22 10:50:58 2010 -0500
@@ -32,10 +32,6 @@
 /**
  * The {@code LoginHistory} interface defines common login history
  * functionality.
- *
- * Note: This interface allows {@link ClientContext#getLoginHistory} to be
- * defined while {@code AppLoginHistory} is located in the
- * org.opensolaris.os.vp.client.swing package.
  */
 public interface LoginHistory {
     /**