/*
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.pending;
import java.util.Iterator;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import nl.strohalm.cyclos.access.AdminMemberPermission;
import nl.strohalm.cyclos.access.BrokerPermission;
import nl.strohalm.cyclos.annotations.Inject;
import nl.strohalm.cyclos.controls.ActionContext;
import nl.strohalm.cyclos.controls.BaseFormAction;
import nl.strohalm.cyclos.entities.customization.fields.CustomField;
import nl.strohalm.cyclos.entities.customization.fields.MemberCustomField;
import nl.strohalm.cyclos.entities.customization.fields.MemberCustomFieldValue;
import nl.strohalm.cyclos.entities.members.Member;
import nl.strohalm.cyclos.entities.members.PendingMember;
import nl.strohalm.cyclos.services.customization.MemberCustomFieldService;
import nl.strohalm.cyclos.utils.ActionHelper;
import nl.strohalm.cyclos.utils.CustomFieldHelper;
import nl.strohalm.cyclos.utils.binding.BeanBinder;
import nl.strohalm.cyclos.utils.binding.BeanCollectionBinder;
import nl.strohalm.cyclos.utils.binding.PropertyBinder;
import nl.strohalm.cyclos.utils.conversion.HtmlConverter;
import nl.strohalm.cyclos.utils.conversion.ReferenceConverter;
import nl.strohalm.cyclos.utils.validation.ValidationException;
import org.apache.struts.action.ActionForward;
/**
* Action used to view / edit a pending member profile
*
* @author luis
*/
public class PendingMemberProfileAction extends BaseFormAction {
private MemberCustomFieldService memberCustomFieldService;
private BeanBinder<PendingMember> dataBinder;
private CustomFieldHelper customFieldHelper;
public BeanBinder<PendingMember> getDataBinder() {
if (dataBinder == null) {
final BeanBinder<MemberCustomFieldValue> customValueBinder = BeanBinder.instance(MemberCustomFieldValue.class);
customValueBinder.registerBinder("field", PropertyBinder.instance(CustomField.class, "field", ReferenceConverter.instance(CustomField.class)));
customValueBinder.registerBinder("value", PropertyBinder.instance(String.class, "value", HtmlConverter.instance()));
customValueBinder.registerBinder("hidden", PropertyBinder.instance(Boolean.TYPE, "hidden"));
final BeanBinder<PendingMember> binder = BeanBinder.instance(PendingMember.class);
binder.registerBinder("id", PropertyBinder.instance(Long.class, "id"));
binder.registerBinder("username", PropertyBinder.instance(String.class, "username"));
binder.registerBinder("name", PropertyBinder.instance(String.class, "name"));
binder.registerBinder("broker", PropertyBinder.instance(Member.class, "broker"));
binder.registerBinder("email", PropertyBinder.instance(String.class, "email"));
binder.registerBinder("hideEmail", PropertyBinder.instance(Boolean.TYPE, "hideEmail"));
binder.registerBinder("customValues", BeanCollectionBinder.instance(customValueBinder, "customValues"));
dataBinder = binder;
}
return dataBinder;
}
@Inject
public void setCustomFieldHelper(final CustomFieldHelper customFieldHelper) {
this.customFieldHelper = customFieldHelper;
}
@Inject
public void setMemberCustomFieldService(final MemberCustomFieldService memberCustomFieldService) {
this.memberCustomFieldService = memberCustomFieldService;
}
@Override
protected ActionForward handleSubmit(final ActionContext context) throws Exception {
final PendingMemberProfileForm form = context.getForm();
PendingMember pendingMember = elementService.loadPendingMember(form.getPendingMemberId());
getDataBinder().readInto(pendingMember, form.getPendingMember(), true);
if (context.isBroker()) {
final Member loggedBroker = context.getElement();
pendingMember.setBroker(loggedBroker);
}
pendingMember = elementService.update(pendingMember);
context.sendMessage("pendingMember.updated");
return ActionHelper.redirectWithParam(context.getRequest(), context.getSuccessForward(), "pendingMemberId", pendingMember.getId());
}
@Override
protected void prepareForm(final ActionContext context) throws Exception {
final HttpServletRequest request = context.getRequest();
final PendingMemberProfileForm form = context.getForm();
final long id = form.getPendingMemberId();
if (id <= 0L) {
throw new ValidationException();
}
final PendingMember pendingMember = elementService.loadPendingMember(id, PendingMember.Relationships.values());
request.setAttribute("pendingMember", pendingMember);
final List<MemberCustomField> customFields = customFieldHelper.onlyForGroup(memberCustomFieldService.list(), pendingMember.getMemberGroup());
for (final Iterator<MemberCustomField> iterator = customFields.iterator(); iterator.hasNext();) {
final MemberCustomField customField = iterator.next();
if (!customField.getVisibilityAccess().granted(context.getGroup(), false, context.isBroker(), true, false)) {
iterator.remove();
}
}
request.setAttribute("customFields", customFieldHelper.buildEntries(customFields, pendingMember.getCustomValues()));
boolean editable = false;
if (context.isAdmin()) {
editable = permissionService.hasPermission(AdminMemberPermission.MEMBERS_MANAGE_PENDING);
} else if (context.isBroker()) {
editable = permissionService.hasPermission(BrokerPermission.MEMBERS_MANAGE_PENDING);
}
request.setAttribute("editable", editable);
}
@Override
protected void validateForm(final ActionContext context) {
final PendingMemberProfileForm form = context.getForm();
final PendingMember pendingMember = getDataBinder().readFromString(form.getPendingMember());
elementService.validate(pendingMember);
}
}