Package org.eurekastreams.server.persistence.mappers

Source Code of org.eurekastreams.server.persistence.mappers.GetPendingDomainGroupsMapper

/*
* Copyright (c) 2009-2011 Lockheed Martin Corporation
*
* Licensed 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.eurekastreams.server.persistence.mappers;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import org.eurekastreams.commons.hibernate.ModelViewResultTransformer;
import org.eurekastreams.server.domain.DomainGroup;
import org.eurekastreams.server.domain.PagedSet;
import org.eurekastreams.server.persistence.mappers.requests.GetPendingDomainGroupsRequest;
import org.eurekastreams.server.search.factories.DomainGroupModelViewFactory;
import org.eurekastreams.server.search.modelview.DomainGroupModelView;
import org.eurekastreams.server.search.modelview.PersonModelView;
import org.hibernate.Criteria;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.ProjectionList;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;

/**
* The get pending groups action mapper - gets pending groups from the DB. Keep in mind that pending groups aren't
* cached.
*/
public class GetPendingDomainGroupsMapper extends
        BaseArgDomainMapper<GetPendingDomainGroupsRequest, PagedSet<DomainGroupModelView>>
{
    /**
     * Mapper to get people by IDs, using cache.
     */
    private DomainMapper<List<Long>, List<PersonModelView>> getPeopleByIdsMapper;
   
    /**
     * Max pending groups.
     */
    private static final int MAX_RESULTS = 10;


    /**
     * Execute getting the groups pending for an org.
     *
     * @param inRequest
     *            the request for the data.
     * @return A pageset of Groups pending for the Org in the request.
     */
    @SuppressWarnings("unchecked")
    @Override
    public PagedSet<DomainGroupModelView> execute(final GetPendingDomainGroupsRequest inRequest)
    {
        // create our query
        Criteria criteria = getHibernateSession().createCriteria(DomainGroup.class);

        // tell hibernate which fields we want back
        ProjectionList fields = Projections.projectionList();

        fields.add(getColumn("id"));
        fields.add(getColumn("shortName"));
        fields.add(getColumn("name"));
        fields.add(getColumn("description"));
        fields.add(Projections.property("publicGroup").as("isPublic"));

        fields.add(Projections.property("createdBy.id").as("personCreatedById"));

        fields.add(getColumn("dateAdded"));

        criteria.setProjection(fields);

        // add restrictions (where clauses)

        // pending groups
        criteria.add(Restrictions.eq("isPending", true));

        // set the sort order
        criteria.addOrder(Order.asc("dateAdded"));

        // set the result transformer - transforms tuples into
        // DomainGroupModelViews
        ModelViewResultTransformer<DomainGroupModelView> resultTransformer;
        resultTransformer = new ModelViewResultTransformer<DomainGroupModelView>(new DomainGroupModelViewFactory());
        criteria.setResultTransformer(resultTransformer);

        //The First result sets the start row offset for the dataset
        //The Max result denotes the no. of rows fetched from the dataset
        criteria.setFirstResult(inRequest.getPageStart());
        criteria.setMaxResults(MAX_RESULTS);

        // get the results
        List<DomainGroupModelView> results = criteria.list();

        // populate info from the cache
        populateCachedFields(results);

        // Get Total Row Count
        Criteria rowCountCriteria = getHibernateSession().createCriteria(DomainGroup.class);
        rowCountCriteria.setProjection(Projections.rowCount());
        rowCountCriteria.add(Restrictions.eq("isPending", true));

        // Create Page Set
        PagedSet<DomainGroupModelView> pagedSet = new PagedSet<DomainGroupModelView>();
        pagedSet.setPagedSet(results);
        pagedSet.setFromIndex(inRequest.getPageStart());
        pagedSet.setToIndex(inRequest.getPageStart() + results.size() - 1);
        pagedSet.setTotal((Integer) rowCountCriteria.list().get(0));

        return pagedSet;

    }

    /**
     * Populate the rest of the model view object with data from the cache.
     *
     * @param inResults
     *            The groups to populate with extra data.
     */
    private void populateCachedFields(final List<DomainGroupModelView> inResults)
    {
        // loop over the results to collect all of the people we need to ask cache for
        List<Long> peopleIdsToFetch = new ArrayList<Long>();
        for (DomainGroupModelView result : inResults)
        {
            if (!peopleIdsToFetch.contains(result.getPersonCreatedById()))
            {
                peopleIdsToFetch.add(result.getPersonCreatedById());
            }
        }

        // fetch the people
        List<PersonModelView> people = getPeopleByIdsMapper.execute(peopleIdsToFetch);

        // put them in a map for lookup
        HashMap<Long, PersonModelView> peopleByIdMap = new HashMap<Long, PersonModelView>();
        for (PersonModelView person : people)
        {
            peopleByIdMap.put(person.getEntityId(), person);
        }

        for (DomainGroupModelView result : inResults)
        {
            if (result.getPersonCreatedById() != null)
            {
                PersonModelView person = peopleByIdMap.get(result.getPersonCreatedById());
                result.setPersonCreatedByAccountId(person.getAccountId());
                result.setPersonCreatedByDisplayName(person.getDisplayName());
                result.setPersonCreatedByCompanyName(person.getCompanyName());
            }
        }
    }

    /**
     * @param inGetPeopleByIdsMapper
     *            the getPeopleByIdsMapper to set
     */
    public void setGetPeopleByIdsMapper(final DomainMapper<List<Long>, List<PersonModelView>> inGetPeopleByIdsMapper)
    {
        getPeopleByIdsMapper = inGetPeopleByIdsMapper;
    }
}
TOP

Related Classes of org.eurekastreams.server.persistence.mappers.GetPendingDomainGroupsMapper

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.