/** * The contents of this file are subject to the license and copyright * detailed in the LICENSE and NOTICE files at the root of the source * tree and available online at * * http://www.dspace.org/license/ */ package org.dspace.app.xmlui.aspect.statistics; import org.apache.cocoon.ProcessingException; import org.apache.cocoon.environment.ObjectModelHelper; import org.apache.cocoon.environment.Request; import org.apache.commons.lang.StringUtils; import org.dspace.app.xmlui.aspect.artifactbrowser.AdvancedSearchUtils; import org.dspace.app.xmlui.cocoon.AbstractDSpaceTransformer; import org.dspace.app.xmlui.utils.HandleUtil; import org.dspace.app.xmlui.utils.UIException; import org.dspace.app.xmlui.wing.WingException; import org.dspace.app.xmlui.wing.element.Body; import org.dspace.app.xmlui.wing.element.Division; import org.dspace.authorize.AuthorizeException; import org.dspace.content.DSpaceObject; import org.dspace.handle.HandleManager; import org.xml.sax.SAXException; import java.io.IOException; import java.sql.SQLException; /** * Transformer that adds a hidden form * which will be submitted each time an dspace object link is clicked on a lucene search page * This form will ensure that the results clicked after each search are logged for the search statistics * * @author Kevin Van de Velde (kevin at atmire dot com) * @author Ben Bosman (ben at atmire dot com) * @author Mark Diggory (markd at atmire dot com) */ public class StatisticsSearchResultTransformer extends AbstractDSpaceTransformer { @Override public void addBody(Body body) throws SAXException, WingException, SQLException, IOException, AuthorizeException, ProcessingException { Request request = ObjectModelHelper.getRequest(objectModel); StringBuilder formUrl = new StringBuilder(); formUrl.append(request.getContextPath()); DSpaceObject scope = getScope(); if(scope != null){ formUrl.append("/handle/").append(scope.getHandle()); } if(parameters.getParameterAsBoolean("advanced-search", false)) { formUrl.append("/advanced-search"); } else { formUrl.append("/search"); } Division mainForm = body.addInteractiveDivision("dso-display", formUrl.toString(), Division.METHOD_POST, ""); mainForm.addHidden("current-scope").setValue(scope == null ? "" : scope.getHandle()); //Indicate that the form we are submitting lists search results mainForm.addHidden("search-result").setValue(Boolean.TRUE.toString()); mainForm.addHidden("query").setValue(getQuery()); if(!StringUtils.isBlank(request.getParameter("rpp"))){ mainForm.addHidden("rpp").setValue(Integer.parseInt(request.getParameter("rpp"))); } if(!StringUtils.isBlank(request.getParameter("sort_by"))){ mainForm.addHidden("sort_by").setValue(request.getParameter("sort_by")); } if(!StringUtils.isBlank(request.getParameter("order"))){ mainForm.addHidden("order").setValue(request.getParameter("order")); } if(!StringUtils.isBlank(request.getParameter("page"))){ mainForm.addHidden("page").setValue(Integer.parseInt(request.getParameter("page"))); } } private String getQuery() throws UIException { Request request = ObjectModelHelper.getRequest(objectModel); if(parameters.getParameterAsBoolean("advanced-search", false)){ return AdvancedSearchUtils.buildQuery(AdvancedSearchUtils.getSearchFields(request)); }else{ String query = decodeFromURL(request.getParameter("query")); if (query == null) { return ""; } return query; } } /** * Determine the current scope. This may be derived from the current url * handle if present or the scope parameter is given. If no scope is * specified then null is returned. * * @return The current scope. */ protected DSpaceObject getScope() throws SQLException { Request request = ObjectModelHelper.getRequest(objectModel); String scopeString = request.getParameter("scope"); // Are we in a community or collection? DSpaceObject dso; if (scopeString == null || "".equals(scopeString)) { // get the search scope from the url handle dso = HandleUtil.obtainHandle(objectModel); } else { // Get the search scope from the location parameter dso = HandleManager.resolveToObject(context, scopeString); } return dso; } }