/*
* 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.jdbc;
/*
import org.exoplatform.commons.utils.IdentifierUtil;
import org.exoplatform.services.database.DBObjectMapper;
import org.exoplatform.services.database.DBObjectQuery;
import org.exoplatform.services.database.DBPageList;
import org.exoplatform.services.database.ExoDatasource;
import org.exoplatform.services.database.StandardSQLDAO;
import org.exoplatform.services.listener.ListenerService;
import org.exoplatform.services.log.ExoLogger;
import org.exoplatform.services.log.Log;
import org.exoplatform.services.organization.Group;
import org.exoplatform.services.organization.Membership;
import org.exoplatform.services.organization.MembershipEventListener;
import org.exoplatform.services.organization.MembershipHandler;
import org.exoplatform.services.organization.MembershipType;
import org.exoplatform.services.organization.OrganizationService;
import org.exoplatform.services.organization.User;
*/
import java.sql.Connection;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import javax.naming.InvalidNameException;
import org.etk.common.logging.Logger;
import org.etk.common.utils.IdentifierUtil;
import org.etk.component.base.event.ListenerService;
import org.etk.component.database.DBObjectMapper;
import org.etk.component.database.DBObjectQuery;
import org.etk.component.database.DBPageList;
import org.etk.component.database.ExoDatasource;
import org.etk.component.database.StandardSQLDAO;
import org.etk.core.membership.Group;
import org.etk.core.membership.Membership;
import org.etk.core.membership.MembershipEventListener;
import org.etk.core.membership.MembershipHandler;
import org.etk.core.membership.MembershipType;
import org.etk.core.membership.OrganizationService;
import org.etk.core.membership.User;
/**
* Created by The eXo Platform SAS Apr 7, 2007
*/
public class MembershipDAOImpl extends StandardSQLDAO<MembershipImpl> implements MembershipHandler {
protected static Logger log = Logger.getLogger(MembershipDAOImpl.class);
protected final OrganizationService service;
protected ListenerService listenerService_;
public MembershipDAOImpl(ListenerService lService,
ExoDatasource datasource,
DBObjectMapper<MembershipImpl> mapper,
OrganizationService service) {
super(datasource, mapper, MembershipImpl.class);
this.service = service;
this.listenerService_ = lService;
}
public Membership createMembershipInstance() {
return new MembershipImpl();
}
public void createMembership(Membership membership, boolean broadcast) throws Exception {
if (service.getMembershipTypeHandler().findMembershipType(membership.getMembershipType()) == null) {
throw new InvalidNameException("Can not create membership record " + membership.getId()
+ " because membership type " + membership.getMembershipType() + " not exists.");
}
MembershipImpl membershipImpl = (MembershipImpl) membership;
if (broadcast)
listenerService_.broadcast("organization.membership.preSave", this, membershipImpl);
membershipImpl.setId(IdentifierUtil.generateUUID(membership));
super.save(membershipImpl);
if (broadcast)
listenerService_.broadcast("organization.membership.postSave", this, membershipImpl);
}
public void linkMembership(User user, Group group, MembershipType mt, boolean broadcast) throws Exception {
if (user == null) {
throw new InvalidNameException("Can not create membership record because group is null");
}
if (group == 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");
}
if (log.isDebugEnabled())
log.debug("LINK MEMBER SHIP (" + user.getUserName() + ", " + group.getId() + " , "
+ mt.getName() + ");");
MembershipImpl membership = new MembershipImpl();
membership.setUserName(user.getUserName());
membership.setMembershipType(mt.getName());
membership.setGroupId(group.getId());
if (findMembershipByUserGroupAndType(user.getUserName(), group.getId(), mt.getName()) != null)
return;
createMembership(membership, broadcast);
}
public Membership findMembership(String id) throws Exception {
if (id == null)
return null;
DBObjectQuery<MembershipImpl> query = new DBObjectQuery<MembershipImpl>(MembershipImpl.class);
query.addLIKE("MEMBERSHIP_ID", id);
return loadUnique(query.toQuery());
}
public Membership findMembershipByUserGroupAndType(String userName, String groupId, String type) throws Exception {
if (userName == null || groupId == null || type == null)
return null;
DBObjectQuery<MembershipImpl> query = new DBObjectQuery<MembershipImpl>(MembershipImpl.class);
query.addLIKE("USER_NAME", userName);
query.addLIKE("GROUP_ID", groupId);
query.addLIKE("MEMBERSHIP_TYPE", type);
Membership member = loadUnique(query.toQuery());
if (log.isDebugEnabled())
log.debug("FIND MEMBERSHIP BY USER " + userName + ", GROUP " + groupId + ", TYPE " + type
+ " - " + (member != null));
return member;
}
public Collection findMembershipsByGroup(Group group) throws Exception {
if (group == null)
return null;
List<MembershipImpl> list = new ArrayList<MembershipImpl>();
DBObjectQuery<MembershipImpl> query = new DBObjectQuery<MembershipImpl>(MembershipImpl.class);
query.addLIKE("GROUP_ID", group.getId());
loadInstances(query.toQuery(), list);
return list;
}
public Collection findMembershipsByUser(String userName) throws Exception {
if (userName == null)
return null;
List<MembershipImpl> list = new ArrayList<MembershipImpl>();
DBObjectQuery<MembershipImpl> query = new DBObjectQuery<MembershipImpl>(MembershipImpl.class);
query.addLIKE("USER_NAME", userName);
loadInstances(query.toQuery(), list);
if (log.isDebugEnabled())
log.debug("FIND MEMBERSHIP BY USER " + userName + " Size = " + list.size());
return list;
}
public Collection findMembershipsByUserAndGroup(String userName, String groupId) throws Exception {
if (userName == null || groupId == null)
return null;
List<MembershipImpl> list = new ArrayList<MembershipImpl>();
DBObjectQuery<MembershipImpl> query = new DBObjectQuery<MembershipImpl>(MembershipImpl.class);
query.addLIKE("USER_NAME", userName);
query.addLIKE("GROUP_ID", groupId);
loadInstances(query.toQuery(), list);
if (log.isDebugEnabled())
log.debug("FIND MEMBERSHIP BY USER " + userName + ", GROUP " + groupId + " Size = "
+ list.size());
return list;
}
public Membership removeMembership(String id, boolean broadcast) throws Exception {
DBObjectQuery<MembershipImpl> query = new DBObjectQuery<MembershipImpl>(MembershipImpl.class);
query.addLIKE("MEMBERSHIP_ID", id);
Connection connection = eXoDS_.getConnection();
try {
MembershipImpl membershipImpl = super.loadUnique(connection, query.toQuery());
if (membershipImpl == null)
return null;
if (broadcast)
listenerService_.broadcast("organization.membership.preDelete", this, membershipImpl);
String sql = eXoDS_.getQueryBuilder()
.createRemoveQuery(type_, membershipImpl.getDBObjectId());
super.execute(connection, sql, (MembershipImpl) null);
if (broadcast)
listenerService_.broadcast("organization.membership.postDelete", this, membershipImpl);
return membershipImpl;
} catch (Exception e) {
throw e;
} finally {
eXoDS_.closeConnection(connection);
}
}
@SuppressWarnings("unchecked")
public Collection removeMembershipByUser(String username, boolean broadcast) throws Exception {
// DBObjectQuery<MembershipImpl> query = new
// DBObjectQuery<MembershipImpl>(MembershipImpl.class);
// query.addLIKE("userName", username);
List<Membership> members = (List<Membership>) findMembershipsByUser(username);
for (Membership member : members) {
removeMembership(member.getId(), true);
}
return members;
}
public Collection removeMemberships(DBObjectQuery<MembershipImpl> query, boolean broadcast) throws Exception {
DBPageList<MembershipImpl> pageList = new DBPageList<MembershipImpl>(20, this, query);
List<MembershipImpl> list = pageList.getAll();
Connection connection = eXoDS_.getConnection();
try {
for (MembershipImpl membershipImpl : list) {
if (broadcast)
listenerService_.broadcast("organization.membership.preDelete", this, membershipImpl);
if (membershipImpl == null)
return null;
String sql = eXoDS_.getQueryBuilder().createRemoveQuery(type_,
membershipImpl.getDBObjectId());
super.execute(connection, sql, (MembershipImpl) null);
if (broadcast)
listenerService_.broadcast("organization.membership.postDelete", this, membershipImpl);
}
return list;
} catch (Exception e) {
throw e;
} finally {
eXoDS_.closeConnection(connection);
}
}
@SuppressWarnings("unchecked")
public void addMembershipEventListener(MembershipEventListener listener) {
throw new RuntimeException("This method is not supported anymore, please use the new api");
}
}