001/* 002 * Copyright 2013 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.cart.generators; 017 018import java.io.IOException; 019import java.util.HashMap; 020import java.util.List; 021import java.util.Map; 022 023import org.apache.avalon.framework.service.ServiceException; 024import org.apache.avalon.framework.service.ServiceManager; 025import org.apache.cocoon.ProcessingException; 026import org.apache.cocoon.components.source.impl.SitemapSource; 027import org.apache.cocoon.environment.ObjectModelHelper; 028import org.apache.cocoon.environment.Request; 029import org.apache.cocoon.generation.ServiceableGenerator; 030import org.apache.cocoon.xml.AttributesImpl; 031import org.apache.cocoon.xml.XMLUtils; 032import org.apache.excalibur.source.SourceResolver; 033import org.xml.sax.SAXException; 034 035import org.ametys.core.user.CurrentUserProvider; 036import org.ametys.core.user.User; 037import org.ametys.core.user.UserIdentity; 038import org.ametys.core.user.UserManager; 039import org.ametys.core.util.DateUtils; 040import org.ametys.core.util.IgnoreRootHandler; 041import org.ametys.core.util.JSONUtils; 042import org.ametys.core.util.URIUtils; 043import org.ametys.plugins.cart.Cart; 044import org.ametys.plugins.cart.CartElement; 045import org.ametys.plugins.cart.CartsDAO; 046import org.ametys.plugins.cart.ContentElement; 047import org.ametys.plugins.cart.QueryElement; 048import org.ametys.plugins.cart.ResourceElement; 049import org.ametys.plugins.repository.AmetysObjectResolver; 050import org.ametys.runtime.i18n.I18nizableText; 051 052/** 053 * SAX elements of a cart 054 */ 055public class CartElementDetailsGenerator extends ServiceableGenerator 056{ 057 /** The Ametys object resolver */ 058 protected AmetysObjectResolver _resolver; 059 /** The current user provider */ 060 protected CurrentUserProvider _userProvider; 061 /** The Json utils */ 062 private JSONUtils _jsonUtils; 063 /** The source resolver */ 064 private SourceResolver _sourceResolver; 065 /** The user manager */ 066 private UserManager _userManager; 067 /** The carts DAO */ 068 private CartsDAO _cartsDAO; 069 070 @Override 071 public void service(ServiceManager smanager) throws ServiceException 072 { 073 super.service(smanager); 074 _resolver = (AmetysObjectResolver) smanager.lookup(AmetysObjectResolver.ROLE); 075 _jsonUtils = (JSONUtils) manager.lookup(JSONUtils.ROLE); 076 _sourceResolver = (SourceResolver) manager.lookup(SourceResolver.ROLE); 077 _userManager = (UserManager) smanager.lookup(UserManager.ROLE); 078 _userProvider = (CurrentUserProvider) smanager.lookup(CurrentUserProvider.ROLE); 079 _cartsDAO = (CartsDAO) smanager.lookup(CartsDAO.ROLE); 080 } 081 082 @Override 083 public void generate() throws IOException, SAXException, ProcessingException 084 { 085 086 Request request = ObjectModelHelper.getRequest(objectModel); 087 String id = request.getParameter("cartId"); 088 089 Cart cart = _resolver.resolveById(id); 090 UserIdentity user = _userProvider.getUser(); 091 092 contentHandler.startDocument(); 093 094 if (_cartsDAO.canRead(user, cart)) 095 { 096 AttributesImpl attrs = new AttributesImpl(); 097 attrs.addCDATAAttribute("id", cart.getId()); 098 099 XMLUtils.startElement(contentHandler, "cart", attrs); 100 101 XMLUtils.createElement(contentHandler, "label", cart.getTitle()); 102 XMLUtils.createElement(contentHandler, "description", cart.getDescription()); 103 104 try 105 { 106 List<QueryElement> queries = cart.getQueryCartElements(); 107 _saxQueries(queries); 108 } 109 catch (Exception e) 110 { 111 throw new SAXException("Unable to sax queries", e); 112 } 113 114 try 115 { 116 List<ContentElement> contents = cart.getContentCartElements(); 117 _saxContents(contents); 118 } 119 catch (Exception e) 120 { 121 throw new SAXException("Unable to sax contents", e); 122 } 123 124 try 125 { 126 List<ResourceElement> resources = cart.getResourceCartElements(); 127 _saxResources(resources); 128 } 129 catch (Exception e) 130 { 131 throw new SAXException("Unable to sax resources", e); 132 } 133 134 XMLUtils.endElement(contentHandler, "cart"); 135 } 136 else 137 { 138 XMLUtils.createElement(contentHandler, "not-allowed"); 139 } 140 141 contentHandler.endDocument(); 142 } 143 144 /** 145 * SAX resources of the cart 146 * @param resources The resources of the cart 147 * @throws IOException if an error occurred 148 * @throws SAXException if an error occurred while saxing 149 */ 150 protected void _saxResources (List<ResourceElement> resources) throws IOException, SAXException 151 { 152 XMLUtils.startElement(contentHandler, "resources"); 153 for (ResourceElement resource : resources) 154 { 155 AttributesImpl attrs = new AttributesImpl(); 156 attrs.addCDATAAttribute("id", resource.getId()); 157 XMLUtils.startElement(contentHandler, "resource", attrs); 158 159 _saxCartElement(resource, resource.getGroups().get(0)); 160 161 XMLUtils.endElement(contentHandler, "resource"); 162 } 163 XMLUtils.endElement(contentHandler, "resources"); 164 } 165 166 /** 167 * SAX the attributes of a cart element 168 * @param cartElement The element to sax 169 * @param group The group to sax with 170 * @throws SAXException if an error occurred while saxing 171 */ 172 protected void _saxCartElement(CartElement cartElement, I18nizableText group) throws SAXException 173 { 174 cartElement.getTitle().toSAX(contentHandler, "title"); 175 176 XMLUtils.createElement(contentHandler, "lastModification", DateUtils.zonedDateTimeToString(cartElement.getLastModified())); 177 UserIdentity lastContributor = cartElement.getLastContributor(); 178 User user = _userManager.getUser(lastContributor.getPopulationId(), lastContributor.getLogin()); 179 180 XMLUtils.createElement(contentHandler, "lastContributor", user.getFullName()); 181 182 group.toSAX(contentHandler, "group"); 183 } 184 185 /** 186 * SAX contents of the cart 187 * @param contents The contents of the cart 188 * @throws IOException if an error occurred 189 * @throws SAXException if an error occurred while saxing 190 */ 191 protected void _saxContents (List<ContentElement> contents) throws IOException, SAXException 192 { 193 SitemapSource sitemapSource = null; 194 try 195 { 196 XMLUtils.startElement(contentHandler, "contents"); 197 for (ContentElement content : contents) 198 { 199 List<I18nizableText> groups = content.getGroups(); 200 for (I18nizableText group : groups) 201 { 202 XMLUtils.startElement(contentHandler, "content"); 203 _saxCartElement(content, group); 204 205 String cocoonUrl = _contentToCocoonUrl(content); 206 sitemapSource = (SitemapSource) _sourceResolver.resolveURI(cocoonUrl); 207 sitemapSource.toSAX(new IgnoreRootHandler(contentHandler)); 208 XMLUtils.endElement(contentHandler, "content"); 209 } 210 211 } 212 XMLUtils.endElement(contentHandler, "contents"); 213 } 214 finally 215 { 216 resolver.release(sitemapSource); 217 } 218 } 219 220 /** 221 * Returns the Cocoon pipeline URL that returns content details 222 * @param content The content 223 * @return The cocoon URL that returns the content details 224 */ 225 protected String _contentToCocoonUrl(ContentElement content) 226 { 227 return "cocoon://_content.html?contentId=" + URIUtils.encodeParameter(content.getId()); 228 } 229 230 /** 231 * SAX queries of the cart 232 * @param queries The queries of the cart 233 * @throws IOException if an error occurred 234 * @throws SAXException if an error occurred while saxing 235 */ 236 protected void _saxQueries (List<QueryElement> queries) throws IOException, SAXException 237 { 238 SitemapSource sitemapSource = null; 239 try 240 { 241 XMLUtils.startElement(contentHandler, "queries"); 242 for (QueryElement query : queries) 243 { 244 XMLUtils.startElement(contentHandler, "query"); 245 _saxCartElement(query, query.getGroups().get(0)); 246 247 String queryDescription = query.getDescription().getLabel(); 248 Map<String, Object> queryDetails = _jsonUtils.convertJsonToMap(queryDescription); 249 250 String printPluginUrl = queryDetails.containsKey("printUrlPlugin") ? (String) queryDetails.get("printUrlPlugin") : "cms"; 251 String printUrl = queryDetails.containsKey("printUrl") ? (String) queryDetails.get("printUrl") : "search/print.html"; 252 @SuppressWarnings("unchecked") 253 Map<String, Object> exportParams = (Map<String, Object>) queryDetails.get("exportParams"); 254 Map<String, String> params = new HashMap<>(); 255 params.put("parameters", _jsonUtils.convertObjectToJson(exportParams)); 256 257 sitemapSource = (SitemapSource) _sourceResolver.resolveURI("cocoon://_plugins/" + printPluginUrl + "/" + printUrl + "?parameters=" + _jsonUtils.convertObjectToJson(exportParams), null, new HashMap<>()); 258 sitemapSource.toSAX(new IgnoreRootHandler(contentHandler)); 259 XMLUtils.endElement(contentHandler, "query"); 260 } 261 XMLUtils.endElement(contentHandler, "queries"); 262 } 263 finally 264 { 265 resolver.release(sitemapSource); 266 } 267 } 268 269}