Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Code Block
Refactored PersonDirNameFinder
Refactored PersonDirNameFinder
/**
 * PersonDirectoryImplementation implementation of <code>IEntityNameFinder</code> for <code>IPersons</code>. by 
 * @author Alex Vigdorlooking up displayName from an <code>IPersonAttributeDao</code>.
 * @version $RevisionRevision: 1.13++ $
 */
public class PersonDirNameFinder
        implements IEntityNameFinder {
    
    /**
     * Data Access Object backing this name finder.
     */
    private IPersonAttributeDao paDao;
    
    /** Our cache of entity names: */
    private SoftHashMap names = new SoftHashMap();

    /**
     * Instantiate a PersonDirNameFinder backed by the given
     * IPersonAttributeDao.
     * @param pa DAO to back this PersonDirNameFinder
     */
    PersonDirNameFinder (IPersonAttributeDao pa) {
        this.paDao = pa;
    }


    public String getName (String key) {
        String name = (String) this.names.get(key);
        
        if (name == null) {
            // cached name not found, get name from underlying DAO.
            name = primGetName(key);
            // cache the name
            this.names.put(key, name);
        }
        return  name;
    }


    public java.util.Map getNames (java.lang.String[] keys) {
        Map selectedNames = new HashMap();
        for (int i = 0; i < keys.length; i++) {
            String name = getName(keys[i]);
            selectedNames.put(keys[i], name);
        }
        return  selectedNames;
    }


    public Class getType () {
        return  org.jasig.portal.security.IPerson.class;
    }

    /**
     * Actually lookup a user name using the underlying IPersonAttributeDao.
     * @param key - entity key which in this case is a unique identifier for a user
     * @return the display name for the identified user
     */
    private String primGetName (String key) {
        String name = key;
        Map userInfo = this.paDao.getUserAttributes(name);
        if (userInfo != null)
        {
            Object displayName = userInfo.get("displayName");
            String displayNameStr = "";
            if (displayName != null)
            {
                if (displayName instanceof java.util.List)
                {
                    List displayNameList = (List) displayName;
                    if (! displayNameList.isEmpty() )
                        { displayNameStr = (String)displayNameList.get(0); } 
                }
                else displayNameStr = (String)displayName;
        
                if (! displayNameStr.trim().equals("")) 
                    { name = displayNameStr; }
            }
        }
        return  name;
    }

    /**
     * Get a static singleton instance of this class backed by PersonDirectory.
     * @return singleton PersonDirNameFinder backed by PersonDirectory
     * @deprecated as of uP 2.5 instead use PersonDirNameFinderFactory
     */
    public static IEntityNameFinder singleton () {
        return new PersonDirNameFinderFactory().newFinder();
    }

    /**
     * Returns a String that represents the value of this object.
     * @return a string representation of the receiver
     */
    public String toString () {
        return  "PersonDirNameFinder backed by " + this.paDao;
    }
}

On Singletons

Static singleton is a place to store, a way to use, PersonDirNameFinder. It is not inherent to the object itself. So we move this static singleton out of PersonDirNameFinder, which is about implementing an IEntityNameFinder by use of an IPersonAttributeDao, and into PersonDirNameFinderFactory, which is all about getting access to a properly configured PersonDirNameFinder. The static singleton() method continues to be supported but is deprecated so that in a future release of this code the dependency of PersonDirNameFinder upon its factory can be removed.

Comments

JavaDoc comments for private members make comments available in JavaDoc generated from this code and in IDEs that use JavaDoc to provide context, e.g. Eclipse.

Payoff: a testcase

Conclusion

...