/*
* Copyright (C) 2009 eXo Platform SAS.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.etk.core.membership.hibernate;
import org.etk.common.utils.IdentifierUtil;
import org.etk.common.utils.ListenerStack;
import org.etk.component.database.HibernateService;
import org.etk.core.membership.Group;
import org.etk.core.membership.Membership;
import org.etk.core.membership.MembershipEventListener;
import org.etk.core.membership.MembershipEventListenerHandler;
import org.etk.core.membership.MembershipHandler;
import org.etk.core.membership.MembershipType;
import org.etk.core.membership.OrganizationService;
import org.etk.core.membership.User;
import org.etk.core.membership.impl.MembershipImpl;
import org.hibernate.Session;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import javax.naming.InvalidNameException;
/**
* Created by The eXo Platform SAS Author : Mestrallet Benjamin benjmestrallet@users.sourceforge.net
* Author : Tuan Nguyen tuan08@users.sourceforge.net Date: Aug 22, 2003 Time: 4:51:21 PM
*/
public class MembershipDAOImpl implements MembershipHandler, MembershipEventListenerHandler
{
private static final String queryFindMembershipByUserGroupAndType =
"from m in class org.etk.core.membership.impl.MembershipImpl " + "where m.userName = ? "
+ " and m.groupId = ? " + " and m.membershipType = ? ";
private static final String queryFindMembershipsByUserAndGroup =
"from m in class org.etk.core.membership.impl.MembershipImpl " + "where m.userName = ? "
+ " and m.groupId = ? ";
private static final String queryFindMembershipsByGroup =
"from m in class org.etk.core.membership.impl.MembershipImpl " + "where m.groupId = ? ";
private static final String queryFindMembership =
"from m in class org.etk.core.membership.impl.MembershipImpl " + "where m.id = ? ";
private static final String queryFindMembershipsByUser =
"from m in class org.etk.core.membership.impl.MembershipImpl " + "where m.userName = ? ";
private HibernateService service_;
private List listeners_;
/**
* Organization service.
*/
protected final OrganizationService orgService;
public MembershipDAOImpl(HibernateService service, OrganizationService orgService)
{
this.service_ = service;
this.orgService = orgService;
this.listeners_ = new ListenerStack(5);
}
public void addMembershipEventListener(MembershipEventListener listener)
{
listeners_.add(listener);
}
final public Membership createMembershipInstance()
{
return new MembershipImpl();
}
public void createMembership(Membership m, boolean broadcast) throws Exception
{
if (orgService.getMembershipTypeHandler().findMembershipType(m.getMembershipType()) == null)
{
throw new InvalidNameException("Can not create membership record " + m.getId()
+ " because membership type " + m.getMembershipType() + " is not exists.");
}
if (broadcast)
preSave(m, true);
Session session = service_.openSession();
session.save(m);
if (broadcast)
postSave(m, true);
session.flush();
}
public void linkMembership(User user, Group g, MembershipType mt, boolean broadcast) throws Exception
{
if (user == null)
{
throw new InvalidNameException("Can not create membership record because user is null");
}
if (g == null)
{
throw new InvalidNameException("Can not create membership record for " + user.getUserName()
+ " because group is null");
}
if (mt == null)
{
throw new InvalidNameException("Can not create membership record for " + user.getUserName()
+ " because membership type is null");
}
MembershipImpl membership = new MembershipImpl();
membership.setUserName(user.getUserName());
membership.setMembershipType(mt.getName());
membership.setGroupId(g.getId());
membership.setId(IdentifierUtil.generateUUID(membership));
if (findMembershipByUserGroupAndType(user.getUserName(), g.getId(), mt.getName()) != null)
return;
createMembership(membership, broadcast);
}
public void saveMembership(Membership m, boolean broadcast) throws Exception
{
if (broadcast)
preSave(m, false);
Session session = service_.openSession();
session.update(m);
if (broadcast)
postSave(m, false);
session.flush();
}
public Membership removeMembership(String id, boolean broadcast) throws Exception
{
Session session = service_.openSession();
Membership m = (Membership)service_.findOne(session, queryFindMembership, id);
if (m != null)
{
if (broadcast)
preDelete(m);
session = service_.openSession();
session.delete(m);
if (broadcast)
postDelete(m);
session.flush();
}
return m;
}
public Collection removeMembershipByUser(String username, boolean broadcast) throws Exception
{
Collection collection = findMembershipsByUser(username);
Iterator iter = collection.iterator();
while (iter.hasNext())
{
Membership m = (Membership)iter.next();
if (m != null)
{
if (broadcast)
preDelete(m);
Session session = service_.openSession();
session.delete(m);
if (broadcast)
postDelete(m);
session.flush();
}
}
return collection;
}
public Membership findMembershipByUserGroupAndType(String userName, String groupId, String type) throws Exception
{
Session session = service_.openSession();
// Object[] args = new Object[] { userName, groupId , type};
// Type[] types = new Type[] { Hibernate.STRING, Hibernate.STRING,
// Hibernate.STRING };
List memberships =
session.createQuery(queryFindMembershipByUserGroupAndType).setString(0, userName).setString(1, groupId)
.setString(2, type).list();
if (memberships.size() == 0)
{
return null;
}
else if (memberships.size() == 1)
{
return (Membership)memberships.get(0);
}
else
{
throw new Exception("Expect 0 or 1 membership but found" + memberships.size());
}
}
public Collection findMembershipsByUserAndGroup(String userName, String groupId) throws Exception
{
Session session = service_.openSession();
// Object[] args = new Object[] { userName, groupId };
// Type[] types = new Type[] { Hibernate.STRING, Hibernate.STRING };
List memberships =
session.createQuery(queryFindMembershipsByUserAndGroup).setString(0, userName).setString(1, groupId).list();
return memberships;
}
public Collection findMembershipsByUser(String userName) throws Exception
{
Session session = service_.openSession();
List memberships = session.createQuery(queryFindMembershipsByUser).setString(0, userName).list();
return memberships;
}
static void removeMembershipEntriesOfUser(String userName, Session session) throws Exception
{
List entries = session.createQuery(queryFindMembershipsByUser).setString(0, userName).list();
for (int i = 0; i < entries.size(); i++)
session.delete(entries.get(i));
}
static void removeMembershipEntriesOfGroup(Group group, Session session) throws Exception
{
List entries = session.createQuery(queryFindMembershipsByGroup).setString(0, group.getId()).list();
for (int i = 0; i < entries.size(); i++)
session.delete(entries.get(i));
}
Collection findMembershipsByUser(String userName, Session session) throws Exception
{
return session.createQuery(queryFindMembershipsByUser).setString(0, userName).list();
}
public Collection findMembershipsByGroup(Group group) throws Exception
{
Session session = service_.openSession();
List memberships = session.createQuery(queryFindMembershipsByGroup).setString(0, group.getId()).list();
return memberships;
}
public Collection findMembershipsByGroupId(String groupId) throws Exception
{
Session session = service_.openSession();
// List memberships = session.find( queryFindMembershipsByGroup, groupId,
// Hibernate.STRING );
List memberships = session.createQuery(queryFindMembershipsByGroup).setString(0, groupId).list();
return memberships;
}
public Membership findMembership(String id) throws Exception
{
Session session = service_.openSession();
List memberships = session.createQuery(queryFindMembership).setString(0, id).list();
if (memberships.size() == 0)
{
return null;
}
else if (memberships.size() == 1)
{
return (Membership)memberships.get(0);
}
else
{
throw new Exception("Expect 0 or 1 membership but found" + memberships.size());
}
// Membership membership =
// (Membership) session.createQuery(queryFindMembership).setString(0,
// id).list() ;
// return membership;
}
private void preSave(Membership membership, boolean isNew) throws Exception
{
for (int i = 0; i < listeners_.size(); i++)
{
MembershipEventListener listener = (MembershipEventListener)listeners_.get(i);
listener.preSave(membership, isNew);
}
}
private void postSave(Membership membership, boolean isNew) throws Exception
{
for (int i = 0; i < listeners_.size(); i++)
{
MembershipEventListener listener = (MembershipEventListener)listeners_.get(i);
listener.postSave(membership, isNew);
}
}
private void preDelete(Membership membership) throws Exception
{
for (int i = 0; i < listeners_.size(); i++)
{
MembershipEventListener listener = (MembershipEventListener)listeners_.get(i);
listener.preDelete(membership);
}
}
private void postDelete(Membership membership) throws Exception
{
for (int i = 0; i < listeners_.size(); i++)
{
MembershipEventListener listener = (MembershipEventListener)listeners_.get(i);
listener.postDelete(membership);
}
}
/**
* {@inheritDoc}
*/
public List<MembershipEventListener> getMembershipListeners()
{
return Collections.unmodifiableList(listeners_);
}
}