nl.strohalm.cyclos.taglibs.ProfileTag.java Source code

Java tutorial

Introduction

Here is the source code for nl.strohalm.cyclos.taglibs.ProfileTag.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.taglibs;

import java.io.IOException;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.TagSupport;

import nl.strohalm.cyclos.entities.groups.Group;
import nl.strohalm.cyclos.entities.settings.LocalSettings;
import nl.strohalm.cyclos.entities.settings.LocalSettings.MemberResultDisplay;
import nl.strohalm.cyclos.services.elements.ElementService;
import nl.strohalm.cyclos.services.permissions.PermissionService;
import nl.strohalm.cyclos.services.settings.SettingsService;
import nl.strohalm.cyclos.utils.ElementVO;
import nl.strohalm.cyclos.utils.SpringHelper;

import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.collections.Predicate;
import org.apache.cxf.common.util.StringUtils;

/**
 * Profile tag. When the logged user has permission to view the related element, it shows the profile link. If not, it shows the name or user name
 * based on the local settings.
 * @author jcomas
 */
public class ProfileTag extends TagSupport {
    private static final long serialVersionUID = 1L;
    private Long elementId = null;
    private String text = null;
    private Integer fieldLength = TruncateTag.DEFAULT_LENGTH;
    private String pattern = null;
    private String styleClass = null;
    private boolean onlyShowLabel = false;

    private ElementService elementService;

    private PermissionService permissionService;

    private SettingsService settingsService;

    @Override
    public int doEndTag() throws JspException {
        try {
            final JspWriter out = pageContext.getOut();
            try {
                out.write(generateProfileField());
            } catch (final IOException e) {
                throw new JspException(e);
            }
        } finally {
            release();
        }
        return EVAL_PAGE;
    }

    public Long getElementId() {
        return elementId;
    }

    public Integer getFieldLength() {
        return fieldLength;
    }

    public String getPattern() {
        return pattern;
    }

    public String getStyleClass() {
        return styleClass;
    }

    public String getText() {
        return text;
    }

    public boolean isOnlyShowLabel() {
        return onlyShowLabel;
    }

    @Override
    public void release() {
        super.release();
        elementId = null;
        text = null;
        pattern = null;
        fieldLength = TruncateTag.DEFAULT_LENGTH;
        styleClass = null;
        onlyShowLabel = false;
    }

    public void setElementId(final Long elementId) {
        this.elementId = elementId;
    }

    public void setFieldLength(final Integer fieldLength) {
        this.fieldLength = fieldLength;
    }

    public void setOnlyShowLabel(final boolean onlyShowLabel) {
        this.onlyShowLabel = onlyShowLabel;
    }

    @Override
    public void setPageContext(final PageContext pageContext) {
        super.setPageContext(pageContext);
        elementService = SpringHelper.bean(pageContext.getServletContext(), ElementService.class);
        permissionService = SpringHelper.bean(pageContext.getServletContext(), PermissionService.class);
        settingsService = SpringHelper.bean(pageContext.getServletContext(), SettingsService.class);
    }

    public void setPattern(final String pattern) {
        this.pattern = pattern;
    }

    public void setStyleClass(final String styleClass) {
        this.styleClass = styleClass;
    }

    public void setText(final String text) {
        this.text = text;
    }

    private String generateProfileField() {
        if (elementId <= 0) {
            return "";
        }
        final ElementVO element = elementService.getElementVO(elementId);
        boolean canGoToProfile = false;
        final Object foundGroup = CollectionUtils.find(permissionService.getAllVisibleGroups(), new Predicate() {
            @Override
            public boolean evaluate(final Object group) {
                return ((Group) group).getId().equals(element.getGroupId());
            }
        });

        if (foundGroup != null) {
            canGoToProfile = true;
        }

        if (StringUtils.isEmpty(text)) {
            // The text will be the name or the user name based on the local settings.
            final LocalSettings localSettings = settingsService.getLocalSettings();
            final MemberResultDisplay memberResultDisplay = localSettings.getMemberResultDisplay();
            if (pattern != null) {
                text = pattern.replaceAll("username", element.getUsername()).replaceAll("name", element.getName());
            } else {
                if (memberResultDisplay == MemberResultDisplay.NAME) {
                    text = element.getName();
                } else if (memberResultDisplay == MemberResultDisplay.USERNAME) {
                    text = element.getUsername();
                }
            }
        }

        // truncate
        text = TruncateTag.truncate(text, fieldLength);

        String profile;

        if (canGoToProfile && !onlyShowLabel) {

            profile = "<a class=\"$linkClass\" $attribute=\"$id\">$text</a>";

            // $attribute, $class, $id and $text
            String linkClass = "";
            String attribute = "";
            switch (element.getNature()) {
            case ADMIN:
                linkClass = "adminProfileLink";
                attribute = "adminId";
                break;
            case MEMBER:
                linkClass = "profileLink";
                attribute = "memberId";
                break;
            case OPERATOR:
                linkClass = "operatorProfileLink";
                attribute = "operatorId";
                break;
            default:
                throw new IllegalArgumentException("Unexpected element identifier " + elementId);
            }

            if (!StringUtils.isEmpty(styleClass)) {
                linkClass += " " + styleClass;
            }

            profile = profile.replace("$linkClass", linkClass);
            profile = profile.replace("$attribute", attribute);
            profile = profile.replace("$id", elementId.toString());
            profile = profile.replace("$text", text);

        } else {
            profile = text;
        }
        return profile;
    }

}