package com.idega.core.user.business;
import java.lang.reflect.InvocationTargetException;
import java.sql.SQLException;
import java.util.List;
import com.idega.core.accesscontrol.business.LoginDBHandler;
import com.idega.core.contact.data.Email;
import com.idega.core.contact.data.Phone;
import com.idega.core.data.GenericGroup;
import com.idega.core.location.data.Address;
import com.idega.core.user.data.Gender;
import com.idega.core.user.data.User;
import com.idega.core.user.data.UserGroupRepresentative;
import com.idega.data.EntityFinder;
import com.idega.data.GenericEntity;
import com.idega.data.IDOLegacyEntity;
import com.idega.presentation.IWContext;
import com.idega.user.data.UserBMPBean;
import com.idega.util.IWTimestamp;
import com.idega.util.reflect.MethodInvoker;
/**
* Title: User
* Copyright: Copyright (c) 2000 idega.is All Rights Reserved
* Company: idega margmi�lun
* @author
* @version 1.0
*/
public class UserBusiness {
public UserBusiness() {
}
public static UserBusiness getInstance(){
return new UserBusiness();
}
public User insertUser(String firstname, String middlename, String lastname, String displayname, String description, Integer gender, IWTimestamp date_of_birth, Integer primary_group) throws SQLException{
return insertUser(firstname,middlename,lastname,displayname,description,gender,date_of_birth,primary_group, null);
}
public User insertUser(String firstname, String middlename, String lastname, String displayname, String description, Integer gender, IWTimestamp date_of_birth, Integer primary_group,String personalID) throws SQLException{
User userToAdd = ((com.idega.core.user.data.UserHome)com.idega.data.IDOLookup.getHomeLegacy(User.class)).createLegacy();
if(firstname != null){
userToAdd.setFirstName(firstname);
}
if(middlename != null){
userToAdd.setMiddleName(middlename);
}
if(lastname != null){
userToAdd.setLastName(lastname);
}
if(displayname != null){
userToAdd.setDisplayName(displayname);
}
if(description != null){
userToAdd.setDescription(description);
}
if(gender != null){
userToAdd.setGender(gender);
}
if(date_of_birth != null){
userToAdd.setDateOfBirth(date_of_birth.getSQLDate());
}
if(primary_group != null){
userToAdd.setPrimaryGroupID(primary_group);
}
if(personalID!=null){
userToAdd.setPersonalID(personalID);
}
userToAdd.insert();
UserGroupRepresentative group = ((com.idega.core.user.data.UserGroupRepresentativeHome)com.idega.data.IDOLookup.getHomeLegacy(UserGroupRepresentative.class)).createLegacy();
group.setName(userToAdd.getName());
group.setDescription("User representative in table ic_group");
group.insert();
userToAdd.setGroupID(group.getID());
userToAdd.update();
if(primary_group != null){
GenericGroup prgr = ((com.idega.core.data.GenericGroupHome)com.idega.data.IDOLookup.getHomeLegacy(GenericGroup.class)).findByPrimaryKeyLegacy(userToAdd.getPrimaryGroupID());
prgr.addUser(userToAdd);
}
return userToAdd;
}
/*
public User getUser(int userGroupRepresentativeID) throws SQLException {
List l = EntityFinder.findAllByColumn(com.idega.core.user.data.UserBMPBean.getStaticInstance(User.class),com.idega.core.user.data.UserBMPBean._COLUMNNAME_USER_GROUP_ID,userGroupRepresentativeID);
if(l != null && l.size() > 0){
return ((User)l.get(0));
}
return null;
}
public int getUserID(int userGroupRepresentativeID) throws SQLException {
User user = getUser(userGroupRepresentativeID);
if(user != null){
return user.getID();
}
return -1;
}
*/
public static void deleteUser(int userId) throws SQLException {
User delUser = ((com.idega.core.user.data.UserHome)com.idega.data.IDOLookup.getHomeLegacy(User.class)).findByPrimaryKeyLegacy(userId);
//Reflection workaround:
try
{
MethodInvoker.getInstance().invokeStaticMethodWithOneIntParameter("com.idega.block.staff.business.StaffBusiness","delete",userId);
//StaffBusiness.delete(userId);
}
catch (IllegalAccessException e1)
{
// TODO Auto-generated catch block
e1.printStackTrace();
}
catch (InvocationTargetException e1)
{
// TODO Auto-generated catch block
e1.printStackTrace();
}
catch (NoSuchMethodException e1)
{
// TODO Auto-generated catch block
e1.printStackTrace();
}
catch (ClassNotFoundException e1)
{
// TODO Auto-generated catch block
e1.printStackTrace();
}
//delUser.removeFrom(com.idega.core.data.GenericGroupBMPBean.getStaticInstance());
int groupId =delUser.getGroupID();
try {
delUser.removeFrom(GenericEntity.getStaticInstance(Address.class));
}
catch (SQLException e) {
e.printStackTrace();
}
try {
delUser.removeFrom(GenericEntity.getStaticInstance(Email.class));
}
catch (SQLException ex) {
ex.printStackTrace();
}
try {
delUser.removeFrom(GenericEntity.getStaticInstance(Phone.class));
}
catch (SQLException exc) {
exc.printStackTrace();
}
LoginDBHandler.deleteUserLogin(userId);
delUser.delete();
UserGroupBusiness.deleteGroup(groupId);
}
public static void setPermissionGroup(User user, Integer primaryGroupId) throws SQLException {
if(primaryGroupId != null){
user.setPrimaryGroupID(primaryGroupId);
user.update();
}
}
/**
* Male: M, male, 0
* Female: F, female, 1
*/
public static Integer getGenderId(String gender) throws Exception{
String genderName = null;
if(gender == "M" || gender == "male" || gender == "0" ){
genderName = com.idega.core.user.data.GenderBMPBean.NAME_MALE;
} else if(gender == "F" || gender == "female" || gender == "1" ){
genderName = com.idega.core.user.data.GenderBMPBean.NAME_FEMALE;
} else{
//throw new RuntimeException("String gender must be: M, male, 0, F, female or 1 ");
return null;
}
Gender g = (Gender)GenericEntity.getStaticInstance(Gender.class);
String[] result = com.idega.data.SimpleQuerier.executeStringQuery("Select "+g.getIDColumnName()+" from "+g.getEntityName()+"where "+com.idega.core.user.data.GenderBMPBean.getNameColumnName()+" = '"+genderName+"'");
if(result != null && result.length > 0){
return new Integer(result[0]);
} else {
return null;
//throw new RuntimeException("no result");
}
}
public static Phone[] getUserPhones(int userId) {
try {
return (Phone[]) ((com.idega.core.user.data.UserHome)com.idega.data.IDOLookup.getHomeLegacy(User.class)).findByPrimaryKeyLegacy(userId).findRelated(GenericEntity.getStaticInstance(Phone.class));
}
catch (SQLException ex) {
ex.printStackTrace();
return null;
}
}
public static Phone getUserPhone(int userId, int phoneTypeId) {
try {
IDOLegacyEntity[] result = ((com.idega.core.user.data.UserHome)com.idega.data.IDOLookup.getHomeLegacy(User.class)).findByPrimaryKeyLegacy(userId).findRelated(GenericEntity.getStaticInstance(Phone.class));
if(result != null){
for (int i = 0; i < result.length; i++) {
if(((Phone)result[i]).getPhoneTypeId() == phoneTypeId){
return (Phone)result[i];
}
}
}
return null;
}
catch (SQLException ex) {
ex.printStackTrace();
return null;
}
}
public static Email getUserMail(int userId) {
try {
return getUserMail(((com.idega.core.user.data.UserHome)com.idega.data.IDOLookup.getHomeLegacy(User.class)).findByPrimaryKeyLegacy(userId));
}
catch (SQLException ex) {
ex.printStackTrace();
return null;
}
}
public static Email getUserMail(User user) {
try {
List L = EntityFinder.getInstance().findRelated(user,Email.class);
if(L != null){
if ( L.size() > 0 ) {
return (Email)L.get(0);
}
}
return null;
}
catch (Exception ex) {
ex.printStackTrace();
return null;
}
}
public void updateUserPhone(int userId, int phoneTypeId, String phoneNumber) throws SQLException {
Phone phone = getUserPhone(userId,phoneTypeId);
boolean insert = false;
if ( phone == null ) {
phone = ((com.idega.core.contact.data.PhoneHome)com.idega.data.IDOLookup.getHomeLegacy(Phone.class)).createLegacy();
phone.setPhoneTypeId(phoneTypeId);
insert = true;
}
if ( phoneNumber != null ) {
phone.setNumber(phoneNumber);
}
if(insert){
phone.insert();
((com.idega.core.user.data.UserHome)com.idega.data.IDOLookup.getHomeLegacy(User.class)).findByPrimaryKeyLegacy(userId).addTo(phone);
}
else{
phone.update();
}
}
public void updateUserMail(int userId, String email) throws SQLException {
Email mail = getUserMail(userId);
boolean insert = false;
if ( mail == null ) {
mail = ((com.idega.core.contact.data.EmailHome)com.idega.data.IDOLookup.getHomeLegacy(Email.class)).createLegacy();
insert = true;
}
if ( email != null ) {
mail.setEmailAddress(email);
}
if(insert){
mail.insert();
((com.idega.core.user.data.UserHome)com.idega.data.IDOLookup.getHomeLegacy(User.class)).findByPrimaryKeyLegacy(userId).addTo(mail);
}
else{
mail.update();
}
}
public Address getUserAddress1(int userId) throws SQLException {
IDOLegacyEntity[] result = ((com.idega.core.user.data.UserHome)com.idega.data.IDOLookup.getHomeLegacy(User.class)).findByPrimaryKeyLegacy(userId).findRelated(GenericEntity.getStaticInstance(Address.class));
if(result != null){
int addrTypeId = com.idega.core.location.data.AddressTypeBMPBean.getId(com.idega.core.location.data.AddressTypeBMPBean.ADDRESS_1);
for (int i = 0; i < result.length; i++) {
if(((Address)result[i]).getAddressTypeID() == addrTypeId){
return (Address)result[i];
}
}
}
return null;
}
/**
* @deprecated to be replaced or use AddressBusiness. eiki@idega.is
*/
public void updateUserAddress1(int userId, String streetName, String streetNumber, String city, Integer postalCodeId, String province, Integer countryId, String pobox ) throws SQLException {
Address addr = this.getUserAddress1(userId);
boolean insert = false;
if(addr == null){
addr = ((com.idega.core.location.data.AddressHome)com.idega.data.IDOLookup.getHomeLegacy(Address.class)).createLegacy();
addr.setAddressTypeID(com.idega.core.location.data.AddressTypeBMPBean.getId(com.idega.core.location.data.AddressTypeBMPBean.ADDRESS_1));
insert = true;
}
if( city != null){
addr.setCity(city);
}
if( countryId != null){
addr.setCountryId(countryId.intValue());
}
if( pobox != null){
addr.setPOBox(pobox);
}
if( postalCodeId != null){
addr.setPostalCodeID(postalCodeId.intValue());
}
if( province != null){
addr.setProvince(province);
}
if( streetName != null){
addr.setStreetName(streetName);
}
if( streetNumber != null){
addr.setStreetNumber(streetNumber);
}
if(insert){
addr.insert();
(((com.idega.core.user.data.UserHome)com.idega.data.IDOLookup.getHomeLegacy(User.class)).findByPrimaryKeyLegacy(userId)).addTo(addr);
}else{
addr.update();
}
}
public void updateUser(int user_id, String firstname, String middlename, String lastname, String displayname, String description, Integer gender, IWTimestamp date_of_birth, Integer primary_group ) throws SQLException {
User userToUpdate = ((com.idega.core.user.data.UserHome)com.idega.data.IDOLookup.getHomeLegacy(User.class)).findByPrimaryKeyLegacy(user_id);
this.updateUser(userToUpdate, firstname, middlename, lastname, displayname, description, gender, date_of_birth, primary_group,null);
}
public void updateUser(int user_id, String firstname, String middlename, String lastname, String displayname, String description, Integer gender, IWTimestamp date_of_birth, Integer primary_group, String personalID ) throws SQLException {
User userToUpdate = ((com.idega.core.user.data.UserHome)com.idega.data.IDOLookup.getHomeLegacy(User.class)).findByPrimaryKeyLegacy(user_id);
this.updateUser(userToUpdate, firstname, middlename, lastname, displayname, description, gender, date_of_birth, primary_group,personalID);
}
public void updateUser(User userToUpdate, String firstname, String middlename, String lastname, String displayname, String description, Integer gender, IWTimestamp date_of_birth, Integer primary_group ) throws SQLException {
this.updateUser(userToUpdate, firstname, middlename, lastname, displayname, description, gender, date_of_birth, primary_group, null);
}
public void updateUser(User userToUpdate, String firstname, String middlename, String lastname, String displayname, String description, Integer gender, IWTimestamp date_of_birth, Integer primary_group, String personalID ) throws SQLException {
if(firstname != null){
userToUpdate.setFirstName(firstname);
}
if(middlename != null){
userToUpdate.setMiddleName(middlename);
}
if(lastname != null){
userToUpdate.setLastName(lastname);
}
if(displayname != null){
userToUpdate.setDisplayName(displayname);
}
if(description != null){
userToUpdate.setDescription(description);
}
if(gender != null){
userToUpdate.setGender(gender);
}
if(date_of_birth != null){
userToUpdate.setDateOfBirth(date_of_birth.getSQLDate());
}
if(primary_group != null){
userToUpdate.setPrimaryGroupID(primary_group);
}
if (personalID != null) {
userToUpdate.setPersonalID(personalID);
}
userToUpdate.update();
}
public static List listOfUserEmails(int iUserId){
StringBuffer sql = new StringBuffer("select ie.* ");
sql.append("from ic_email ie,ic_user_email iue ");
sql.append("where ie.ic_email_id = iue.ic_email_address ");
sql.append(" and iue.ic_user_id = ");
sql.append(iUserId);
Email eEmail = ((com.idega.core.contact.data.EmailHome)com.idega.data.IDOLookup.getHomeLegacy(Email.class)).createLegacy();
try {
return com.idega.data.EntityFinder.findAll(eEmail,sql.toString());
}
catch (SQLException ex) {
}
return null;
}
public static void addNewUserEmail(int iUserId,String sNewEmailAddress){
try {
Email eEmail = lookupEmail(sNewEmailAddress);
if(eEmail==null){
eEmail = ((com.idega.core.contact.data.EmailHome)com.idega.data.IDOLookup.getHomeLegacy(Email.class)).createLegacy();
eEmail.setEmailAddress(sNewEmailAddress);
eEmail.insert();
}
eEmail.addTo(User.class,iUserId);
}
catch (SQLException ex) {
}
}
public static Email lookupEmail(String EmailAddress){
try {
//EntityFinder.debug = true;
java.util.List c = EntityFinder.getInstance().findAllByColumn(Email.class,com.idega.core.contact.data.EmailBMPBean.getColumnNameAddress(),EmailAddress);
//EntityFinder.debug = false;
if(c!=null && c.size() > 0) {
return (Email) c.get(0);
}
}
catch (Exception ex) {
}
return null;
}
/**
* @deprecated use getUserGroupsDirectlyRelated(int iUserId)
*/
public static List listOfUserGroups(int iUserId){
return getUserGroupsDirectlyRelated(iUserId);
}
public static List getUserGroups(int iUserId)throws SQLException{
try {
return getUserGroups(((com.idega.core.user.data.UserHome)com.idega.data.IDOLookup.getHomeLegacy(User.class)).findByPrimaryKeyLegacy(iUserId).getGroupID());
}
catch (SQLException ex) {
ex.printStackTrace();
return null;
}
}
public static List getUsersInGroup(int iGroupId) {
try {
return UserGroupBusiness.getUsersContained(iGroupId);
}
catch (SQLException ex) {
ex.printStackTrace();
return null;
}
}
public static List getUsersInGroup(GenericGroup group) {
try {
return UserGroupBusiness.getUsersContained(group); //EntityFinder.findRelated(group,com.idega.core.user.data.UserBMPBean.getStaticInstance());
}
catch (SQLException ex) {
ex.printStackTrace();
return null;
}
}
public static List getUsers() throws SQLException {
List l = EntityFinder.findAll(UserBMPBean.getStaticInstance());
return l;
}
/**
* Returns User from userid, null if not found
*/
public static User getUser(int iUserId){
try {
return ((com.idega.core.user.data.UserHome)com.idega.data.IDOLookup.getHomeLegacy(User.class)).findByPrimaryKeyLegacy(iUserId);
}
catch (Exception ex) {
}
return null;
}
/**
* Returns User from personal id returns null if not found
*/
public User getUser(String personalID) {
try {
return ((com.idega.core.user.data.UserHome)com.idega.data.IDOLookup.getHomeLegacy(User.class)).findByPersonalID(personalID);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
public static List getUsersInNoGroup() throws SQLException {
//return EntityFinder.findNonRelated(com.idega.core.data.GenericGroupBMPBean.getStaticInstance(),com.idega.core.user.data.UserBMPBean.getStaticInstance());
List nonrelated = EntityFinder.findNonRelated(com.idega.core.data.GenericGroupBMPBean.getStaticInstance(),com.idega.core.data.GenericGroupBMPBean.getStaticInstance());
return UserGroupBusiness.getUsersForUserRepresentativeGroups(nonrelated);
}
public static List getUserGroupsDirectlyRelated(int iUserId){
try {
return getUserGroupsDirectlyRelated(((com.idega.core.user.data.UserHome)com.idega.data.IDOLookup.getHomeLegacy(User.class)).findByPrimaryKeyLegacy(iUserId));
}
catch (SQLException ex) {
ex.printStackTrace();
return null;
}
}
public static List getUsersInPrimaryGroup(GenericGroup group){
try {
return EntityFinder.findAllByColumn(UserBMPBean.getStaticInstance(),UserBMPBean._COLUMNNAME_PRIMARY_GROUP_ID,group.getID());
}
catch (SQLException ex) {
ex.printStackTrace();
return null;
}
}
public static List getUserGroupsDirectlyRelated(User user){
//try {
return UserGroupBusiness.getGroupsContainingDirectlyRelated(user.getGroupID()); // EntityFinder.findRelated(user,com.idega.core.data.GenericGroupBMPBean.getStaticInstance());
/*}
catch (SQLException ex) {
ex.printStackTrace();
return null;
}*/
}
public static List getUserGroupsNotDirectlyRelated(int iUserId){
try {
User user = ((com.idega.core.user.data.UserHome)com.idega.data.IDOLookup.getHomeLegacy(User.class)).findByPrimaryKeyLegacy(iUserId);
/*List isDirectlyRelated = getUserGroupsDirectlyRelated(user);
List AllRelatedGroups = getUserGroups(user);
if(AllRelatedGroups != null){
if(isDirectlyRelated != null){
Iterator iter = isDirectlyRelated.iterator();
while (iter.hasNext()) {
Object item = iter.next();
AllRelatedGroups.remove(item);
//while(AllRelatedGroups.remove(item)){}
}
}
return AllRelatedGroups;
}else {
return null;
}
*/
return UserGroupBusiness.getGroupsContainingNotDirectlyRelated(user.getGroupID());
}
catch (SQLException ex) {
ex.printStackTrace();
return null;
}
}
public static List getAllGroupsNotDirectlyRelated(int iUserId,IWContext iwc){
try {
User user = ((com.idega.core.user.data.UserHome)com.idega.data.IDOLookup.getHomeLegacy(User.class)).findByPrimaryKeyLegacy(iUserId);
/*List isDirectlyRelated = getUserGroupsDirectlyRelated(user);
List AllGroups = UserGroupBusiness.getAllGroups(); //EntityFinder.findAll(com.idega.core.data.GenericGroupBMPBean.getStaticInstance());
if(AllGroups != null){
if(isDirectlyRelated != null){
Iterator iter = isDirectlyRelated.iterator();
while (iter.hasNext()) {
Object item = iter.next();
AllGroups.remove(item);
//while(AllGroups.remove(item)){}
}
}
return AllGroups;
}else{
return null;
}
*/
return UserGroupBusiness.getAllGroupsNotDirectlyRelated(user.getGroupID(),iwc);
}
catch (SQLException ex) {
ex.printStackTrace();
return null;
}
}
public static List getUserGroups(User user) throws SQLException{
//String[] groupTypesToReturn = new String[2];
//groupTypesToReturn[0] = com.idega.core.data.GenericGroupBMPBean.getStaticInstance().getGroupTypeValue();
//groupTypesToReturn[1] = com.idega.core.accesscontrol.data.PermissionGroupBMPBean.getStaticPermissionGroupInstance().getGroupTypeValue();
return UserBusiness.getUserGroups(user,null,false);
}
/**
* @todo replace ((com.idega.core.data.GenericGroupHome)com.idega.data.IDOLookup.getHomeLegacy(GenericGroup.class)).findByPrimaryKeyLegacy(user.getGroupID()) by user.getGroupID()
*/
public static List getUserGroups(User user, String[] groupTypes, boolean returnSepcifiedGroupTypes) throws SQLException{
return UserGroupBusiness.getGroupsContaining(((com.idega.core.data.GenericGroupHome)com.idega.data.IDOLookup.getHomeLegacy(GenericGroup.class)).findByPrimaryKeyLegacy(user.getGroupID()),groupTypes, returnSepcifiedGroupTypes);
}
} // Class UserBusiness