package is.idega.idegaweb.member.business.plugins; import is.idega.idegaweb.member.presentation.GroupAgeGenderTab; import is.idega.idegaweb.member.util.IWMemberConstants; import java.rmi.RemoteException; import java.sql.Date; import java.util.ArrayList; import java.util.Calendar; import java.util.GregorianCalendar; import java.util.List; import java.util.Locale; import java.util.StringTokenizer; import javax.ejb.CreateException; import javax.ejb.EJBException; import javax.ejb.FinderException; import javax.ejb.RemoveException; import com.idega.business.IBOServiceBean; import com.idega.idegaweb.IWBundle; import com.idega.idegaweb.IWMainApplication; import com.idega.idegaweb.IWResourceBundle; import com.idega.idegaweb.UnavailableIWContext; import com.idega.presentation.IWContext; import com.idega.presentation.PresentationObject; 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.User; /** *@author <a href="mailto:thomas@idega.is">Thomas Hilbig</a> *@version 1.0 */ public class AgeGenderPluginBusinessBean extends IBOServiceBean implements AgeGenderPluginBusiness, UserGroupPlugInBusiness { public static final String AGE_GENDER_PLUGIN_BUSINESS_BUNDLE_IDENTIFIER = "is.idega.idegaweb.member"; private static final String NULL = "null"; private static final int LOWER_AGE_LIMIT_DEFAULT = 0; private static final int UPPER_AGE_LIMIT_DEFAULT = 110; private static final String DEFAULT_KEY_DATE = "12-31"; /// 31st of december <month>-<day> private static final String LOWER_AGE_LIMIT_META_DATA_KEY = "lowerAgeLimit"; private static final String UPPER_AGE_LIMIT_META_DATA_KEY = "upperAgeLimit"; private static final String GENDER_META_DATA_KEY = "gender"; private static final String AGE_LIMIT_IS_STRINGENT_CONDITION_META_DATA_KEY = "ageLimitIsStringentCondition"; private static final String KEY_DATE_FOR_AGE_META_DATA_KEY = "keyDateForAge"; private static final int FEMALE = 0; private static final int MALE = 1; private static final int NEUTRAL = 2; private Object malePrimaryKeyFromDatastore = null; private Object femalePrimaryKeyFromDatastore = null; private static final String META_DATA_NATIONALITY_DEPENDENT = "nationalityDependent"; private static final String META_DATA_CLUB_MEMBER_EXCHANGE_DEPENDENT = "clubMemberExchangeDependent"; private void setGender(Group group, int gender){ // choose NEUTRAL if either both are true or both values are false if (NEUTRAL == gender) { // remove meta data does not work // ((GenericEntity) group).removeMetaData(GENDER_META_DATA_KEY); group.setMetaData(GENDER_META_DATA_KEY, NULL); return; } try { GenderHome home = (GenderHome) this.getIDOHome(Gender.class); if (MALE == gender) { String maleId = ((Integer) home.getMaleGender().getPrimaryKey()).toString(); group.setMetaData(GENDER_META_DATA_KEY, maleId); } else { String femaleId = ((Integer) home.getFemaleGender().getPrimaryKey()).toString(); group.setMetaData(GENDER_META_DATA_KEY, femaleId); } } catch (RemoteException e) { System.err.println("[GeneralGroupInfoTab] remote error, GroupId : " + group.getPrimaryKey().toString()); e.printStackTrace(System.err); } catch (FinderException e) { System.err.println("[GeneralGroupInfoTab] find error, GroupId : " + group.getPrimaryKey().toString()); e.printStackTrace(System.err); } } public void setMale(Group group) { setGender(group, MALE); } public void setFemale(Group group) { setGender(group, FEMALE); } public void setNeutral(Group group) { setGender(group, NEUTRAL); } private int getGender(Group group) throws RemoteException, FinderException { String genderIdString = group.getMetaData(GENDER_META_DATA_KEY); if (genderIdString == null || NULL.equals(genderIdString)) { // meta data was not set // return NEUTRAL return NEUTRAL; } Integer genderId = new Integer(genderIdString); return getMyGenderIdForGenderId(genderId); } private int getMyGenderIdForGenderId(Integer genderId) throws RemoteException, FinderException { if(this.malePrimaryKeyFromDatastore == null){ GenderHome home = (GenderHome) this.getIDOHome(Gender.class); this.malePrimaryKeyFromDatastore = home.getMaleGender().getPrimaryKey(); this.femalePrimaryKeyFromDatastore = home.getFemaleGender().getPrimaryKey(); } if (genderId.equals(this.malePrimaryKeyFromDatastore)) { return MALE; } else if (genderId.equals(this.femalePrimaryKeyFromDatastore)){ return FEMALE; } throw new FinderException("Id of gender was not found"); } public boolean isFemale(Group group) throws RemoteException, FinderException { return FEMALE == getGender(group); } public boolean isNeutral(Group group) throws RemoteException, FinderException { return NEUTRAL == getGender(group); } public boolean isMale(Group group) throws RemoteException, FinderException { return MALE == getGender(group); } public void setAgeLimitIsStringentCondition(Group group, boolean ageLimitIsStringentCondition) { if (ageLimitIsStringentCondition) { group.setMetaData( AGE_LIMIT_IS_STRINGENT_CONDITION_META_DATA_KEY, new Boolean(true).toString()); } else { // remove meta data does not work, set false group.setMetaData( AGE_LIMIT_IS_STRINGENT_CONDITION_META_DATA_KEY, new Boolean(false).toString()); } } public boolean isAgeLimitStringentCondition(Group group) { String ageLimitIsStringentConditionString = group.getMetaData(AGE_LIMIT_IS_STRINGENT_CONDITION_META_DATA_KEY); return !(ageLimitIsStringentConditionString == null || NULL.equals(ageLimitIsStringentConditionString) || ! (new Boolean(ageLimitIsStringentConditionString).booleanValue())); } public void setLowerAgeLimit(Group group, int lowerAgeLimit) { if (lowerAgeLimit == LOWER_AGE_LIMIT_DEFAULT) { // remove meta data does not work // ((GenericEntity) group).removeMetaData(LOWER_AGE_LIMIT_META_DATA_KEY); group.setMetaData(LOWER_AGE_LIMIT_META_DATA_KEY, NULL); } else { group.setMetaData(LOWER_AGE_LIMIT_META_DATA_KEY, Integer.toString(lowerAgeLimit)); } } public int getLowerAgeLimit(Group group) { String lowerAgeLimitString = group.getMetaData(LOWER_AGE_LIMIT_META_DATA_KEY); if (lowerAgeLimitString == null || NULL.equals(lowerAgeLimitString)) { return LOWER_AGE_LIMIT_DEFAULT; } else { return Integer.parseInt(lowerAgeLimitString); } } public void setUpperAgeLimit(Group group, int upperAgeLimit) { if (upperAgeLimit == UPPER_AGE_LIMIT_DEFAULT) { // remove meta data does not work group.setMetaData(UPPER_AGE_LIMIT_META_DATA_KEY, NULL); } else { group.setMetaData(UPPER_AGE_LIMIT_META_DATA_KEY, Integer.toString(upperAgeLimit)); } } public int getUpperAgeLimit(Group group) { String upperAgeLimitString = group.getMetaData(UPPER_AGE_LIMIT_META_DATA_KEY); if (upperAgeLimitString == null || NULL.equals(upperAgeLimitString)) { return UPPER_AGE_LIMIT_DEFAULT; } else { return Integer.parseInt(upperAgeLimitString); } } public int getLowerAgeLimitDefault() { return LOWER_AGE_LIMIT_DEFAULT; } public int getUpperAgeLimitDefault() { return UPPER_AGE_LIMIT_DEFAULT; } public void setKeyDateForAge(Group group, String keyDateForAge) { if (keyDateForAge == null || keyDateForAge.length() == 0) { // remove does not work group.setMetaData(KEY_DATE_FOR_AGE_META_DATA_KEY, NULL); } else { // stored in this way <month>-<day> e.g. "04-02" (second of april) group.setMetaData(KEY_DATE_FOR_AGE_META_DATA_KEY, keyDateForAge); } } public String getKeyDateForAge(Group group) { String keyDateForAgeString = group.getMetaData(KEY_DATE_FOR_AGE_META_DATA_KEY); if (keyDateForAgeString == null || NULL.equals(keyDateForAgeString)) { return DEFAULT_KEY_DATE; } else { return keyDateForAgeString; } } /** * @see com.idega.user.business.UserGroupPlugInBusiness#afterGroupCreateOrUpdate(com.idega.user.data.Group, Group) */ public void afterGroupCreateOrUpdate(Group group, Group parentGroup) throws CreateException, RemoteException { } /** * @see com.idega.user.business.UserGroupPlugInBusiness#afterUserCreateOrUpdate(com.idega.user.data.User, Group) */ public void afterUserCreateOrUpdate(User user, Group parentGroup) throws CreateException, RemoteException { } /** * @see com.idega.user.business.UserGroupPlugInBusiness#beforeGroupRemove(com.idega.user.data.Group, Group) */ public void beforeGroupRemove(Group group, Group parentGroup) throws RemoveException, RemoteException { } /** * @see com.idega.user.business.UserGroupPlugInBusiness#beforeUserRemove(com.idega.user.data.User, Group) */ public void beforeUserRemove(User user, Group parentGroup) throws RemoveException, RemoteException { } /** * @see com.idega.user.business.UserGroupPlugInBusiness#getGroupPropertiesTabs(com.idega.user.data.Group) */ public List getGroupPropertiesTabs(Group group) throws RemoteException { List list = new ArrayList(); list.add(new GroupAgeGenderTab(group)); return list; } /** * @see com.idega.user.business.UserGroupPlugInBusiness#getUserPropertiesTabs(com.idega.user.data.User) */ public List getUserPropertiesTabs(User user) throws RemoteException { return new ArrayList(); } /** * @see com.idega.user.business.UserGroupPlugInBusiness#instanciateEditor(com.idega.user.data.Group) */ public PresentationObject instanciateEditor(Group group) throws RemoteException { return null; } /** * @see com.idega.user.business.UserGroupPlugInBusiness#instanciateViewer(com.idega.user.data.Group) */ public PresentationObject instanciateViewer(Group group) throws RemoteException { return null; } /** Checks if the user is assignable from the specified source to the specified target. * * @param user the user that should be moved. * @param sourceGroup source, the user should belong to the source * @param targetGroup target, where the user should be moved to. * @return a message that says what is wrong else null. * @throws RemoteException */ public String isUserAssignableFromGroupToGroup(User user, Group sourceGroup, Group targetGroup) throws RemoteException { // check if the source and the target are the same // already done by caller // is the user already a member of the target group? // already done by caller return isUserSuitedForGroup(user, targetGroup); } public String isUserSuitedForGroup(User user, Group targetGroup) throws RemoteException { // get my resource bundle for all the messages IWResourceBundle iwrb = getResourceBundle(); // get gender of user int genderId = user.getGenderID(); if (genderId < 0) { return iwrb.getLocalizedString("age_gender_gender_unknown", "The gender is unknown"); } int myGenderId = -1; boolean genderOkay = false; try { myGenderId = getMyGenderIdForGenderId(new Integer(genderId)); // test gender of target group genderOkay = ( (isNeutral(targetGroup)) || (isFemale(targetGroup) && myGenderId == FEMALE) || (isMale(targetGroup) && myGenderId == MALE)); } catch (RemoteException rm) { throw new RuntimeException(rm.getMessage()); } catch (FinderException fex) { throw new EJBException(fex.getMessage()); } // is gender okay? if (! genderOkay) { return iwrb.getLocalizedString("age_gender_wrong_gender_of_user", "The user's gender is not allowed for the group"); } // gender is okay..... // do we have to check the age at all? if (isAgeLimitStringentCondition(targetGroup)) { // get date of birth Date date = user.getDateOfBirth(); if (date == null) { return iwrb.getLocalizedString("age_gender_date_of_birth_of_user_not_set", "The date of birth is not set"); } GregorianCalendar dateOfBirth = new GregorianCalendar(); dateOfBirth.setTime(date); // test age of target group GregorianCalendar keyDate = getKeyDateForYearZero(targetGroup); int keyDateDay = keyDate.get(Calendar.DAY_OF_MONTH); int keyDateMonth = keyDate.get(Calendar.MONTH); int yearOfBirth = dateOfBirth.get(Calendar.YEAR); int dateOfBirthDay = dateOfBirth.get(Calendar.DAY_OF_MONTH); int dateOfBirthMonth = dateOfBirth.get(Calendar.MONTH); boolean birthdayAfterKeyDate = ( keyDateMonth < dateOfBirthMonth ) || (keyDateMonth == dateOfBirthMonth && keyDateDay < dateOfBirthDay); // get age Calendar rightNow = Calendar.getInstance(); int currentYear = rightNow.get(Calendar.YEAR); int userAge = currentYear - yearOfBirth; int lowerAgeLimit = getLowerAgeLimit(targetGroup); int upperAgeLimit = getUpperAgeLimit(targetGroup); // test lower age if (userAge < lowerAgeLimit || (userAge == lowerAgeLimit && birthdayAfterKeyDate) ) { return iwrb.getLocalizedString("age_gender_user_too_young", "The user is too young"); } // test upper age if (userAge > upperAgeLimit + 1 || (userAge == upperAgeLimit + 1 && ! birthdayAfterKeyDate) ) { return iwrb.getLocalizedString("age_gender_user_too_old", "The user is too old"); } } // everything is fine return null; } public GregorianCalendar getKeyDateForYearZero(Group group) { String keyDateForAge = getKeyDateForAge(group); StringTokenizer keyDate = new StringTokenizer(keyDateForAge," -"); int month = -1; int date = -1; try { if(keyDate.hasMoreTokens()){ month = Integer.parseInt(keyDate.nextToken()); } if(keyDate.hasMoreTokens()){ date = Integer.parseInt(keyDate.nextToken()); } if (month < 1 || month > 12 || date < 1 || date > 31) { throw new NumberFormatException("String does not represent a date"); } } catch (NumberFormatException ex) { System.err.println("[AgeGenderPLuginBusiness was not able to read the key date of group "+ group.getPrimaryKey() + " Message was " + ex.getMessage()); ex.printStackTrace(System.err); return null; } // month is zero-based GregorianCalendar calendar = new GregorianCalendar(0, month - 1, date); return calendar; } protected IWResourceBundle getResourceBundle() { IWMainApplication mainApp = getIWApplicationContext().getIWMainApplication(); Locale locale = mainApp.getSettings().getDefaultLocale(); try { IWContext iwc = IWContext.getInstance(); locale = iwc.getCurrentLocale(); } catch (UnavailableIWContext e) { } IWBundle bundle = mainApp.getBundle(getBundleIdentifier()); return bundle.getResourceBundle(locale); } protected String getBundleIdentifier() { return AGE_GENDER_PLUGIN_BUSINESS_BUNDLE_IDENTIFIER; } /* (non-Javadoc) * @see com.idega.user.business.UserGroupPlugInBusiness#getMainToolbarElements() */ public List getMainToolbarElements() throws RemoteException { return null; } /* (non-Javadoc) * @see com.idega.user.business.UserGroupPlugInBusiness#getGroupToolbarElements(com.idega.user.data.Group) */ public List getGroupToolbarElements(Group group) throws RemoteException { 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 { if(IWMemberConstants.GROUP_TYPE_CLUB_PLAYER.equals(group.getGroupType()) || (IWMemberConstants.GROUP_TYPE_CLUB_DIVISION.equals(group.getGroupType()) && IWMemberConstants.GROUP_TYPE_CLUB_PLAYER.equals(groupTypeOfSubGroup))){ return "Only leagues can add groups under this type"; } return null; } //EXTRA ISI STUFF //TODO move to KSI plugin public void setNationalityDependent(Group group, boolean isDependent){ group.setMetaData(META_DATA_NATIONALITY_DEPENDENT,new Boolean(isDependent).toString()); } public void setClubMemberExchangeDependent(Group group, boolean isDependent){ group.setMetaData(META_DATA_CLUB_MEMBER_EXCHANGE_DEPENDENT,new Boolean(isDependent).toString()); } public boolean isNationalityDependent(Group group){ String nDep = group.getMetaData(META_DATA_NATIONALITY_DEPENDENT); return !(nDep == null || NULL.equals(nDep) || ! (new Boolean(nDep).booleanValue())); } public boolean isClubMemberExchangeDependent(Group group){ String cDep = group.getMetaData(META_DATA_CLUB_MEMBER_EXCHANGE_DEPENDENT); return !(cDep == null || NULL.equals(cDep) || ! (new Boolean(cDep).booleanValue())); } }