package is.idega.idegaweb.golf.business; import is.idega.idegaweb.golf.clubs.presentation.UnionCorrect; import is.idega.idegaweb.golf.entity.AddressHome; import is.idega.idegaweb.golf.entity.Country; import is.idega.idegaweb.golf.entity.CountryHome; import is.idega.idegaweb.golf.entity.Member; import is.idega.idegaweb.golf.entity.MemberHome; import is.idega.idegaweb.golf.entity.PhoneHome; import is.idega.idegaweb.golf.entity.Union; import is.idega.idegaweb.golf.entity.UnionHome; import is.idega.idegaweb.golf.entity.ZipCode; import is.idega.idegaweb.golf.entity.ZipCodeHome; import is.idega.idegaweb.golf.legacy.business.GolfLegacyBusiness; import is.idega.idegaweb.golf.util.GolfConstants; import java.rmi.RemoteException; import java.sql.Date; import java.sql.SQLException; import java.util.Collection; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.StringTokenizer; import javax.ejb.CreateException; import javax.ejb.FinderException; import javax.ejb.RemoveException; import com.idega.business.IBOLookupException; import com.idega.business.IBOServiceBean; import com.idega.core.contact.data.Email; import com.idega.core.contact.data.Phone; import com.idega.core.location.data.Address; import com.idega.data.IDOLookup; import com.idega.data.IDOLookupException; import com.idega.presentation.IWContext; import com.idega.presentation.PresentationObject; import com.idega.user.business.GroupBusiness; import com.idega.user.business.UserBusiness; import com.idega.user.business.UserGroupPlugInBusiness; import com.idega.user.data.Gender; import com.idega.user.data.GenderHome; import com.idega.user.data.Group; import com.idega.user.data.MetadataConstants; import com.idega.user.data.User; import com.idega.user.data.UserHome; import com.idega.util.text.SocialSecurityNumber; /** * This UserGroupPlugin is used to synchronize the golf data tables with the * user system. <br> * Methods in this plugin are called after the LDAPReplicator has replicated a * user. * * @author <a href="mailto:gimmi@idega.is">Grimur Jonsson</a>,<a * href="mailto:eiki@idega.is">Eirikur S. Hrafnsson</a> */ public class UserSynchronizationBusinessBean extends IBOServiceBean implements UserSynchronizationBusiness, UserGroupPlugInBusiness, GolfConstants { private static int USERS_PER_CHECK = 10; private UserHome uHome; private MemberHome mHome; private GenderHome gHome; private AddressHome oldAddressHome; private ZipCodeHome zHome; private CountryHome cHome; private PhoneHome oldPhoneHome; private UnionHome unionHome; private UnionCorrect unionCorrect = new UnionCorrect(); private UserBusiness userBusiness; private GolfLegacyBusiness golfLegacyBiz; private static HashMap genders = new HashMap(); private static HashMap postalToAreaCode = new HashMap(); private static HashMap countries = new HashMap(); private boolean initDone = false; private static String NO_CLUB_ABBR = "-"; public UserSynchronizationBusinessBean() { super(); } public synchronized boolean sync() { try { init(); Collection unionGroups = userBusiness.getGroupHome().findGroupsByType(GolfConstants.GROUP_TYPE_CLUB); if (unionGroups != null) { Iterator iter = unionGroups.iterator(); Collection users; Group group; Union union; User user; Member member; while (iter.hasNext()) { group = (Group) iter.next(); users = userBusiness.getGroupBusiness().getUsers(group); if (users != null) { union = getUnionFromGroup(group); // System.out.println("Synchronizing Union : // "+group.getAbbrevation()+" // ("+group.getPrimaryKey().toString()+")"); Iterator userIter = users.iterator(); while (userIter.hasNext() && union != null) { user = (User) userIter.next(); if (user.getPersonalID() != null) { System.out.print("Synchronizing user : " + user.getPersonalID() + " (" + user.getID() + ") "); member = getMemberFromUser(user); try { System.out.print("."); synchronizeAddresses(user, member); System.out.print("."); synchronizePhones(user, member); System.out.print("."); unionCorrect.setMainUnion(member, union.getID()); System.out.println("done."); } catch (SQLException e1) { System.out.println("failed (" + e1.getMessage() + ")"); } // synchronizeUser( user, // getMemberFromUser(user)); } else { System.out.println("Synchronizing SKIPPING user : " + user.getName() + " (" + user.getID() + ") : personalID = NULL"); } } } } } } catch (IBOLookupException e) { e.printStackTrace(); } catch (RemoteException e) { e.printStackTrace(); } catch (FinderException e) { e.printStackTrace(); } catch (CreateException e) { e.printStackTrace(); } return true; } private Member getMemberFromUser(User user) throws RemoteException, CreateException { Member member = null; try { member = mHome.findMemberByIWMemberSystemUser(user); } catch (FinderException f) { try { member = mHome.findBySSN(user.getPersonalID()); member.setICUser(user); member.store(); } catch (FinderException f1) { member = createMemberFromUser(user); } } return member; } public synchronized boolean synchronize() { try { init(); int currentCheck = 0; boolean isSynched = false; Collection icUsers; Iterator icUserIter; User icUser; Member member = null; int returnedEnts = USERS_PER_CHECK; while (!isSynched && returnedEnts == USERS_PER_CHECK) { icUsers = getUserBatch(uHome, currentCheck); returnedEnts = 0; if (icUsers != null) { icUserIter = icUsers.iterator(); while (icUserIter.hasNext() && !isSynched) { ++returnedEnts; icUser = (User) icUserIter.next(); try { member = mHome.findMemberByIWMemberSystemUser(icUser); isSynched = true; } catch (FinderException f) { try { member = mHome.findBySSN(icUser.getPersonalID()); } catch (FinderException f1) { } synchronizeUser(icUser, member); } } } ++currentCheck; } } catch (Exception e) { e.printStackTrace(); return false; } return true; } /** * @throws IDOLookupException * @throws IBOLookupException */ private void init() throws IDOLookupException, IBOLookupException { if (!initDone) { uHome = (UserHome) IDOLookup.getHome(User.class); mHome = (MemberHome) IDOLookup.getHome(Member.class); gHome = (GenderHome) IDOLookup.getHome(Gender.class); oldAddressHome = (AddressHome) IDOLookup.getHome(is.idega.idegaweb.golf.entity.Address.class); zHome = (ZipCodeHome) IDOLookup.getHome(ZipCode.class); cHome = (CountryHome) IDOLookup.getHome(Country.class); oldPhoneHome = (PhoneHome) IDOLookup.getHome(is.idega.idegaweb.golf.entity.Phone.class); unionHome = (UnionHome) IDOLookup.getHome(Union.class); userBusiness = (UserBusiness) getServiceInstance(UserBusiness.class); golfLegacyBiz = (GolfLegacyBusiness) getServiceInstance(GolfLegacyBusiness.class); initDone = true; } } private void synchronizeUser(User user, Member member) throws CreateException, RemoteException { if (user.getPersonalID() != null) { if (member == null) { member = createMemberFromUser(user); } System.out.print("Synchronizing user : " + user.getPersonalID() + " (" + user.getID() + ") "); System.out.print("."); synchronizeAddresses(user, member); System.out.print("."); synchronizePhones(user, member); System.out.print("."); synchronizeUnion(user, member); System.out.println("done."); } else { System.out.println("Synchronizing SKIPPING user : " + user.getName() + " (" + user.getID() + ") : personalID = NULL"); } } private void synchronizeUnion(User user, Member member) throws RemoteException { String mainUnion = user.getMetaData(MetadataConstants.MAIN_CLUB_GOLF_META_DATA_KEY); mainUnion = ("".equals(mainUnion)) ? null : mainUnion; String subUnions = user.getMetaData(MetadataConstants.SUB_CLUBS_GOLF_META_DATA_KEY); subUnions = ("".equals(subUnions)) ? null : subUnions; synchronizeUnion(user, member, mainUnion, subUnions); } private void synchronizeUnion(User user, Member member, String mainUnion, String subUnions) throws RemoteException { // first we deactivate all sub club union member infos, // otherwise we will miss the changes when only some of the subclubs are // removed try { // deactivate all subclubs member infos unionCorrect.setMemberInactiveInAllSubUnions(member); } catch (SQLException e) { e.printStackTrace(); } // must be done here because otherwise the wrong sub union will be // deactivated // and we will miss a main club change, because the unionmemberinfo will // still exist try { unionCorrect.setMemberInactiveInMainUnion(member); } catch (SQLException e) { e.printStackTrace(); } if (subUnions != null) { StringTokenizer tokens = new StringTokenizer(subUnions, ","); while (tokens.hasMoreTokens()) { String subAbbr = tokens.nextToken(); Union sub = getUnionFromAbbreviation(subAbbr); if (sub != null) { try { unionCorrect.setMemberActiveInSubUnion(member, sub.getID()); } catch (SQLException e) { e.printStackTrace(); } } } } // must be done last! if (mainUnion != null) { Union main = getUnionFromAbbreviation(mainUnion); if (main != null) { try { unionCorrect.setMainUnion(member, main.getID()); } catch (SQLException e) { e.printStackTrace(); } } } } /** * @param group * @param union * @return */ private Union getUnionFromGroup(Group group) { Union union = null; try { union = unionHome.findUnionByIWMemberSystemGroup(group); } catch (FinderException e) { try { union = unionHome.findByAbbreviation(group.getAbbrevation()); union.setICGroup(group); union.store(); } catch (FinderException e1) { System.out.println("UserSynchronizationBusinessBean : union not found : " + group.getAbbrevation()); union = null; } } return union; } private Union getUnionFromAbbreviation(String abbr) { Union union = null; GroupBusiness groupBiz; try { groupBiz = (GroupBusiness) this.getServiceInstance(GroupBusiness.class); Collection groups = groupBiz.getGroupsByAbbreviation(abbr); Group unionGroup = null; if (groups != null && !groups.isEmpty()) { for (Iterator possible = groups.iterator(); possible.hasNext();) { Group group = (Group) possible.next(); if (group.getGroupType().equals(GolfConstants.GROUP_TYPE_CLUB)) { // TAKES THE FIRST CLUB THAT MATCHES, NOT SAFE...but // some idiots started using abbreviation for other // group types and then nothing worked // the second search should fail if we stumble on to the // wrong group but at least then we get an error // message. -Eiki unionGroup = group; break; } } if (unionGroup != null) { union = getUnionFromGroup(unionGroup); } } } catch (IBOLookupException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (RemoteException e) { // TODO Auto-generated catch block e.printStackTrace(); } return union; } private void synchronizePhones(User user, Member member) throws CreateException { try { Collection phones = user.getPhones(); is.idega.idegaweb.golf.entity.Phone[] memberPhones = member.getPhone(); Phone phone; if (phones != null) { boolean phoneExists = false; Iterator iter = phones.iterator(); while (iter.hasNext()) { phone = (Phone) iter.next(); phoneExists = false; for (int i = 0; i < memberPhones.length && !phoneExists; i++) { if (phone.getNumber().equals(memberPhones[i].getNumber())) { phoneExists = true; } } if (!phoneExists) { is.idega.idegaweb.golf.entity.Phone ph = oldPhoneHome.create(); ph.setNumber(phone.getNumber()); if (phone.getPhoneTypeId() > 0) { ph.setPhoneTypeId(phone.getPhoneTypeId()); } //this is iceland, needed on golf.is ph.setCountryId(1); ph.store(); } } } } catch (SQLException e) { e.printStackTrace(); } } private void synchronizeAddresses(User user, Member member) throws CreateException { try { is.idega.idegaweb.golf.entity.Address[] memberAddresses = member.getAddress(); Collection coll = user.getAddresses(); if (coll != null) { Iterator iter = coll.iterator(); Address address; Country country; ZipCode zip; boolean addressExists = false; while (iter.hasNext()) { addressExists = false; address = (Address) iter.next(); for (int i = 0; i < memberAddresses.length && !addressExists; i++) { if (address.getStreetName().equals(memberAddresses[i].getStreet())) { addressExists = true; } } if (!addressExists) { is.idega.idegaweb.golf.entity.Address addr = oldAddressHome.create(); addr.setStreet(address.getStreetName()); addr.setStreetNumber(address.getStreetNumber()); int postalCode = address.getPostalCodeID(); if (postalCode > 0 && postalToAreaCode.get(new Integer(postalCode)) == null) { try { zip = zHome.findByCode(address.getPostalCode().getPostalCode()); addr.setZipcode(zip); postalToAreaCode.put(new Integer(postalCode), zip.getIDInteger()); } catch (FinderException e) { System.out.println("UserSynchronizationBusinessBean - zip code not found: " + address.getPostalCode().getPostalCode()+ ", "+e.getMessage()); // System.out.println("UserSynchronizationBusinessBean // : zip code not found : // "+address.getPostalCode().getPostalCode()); } } else if (postalCode > 0) { addr.setZipcodeId((Integer) postalToAreaCode.get(new Integer(postalCode))); } int countryId = address.getCountryId(); if (countryId > 0 && countries.get(new Integer(countryId)) == null) { try { country = cHome.findByAbbreviation(address.getCountry().getIsoAbbreviation()); addr.setCountryId(country.getID()); countries.put(new Integer(countryId), country.getIDInteger()); } catch (FinderException e) { System.out.println("UserSynchronizationBusinessBean : country not found : " + address.getCountry().getIsoAbbreviation()); } } else if (countryId > 0) { addr.setCountryId((Integer) countries.get(new Integer(countryId))); } addr.setAddressType("home"); addr.store(); } } } } catch (SQLException e) { e.printStackTrace(); } } private Member createMemberFromUser(User user) throws CreateException, RemoteException { Member member = mHome.create(); correctName(user, member); member.setDateOfBirth(user.getDateOfBirth()); correctGender(user, member); correctSocialSecurityNumber(user, member); correctEmails(member, user); member.setICUser(user); member.store(); return member; } /** * @param member * @param user */ private void correctEmails(Member member, User user) { Collection emails = user.getEmails(); if (emails != null && !emails.isEmpty()) { Iterator iter = emails.iterator(); member.setEmail(((Email) iter.next()).getEmailAddress()); } } /** * @param user * @param member */ private void correctSocialSecurityNumber(User user, Member member) { member.setSocialSecurityNumber(user.getPersonalID()); } /** * @param user * @param member */ private void correctName(User user, Member member) { member.setFirstName(user.getFirstName()); member.setMiddleName(user.getMiddleName()); member.setLastName(user.getLastName()); member.setFullName(); } /** * @param user * @param member */ private void correctGender(User user, Member member) { int genderId = user.getGenderID(); if (genderId > 0) { if (genders.get(new Integer(genderId)) == null) { try { Gender gender = gHome.findByPrimaryKey(new Integer(genderId)); genders.put(new Integer(genderId), gender.getName().substring(0, 1).toUpperCase()); } catch (FinderException e) { e.printStackTrace(); } } member.setGender((String) genders.get(new Integer(genderId))); } } private Collection getUserBatch(UserHome uHome, int currentCheck) throws FinderException { return uHome.findNewestUsers(USERS_PER_CHECK, currentCheck * USERS_PER_CHECK); } /* * (non-Javadoc) * * @see com.idega.user.business.UserGroupPlugInBusiness#beforeUserRemove(com.idega.user.data.User) */ public void beforeUserRemove(User user, Group parentGroup) throws RemoveException, RemoteException { // TODO Auto-generated method stub } /* * (non-Javadoc) * * @see com.idega.user.business.UserGroupPlugInBusiness#afterUserCreateOrUpdate(com.idega.user.data.User, Group parentGrou) */ public void afterUserCreateOrUpdate(User user, Group parentGroup) throws CreateException, RemoteException { init(); if (user.getPersonalID() != null) { // System.out.println("Synchronizing user : "+user.getPersonalID()+" // ("+user.getID()+") "); Member member = getMemberFromUser(user); // try { correctSocialSecurityNumber(user, member); correctDateOfBirth(user, member); correctName(user, member); correctGender(user, member); member.store(); synchronizeAddresses(user, member); synchronizePhones(user, member); synchronizeUnion(user, member); // } // catch (SQLException e1) { // System.out.println("failed ("+e1.getMessage()+")"); // } } } private void correctUser(User user, String name, String gender, String dateOfBirth, String main, String subs) { if (name != null) { user.setFullName(name); } if (dateOfBirth != null) { Date birthDate = null; try { birthDate = java.sql.Date.valueOf(dateOfBirth); user.setDateOfBirth(birthDate); } catch (IllegalArgumentException e) { System.err.println("UserSynchronizationBusiness: date of birth format is invalid.Should be yyyy-MM-dd : " + dateOfBirth); } } if (gender != null) { Integer genderId; try { genderId = getUserBusiness().getGenderId(gender); user.setGender(genderId); } catch (Exception e) { e.printStackTrace(); } } user.setMetaData(MetadataConstants.MAIN_CLUB_GOLF_META_DATA_KEY, main); user.setMetaData(MetadataConstants.SUB_CLUBS_GOLF_META_DATA_KEY, subs); user.store(); } private void correctDateOfBirth(User user, Member member) { if (user != null && user.getDateOfBirth() != null) { member.setDateOfBirth(user.getDateOfBirth()); } else if (member.getDateOfBirth() == null && member.getSocialSecurityNumber() != null) { try { Date date = SocialSecurityNumber.getDateFromSocialSecurityNumber(member.getSocialSecurityNumber(), false); if (date != null) { member.setDateOfBirth(date); } } catch (Exception e) { System.out.println("Cannot create DateOfBirth from ssn = " + member.getSocialSecurityNumber() + " (member_id = " + member.getPrimaryKey().toString() + ")"); } } } public void syncUserFromRequest(IWContext iwc) { try { String subs = iwc.getParameter(GolfConstants.SUB_CLUBS_META_DATA_KEY); String main = iwc.getParameter(GolfConstants.MAIN_CLUB_META_DATA_KEY); String uuid = iwc.getParameter(GolfConstants.MEMBER_UUID); String pin = iwc.getParameter(GolfConstants.MEMBER_PIN); String name = iwc.getParameter(GolfConstants.MEMBER_NAME); String gender = iwc.getParameter(GolfConstants.MEMBER_GENDER); String dateOfBirth = iwc.getParameter(GolfConstants.MEMBER_DATE_OF_BIRTH); if (uuid != null && pin != null) { init(); System.out.println("UserSync: pin:" + pin + " uuid:" + uuid + " name:" + name + " mainclub:" + main + " subclubs:" + subs); User user = null; try { user = getUserBusiness().getUserByUniqueId(uuid); } catch (FinderException e) { System.out.println("UserSync: User with uuid:" + uuid + " was not found"); } try { if (user == null) { user = getUserBusiness().getUser(pin); user.setUniqueId(uuid); } } catch (FinderException e) { System.out.println("UserSync: User with pin:" + pin + " was not found and will be created"); } if (user == null) { user = getUserBusiness().createUserByPersonalIDIfDoesNotExist(name, pin, null, null); user.setUniqueId(uuid); user.store(); } if (user != null) { correctUser(user, name, gender, dateOfBirth, main, subs); afterUserCreateOrUpdate(user,null); } else { System.err.println(" UserSync: USER IS NULL " + uuid + " " + pin); } } // else { // THIS WILL FILL THE LOG BECAUSE IT IS DONE WITH A SERVLET FILTER // System.err.println(" UserSync: USER CANNOT BE SYNCHRONIZED " + uuid + " " + pin); // } } catch (IBOLookupException e) { e.printStackTrace(); } catch (RemoteException e) { e.printStackTrace(); } catch (CreateException e) { e.printStackTrace(); } } /* * (non-Javadoc) * * @see com.idega.user.business.UserGroupPlugInBusiness#beforeGroupRemove(com.idega.user.data.Group, Group parentGroup) */ public void beforeGroupRemove(Group group, Group parentGroup) throws RemoveException, RemoteException { // TODO Auto-generated method stub } /* * (non-Javadoc) * * @see com.idega.user.business.UserGroupPlugInBusiness#afterGroupCreateOrUpdate(com.idega.user.data.Group, Group parentGroup) */ public void afterGroupCreateOrUpdate(Group group, Group parentGroup) throws CreateException, RemoteException { // if the group is a club then search for the union and update it, // create if it does not exist // init(); // Union union = getUnionFromGroup(group); // if(union==null){ // // // } } /* * (non-Javadoc) * * @see com.idega.user.business.UserGroupPlugInBusiness#instanciateEditor(com.idega.user.data.Group) */ public PresentationObject instanciateEditor(Group group) throws RemoteException { // TODO Auto-generated method stub return null; } /* * (non-Javadoc) * * @see com.idega.user.business.UserGroupPlugInBusiness#instanciateViewer(com.idega.user.data.Group) */ public PresentationObject instanciateViewer(Group group) throws RemoteException { // TODO Auto-generated method stub return null; } /* * (non-Javadoc) * * @see com.idega.user.business.UserGroupPlugInBusiness#getUserPropertiesTabs(com.idega.user.data.User) */ public List getUserPropertiesTabs(User user) throws RemoteException { // TODO Auto-generated method stub return null; } /* * (non-Javadoc) * * @see com.idega.user.business.UserGroupPlugInBusiness#getGroupPropertiesTabs(com.idega.user.data.Group) */ public List getGroupPropertiesTabs(Group group) throws RemoteException { // TODO Auto-generated method stub return null; } /* * (non-Javadoc) * * @see com.idega.user.business.UserGroupPlugInBusiness#getMainToolbarElements() */ public List getMainToolbarElements() throws RemoteException { // TODO Auto-generated method stub return null; } /* * (non-Javadoc) * * @see com.idega.user.business.UserGroupPlugInBusiness#getGroupToolbarElements(com.idega.user.data.Group) */ public List getGroupToolbarElements(Group group) throws RemoteException { // TODO Auto-generated method stub return null; } /* * (non-Javadoc) * * @see com.idega.user.business.UserGroupPlugInBusiness#isUserAssignableFromGroupToGroup(com.idega.user.data.User, * com.idega.user.data.Group, com.idega.user.data.Group) */ public String isUserAssignableFromGroupToGroup(User user, Group sourceGroup, Group targetGroup) throws RemoteException { // TODO Auto-generated method stub return null; } /* * (non-Javadoc) * * @see com.idega.user.business.UserGroupPlugInBusiness#isUserSuitedForGroup(com.idega.user.data.User, * com.idega.user.data.Group) */ public String isUserSuitedForGroup(User user, Group targetGroup) throws RemoteException { // TODO Auto-generated method stub return null; } /* * (non-Javadoc) * * @see com.idega.user.business.UserGroupPlugInBusiness#canCreateSubGroup(com.idega.user.data.Group,java.lang.String) */ public String canCreateSubGroup(Group group, String groupTypeOfSubGroup) throws RemoteException { // TODO Auto-generated method stub return null; } public UserBusiness getUserBusiness() throws IBOLookupException { return (UserBusiness) getServiceInstance(UserBusiness.class); } }