nl.strohalm.cyclos.controls.members.SearchMembersAjaxAction.java Source code

Java tutorial

Introduction

Here is the source code for nl.strohalm.cyclos.controls.members.SearchMembersAjaxAction.java

Source

/*
This file is part of Cyclos (www.cyclos.org).
A project of the Social Trade Organisation (www.socialtrade.org).
    
Cyclos is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
    
Cyclos 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 General Public License for more details.
    
You should have received a copy of the GNU General Public License
along with Cyclos; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
    
 */
package nl.strohalm.cyclos.controls.members;

import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Map;

import nl.strohalm.cyclos.controls.ActionContext;
import nl.strohalm.cyclos.controls.BaseAjaxAction;
import nl.strohalm.cyclos.entities.groups.MemberGroup;
import nl.strohalm.cyclos.entities.members.Element;
import nl.strohalm.cyclos.entities.members.Member;
import nl.strohalm.cyclos.entities.members.MemberQuery;
import nl.strohalm.cyclos.entities.settings.LocalSettings;
import nl.strohalm.cyclos.services.elements.BrokerQuery;
import nl.strohalm.cyclos.utils.EntityHelper;
import nl.strohalm.cyclos.utils.binding.BeanBinder;
import nl.strohalm.cyclos.utils.binding.BeanCollectionBinder;
import nl.strohalm.cyclos.utils.binding.DataBinder;
import nl.strohalm.cyclos.utils.binding.DataBinderHelper;
import nl.strohalm.cyclos.utils.binding.PropertyBinder;

import org.apache.commons.lang.ArrayUtils;

/**
 * Searches members and returns the list as an JSON
 * @author luis
 */
public class SearchMembersAjaxAction extends BaseAjaxAction {

    private DataBinder<?> dataBinder;
    private DataBinder<?> dataBinderWithMaxScheduledPayments;

    public DataBinder<?> getDataBinder() {
        if (dataBinder == null) {
            dataBinder = BeanCollectionBinder.instance(DataBinderHelper.simpleElementBinder());
        }
        return dataBinder;
    }

    public DataBinder<?> getDataBinderWithMaxScheduledPayments() {
        if (dataBinderWithMaxScheduledPayments == null) {
            final BeanBinder<Map<String, Object>> elementBinder = DataBinderHelper.simpleElementBinder();
            elementBinder.registerBinder("maxScheduledPayments",
                    PropertyBinder.instance(int.class, "group.memberSettings.maxSchedulingPayments"));
            dataBinderWithMaxScheduledPayments = BeanCollectionBinder.instance(elementBinder);
        }
        return dataBinderWithMaxScheduledPayments;
    }

    @Override
    protected ContentType contentType() {
        return ContentType.JSON;
    }

    @Override
    protected void renderContent(final ActionContext context) throws Exception {
        final LocalSettings localSettings = settingsService.getLocalSettings();
        final SearchMembersAjaxForm form = context.getForm();
        final MemberQuery memberQuery = form.isBrokers() ? new BrokerQuery() : new MemberQuery();
        memberQuery.setViewableGroup(form.getViewableGroup());
        if (form.isEnabled()) {
            memberQuery.setEnabled(form.isEnabled());
        }
        memberQuery.setExcludeRemoved(true);
        memberQuery.limitResults(localSettings.getMaxAjaxResults());
        memberQuery.setName(form.getName());
        memberQuery.setUsername(form.getUsername());
        // Search only brokered users
        if (context.isBroker()) {
            if (form.isBrokered()) {
                final Member broker = (Member) context.getElement();
                memberQuery.setBroker(broker);
            }
        }
        Element exclude;
        if (form.getExclude() != null) {
            // When specifying a member to exclude from search, apply it...
            exclude = EntityHelper.reference(Element.class, form.getExclude());
        } else {
            // ... otherwise, exclude the logged member himself
            if (context.isOperator()) {
                exclude = (Element) context.getAccountOwner();
            } else {
                exclude = context.getElement();
            }
        }
        memberQuery.setExcludeElements(Collections.singleton(exclude));
        if (form.isMaxScheduledPayments()) {
            memberQuery.fetch(Element.Relationships.GROUP);
        }
        final Collection<MemberGroup> groups = resolveGroups(context);
        memberQuery.setGroups(groups);
        final List<? extends Element> members = elementService.search(memberQuery);
        final String json = (form.isMaxScheduledPayments() ? getDataBinderWithMaxScheduledPayments()
                : getDataBinder()).readAsString(members);
        responseHelper.writeJSON(context.getResponse(), json);
    }

    /**
     * Resolves the possible groups for the logged user to see
     */
    private Collection<MemberGroup> resolveGroups(final ActionContext context) {
        // Ensure that only normal groups (not removed) are used
        Collection<MemberGroup> groups = null;
        final SearchMembersAjaxForm form = context.getForm();
        if (ArrayUtils.isNotEmpty(form.getGroupIds())) {
            groups = new HashSet<MemberGroup>();
            for (final Long id : form.getGroupIds()) {
                if (id > 0) {
                    groups.add((MemberGroup) groupService.load(id));
                }
            }
        }
        return groups;
    }
}