/**
* 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
*
* https://github.com/CILEA/dspace-cris/wiki/License
*/
package org.dspace.app.webui.cris.controller.statistics;
import it.cilea.osd.jdyna.model.ANestedPropertiesDefinition;
import it.cilea.osd.jdyna.model.ANestedProperty;
import it.cilea.osd.jdyna.model.ATypeNestedObject;
import it.cilea.osd.jdyna.model.PropertiesDefinition;
import it.cilea.osd.jdyna.model.Property;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.log4j.Logger;
import org.apache.solr.client.solrj.impl.HttpSolrServer;
import org.dspace.app.cris.integration.ICRISComponent;
import org.dspace.app.cris.integration.statistics.AStatComponentService;
import org.dspace.app.cris.integration.statistics.IStatsComponent;
import org.dspace.app.cris.integration.statistics.IStatsDualComponent;
import org.dspace.app.cris.integration.statistics.StatComponentsService;
import org.dspace.app.cris.model.ACrisObject;
import org.dspace.app.cris.model.CrisConstants;
import org.dspace.app.cris.model.ResearchObject;
import org.dspace.app.cris.model.jdyna.ACrisNestedObject;
import org.dspace.app.cris.statistics.bean.ResultBean;
import org.dspace.app.cris.statistics.bean.RightMenuBean;
import org.dspace.app.cris.statistics.bean.TreeKeyMap;
import org.dspace.app.cris.statistics.bean.TwoKeyMap;
import org.dspace.app.webui.cris.components.statistics.StatsComponent;
import org.dspace.app.webui.util.UIUtil;
import org.dspace.content.DSpaceObject;
import org.springframework.web.servlet.ModelAndView;
public class CrisStatisticsController<T extends ACrisObject<P, TP, NP, NTP, ACNO, ATNO>, P extends Property<TP>, TP extends PropertiesDefinition, NP extends ANestedProperty<NTP>, NTP extends ANestedPropertiesDefinition, ACNO extends ACrisNestedObject<NP, NTP, P, TP>, ATNO extends ATypeNestedObject<NTP>>
extends AStatisticsController<IStatsDualComponent>
{
/** log4j logger */
private static Logger log = Logger
.getLogger(CrisStatisticsController.class);
private Class<T> target;
public ModelAndView handleRequest(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException
{
String id = getId(request);
String type = request.getParameter("type");
String mode = request.getParameter("mode");
if (mode == null || mode.isEmpty())
{
mode = StatsComponent.VIEW;
}
if (type == null || type.isEmpty())
{
type = StatComponentsService._SELECTED_OBJECT;
}
ModelAndView modelAndView = new ModelAndView(success);
try
{
Map<String, Object> data = new HashMap<String, Object>();
data.put(_ID_LABEL, id);
data.put(_JSP_KEY, jspKey);
HttpSolrServer solrServer = new HttpSolrServer(getSolrConfig()
.getStatisticsCore());
Map<String, IStatsDualComponent> components = statsComponentsService
.getComponents();
TwoKeyMap label = new TwoKeyMap();
TreeKeyMap dataBeans = new TreeKeyMap();
IStatsComponent statcomponent = null;
// create right menu
List<RightMenuBean> rightMenu = new ArrayList<RightMenuBean>();
if (statsComponentsService.isShowSelectedObject())
{
RightMenuBean menuV = new RightMenuBean();
menuV.setMode(StatsComponent.VIEW);
menuV.setType(AStatComponentService._SELECTED_OBJECT);
if (type.equals(menuV.getType())
&& mode.equals(menuV.getMode()))
{
menuV.setCurrent(true);
}
rightMenu.add(menuV);
RightMenuBean menuD = new RightMenuBean();
menuD.setMode(StatsComponent.DOWNLOAD);
menuD.setType(AStatComponentService._SELECTED_OBJECT);
if (type.equals(menuD.getType())
&& mode.equals(menuD.getMode()))
{
menuD.setCurrent(true);
}
rightMenu.add(menuD);
}
for (String key : components.keySet())
{
boolean createMenu = true;
if (ResearchObject.class.isAssignableFrom(getTarget()))
{
String relationName = ((ICRISComponent) components.get(key))
.getRelationConfiguration().getRelationName();
if(!relationName.startsWith(getApplicationService().get(ResearchObject.class, Integer.parseInt(id)).getTypeText())) {
createMenu = false;
}
}
if (createMenu)
{
RightMenuBean menuV = new RightMenuBean();
menuV.setMode(StatsComponent.VIEW);
menuV.setType(key);
if (type.equals(menuV.getType())
&& mode.equals(menuV.getMode()))
{
menuV.setCurrent(true);
}
rightMenu.add(menuV);
RightMenuBean menuD = new RightMenuBean();
menuD.setMode(StatsComponent.DOWNLOAD);
menuD.setType(key);
if (type.equals(menuD.getType())
&& mode.equals(menuD.getMode()))
{
menuD.setCurrent(true);
}
rightMenu.add(menuD);
}
}
if (components.containsKey(type))
{
if (mode.equals(StatsComponent.VIEW))
{
statcomponent = components.get(type)
.getStatsViewComponent();
}
if (mode.equals(StatsComponent.DOWNLOAD))
{
statcomponent = components.get(type)
.getStatsDownloadComponent();
}
}
else
{
if (mode.equals(StatsComponent.VIEW))
{
statcomponent = statsComponentsService
.getSelectedObjectComponent()
.getStatsViewComponent();
}
if (mode.equals(StatsComponent.DOWNLOAD))
{
statcomponent = statsComponentsService
.getSelectedObjectComponent()
.getStatsDownloadComponent();
}
}
Integer relationObjectType = statcomponent.getRelationObjectType();
if (relationObjectType
.equals(CrisConstants.CRIS_DYNAMIC_TYPE_ID_START))
{
relationObjectType = getApplicationService().get(
ResearchObject.class, Integer.parseInt(id)).getType();
statcomponent.setRelationObjectType(relationObjectType);
}
dataBeans.putAll(statcomponent.query(id, solrServer));
label.putAll(statcomponent.getLabels(UIUtil.obtainContext(request),
CrisConstants.getEntityTypeText(relationObjectType)));
ResultBean result = new ResultBean(dataBeans,
statsComponentsService.getCommonsParams());
data.put(_RESULT_BEAN, result);
data.put("label", label);
data.put("title", getTitle(request));
data.put("object", getObject(request));
data.put("target", getTarget());
data.put("rightMenu", rightMenu);
data.put("relationType",
CrisConstants.getEntityTypeText(relationObjectType));
data.put("showExtraTab", statsComponentsService.isShowExtraTab());
modelAndView.addObject("data", data);
addSubscriptionStatus(modelAndView, request);
}
catch (Exception e)
{
log.error(e.getMessage(), e);
modelAndView = new ModelAndView(error);
}
return modelAndView;
}
@Override
public String getId(HttpServletRequest request)
{
String uuid = request.getParameter("id");
return String.valueOf(getApplicationService().getEntityByUUID(uuid)
.getId());
}
@Override
public DSpaceObject getObject(HttpServletRequest request)
{
String uuid = request.getParameter("id");
return getApplicationService().getEntityByUUID(uuid);
}
@Override
public String getTitle(HttpServletRequest request)
{
String uuid = request.getParameter("id");
return getApplicationService().getEntityByUUID(uuid).getName();
}
public void setTarget(Class<T> target)
{
this.target = target;
}
public Class<T> getTarget()
{
return target;
}
}