Package org.openmeetings.app.data.user

Source Code of org.openmeetings.app.data.user.Usermanagement

/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements.  See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership.  The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License") +  you may not use this file except in compliance
* with the License.  You may obtain a copy of the License at
*
*   http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied.  See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.openmeetings.app.data.user;

import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.NonUniqueResultException;
import javax.persistence.PersistenceContext;
import javax.persistence.TypedQuery;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Expression;
import javax.persistence.criteria.Path;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;

import org.apache.commons.lang.StringUtils;
import org.openmeetings.app.OpenmeetingsVariables;
import org.openmeetings.app.conference.session.RoomClient;
import org.openmeetings.app.data.basic.AuthLevelmanagement;
import org.openmeetings.app.data.basic.Configurationmanagement;
import org.openmeetings.app.data.basic.Fieldmanagment;
import org.openmeetings.app.data.basic.Sessionmanagement;
import org.openmeetings.app.data.basic.dao.OmTimeZoneDaoImpl;
import org.openmeetings.app.data.beans.basic.SearchResult;
import org.openmeetings.app.data.user.dao.UserSipDataDaoImpl;
import org.openmeetings.app.data.user.dao.UsersDaoImpl;
import org.openmeetings.app.persistence.beans.adresses.Adresses;
import org.openmeetings.app.persistence.beans.basic.OmTimeZone;
import org.openmeetings.app.persistence.beans.basic.Sessiondata;
import org.openmeetings.app.persistence.beans.domain.Organisation_Users;
import org.openmeetings.app.persistence.beans.user.UserSipData;
import org.openmeetings.app.persistence.beans.user.Userdata;
import org.openmeetings.app.persistence.beans.user.Userlevel;
import org.openmeetings.app.persistence.beans.user.Users;
import org.openmeetings.app.remote.red5.ClientListManager;
import org.openmeetings.app.remote.red5.ScopeApplicationAdapter;
import org.openmeetings.app.sip.xmlrpc.OpenXGHttpClient;
import org.openmeetings.app.templates.ResetPasswordTemplate;
import org.openmeetings.utils.crypt.ManageCryptStyle;
import org.openmeetings.utils.mail.MailHandler;
import org.openmeetings.utils.math.CalendarPatterns;
import org.red5.io.utils.ObjectMap;
import org.red5.logging.Red5LoggerFactory;
import org.red5.server.api.scope.IScope;
import org.slf4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;

/**
*
* @author swagner
*
*/
@Transactional
public class Usermanagement {

  private static final Logger log = Red5LoggerFactory.getLogger(
      Usermanagement.class, OpenmeetingsVariables.webAppRootKey);

  @PersistenceContext
  private EntityManager em;

  @Autowired
  private Sessionmanagement sessionManagement;
  @Autowired
  private Configurationmanagement cfgManagement;
  @Autowired
  private Fieldmanagment fieldmanagment;
  @Autowired
  private Statemanagement statemanagement;
  @Autowired
  private OmTimeZoneDaoImpl omTimeZoneDaoImpl;
  @Autowired
  private Organisationmanagement organisationmanagement;
  @Autowired
  private ManageCryptStyle manageCryptStyle;
  @Autowired
  private OpenXGHttpClient openXGHttpClient;
  @Autowired
  private UsersDaoImpl usersDao;
  @Autowired
  private Emailmanagement emailManagement;
  @Autowired
  private UserSipDataDaoImpl userSipDataDao;
  @Autowired
  private ScopeApplicationAdapter scopeApplicationAdapter;
  @Autowired
  private MailHandler mailHandler;
  @Autowired
  private ResetPasswordTemplate resetPasswordTemplate;
  @Autowired
  private AuthLevelmanagement authLevelManagement;
  @Autowired
  private ClientListManager clientListManager;

  /**
   * query for a list of users
   *
   * @param users_id
   * @param user_level
   * @param start
   * @param max
   * @param orderby
   * @return
   */
  public SearchResult<Users> getUsersList(long user_level, int start, int max,
      String orderby, boolean asc) {
    try {
      if (authLevelManagement.checkAdminLevel(user_level)) {
        SearchResult<Users> sresult = new SearchResult<Users>();
        sresult.setObjectName(Users.class.getName());
        sresult.setRecords(usersDao.selectMaxFromUsers());

        // get all users
        CriteriaBuilder cb = em.getCriteriaBuilder();
        CriteriaQuery<Users> cq = cb.createQuery(Users.class);
        Root<Users> c = cq.from(Users.class);
        Predicate condition = cb.equal(c.get("deleted"), "false");
        cq.where(condition);
        cq.distinct(asc);
        if (asc) {
          cq.orderBy(cb.asc(c.get(orderby)));
        } else {
          cq.orderBy(cb.desc(c.get(orderby)));
        }
        TypedQuery<Users> q = em.createQuery(cq);
        q.setFirstResult(start);
        q.setMaxResults(max);
        List<Users> ll = q.getResultList();
        sresult.setResult(ll);
        return sresult;
      }
    } catch (Exception ex2) {
      log.error("[getUsersList] " + ex2);
    }
    return null;
  }

  public SearchResult<Users> getAllUserByRange(String search, int start, int max,
      String orderby, boolean asc) {
    try {
      SearchResult<Users> sresult = new SearchResult<Users>();
      sresult.setObjectName(Users.class.getName());
      sresult.setRecords(usersDao.getAllUserMax(search));

      String[] searchItems = search.split(" ");

      log.debug("getUserContactsBySearch: " + search);
      // log.debug("getUserContactsBySearch: "+ userId);

      String hql = "select u from  Users u "
          + "WHERE u.deleted = 'false' ";

      hql += "AND ( ";
      for (int i = 0; i < searchItems.length; i++) {
        if (i != 0) {
          hql += " OR ";
        }
        hql += "( " + "lower(u.lastname) LIKE '"
            + StringUtils.lowerCase("%" + searchItems[i] + "%")
            + "' " + "OR lower(u.firstname) LIKE '"
            + StringUtils.lowerCase("%" + searchItems[i] + "%")
            + "' " + "OR lower(u.login) LIKE '"
            + StringUtils.lowerCase("%" + searchItems[i] + "%")
            + "' " + "OR lower(u.adresses.email) LIKE '"
            + StringUtils.lowerCase("%" + searchItems[i] + "%")
            + "' " + ") ";

      }

      hql += " ) ";
      if (orderby != null && orderby.length() > 0) {
        hql += "ORDER BY " + orderby;
      }

      if (asc) {
        hql += " ASC ";
      } else {
        hql += " DESC ";
      }

      log.debug("Show HQL: " + hql);

      TypedQuery<Users> query = em.createQuery(hql, Users.class);
      // query.setParameter("macomUserId", userId);

      // query
      // if (asc) ((Criteria) query).addOrder(Order.asc(orderby));
      // else ((Criteria) query).addOrder(Order.desc(orderby));
      query.setFirstResult(start);
      query.setMaxResults(max);
      List<Users> ll = query.getResultList();

      sresult.setResult(ll);

      return sresult;

    } catch (Exception ex2) {
      log.error("[getAllUserByRange] ", ex2);
      ex2.printStackTrace();
    }
    return null;
  }

  /**
   *
   * @param user_level
   * @param user_id
   * @return
   */
  public Users checkAdmingetUserById(long user_level, long user_id) {
    // FIXME: We have to check here for the User only cause the
    // Org-Moderator otherwise cannot access it
    if (authLevelManagement.checkUserLevel(user_level)) {
      return usersDao.getUser(user_id);
    }
    return null;
  }

  public List<Users> getUserByMod(Long user_level, long user_id) {
    return null;
  }

  /**
   * login logic
   *
   * @param SID
   * @param Username
   * @param Userpass
   * @return
   */
  public Object loginUser(String SID, String userOrEmail, String userpass,
      RoomClient currentClient, Boolean storePermanent) {
    try {
      log.debug("Login user SID : " + SID + " Stored Permanent :"
          + storePermanent);
      String hql = "SELECT c from Users AS c "
          + "WHERE "
          + "(c.login LIKE :userOrEmail OR c.adresses.email LIKE :userOrEmail  ) "
          + "AND c.deleted <> :deleted";

      TypedQuery<Users> query = em.createQuery(hql, Users.class);
      query.setParameter("userOrEmail", userOrEmail);
      query.setParameter("deleted", "true");

      List<Users> ll = query.getResultList();

      log.debug("debug SIZE: " + ll.size());

      if (ll.size() == 0) {
        return new Long(-10);
      } else {
        Users users = ll.get(0);

        // Refresh User Object
        users = this.refreshUserObject(users);

        if (manageCryptStyle.getInstanceOfCrypt().verifyPassword(
            userpass, users.getPassword())) {
          log.info("chsum OK: " + users.getUser_id());

          Boolean bool = sessionManagement.updateUser(SID,
              users.getUser_id(), storePermanent,
              users.getLanguage_id());
          if (bool == null) {
            // Exception
            return new Long(-1);
          } else if (!bool) {
            // invalid Session-Object
            return new Long(-35);
          }

          // Check if activated
          if (users.getStatus() != null
              && users.getStatus().equals(0)) {
            return -41L;
          }

          users.setUserlevel(getUserLevel(users.getLevel_id()));
          updateLastLogin(users);
          // If invoked via SOAP this is NULL
          if (currentClient != null) {
            currentClient.setUser_id(users.getUser_id());
          }

          log.debug("loginUser " + users.getOrganisation_users());
          if (!users.getOrganisation_users().isEmpty()) {
            log.debug("loginUser size "
                + users.getOrganisation_users().size());
          } else {
            throw new Exception("No Organization assigned to user");
          }

          return users;
        } else {
          return new Long(-11);
        }
      }

    } catch (Exception ex2) {
      log.error("[loginUser]: ", ex2);
    }
    return new Long(-1);
  }

  public Users refreshUserObject(Users us) {
    try {

      us = em.merge(us);
      return us;
    } catch (Exception ex2) {
      log.error("[loginUser]: ", ex2);
    }
    return null;
  }

  public Users loginUserByRemoteHash(String SID, String remoteHash) {
    try {

      Sessiondata sessionData = sessionManagement
          .getSessionByHash(remoteHash);

      if (sessionData != null) {

        Users u = getUserById(sessionData.getUser_id());

        sessionManagement.updateUserWithoutSession(SID, u.getUser_id());

        return u;
      }

    } catch (Exception ex2) {
      log.error("[loginUserByRemoteHash]: ", ex2);
    }
    return null;
  }

  public Long logout(String SID, long USER_ID) {
    sessionManagement.updateUser(SID, 0, false, null);
    return new Long(-12);
  }

  private void updateLastLogin(Users us) {
    try {
      us.setLastlogin(new Date());
      if (us.getUser_id() == null) {
        em.persist(us);
      } else {
        if (!em.contains(us)) {
          em.merge(us);
        }
      }
    } catch (Exception ex2) {
      log.error("updateLastLogin", ex2);
    }
  }

  /**
   * suche eines Bentzers
   *
   * @param user_level
   * @param searchstring
   * @param max
   * @param start
   * @return
   */
  public List<Users> searchUser(long user_level, String searchcriteria,
      String searchstring, int max, int start, String orderby, boolean asc) {
    if (authLevelManagement.checkAdminLevel(user_level)) {
      try {
        CriteriaBuilder cb = em.getCriteriaBuilder();
        CriteriaQuery<Users> cq = cb.createQuery(Users.class);
        Root<Users> c = cq.from(Users.class);
        Expression<String> literal = cb.literal("%" + searchstring
            + "%");
        // crit.add(Restrictions.ilike(searchcriteria, "%" +
        // searchstring + "%"));
        Path<String> path = c.get(searchcriteria);
        Predicate predicate = cb.like(path, literal);
        Predicate condition = cb.notEqual(c.get("deleted"), "true");
        cq.where(condition, predicate);
        cq.distinct(asc);
        if (asc) {
          cq.orderBy(cb.asc(c.get(orderby)));
        } else {
          cq.orderBy(cb.desc(c.get(orderby)));
        }
        TypedQuery<Users> q = em.createQuery(cq);
        q.setFirstResult(start);
        q.setMaxResults(max);
        List<Users> contactsZ = q.getResultList();
        return contactsZ;
      } catch (Exception ex2) {
        log.error("searchUser", ex2);
      }
    }
    return null;
  }

  public List<Userdata> getUserdataDashBoard(Long user_id) {
    if (user_id.longValue() > 0) {
      try {
        TypedQuery<Userdata> query = em
            .createQuery("select c from Userdata as c where c.user_id = :user_id AND c.deleted <> :deleted", Userdata.class);
        query.setParameter("user_id", user_id.longValue());
        query.setParameter("deleted", "true");
        List<Userdata> ll = query.getResultList();
        return ll;
      } catch (Exception ex2) {
        log.error("getUserdataDashBoard", ex2);
      }
    }
    return null;
  }

  public Userdata getUserdataByKey(Long user_id, String DATA_KEY) {
    Userdata userdata = new Userdata();
    if (user_id.longValue() > 0) {
      try {
        TypedQuery<Userdata> query = em
            .createQuery("select c from Userdata as c where c.user_id = :user_id AND c.data_key = :data_key AND c.deleted <> :deleted", Userdata.class);
        query.setParameter("user_id", user_id.longValue());
        query.setParameter("data_key", DATA_KEY);
        query.setParameter("deleted", "true");
        for (Iterator<Userdata> it2 = query.getResultList().iterator(); it2
            .hasNext();) {
          userdata = it2.next();
        }
      } catch (Exception ex2) {
        log.error("getUserdataByKey", ex2);
      }
    } else {
      userdata.setComment("Error: No USER_ID given");
    }
    return userdata;
  }

  public Long updateUser(long user_level, Long user_id, Long level_id,
      String login, String password, String lastname, String firstname,
      Date age, String street, String additionalname, String zip,
      long states_id, String town, Long language_id, int availible,
      String telefon, String fax, String mobil, String email,
      String comment, int status, List<Long> organisations, int title_id,
      String phone, String sip_user, String sip_pass, String sip_auth,
      Boolean generateSipUserData, String jNameTimeZone,
      Boolean forceTimeZoneCheck, String userOffers, String userSearchs,
      Boolean showContactData, Boolean showContactDataToContacts) {

    if (authLevelManagement.checkUserLevel(user_level) && user_id != 0) {
      try {
        Users us = usersDao.getUser(user_id);

        // Check for duplicates
        boolean checkName = true;

        if (!login.equals(us.getLogin())) {
          checkName = usersDao.checkUserLogin(login);
        }
        boolean checkEmail = true;

        // Compare old address with new address
        if (!email.equals(us.getAdresses().getEmail())) {

          // Its a new one - check, whether another user already uses
          // that one...
          checkEmail = emailManagement.checkUserEMail(email);
        }

        if (generateSipUserData) {

          if (password.length() == 0) {
            // Cannot perform a SIP Creation without password
            // re-enter
            return new Long(-43);
          }
        }

        if (checkName && checkEmail) {
          // log.info("user_id " + user_id);

          // add or delete organisations from this user
          if (organisations != null) {
            organisationmanagement.updateUserOrganisationsByUser(
                us, organisations);
          }
          us = usersDao.getUser(user_id);

          us.setLastname(lastname);
          us.setFirstname(firstname);
          us.setAge(age);
          us.setLogin(login);
          us.setUpdatetime(new Date());
          us.setAvailible(availible);
          us.setStatus(status);
          us.setTitle_id(title_id);
          us.setOmTimeZone(omTimeZoneDaoImpl
              .getOmTimeZone(jNameTimeZone));
          us.setLanguage_id(language_id);
          us.setForceTimeZoneCheck(forceTimeZoneCheck);

          us.setUserOffers(userOffers);
          us.setUserSearchs(userSearchs);
          us.setShowContactData(showContactData);
          us.setShowContactDataToContacts(showContactDataToContacts);

          if (level_id != 0)
            us.setLevel_id(new Long(level_id));
          if (password.length() != 0) {
            if (password.length() >= 6) {
              us.setPassword(manageCryptStyle
                  .getInstanceOfCrypt().createPassPhrase(
                      password));
            } else {
              return new Long(-7);
            }
          }
          us.setAdresses(street, zip, town, statemanagement.getStateById(states_id),
              additionalname, comment, fax, phone, email);
          // emailManagement.updateUserEmail(mail.getMail().getMail_id(),user_id,
          // email);

          if (generateSipUserData) {

            UserSipData userSipData = openXGHttpClient
                .openSIPgUserCreateUser(firstname, "",
                    lastname, us.getAdresses().getEmail(),
                    password, login);

            if (us.getUserSipData() == null) {
              Long userSipDataId = userSipDataDao
                  .addUserSipData(userSipData);

              us.setUserSipData(userSipDataDao
                  .getUserSipDataById(userSipDataId));
            } else {

              us.getUserSipData().setUsername(
                  userSipData.getUsername());
              us.getUserSipData().setUserpass(
                  userSipData.getUserpass());
              us.getUserSipData().setAuthId(
                  userSipData.getAuthId());

              userSipDataDao.updateUserSipData(us
                  .getUserSipData());
            }

          } else if (us.getUserSipData() == null) {
            UserSipData userSipData = new UserSipData();

            userSipData.setUsername(sip_user);
            userSipData.setUserpass(sip_pass);
            userSipData.setAuthId(sip_auth);

            Long userSipDataId = userSipDataDao
                .addUserSipData(userSipData);

            us.setUserSipData(userSipDataDao
                .getUserSipDataById(userSipDataId));

          } else {

            UserSipData userSipData = userSipDataDao
                .getUserSipDataById(us.getUserSipData()
                    .getUserSipDataId());

            userSipData.setUsername(sip_user);
            userSipData.setUserpass(sip_pass);
            userSipData.setAuthId(sip_auth);

            userSipDataDao.updateUserSipData(userSipData);

            us.setUserSipData(userSipData);

          }

          // log.info("USER " + us.getLastname());
          // What is this code good for? The Id is already check in
          // the initial
          // if clause otherwise an update is not possible
          // if (us.getUser_id() == null) {
          // em.persist(us);
          // } else {
          // if (!em.contains(us)) {
          em.merge(us);

          // }
          // }

          return us.getUser_id();

        } else {
          if (!checkName) {
            return new Long(-15);
          } else if (!checkEmail) {
            return new Long(-17);
          }
        }
      } catch (Exception ex2) {
        log.error("[updateUser]", ex2);
      }
    } else {
      log.error("Error: Permission denied");
      return new Long(-1);
    }
    return new Long(-1);
  }

  public String updateUserdata(int DATA_ID, long USER_ID, String DATA_KEY,
      String DATA, String Comment) {
    String res = "Fehler beim Update";
    try {
      String hqlUpdate = "update userdata set DATA_KEY= :DATA_KEY, USER_ID = :USER_ID, DATA = :DATA, updatetime = :updatetime, comment = :Comment where DATA_ID= :DATA_ID";
      int updatedEntities = em.createQuery(hqlUpdate)
          .setParameter("DATA_KEY", DATA_KEY)
          .setParameter("USER_ID", USER_ID)
          .setParameter("DATA", DATA)
          .setParameter("updatetime", new Long(-1))
          .setParameter("Comment", Comment)
          .setParameter("DATA_ID", DATA_ID).executeUpdate();
      res = "Success" + updatedEntities;
    } catch (Exception ex2) {
      log.error("updateUserdata", ex2);
    }
    return res;
  }

  public String updateUserdataByKey(Long USER_ID, String DATA_KEY,
      String DATA, String Comment) {
    String res = "Fehler beim Update";
    try {
      String hqlUpdate = "UPDATE Userdata set data = :data, updatetime = :updatetime, "
          + "comment = :comment where user_id= :user_id AND data_key = :data_key";
      int updatedEntities = em.createQuery(hqlUpdate)
          .setParameter("data", DATA)
          .setParameter("updatetime", new Long(-1))
          .setParameter("comment", Comment)
          .setParameter("user_id", USER_ID.longValue())
          .setParameter("data_key", DATA_KEY).executeUpdate();
      res = "Success" + updatedEntities;
    } catch (Exception ex2) {
      log.error("updateUserdataByKey", ex2);
    }
    return res;
  }

  public String addUserdata(long USER_ID, String DATA_KEY, String DATA,
      String Comment) {
    String ret = "Fehler beim speichern der Userdata";
    Userdata userdata = new Userdata();
    userdata.setData_key(DATA_KEY);
    userdata.setData(DATA);
    userdata.setStarttime(new Date());
    userdata.setUpdatetime(null);
    userdata.setComment(Comment);
    userdata.setUser_id(new Long(USER_ID));
    userdata.setDeleted("false");
    try {
      userdata = em.merge(userdata);
      ret = "success";
    } catch (Exception ex2) {
      log.error("addUserdata", ex2);
    }
    return ret;
  }

  private Userlevel getUserLevel(Long level_id) {
    Userlevel userlevel = new Userlevel();
    try {
      TypedQuery<Userlevel> query = em
          .createQuery("select c from Userlevel as c where c.level_id = :level_id AND c.deleted <> :deleted", Userlevel.class);
      query.setParameter("level_id", level_id.longValue());
      query.setParameter("deleted", "true");
      for(Iterator<Userlevel> it2 = query.getResultList().iterator(); it2
          .hasNext();) {
        userlevel = it2.next();
      }
    } catch (Exception ex2) {
      log.error("[getUserLevel]", ex2);
    }
    return userlevel;
  }

  /**
   * get user-role 1 - user 2 - moderator 3 - admin
   *
   * @param user_id
   * @return
   */
  public Long getUserLevelByID(Long user_id) {

    try {
      if (user_id == null)
        return new Long(0);
      // For direct access of linked users
      if (user_id == -1) {
        return new Long(1);
      }

      TypedQuery<Users> query = em
          .createQuery("select c from Users as c where c.user_id = :user_id AND c.deleted <> 'true'", Users.class);
      query.setParameter("user_id", user_id);
      Users us = null;
      try {
        us = query.getSingleResult();
      } catch (NoResultException e) {
        // u=null}
      }

      if (us != null) {
        return us.getLevel_id();
      } else {
        return -1L;
      }
    } catch (Exception ex2) {
      log.error("[getUserLevelByID]", ex2);
    }
    return null;
  }

  public Long getUserLevelByIdAndOrg(Long user_id, Long organisation_id) {

    try {
      if (user_id == null)
        return new Long(0);
      // For direct access of linked users
      if (user_id == -1) {
        return new Long(1);
      }

      TypedQuery<Users> query = em
          .createQuery("select c from Users as c where c.user_id = :user_id AND c.deleted <> 'true'", Users.class);
      query.setParameter("user_id", user_id);
      Users us = null;
      try {
        us = query.getSingleResult();
      } catch (NoResultException e) {
        // u=null}
      }

      if (us != null) {

        if (us.getLevel_id() > 2) {
          return us.getLevel_id();
        } else {

          log.debug("user_id, organisation_id" + user_id + ", "
              + organisation_id);

          Organisation_Users ou = organisationmanagement
              .getOrganisation_UserByUserAndOrganisation(user_id,
                  organisation_id);

          log.debug("ou: " + ou);

          if (ou != null) {
            if (ou.getIsModerator() != null && ou.getIsModerator()) {
              return 2L;
            } else {
              return us.getLevel_id();
            }
          } else {
            return us.getLevel_id();
          }
        }

      } else {
        return -1L;
      }
    } catch (Exception ex2) {
      log.error("[getUserLevelByID]", ex2);
    }
    return null;
  }

  /**
   * Method to register a new User, User will automatically be added to the
   * default user_level(1) new users will be automatically added to the
   * Organisation with the id specified in the configuration value
   * default_domain_id
   *
   * @param user_level
   * @param level_id
   * @param availible
   * @param status
   * @param login
   * @param Userpass
   * @param lastname
   * @param firstname
   * @param email
   * @param age
   * @param street
   * @param additionalname
   * @param fax
   * @param zip
   * @param states_id
   * @param town
   * @param language_id
   * @return
   */
  public Long registerUser(String login, String Userpass, String lastname,
      String firstname, String email, Date age, String street,
      String additionalname, String fax, String zip, long states_id,
      String town, long language_id, String phone, String baseURL,
      boolean generateSipUserData, String jNameTimeZone) {
   
    boolean sendConfirmation = baseURL != null
        && !baseURL.isEmpty()
        && 1 == cfgManagement.getConfValue(
            "sendEmailWithVerficationCode", Integer.class, "0");
   
    return registerUser(login, Userpass, lastname, firstname, email, age,
        street, additionalname, fax, zip, states_id, town, language_id,
        phone, baseURL, generateSipUserData, jNameTimeZone, sendConfirmation);
  }

  public Long registerUserNoEmail(String login, String Userpass,
      String lastname, String firstname, String email, Date age,
      String street, String additionalname, String fax, String zip,
      long states_id, String town, long language_id, String phone,
      boolean generateSipUserData, String jNameTimeZone) {
   
    return registerUser(login, Userpass, lastname, firstname, email, age,
        street, additionalname, fax, zip, states_id, town, language_id,
        phone, "", generateSipUserData, jNameTimeZone, false);
  }

  private Long registerUser(String login, String Userpass, String lastname,
      String firstname, String email, Date age, String street,
      String additionalname, String fax, String zip, long states_id,
      String town, long language_id, String phone, String baseURL,
      boolean generateSipUserData, String jNameTimeZone, Boolean sendConfirmation) {
    try {
      // Checks if FrontEndUsers can register
      if ("1".equals(cfgManagement.getConfValue("allow_frontend_register", String.class, "0"))) {
       
        // TODO: Read and generate SIP-Data via RPC-Interface Issue 1098

        Long user_id = this.registerUserInit(3, 1, 0, 1, login,
            Userpass, lastname, firstname, email, age, street,
            additionalname, fax, zip, states_id, town, language_id,
            true, Arrays.asList(cfgManagement.getConfValue("default_domain_id", Long.class, null)),phone, baseURL,
            sendConfirmation, "", "", "", generateSipUserData,
            jNameTimeZone, false, "", "", false, true);

        if (sendConfirmation) {
          return new Long(-40);
        }

        return user_id;
      }
    } catch (Exception e) {
      log.error("[registerUser]", e);
    }
    return null;
  }

  /**
   * Adds a user including his adress-data,auth-date,mail-data
   *
   * @param user_level
   * @param level_id
   * @param availible
   * @param status
   * @param login
   * @param password
   * @param lastname
   * @param firstname
   * @param email
   * @param age
   * @param street
   * @param additionalname
   * @param fax
   * @param zip
   * @param states_id
   * @param town
   * @param language_id
   * @param phone
   * @return new users_id OR null if an exception, -1 if an error, -4 if mail
   *         already taken, -5 if username already taken, -3 if login or pass
   *         or mail is empty
   */
  public Long registerUserInit(long user_level, long level_id, int availible,
      int status, String login, String password, String lastname,
      String firstname, String email, Date age, String street,
      String additionalname, String fax, String zip, long states_id,
      String town, long language_id, boolean sendWelcomeMessage,
      List<Long> organisations, String phone, String baseURL,
      Boolean sendConfirmation, String sip_user, String sip_pass,
      String sip_auth, boolean generateSipUserData,
      String jname_timezone, Boolean forceTimeZoneCheck,
      String userOffers, String userSearchs, Boolean showContactData,
      Boolean showContactDataToContacts) throws Exception {
    return registerUserInit(user_level, level_id, availible,
        status, login, password, lastname,
        firstname, email, age, street,
        additionalname, fax, zip, states_id,
        town, language_id, sendWelcomeMessage,
        organisations, phone, baseURL,
        sendConfirmation, sip_user, sip_pass,
        sip_auth, generateSipUserData,
        omTimeZoneDaoImpl.getOmTimeZone(jname_timezone), forceTimeZoneCheck,
        userOffers, userSearchs, showContactData,
        showContactDataToContacts);
  }
 
  /**
   * @param user_level
   * @param level_id
   * @param availible
   * @param status
   * @param login
   * @param password
   * @param lastname
   * @param firstname
   * @param email
   * @param age
   * @param street
   * @param additionalname
   * @param fax
   * @param zip
   * @param states_id
   * @param town
   * @param language_id
   * @param sendWelcomeMessage
   * @param organisations
   * @param phone
   * @param baseURL
   * @param sendConfirmation
   * @param sip_user
   * @param sip_pass
   * @param sip_auth
   * @param generateSipUserData
   * @param timezone
   * @param forceTimeZoneCheck
   * @param userOffers
   * @param userSearchs
   * @param showContactData
   * @param showContactDataToContacts
   * @return new users_id OR null if an exception, -1 if an error, -4 if mail
   *         already taken, -5 if username already taken, -3 if login or pass
   *         or mail is empty
   * @throws Exception
   */
  public Long registerUserInit(long user_level, long level_id, int availible,
      int status, String login, String password, String lastname,
      String firstname, String email, Date age, String street,
      String additionalname, String fax, String zip, long states_id,
      String town, long language_id, boolean sendWelcomeMessage,
      List<Long> organisations, String phone, String baseURL,
      Boolean sendConfirmation, String sip_user, String sip_pass,
      String sip_auth, boolean generateSipUserData,
      OmTimeZone timezone, Boolean forceTimeZoneCheck,
      String userOffers, String userSearchs, Boolean showContactData,
      Boolean showContactDataToContacts) throws Exception {
    // TODO: make phone number persistent
    // User Level must be at least Admin
    // Moderators will get a temp update of there UserLevel to add Users to
    // their Group
    if (authLevelManagement.checkModLevel(user_level)) {

      Integer userLoginMinimumLength = cfgManagement.getConfValue(
          "user.login.minimum.length", Integer.class, "4");
      Integer userPassMinimumLength = cfgManagement.getConfValue(
          "user.pass.minimum.length", Integer.class, "4");

      if (userLoginMinimumLength == null || userPassMinimumLength == null) {
        throw new Exception(
            "user.login.minimum.length or user.pass.minimum.length problem");
      }

      // Check for required data
      if (login.length() >= userLoginMinimumLength.intValue()
          && password.length() >= userPassMinimumLength.intValue()) {
        // Check for duplicates
        boolean checkName = usersDao.checkUserLogin(login);
        boolean checkEmail = emailManagement.checkUserEMail(email);
        if (checkName && checkEmail) {

          String hash = manageCryptStyle
              .getInstanceOfCrypt()
              .createPassPhrase(
                  login
                      + CalendarPatterns
                          .getDateWithTimeByMiliSeconds(new Date()));
          String link = baseURL + "activateUser?u=" + hash;

          if (sendWelcomeMessage && email.length() != 0) {
            // We need to pass the baseURL to check if this is
            // really set to be send
            String sendMail = emailManagement.sendMail(login,
                password, email, link, sendConfirmation);
            if (!sendMail.equals("success"))
              return new Long(-19);
          }
          Adresses adr =  new Adresses();
          adr.setStreet(street);
          adr.setZip(zip);
          adr.setTown(town);
          adr.setStates(statemanagement.getStateById(states_id));
          adr.setAdditionalname(additionalname);
          adr.setComment("");
          adr.setFax(fax);
          adr.setPhone(phone);
          adr.setEmail(email);

          // If this user needs first to click his E-Mail verification
          // code then set the status to 0
          if (sendConfirmation) {
            status = 0;
          }

          Long user_id = addUser(level_id, availible, status,
              firstname, login, lastname, language_id, password,
              adr, age, hash, sip_user, sip_pass,
              sip_auth, generateSipUserData, timezone,
              forceTimeZoneCheck, userOffers, userSearchs,
              showContactData, showContactDataToContacts, organisations);
          log.debug("Added user-Id " + user_id);
          if (user_id == null) {
            return new Long(-111);
          }

          /*
           * Long adress_emails_id =
           * emailManagement.registerEmail(email, address_id,""); if
           * (adress_emails_id==null) { return new Long(-112); }
           */

          if (adr.getAdresses_id() > 0 && user_id > 0) {
            return user_id;
          } else {
            return new Long(-16);
          }
        } else {
          if (!checkName) {
            return new Long(-15);
          } else if (!checkEmail) {
            return new Long(-17);
          }
        }
      } else {
        return new Long(-13);
      }
    }
    return new Long(-1);
  }

  /**
   * @author swagner This Methdo adds a User to the User-Table
   * @param level_id
   *            The User Level, 1=User, 2=GroupAdmin/Moderator,
   *            3=SystemAdmin/Admin
   * @param availible
   *            The user is activated
   * @param status
   *            The user is not blocked by System admins
   * @param firstname
   * @param login
   *            Username for login
   * @param lastname
   * @param language_id
   * @param Userpass
   *            is MD5-crypted
   * @param Adresses adress
   * @return user_id or error null
   */
  public Long addUser(long level_id, int availible, int status,
      String firstname, String login, String lastname, long language_id,
      String userpass, Adresses adress, Date age, String hash,
      String sip_user, String sip_pass, String sip_auth,
      boolean generateSipUserData, OmTimeZone timezone,
      Boolean forceTimeZoneCheck, String userOffers, String userSearchs,
      Boolean showContactData, Boolean showContactDataToContacts, List<Long> orgIds) {
    try {

      Users users = new Users();
      users.setFirstname(firstname);
      users.setLogin(login);
      users.setLastname(lastname);
      users.setAge(age);
      users.setAdresses(adress);
      users.setAvailible(availible);
      users.setLastlogin(new Date());
      users.setLasttrans(new Long(0));
      users.setLevel_id(level_id);
      users.setStatus(status);
      users.setTitle_id(new Integer(1));
      users.setStarttime(new Date());
      users.setActivatehash(hash);
      users.setOmTimeZone(timezone);
      users.setForceTimeZoneCheck(forceTimeZoneCheck);

      users.setUserOffers(userOffers);
      users.setUserSearchs(userSearchs);
      users.setShowContactData(showContactData);
      users.setShowContactDataToContacts(showContactDataToContacts);

      if (generateSipUserData) {

        UserSipData userSipData = openXGHttpClient
            .openSIPgUserCreateUser(firstname, "", lastname, users
                .getAdresses().getEmail(), userpass, login);

        Long userSipDataId = userSipDataDao.addUserSipData(userSipData);

        users.setUserSipData(userSipDataDao
            .getUserSipDataById(userSipDataId));

      } else {
        UserSipData userSipData = new UserSipData();

        userSipData.setUsername(sip_user);
        userSipData.setUserpass(sip_pass);
        userSipData.setAuthId(sip_auth);

        Long userSipDataId = userSipDataDao.addUserSipData(userSipData);

        users.setUserSipData(userSipDataDao
            .getUserSipDataById(userSipDataId));
      }

      // this is needed cause the language is not a needed data at
      // registering
      if (language_id != 0) {
        users.setLanguage_id(new Long(language_id));
      } else {
        users.setLanguage_id(null);
      }
      users.setPassword(manageCryptStyle.getInstanceOfCrypt()
          .createPassPhrase(userpass));
      users.setRegdate(new Date());
      users.setDeleted("false");
     
      //new user add organizations without checks
      if (orgIds != null) {
        List<Organisation_Users> orgList = users.getOrganisation_users();
        for (Long orgId : orgIds) {
          orgList.add(organisationmanagement.getOrgUser(orgId, null));
        }
      }
      return addUser(users);

    } catch (Exception ex2) {
      log.error("[registerUser]", ex2);
    }
    return null;
  }

  public Users getUserByExternalIdAndType(String externalUserId,
      String externalUserType) {

    try {

      String hql = "select c from Users as c "
          + "where c.externalUserId LIKE :externalUserId "
          + "AND c.externalUserType LIKE :externalUserType "
          + "AND c.deleted <> :deleted";

      TypedQuery<Users> query = em.createQuery(hql, Users.class);
      query.setParameter("externalUserId", externalUserId);
      query.setParameter("externalUserType", externalUserType);
      query.setParameter("deleted", "true");

      List<Users> users = query.getResultList();

      if (users.size() > 0) {
        return users.get(0);
      }

    } catch (Exception ex2) {
      log.error("[getUserByExternalIdAndType]", ex2);
    }
    return null;
  }

  public Long addUserWithExternalKey(long level_id, int availible,
      int status, String firstname, String login, String lastname,
      long language_id, String userpass, Adresses address, Date age,
      String hash, String externalUserId, String externalUserType,
      boolean generateSipUserData, String email, String jNameTimeZone,
      String pictureuri) {
    try {
      Users users = new Users();
      users.setFirstname(firstname);
      users.setLogin(login);
      users.setLastname(lastname);
      users.setAge(age);

      if (address != null) {
        users.setAdresses(address);
      } else {
        users.setAdresses("", "", "", statemanagement.getStateById(1L), "",
            "", "", "", email);
      }

      users.setAvailible(availible);
      users.setLastlogin(new Date());
      users.setLasttrans(new Long(0));
      users.setLevel_id(level_id);
      users.setStatus(status);
      users.setTitle_id(new Integer(1));
      users.setStarttime(new Date());
      users.setActivatehash(hash);
      users.setPictureuri(pictureuri);
      users.setOmTimeZone(omTimeZoneDaoImpl.getOmTimeZone(jNameTimeZone));

      if (generateSipUserData) {

        UserSipData userSipData = openXGHttpClient
            .openSIPgUserCreateUser(firstname, "", lastname, users
                .getAdresses().getEmail(), userpass, login);

        Long userSipDataId = userSipDataDao.addUserSipData(userSipData);

        users.setUserSipData(userSipDataDao
            .getUserSipDataById(userSipDataId));

      } else {
        UserSipData userSipData = new UserSipData();

        userSipData.setUsername("");
        userSipData.setUserpass("");
        userSipData.setAuthId("");

        Long userSipDataId = userSipDataDao.addUserSipData(userSipData);

        users.setUserSipData(userSipDataDao
            .getUserSipDataById(userSipDataId));
      }

      users.setExternalUserId(externalUserId);
      users.setExternalUserType(externalUserType);

      // this is needed cause the language is not a needed data at
      // registering
      if (language_id != 0) {
        users.setLanguage_id(new Long(language_id));
      } else {
        users.setLanguage_id(null);
      }
      users.setPassword(manageCryptStyle.getInstanceOfCrypt()
          .createPassPhrase(userpass));
      users.setRegdate(new Date());
      users.setDeleted("false");

      em.persist(users);

      em.refresh(users);

      // em.flush();

      long user_id = users.getUser_id();

      return user_id;

    } catch (Exception ex2) {
      log.error("[registerUser]", ex2);
    }
    return null;
  }

  public Long addUser(Users usr) {
    try {
      em.persist(usr);
      //em.refresh(usr);
      em.flush();

      return usr.getUser_id();
    } catch (Exception ex2) {
      log.error("[addUser]", ex2);
    }
    return null;
  }

  public Long addUserBackup(Users usr) {
    try {

      Long userSipDataId = userSipDataDao.addUserSipData(usr
          .getUserSipData());
      if (userSipDataId != null) {
        usr.setUserSipData(userSipDataDao
            .getUserSipDataById(userSipDataId));
      }

      usr = em.merge(usr);
      Long user_id = usr.getUser_id();

      return user_id;

    } catch (Exception ex2) {
      log.error("[addUserBackup]", ex2);
    }
    return null;
  }

  public void addUserLevel(String description, int myStatus) {
    try {
      Userlevel uslevel = new Userlevel();
      uslevel.setStarttime(new Date());
      uslevel.setDescription(description);
      uslevel.setStatuscode(new Integer(myStatus));
      uslevel.setDeleted("false");
      em.merge(uslevel);
    } catch (Exception ex2) {
      log.error("[addUserLevel]", ex2);
    }
  }

  /**
   * Update User by Object
   *
   * @param user_level
   * @param values
   * @param users_id
   * @return
   */

  public Long saveOrUpdateUser(Long user_level, ObjectMap<?, ?> values,
      Long users_id) {
    try {
      if (authLevelManagement.checkAdminLevel(user_level)) {
        Long returnLong = null;

        Long user_id = Long.parseLong(values.get("user_id").toString());

        if (user_id != null && user_id > 0) {

          returnLong = user_id;
          Users savedUser = usersDao.getUser(user_id);
          savedUser.setAge((Date) values.get("age"));
          savedUser.setFirstname(values.get("firstname").toString());
          savedUser.setLastname(values.get("lastname").toString());
          savedUser.setTitle_id(Integer.parseInt(values.get(
              "title_id").toString()));

          savedUser.setLanguage_id(Long.parseLong(values.get(
              "languages_id").toString()));
          savedUser.setOmTimeZone(omTimeZoneDaoImpl
              .getOmTimeZone((values.get("jnameTimeZone")
                  .toString())));

          String password = values.get("password").toString();

          if (password.length() > 3) {
            savedUser.setPassword(manageCryptStyle
                .getInstanceOfCrypt()
                .createPassPhrase(password));
          }

          String email = values.get("email").toString();

          if (!email.equals(savedUser.getAdresses().getEmail())) {
            boolean checkEmail = emailManagement
                .checkUserEMail(email);
            if (!checkEmail) {
              // mail already used by another user!
              returnLong = new Long(-11);
            } else {
              savedUser.getAdresses().setEmail(email);
            }
          }

          String phone = values.get("phone").toString();
          savedUser.getAdresses().setPhone(phone);
          savedUser.getAdresses().setComment(
              values.get("comment").toString());
          savedUser.getAdresses().setStreet(
              values.get("street").toString());
          savedUser.getAdresses().setTown(
              values.get("town").toString());
          savedUser.getAdresses().setAdditionalname(
              values.get("additionalname").toString());
          savedUser.getAdresses()
              .setZip(values.get("zip").toString());
          savedUser.setForceTimeZoneCheck(false);
          savedUser.getAdresses().setStates(
              statemanagement.getStateById(Long.parseLong(values
                  .get("state_id").toString())));

          savedUser.setShowContactData(Boolean.valueOf(values.get(
              "showContactData").toString()));
          savedUser.setShowContactDataToContacts(Boolean
              .valueOf(values.get("showContactDataToContacts")
                  .toString()));
          savedUser
              .setUserOffers(values.get("userOffers").toString());
          savedUser.setUserSearchs(values.get("userSearchs")
              .toString());

          // savedUser.setAdresses(addressmanagement.getAdressbyId(user.getAdresses().getAdresses_id()));

          if (savedUser.getUser_id() == null) {
            em.persist(savedUser);
          } else {
            if (!em.contains(savedUser)) {
              em.merge(savedUser);
            }
          }

          return returnLong;
        }

      } else {
        log.error("[saveOrUpdateUser] invalid auth " + users_id + " "
            + new Date());
      }
    } catch (Exception ex) {
      log.error("[saveOrUpdateUser]", ex);
    }

    return null;
  }

  /**
   * reset a username by a given mail oder login by sending a mail to the
   * registered EMail-Address
   *
   * @param email
   * @param username
   * @param appLink
   * @return
   */
  public Long resetUser(String email, String username, String appLink) {
    try {

      log.debug("resetUser " + email);

      // check if Mail given
      if (email.length() > 0) {
        // log.debug("getAdresses_id "+addr_e.getAdresses_id());
        Users us = usersDao.getUserByEmail(email);
        if (us != null) {
          this.sendHashByUser(us, appLink);
          return new Long(-4);
        } else {
          return new Long(-9);
        }
      } else if (username.length() > 0) {
        Users us = usersDao.getUserByName(username);
        if (us != null) {
          this.sendHashByUser(us, appLink);
          return new Long(-4);
        } else {
          return new Long(-3);
        }
      }
    } catch (Exception e) {
      log.error("[resetUser]", e);
      return new Long(-1);
    }
    return new Long(-2);
  }

  private void sendHashByUser(Users us, String appLink) throws Exception {
    String loginData = us.getLogin() + new Date();
    log.debug("User: " + us.getLogin());
    us.setResethash(manageCryptStyle.getInstanceOfCrypt().createPassPhrase(
        loginData));
    usersDao.updateUser(us);
    String reset_link = appLink + "?lzproxied=solo&hash="
        + us.getResethash();

    String email = us.getAdresses().getEmail();

    Long default_lang_id = Long.valueOf(
        cfgManagement.getConfKey(3, "default_lang_id").getConf_value())
        .longValue();

    String template = resetPasswordTemplate.getResetPasswordTemplate(
        reset_link, default_lang_id);

    mailHandler.sendMail(email, fieldmanagment.getString(517L, default_lang_id), template);
  }

  /**
   *
   * Find User by Id
   */
  // -----------------------------------------------------------------------------------------------------
  public Users getUserById(Long id) {
    log.debug("Usermanagement.getUserById");

    if (id == null || id <= 0) {
      return null;
    }
    CriteriaBuilder cb = em.getCriteriaBuilder();
    CriteriaQuery<Users> cq = cb.createQuery(Users.class);
    Root<Users> c = cq.from(Users.class);
    Predicate condition = cb.equal(c.get("deleted"), "false");
    Predicate subCondition = cb.equal(c.get("user_id"), id);
    cq.where(condition, subCondition);
    TypedQuery<Users> q = em.createQuery(cq);
    Users u = null;
    try {
      u = q.getSingleResult();
    } catch (NoResultException e) {
      // u=null}
    } catch (NonUniqueResultException ex) {
    }

    return u;
  }

  public Users getUserByIdAndDeleted(Long id) throws Exception {
    log.debug("Usermanagement.getUserById");

    CriteriaBuilder cb = em.getCriteriaBuilder();
    CriteriaQuery<Users> cq = cb.createQuery(Users.class);
    Root<Users> c = cq.from(Users.class);
    Predicate condition = cb.equal(c.get("user_id"), id);
    cq.where(condition);
    TypedQuery<Users> q = em.createQuery(cq);
    Users u = null;
    try {
      u = q.getSingleResult();
    } catch (NoResultException e) {
      // u=null}
    }

    return u;

  }

  // -----------------------------------------------------------------------------------------------------

  /**
   * @author o.becherer Find User by LoginName (test existence of a active
   *         user with login - name
   */
  // -----------------------------------------------------------------------------------------------------
  public Users getUserByLogin(String login) throws Exception {
    log.debug("Usermanagement.getUserByLogin : " + login);

    CriteriaBuilder cb = em.getCriteriaBuilder();
    CriteriaQuery<Users> cq = cb.createQuery(Users.class);
    Root<Users> c = cq.from(Users.class);
    Predicate condition = cb.equal(c.get("deleted"), "false");
    Predicate subCondition = cb.equal(c.get("login"), login);
    cq.where(condition, subCondition);
    TypedQuery<Users> q = em.createQuery(cq);
    Users u = null;
    try {
      u = q.getSingleResult();
    } catch (NoResultException e) {
      // u=null}
    }

    return u;

  }

  // -----------------------------------------------------------------------------------------------------

  /**
   * @author swagner Find User by LoginName or EMail (test existence of a
   *         active user with login - name
   */
  // -----------------------------------------------------------------------------------------------------
  public Users getUserByLoginOrEmail(String userOrEmail) throws Exception {
    // log.debug("Usermanagement.getUserByLoginOrEmail : " + userOrEmail);

    String hql = "SELECT c from Users AS c "
        + "WHERE "
        + "(c.login LIKE :userOrEmail OR c.adresses.email LIKE :userOrEmail  ) "
        + "AND c.externalUserId IS NULL " + "AND c.deleted <> :deleted";

    TypedQuery<Users> query = em.createQuery(hql, Users.class);
    query.setParameter("userOrEmail", userOrEmail);
    query.setParameter("deleted", "true");

    List<Users> ll = query.getResultList();

    if (ll.size() > 1) {
      log.error("ALERT :: There are two users in the database that have either same login or Email ");
      return ll.get(0);
      // throw new
      // Exception("ALERT :: There are two users in the database that have either same login or Email ");
    } else if (ll.size() == 1) {
      return ll.get(0);
    } else {
      return null;
    }

  }

  public Users getUserByEmail(String userOrEmail) throws Exception {
    log.debug("Usermanagement.getUserByEmail : " + userOrEmail);

    String hql = "SELECT c from Users AS c " + "WHERE "
        + "c.adresses.email LIKE :userOrEmail";

    TypedQuery<Users> query = em.createQuery(hql, Users.class);
    query.setParameter("userOrEmail", userOrEmail);

    List<Users> ll = query.getResultList();

    if (ll.size() > 1) {
      log.error("ALERT :: There are two users in the database that have same Email ");
      return ll.get(0);
      // throw new
      // Exception("ALERT :: There are two users in the database that have either same login or Email ");
    } else if (ll.size() == 1) {
      return ll.get(0);
    } else {
      return null;
    }

  }

  /**
   * @author o.becherer Updating User Object
   */
  // -----------------------------------------------------------------------------------------------------
  public void updateUserObject(Users user, boolean encryptPasswd)
      throws Exception {
    log.debug("Usermanagement.getUserByLogin");

    if (encryptPasswd) {
      String encrypted = manageCryptStyle.getInstanceOfCrypt()
          .createPassPhrase(user.getPassword());
      user.setPassword(encrypted);
    }

    usersDao.updateUser(user);

  }

  // -----------------------------------------------------------------------------------------------------

  /**
   * @param admin
   * @param room_id
   * @return
   */
  public Boolean kickUserByStreamId(String SID, Long room_id) {
    try {
      Long users_id = sessionManagement.checkSession(SID);
      Long user_level = getUserLevelByID(users_id);
      HashMap<String, RoomClient> MyUserList = clientListManager
          .getClientListByRoom(room_id);

      // admins only
      if (authLevelManagement.checkAdminLevel(user_level)) {

        sessionManagement.clearSessionByRoomId(room_id);

        for (Iterator<String> iter = MyUserList.keySet().iterator(); iter
            .hasNext();) {
          String key = iter.next();

          RoomClient rcl = MyUserList.get(key);

          if (rcl == null) {
            return true;
          }
          String scopeName = "hibernate";
          if (rcl.getRoom_id() != null) {
            scopeName = rcl.getRoom_id().toString();
          }
          IScope currentScope = scopeApplicationAdapter
              .getRoomScope(scopeName);
          scopeApplicationAdapter.roomLeaveByScope(rcl, currentScope, true);

          HashMap<Integer, String> messageObj = new HashMap<Integer, String>();
          messageObj.put(0, "kick");
          scopeApplicationAdapter.sendMessageById(messageObj,
              rcl.getStreamid(), currentScope);

        }

        return true;
      }

    } catch (Exception err) {
      log.error("[kickUserByStreamId]", err);
    }
    return null;
  }

  public Boolean kickUserByPublicSID(String SID, String publicSID) {
    try {
      Long users_id = sessionManagement.checkSession(SID);
      Long user_level = getUserLevelByID(users_id);

      // admins only
      if (authLevelManagement.checkAdminLevel(user_level)) {

        RoomClient rcl = clientListManager
            .getClientByPublicSID(publicSID, false);

        if (rcl == null) {
          return true;
        }

        String scopeName = "hibernate";
        if (rcl.getRoom_id() != null) {
          scopeName = rcl.getRoom_id().toString();
        }
        IScope currentScope = scopeApplicationAdapter
            .getRoomScope(scopeName);

        HashMap<Integer, String> messageObj = new HashMap<Integer, String>();
        messageObj.put(0, "kick");
        scopeApplicationAdapter.sendMessageById(messageObj,
            rcl.getStreamid(), currentScope);

        scopeApplicationAdapter.roomLeaveByScope(rcl, currentScope, true);

        return true;
      }

    } catch (Exception err) {
      log.error("[kickUserByStreamId]", err);
    }
    return null;
  }

  /**
   * @param hash
   * @return
   */
  public Users getUserByActivationHash(String hash) {
    try {
      String hql = "SELECT u FROM Users as u "
          + " where u.activatehash = :activatehash"
          + " AND u.deleted <> :deleted";
      TypedQuery<Users> query = em.createQuery(hql, Users.class);
      query.setParameter("activatehash", hash);
      query.setParameter("deleted", "true");
      Users u = null;
      try {
        u = query.getSingleResult();
      } catch (NoResultException e) {
        // u=null}
      }
      return u;
    } catch (Exception e) {
      log.error("[getUserByActivationHash]", e);
    }
    return null;

  }

  public void updateUser(Users user) {
    usersDao.updateUser(user);
  }

  /**
   * @param user_level
   * @param start
   * @param max
   * @param orderby
   * @param asc
   * @param search
   * @return
   */
  public SearchResult<Users> getUsersListWithSearch(Long user_level, int start,
      int max, String orderby, boolean asc, String search) {
    try {
      if (authLevelManagement.checkAdminLevel(user_level)) {

        String hql = "select c from Users c "
            + "where c.deleted = 'false' " + "AND ("
            + "lower(c.login) LIKE :search "
            + "OR lower(c.firstname) LIKE :search "
            + "OR lower(c.lastname) LIKE :search " + ")";

        if (orderby.startsWith("c.")) {
          hql += "ORDER BY " + orderby;
        } else {
          hql += "ORDER BY " + "c." + orderby;
        }

        if (asc) {
          hql += " ASC";
        } else {
          hql += " DESC";
        }

        if (search.length() == 0) {
          search = "%";
        } else {
          search = "%" + search + "%";
        }
        log.debug("getUsersList search: " + search);

        SearchResult<Users> sresult = new SearchResult<Users>();
        sresult.setObjectName(Users.class.getName());
        sresult.setRecords(usersDao
            .selectMaxFromUsersWithSearch(search));

        // get all users
        TypedQuery<Users> query = em.createQuery(hql, Users.class);
        query.setParameter("search", StringUtils.lowerCase(search));
        query.setMaxResults(max);
        query.setFirstResult(start);

        sresult.setResult(query.getResultList());

        return sresult;
      }
    } catch (Exception ex2) {
      log.error("[getUsersList] " + ex2);
    }
    return null;
  }

  public List<Users> searchUserProfile(String searchTxt, String userOffers,
      String userSearchs, String orderBy, int start, int max, boolean asc) {
    try {

      String hql = "select c from Users c "
          + "where c.deleted = 'false' ";

      if (searchTxt.length() != 0 && userOffers.length() != 0
          && userSearchs.length() != 0) {

        hql += "AND " + "(" + "(" + "lower(c.login) LIKE :search "
            + "OR lower(c.firstname) LIKE :search "
            + "OR lower(c.lastname) LIKE :search "
            + "OR lower(c.adresses.email) LIKE :search "
            + "OR lower(c.adresses.town) LIKE :search " + ")"
            + "AND" + "(" + "lower(c.userOffers) LIKE :userOffers "
            + ")" + "AND" + "("
            + "lower(c.userSearchs) LIKE :userSearchs " + ")" + ")";

      } else if (searchTxt.length() != 0 && userOffers.length() != 0) {

        hql += "AND " + "(" + "(" + "lower(c.login) LIKE :search "
            + "OR lower(c.firstname) LIKE :search "
            + "OR lower(c.lastname) LIKE :search "
            + "OR lower(c.adresses.email) LIKE :search "
            + "OR lower(c.adresses.town) LIKE :search " + ")"
            + "AND" + "(" + "lower(c.userOffers) LIKE :userOffers "
            + ")" + ")";

      } else if (searchTxt.length() != 0 && userSearchs.length() != 0) {

        hql += "AND " + "(" + "(" + "lower(c.login) LIKE :search "
            + "OR lower(c.firstname) LIKE :search "
            + "OR lower(c.lastname) LIKE :search "
            + "OR lower(c.adresses.email) LIKE :search "
            + "OR lower(c.adresses.town) LIKE :search " + ")"
            + "AND" + "("
            + "lower(c.userSearchs) LIKE :userSearchs " + ")" + ")";

      } else if (userOffers.length() != 0 && userSearchs.length() != 0) {

        hql += "AND " + "(" + "("
            + "lower(c.userOffers) LIKE :userOffers " + ")" + "AND"
            + "(" + "lower(c.userSearchs) LIKE :userSearchs " + ")"
            + ")";

      } else if (searchTxt.length() != 0) {

        hql += "AND " + "(" + "(" + "lower(c.login) LIKE :search "
            + "OR lower(c.firstname) LIKE :search "
            + "OR lower(c.lastname) LIKE :search "
            + "OR lower(c.adresses.email) LIKE :search "
            + "OR lower(c.adresses.town) LIKE :search " + ")" + ")";

      } else if (userOffers.length() != 0) {

        hql += "AND " + "(" + "("
            + "lower(c.userOffers) LIKE :userOffers " + ")" + ")";

      } else if (userSearchs.length() != 0) {

        hql += "AND " + "(" + "("
            + "lower(c.userSearchs) LIKE :userSearchs " + ")" + ")";

      }

      hql += " ORDER BY " + orderBy;

      if (asc) {
        hql += " ASC";
      } else {
        hql += " DESC";
      }

      if (searchTxt.length() != 0) {
        searchTxt = "%" + searchTxt + "%";
      }

      if (userOffers.length() != 0) {
        userOffers = "%" + userOffers + "%";
      }

      if (userSearchs.length() != 0) {
        userSearchs = "%" + userSearchs + "%";
      }

      log.debug("hql :: " + hql);

      // get all users
      TypedQuery<Users> query = em.createQuery(hql, Users.class);

      if (searchTxt.length() != 0 && userOffers.length() != 0
          && userSearchs.length() != 0) {

        query.setParameter("search", StringUtils.lowerCase(searchTxt));
        query.setParameter("userOffers",
            StringUtils.lowerCase(userOffers));
        query.setParameter("userSearchs",
            StringUtils.lowerCase(userSearchs));

      } else if (searchTxt.length() != 0 && userOffers.length() != 0) {

        query.setParameter("search", StringUtils.lowerCase(searchTxt));
        query.setParameter("userOffers",
            StringUtils.lowerCase(userOffers));

      } else if (searchTxt.length() != 0 && userSearchs.length() != 0) {

        query.setParameter("search", StringUtils.lowerCase(searchTxt));
        query.setParameter("userSearchs",
            StringUtils.lowerCase(userSearchs));

      } else if (userOffers.length() != 0 && userSearchs.length() != 0) {

        query.setParameter("userOffers",
            StringUtils.lowerCase(userOffers));
        query.setParameter("userSearchs",
            StringUtils.lowerCase(userSearchs));

      } else if (searchTxt.length() != 0) {

        query.setParameter("search", StringUtils.lowerCase(searchTxt));

      } else if (userOffers.length() != 0) {

        query.setParameter("userOffers",
            StringUtils.lowerCase(userOffers));

      } else if (userSearchs.length() != 0) {

        query.setParameter("userSearchs",
            StringUtils.lowerCase(userSearchs));

      }

      query.setMaxResults(max);
      query.setFirstResult(start);

      List<Users> userList = query.getResultList();

      return userList;

    } catch (Exception ex2) {
      log.error("[getUsersList] ", ex2);
    }

    return null;
  }

  public Long searchCountUserProfile(String searchTxt, String userOffers,
      String userSearchs) {
    try {

      String hql = "select count(c.user_id) from Users c "
          + "where c.deleted = 'false' ";

      if (searchTxt.length() != 0 && userOffers.length() != 0
          && userSearchs.length() != 0) {

        hql += "AND " + "(" + "(" + "lower(c.login) LIKE :search "
            + "OR lower(c.firstname) LIKE :search "
            + "OR lower(c.lastname) LIKE :search "
            + "OR lower(c.adresses.email) LIKE :search "
            + "OR lower(c.adresses.town) LIKE :search " + ")"
            + "AND" + "(" + "lower(c.userOffers) LIKE :userOffers "
            + ")" + "AND" + "("
            + "lower(c.userSearchs) LIKE :userSearchs " + ")" + ")";

      } else if (searchTxt.length() != 0 && userOffers.length() != 0) {

        hql += "AND " + "(" + "(" + "lower(c.login) LIKE :search "
            + "OR lower(c.firstname) LIKE :search "
            + "OR lower(c.lastname) LIKE :search) "
            + "OR lower(c.adresses.email) LIKE :search "
            + "OR lower(c.adresses.town) LIKE :search " + ")"
            + "AND" + "(" + "lower(c.userOffers) LIKE :userOffers "
            + ")" + ")";

      } else if (searchTxt.length() != 0 && userSearchs.length() != 0) {

        hql += "AND " + "(" + "(" + "lower(c.login) LIKE :search "
            + "OR lower(c.firstname) LIKE :search "
            + "OR lower(c.lastname) LIKE :search "
            + "OR lower(c.adresses.email) LIKE :search "
            + "OR lower(c.adresses.town) LIKE :search " + ")"
            + "AND" + "("
            + "lower(c.userSearchs) LIKE :userSearchs " + ")" + ")";

      } else if (userOffers.length() != 0 && userSearchs.length() != 0) {

        hql += "AND " + "(" + "("
            + "lower(c.userOffers) LIKE :userOffers " + ")" + "AND"
            + "(" + "lower(c.userSearchs) LIKE :userSearchs " + ")"
            + ")";

      } else if (searchTxt.length() != 0) {

        hql += "AND " + "(" + "(" + "lower(c.login) LIKE :search "
            + "OR lower(c.firstname) LIKE :search "
            + "OR lower(c.lastname) LIKE :search "
            + "OR lower(c.adresses.email) LIKE :search "
            + "OR lower(c.adresses.town) LIKE :search " + ")" + ")";

      } else if (userOffers.length() != 0) {

        hql += "AND " + "(" + "("
            + "lower(c.userOffers) LIKE :userOffers " + ")" + ")";

      } else if (userSearchs.length() != 0) {

        hql += "AND " + "(" + "("
            + "lower(c.userSearchs) LIKE :userSearchs " + ")" + ")";

      }

      if (searchTxt.length() != 0) {
        searchTxt = "%" + searchTxt + "%";
      }

      if (userOffers.length() != 0) {
        userOffers = "%" + userOffers + "%";
      }

      if (userSearchs.length() != 0) {
        userSearchs = "%" + userSearchs + "%";
      }

      log.debug("hql :: " + hql);

      // get all users
      TypedQuery<Long> query = em.createQuery(hql, Long.class);

      if (searchTxt.length() != 0 && userOffers.length() != 0
          && userSearchs.length() != 0) {

        query.setParameter("search", StringUtils.lowerCase(searchTxt));
        query.setParameter("userOffers",
            StringUtils.lowerCase(userOffers));
        query.setParameter("userSearchs",
            StringUtils.lowerCase(userSearchs));

      } else if (searchTxt.length() != 0 && userOffers.length() != 0) {

        query.setParameter("search", StringUtils.lowerCase(searchTxt));
        query.setParameter("userOffers",
            StringUtils.lowerCase(userOffers));

      } else if (searchTxt.length() != 0 && userSearchs.length() != 0) {

        query.setParameter("search", StringUtils.lowerCase(searchTxt));
        query.setParameter("userSearchs",
            StringUtils.lowerCase(userSearchs));

      } else if (userOffers.length() != 0 && userSearchs.length() != 0) {

        query.setParameter("userOffers",
            StringUtils.lowerCase(userOffers));
        query.setParameter("userSearchs",
            StringUtils.lowerCase(userSearchs));

      } else if (searchTxt.length() != 0) {

        query.setParameter("search", StringUtils.lowerCase(searchTxt));

      } else if (userOffers.length() != 0) {

        query.setParameter("userOffers",
            StringUtils.lowerCase(userOffers));

      } else if (userSearchs.length() != 0) {

        query.setParameter("userSearchs",
            StringUtils.lowerCase(userSearchs));

      }

      List<Long> userList = query.getResultList();

      return userList.get(0);

    } catch (Exception ex2) {
      log.error("[getUsersList] ", ex2);
    }

    return null;
  }

  public Long searchMaxUserProfile(String searchTxt, String userOffers,
      String userSearchs) {
    try {

      String hql = "select count(c.user_id) from Users c "
          + "where c.deleted = 'false' " + "AND " + "(" + "("
          + "lower(c.login) LIKE :search "
          + "OR lower(c.firstname) LIKE :search "
          + "OR lower(c.lastname) LIKE :search "
          + "OR lower(c.adresses.email) LIKE :search "
          + "OR lower(c.adresses.town) LIKE :search " + ")" + "OR"
          + "(" + "lower(c.userOffers) LIKE :userOffers " + ")"
          + "OR" + "(" + "lower(c.userSearchs) LIKE :userSearchs "
          + ")" + ")";

      if (searchTxt.length() == 0) {
        searchTxt = "%";
      } else {
        searchTxt = "%" + searchTxt + "%";
      }

      if (userOffers.length() == 0) {
        userOffers = "%";
      } else {
        userOffers = "%" + userOffers + "%";
      }

      if (userSearchs.length() == 0) {
        userSearchs = "%";
      } else {
        userSearchs = "%" + userSearchs + "%";
      }

      // get all users
      TypedQuery<Long> query = em.createQuery(hql, Long.class);
      query.setParameter("search", StringUtils.lowerCase(searchTxt));
      query.setParameter("userOffers", StringUtils.lowerCase(userOffers));
      query.setParameter("userSearchs",
          StringUtils.lowerCase(userSearchs));

      List<Long> ll = query.getResultList();

      return ll.get(0);

    } catch (Exception ex2) {
      log.error("[searchMaxUserProfile] " + ex2);
    }

    return null;
  }

}
TOP

Related Classes of org.openmeetings.app.data.user.Usermanagement

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.