001    /* 
002        Licensed to the Apache Software Foundation (ASF) under one
003        or more contributor license agreements.  See the NOTICE file
004        distributed with this work for additional information
005        regarding copyright ownership.  The ASF licenses this file
006        to you under the Apache License, Version 2.0 (the
007        "License"); you may not use this file except in compliance
008        with the License.  You may obtain a copy of the License at
009    
010           http://www.apache.org/licenses/LICENSE-2.0
011    
012        Unless required by applicable law or agreed to in writing,
013        software distributed under the License is distributed on an
014        "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
015        KIND, either express or implied.  See the License for the
016        specific language governing permissions and limitations
017        under the License.  
018     */
019    package org.apache.wiki.auth.user;
020    
021    import java.io.Serializable;
022    import java.util.Date;
023    import java.util.HashMap;
024    import java.util.Map;
025    
026    /**
027     * Default implementation for representing wiki user information, such as the
028     * login name, full name, wiki name, and e-mail address.
029     * @since 2.3
030     */
031    
032    public final class DefaultUserProfile implements UserProfile
033    {
034        private static final long serialVersionUID = -5600466893735300647L;
035    
036        private static final String EMPTY_STRING = "";
037    
038        private static final String WHITESPACE = "\\s";
039        
040        private Map<String,Serializable> m_attributes = new HashMap<String,Serializable>();
041    
042        private Date     m_created   = null;
043    
044        private String   m_email     = null;
045    
046        private String   m_fullname  = null;
047        
048        private Date m_lockExpiry = null;
049    
050        private String   m_loginName = null;
051    
052        private Date     m_modified  = null;
053    
054        private String   m_password  = null;
055        
056        private String m_uid = null;
057    
058        private String   m_wikiname  = null;
059    
060        /**
061         * Private constructor to prevent direct instantiation.
062         */
063        private DefaultUserProfile() {}
064    
065        /**
066         * Static factory method that creates a new DefaultUserProfile
067         * and sets a unique identifier (uid) for the supplied UserDatabase.
068         * @param db the UserDatabase for which the uid should be
069         * created
070         * @return the new profile
071         */
072        protected static UserProfile newProfile( UserDatabase db )
073        {
074            UserProfile profile = new DefaultUserProfile();
075            profile.setUid( AbstractUserDatabase.generateUid( db ) );
076            return profile;
077        }
078    
079        /**
080         * {@inheritDoc}
081         */
082        public boolean equals( Object o )
083        {
084            if ( ( o != null ) && ( o instanceof UserProfile ) )
085            {
086                DefaultUserProfile u = (DefaultUserProfile) o;
087                return  same( m_fullname, u.m_fullname ) && same( m_password, u.m_password )
088                        && same( m_loginName, u.m_loginName ) && same( m_email, u.m_email ) && same( m_wikiname,
089                        u.m_wikiname );
090            }
091    
092            return false;
093        }
094    
095        public int hashCode()
096        {
097            return (m_fullname  != null ? m_fullname.hashCode()  : 0) ^
098                   (m_password  != null ? m_password.hashCode()  : 0) ^
099                   (m_loginName != null ? m_loginName.hashCode() : 0) ^
100                   (m_wikiname  != null ? m_wikiname.hashCode()  : 0) ^
101                   (m_email     != null ? m_email.hashCode()     : 0);
102        }
103    
104        /**
105         * Returns the creation date
106         * @return the creation date
107         * @see org.apache.wiki.auth.user.UserProfile#getCreated()
108         */
109        public Date getCreated()
110        {
111            return m_created;
112        }
113    
114        /**
115         * Returns the user's e-mail address.
116         * @return the e-mail address
117         */
118        public String getEmail()
119        {
120            return m_email;
121        }
122    
123        /**
124         * Returns the user's full name.
125         * @return the full name
126         */
127        public String getFullname()
128        {
129            return m_fullname;
130        }
131    
132        /**
133         * Returns the last-modified date.
134         * @return the last-modified date
135         * @see org.apache.wiki.auth.user.UserProfile#getLastModified()
136         */
137        public Date getLastModified()
138        {
139            return m_modified;
140        }
141    
142        /**
143         * Returns the user's login name.
144         * @return the login name
145         */
146        public String getLoginName()
147        {
148            return m_loginName;
149        }
150    
151        /**
152         * Returns the user password for use with custom authentication. Note that
153         * the password field is not meaningful for container authentication; the
154         * user's private credentials are generally stored elsewhere. While it
155         * depends on the {@link UserDatabase}implementation, in most cases the
156         * value returned by this method will be a password hash, not the password
157         * itself.
158         * @return the password
159         */
160        public String getPassword()
161        {
162            return m_password;
163        }
164    
165        /**
166         * Returns the user's wiki name.
167         * @return the wiki name.
168         */
169        public String getWikiName()
170        {
171            return m_wikiname;
172        }
173    
174        /**
175         * Returns <code>true</code> if the user profile is
176         * new. This implementation checks whether
177         * {@link #getLastModified()} returns <code>null</code>
178         * to determine the status.
179         * @see org.apache.wiki.auth.user.UserProfile#isNew()
180         */
181        public boolean isNew()
182        {
183            return  m_modified == null;
184        }
185    
186        /**
187         * @param date the creation date
188         * @see org.apache.wiki.auth.user.UserProfile#setCreated(java.util.Date)
189         */
190        public void setCreated(Date date)
191        {
192            m_created = date;
193        }
194    
195        /**
196         * Sets the user's e-mail address.
197         * @param email the e-mail address
198         */
199        public void setEmail( String email )
200        {
201            m_email = email;
202        }
203    
204        /**
205         * Sets the user's full name. For example, "Janne Jalkanen."
206         * @param arg the full name
207         */
208        public void setFullname( String arg )
209        {
210            m_fullname = arg;
211    
212            // Compute wiki name
213            if ( m_fullname != null )
214            {
215                m_wikiname = m_fullname.replaceAll(WHITESPACE, EMPTY_STRING);
216            }
217        }
218    
219        /**
220         * Sets the last-modified date.
221         * @param date the last-modified date
222         * @see org.apache.wiki.auth.user.UserProfile#setLastModified(java.util.Date)
223         */
224        public void setLastModified( Date date )
225        {
226            m_modified = date;
227        }
228    
229        /**
230         * Sets the name by which the user logs in. The login name is used as the
231         * username for custom authentication (see
232         * {@link org.apache.wiki.auth.AuthenticationManager#login(WikiSession,HttpServletRequest, String, String)}).
233         * The login name is typically a short name ("jannej"). In contrast, the
234         * wiki name is typically of type FirstnameLastName ("JanneJalkanen").
235         * @param name the login name
236         */
237        public void setLoginName( String name )
238        {
239            m_loginName = name;
240        }
241    
242        /**
243         * Sets the user's password for use with custom authentication. It is
244         * <em>not</em> the responsibility of implementing classes to hash the
245         * password; that responsibility is borne by the UserDatabase implementation
246         * during save operations (see {@link UserDatabase#save(UserProfile)}).
247         * Note that the password field is not meaningful for container
248         * authentication; the user's private credentials are generally stored
249         * elsewhere.
250         * @param arg the password
251         */
252        public void setPassword( String arg )
253        {
254            m_password = arg;
255        }
256    
257        /**
258         * No-op method. In previous versions of JSPWiki, the method
259         * set the user's wiki name directly. Now, the wiki name is automatically
260         * calculated based on the full name.
261         * @param name the wiki name
262         * @deprecated This method will be removed in a future release.
263         */
264        @SuppressWarnings("deprecation")
265        public void setWikiName( String name )
266        {
267        }
268    
269        /**
270         * Returns a string representation of this user profile.
271         * @return the string
272         */
273        public String toString()
274        {
275            return "[DefaultUserProfile: '" + getFullname() + "']";
276        }
277    
278        /**
279         * Private method that compares two objects and determines whether they are
280         * equal. Two nulls are considered equal.
281         * @param arg1 the first object
282         * @param arg2 the second object
283         * @return the result of the comparison
284         */
285        private boolean same( Object arg1, Object arg2 )
286        {
287            if ( arg1 == null && arg2 == null )
288            {
289                return true;
290            }
291            if ( arg1 == null || arg2 == null )
292            {
293                return false;
294            }
295            return arg1.equals( arg2 );
296        }
297    
298        //--------------------------- Attribute and lock interface implementations ---------------------------
299        
300        /**
301         * {@inheritDoc}
302         */
303        public Map<String,Serializable> getAttributes()
304        {
305            return m_attributes;
306        }
307    
308        /**
309         * {@inheritDoc}
310         */
311        public Date getLockExpiry()
312        {
313            return isLocked() ? m_lockExpiry : null;
314        }
315        
316        /**
317         * {@inheritDoc}
318         */
319        public String getUid()
320        {
321            return m_uid;
322        }
323    
324        /**
325         * {@inheritDoc}
326         */
327        public boolean isLocked()
328        {
329            boolean locked =  m_lockExpiry != null && System.currentTimeMillis() < m_lockExpiry.getTime();
330    
331            // Clear the lock if it's expired already
332            if ( !locked && m_lockExpiry != null )
333            {
334                m_lockExpiry = null;
335            }
336            return locked;
337        }
338    
339        /**
340         * {@inheritDoc}
341         */
342        public void setLockExpiry( Date expiry )
343        {
344            m_lockExpiry = expiry;
345        }
346        
347        /**
348         * {@inheritDoc}
349         */
350        public void setUid( String uid )
351        {
352            m_uid = uid;
353        }
354    }