Package org.exoplatform.services.organization.hibernate

Source Code of org.exoplatform.services.organization.hibernate.GroupDAOImpl

/*
* 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.exoplatform.services.organization.hibernate;

import org.exoplatform.commons.exception.UniqueObjectException;
import org.exoplatform.commons.utils.SecurityHelper;
import org.exoplatform.services.database.HibernateService;
import org.exoplatform.services.organization.Group;
import org.exoplatform.services.organization.GroupEventListener;
import org.exoplatform.services.organization.GroupEventListenerHandler;
import org.exoplatform.services.organization.GroupHandler;
import org.exoplatform.services.organization.impl.GroupImpl;
import org.exoplatform.services.security.PermissionConstants;
import org.hibernate.Query;
import org.hibernate.Session;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
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 GroupDAOImpl implements GroupHandler, GroupEventListenerHandler
{
   public static final String queryFindGroupByName =
      "from g in class org.exoplatform.services.organization.impl.GroupImpl where g.groupName = :id ";

   public static final String queryFindGroupById =
      "from g in class org.exoplatform.services.organization.impl.GroupImpl where g.id = :id ";

   public static final String queryFindGroupByParent =
      "from g in class org.exoplatform.services.organization.impl.GroupImpl where g.parentId = :parentid ";

   public static final String queryFindCountGroupByParent = "select count(*)"
      + "from g in class org.exoplatform.services.organization.impl.GroupImpl where g.parentId = :parentid ";

   private static final String queryFindRootGroups =
      "from g in class org.exoplatform.services.organization.impl.GroupImpl where g.parentId is null";

   private static final String queryFindGroupsOfUser = "select distinct g "
      + "from g in class org.exoplatform.services.organization.impl.GroupImpl, "
      + "     m in class org.exoplatform.services.organization.impl.MembershipImpl "
      + "where m.groupId = g.id and m.userName = :username";

   private static final String queryFindGroupByMembership = "select g "
      + "from m in class org.exoplatform.services.organization.impl.MembershipImpl, "
      + "     g in class org.exoplatform.services.organization.impl.GroupImpl "
      + "where m.groupId = g.id and m.userName = :username and m.membershipType = :membershiptype ";

   private static final String queryGetAllGroups =
      "from g in class org.exoplatform.services.organization.impl.GroupImpl";

   private HibernateService service_;

   private List<GroupEventListener> listeners_;

   public GroupDAOImpl(HibernateService service)
   {
      service_ = service;
      listeners_ = new ArrayList<GroupEventListener>();
   }

   /**
    * {@inheritDoc}
    */
   public void addGroupEventListener(GroupEventListener listener)
   {
      SecurityHelper.validateSecurityPermission(PermissionConstants.MANAGE_LISTENERS);
      listeners_.add(listener);
   }

   /**
    * {@inheritDoc}
    */
   public void removeGroupEventListener(GroupEventListener listener)
   {
      SecurityHelper.validateSecurityPermission(PermissionConstants.MANAGE_LISTENERS);
      listeners_.remove(listener);
   }

   /**
    * {@inheritDoc}
    */
   final public Group createGroupInstance()
   {
      return new GroupImpl();
   }

   /**
    * {@inheritDoc}
    */
   public void createGroup(Group group, boolean broadcast) throws Exception
   {
      addChild(null, group, broadcast);
   }

   /**
    * {@inheritDoc}
    */
   public void addChild(Group parent, Group child, boolean broadcast) throws Exception
   {
      String groupId = "/" + child.getGroupName();
      GroupImpl childImpl = (GroupImpl)child;
      if (parent != null)
      {
         Group parentGroup = findGroupById(parent.getId());
         if (parentGroup == null)
         {
            throw new InvalidNameException("Can't add node to not existed parent " + parent.getId());
         }

         groupId = parentGroup.getId() + "/" + child.getGroupName();
         childImpl.setParentId(parentGroup.getId());
      }
      else if (child.getId() != null)
      {
         groupId = child.getId();
      }

      Object o = findGroupById(groupId);
      if (o != null)
      {
         Object[] args = {child.getGroupName()};
         throw new UniqueObjectException("OrganizationService.unique-group-exception", args);
      }
      childImpl.setId(groupId);

      if (broadcast)
         preSave(child, true);

      Session session = service_.openSession();
      session.save(childImpl);
      session.flush();

      if (broadcast)
         postSave(child, true);
   }

   /**
    * {@inheritDoc}
    */
   public void saveGroup(Group group, boolean broadcast) throws Exception
   {
      if (broadcast)
         preSave(group, false);

      Session session = service_.openSession();
      session.update(group);
      session.flush();

      if (broadcast)
         postSave(group, false);
   }

   private boolean hasChildrenGroups(Group parent) throws Exception
   {
      Session session = service_.openSession();
      long countChildrenGroup =
         (Long)session.createQuery(queryFindCountGroupByParent).setString("parentid", parent.getId()).list().get(0);

      return countChildrenGroup > 0;
   }

   /**
    * {@inheritDoc}
    */
   public Group removeGroup(Group group, boolean broadcast) throws Exception
   {
      if (broadcast)
         preDelete(group);
      Session session = service_.openSession();

      if (session.get(group.getClass(), group.getId()) == null)
      {
         throw new InvalidNameException("Can not remove group " + group.getGroupName()
            + "record, because group does not exist.");
      }

      if (hasChildrenGroups(group))
      {
         throw new IllegalStateException("Group " + group.getGroupName() + " has at least one child group");
      }
      session.delete(group);

      MembershipDAOImpl.removeMembershipEntriesOfGroup(group, session);
      session.flush();

      if (broadcast)
         postDelete(group);

      return group;
   }

   /**
    * {@inheritDoc}
    */
   public Collection<?> findGroupByMembership(String userName, String membershipType) throws Exception
   {
      Session session = service_.openSession();
      Query q =
         session.createQuery(queryFindGroupByMembership).setString("username", userName)
            .setString("membershiptype", membershipType);
      List<?> groups = q.list();
      return groups;
   }

   /**
    * {@inheritDoc}
    */
   public Group findGroupByName(String groupName) throws Exception
   {
      Session session = service_.openSession();
      Group group = (Group)service_.findOne(session, queryFindGroupByName, groupName);
      return group;
   }

   /**
    * {@inheritDoc}
    */
   public Group findGroupById(String groupId) throws Exception
   {
      Session session = service_.openSession();
      Group group = (Group)service_.findOne(session, queryFindGroupById, groupId);
      return group;
   }

   /**
    * {@inheritDoc}
    */
   public Collection<?> findGroups(Group parent) throws Exception
   {
      Session session = service_.openSession();
      if (parent == null)
         return session.createQuery(queryFindRootGroups).list();
      return session.createQuery(queryFindGroupByParent).setString("parentid", parent.getId()).list();

   }

   /**
    * {@inheritDoc}
    */
   public Collection<?> findGroupsOfUser(String user) throws Exception
   {
      Session session = service_.openSession();
      return session.createQuery(queryFindGroupsOfUser).setString("username", user).list();
   }

   /**
    * {@inheritDoc}
    */
   public Collection<?> getAllGroups() throws Exception
   {
      Session session = service_.openSession();
      Query q = session.createQuery(queryGetAllGroups);
      List<?> groups = q.list();
      return groups;
   }

   private void preSave(Group group, boolean isNew) throws Exception
   {
      for (GroupEventListener listener : listeners_)
         listener.preSave(group, isNew);
   }

   private void postSave(Group group, boolean isNew) throws Exception
   {
      for (GroupEventListener listener : listeners_)
         listener.postSave(group, isNew);
   }

   private void preDelete(Group group) throws Exception
   {
      for (GroupEventListener listener : listeners_)
         listener.preDelete(group);
   }

   private void postDelete(Group group) throws Exception
   {
      for (GroupEventListener listener : listeners_)
         listener.postDelete(group);
   }

   /**
    * {@inheritDoc}
    */
   public List<GroupEventListener> getGroupListeners()
   {
      return Collections.unmodifiableList(listeners_);
   }
}
TOP

Related Classes of org.exoplatform.services.organization.hibernate.GroupDAOImpl

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