001/* 002 * Copyright 2010 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.newsletter.generators; 017 018import java.io.IOException; 019import java.util.Set; 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.xml.XMLUtils; 027import org.apache.commons.lang3.StringUtils; 028import org.xml.sax.SAXException; 029 030import org.ametys.core.user.CurrentUserProvider; 031import org.ametys.core.user.User; 032import org.ametys.core.user.UserIdentity; 033import org.ametys.core.user.UserManager; 034import org.ametys.plugins.core.user.UserHelper; 035import org.ametys.plugins.newsletter.category.Category; 036import org.ametys.plugins.newsletter.category.CategoryGenerator; 037import org.ametys.plugins.newsletter.category.CategoryProvider; 038import org.ametys.web.WebConstants; 039import org.ametys.web.cache.PageHelper; 040import org.ametys.web.repository.page.Page; 041import org.ametys.web.repository.page.ZoneItem; 042import org.ametys.web.repository.page.ZoneItemException; 043import org.ametys.web.site.SiteConfigurationExtensionPoint; 044 045/** 046 * Newsletter service 047 * 048 */ 049public class NewsletterServiceGenerator extends CategoryGenerator 050{ 051 /** The site configuration */ 052 protected SiteConfigurationExtensionPoint _siteConfiguration; 053 /** The user manager */ 054 protected UserManager _userManager; 055 /** The user helper */ 056 protected UserHelper _userHelper; 057 /** Page helper */ 058 protected PageHelper _pageHelper; 059 /** The current user provider */ 060 protected CurrentUserProvider _currentUserProvider; 061 062 @Override 063 public void service(ServiceManager smanager) throws ServiceException 064 { 065 super.service(smanager); 066 _siteConfiguration = (SiteConfigurationExtensionPoint) smanager.lookup(SiteConfigurationExtensionPoint.ROLE); 067 _userManager = (UserManager) smanager.lookup(UserManager.ROLE); 068 _userHelper = (UserHelper) smanager.lookup(UserHelper.ROLE); 069 _pageHelper = (PageHelper) smanager.lookup(PageHelper.ROLE); 070 _currentUserProvider = (CurrentUserProvider) smanager.lookup(CurrentUserProvider.ROLE); 071 } 072 073 @Override 074 public void generate() throws IOException, SAXException, ProcessingException 075 { 076 Request request = ObjectModelHelper.getRequest(objectModel); 077 ZoneItem zoneItem = (ZoneItem) request.getAttribute(WebConstants.REQUEST_ATTR_ZONEITEM); 078 079 contentHandler.startDocument(); 080 XMLUtils.startElement(contentHandler, "NewsletterService"); 081 082 if (zoneItem != null) 083 { 084 XMLUtils.startElement(contentHandler, "Categories"); 085 String[] categoryIDs = zoneItem.getServiceParameters().getValueOrDefault("categories", StringUtils.EMPTY).split(","); 086 Set<String> ids = _categoryProviderEP.getExtensionsIds(); 087 088 for (String categoryID : categoryIDs) 089 { 090 boolean found = false; 091 092 for (String id : ids) 093 { 094 CategoryProvider provider = _categoryProviderEP.getExtension(id); 095 if (provider.hasCategory(categoryID)) 096 { 097 Category category = provider.getCategory(categoryID); 098 saxCategory (provider, category, true, false); 099 found = true; 100 break; 101 } 102 } 103 104 if (!found) 105 { 106 throw new ZoneItemException("The newsletter category with id '" + categoryID + "' was not found"); 107 } 108 } 109 XMLUtils.endElement(contentHandler, "Categories"); 110 } 111 112 XMLUtils.startElement(contentHandler, "FormResult"); 113 // SAX message 114 String msg = parameters.getParameter("msg", ""); 115 if (msg.length() != 0) 116 { 117 XMLUtils.createElement(contentHandler, "msg", msg); 118 } 119 120 String email = parameters.getParameter("email", ""); 121 if (email.length() != 0) 122 { 123 XMLUtils.createElement(contentHandler, "email", email); 124 } 125 126 String[] ids = parameters.getParameter("subscribeTo", "").split(","); 127 for (String id : ids) 128 { 129 if (id.length() > 0) 130 { 131 XMLUtils.createElement(contentHandler, "subscribeTo", id); 132 } 133 } 134 135 ids = parameters.getParameter("alreadySubscribeTo", "").split(","); 136 for (String id : ids) 137 { 138 if (id.length() > 0) 139 { 140 XMLUtils.createElement(contentHandler, "alreadySubscribeTo", id); 141 } 142 143 } 144 145 Page page = (Page) request.getAttribute(Page.class.getName()); 146 XMLUtils.createElement(contentHandler, "has-captcha", String.valueOf(_pageHelper.isCaptchaRequired(page))); 147 148 XMLUtils.endElement(contentHandler, "FormResult"); 149 150 _saxInfoUser(); 151 152 XMLUtils.endElement(contentHandler, "NewsletterService"); 153 contentHandler.endDocument(); 154 } 155 156 private void _saxInfoUser() throws SAXException 157 { 158 UserIdentity userIdentity = _currentUserProvider.getUser(); 159 if (userIdentity != null) 160 { 161 User user = _userManager.getUser(userIdentity); 162 _userHelper.saxUser(user, contentHandler); 163 } 164 } 165 166 167}