package edu.asu.spring.quadriga.service.publicwebsite.impl;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import edu.asu.spring.quadriga.dao.workspace.IWorkspaceDAO;
import edu.asu.spring.quadriga.domain.IConceptStats;
import edu.asu.spring.quadriga.domain.IUserStats;
import edu.asu.spring.quadriga.domain.impl.ConceptStats;
import edu.asu.spring.quadriga.domain.impl.UserStats;
import edu.asu.spring.quadriga.domain.network.INetwork;
import edu.asu.spring.quadriga.domain.workbench.IProjectCollaborator;
import edu.asu.spring.quadriga.dto.WorkspaceDTO;
import edu.asu.spring.quadriga.exceptions.QuadrigaStorageException;
import edu.asu.spring.quadriga.service.network.INetworkManager;
import edu.asu.spring.quadriga.service.network.INetworkTransformationManager;
import edu.asu.spring.quadriga.service.network.domain.ITransformedNetwork;
import edu.asu.spring.quadriga.service.publicwebsite.IProjectStats;
import edu.asu.spring.quadriga.service.workbench.IProjectCollaboratorManager;
import edu.asu.spring.quadriga.service.workbench.IRetrieveProjectManager;
import edu.asu.spring.quadriga.transform.Node;
/**
* This class represents business logic for getting top concepts from the given
* list of networks.
*
* @author Ajay Modi
*
*/
@Service
public class ProjectStats implements IProjectStats {
@Autowired
private INetworkTransformationManager transformationManager;
@Autowired
private IWorkspaceDAO wsDAO;
@Autowired
private INetworkManager networkManager;
@Autowired
private IProjectCollaboratorManager projectCollaboratorManager;
@Autowired
private IRetrieveProjectManager projectManager;
@Override
public List<IConceptStats> getConceptCount(List<INetwork> networks) throws QuadrigaStorageException {
HashMap<String, ConceptStats> mapStats = new HashMap<String, ConceptStats>();
for (INetwork n : networks) {
ITransformedNetwork transformedNetwork = transformationManager.getTransformedNetwork(n.getNetworkId());
if (transformedNetwork != null) {
Map<String, Node> mapNodes = transformedNetwork.getNodes();
for (Node node : mapNodes.values()) {
String url = node.getConceptId();
if (mapStats.containsKey(url)) {
mapStats.get(url).incrementCount();
} else {
ConceptStats conceptStats = new ConceptStats(url, node.getDescription(), node.getLabel(), 1);
mapStats.put(url, conceptStats);
}
}
}
}
List<IConceptStats> valuesList = new ArrayList<IConceptStats>(mapStats.values());
return getSortedList(valuesList);
}
public List<IConceptStats> getSortedList(List<IConceptStats> csList) {
Collections.sort(csList, new Comparator<IConceptStats>() {
public int compare(IConceptStats o1, IConceptStats o2) {
if (o1.getCount() == o2.getCount())
return 0;
return o1.getCount() < o2.getCount() ? 1 : -1;
}
});
return csList;
}
private Map<String, IUserStats> getCountofWorkspace(String projectId, Map<String, IUserStats> mapUserWorkspace)
throws QuadrigaStorageException {
List<IProjectCollaborator> projectCollaboratorList = projectCollaboratorManager
.getProjectCollaborators(projectId);
if (projectCollaboratorList == null) {
return mapUserWorkspace;
}
// loop through each collaborator
for (IProjectCollaborator projectCollaborator : projectCollaboratorList) {
if (projectCollaborator.getCollaborator() != null) {
String username = projectCollaborator.getCollaborator().getUserObj().getUserName();
IUserStats userStats = retrieveUserWorkspaceStats(projectId, username);
mapUserWorkspace.put(username, userStats);
}
}
String username = projectManager.getProjectDetails(projectId).getOwner().getUserName();
if (username == null) {
return mapUserWorkspace;
}
UserStats userStats = (UserStats) retrieveUserWorkspaceStats(projectId, username);
mapUserWorkspace.put(username, userStats);
return mapUserWorkspace;
}
private IUserStats retrieveUserWorkspaceStats(String projectId,
String username) throws QuadrigaStorageException {
List<WorkspaceDTO> workspaceList = wsDAO.listWorkspaceDTO(projectId,
username);
UserStats userStats;
if (workspaceList == null) {
userStats = new UserStats(username, 0, 0);
} else {
userStats = new UserStats(username, workspaceList.size(), 0);
}
return userStats;
}
private Map<String, IUserStats> getCountofNetwork(String projectid, Map<String, IUserStats> mapUserNetworks)
throws QuadrigaStorageException {
List<INetwork> networksList = networkManager.getNetworksInProject(projectid, null);
if (networksList == null) {
return mapUserNetworks;
}
for (INetwork network : networksList) {
if (network.getCreator() != null) {
String username = network.getCreator().getUserName();
IUserStats userStats = mapUserNetworks.get(username);
if (userStats == null) {
userStats = new UserStats(username, 0, 1);
mapUserNetworks.put(username, userStats);
} else {
userStats.incrementNetworkCount();
}
}
}
return mapUserNetworks;
}
@Override
public List<IUserStats> getUserStats(String projectId) throws QuadrigaStorageException {
Map<String, IUserStats> mapUserStats = new HashMap<String, IUserStats>();
mapUserStats = getCountofWorkspace(projectId, mapUserStats);
mapUserStats = getCountofNetwork(projectId, mapUserStats);
List<IUserStats> listUserStats = new ArrayList<IUserStats>(mapUserStats.values());
return listUserStats;
}
}