/*
* 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 java.sql.Connection;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.etk.common.exception.UniqueObjectException;
import org.etk.common.logging.Logger;
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.GroupEventListener;
import org.etk.core.membership.GroupHandler;
import org.etk.core.membership.Membership;
import org.etk.core.membership.MembershipHandler;
import org.etk.core.membership.OrganizationService;
import org.etk.kernel.container.ApplicationContainer;
/**
* Created by The eXo Platform SAS Apr 7, 2007
*/
public class GroupDAOImpl extends StandardSQLDAO<GroupImpl> implements GroupHandler {
protected static Logger log = Logger.getLogger(GroupDAOImpl.class);
protected ListenerService listenerService_;
public GroupDAOImpl(ListenerService lService,
ExoDatasource datasource,
DBObjectMapper<GroupImpl> mapper) {
super(datasource, mapper, GroupImpl.class);
listenerService_ = lService;
}
public Group createGroupInstance() {
return new GroupImpl();
}
public void createGroup(Group group, boolean broadcast) throws Exception {
addChild(null, group, broadcast);
}
public void addChild(Group parent, Group child, boolean broadcast) throws Exception {
GroupImpl childImpl = (GroupImpl) child;
String groupId = "/" + child.getGroupName();
Connection connection = eXoDS_.getConnection();
childImpl.setParentId("/");
DBObjectQuery<GroupImpl> query = new DBObjectQuery<GroupImpl>(GroupImpl.class);
if (parent != null) {
query.addLIKE("GROUP_ID", parent.getId());
Group parentGroup = super.loadUnique(connection, query.toQuery());
groupId = parentGroup.getId() + "/" + child.getGroupName();
childImpl.setParentId(parentGroup.getId());
} else if (child.getId() != null) {
groupId = child.getId();
childImpl.setParentId("/");
}
query.getParameters().clear();
query.addLIKE("GROUP_ID", groupId);
Group o = super.loadUnique(connection, query.toQuery());
if (o != null) {
Object[] args = { child.getGroupName() };
throw new UniqueObjectException("OrganizationService.unique-group-exception", args);
}
if (broadcast)
listenerService_.broadcast("organization.group.preSave", this, childImpl);
childImpl.setId(groupId);
if (log.isDebugEnabled())
log.debug("----------ADD GROUP " + child.getId() + " into Group" + child.getParentId());
try {
if (childImpl.getDBObjectId() == -1) {
childImpl.setDBObjectId(eXoDS_.getIDGenerator().generateLongId(childImpl));
}
long id = childImpl.getDBObjectId();
execute(connection, eXoDS_.getQueryBuilder().createInsertQuery(type_, id), childImpl);
if (broadcast)
listenerService_.broadcast("organization.group.postSave", this, childImpl);
} catch (Exception e) {
throw e;
} finally {
eXoDS_.closeConnection(connection);
}
}
public Group findGroupById(String groupId) throws Exception {
DBObjectQuery<GroupImpl> query = new DBObjectQuery<GroupImpl>(GroupImpl.class);
query.addLIKE("GROUP_ID", groupId);
Group g = super.loadUnique(query.toQuery());
if (log.isDebugEnabled())
log.debug("----------FIND GROUP BY ID: " + groupId + " _ " + (g != null));
return g;
}
@SuppressWarnings("unchecked")
public Collection findGroupByMembership(String userName, String membershipType) throws Exception {
if (userName == null || membershipType == null)
return null;
MembershipHandler membershipHandler = getMembershipHandler();
List<Membership> members = (List<Membership>) membershipHandler.findMembershipsByUser(userName);
List<Group> groups = new ArrayList<Group>();
for (Membership member : members) {
if (!member.getMembershipType().equals(membershipType))
continue;
Group g = findGroupById(member.getGroupId());
if (g != null)
groups.add(g);
}
if (log.isDebugEnabled())
log.debug("----------FIND GROUP BY USERNAME AND TYPE: " + userName + " - " + membershipType
+ " - ");
return groups;
}
public Collection findGroups(Group parent) throws Exception {
String parentId = "/";
if (parent != null)
parentId = parent.getId();
DBObjectQuery<GroupImpl> query = new DBObjectQuery<GroupImpl>(GroupImpl.class);
query.addLIKE("PARENT_ID", parentId);
DBPageList<GroupImpl> pageList = new DBPageList<GroupImpl>(20, this, query);
if (log.isDebugEnabled()) {
log.debug("----------FIND GROUP BY PARENT: " + parent);
log.debug(" Size = " + pageList.getAvailable());
}
return pageList.getAll();
}
@SuppressWarnings("unchecked")
public Collection findGroupsOfUser(String user) throws Exception {
MembershipHandler membershipHandler = getMembershipHandler();
List<Membership> members = (List<Membership>) membershipHandler.findMembershipsByUser(user);
List<Group> groups = new ArrayList<Group>();
for (Membership member : members) {
Group g = findGroupById(member.getGroupId());
if (g != null && !hasGroup(groups, g))
groups.add(g);
}
if (log.isDebugEnabled())
log.debug("----------FIND GROUP BY USER: " + user + " - " + (groups != null));
return groups;
}
private boolean hasGroup(List<Group> list, Group g) {
for (Group ele : list) {
if (ele.getId().endsWith(g.getId()))
return true;
}
return false;
}
public Collection getAllGroups() throws Exception {
DBObjectQuery<GroupImpl> query = new DBObjectQuery<GroupImpl>(GroupImpl.class);
DBPageList<GroupImpl> pageList = new DBPageList<GroupImpl>(20, this, query);
return pageList.getAll();
}
public void saveGroup(Group group, boolean broadcast) throws Exception {
GroupImpl groupImpl = (GroupImpl) group;
if (broadcast)
listenerService_.broadcast(GroupHandler.PRE_UPDATE_GROUP_EVENT, this, groupImpl);
super.update(groupImpl);
if (broadcast)
listenerService_.broadcast(GroupHandler.POST_UPDATE_GROUP_EVENT, this, groupImpl);
}
public Group removeGroup(Group group, boolean broadcast) throws Exception {
GroupImpl groupImpl = (GroupImpl) group;
if (broadcast)
listenerService_.broadcast(GroupHandler.PRE_DELETE_GROUP_EVENT, this, groupImpl);
super.remove(groupImpl);
if (broadcast)
listenerService_.broadcast(GroupHandler.POST_DELETE_GROUP_EVENT, this, groupImpl);
return group;
}
@SuppressWarnings("unused")
public void addGroupEventListener(GroupEventListener listener) {
}
private MembershipHandler getMembershipHandler() {
ApplicationContainer manager = ApplicationContainer.getInstance();
OrganizationService service = (OrganizationService) manager.getComponentInstanceOfType(OrganizationService.class);
return service.getMembershipHandler();
}
}