org.openiam.provision.service.UserAttributeHelper.java Source code

Java tutorial

Introduction

Here is the source code for org.openiam.provision.service.UserAttributeHelper.java

Source

/*
 * Copyright 2009, OpenIAM LLC 
 * This file is part of the OpenIAM Identity and Access Management Suite
 *
 *   OpenIAM Identity and Access Management Suite is free software: 
 *   you can redistribute it and/or modify
 *   it under the terms of the GNU General Public License 
 *   version 3 as published by the Free Software Foundation.
 *
 *   OpenIAM is distributed in the hope that it will be useful,
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *   Lesser GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with OpenIAM.  If not, see <http://www.gnu.org/licenses/>. *
 */

/**
 * 
 */
package org.openiam.provision.service;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.openiam.base.AttributeOperationEnum;
import org.openiam.idm.srvc.auth.dto.Login;
import org.openiam.idm.srvc.auth.login.LoginDataService;
import org.openiam.idm.srvc.continfo.dto.Address;
import org.openiam.idm.srvc.continfo.dto.EmailAddress;
import org.openiam.idm.srvc.continfo.dto.Phone;
import org.openiam.idm.srvc.grp.dto.Group;
import org.openiam.idm.srvc.role.dto.Role;
import org.openiam.idm.srvc.user.dto.User;
import org.openiam.idm.srvc.user.dto.UserAttribute;
import org.openiam.idm.srvc.user.dto.UserStatusEnum;
import org.openiam.provision.dto.ProvisionUser;
import org.openiam.provision.type.*;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.*;

/**
 * User to extract the full list of attributes in a User object that is used for
 * provisioning.
 * 
 * @author suneet
 * 
 */
public class UserAttributeHelper {

    protected static final Log log = LogFactory.getLog(UserAttributeHelper.class);
    protected static LoginDataService loginManager;

    public static ExtensibleUser newUser(ProvisionUser pUser)
            throws IllegalArgumentException, IllegalAccessException, InvocationTargetException {

        SimpleDateFormat df = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss Z");

        ExtensibleUser extUser = new ExtensibleUser();

        if (pUser == null) {
            throw new NullPointerException("Provision user is null");
        }
        // use reflection to the list of attributes that are part of user
        User user = pUser.getUser();

        Class userClass = user.getClass();
        Method[] userMethod = userClass.getDeclaredMethods();
        if (userMethod != null && userMethod.length > 0) {
            for (Method m : userMethod) {
                String methName = m.getName();
                String returnType = m.getReturnType().getName();
                // log.info("Return type:=" + returnType ) ;
                // log.info("MethodName=" + methName);
                String value = null;
                if (methName.startsWith("get")) {
                    if (returnType.contains("String")) {
                        value = (String) m.invoke(pUser, null);
                    }
                    if (returnType.contains("Date")) {
                        Date temp = (Date) m.invoke(pUser, null);
                        if (temp != null) {
                            value = df.format(temp);
                            // value = temp.toString();
                        }
                    }
                    if (returnType.contains("UserStatusEnum")) {
                        UserStatusEnum temp = (UserStatusEnum) m.invoke(pUser, null);
                        if (temp != null) {

                            value = temp.getValue();
                        }
                    }
                    // build the method name - to show the object that the value
                    // came from
                    // get rid of the "get" in the name
                    methName = "USER." + methName.substring(3);
                    extUser.getAttributes().add(new ExtensibleAttribute(methName, value, 1, "String"));
                }

            }
        }

        // get the user attributes
        Map<String, UserAttribute> userAttr = (Map<String, UserAttribute>) pUser.getUserAttributes();
        Collection<UserAttribute> attrCol = userAttr.values();
        for (UserAttribute attr : attrCol) {
            String name = extUser.getName();
            name = "USER_ATTRIBUTE." + attr.getName();
            extUser.getAttributes().add(new ExtensibleAttribute(name, attr.getValue(), attr.getMetadataId()));
        }
        // primary identity
        List<Login> principalList = pUser.getPrincipalList();
        if (principalList != null && principalList.size() > 0) {
            for (Login lg : principalList) {
                try {
                    if (lg.getManagedSysId().equalsIgnoreCase("0")) {
                        extUser.getAttributes().add(new ExtensibleAttribute("IDENTITY.PRINCIPAL.", lg.getLogin()));
                        extUser.getAttributes()
                                .add(new ExtensibleAttribute("IDENTITY_PSWD.PRINCIPAL", lg.getPassword()));
                        extUser.getAttributes().add(new ExtensibleAttribute("IDENTITY_STATUS.PRINCIPAL",
                                lg.getStatus() == null ? "" : lg.getStatus().name()));
                    } else {
                        extUser.getAttributes()
                                .add(new ExtensibleAttribute("IDENTITY." + lg.getManagedSysId(), lg.getLogin()));
                        extUser.getAttributes().add(
                                new ExtensibleAttribute("IDENTITY_PSWD." + lg.getManagedSysId(), lg.getPassword()));
                        extUser.getAttributes()
                                .add(new ExtensibleAttribute("IDENTITY_STATUS." + lg.getManagedSysId(),
                                        lg.getStatus() == null ? "" : lg.getStatus().name()));

                    }
                } catch (Exception e) {
                    log.error(e);
                    return null;
                }
            }

        }
        /*
         * Login lg = getPrimaryPrincipal(principalList); if (lg != null) {
         * extUser.getAttributes().add(new
         * ExtensibleAttribute("PRINCIPAL.IDENTITY", lg.getLogin()));
         * extUser.getAttributes().add(new
         * ExtensibleAttribute("PRINCIPAL.IDENTITY_PSWD", lg.getPassword())); }
         */

        // groups
        Set<Group> groupSet = pUser.getGroups();
        if (groupSet != null) {
            for (Group grp : groupSet) {
                ExtensibleGroup extGroup = new ExtensibleGroup(grp);
                log.info("Group being added to extGroup=" + grp);
                extUser.getGroup().add(extGroup);
            }
        }
        // roles
        Set<Role> roleSet = pUser.getRoles();
        if (roleSet != null) {
            for (Role rl : roleSet) {
                ExtensibleRole extRole = new ExtensibleRole(rl);
                log.info("Role being added to extRole=" + rl);
                extUser.getRole().add(extRole);
            }
        }
        // address
        Set<Address> addressList = pUser.getAddresses();
        if (addressList != null) {
            Iterator<Address> adrIt = addressList.iterator();
            while (adrIt.hasNext()) {
                Address adr = adrIt.next();
                ExtensibleAddress extAddress = new ExtensibleAddress(adr);
                extUser.getAddress().add(extAddress);
            }
        }

        // email
        Set<EmailAddress> emailAddressList = pUser.getEmailAddresses();
        if (emailAddressList != null) {
            Iterator<EmailAddress> emailIt = emailAddressList.iterator();
            while (emailIt.hasNext()) {
                EmailAddress email = emailIt.next();
                ExtensibleEmailAddress extEmail = new ExtensibleEmailAddress(email);
                extUser.getEmail().add(extEmail);
            }
        }

        // phone
        Set<Phone> phoneList = pUser.getPhones();
        if (phoneList != null) {
            Iterator<Phone> phoneIt = phoneList.iterator();
            while (phoneIt.hasNext()) {
                Phone phone = phoneIt.next();
                ExtensiblePhone extPhone = new ExtensiblePhone(phone);
                extUser.getPhone().add(extPhone);
            }
        }

        return extUser;
    }

    private static Login getPrimaryPrincipal(List<Login> principalList) {
        if (principalList == null) {
            return null;
        }
        for (Login lg : principalList) {
            try {
                if (lg.getManagedSysId().equalsIgnoreCase("0")) {
                    return lg;
                }
            } catch (Exception e) {
                log.error(e);
                return null;
            }
        }
        return null;

    }

    public static ExtensibleUser modifyUser(User origUser2, List<Role> curRoleList, List<Group> curGroupList,
            ProvisionUser pUser)
            throws IllegalArgumentException, IllegalAccessException, InvocationTargetException {

        SimpleDateFormat df = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss Z");

        ExtensibleUser extUser = new ExtensibleUser();

        if (pUser == null) {
            throw new NullPointerException("Provision user is null");
        }
        // use reflection to the list of attributes that are part of user
        User user = pUser.getUser();

        determineUserChanges(extUser, user, origUser2);

        // get the user attributes
        Map<String, UserAttribute> userAttr = (Map<String, UserAttribute>) pUser.getUserAttributes();
        Collection<UserAttribute> attrCol = userAttr.values();
        for (UserAttribute attr : attrCol) {
            String name = extUser.getName();
            name = "USER_ATTRIBUTE." + attr.getName();
            ExtensibleAttribute extAttr = new ExtensibleAttribute(name, attr.getValue(), attr.getMetadataId());
            if (attr.getOperation() == (AttributeOperationEnum.DELETE)) {
                extAttr.setOperation(AttributeOperationEnum.DELETE.getValue());
            } else {
                // find the attribute
                log.info("Attribute name=" + attr.getName());
                UserAttribute tempAttr = origUser2.getAttribute(attr.getName());
                if (tempAttr != null) {
                    // log.info("Attribute found=" + name + " - val=" +
                    // tempAttr.getValue());
                    // log.info("Attribute orgi=" + attr.getValue());
                    // match found.
                    if (attr.getValue() == null && tempAttr.getValue() != null) {
                        extAttr.setOperation(AttributeOperationEnum.REPLACE.getValue());
                    } else if (attr.getValue() != null && tempAttr.getValue() == null) {
                        extAttr.setOperation(AttributeOperationEnum.REPLACE.getValue());
                    } else if (!attr.getValue().equalsIgnoreCase(tempAttr.getValue())) {
                        log.info("attr object values are not equal ");
                        extAttr.setOperation(AttributeOperationEnum.REPLACE.getValue());
                    } else {
                        extAttr.setOperation(AttributeOperationEnum.NO_CHANGE.getValue());
                    }
                } else {
                    // not found
                    extAttr.setOperation(AttributeOperationEnum.ADD.getValue());
                }
            }
            extUser.getAttributes().add(extAttr);
        }
        // check if we have attributes in the original that we dont have here
        Map<String, UserAttribute> origUserAttr = (Map<String, UserAttribute>) origUser2.getUserAttributes();
        Collection<UserAttribute> origUserAttrCol = origUserAttr.values();
        User newUser = pUser.getUser();
        for (UserAttribute attr : origUserAttrCol) {
            UserAttribute tempAttr2 = newUser.getAttribute(attr.getName());
            if (tempAttr2 == null) {
                // not found add to the
                ExtensibleAttribute extAttr = new ExtensibleAttribute("USER_ATTRIBUTE." + attr.getName(),
                        attr.getValue(), attr.getMetadataId());
                extAttr.setOperation(AttributeOperationEnum.NO_CHANGE.getValue());
                extUser.getAttributes().add(extAttr);

            }

        }

        // primary identity
        List<Login> principalList = pUser.getPrincipalList();
        if (principalList != null && principalList.size() > 0) {
            for (Login lg : principalList) {
                try {
                    if (lg.getManagedSysId().equalsIgnoreCase("0")) {
                        extUser.getAttributes()
                                .add(new ExtensibleAttribute("IDENTITY.PRINCIPAL.", lg.getLogin(), 0, "String"));
                        String p = lg.getPassword();
                        if (p != null && p.length() > 12) {
                            p = loginManager.decryptPassword(lg.getUserId(), p);
                            extUser.getAttributes()
                                    .add(new ExtensibleAttribute("IDENTITY_PSWD.PRINCIPAL", p, 0, "String"));
                        } else {
                            extUser.getAttributes()
                                    .add(new ExtensibleAttribute("IDENTITY_PSWD.PRINCIPAL", p, 0, "String"));
                        }
                        extUser.getAttributes()
                                .add(new ExtensibleAttribute("IDENTITY_STATUS.PRINCIPAL", lg.getStatus().name()));
                    } else {
                        extUser.getAttributes().add(new ExtensibleAttribute("IDENTITY." + lg.getManagedSysId(),
                                lg.getLogin(), 0, "String"));
                        String p = lg.getPassword();
                        if (p != null && p.length() > 12) {
                            p = loginManager.decryptPassword(lg.getUserId(), p);
                            extUser.getAttributes().add(new ExtensibleAttribute(
                                    "IDENTITY_PSWD." + lg.getManagedSysId(), p, 0, "String"));
                        } else {
                            extUser.getAttributes().add(new ExtensibleAttribute(
                                    "IDENTITY_PSWD." + lg.getManagedSysId(), p, 0, "String"));
                        }
                        // extUser.getAttributes().add(new
                        // ExtensibleAttribute("IDENTITY_PSWD."+lg.getManagedSysId(),
                        // lg.getPassword(),0));
                        extUser.getAttributes().add(new ExtensibleAttribute(
                                "IDENTITY_STATUS." + lg.getManagedSysId(), lg.getStatus().name()));
                    }
                } catch (Exception e) {
                    log.error(e);
                    return null;
                }
            }

        }
        /*
         * Login lg = getPrimaryPrincipal(principalList); if (lg != null) {
         * extUser.getAttributes().add(new
         * ExtensibleAttribute("PRINCIPAL.IDENTITY", lg.getLogin()));
         * extUser.getAttributes().add(new
         * ExtensibleAttribute("PRINCIPAL.IDENTITY_PSWD", lg.getPassword())); }
         */

        // groups
        Set<Group> groupSet = pUser.getGroups();
        if (groupSet != null) {
            for (Group grp : groupSet) {
                ExtensibleGroup extGroup = new ExtensibleGroup(grp);
                log.info("Group being added to extGroup=" + grp);
                // Check the current list. if not found, then the operation is
                // an add
                if (grp.getOperation() != AttributeOperationEnum.DELETE) {
                    if (curGroupList != null) {
                        boolean found = false;
                        for (Group cGroup : curGroupList) {
                            if (cGroup.getId().equals(grp.getId())) {
                                found = true;
                            }
                        }
                        if (!found) {
                            extGroup.setOperation(1);
                        }
                    } else {
                        extGroup.setOperation(1);
                    }
                }
                extUser.getGroup().add(extGroup);
            }
        }
        // add the groups there were in the original but not in the current
        if (curGroupList != null) {
            for (Group g : curGroupList) {
                // check if its in the new list. If not, add it on
                if (groupSet != null) {
                    boolean found = false;
                    for (Group newGroup : groupSet) {
                        if (g.getId().equalsIgnoreCase(newGroup.getId())) {
                            found = true;
                        }
                    }
                    if (!found) {
                        ExtensibleGroup extGroup = new ExtensibleGroup(g);
                        extGroup.setOperation(0);
                        extUser.getGroup().add(extGroup);
                    }
                } else {
                    ExtensibleGroup extGroup = new ExtensibleGroup(g);
                    extGroup.setOperation(0);
                    extUser.getGroup().add(extGroup);
                }
            }
        }

        // roles
        Set<Role> roleSet = pUser.getRoles();
        if (roleSet != null) {
            for (Role rl : roleSet) {
                ExtensibleRole extRole = new ExtensibleRole(rl);
                log.info("Role being added to extRole=" + rl);
                if (rl.getOperation() != AttributeOperationEnum.DELETE) {
                    if (curRoleList != null) {
                        boolean found = false;
                        for (Role cRl : curRoleList) {
                            if (cRl.getId().equals(rl.getId())) {
                                found = true;
                            }
                        }
                        if (!found) {
                            extRole.setOperation(1);
                        }
                    } else {
                        extRole.setOperation(1);
                    }
                }

                extUser.getRole().add(extRole);
            }
        }
        // add the roles that were in teh orginal, but not in the current
        if (curRoleList != null) {
            for (Role rl : curRoleList) {
                // check if its in the new list. If not, add it on
                if (roleSet != null) {
                    boolean found = false;
                    for (Role newRole : roleSet) {
                        if (rl.getId().equalsIgnoreCase(newRole.getId())) {
                            found = true;
                        }
                    }
                    if (!found) {
                        ExtensibleRole extRole = new ExtensibleRole(rl);
                        extRole.setOperation(0);
                        extUser.getRole().add(extRole);
                    }
                } else {
                    ExtensibleRole extRole = new ExtensibleRole(rl);
                    extRole.setOperation(0);
                    extUser.getRole().add(extRole);
                }
            }
        }

        // address
        log.info("Processing address list");
        Set<Address> addressList = getFullAddressList(pUser.getAddresses(), origUser2.getAddresses());
        // Set<Address> addressList = pUser.getAddresses();
        if (addressList != null) {
            Iterator<Address> adrIt = addressList.iterator();
            while (adrIt.hasNext()) {
                Address adr = adrIt.next();
                ExtensibleAddress extAddress = new ExtensibleAddress(adr);
                extUser.getAddress().add(extAddress);
            }
        }

        // email
        log.info("Processing emailAddress list");
        Set<EmailAddress> emailAddressList = getFullEmailList(pUser.getEmailAddresses(),
                origUser2.getEmailAddresses());
        // Set<EmailAddress> emailAddressList = pUser.getEmailAddress();
        if (emailAddressList != null) {
            Iterator<EmailAddress> emailIt = emailAddressList.iterator();
            while (emailIt.hasNext()) {
                EmailAddress email = emailIt.next();
                ExtensibleEmailAddress extEmail = new ExtensibleEmailAddress(email);
                extUser.getEmail().add(extEmail);
            }
        }

        // phone
        log.info("Processing phoneList");
        Set<Phone> phoneList = getFullPhoneList(pUser.getPhones(), origUser2.getPhones());
        // Set<Phone> phoneList = pUser.getPhone();
        if (phoneList != null) {
            Iterator<Phone> phoneIt = phoneList.iterator();
            while (phoneIt.hasNext()) {
                Phone phone = phoneIt.next();
                ExtensiblePhone extPhone = new ExtensiblePhone(phone);
                extUser.getPhone().add(extPhone);
            }
        }

        return extUser;
    }

    static private Set<Address> getFullAddressList(Set<Address> newAddressList, Set<Address> origAddressList) {
        Set<Address> addressSet = new HashSet<Address>();

        log.info("getFullAddress list called.");
        log.info("origAddress list=" + origAddressList);
        log.info("newAddress list=" + newAddressList);

        if (origAddressList == null && (newAddressList != null && newAddressList.size() > 0)) {
            addressSet.addAll(newAddressList);
            return addressSet;
        }
        if ((origAddressList != null && origAddressList.size() > 0)
                && (newAddressList == null || newAddressList.size() == 0)) {
            log.info("origAddress list size =" + origAddressList.size());
            addressSet.addAll(origAddressList);
            return addressSet;
        }

        // if in new address, but not in old, then add it with operation 1
        // else add with operation 2
        Iterator<Address> it = newAddressList.iterator();
        while (it.hasNext()) {
            Address addr = it.next();
            // check the old list
            Iterator<Address> origIt = origAddressList.iterator();
            boolean found = false;
            while (origIt.hasNext()) {
                Address origAdr = origIt.next();
                if (origAdr.getAddressId().equals(addr.getAddressId())) {
                    found = true;
                }
            }
            if (!found) {
                addr.setOperation(AttributeOperationEnum.ADD);
                addressSet.add(addr);
            } else {
                if (addr.getOperation() == AttributeOperationEnum.DELETE) {
                    addressSet.add(addr);
                } else {
                    addr.setOperation(AttributeOperationEnum.REPLACE);
                    addressSet.add(addr);
                }
            }
        }

        // if the old address is not in the list, the add it
        Iterator<Address> curIt = origAddressList.iterator();
        if (curIt.hasNext()) {
            Address adr = curIt.next();
            addressSet.add(adr);
        }
        return addressSet;
    }

    static private Set<Phone> getFullPhoneList(Set<Phone> newPhoneList, Set<Phone> origPhoneList) {
        Set<Phone> phoneSet = new HashSet<Phone>();

        if (origPhoneList == null && newPhoneList != null) {
            phoneSet.addAll(newPhoneList);
            return phoneSet;
        }

        if ((origPhoneList != null && origPhoneList.size() > 0)
                && (newPhoneList == null || newPhoneList.size() == 0)) {
            phoneSet.addAll(origPhoneList);
            return phoneSet;
        }

        // if in new address, but not in old, then add it with operation 1
        // else add with operation 2
        Iterator<Phone> it = newPhoneList.iterator();
        while (it.hasNext()) {
            Phone addr = it.next();
            // check the old list
            Iterator<Phone> origIt = origPhoneList.iterator();
            boolean found = false;
            while (origIt.hasNext()) {
                Phone origAdr = origIt.next();
                if (origAdr.getPhoneId().equals(addr.getPhoneId())) {
                    found = true;
                }
            }
            if (!found) {
                addr.setOperation(AttributeOperationEnum.ADD);
                phoneSet.add(addr);
            } else {
                if (addr.getOperation() == AttributeOperationEnum.DELETE) {
                    phoneSet.add(addr);
                } else {
                    addr.setOperation(AttributeOperationEnum.REPLACE);
                    phoneSet.add(addr);
                }
            }
        }

        // if the old address is not in the list, the add it
        Iterator<Phone> curIt = origPhoneList.iterator();
        if (curIt.hasNext()) {
            Phone adr = curIt.next();
            phoneSet.add(adr);
        }
        return phoneSet;
    }

    static private Set<EmailAddress> getFullEmailList(Set<EmailAddress> newPhoneList,
            Set<EmailAddress> origEmailList) {
        Set<EmailAddress> emailSet = new HashSet<EmailAddress>();

        log.info("orig email list=" + origEmailList);

        if (origEmailList == null && newPhoneList != null) {
            log.info("New email list is not null");
            emailSet.addAll(newPhoneList);
            return emailSet;
        }

        if ((origEmailList != null && origEmailList.size() > 0)
                && (newPhoneList == null || newPhoneList.size() == 0)) {
            log.info("orig email list is not null");
            emailSet.addAll(origEmailList);
            return emailSet;
        }

        // if in new address, but not in old, then add it with operation 1
        // else add with operation 2
        Iterator<EmailAddress> it = newPhoneList.iterator();
        while (it.hasNext()) {
            EmailAddress addr = it.next();
            // check the old list
            Iterator<EmailAddress> origIt = origEmailList.iterator();
            boolean found = false;
            while (origIt.hasNext()) {
                EmailAddress origAdr = origIt.next();
                if (origAdr.getEmailId().equals(addr.getEmailId())) {
                    found = true;
                }
            }
            if (!found) {
                addr.setOperation(AttributeOperationEnum.ADD);
                emailSet.add(addr);
            } else {
                if (addr.getOperation() == AttributeOperationEnum.DELETE) {
                    emailSet.add(addr);
                } else {
                    addr.setOperation(AttributeOperationEnum.REPLACE);
                    emailSet.add(addr);
                }
            }
        }

        // if the old address is not in the list, the add it
        Iterator<EmailAddress> curIt = origEmailList.iterator();
        if (curIt.hasNext()) {
            EmailAddress adr = curIt.next();
            emailSet.add(adr);
        }
        return emailSet;
    }

    static public User cloneUser(User user) {
        User newUser = new User();

        newUser.setBirthdate(user.getBirthdate());
        newUser.setCompanyOwnerId(user.getCompanyOwnerId());
        newUser.setCreateDate(user.getCreateDate());
        newUser.setCreatedBy(user.getCreatedBy());
        newUser.setEmployeeId(user.getEmployeeId());
        newUser.setEmployeeTypeId(user.getEmployeeTypeId());

        newUser.setFirstName(user.getFirstName());
        newUser.setJobCodeId(user.getJobCodeId());
        newUser.setLastName(user.getLastName());
        newUser.setLastUpdate(user.getLastUpdate());
        newUser.setLastUpdatedBy(user.getLastUpdatedBy());
        newUser.setLocationCd(user.getLocationCd());
        newUser.setLocationName(user.getLocationName());
        newUser.setMdTypeId(user.getMdTypeId());
        newUser.setClassification(user.getClassification());
        newUser.setMiddleInit(user.getMiddleInit());
        newUser.setPrefix(user.getPrefix());
        newUser.setSex(user.getSex());
        newUser.setStatus(user.getStatus());
        newUser.setSecondaryStatus(user.getSecondaryStatus());
        newUser.setSuffix(user.getSuffix());
        newUser.setTitle(user.getTitle());
        newUser.setId(user.getId());
        newUser.setUserTypeInd(user.getUserTypeInd());
        newUser.setMailCode(user.getMailCode());
        newUser.setCostCenter(user.getCostCenter());
        newUser.setStartDate(user.getStartDate());
        newUser.setLastDate(user.getLastDate());
        newUser.setClaimDate(user.getClaimDate());
        newUser.setNickname(user.getNickname());
        newUser.setMaidenName(user.getMaidenName());
        newUser.setPasswordTheme(user.getPasswordTheme());
        newUser.setEmail(user.getEmail());
        newUser.setShowInSearch(user.getShowInSearch());
        newUser.setAlternateContactId(user.getAlternateContactId());

        //
        HashMap<String, UserAttribute> userAttributes = new HashMap<String, UserAttribute>(0);
        userAttributes.putAll(user.getUserAttributes());
        newUser.setUserAttributes(userAttributes);

        newUser.setPhones(user.getPhones());

        newUser.setAddresses(user.getAddresses());

        newUser.setEmailAddresses(user.getEmailAddresses());

        return newUser;

    }

    static private void determineUserChanges(ExtensibleUser extUser, User newUser, User origUser) {
        SimpleDateFormat df = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss Z");

        // for each field in the user object
        // - check the null conditions
        // - check if the values are different
        // set the operation

        // set up the origUser object for reflection
        Class origUserClass = origUser.getClass();
        origUserClass.getDeclaredMethods();

        Class newUserClass = newUser.getClass();
        Method[] userMethod = newUserClass.getDeclaredMethods();
        if (userMethod != null && userMethod.length > 0) {
            // loop through the methods
            for (Method m : userMethod) {
                String methName = m.getName();
                String returnType = m.getReturnType().getName();

                // log.info("MethodName=" + methName);
                // log.info("Return type:=" + returnType ) ;

                String value = null;
                String origValue = null;
                int operation = 0;
                try {
                    if (methName.startsWith("get")) {
                        if (returnType.contains("String")) {
                            value = (String) m.invoke(newUser, null);
                            operation = getStringOperationValue(origUser, origUserClass, methName, value);
                        }
                        if (returnType.contains("Date")) {
                            Date temp = (Date) m.invoke(newUser, null);
                            long time = 0;
                            if (temp != null) {
                                time = temp.getTime();
                                value = df.format(temp);
                                // value = temp.toString();
                                operation = getDateOperationValue(origUser, origUserClass, methName, time);

                            }
                        }
                        if (returnType.contains("UserStatusEnum")) {
                            UserStatusEnum temp = (UserStatusEnum) m.invoke(newUser, null);
                            if (temp != null) {

                                value = temp.getValue();
                                operation = getStatusOperationValue(origUser, origUserClass, methName, value);
                            }
                        }
                        // get the original value

                        // build the method name - to show the object that the
                        // value came from
                        // get rid of the "get" in the name
                        methName = "USER." + methName.substring(3);
                        extUser.getAttributes().add(new ExtensibleAttribute(methName, value, operation, "String"));
                    }
                } catch (Exception it) {
                    it.printStackTrace();
                }

            }
        }

    }

    static private int getStatusOperationValue(User origUser, Class origUserClass, String methName, String value) {
        int operation = 0;
        try {
            Method method = origUserClass.getMethod(methName, null);
            UserStatusEnum origValue = (UserStatusEnum) method.invoke(origUser, null);

            // log.info("operation check: method name=" + method + " value=" +
            // value + " " + origValue);

            // check what has changed
            if (origValue == null && value != null) {
                return 2;
            }
            if (origValue != null && value == null) {
                return 2;
            }
            if (origValue != null && !origValue.getValue().equalsIgnoreCase(value)) {
                return 2;
            }
            return 0;

        } catch (Exception e) {
            e.printStackTrace();
        }
        return operation;

    }

    static private int getDateOperationValue(User origUser, Class origUserClass, String methName, long newTime) {
        int operation = 0;
        long origTime = 0;

        try {
            Method method = origUserClass.getMethod(methName, null);
            Date origValue = (Date) method.invoke(origUser, null);

            if (origValue != null) {
                origTime = origValue.getTime();
            }
            // log.info("date comparison=" + origTime + " - " + newTime);

            if (origTime != newTime) {
                return 2;
            }
            return 0;

        } catch (Exception e) {
            e.printStackTrace();
        }
        return operation;

    }

    static private int getStringOperationValue(User origUser, Class origUserClass, String methName, String value) {
        int operation = 0;
        try {
            Method method = origUserClass.getMethod(methName, null);
            String origValue = (String) method.invoke(origUser, null);

            // .info("operation check: method name=" + method + " value=" +
            // value + " " + origValue);

            // check what has changed
            if (origValue == null && value != null) {
                return 2;
            }
            if (origValue != null && value == null) {
                return 2;
            }
            if (origValue != null && !origValue.equalsIgnoreCase(value)) {
                return 2;
            }
            return 0;

        } catch (Exception e) {
            e.printStackTrace();
        }
        return operation;

    }

    public LoginDataService getLoginManager() {
        return loginManager;
    }

    public void setLoginManager(LoginDataService loginManager) {
        this.loginManager = loginManager;
    }

}