001/* 002 * Copyright 2017 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.linkdirectory.dynamic; 017 018import java.io.IOException; 019import java.util.Arrays; 020import java.util.List; 021 022import org.apache.avalon.framework.service.ServiceException; 023import org.apache.avalon.framework.service.ServiceManager; 024import org.apache.cocoon.ProcessingException; 025import org.apache.cocoon.environment.ObjectModelHelper; 026import org.apache.cocoon.environment.Request; 027import org.apache.cocoon.generation.ServiceableGenerator; 028import org.apache.cocoon.xml.XMLUtils; 029import org.apache.commons.lang3.StringUtils; 030import org.xml.sax.SAXException; 031 032import org.ametys.core.user.CurrentUserProvider; 033import org.ametys.plugins.linkdirectory.DirectoryHelper; 034import org.ametys.plugins.linkdirectory.repository.DefaultLink; 035 036/** 037 * This generator sax the dynamic information provided by {@link DynamicInformationProvider}s 038 */ 039public class DynamicInformationGenerator extends ServiceableGenerator 040{ 041 private DirectoryHelper _directoryHelper; 042 private DynamicInformationProviderExtensionPoint _dynamicInfoExtensionPoint; 043 private CurrentUserProvider _currentUserProvider; 044 045 @Override 046 public void service(ServiceManager serviceManager) throws ServiceException 047 { 048 super.service(serviceManager); 049 _directoryHelper = (DirectoryHelper) serviceManager.lookup(DirectoryHelper.ROLE); 050 _dynamicInfoExtensionPoint = (DynamicInformationProviderExtensionPoint) serviceManager.lookup(DynamicInformationProviderExtensionPoint.ROLE); 051 _currentUserProvider = (CurrentUserProvider) serviceManager.lookup(CurrentUserProvider.ROLE); 052 } 053 054 @Override 055 public void generate() throws IOException, SAXException, ProcessingException 056 { 057 Request request = ObjectModelHelper.getRequest(objectModel); 058 int maxItems = Integer.valueOf(request.getParameter("maxItems")); 059 060 String[] themeIds = request.getParameter("themes") != null ? request.getParameter("themes").split(",") : new String[0]; 061 String siteName = request.getParameter("site"); 062 String lang = request.getParameter("lang"); 063 064 List<DefaultLink> links = _directoryHelper.getLinks(Arrays.asList(themeIds), _currentUserProvider.getUser(), siteName, lang); 065 066 contentHandler.startDocument(); 067 XMLUtils.startElement(contentHandler, "dynamic-information"); 068 for (DefaultLink defaultLink : links) 069 { 070 String extensionId = defaultLink.getDynamicInformationProvider(); 071 if (StringUtils.isNotBlank(extensionId)) 072 { 073 DynamicInformationProvider provider = _dynamicInfoExtensionPoint.getExtension(extensionId); 074 if (provider != null) 075 { 076 String linkId = defaultLink.getId(); 077 try 078 { 079 provider.saxDynamicInformation(contentHandler, linkId, siteName, lang, maxItems); 080 } 081 catch (Exception e) 082 { 083 getLogger().error("Unable to sax dynamic information from provider of id '" + provider.getId() + "'", e); 084 } 085 } 086 } 087 } 088 XMLUtils.endElement(contentHandler, "dynamic-information"); 089 contentHandler.endDocument(); 090 } 091}