You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openmeetings.apache.org by so...@apache.org on 2014/06/07 09:45:58 UTC

svn commit: r1601073 [4/6] - in /openmeetings: branches/3.0.x/ branches/3.0.x/docs/ branches/3.0.x/src/axis/java/org/apache/openmeetings/axis/services/ branches/3.0.x/src/db/java/org/apache/openmeetings/db/dao/basic/ branches/3.0.x/src/db/java/org/apac...

Modified: openmeetings/trunk/singlewebapp/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/label/FieldValueDao.java
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/label/FieldValueDao.java?rev=1601073&r1=1601072&r2=1601073&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/label/FieldValueDao.java (original)
+++ openmeetings/trunk/singlewebapp/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/label/FieldValueDao.java Sat Jun  7 07:45:55 2014
@@ -67,15 +67,7 @@ public class FieldValueDao implements ID
 	}
 	
 	public List<Fieldvalues> get(Long language_id, String search, int start, int count, String sort) {
-		String sql = DaoHelper.getSearchQuery(
-				"Fieldlanguagesvalues"
-				, "flv"
-				, search
-				, true
-				, false
-				, "flv.fieldvalues.deleted = false AND flv.language_id = :lang"
-				, sort
-				, searchFields);
+		String sql = DaoHelper.getSearchQuery("Fieldlanguagesvalues", "flv", null, search, true, false, "flv.fieldvalues.deleted = false AND flv.language_id = :lang", sort, searchFields);
 		TypedQuery<Fieldlanguagesvalues> q = em.createQuery(sql, Fieldlanguagesvalues.class);
 		q.setParameter("lang", language_id);
 		q.setFirstResult(start);
@@ -121,15 +113,7 @@ public class FieldValueDao implements ID
 	}
 	
 	public long count(Long language_id, String search) {
-		String sql = DaoHelper.getSearchQuery(
-				"Fieldlanguagesvalues"
-				, "flv"
-				, search
-				, true
-				, true
-				, "flv.fieldvalues.deleted = false AND flv.language_id = :lang"
-				, null
-				, searchFields);
+		String sql = DaoHelper.getSearchQuery("Fieldlanguagesvalues", "flv", null, search, true, true, "flv.fieldvalues.deleted = false AND flv.language_id = :lang", null, searchFields);
 		TypedQuery<Long> q = em.createQuery(sql, Long.class);
 		q.setParameter("lang", language_id);
 		return q.getSingleResult();

Modified: openmeetings/trunk/singlewebapp/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/record/FlvRecordingDao.java
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/record/FlvRecordingDao.java?rev=1601073&r1=1601072&r2=1601073&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/record/FlvRecordingDao.java (original)
+++ openmeetings/trunk/singlewebapp/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/record/FlvRecordingDao.java Sat Jun  7 07:45:55 2014
@@ -154,7 +154,7 @@ public class FlvRecordingDao {
 
 			return query.getResultList();
 		} catch (Exception ex2) {
-			log.error("[getFlvRecordings]: ", ex2);
+			log.error("[getAllFlvRecordings]: ", ex2);
 		}
 		return null;
 	}
@@ -244,7 +244,7 @@ public class FlvRecordingDao {
 
 			update(fId);
 		} catch (Exception ex2) {
-			log.error("[deleteFileExplorerItem]: ", ex2);
+			log.error("[updateFlvRecordingEndTime]: ", ex2);
 		}
 	}
 

Modified: openmeetings/trunk/singlewebapp/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/room/RoomDao.java
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/room/RoomDao.java?rev=1601073&r1=1601072&r2=1601073&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/room/RoomDao.java (original)
+++ openmeetings/trunk/singlewebapp/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/room/RoomDao.java Sat Jun  7 07:45:55 2014
@@ -29,6 +29,8 @@ import javax.persistence.EntityManager;
 import javax.persistence.PersistenceContext;
 import javax.persistence.TypedQuery;
 
+import org.apache.openjpa.persistence.OpenJPAPersistence;
+import org.apache.openjpa.persistence.OpenJPAQuery;
 import org.apache.openmeetings.db.dao.IDataProviderDao;
 import org.apache.openmeetings.db.dao.basic.ConfigurationDao;
 import org.apache.openmeetings.db.dao.user.UserDao;
@@ -59,12 +61,19 @@ public class RoomDao implements IDataPro
 	public Room get(long id) {
 		TypedQuery<Room> q = em.createNamedQuery("getRoomById", Room.class);
 		q.setParameter("id", id);
-		List<Room> l = q.getResultList();
+		@SuppressWarnings("unchecked")
+		OpenJPAQuery<Room> kq = OpenJPAPersistence.cast(q);
+		kq.getFetchPlan().addFetchGroup("roomModerators");
+		List<Room> l = kq.getResultList();
 		return l.isEmpty() ? null : l.get(0);
 	}
 
 	public List<Room> get() {
-		return em.createNamedQuery("getBackupRooms", Room.class).getResultList();
+		TypedQuery<Room> q = em.createNamedQuery("getBackupRooms", Room.class);
+		@SuppressWarnings("unchecked")
+		OpenJPAQuery<Room> kq = OpenJPAPersistence.cast(q);
+		kq.getFetchPlan().addFetchGroup("roomModerators");
+		return kq.getResultList();
 	}
 	
 	public List<Room> get(int start, int count) {

Modified: openmeetings/trunk/singlewebapp/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/room/RoomModeratorsDao.java
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/room/RoomModeratorsDao.java?rev=1601073&r1=1601072&r2=1601073&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/room/RoomModeratorsDao.java (original)
+++ openmeetings/trunk/singlewebapp/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/room/RoomModeratorsDao.java Sat Jun  7 07:45:55 2014
@@ -18,282 +18,50 @@
  */
 package org.apache.openmeetings.db.dao.room;
 
-import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey;
-
+import java.util.Collection;
 import java.util.Date;
-import java.util.Iterator;
-import java.util.LinkedList;
 import java.util.List;
-import java.util.Map;
 
 import javax.persistence.EntityManager;
-import javax.persistence.NoResultException;
 import javax.persistence.PersistenceContext;
-import javax.persistence.TypedQuery;
 
 import org.apache.openmeetings.db.dao.user.UserDao;
 import org.apache.openmeetings.db.entity.room.RoomModerator;
-import org.apache.openmeetings.db.entity.user.User;
-import org.red5.logging.Red5LoggerFactory;
-import org.slf4j.Logger;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Transactional;
 
 @Transactional
 public class RoomModeratorsDao {
-	private static final Logger log = Red5LoggerFactory.getLogger(RoomModeratorsDao.class, webAppRootKey);
 	@Autowired
 	private UserDao userDao;
 	@PersistenceContext
 	private EntityManager em;
 
-	/**
-	 * 
-	 * @param us
-	 * @param isSuperModerator
-	 * @return
-	 */
-	public Long addRoomModeratorByUserId(User us, Boolean isSuperModerator,
-			Long roomId) {
-		try {
-			RoomModerator rModerator = new RoomModerator();
-			rModerator.setUser(us);
-			rModerator.setIsSuperModerator(isSuperModerator);
-			rModerator.setStarttime(new Date());
-			rModerator.setDeleted(false);
-			rModerator.setRoomId(roomId);
-			rModerator = em.merge(rModerator);
-			long rModeratorId = rModerator.getRoomModeratorsId();
-			return rModeratorId;
-		} catch (Exception ex2) {
-			log.error("[addRoomModeratorByUserId] ", ex2);
-		}
-		return null;
-	}
-
-	public Long addRoomModeratorByObj(RoomModerator rModerator) {
-		try {
-			rModerator.setStarttime(new Date());
-			rModerator = em.merge(rModerator);
-			long rModeratorId = rModerator.getRoomModeratorsId();
-			return rModeratorId;
-		} catch (Exception ex2) {
-			log.error("[addRoomModeratorByUserId] ", ex2);
-		}
-		return null;
-	}
-
-	/**
-	 * get all available RoomTypes
-	 * 
-	 * @return List of RoomTypes
-	 */
-	public RoomModerator getRoomModeratorById(Long roomModeratorsId) {
-		try {
-			TypedQuery<RoomModerator> query = em.createNamedQuery("getRoomModeratorById", RoomModerator.class);
-			query.setParameter("roomModeratorsId", roomModeratorsId);
-			RoomModerator roomModerators = null;
-			try {
-				roomModerators = query.getSingleResult();
-			} catch (NoResultException ex) {
-			}
-			return roomModerators;
-
-		} catch (Exception ex2) {
-			log.error("[getRoomModeratorById] ", ex2);
-		}
-		return null;
-	}
-
-	public List<RoomModerator> getRoomModeratorByRoomId(Long roomId) {
-		try {
-			TypedQuery<RoomModerator> query = em.createNamedQuery("getRoomModeratorByRoomId", RoomModerator.class);
-			query.setParameter("deleted", true);
-			query.setParameter("roomId", roomId);
-			return query.getResultList();
-		} catch (Exception ex2) {
-			log.error("[getRoomModeratorByRoomId] ", ex2);
-			ex2.printStackTrace();
-		}
-		return null;
-	}
-
-	public List<RoomModerator> getRoomModeratorByUserAndRoomId(Long roomId,
-			Long user_id) {
-		try {
-			TypedQuery<RoomModerator> query = em.createNamedQuery("getRoomModeratorByUserAndRoomId", RoomModerator.class);
-			query.setParameter("deleted", true);
-			query.setParameter("roomId", roomId);
-			query.setParameter("user_id", user_id);
-			return query.getResultList();
-		} catch (Exception ex2) {
-			log.error("[getRoomModeratorByUserAndRoomId] ", ex2);
-			ex2.printStackTrace();
+	public RoomModerator get(long id) {
+		List<RoomModerator> list = em.createNamedQuery("getRoomModeratorById", RoomModerator.class)
+				.setParameter("roomModeratorsId", id).getResultList();
+		if (!list.isEmpty()) {
+			return list.get(0);
 		}
 		return null;
 	}
-
-	/**
-	 * 
-	 * @param roomModeratorsId
-	 */
-	public void removeRoomModeratorByUserId(Long roomModeratorsId) {
-		try {
-			RoomModerator rModerator = this
-					.getRoomModeratorById(roomModeratorsId);
-
-			if (rModerator == null) {
-				return;
-			}
-
-			rModerator.setUpdatetime(new Date());
-			rModerator.setDeleted(true);
-
-			if (rModerator.getRoomModeratorsId() == 0) {
-				em.persist(rModerator);
-			} else {
-				if (!em.contains(rModerator)) {
-					em.merge(rModerator);
-				}
-			}
-
-		} catch (Exception ex2) {
-			log.error("[removeRoomModeratorByUserId] ", ex2);
-		}
-	}
-
-	public void updateRoomModeratorByUserId(Long roomModeratorsId,
-			Boolean isSuperModerator) {
-		try {
-			RoomModerator rModerator = this
-					.getRoomModeratorById(roomModeratorsId);
-
-			if (rModerator == null) {
-				return;
-			}
-
-			rModerator.setIsSuperModerator(isSuperModerator);
-			rModerator.setUpdatetime(new Date());
-
-			if (rModerator.getRoomModeratorsId() == 0) {
-				em.persist(rModerator);
-			} else {
-				if (!em.contains(rModerator)) {
-					em.merge(rModerator);
-				}
-			}
-
-		} catch (Exception ex2) {
-			log.error("[updateRoomModeratorByUserId] ", ex2);
-		}
+	
+	public List<RoomModerator> get(Collection<String> ids) {
+		return em.createNamedQuery("getRoomModeratorsByIds", RoomModerator.class).setParameter("ids", ids).getResultList();
 	}
 
-	public void addRoomModeratorByUserList(
-			List<Map<String, Object>> roomModerators, Long roomId) {
-		try {
-
-			for (Iterator<Map<String, Object>> iter = roomModerators.iterator(); iter
-					.hasNext();) {
-
-				Map<String, Object> roomModeratorObj = iter.next();
-
-				Long userId = Long.parseLong(roomModeratorObj.get("userId")
-						.toString());
-				Boolean isSuperModerator = Boolean
-						.parseBoolean(roomModeratorObj.get("isSuperModerator")
-								.toString());
-
-				this.addRoomModeratorByUserId(
-						userDao.get(userId), isSuperModerator,
-						roomId);
-
-			}
-
-		} catch (Exception ex2) {
-			log.error("[addRoomModeratorByUserList] ", ex2);
-			ex2.printStackTrace();
-		}
+	public List<RoomModerator> getByRoomId(long roomId) {
+		return em.createNamedQuery("getRoomModeratorByRoomId", RoomModerator.class).setParameter("roomId", roomId).getResultList();
 	}
 
-	public void updateRoomModeratorByUserList(
-			List<Map<String, Object>> roomModerators, Long roomId) {
-		try {
-
-			// getLsit of RoomModerators before you add new ones
-			List<RoomModerator> remoteRoomModeratorList = this
-					.getRoomModeratorByRoomId(roomId);
-
-			for (Iterator<Map<String, Object>> iter = roomModerators.iterator(); iter
-					.hasNext();) {
-
-				Map<String, Object> roomModeratorObj = iter.next();
-
-				Long roomModeratorsId = Long.parseLong(roomModeratorObj.get(
-						"roomModeratorsId").toString());
-				Long userId = Long.parseLong(roomModeratorObj.get("userId")
-						.toString());
-				Boolean isSuperModerator = Boolean
-						.parseBoolean(roomModeratorObj.get("isSuperModerator")
-								.toString());
-
-				if (roomModeratorsId == null || roomModeratorsId == 0) {
-					Long newRoomModeratorId = this.addRoomModeratorByUserId(
-							userDao.get(userId),
-							isSuperModerator, roomId);
-
-					roomModeratorObj
-							.put("roomModeratorsId", newRoomModeratorId);
-
-				} else {
-					this.updateRoomModeratorByUserId(roomModeratorsId,
-							isSuperModerator);
-				}
-
-			}
-
-			// Check for items to delete
-			List<RoomModerator> roomModeratorsToDelete = new LinkedList<RoomModerator>();
-
-			if (remoteRoomModeratorList != null) {
-
-				for (RoomModerator roomModerator : remoteRoomModeratorList) {
-
-					boolean found = false;
-
-					for (Iterator<Map<String, Object>> iter = roomModerators
-							.iterator(); iter.hasNext();) {
-						Map<String, Object> roomModeratorObj = iter.next();
-
-						Long roomModeratorsId = Long.parseLong(roomModeratorObj
-								.get("roomModeratorsId").toString());
-
-						if (roomModerator.getRoomModeratorsId() == roomModeratorsId
-								.longValue()) {
-							found = true;
-							break;
-						}
-
-					}
-
-					if (!found) {
-						roomModeratorsToDelete.add(roomModerator);
-					}
-
-				}
-
-			}
-
-			for (RoomModerator rModerator : roomModeratorsToDelete) {
-				System.out.println("Remove Map "
-						+ rModerator.getRoomModeratorsId());
-				this.removeRoomModeratorByUserId(rModerator
-						.getRoomModeratorsId());
-			}
-
-		} catch (Exception ex2) {
-			log.error("[updateRoomModeratorByUserList] ", ex2);
-			ex2.printStackTrace();
+	public RoomModerator update(RoomModerator rm, Long userId) {
+		if (rm.getRoomModeratorsId() == 0) {
+			rm.setStarttime(new Date());
+			em.persist(rm);
+		} else {
+			rm.setUpdatetime(new Date());
+			rm = em.merge(rm);
 		}
+		return rm;
 	}
-
 }

Modified: openmeetings/trunk/singlewebapp/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/server/LdapConfigDao.java
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/server/LdapConfigDao.java?rev=1601073&r1=1601072&r2=1601073&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/server/LdapConfigDao.java (original)
+++ openmeetings/trunk/singlewebapp/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/server/LdapConfigDao.java Sat Jun  7 07:45:55 2014
@@ -18,6 +18,8 @@
  */
 package org.apache.openmeetings.db.dao.server;
 
+import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey;
+
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
@@ -29,7 +31,7 @@ import javax.persistence.PersistenceExce
 import javax.persistence.TypedQuery;
 
 import org.apache.openmeetings.db.dao.IDataProviderDao;
-import org.apache.openmeetings.db.dao.user.AdminUserDao;
+import org.apache.openmeetings.db.dao.user.UserDao;
 import org.apache.openmeetings.db.entity.server.LdapConfig;
 import org.apache.openmeetings.util.DaoHelper;
 import org.apache.openmeetings.util.OpenmeetingsVariables;
@@ -47,15 +49,14 @@ import org.springframework.transaction.a
  */
 @Transactional
 public class LdapConfigDao implements IDataProviderDao<LdapConfig> {
-	private static final Logger log = Red5LoggerFactory.getLogger(
-			LdapConfigDao.class, OpenmeetingsVariables.webAppRootKey);
+	private static final Logger log = Red5LoggerFactory.getLogger(LdapConfigDao.class, webAppRootKey);
 	public final static String[] searchFields = {"name", "configFileName", "domain", "comment"};
 
 	@PersistenceContext
 	private EntityManager em;
 
 	@Autowired
-	private AdminUserDao usersDao;
+	private UserDao usersDao;
 
 	public Long addLdapConfig(String name, Boolean addDomainToUserName,
 			String configFileName, String domain, Long insertedby,

Modified: openmeetings/trunk/singlewebapp/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/server/ServerDao.java
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/server/ServerDao.java?rev=1601073&r1=1601072&r2=1601073&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/server/ServerDao.java (original)
+++ openmeetings/trunk/singlewebapp/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/server/ServerDao.java Sat Jun  7 07:45:55 2014
@@ -18,6 +18,8 @@
  */
 package org.apache.openmeetings.db.dao.server;
 
+import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey;
+
 import java.util.Date;
 import java.util.List;
 
@@ -27,7 +29,7 @@ import javax.persistence.PersistenceCont
 import javax.persistence.TypedQuery;
 
 import org.apache.openmeetings.db.dao.IDataProviderDao;
-import org.apache.openmeetings.db.dao.user.AdminUserDao;
+import org.apache.openmeetings.db.dao.user.UserDao;
 import org.apache.openmeetings.db.entity.server.Server;
 import org.apache.openmeetings.util.DaoHelper;
 import org.apache.openmeetings.util.OpenmeetingsVariables;
@@ -45,15 +47,14 @@ import org.springframework.transaction.a
  */
 @Transactional
 public class ServerDao implements IDataProviderDao<Server> {
-	private static final Logger log = Red5LoggerFactory.getLogger(
-			ServerDao.class, OpenmeetingsVariables.webAppRootKey);
+	private static final Logger log = Red5LoggerFactory.getLogger(ServerDao.class, webAppRootKey);
 	public final static String[] searchFields = { "name", "address", "comment" };
 
 	@PersistenceContext
 	private EntityManager em;
 
 	@Autowired
-	private AdminUserDao usersDao;
+	private UserDao usersDao;
 	
 	/**
 	 * Get a list of all available servers

Modified: openmeetings/trunk/singlewebapp/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/OrganisationUserDao.java
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/OrganisationUserDao.java?rev=1601073&r1=1601072&r2=1601073&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/OrganisationUserDao.java (original)
+++ openmeetings/trunk/singlewebapp/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/OrganisationUserDao.java Sat Jun  7 07:45:55 2014
@@ -18,6 +18,7 @@
  */
 package org.apache.openmeetings.db.dao.user;
 
+import java.util.Date;
 import java.util.List;
 
 import javax.persistence.EntityManager;
@@ -54,7 +55,8 @@ public class OrganisationUserDao impleme
 	}
 	
 	public List<Organisation_Users> get(long orgId, String search, int start, int count, String sort) {
-		TypedQuery<Organisation_Users> q = em.createQuery(DaoHelper.getSearchQuery("Organisation_Users", "ou", search, false, false, sort, searchFields), Organisation_Users.class);
+		TypedQuery<Organisation_Users> q = em.createQuery(DaoHelper.getSearchQuery("Organisation_Users", "ou", null, search, false, false, "ou.organisation.organisation_id = :orgId", sort, searchFields), Organisation_Users.class);
+		q.setParameter("orgId", orgId);
 		q.setFirstResult(start);
 		q.setMaxResults(count);
 		return q.getResultList();
@@ -65,19 +67,22 @@ public class OrganisationUserDao impleme
 		q.setParameter("id", orgId);
 		q.setFirstResult(start);
 		q.setMaxResults(count);
+		return q.getResultList();
+	}
 
-		// This refresh is necessary because after saving the user entity the
-		// user_id is somehow not
-		// filled into the Organisation_Users, this might be fixed by
-		// implementing another
-		// JOIN or mapping strategy
-		List<Organisation_Users> orgUserList = q.getResultList();
-		for (Organisation_Users ou : orgUserList) {
-			em.refresh(ou);
+	public Organisation_Users getByOrganizationAndUser(long orgId, long userId) {
+		try {
+			List<Organisation_Users> list = em.createNamedQuery("isUserInOrganization", Organisation_Users.class)
+					.setParameter("orgId", orgId).setParameter("userId", userId).getResultList();
+			if (list != null && !list.isEmpty()) {
+				return list.get(0);
+			}
+		} catch (Exception e) {
+			//no-op
 		}
-		return orgUserList;
+		return null;
 	}
-
+	
 	public boolean isUserInOrganization(long orgId, long userId) {
 		return em.createNamedQuery("isUserInOrganization", Organisation_Users.class)
 				.setParameter("orgId", orgId).setParameter("userId", userId).getResultList().size() > 0;
@@ -102,14 +107,26 @@ public class OrganisationUserDao impleme
 		return q.getSingleResult();
 	}
 
+	public void update(List<Organisation_Users> list, Long userId) {
+		for (Organisation_Users ou : list) {
+			update(ou, userId);
+		}
+	}
+	
 	public Organisation_Users update(Organisation_Users entity, Long userId) {
-		//if (entity.getOrganisation_users_id())// TODO Auto-generated method stub
+		if (entity.getOrganisation_users_id() == null) {
+			entity.setStarttime(new Date());
+			em.persist(entity);
+		} else {
+			entity.setUpdatetime(new Date());
+			entity = em.merge(entity);
+		}
 		return entity;
 	}
 
 	public void delete(Organisation_Users entity, Long userId) {
 		if (entity.getOrganisation_users_id() != null) {
-			User u = usersDao.get(entity.getUser_id());
+			User u = usersDao.get(entity.getUser().getUser_id());
 			int idx = u.getOrganisation_users().indexOf(entity);
 			//entity has been detached need to re-fetch
 			Organisation_Users ou = u.getOrganisation_users().remove(idx);
@@ -117,8 +134,4 @@ public class OrganisationUserDao impleme
 			usersDao.update(u, userId);
 		}
 	}
-
-	public void add() {
-		
-	}
 }

Copied: openmeetings/trunk/singlewebapp/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/UserDao.java (from r1599879, openmeetings/trunk/singlewebapp/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/AbstractUserDao.java)
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/UserDao.java?p2=openmeetings/trunk/singlewebapp/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/UserDao.java&p1=openmeetings/trunk/singlewebapp/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/AbstractUserDao.java&r1=1599879&r2=1601073&rev=1601073&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/AbstractUserDao.java (original)
+++ openmeetings/trunk/singlewebapp/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/UserDao.java Sat Jun  7 07:45:55 2014
@@ -23,8 +23,11 @@ import static org.apache.openmeetings.ut
 import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey;
 
 import java.security.NoSuchAlgorithmException;
+import java.util.Collection;
 import java.util.Date;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.UUID;
 
 import javax.persistence.EntityManager;
@@ -33,8 +36,10 @@ import javax.persistence.PersistenceCont
 import javax.persistence.TypedQuery;
 
 import org.apache.commons.lang3.StringUtils;
+import org.apache.openjpa.persistence.OpenJPAEntityManager;
 import org.apache.openjpa.persistence.OpenJPAPersistence;
 import org.apache.openjpa.persistence.OpenJPAQuery;
+import org.apache.openmeetings.db.dao.IDataProviderDao;
 import org.apache.openmeetings.db.dao.basic.ConfigurationDao;
 import org.apache.openmeetings.db.entity.user.Address;
 import org.apache.openmeetings.db.entity.user.Organisation_Users;
@@ -43,6 +48,7 @@ import org.apache.openmeetings.db.entity
 import org.apache.openmeetings.db.util.TimezoneUtil;
 import org.apache.openmeetings.util.DaoHelper;
 import org.apache.openmeetings.util.crypt.ManageCryptStyle;
+import org.apache.wicket.util.string.Strings;
 import org.red5.logging.Red5LoggerFactory;
 import org.slf4j.Logger;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -55,8 +61,8 @@ import org.springframework.transaction.a
  * 
  */
 @Transactional
-public class AbstractUserDao  {
-	private static final Logger log = Red5LoggerFactory.getLogger(AbstractUserDao.class, webAppRootKey);
+public class UserDao implements IDataProviderDao<User> {
+	private static final Logger log = Red5LoggerFactory.getLogger(UserDao.class, webAppRootKey);
 
 	public final static String[] searchFields = {"lastname", "firstname", "login", "adresses.email", "adresses.town"};
 
@@ -106,22 +112,41 @@ public class AbstractUserDao  {
 		return q.getResultList();
 	}
 	
-	private String getAdditionalWhere(boolean excludeContacts) {
-		return excludeContacts ? "(u.type <> :contact OR (u.type = :contact AND u.ownerId = :ownerId))" : null;
+	private String getAdditionalJoin(boolean filterContacts) {
+		return filterContacts ? "LEFT JOIN u.organisation_users ou" : null;
 	}
 	
-	private void setAdditionalParams(TypedQuery<?> q, boolean excludeContacts, long currentUserId) {
+	private String getAdditionalWhere(boolean excludeContacts, Map<String, Object> params) {
 		if (excludeContacts) {
-			q.setParameter("ownerId", currentUserId);
-			q.setParameter("contact", Type.contact);
+			params.put("contact", Type.contact);
+			return "u.type <> :contact";
+		}
+		return null;
+	}
+	
+	private String getAdditionalWhere(boolean filterContacts, Long ownerId, Map<String, Object> params) {
+		if (filterContacts) {
+			params.put("ownerId", ownerId);
+			params.put("contact", Type.contact);
+			return "((u.type <> :contact AND ou.organisation.organisation_id IN (SELECT ou.organisation.organisation_id FROM Organisation_Users ou WHERE ou.user.user_id = :ownerId)) "
+				+ "OR (u.type = :contact AND u.ownerId = :ownerId))";
+		}
+		return null;
+	}
+	
+	private void setAdditionalParams(TypedQuery<?> q, Map<String, Object> params) {
+		for (String key : params.keySet()) {
+			q.setParameter(key, params.get(key));
 		}
 	}
 
-	public List<User> get(String search, int start, int count, String sort, boolean isAdmin, long currentUserId) {
-		TypedQuery<User> q = em.createQuery(DaoHelper.getSearchQuery("User", "u", search, true, false, getAdditionalWhere(isAdmin), sort, searchFields), User.class);
+	public List<User> get(String search, int start, int count, String sort, boolean filterContacts, long currentUserId) {
+		Map<String, Object> params = new HashMap<String, Object>();
+		TypedQuery<User> q = em.createQuery(DaoHelper.getSearchQuery("User", "u", getAdditionalJoin(filterContacts), search, true, true, false
+				, getAdditionalWhere(filterContacts, currentUserId, params), sort, searchFields), User.class);
 		q.setFirstResult(start);
 		q.setMaxResults(count);
-		setAdditionalParams(q, isAdmin, currentUserId);
+		setAdditionalParams(q, params);
 		return q.getResultList();
 	}
 	
@@ -131,22 +156,47 @@ public class AbstractUserDao  {
 		return q.getSingleResult();
 	}
 
-	public long count(String search, boolean excludeContacts, long currentUserId) {
-		TypedQuery<Long> q = em.createQuery(DaoHelper.getSearchQuery("User", "u", search, true, true, getAdditionalWhere(excludeContacts), null, searchFields), Long.class);
-		setAdditionalParams(q, excludeContacts, currentUserId);
+	public long count(String search) {
+		return count(search, true, -1);
+	}
+	
+	public long count(String search, long currentUserId) {
+		return count(search, false, currentUserId);
+	}
+	
+	public long count(String search, boolean filterContacts, long currentUserId) {
+		Map<String, Object> params = new HashMap<String, Object>();
+		TypedQuery<Long> q = em.createQuery(DaoHelper.getSearchQuery("User", "u", getAdditionalJoin(filterContacts), search, true, true, true
+				, getAdditionalWhere(filterContacts, currentUserId, params), null, searchFields), Long.class);
+		setAdditionalParams(q, params);
 		return q.getSingleResult();
 	}
 	
-	public List<User> get(String search, boolean excludeContacts, long currentUserId) {
-		TypedQuery<User> q = em.createQuery(DaoHelper.getSearchQuery("User", "u", search, true, false, getAdditionalWhere(excludeContacts), null, searchFields), User.class);
-		if (excludeContacts) {
-			q.setParameter("ownerId", currentUserId);
-			q.setParameter("contact", Type.contact);
-		}
+	//This is AdminDao method
+	public List<User> get(String search, boolean excludeContacts, int first, int count) {
+		Map<String, Object> params = new HashMap<String, Object>();
+		TypedQuery<User> q = em.createQuery(DaoHelper.getSearchQuery("User", "u", null, search, true, true, false
+				, getAdditionalWhere(excludeContacts, params), null, searchFields), User.class);
+		setAdditionalParams(q, params);
+		q.setFirstResult(first);
+		q.setMaxResults(count);
+		return q.getResultList();
+	}
+
+	public List<User> get(String search, boolean filterContacts, long currentUserId) {
+		Map<String, Object> params = new HashMap<String, Object>();
+		TypedQuery<User> q = em.createQuery(DaoHelper.getSearchQuery("User", "u", getAdditionalJoin(filterContacts), search, true, true, false
+				, getAdditionalWhere(filterContacts, currentUserId, params), null, searchFields), User.class);
+		setAdditionalParams(q, params);
 		return q.getResultList();
 	}
 
 	public User update(User u, Long userId) {
+		if (u.getOrganisation_users() != null) {
+			for (Organisation_Users ou : u.getOrganisation_users()) {
+				ou.setUser(u);
+			}
+		}
 		if (u.getUser_id() == null) {
 			u.setStarttime(new Date());
 			em.persist(u);
@@ -181,28 +231,24 @@ public class AbstractUserDao  {
 	}
 	
 	private User get(long user_id, boolean force) {
+		User u = null;
 		if (user_id > 0) {
-			TypedQuery<User> query = em.createNamedQuery("getUserById",
-					User.class);
-			query.setParameter("user_id", user_id);
-
-			User users = null;
-			try {
-				if (force) {
-					@SuppressWarnings("unchecked")
-					OpenJPAQuery<User> kq = OpenJPAPersistence.cast(query);
-					kq.getFetchPlan().addFetchGroup("backupexport");
-					users = kq.getSingleResult();
-				} else {
-					users = query.getSingleResult();
-				}
-			} catch (NoResultException ex) {
+			OpenJPAEntityManager oem = OpenJPAPersistence.cast(em);
+			boolean qrce = oem.getFetchPlan().getQueryResultCacheEnabled();
+			oem.getFetchPlan().setQueryResultCacheEnabled(false);
+			TypedQuery<User> q = oem.createNamedQuery("getUserById", User.class).setParameter("id", user_id);
+			@SuppressWarnings("unchecked")
+			OpenJPAQuery<User> kq = OpenJPAPersistence.cast(q);
+			kq.getFetchPlan().addFetchGroup("orgUsers");
+			if (force) {
+				kq.getFetchPlan().addFetchGroup("backupexport");
 			}
-			return users;
+			u = kq.getSingleResult();
+			oem.getFetchPlan().setQueryResultCacheEnabled(qrce);
 		} else {
-			log.info("[getUser] " + "Info: No USER_ID given");
+			log.info("[get] " + "Info: No USER_ID given");
 		}
-		return null;
+		return u;
 	}
 
 	public Long deleteUserID(long userId) {
@@ -236,22 +282,21 @@ public class AbstractUserDao  {
 		return null;
 	}
 
+	public List<User> get(Collection<String> ids) {
+		return em.createNamedQuery("getUsersByIds", User.class).setParameter("ids", ids).getResultList();
+	}
+
 	public List<User> getAllUsers() {
-		try {
-			TypedQuery<User> q = em.createNamedQuery("getNondeletedUsers", User.class);
-			return q.getResultList();
-		} catch (Exception ex2) {
-			log.error("[getAllUsers] ", ex2);
-		}
-		return null;
+		TypedQuery<User> q = em.createNamedQuery("getNondeletedUsers", User.class);
+		return q.getResultList();
 	}
 
-	public List<User> getAllUsersDeleted() {
+	public List<User> getAllBackupUsers() {
 		try {
 			TypedQuery<User> q = em.createNamedQuery("getAllUsers", User.class);
 			@SuppressWarnings("unchecked")
 			OpenJPAQuery<User> kq = OpenJPAPersistence.cast(q);
-			kq.getFetchPlan().addFetchGroup("backupexport");
+			kq.getFetchPlan().addFetchGroups("backupexport", "orgUsers");
 			return kq.getResultList();
 		} catch (Exception ex2) {
 			log.error("[getAllUsersDeleted] ", ex2);
@@ -295,12 +340,12 @@ public class AbstractUserDao  {
 		return count == 0;
 	}
 	
-	public User getUserByLogin(String login) {
+	public User getUserByName(String login, Type type) {
 		User us = null;
 		try {
 			us = em.createNamedQuery("getUserByLogin", User.class)
 					.setParameter("login", login)
-					.setParameter("type", User.Type.user)
+					.setParameter("type", type)
 					.getSingleResult();
 		} catch (NoResultException ex) {
 		}
@@ -385,6 +430,10 @@ public class AbstractUserDao  {
 		return getContact(email, firstName, lastName, null, null, get(ownerId));
 	}
 	
+	public User getContact(String email, String firstName, String lastName, Long langId, String tzId, long ownerId) {
+		return getContact(email, firstName, lastName, langId, tzId, get(ownerId));
+	}
+	
 	public User getContact(String email, String firstName, String lastName, Long langId, String tzId, User owner) {
 		User to = null;
 		try {
@@ -426,64 +475,49 @@ public class AbstractUserDao  {
 		return u;
 	}
 
-	private StringBuilder getUserProfileQuery(boolean count, String text, String offers, String search) {
+	private <T> TypedQuery<T> getUserProfileQuery(Class<T> clazz, long userId, String text, String offers, String search, String orderBy, boolean asc) {
+		Map<String, Object> params = new HashMap<String, Object>();
+		boolean filterContacts = true;
+		boolean count = clazz.isAssignableFrom(Long.class);
+		
 		StringBuilder sb = new StringBuilder("SELECT ");
 		sb.append(count ? "COUNT(" : "").append("u").append(count ? ") " : " ")
-			.append("FROM User u WHERE u.deleted = false AND ")
-			.append(getAdditionalWhere(true));
-		if (offers != null && offers.length() != 0) {
+			.append("FROM User u ").append(getAdditionalJoin(filterContacts)).append(" WHERE u.deleted = false AND ")
+			.append(getAdditionalWhere(filterContacts, userId, params));
+		if (!Strings.isEmpty(offers)) {
 			sb.append(" AND (LOWER(u.userOffers) LIKE :userOffers) ");
+			params.put("userOffers", getStringParam(offers));
 		}
-		if (search != null && search.length() != 0) {
+		if (!Strings.isEmpty(search)) {
 			sb.append(" AND (LOWER(u.userSearchs) LIKE :userSearchs) ");
+			params.put("userSearchs", getStringParam(search));
 		}
-		if (text != null && text.length() != 0) {
+		if (!Strings.isEmpty(text)) {
 			sb.append(" AND (LOWER(u.login) LIKE :search ")
 				.append("OR LOWER(u.firstname) LIKE :search ")
 				.append("OR LOWER(u.lastname) LIKE :search ")
 				.append("OR LOWER(u.adresses.email) LIKE :search ")
 				.append("OR LOWER(u.adresses.town) LIKE :search " + ") ");
+			params.put("search", getStringParam(text));
+		}
+		if (!count && !Strings.isEmpty(orderBy)) {
+			sb.append(" ORDER BY ").append(orderBy).append(asc ? " ASC" : " DESC");
 		}
-		return sb;
+		TypedQuery<T> query = em.createQuery(sb.toString(), clazz);
+		setAdditionalParams(query, params);
+		return query;
+	}
+	
+	private String getStringParam(String param) {
+		return param == null ? "%" : "%" + StringUtils.lowerCase(param) + "%";
 	}
 	
 	public List<User> searchUserProfile(long userId, String text, String offers, String search, String orderBy, int start, int max, boolean asc) {
-		StringBuilder sb = getUserProfileQuery(false, text, offers, search);
-		sb.append(" ORDER BY ").append(orderBy).append(asc ? " ASC" : " DESC");
-
-		log.debug("hql :: " + sb.toString());
-		TypedQuery<User> query = em.createQuery(sb.toString(), User.class);
-		setAdditionalParams(query, false, userId);
-
-		if (text != null && text.length() != 0) {
-			query.setParameter("search", StringUtils.lowerCase("%" + text + "%"));
-		}
-		if (offers != null && offers.length() != 0) {
-			query.setParameter("userOffers", StringUtils.lowerCase("%" + offers + "%"));
-		}
-		if (search != null && search.length() != 0) {
-			query.setParameter("userSearchs", StringUtils.lowerCase("%" + search + "%"));
-		}
-		return query.setFirstResult(start).setMaxResults(max).getResultList();
+		return getUserProfileQuery(User.class, userId, text, offers, search, orderBy, asc).setFirstResult(start).setMaxResults(max).getResultList();
 	}
 
 	public Long searchCountUserProfile(long userId, String text, String offers, String search) {
-		StringBuilder sb = getUserProfileQuery(true, text, offers, search);
-		
-		log.debug("hql :: " + sb.toString());
-		TypedQuery<Long> query = em.createQuery(sb.toString(), Long.class);
-		setAdditionalParams(query, false, userId);
-		
-		if (text != null && text.length() != 0) {
-			query.setParameter("search", StringUtils.lowerCase("%" + text + "%"));
-		}
-		if (offers != null && offers.length() != 0) {
-			query.setParameter("userOffers", StringUtils.lowerCase("%" + offers + "%"));
-		}
-		if (search != null && search.length() != 0) {
-			query.setParameter("userSearchs", StringUtils.lowerCase("%" + search + "%"));
-		}
-		return query.getSingleResult();
+		return getUserProfileQuery(Long.class, userId, text, offers, search, null, false).getSingleResult();
 	}
 
 	public User getExternalUser(String extId, String extType) {
@@ -492,4 +526,8 @@ public class AbstractUserDao  {
 				.setParameter("externalType", extType)
 				.getSingleResult();
 	}
+
+	public List<User> get(String search, int start, int count, String order) {
+		return get(search, start, count, order, false, -1);
+	}
 }

Modified: openmeetings/trunk/singlewebapp/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/room/Room.java
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/room/Room.java?rev=1601073&r1=1601072&r2=1601073&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/room/Room.java (original)
+++ openmeetings/trunk/singlewebapp/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/room/Room.java Sat Jun  7 07:45:55 2014
@@ -72,7 +72,7 @@ import org.simpleframework.xml.Root;
 			+ "where c.externalRoomId = :externalRoomId AND c.externalRoomType = :externalRoomType "
 			+ "AND rt.roomtypes_id = :roomtypes_id AND c.deleted <> :deleted"),
 	@NamedQuery(name = "getPublicRoomsOrdered", query = "SELECT r from Room r WHERE r.ispublic= true AND r.deleted= false AND r.appointment = false ORDER BY r.name ASC"),
-	@NamedQuery(name = "getRoomById", query = "SELECT r FROM Room r WHERE r.deleted = false AND r.rooms_id = :id"),
+	@NamedQuery(name = "getRoomById", query = "SELECT r FROM Room r LEFT JOIN FETCH r.moderators WHERE r.deleted = false AND r.rooms_id = :id"),
 	@NamedQuery(name = "getSipRoomIdsByIds", query = "SELECT r.rooms_id FROM Room r WHERE r.deleted = false AND r.sipEnabled = true AND r.rooms_id IN :ids"),
 	@NamedQuery(name = "countRooms", query = "SELECT COUNT(r) FROM Room r WHERE r.deleted = false"),
 	@NamedQuery(name = "getBackupRooms", query = "SELECT r FROM Room r LEFT JOIN FETCH r.moderators ORDER BY r.rooms_id"),
@@ -241,7 +241,7 @@ public class Room implements Serializabl
 	@JoinColumn(name = "roomId")
 	@ForeignKey(enabled = true)
 	@ElementList(name = "room_moderators", required=false)
-	private List<RoomModerator> moderators;
+	private List<RoomModerator> moderators = new ArrayList<RoomModerator>();
 
 	@Column(name = "sip_enabled")
 	@Element(data = true, required = false)
@@ -525,7 +525,9 @@ public class Room implements Serializabl
 	}
 
 	public void setModerators(List<RoomModerator> moderators) {
-		this.moderators = moderators;
+		if (moderators != null) {
+			this.moderators = moderators;
+		}
 	}
 
 	public Boolean getChatModerated() {

Modified: openmeetings/trunk/singlewebapp/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/room/RoomModerator.java
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/room/RoomModerator.java?rev=1601073&r1=1601072&r2=1601073&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/room/RoomModerator.java (original)
+++ openmeetings/trunk/singlewebapp/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/room/RoomModerator.java Sat Jun  7 07:45:55 2014
@@ -40,10 +40,9 @@ import org.simpleframework.xml.Root;
 
 @Entity
 @NamedQueries({
-	@NamedQuery(name = "getRoomModeratorById", query = "select c from RoomModerator as c " +
-			"where c.roomModeratorsId = :roomModeratorsId"),
-	@NamedQuery(name = "getRoomModeratorByRoomId", query = "select c from RoomModerator as c "
-			+ "where c.roomId = :roomId AND c.deleted <> :deleted"),
+	@NamedQuery(name = "getRoomModeratorById", query = "select c from RoomModerator as c where c.roomModeratorsId = :roomModeratorsId"),
+	@NamedQuery(name = "getRoomModeratorsByIds", query = "select c from RoomModerator as c where c.roomModeratorsId IN :ids"),
+	@NamedQuery(name = "getRoomModeratorByRoomId", query = "select c from RoomModerator as c where c.roomId = :roomId AND c.deleted = false"),
 	@NamedQuery(name = "getRoomModeratorByUserAndRoomId", query = "select c from RoomModerator as c "
 			+ "where c.roomId = :roomId "
 			+ "AND c.deleted <> :deleted "

Modified: openmeetings/trunk/singlewebapp/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/user/Organisation_Users.java
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/user/Organisation_Users.java?rev=1601073&r1=1601072&r2=1601073&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/user/Organisation_Users.java (original)
+++ openmeetings/trunk/singlewebapp/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/user/Organisation_Users.java Sat Jun  7 07:45:55 2014
@@ -40,9 +40,7 @@ import org.simpleframework.xml.Root;
 
 @Entity
 @NamedQueries({
-	@NamedQuery(name="getOrganisation_UserByUserAndOrganisation",
-		query="SELECT ou FROM User u, IN(u.organisation_users) ou WHERE u.deleted = false AND u.user_id = :user_id AND ou.organisation.organisation_id = :organisation_id")
-	, @NamedQuery(name="deleteUsersFromOrganisation", query="DELETE FROM Organisation_Users c WHERE c.organisation.organisation_id = :id")
+	@NamedQuery(name="deleteUsersFromOrganisation", query="DELETE FROM Organisation_Users c WHERE c.organisation.organisation_id = :id")
 	, @NamedQuery(name="countOrganisationUsers", query="SELECT COUNT(c) FROM Organisation_Users c WHERE c.organisation.organisation_id = :id")
 	, @NamedQuery(name="getOrganisationUsersById", query="SELECT c FROM Organisation_Users c WHERE c.organisation_users_id = :id")
 	, @NamedQuery(name="getOrganisationUsersByOrgId", query="SELECT c FROM Organisation_Users c WHERE c.organisation.organisation_id = :id")
@@ -63,10 +61,6 @@ public class Organisation_Users implemen
 	@Element(name="organisation_id", required=false)
 	private Organisation organisation;
 
-	// FIXME: Does not get updated if a new relation is stored in the user
-	@Column(name = "user_id")
-	private Long user_id;
-
 	@ManyToOne(fetch = FetchType.EAGER)
 	@JoinColumn(name = "user_id", insertable = true, updatable = true)
 	@ForeignKey(enabled = true)
@@ -109,14 +103,6 @@ public class Organisation_Users implemen
 		this.organisation_users_id = organisation_users_id;
 	}
 
-	public Long getUser_id() {
-		return user_id;
-	}
-
-	public void setUser_id(Long user_id) {
-		this.user_id = user_id;
-	}
-
 	public Date getStarttime() {
 		return starttime;
 	}
@@ -149,45 +135,36 @@ public class Organisation_Users implemen
 		this.isModerator = isModerator;
 	}
 
+	public User getUser() {
+		return user;
+	}
+
+	public void setUser(User user) {
+		this.user = user;
+	}
+
 	@Override
 	public int hashCode() {
 		final int prime = 31;
 		int result = 1;
-		result = prime
-				* result
-				+ ((organisation_users_id == null) ? 0 : organisation_users_id
-						.hashCode());
+		result = prime * result + ((organisation_users_id == null) ? 0 : organisation_users_id.hashCode());
 		return result;
 	}
 
 	@Override
 	public boolean equals(Object obj) {
-		if (this == obj) {
+		if (this == obj)
 			return true;
-		}
-		if (obj == null) {
+		if (obj == null)
+			return false;
+		if (getClass() != obj.getClass())
 			return false;
-		}
-		if (obj instanceof Organisation_Users) {
-			Organisation_Users other = (Organisation_Users) obj;
-			if (organisation_users_id == null) {
-				if (other.organisation_users_id != null) {
-					return false;
-				}
-			} else if (!organisation_users_id.equals(other.organisation_users_id)) {
+		Organisation_Users other = (Organisation_Users) obj;
+		if (organisation_users_id == null) {
+			if (other.organisation_users_id != null)
 				return false;
-			}
-		} else {
+		} else if (!organisation_users_id.equals(other.organisation_users_id))
 			return false;
-		}
 		return true;
 	}
-
-	public User getUser() {
-		return user;
-	}
-
-	public void setUser(User user) {
-		this.user = user;
-	}
 }

Modified: openmeetings/trunk/singlewebapp/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/user/User.java
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/user/User.java?rev=1601073&r1=1601072&r2=1601073&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/user/User.java (original)
+++ openmeetings/trunk/singlewebapp/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/user/User.java Sat Jun  7 07:45:55 2014
@@ -37,7 +37,6 @@ import javax.persistence.GeneratedValue;
 import javax.persistence.GenerationType;
 import javax.persistence.Id;
 import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
 import javax.persistence.NamedQueries;
 import javax.persistence.NamedQuery;
 import javax.persistence.OneToMany;
@@ -71,7 +70,8 @@ import org.simpleframework.xml.Root;
 @Entity
 @FetchGroups({ @FetchGroup(name = "backupexport", attributes = { @FetchAttribute(name = "password") }) })
 @NamedQueries({
-	@NamedQuery(name = "getUserById", query = "select c from User c where c.user_id = :user_id"),
+	@NamedQuery(name = "getUserById", query = "SELECT u FROM User u LEFT JOIN FETCH u.organisation_users WHERE u.user_id = :id"),
+	@NamedQuery(name = "getUsersByIds", query = "select c from User c where c.user_id IN :ids"),
 	@NamedQuery(name = "checkUserLogin", query = "SELECT COUNT(u) FROM User u WHERE ((:id > 0 AND u.user_id <> :id) OR (:id = 0)) "
 			+ "AND u.login = :login AND u.deleted = false"),
 	@NamedQuery(name = "checkUserEmail", query = "SELECT COUNT(u) FROM User u WHERE ((:id > 0 AND u.user_id <> :id) OR (:id = 0)) "
@@ -103,7 +103,8 @@ public class User implements Serializabl
 	
 	public enum Type {
 		user
-		, ldap //should we add it???
+		, ldap
+		, oauth
 		, external
 		, contact
 	}
@@ -189,7 +190,7 @@ public class User implements Serializabl
 	@Element(data = true, required = false)
 	private String activatehash;
 
-	@ManyToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
+	@OneToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
 	@JoinColumn(name = "adresses_id", insertable = true, updatable = true)
 	@ForeignKey(enabled = true)
 	@Element(name = "address", required = false)
@@ -198,7 +199,7 @@ public class User implements Serializabl
 	@Transient
 	private Userlevel userlevel;
 
-	@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
+	@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
 	@JoinColumn(name = "user_id", insertable = true, updatable = true)
 	@ElementList(name = "organisations", required = false)
 	@ElementDependent
@@ -280,18 +281,18 @@ public class User implements Serializabl
 	public void setAdresses(String street, String zip, String town,
 			State state, String additionalname, String comment, String fax,
 			String phone, String email) {
-		if (this.adresses == null) {
-			this.adresses = new Address();
+		if (adresses == null) {
+			adresses = new Address();
 		}
-		this.adresses.setStreet(street);
-		this.adresses.setZip(zip);
-		this.adresses.setTown(town);
-		this.adresses.setStates(state);
-		this.adresses.setAdditionalname(additionalname);
-		this.adresses.setComment(comment);
-		this.adresses.setFax(fax);
-		this.adresses.setPhone(phone);
-		this.adresses.setEmail(email);
+		adresses.setStreet(street);
+		adresses.setZip(zip);
+		adresses.setTown(town);
+		adresses.setStates(state);
+		adresses.setAdditionalname(additionalname);
+		adresses.setComment(comment);
+		adresses.setFax(fax);
+		adresses.setPhone(phone);
+		adresses.setEmail(email);
 	}
 
 	public Date getAge() {
@@ -471,8 +472,7 @@ public class User implements Serializabl
 		return organisation_users;
 	}
 
-	public void setOrganisation_users(
-			List<Organisation_Users> organisation_users) {
+	public void setOrganisation_users(List<Organisation_Users> organisation_users) {
 		if (organisation_users != null) {
 			this.organisation_users = organisation_users;
 		}

Modified: openmeetings/trunk/singlewebapp/openmeetings-install/src/main/java/org/apache/openmeetings/backup/BackupExport.java
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/openmeetings-install/src/main/java/org/apache/openmeetings/backup/BackupExport.java?rev=1601073&r1=1601072&r2=1601073&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/openmeetings-install/src/main/java/org/apache/openmeetings/backup/BackupExport.java (original)
+++ openmeetings/trunk/singlewebapp/openmeetings-install/src/main/java/org/apache/openmeetings/backup/BackupExport.java Sat Jun  7 07:45:55 2014
@@ -50,11 +50,11 @@ import org.apache.openmeetings.db.dao.se
 import org.apache.openmeetings.db.dao.server.OAuth2Dao;
 import org.apache.openmeetings.db.dao.server.ServerDao;
 import org.apache.openmeetings.db.dao.server.SessiondataDao;
-import org.apache.openmeetings.db.dao.user.AdminUserDao;
 import org.apache.openmeetings.db.dao.user.OrganisationDao;
 import org.apache.openmeetings.db.dao.user.PrivateMessageFolderDao;
 import org.apache.openmeetings.db.dao.user.PrivateMessagesDao;
 import org.apache.openmeetings.db.dao.user.UserContactsDao;
+import org.apache.openmeetings.db.dao.user.UserDao;
 import org.apache.openmeetings.db.entity.basic.ChatMessage;
 import org.apache.openmeetings.db.entity.basic.Configuration;
 import org.apache.openmeetings.db.entity.calendar.Appointment;
@@ -108,7 +108,7 @@ public class BackupExport {
 	@Autowired
 	private FlvRecordingDao flvRecordingDao;
 	@Autowired
-	private AdminUserDao usersDao;
+	private UserDao usersDao;
 	@Autowired
 	private MeetingMemberDao meetingMemberDao;
 	@Autowired
@@ -153,7 +153,7 @@ public class BackupExport {
 		/*
 		 * ##################### Backup Users
 		 */
-		exportUsers(backup_dir, usersDao.getAllUsersDeleted());
+		exportUsers(backup_dir, usersDao.getAllBackupUsers());
 
 		/*
 		 * ##################### Backup Room

Modified: openmeetings/trunk/singlewebapp/openmeetings-install/src/main/java/org/apache/openmeetings/backup/BackupImport.java
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/openmeetings-install/src/main/java/org/apache/openmeetings/backup/BackupImport.java?rev=1601073&r1=1601072&r2=1601073&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/openmeetings-install/src/main/java/org/apache/openmeetings/backup/BackupImport.java (original)
+++ openmeetings/trunk/singlewebapp/openmeetings-install/src/main/java/org/apache/openmeetings/backup/BackupImport.java Sat Jun  7 07:45:55 2014
@@ -70,12 +70,12 @@ import org.apache.openmeetings.db.dao.ro
 import org.apache.openmeetings.db.dao.server.LdapConfigDao;
 import org.apache.openmeetings.db.dao.server.OAuth2Dao;
 import org.apache.openmeetings.db.dao.server.ServerDao;
-import org.apache.openmeetings.db.dao.user.AdminUserDao;
 import org.apache.openmeetings.db.dao.user.OrganisationDao;
 import org.apache.openmeetings.db.dao.user.PrivateMessageFolderDao;
 import org.apache.openmeetings.db.dao.user.PrivateMessagesDao;
 import org.apache.openmeetings.db.dao.user.StateDao;
 import org.apache.openmeetings.db.dao.user.UserContactsDao;
+import org.apache.openmeetings.db.dao.user.UserDao;
 import org.apache.openmeetings.db.entity.basic.ChatMessage;
 import org.apache.openmeetings.db.entity.basic.Configuration;
 import org.apache.openmeetings.db.entity.calendar.Appointment;
@@ -139,7 +139,7 @@ public class BackupImport {
 	@Autowired
 	private AppointmentReminderTypDao appointmentReminderTypDaoImpl;
 	@Autowired
-	private AdminUserDao usersDao;
+	private UserDao usersDao;
 	@Autowired
 	private FlvRecordingDao flvRecordingDao;
 	@Autowired

Modified: openmeetings/trunk/singlewebapp/openmeetings-install/src/main/java/org/apache/openmeetings/backup/UserConverter.java
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/openmeetings-install/src/main/java/org/apache/openmeetings/backup/UserConverter.java?rev=1601073&r1=1601072&r2=1601073&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/openmeetings-install/src/main/java/org/apache/openmeetings/backup/UserConverter.java (original)
+++ openmeetings/trunk/singlewebapp/openmeetings-install/src/main/java/org/apache/openmeetings/backup/UserConverter.java Sat Jun  7 07:45:55 2014
@@ -20,20 +20,20 @@ package org.apache.openmeetings.backup;
 
 import java.util.Map;
 
-import org.apache.openmeetings.db.dao.user.AdminUserDao;
+import org.apache.openmeetings.db.dao.user.UserDao;
 import org.apache.openmeetings.db.entity.user.User;
 import org.simpleframework.xml.stream.InputNode;
 import org.simpleframework.xml.stream.OutputNode;
 
 public class UserConverter extends OmConverter<User> {
-	private AdminUserDao userDao;
+	private UserDao userDao;
 	private Map<Long, Long> idMap;
 	
 	public UserConverter() {
 		//default constructor is for export
 	}
 	
-	public UserConverter(AdminUserDao userDao, Map<Long, Long> idMap) {
+	public UserConverter(UserDao userDao, Map<Long, Long> idMap) {
 		this.userDao = userDao;
 		this.idMap = idMap;
 	}

Modified: openmeetings/trunk/singlewebapp/openmeetings-install/src/main/java/org/apache/openmeetings/cli/Admin.java
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/openmeetings-install/src/main/java/org/apache/openmeetings/cli/Admin.java?rev=1601073&r1=1601072&r2=1601073&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/openmeetings-install/src/main/java/org/apache/openmeetings/cli/Admin.java (original)
+++ openmeetings/trunk/singlewebapp/openmeetings-install/src/main/java/org/apache/openmeetings/cli/Admin.java Sat Jun  7 07:45:55 2014
@@ -52,7 +52,7 @@ import org.apache.openmeetings.backup.Ba
 import org.apache.openmeetings.db.dao.basic.ConfigurationDao;
 import org.apache.openmeetings.db.dao.file.FileExplorerItemDao;
 import org.apache.openmeetings.db.dao.record.FlvRecordingDao;
-import org.apache.openmeetings.db.dao.user.AdminUserDao;
+import org.apache.openmeetings.db.dao.user.UserDao;
 import org.apache.openmeetings.db.entity.file.FileExplorerItem;
 import org.apache.openmeetings.db.entity.record.FlvRecording;
 import org.apache.openmeetings.db.entity.user.User;
@@ -349,7 +349,7 @@ public class Admin {
 						long invalid = 0;
 						long deleted = 0;
 						ClassPathXmlApplicationContext ctx = getApplicationContext(ctxName);
-						AdminUserDao udao = ctx.getBean(AdminUserDao.class);
+						UserDao udao = ctx.getBean(UserDao.class);
 						for (File profile : profiles.listFiles()) {
 							long pSize = OmFileHelper.getSize(profile);
 							long userId = getUserIdByProfile(profile.getName());
@@ -369,7 +369,7 @@ public class Admin {
 							}
 						}
 						long missing = 0;
-						for (User u : udao.getAllUsersDeleted()) {
+						for (User u : udao.getAllBackupUsers()) {
 							if (!u.getDeleted() && u.getPictureuri() != null && !new File(OmFileHelper.getUploadProfilesUserDir(u.getUser_id()), u.getPictureuri()).exists()) {
 								missing++;
 							}

Modified: openmeetings/trunk/singlewebapp/openmeetings-install/src/main/java/org/apache/openmeetings/installation/ImportInitvalues.java
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/openmeetings-install/src/main/java/org/apache/openmeetings/installation/ImportInitvalues.java?rev=1601073&r1=1601072&r2=1601073&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/openmeetings-install/src/main/java/org/apache/openmeetings/installation/ImportInitvalues.java (original)
+++ openmeetings/trunk/singlewebapp/openmeetings-install/src/main/java/org/apache/openmeetings/installation/ImportInitvalues.java Sat Jun  7 07:45:55 2014
@@ -60,11 +60,11 @@ import org.apache.openmeetings.db.dao.ro
 import org.apache.openmeetings.db.dao.room.RoomTypeDao;
 import org.apache.openmeetings.db.dao.room.SipDao;
 import org.apache.openmeetings.db.dao.server.OAuth2Dao;
-import org.apache.openmeetings.db.dao.user.AdminUserDao;
 import org.apache.openmeetings.db.dao.user.IUserManager;
 import org.apache.openmeetings.db.dao.user.OrganisationDao;
 import org.apache.openmeetings.db.dao.user.SalutationDao;
 import org.apache.openmeetings.db.dao.user.StateDao;
+import org.apache.openmeetings.db.dao.user.UserDao;
 import org.apache.openmeetings.db.dao.user.UserLevelDao;
 import org.apache.openmeetings.db.entity.label.FieldLanguage;
 import org.apache.openmeetings.db.entity.label.Fieldlanguagesvalues;
@@ -89,7 +89,7 @@ public class ImportInitvalues {
 	@Autowired
 	private ConfigurationDao configurationDao;
 	@Autowired
-	private AdminUserDao usersDao;
+	private UserDao usersDao;
 	@Autowired
 	private FieldLanguageDao fieldLanguageDaoImpl;
 	@Autowired

Modified: openmeetings/trunk/singlewebapp/openmeetings-service/src/main/java/org/apache/openmeetings/service/user/UserManager.java
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/openmeetings-service/src/main/java/org/apache/openmeetings/service/user/UserManager.java?rev=1601073&r1=1601072&r2=1601073&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/openmeetings-service/src/main/java/org/apache/openmeetings/service/user/UserManager.java (original)
+++ openmeetings/trunk/singlewebapp/openmeetings-service/src/main/java/org/apache/openmeetings/service/user/UserManager.java Sat Jun  7 07:45:55 2014
@@ -40,16 +40,17 @@ import javax.persistence.criteria.Predic
 import javax.persistence.criteria.Root;
 
 import org.apache.openmeetings.core.data.basic.FieldManager;
-import org.apache.openmeetings.core.data.user.OrganisationManager;
 import org.apache.openmeetings.core.mail.MailHandler;
 import org.apache.openmeetings.core.remote.red5.ScopeApplicationAdapter;
 import org.apache.openmeetings.core.remote.util.SessionVariablesUtil;
 import org.apache.openmeetings.db.dao.basic.ConfigurationDao;
 import org.apache.openmeetings.db.dao.server.ISessionManager;
 import org.apache.openmeetings.db.dao.server.SessiondataDao;
-import org.apache.openmeetings.db.dao.user.AdminUserDao;
 import org.apache.openmeetings.db.dao.user.IUserManager;
+import org.apache.openmeetings.db.dao.user.OrganisationDao;
+import org.apache.openmeetings.db.dao.user.OrganisationUserDao;
 import org.apache.openmeetings.db.dao.user.StateDao;
+import org.apache.openmeetings.db.dao.user.UserDao;
 import org.apache.openmeetings.db.dto.basic.SearchResult;
 import org.apache.openmeetings.db.entity.room.Client;
 import org.apache.openmeetings.db.entity.server.Sessiondata;
@@ -92,9 +93,11 @@ public class UserManager implements IUse
 	@Autowired
 	private StateDao statemanagement;
 	@Autowired
-	private OrganisationManager organisationManager;
+	private OrganisationDao orgDao;
 	@Autowired
-	private AdminUserDao usersDao;
+	private OrganisationUserDao orgUserDao;
+	@Autowired
+	private UserDao usersDao;
 	@Autowired
 	private EmailManager emailManagement;
 	@Autowired
@@ -122,7 +125,7 @@ public class UserManager implements IUse
 			} else {
 				sort += " DESC ";
 			}
-			String hql = DaoHelper.getSearchQuery("User", "u", search, true, false, sort, AdminUserDao.searchFields);
+			String hql = DaoHelper.getSearchQuery("User", "u", search, true, false, sort, UserDao.searchFields);
 
 			log.debug("Show HQL: " + hql);
 
@@ -227,7 +230,7 @@ public class UserManager implements IUse
 
 			if (sessionData != null) {
 
-				User u = getUserById(sessionData.getUser_id());
+				User u = usersDao.get(sessionData.getUser_id());
 
 				sessiondataDao.updateUserWithoutSession(SID, u.getUser_id());
 
@@ -382,11 +385,12 @@ public class UserManager implements IUse
 	public Long getUserLevelByID(Long user_id) {
 
 		try {
-			if (user_id == null)
-				return new Long(0);
+			if (user_id == null) {
+				return 0L;
+			}
 			// For direct access of linked users
-			if (user_id == -1) {
-				return new Long(1);
+			if (user_id < 0) {
+				return 1L;
 			}
 
 			TypedQuery<User> query = em
@@ -439,9 +443,7 @@ public class UserManager implements IUse
 					log.debug("user_id, organisation_id" + user_id + ", "
 							+ organisation_id);
 
-					Organisation_Users ou = organisationManager
-							.getOrganisation_UserByUserAndOrganisation(user_id,
-									organisation_id);
+					Organisation_Users ou = orgUserDao.getByOrganizationAndUser(organisation_id, user_id);
 
 					log.debug("ou: " + ou);
 
@@ -493,8 +495,7 @@ public class UserManager implements IUse
 	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, boolean sendSMS,
-			boolean generateSipUserData, String jNameTimeZone) {
+			String town, long language_id, String phone, boolean sendSMS, boolean generateSipUserData, String jNameTimeZone) {
 		
 		String baseURL = configurationDao.getBaseUrl();
 		boolean sendConfirmation = baseURL != null
@@ -776,10 +777,10 @@ public class UserManager implements IUse
 			if (orgIds != null) {
 				List<Organisation_Users> orgList = users.getOrganisation_users();
 				for (Long orgId : orgIds) {
-					orgList.add(organisationManager.getOrgUser(orgId, null));
+					orgList.add(new Organisation_Users(orgDao.get(orgId)));
 				}
 			}
-			return addUser(users);
+			return usersDao.update(users, null).getUser_id();
 
 		} catch (Exception ex2) {
 			log.error("[registerUser]", ex2);
@@ -847,48 +848,6 @@ public class UserManager implements IUse
 		return null;
 	}
 
-	public Long addUser(User usr) {
-		try {
-			em.persist(usr);
-			//em.refresh(usr);
-			em.flush();
-
-			return usr.getUser_id();
-		} catch (Exception ex2) {
-			log.error("[addUser]", ex2);
-		}
-		return null;
-	}
-
-	/**
-	 * 
-	 * Find User by Id
-	 */
-	// -----------------------------------------------------------------------------------------------------
-	public User getUserById(Long id) {
-		log.debug("Usermanagement.getUserById");
-
-		if (id == null || id <= 0) {
-			return null;
-		}
-		CriteriaBuilder cb = em.getCriteriaBuilder();
-		CriteriaQuery<User> cq = cb.createQuery(User.class);
-		Root<User> c = cq.from(User.class);
-		Predicate condition = cb.equal(c.get("deleted"), false);
-		Predicate subCondition = cb.equal(c.get("user_id"), id);
-		cq.where(condition, subCondition);
-		TypedQuery<User> q = em.createQuery(cq);
-		User u = null;
-		try {
-			u = q.getSingleResult();
-		} catch (NoResultException e) {
-			// u=null}
-		} catch (NonUniqueResultException ex) {
-		}
-
-		return u;
-	}
-
 	/**
 	 * @param admin
 	 * @param room_id

Modified: openmeetings/trunk/singlewebapp/openmeetings-util/src/main/java/org/apache/openmeetings/util/DaoHelper.java
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/openmeetings-util/src/main/java/org/apache/openmeetings/util/DaoHelper.java?rev=1601073&r1=1601072&r2=1601073&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/openmeetings-util/src/main/java/org/apache/openmeetings/util/DaoHelper.java (original)
+++ openmeetings/trunk/singlewebapp/openmeetings-util/src/main/java/org/apache/openmeetings/util/DaoHelper.java Sat Jun  7 07:45:55 2014
@@ -19,32 +19,49 @@
 package org.apache.openmeetings.util;
 
 import org.apache.commons.lang3.StringUtils;
+import org.apache.wicket.util.string.Strings;
 
 public class DaoHelper {
 
 	public static String getSearchQuery(String table, String alias, String search, boolean filterDeleted, boolean count, String sort, String... fields) {
-		return getSearchQuery(table, alias, search, filterDeleted, count, null, sort, fields);
+		return getSearchQuery(table, alias, search, false, filterDeleted, count, sort, fields);
+	}
+	public static String getSearchQuery(String table, String alias, String search, boolean distinct, boolean filterDeleted, boolean count, String sort, String... fields) {
+		return getSearchQuery(table, alias, null, search, distinct, filterDeleted, count, null, sort, fields);
+	}
+	
+	public static String getSearchQuery(String table, String alias, String join, String search, boolean filterDeleted, boolean count, String additionalWhere, String sort, String... fields) {
+		return getSearchQuery(table, alias, join, search, filterDeleted, count, additionalWhere, sort, fields);
 	}
 	
-	public static String getSearchQuery(String table, String alias, String search, boolean filterDeleted, boolean count, String additionalWhere, String sort, String... fields) {
+	public static String getSearchQuery(String table, String alias, String join, String search, boolean distinct, boolean filterDeleted, boolean count, String additionalWhere, String sort, String... fields) {
 		StringBuilder sb = new StringBuilder("SELECT ");
 		if (count) {
-			sb.append("COUNT(").append(alias).append(")");
-		} else {
-			sb.append(alias);
+			sb.append("COUNT(");
+		}
+		if (distinct) {
+			sb.append("DISTINCT ");
+		}
+		sb.append(alias);
+		if (count) {
+			sb.append(")");
+		}
+		sb.append(" FROM ").append(table).append(" ").append(alias);
+		if (!Strings.isEmpty(join)) {
+			sb.append(" ").append(join);
 		}
-		sb.append(" FROM ").append(table).append(" ").append(alias).append(" WHERE 1 = 1 ");
+		sb.append(" WHERE 1 = 1 ");
 		if (filterDeleted) {
 			sb.append("AND ").append(alias).append(".deleted = false ");
 		}
-		StringBuilder where = DaoHelper.getWhereClause(search, alias, fields);
-		if (where.length() > 0) {
+		StringBuilder where = getWhereClause(search, alias, fields);
+		if (!Strings.isEmpty(where)) {
 			sb.append("AND ").append(where);
 		}
-		if (additionalWhere != null && !additionalWhere.trim().isEmpty()) {
+		if (!Strings.isEmpty(additionalWhere)) {
 			sb.append("AND ").append(additionalWhere);
 		}
-		if (sort != null && !sort.trim().isEmpty()) {
+		if (!Strings.isEmpty(sort)) {
 			sb.append(" ORDER BY ").append(alias).append(".").append(sort);
 		}
 		return sb.toString();

Modified: openmeetings/trunk/singlewebapp/openmeetings-web/pom.xml
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/openmeetings-web/pom.xml?rev=1601073&r1=1601072&r2=1601073&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/openmeetings-web/pom.xml (original)
+++ openmeetings/trunk/singlewebapp/openmeetings-web/pom.xml Sat Jun  7 07:45:55 2014
@@ -203,7 +203,7 @@
 				<inherited>true</inherited>
 				<configuration>
 					<workingDirectory>${project.build.directory}</workingDirectory>
-					<excludedGroups>org.apache.openmeetings.test.selenium.SeleniumTests</excludedGroups>
+					<excludedGroups>org.apache.openmeetings.test.selenium.SeleniumTests,org.apache.openmeetings.test.selenium.HeavyTests</excludedGroups>
 					<systemPropertyVariables>
 						<om.home>${project.build.directory}/test-root</om.home>
 						<languages.home>${project.basedir}/src/main/webapp/languages</languages.home>

Added: openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/AdminUserChoiceProvider.java
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/AdminUserChoiceProvider.java?rev=1601073&view=auto
==============================================================================
--- openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/AdminUserChoiceProvider.java (added)
+++ openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/AdminUserChoiceProvider.java Sat Jun  7 07:45:55 2014
@@ -0,0 +1,51 @@
+/*
+ * 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.apache.openmeetings.web.admin;
+
+import static org.apache.openmeetings.web.app.Application.getBean;
+
+import java.util.ArrayList;
+import java.util.Collection;
+
+import org.apache.openmeetings.db.dao.user.UserDao;
+import org.apache.openmeetings.db.entity.user.User;
+
+import com.vaynberg.wicket.select2.Response;
+import com.vaynberg.wicket.select2.TextChoiceProvider;
+
+public abstract class AdminUserChoiceProvider extends TextChoiceProvider<User> {
+	private static final long serialVersionUID = 1L;
+	protected static int PAGE_SIZE = 20;
+
+	@Override
+	protected Object getId(User choice) {
+		return choice.getUser_id();
+	}
+
+	@Override
+	public void query(String term, int page, Response<User> response) {
+		response.addAll(getBean(UserDao.class).get(term, true, page * PAGE_SIZE, PAGE_SIZE));
+		response.setHasMore(PAGE_SIZE == response.getResults().size());
+	}
+
+	@Override
+	public Collection<User> toChoices(Collection<String> ids) {
+		return new ArrayList<User>(getBean(UserDao.class).get(ids));
+	}
+}

Modified: openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/groups/GroupForm.java
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/groups/GroupForm.java?rev=1601073&r1=1601072&r2=1601073&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/groups/GroupForm.java (original)
+++ openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/groups/GroupForm.java Sat Jun  7 07:45:55 2014
@@ -21,18 +21,17 @@ package org.apache.openmeetings.web.admi
 import static org.apache.openmeetings.web.app.Application.getBean;
 import static org.apache.openmeetings.web.app.WebSession.getUserId;
 
-import java.util.List;
-
-import org.apache.openmeetings.db.dao.user.AdminUserDao;
 import org.apache.openmeetings.db.dao.user.OrganisationDao;
+import org.apache.openmeetings.db.dao.user.OrganisationUserDao;
 import org.apache.openmeetings.db.entity.user.Organisation;
 import org.apache.openmeetings.db.entity.user.Organisation_Users;
 import org.apache.openmeetings.db.entity.user.User;
-import org.apache.openmeetings.web.admin.AdminCommonUserForm;
-import org.apache.openmeetings.web.app.Application;
+import org.apache.openmeetings.web.admin.AdminBaseForm;
+import org.apache.openmeetings.web.admin.AdminUserChoiceProvider;
 import org.apache.openmeetings.web.app.WebSession;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.ajax.form.AjaxFormValidatingBehavior;
+import org.apache.wicket.ajax.form.OnChangeAjaxBehavior;
 import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.markup.html.form.Form;
 import org.apache.wicket.markup.html.form.RequiredTextField;
@@ -40,10 +39,17 @@ import org.apache.wicket.model.CompoundP
 import org.apache.wicket.model.Model;
 import org.apache.wicket.util.time.Duration;
 
-public class GroupForm extends AdminCommonUserForm<Organisation> {
+import com.vaynberg.wicket.select2.Select2Choice;
+
+public class GroupForm extends AdminBaseForm<Organisation> {
 	private static final long serialVersionUID = -1720731686053912700L;
 	private GroupUsersPanel usersPanel;
 	private WebMarkupContainer groupList;
+	private Select2Choice<User> userToadd = null;
+	
+	static String formatUser(User choice) {
+		return String.format("%s [%s %s]", choice.getLogin(), choice.getFirstname(), choice.getLastname());
+	}
 	
 	public GroupForm(String id, WebMarkupContainer groupList, Organisation organisation) {
 		super(id, new CompoundPropertyModel<Organisation>(organisation));
@@ -54,49 +60,62 @@ public class GroupForm extends AdminComm
 		usersPanel = new GroupUsersPanel("users", getOrgId());
 		add(usersPanel);
 
+		add(userToadd = new Select2Choice<User>("user2add", Model.of((User)null), new AdminUserChoiceProvider() {
+			private static final long serialVersionUID = 1L;
+
+			@Override
+			protected String getDisplayText(User choice) {
+				return formatUser(choice);
+			}
+		}));
+		userToadd.add(new OnChangeAjaxBehavior() {
+			private static final long serialVersionUID = 1L;
+
+			@Override
+			protected void onUpdate(AjaxRequestTarget target) {
+				Organisation o = GroupForm.this.getModelObject();
+				User u = userToadd.getModelObject();
+				boolean found = false;
+				if (o.getOrganisation_id() != null) {
+					found = null != getBean(OrganisationUserDao.class).getByOrganizationAndUser(o.getOrganisation_id(), u.getUser_id());
+				}
+				if (!found && u != null) {
+					for (Organisation_Users ou : usersPanel.getUsers2add()) {
+						if (ou.getUser().getUser_id().equals(u.getUser_id())) {
+							found = true;
+							break;
+						}
+					}
+					if (!found) {
+						Organisation_Users ou = new Organisation_Users(o);
+						ou.setUser(u);
+						usersPanel.getUsers2add().add(new Organisation_Users(o));
+
+						userToadd.setModelObject(null);
+						target.add(usersPanel, userToadd);
+					}
+				}
+			}
+		});
 		// attach an ajax validation behavior to all form component's keydown
 		// event and throttle it down to once per second
 		AjaxFormValidatingBehavior.addToAllFormComponents(this, "keydown", Duration.ONE_SECOND);
 	}
 	
-	@Override
 	public void updateView(AjaxRequestTarget target) {
+		userToadd.setModelObject(null);
 		usersPanel.update(getOrgId());
 		target.add(this, groupList);
 		target.appendJavaScript("groupsInit();");
 	}
 
-	@Override
-	public void submitView(AjaxRequestTarget target, List<User> usersToAdd) {
-		// TODO Auto-generated method stub
-		AdminUserDao userDao = Application.getBean(AdminUserDao.class);
-		Organisation organisation = getModelObject();
-		for (User u : usersToAdd) {
-			List<Organisation_Users> orgUsers = u.getOrganisation_users();
-			boolean found = false;
-			for (Organisation_Users ou : orgUsers) {
-				if (ou.getOrganisation().getOrganisation_id().equals(organisation.getOrganisation_id())) {
-					found = true;
-					break;
-				}
-			}
-			if (!found) {
-				Organisation_Users orgUser = new Organisation_Users(organisation);
-				orgUser.setDeleted(false);
-				orgUsers.add(orgUser);
-				userDao.update(u, WebSession.getUserId());
-			}
-		}
-		target.add(usersPanel);
-	}
-	
 	private long getOrgId() {
 		return getModelObject().getOrganisation_id() != null ? getModelObject().getOrganisation_id() : 0;
 	}
 	
 	@Override
 	protected void onNewSubmit(AjaxRequestTarget target, Form<?> f) {
-		this.setModelObject(new Organisation());
+		setModelObject(new Organisation());
 		updateView(target);
 	}
 	
@@ -108,20 +127,23 @@ public class GroupForm extends AdminComm
 		} else {
 			org = new Organisation();
 		}
-		this.setModelObject(org);
+		setModelObject(org);
 		updateView(target);
 	}
 	
 	@Override
 	protected void onDeleteSubmit(AjaxRequestTarget target, Form<?> form) {
 		getBean(OrganisationDao.class).delete(getModelObject(), getUserId());
-		this.setModelObject(new Organisation());
+		setModelObject(new Organisation());
 		updateView(target);
 	}
 	
 	@Override
 	protected void onSaveSubmit(AjaxRequestTarget target, Form<?> form) {
-		getBean(OrganisationDao.class).update(getModelObject(), getUserId());
+		Organisation o = getModelObject();
+		o = getBean(OrganisationDao.class).update(o, getUserId());
+		setModelObject(o);
+		getBean(OrganisationUserDao.class).update(usersPanel.getUsers2add(), getUserId());
 		hideNewRecord();
 		updateView(target);
 	}

Modified: openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/groups/GroupUsersPanel.html
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/groups/GroupUsersPanel.html?rev=1601073&r1=1601072&r2=1601073&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/groups/GroupUsersPanel.html (original)
+++ openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/groups/GroupUsersPanel.html Sat Jun  7 07:45:55 2014
@@ -22,16 +22,18 @@
 	<wicket:panel>
 		<div class="usergroupspanel">
 			<span wicket:id="navigator">[dataview navigator]</span>
-			<table class="adminListTable" style="min-width: 400px; max-width: 400px" >
+			<table class="adminListTable" style="min-width: 440px; max-width: 440px" >
                 <tr>
+                    <th class="ui-widget-header" style="width: 34px; max-width: 34px; overflow: hidden;" wicket:ommessage="title:98"><wicket:ommessage key="98" /></th>
                     <th class="ui-widget-header" style="width: 360px"><wicket:ommessage key="177" /></th>
                     <th class="ui-widget-header" style="width: 34px"><wicket:ommessage key="275" /></th>
                 </tr>   
             </table>
-            <div class="tableWrapper" style="width: 420px; height: 420px;">
-                <table class="adminListTable" style="min-width: 400px; max-width: 400px">  
+            <div class="tableWrapper" style="width: 460px; height: 460px;">
+                <table class="adminListTable" style="min-width: 440px; max-width: 440px">  
                     <tbody>   
-                        <tr wicket:id="userList">
+                        <tr wicket:id="userList" class="ui-widget-content">
+                            <td style="width: 34px"><input type="checkbox" wicket:id="isModerator"/></td>
                             <td style="width: 360px"><div style="width: 360px"><span wicket:id="label"></span></div></td>
                             <td style="width: 34px"><div style="width: 34px"><div class="formCancelButton" wicket:id="deleteUserBtn" wicket:ommessage="title:274"><input/></div></div></td>
                         </tr>

Modified: openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/groups/GroupUsersPanel.java
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/groups/GroupUsersPanel.java?rev=1601073&r1=1601072&r2=1601073&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/groups/GroupUsersPanel.java (original)
+++ openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/groups/GroupUsersPanel.java Sat Jun  7 07:45:55 2014
@@ -18,6 +18,9 @@
  */
 package org.apache.openmeetings.web.admin.groups;
 
+import java.util.ArrayList;
+import java.util.List;
+
 import org.apache.openmeetings.db.dao.user.OrganisationUserDao;
 import org.apache.openmeetings.db.entity.user.Organisation_Users;
 import org.apache.openmeetings.db.entity.user.User;
@@ -27,57 +30,49 @@ import org.apache.openmeetings.web.app.W
 import org.apache.openmeetings.web.common.ConfirmCallListener;
 import org.apache.openmeetings.web.common.PagedEntityListPanel;
 import org.apache.openmeetings.web.data.SearchableDataProvider;
-import org.apache.wicket.AttributeModifier;
 import org.apache.wicket.ajax.AjaxEventBehavior;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.ajax.attributes.AjaxRequestAttributes;
+import org.apache.wicket.ajax.form.OnChangeAjaxBehavior;
+import org.apache.wicket.behavior.AttributeAppender;
 import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.markup.html.form.CheckBox;
 import org.apache.wicket.markup.html.panel.Panel;
 import org.apache.wicket.markup.repeater.Item;
-import org.apache.wicket.model.Model;
 
 public class GroupUsersPanel extends Panel {
-	private static final long serialVersionUID = -1813488722913433227L;
+	private static final long serialVersionUID = 1L;
 	private long organisationId;
-	
-	public static String getUser(User u) {
-		return u.getLogin() + " [" + u.getFirstname() + ", " + u.getLastname() + "]";
-	}
+	private List<Organisation_Users> users2add = new ArrayList<Organisation_Users>();
 	
 	public GroupUsersPanel(String id, long orgId) {
 		super(id);
 		this.organisationId = orgId;
 		setOutputMarkupId(true);
 		
-		SearchableDataView<Organisation_Users> dataView = new SearchableDataView<Organisation_Users>("userList", new SearchableDataProvider<Organisation_Users>(OrganisationUserDao.class){
+		SearchableDataView<Organisation_Users> dataView = new SearchableDataView<Organisation_Users>("userList", new OrgUserDataProvider()) {
 			private static final long serialVersionUID = 1L;
 
-			protected OrganisationUserDao getDao() {
-				return (OrganisationUserDao)super.getDao();
-			}
-			
-			public long size() {
-				return search == null ? getDao().count(organisationId) : getDao().count(organisationId, search);
-			}
-			
-			public java.util.Iterator<? extends Organisation_Users> iterator(long first, long count) {
-				return (search == null && getSort() == null
-						? getDao().get(organisationId, (int)first, (int)count)
-						: getDao().get(organisationId, search, (int)first, (int)count, getSortStr())).iterator();
-			}
-		}) {
-			private static final long serialVersionUID = 8715559628755439596L;
-
 			@Override
 			protected void populateItem(Item<Organisation_Users> item) {
 				final Organisation_Users orgUser = item.getModelObject();
 				User u = orgUser.getUser();
-				if (u != null) {
-					item.add(new Label("label", Model.of(getUser(u))));
-				} else {
-					item.add(new Label("label", Model.of("")));
+				item.add(new CheckBox("isModerator").add(new OnChangeAjaxBehavior() {
+					private static final long serialVersionUID = 1L;
+
+					@Override
+					protected void onUpdate(AjaxRequestTarget target) {
+						if (orgUser.getOrganisation_users_id() != null) {
+							Application.getBean(OrganisationUserDao.class).update(orgUser, WebSession.getUserId());
+						}
+					}
+				}));
+				Label label = new Label("label", u == null ? "" : GroupForm.formatUser(u));
+				if (orgUser.getOrganisation_users_id() == null) {
+					label.add(AttributeAppender.append("class", "newItem"));
 				}
+				item.add(label);
 				item.add(new WebMarkupContainer("deleteUserBtn").add(new AjaxEventBehavior("onclick"){
 					private static final long serialVersionUID = 1L;
 
@@ -89,16 +84,25 @@ public class GroupUsersPanel extends Pan
 					
 					@Override
 					protected void onEvent(AjaxRequestTarget target) {
-						Application.getBean(OrganisationUserDao.class).delete(orgUser, WebSession.getUserId());
+						if (orgUser.getOrganisation_users_id() == null) {
+							for (int i = 0; i < users2add.size(); ++i) {
+								//FIXME ineffective
+								if (users2add.get(i).getUser().getUser_id().equals(orgUser.getUser().getUser_id())) {
+									users2add.remove(i);
+									break;
+								}
+							}
+						} else {
+							Application.getBean(OrganisationUserDao.class).delete(orgUser, WebSession.getUserId());
+						}
 						target.add(GroupUsersPanel.this);
 					}
-				})); 
-				item.add(AttributeModifier.append("class", ((item.getIndex() % 2 == 1) ? "even" : "odd")));
+				}));
 			}
 		};
 		add(dataView).setOutputMarkupId(true);
 		add(new PagedEntityListPanel("navigator", dataView) {
-			private static final long serialVersionUID = 5097048616003411362L;
+			private static final long serialVersionUID = 1L;
 
 			@Override
 			protected void onEvent(AjaxRequestTarget target) {
@@ -109,5 +113,36 @@ public class GroupUsersPanel extends Pan
 	
 	void update(long orgId) {
 		organisationId = orgId;
+		users2add.clear();
+	}
+	
+	List<Organisation_Users> getUsers2add() {
+		return users2add;
+	}
+	
+	private class OrgUserDataProvider extends SearchableDataProvider<Organisation_Users> {
+		private static final long serialVersionUID = 1L;
+
+		OrgUserDataProvider() {
+			super(OrganisationUserDao.class);
+		}
+		
+		protected OrganisationUserDao getDao() {
+			return (OrganisationUserDao)super.getDao();
+		}
+		
+		public long size() {
+			return users2add.size() + (search == null ? getDao().count(organisationId) : getDao().count(organisationId, search));
+		}
+		
+		public java.util.Iterator<? extends Organisation_Users> iterator(long first, long count) {
+			List<Organisation_Users> list = new ArrayList<Organisation_Users>();
+			list.addAll(users2add);
+			list.addAll(search == null && getSort() == null
+					? getDao().get(organisationId, (int)first, (int)count)
+					: getDao().get(organisationId, search, (int)first, (int)count, getSortStr()));
+			
+			return list.iterator();
+		}
 	}
 }