001/*
002 *  Copyright 2021 Anyware Services
003 *
004 *  Licensed under the Apache License, Version 2.0 (the "License");
005 *  you may not use this file except in compliance with the License.
006 *  You may obtain a copy of the License at
007 *
008 *      http://www.apache.org/licenses/LICENSE-2.0
009 *
010 *  Unless required by applicable law or agreed to in writing, software
011 *  distributed under the License is distributed on an "AS IS" BASIS,
012 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 *  See the License for the specific language governing permissions and
014 *  limitations under the License.
015 */
016package org.ametys.plugins.workspaces.members;
017
018import java.io.IOException;
019import java.util.List;
020
021import org.apache.avalon.framework.service.ServiceException;
022import org.apache.avalon.framework.service.ServiceManager;
023import org.apache.cocoon.ProcessingException;
024import org.apache.cocoon.environment.ObjectModelHelper;
025import org.apache.cocoon.environment.Request;
026import org.apache.cocoon.generation.ServiceableGenerator;
027import org.apache.cocoon.xml.XMLUtils;
028import org.apache.commons.lang3.LocaleUtils;
029import org.xml.sax.SAXException;
030
031import org.ametys.cms.contenttype.ContentTypesHelper;
032import org.ametys.cms.repository.Content;
033import org.ametys.plugins.workspaces.WorkspacesConstants;
034import org.ametys.plugins.workspaces.catalog.CatalogSiteType;
035import org.ametys.runtime.model.View;
036import org.ametys.web.WebHelper;
037import org.ametys.web.repository.site.Site;
038import org.ametys.web.repository.site.SiteManager;
039
040/**
041 * Sax a list of related members with the current member content
042 *
043 */
044public class RelatedMembersGenerator extends ServiceableGenerator
045{
046    private MemberHelper _memberHelper;
047    private ContentTypesHelper _contentTypeHelper;
048    private SiteManager _siteManager;
049
050    @Override
051    public void service(ServiceManager smanager) throws ServiceException
052    {
053        super.service(smanager);
054        _memberHelper = (MemberHelper) smanager.lookup(MemberHelper.ROLE);
055        _contentTypeHelper = (ContentTypesHelper) manager.lookup(ContentTypesHelper.ROLE);
056        _siteManager = (SiteManager) manager.lookup(SiteManager.ROLE);
057    }
058
059    public void generate() throws IOException, SAXException, ProcessingException
060    {
061        contentHandler.startDocument();
062        XMLUtils.startElement(contentHandler, "related-members");
063        
064        Request request = ObjectModelHelper.getRequest(objectModel);
065
066        if (_isCatalogSite(request)) // Related members are only used in catalog sites, do not search for related members in non-catalog sites to avoid performance issue
067        {
068            Content content = (Content) request.getAttribute(Content.class.getName());
069            
070            try
071            {
072                List<Content> relatedMembers = _memberHelper.getRelatedMembers(content, 6);
073                for (Content relatedMember : relatedMembers)
074                {
075                    View view = _contentTypeHelper.getView("abstract", new String[] {WorkspacesConstants.MEMBER_CONTENT_TYPE_ID}, new String[0]);
076                    relatedMember.toSAX(contentHandler, LocaleUtils.toLocale(content.getLanguage()), view, false);
077                }
078            }
079            catch (Exception e)
080            {
081                getLogger().error("Failed to search related members with common skills and keywords", e);
082            }
083        }
084        
085        XMLUtils.endElement(contentHandler, "related-members");
086        contentHandler.endDocument();
087    }
088    
089    private boolean _isCatalogSite(Request request)
090    {
091        String siteName = WebHelper.getSiteName(request);
092        Site site = _siteManager.getSite(siteName);
093        return site != null && CatalogSiteType.TYPE_ID.equals(site.getType());
094    }
095}