001    /*
002     * $Id: DefaultUserNameStore.java,v 1.6 2005/11/11 22:09:54 rbair Exp $
003     *
004     * Copyright 2004 Sun Microsystems, Inc., 4150 Network Circle,
005     * Santa Clara, California 95054, U.S.A. All rights reserved.
006     *
007     * This library is free software; you can redistribute it and/or
008     * modify it under the terms of the GNU Lesser General Public
009     * License as published by the Free Software Foundation; either
010     * version 2.1 of the License, or (at your option) any later version.
011     * 
012     * This library is distributed in the hope that it will be useful,
013     * but WITHOUT ANY WARRANTY; without even the implied warranty of
014     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
015     * Lesser General Public License for more details.
016     * 
017     * You should have received a copy of the GNU Lesser General Public
018     * License along with this library; if not, write to the Free Software
019     * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
020     */
021    
022    
023    package org.jdesktop.swingx.auth;
024    
025    import java.beans.PropertyChangeSupport;
026    import java.util.prefs.Preferences;
027    
028    import org.jdesktop.swingx.JXLoginPanel;
029    
030    /**
031     * Saves the user names in Preferences. Because any string could be part
032     * of the user name, for every user name that must be saved a new Preferences
033     * key/value pair must be stored.
034     *
035     * @author Bino George
036     * @author rbair
037     */
038    public class DefaultUserNameStore extends UserNameStore {
039        /**
040         * The key for one of the preferences
041         */
042        private static final String USER_KEY = "usernames";
043        /**
044         */
045        private static final String NUM_KEY = "usernames.length";
046        /**
047         * A name that is used when retrieving preferences. By default, the
048         * app name is "default&quot. This should be set by the application
049         * if the application wants it's own list of user names.
050         */
051        private static final String DEFAULT_APP_NAME = "default";
052        /**
053         * The preferences node
054         */
055        private Preferences prefs;
056        /**
057         * Contains the user names. Since the list of user names is not
058         * frequently updated, there is no penalty in storing the values
059         * in an array.
060         */
061        private String[] userNames;
062        /**
063         * Used for propogating bean changes
064         */
065        private PropertyChangeSupport pcs;
066        
067        /**
068         * Creates a new instance of DefaultUserNameStore
069         */
070        public DefaultUserNameStore() {
071            pcs = new PropertyChangeSupport(this);
072            userNames = new String[0];
073        }
074        
075        /**
076         * Loads the user names from Preferences
077         */
078        public void loadUserNames() {
079            initPrefs();
080            if (prefs != null) {
081                int n = prefs.getInt(NUM_KEY, 0);
082                String[] names = new String[n];
083                for (int i = 0; i < n; i++) {
084                    names[i] = prefs.get(USER_KEY + "." + i, null);
085                }
086                setUserNames(names);
087            }
088        }
089        
090        /**
091         * Saves the user names to Preferences
092         */
093        public void saveUserNames() {
094            initPrefs();
095            if (prefs != null) {
096                prefs.putInt(NUM_KEY, userNames.length);
097                for (int i = 0; i < userNames.length; i++) {
098                    prefs.put(USER_KEY + "." + i, userNames[i]);
099                }
100            }
101        }
102        
103        /**
104         * @inheritDoc
105         */
106        public String[] getUserNames() {
107            return userNames;
108        }
109        
110        /**
111         * @inheritDoc
112         */
113        public void setUserNames(String[] userNames) {
114            if (this.userNames != userNames) {
115                String[] old = this.userNames;
116                this.userNames = userNames == null ? new String[0] : userNames;
117                pcs.firePropertyChange("userNames", old, this.userNames);
118            }
119        }
120        
121        /**
122         * Add a username to the store.
123         * @param name
124         */
125        public void addUserName(String name) {
126            if (!containsUserName(name)) {
127                String[] newNames = new String[userNames.length + 1];
128                for (int i=0; i<userNames.length; i++) {
129                    newNames[i] = userNames[i];
130                }
131                newNames[newNames.length - 1] = name;
132                setUserNames(newNames);
133            }
134        }
135        
136        /**
137         * Removes a username from the list.
138         *
139         * @param name
140         */
141        public void removeUserName(String name) {
142            if (containsUserName(name)) {
143                String[] newNames = new String[userNames.length - 1];
144                int index = 0;
145                for (String s : userNames) {
146                    if (!s.equals(name)) {
147                        newNames[index++] = s;
148                    }
149                }
150                setUserNames(newNames);
151            }
152        }
153        
154        /**
155         * @inheritDoc
156         */
157        public boolean containsUserName(String name) {
158            for (String s : userNames) {
159                if (s.equals(name)) {
160                    return true;
161                }
162            }
163            return false;
164        }
165        
166        /**
167         * @return Returns Preferences node in which the user names will be stored
168         */
169        public Preferences getPreferences() {
170            return prefs;
171        }
172        
173        /**
174         * @param prefs the Preferences node to store the user names in. If null,
175         * or undefined, then they are stored in /org/jdesktop/swingx/auth/DefaultUserNameStore.
176         */
177        public void setPreferences(Preferences prefs) {
178            initPrefs();
179            if (this.prefs != prefs) {
180                Preferences old = this.prefs;
181                this.prefs = prefs;
182                pcs.firePropertyChange("preferences", old, prefs);
183                //if prefs is null, this next method will create the default prefs node
184                loadUserNames();
185            }
186        }
187    
188        /**
189         * Creates the default prefs node
190         */
191        private void initPrefs() {
192            if (prefs == null) {
193                prefs = Preferences.userNodeForPackage(DefaultUserNameStore.class);
194                prefs = prefs.node("DefaultUserNameStore");
195            }
196        }
197    }