Java tutorial
/** * 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.servlet; import java.io.IOException; import java.sql.SQLException; import java.util.Collections; import java.util.HashMap; import java.util.LinkedList; 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.SolrQuery; import org.apache.solr.client.solrj.response.FacetField; import org.apache.solr.client.solrj.response.QueryResponse; import org.apache.solr.common.SolrDocumentList; import org.dspace.app.cris.network.ConstantNetwork; import org.dspace.app.cris.network.NetworkPlugin; import org.dspace.app.cris.network.VisualizationGraphSolrService; import org.dspace.app.webui.servlet.DSpaceServlet; import org.dspace.app.webui.util.JSPManager; import org.dspace.core.ConfigurationManager; import org.dspace.core.Context; import org.dspace.core.PluginManager; import org.dspace.discovery.SearchServiceException; import org.dspace.utils.DSpace; public class DeptNetworkServlet extends DSpaceServlet { /** log4j category */ private static Logger log = Logger.getLogger(DeptNetworkServlet.class); private DSpace dspace = new DSpace(); private VisualizationGraphSolrService service = dspace.getServiceManager() .getServiceByName("visualNetworkSolrService", VisualizationGraphSolrService.class); @Override protected void doDSGet(Context context, HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException, SQLException { String dept = request.getParameter("dept"); boolean found = false; if (dept == null) { response.sendError(HttpServletResponse.SC_NOT_FOUND, "A department name could be passed as parameter"); } else { found = true; } String showEXT = request.getParameter("showexternal"); boolean showALL = false; if (showEXT != null) { showALL = Boolean.parseBoolean(showEXT); } else { showALL = ConfigurationManager.getBooleanProperty(NetworkPlugin.CFG_MODULE, "network.connection.showexternal"); } String connection = ConfigurationManager.getProperty(NetworkPlugin.CFG_MODULE, "network.connection"); Map<String, String> colorsNodes = new HashMap<String, String>(); Map<String, String> colorsEdges = new HashMap<String, String>(); Map<String, Integer> maxDepths = new HashMap<String, Integer>(); String[] connections = connection.split(","); List<String> availableConnections = new LinkedList<String>(); // check available connection data int i = 0; for (String conn : connections) { try { if (checkAvailableData(request, conn, dept)) { availableConnections.add(conn); NetworkPlugin plugin = (NetworkPlugin) (PluginManager.getNamedPlugin(NetworkPlugin.CFG_MODULE, NetworkPlugin.class, conn)); colorsNodes.put(conn, plugin.getNodeCustomColor()); colorsEdges.put(conn, plugin.getEdgeCustomColor()); maxDepths.put(conn, plugin.getCustomMaxDepth()); i++; } } catch (SearchServiceException e) { log.error(e.getMessage(), e); } } Integer max = 0; if (i > 0) { connections = new String[availableConnections.size() - 1]; connections = availableConnections.toArray(connections); max = Collections.max(maxDepths.values()); } request.setAttribute("configMaxDepth", ConfigurationManager.getProperty(NetworkPlugin.CFG_MODULE, "network.connection.maxdepth")); request.setAttribute("relations", connections); request.setAttribute("dept", dept); request.setAttribute("colorsNodes", colorsNodes); request.setAttribute("colorsEdges", colorsEdges); request.setAttribute("customMaxDepths", maxDepths); request.setAttribute("maxDepth", max); request.setAttribute("showexternal", showALL); request.setAttribute("showsamedept", false); if (i > 0) { request.setAttribute("networkStarted", connections[0]); } Map<String, Integer> relations = getRelationsInformation(dept, "", connections); request.setAttribute("relationsdept", relations); JSPManager.showJSP(request, response, "/graph/dgraph.jsp"); } private Map<String, Integer> getRelationsInformation(String from, String to, String... types) { Map<String, Integer> result = new HashMap<String, Integer>(); try { String query = "a_dept:\"" + from + "\" OR b_dept:\"" + from + "\""; QueryResponse rsp = shootQuery(query, true, "focus_dept"); FacetField relations = rsp.getFacetField("focus_dept"); int otherDPconnected = relations.getValueCount(); query = "a_dept:\"" + from + "\" AND b_dept:\"" + from + "\""; rsp = shootQuery(query, true, "focus_auth"); relations = rsp.getFacetField("focus_auth"); int internalRPs = relations.getValueCount(); query = "a_dept:\"" + from + "\" OR b_dept:\"" + from + "\""; rsp = shootQuery(query, true, "focus_auth"); relations = rsp.getFacetField("focus_auth"); int fromOtherDPconnected = relations.getValueCount(); query = "focus_dept:\"" + from + "|||null\" OR focus_dept:\"null|||" + from + "\""; rsp = shootQuery(query, true, "focus_dept"); relations = rsp.getFacetField("focus_dept"); int externalRPs = (int) rsp.getResults().getNumFound(); int externalCardinality = relations.getValueCount(); //need to remove n row from facet because the first match the department and one or two are matching with external otherDPconnected = otherDPconnected - 1 - externalCardinality; result.put("external", externalRPs); result.put("internal", internalRPs); result.put("fromOtherDPConnected", fromOtherDPconnected); result.put("dpConnected", otherDPconnected); } catch (Exception e) { log.error(e.getMessage(), e); } return result; } private QueryResponse shootQuery(String query, boolean facet, String facetField) throws SearchServiceException { SolrQuery solrQuery = new SolrQuery(); solrQuery.setQuery(query); solrQuery.setStart(0); solrQuery.setRows(0); if (facet) { solrQuery.setFacet(true); solrQuery.setFacetMinCount(1); solrQuery.addFacetField(facetField); } QueryResponse rsp = service.search(solrQuery); return rsp; } private boolean checkAvailableData(HttpServletRequest request, String connection, String value) throws SearchServiceException { String query = "type:" + connection + " AND focus_val:\"" + value + "\"" + " AND entity:" + ConstantNetwork.ENTITY_DEPT; QueryResponse rsp = shootQuery(query, false, null); SolrDocumentList docs = rsp.getResults(); if (docs != null) { if (docs.getNumFound() > 0) { return true; } } return false; } public void setService(VisualizationGraphSolrService service) { this.service = service; } public VisualizationGraphSolrService getService() { return service; } }