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.cris.network; import it.cilea.osd.jdyna.value.TextValue; import java.security.NoSuchAlgorithmException; import java.text.DecimalFormat; import java.util.ArrayList; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.regex.Pattern; 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.FacetField.Count; import org.apache.solr.client.solrj.response.QueryResponse; import org.apache.solr.client.solrj.util.ClientUtils; import org.apache.solr.common.SolrDocument; import org.apache.solr.common.SolrDocumentList; import org.dspace.app.cris.discovery.CrisSearchService; import org.dspace.app.cris.model.CrisConstants; import org.dspace.app.cris.model.ResearcherPage; import org.dspace.app.cris.model.VisibilityConstants; import org.dspace.app.cris.model.jdyna.RPAdditionalFieldStorage; import org.dspace.app.cris.model.jdyna.RPPropertiesDefinition; import org.dspace.app.cris.model.jdyna.RPProperty; import org.dspace.app.cris.network.dto.JsGraph; import org.dspace.app.cris.network.dto.JsGraphAdjacence; import org.dspace.app.cris.network.dto.JsGraphData; import org.dspace.app.cris.network.dto.JsGraphNodeData; import org.dspace.app.cris.service.ApplicationService; import org.dspace.app.cris.util.ResearcherPageUtils; import org.dspace.core.ConfigurationManager; import org.dspace.discovery.SearchServiceException; import org.dspace.utils.DSpace; public abstract class AVisualizationGraph implements NetworkPlugin { public static String splitterAuthority = "###"; protected Pattern p = Pattern.compile("rp(.*?)"); private static final String FACET_METRICS = "focus_auth"; private static final String FACET_SEARCH = "focus"; private static final String COLOR_PROPERTY = "network.connection.color"; private static final String COLOR_SUFFIX_NODE = "node"; private static final String COLOR_SUFFIX_EDGETOO = "edgetooverride"; private static final String COLOR_SUFFIX_EDGE = "edge"; /** log4j logger */ protected static Logger log = Logger.getLogger(AVisualizationGraph.class); private DSpace dspace = new DSpace(); private VisualizationGraphSolrService service = dspace.getServiceManager() .getServiceByName("visualNetworkSolrService", VisualizationGraphSolrService.class); private VisualizationGraphIndexer indexer = dspace.getServiceManager().getServiceByName("visualNetworkIndexer", VisualizationGraphIndexer.class); private ApplicationService applicationService = dspace.getServiceManager() .getServiceByName("applicationService", ApplicationService.class); private DecimalFormat df = new DecimalFormat("#.###"); abstract public String getConnectionName(); protected Integer getLimitLevel(Integer level) { String obj = ConfigurationManager.getProperty(NetworkPlugin.CFG_MODULE, "network.connection." + getConnectionName() + ".nodestoshoweachlevel." + level); if (obj == null) { return ConfigurationManager.getIntProperty(NetworkPlugin.CFG_MODULE, "network.connection.nodestoshoweachlevel.default") + 1; } else { return Integer.parseInt(obj) + 1; } } public Integer getCustomMaxDepth() { String obj = ConfigurationManager.getProperty(NetworkPlugin.CFG_MODULE, "network.connection." + getConnectionName() + ".maxdepth"); if (obj == null) { return ConfigurationManager.getIntProperty(NetworkPlugin.CFG_MODULE, "network.connection.maxdepth"); } else { return Integer.parseInt(obj); } } @Override public JsGraph search(String authority, String name, Integer level, boolean showExternal, boolean showSameDept, String dept, Integer modeEntity) throws Exception { SolrQuery solrQuery = new SolrQuery(); String query = buildQuery(authority, name, showSameDept, dept, modeEntity, level); String[] fqs = { "type:" + getConnectionName(), "entity:" + modeEntity }; solrQuery.setQuery(query); solrQuery.addFilterQuery(fqs); if (!showExternal && authority != null && !authority.isEmpty()) { solrQuery.addFilterQuery(new String[] { "a_auth:rp*", "b_auth:rp*" }); } solrQuery.setFacet(true); solrQuery.addFacetField(FACET_SEARCH); if (modeEntity == ConstantNetwork.ENTITY_RP) { solrQuery.setFacetLimit(getLimitLevel(level)); } else if (modeEntity == ConstantNetwork.ENTITY_DEPT) { solrQuery.setFacetLimit(Integer.MAX_VALUE); } solrQuery.setFacetMinCount(1); solrQuery.setRows(0); QueryResponse rsp = service.search(solrQuery); FacetField facets = rsp.getFacetField(FACET_SEARCH); JsGraph rsGraph = null; String src = null; if (authority != null && !authority.isEmpty()) { src = authority; rsGraph = new JsGraph(); rsGraph.setId(authority); rsGraph.setName(name); JsGraphNodeData dataNode = new JsGraphNodeData(); dataNode.setColor(getNodeCustomColor()); dataNode.setType(getType()); dataNode.setModeStyle("fill"); rsGraph.setData(dataNode); } else { src = name; rsGraph = new JsGraph(); rsGraph.setId(name); rsGraph.setName(name); JsGraphNodeData dataNodeLeaf = new JsGraphNodeData(); dataNodeLeaf.setColor(getNodeLeafCustomColor()); dataNodeLeaf.setType(getType()); dataNodeLeaf.setModeStyle("stroke"); rsGraph.setData(dataNodeLeaf); } if (rsGraph != null) { if (facets != null && facets.getValueCount() > 0) { for (Count facet : facets.getValues()) { if (facet.getCount() > 0) { String node2 = (String) facet.getName(); String split[] = node2.split("\\|\\|\\|"); String srcnode2 = null; String displayValue = ""; String authorityValue = null; boolean isAuthority = false; if (split.length > 1) { String[] splitAuthority = split[1].split(splitterAuthority); displayValue = splitAuthority[0]; srcnode2 = displayValue; if (splitAuthority.length > 1) { isAuthority = true; authorityValue = splitAuthority[1]; srcnode2 = authorityValue; } } else if (split.length == 1) { displayValue = split[0]; srcnode2 = displayValue; } if (!(src.equals(srcnode2))) { JsGraphAdjacence adjacence = new JsGraphAdjacence(); JsGraphData data = new JsGraphData(); adjacence.setSrc(node2); if (isAuthority) { adjacence.setNodeTo(authorityValue); } else { adjacence.setNodeTo(displayValue); } if (authorityValue != null || showExternal) { data.setColor(getEdgeCustomColor()); data.setLineWidth(getCustomLineWidth((int) facet.getCount())); data.setCount((int) facet.getCount()); data.setType(getType()); adjacence.setData(data); rsGraph.getAdjacencies().add(adjacence); } } } } } } return rsGraph; } private String buildQuery(String authority, String name, boolean showSameDept, String dept, Integer modeEntity, Integer level) { String query = ""; if (authority != null && !authority.isEmpty()) { query += "focus_auth:" + authority; } else { query += "focus_val:\"" + ClientUtils.escapeQueryChars(name) + "\""; } if (showSameDept) { if (modeEntity == ConstantNetwork.ENTITY_RP) { query += " AND focus_dept:\"" + ClientUtils.escapeQueryChars(dept) + "|||" + ClientUtils.escapeQueryChars(dept) + "\""; } } return query; } public DSpace getDspace() { return dspace; } public void setDspace(DSpace dspace) { this.dspace = dspace; } public VisualizationGraphSolrService getService() { return service; } public void setService(VisualizationGraphSolrService service) { this.service = service; } public VisualizationGraphIndexer getIndexer() { return indexer; } public void setIndexer(VisualizationGraphIndexer indexer) { this.indexer = indexer; } protected String buildExtra(String extra) { String result = buildExtraCustom(extra); if (result != null) { return result; } return extra; } protected abstract String buildExtraCustom(String extra); protected void buildRow(List<VisualizationGraphNode> result, String a, String a_authority, String a_value, String b, String b_authority, String b_value, List<String> values, String extra, String a_dept, String b_dept, Integer entity) throws NoSuchAlgorithmException { VisualizationGraphNode node = new VisualizationGraphNode(); node.setA(a); node.setA_auth(a_authority); node.setFavalue(a_value); node.setType(getConnectionName()); node.setB(b); node.setB_auth(b_authority); node.setFbvalue(b_value); node.getValue().addAll(values); node.getExtra().add(extra); node.setA_dept(a_dept); node.setB_dept(b_dept); node.setEntity(entity); result.add(node); } public String getCustomLineWidth(int val) { if (val > 50) { return "5"; } else if (val > 30) { return "3"; } else if (val > 10) { return "2"; } else if (val > 5) { return "1.5"; } return "1"; } public String getNodeLeafCustomColor() { return getNodeCustomColor(); } public String getNodeCustomColor() { String color = ConfigurationManager.getProperty(NetworkPlugin.CFG_MODULE, COLOR_PROPERTY + "." + COLOR_SUFFIX_NODE + "." + getConnectionName()); if (color == null) { color = ConfigurationManager.getProperty(NetworkPlugin.CFG_MODULE, COLOR_PROPERTY + "." + COLOR_SUFFIX_NODE + ".default"); } return color; } public String getEdgeColorToOverride() { String color = ConfigurationManager.getProperty(NetworkPlugin.CFG_MODULE, COLOR_PROPERTY + "." + COLOR_SUFFIX_EDGETOO + "." + getConnectionName()); if (color == null) { color = ConfigurationManager.getProperty(NetworkPlugin.CFG_MODULE, COLOR_PROPERTY + "." + COLOR_SUFFIX_EDGETOO + ".default"); if (color == null) { color = ConfigurationManager.getProperty(NetworkPlugin.CFG_MODULE, COLOR_PROPERTY + "." + COLOR_SUFFIX_EDGE + ".default"); } } return color; } public String getEdgeCustomColor() { String color = ConfigurationManager.getProperty(NetworkPlugin.CFG_MODULE, COLOR_PROPERTY + "." + COLOR_SUFFIX_EDGE + "." + getConnectionName()); if (color == null) { color = ConfigurationManager.getProperty(NetworkPlugin.CFG_MODULE, COLOR_PROPERTY + "." + COLOR_SUFFIX_EDGE + ".default"); } return color; } public List<ResearcherPage> loadMetrics(List<String[]> discardedNode, Integer importedNodes, Boolean otherError) throws SearchServiceException { // load all publications SolrQuery solrQuery = new SolrQuery(); solrQuery.setQuery("type:" + getType() + " AND entity:" + ConstantNetwork.ENTITY_RP); solrQuery.addFacetField(FACET_METRICS); solrQuery.setFacetLimit(Integer.MAX_VALUE); solrQuery.setFacetMinCount(1); solrQuery.setRows(0); QueryResponse rsp = getService().search(solrQuery); FacetField facets = rsp.getFacetField(FACET_METRICS); // for each interests get authority's authors List<ResearcherPage> result = new LinkedList<ResearcherPage>(); int counter = 0; external: for (Count facetElement : facets.getValues()) { counter++; log.debug("" + counter + " of " + facets.getValueCount()); ResearcherPage researcher = null; try { String facetValue = facetElement.getName(); Integer realPersistentIdentifier = ResearcherPageUtils.getRealPersistentIdentifier(facetValue, ResearcherPage.class); researcher = applicationService.get(ResearcherPage.class, realPersistentIdentifier); //researcher.getDynamicField().setAnagraficaLazy(applicationService.getAnagraficaByRP(realPersistentIdentifier)); solrQuery = new SolrQuery(); solrQuery.setQuery("type:" + getType() + " AND entity:" + ConstantNetwork.ENTITY_RP + " AND " + FACET_METRICS + ":\"" + facetValue + "\""); solrQuery.addFacetField(FACET_SEARCH); solrQuery.setFacetMinCount(1); solrQuery.setFacetLimit(Integer.MAX_VALUE); solrQuery.setRows(0); rsp = getService().search(solrQuery); FacetField relations = rsp.getFacetField(FACET_SEARCH); int i = 0; int nConnections = 0; int maxStrength = 0; int sumStrength = 0; List<Long> quadraticVarianceArrays = new ArrayList<Long>(); nConnections = Integer.valueOf(relations.getValueCount() - 1); internal: for (Count relation : relations.getValues()) { log.debug("" + counter + " works on " + i + " of " + relations.getValueCount()); if (i == 0) { i++; continue internal; } else { if (i == 1) { // max maxStrength = Integer.valueOf((int) relation.getCount()); } sumStrength += Integer.valueOf((int) relation.getCount()); quadraticVarianceArrays.add(relation.getCount()); } i++; } RPAdditionalFieldStorage anagraficaObject = researcher.getDynamicField(); setMetadata(String.valueOf(nConnections), anagraficaObject, ConstantNetwork.PREFIX_METADATA_BIBLIOMETRIC_1 + getType()); setMetadata(String.valueOf(maxStrength), anagraficaObject, ConstantNetwork.PREFIX_METADATA_BIBLIOMETRIC_2 + getType()); double averageStrength = ((double) sumStrength / ((double) nConnections)); setMetadata(String.valueOf(df.format(averageStrength)), anagraficaObject, ConstantNetwork.PREFIX_METADATA_BIBLIOMETRIC_3 + getType()); double quadraticVariance = 0; double n = quadraticVarianceArrays.size(); for (Long variance : quadraticVarianceArrays) { quadraticVariance += ((variance - averageStrength) * (variance - averageStrength)); } quadraticVariance = Math.sqrt(quadraticVariance / n); setMetadata(String.valueOf(df.format(quadraticVariance)), anagraficaObject, ConstantNetwork.PREFIX_METADATA_BIBLIOMETRIC_4 + getType()); result.add(researcher); } catch (Exception e) { log.error("Error try to build object to index with ID:" + researcher.getId()); log.error(e.getMessage(), e); otherError = true; continue; } } committnode: for (ResearcherPage node : result) { // try // { applicationService.saveOrUpdate(ResearcherPage.class, node); boolean rr = ((CrisSearchService) getIndexer().getIndexer()).indexCrisObject(node, true); // index node if (rr) { importedNodes++; } else { discardedNode.add(new String[] { getConnectionName() + " - " + node.getId() }); } // } // catch (SolrServerException e) // { // log.error(e.getMessage(), e); // discardedNode.add(new String[] { getConnectionName() + " - " + node.getId()}); // continue committnode; // } // catch (IOException e) // { // log.error(e.getMessage(), e); // discardedNode.add(new String[] { getConnectionName() + " - " + node.getId()}); // continue committnode; // } } log.debug("commit " + getType()); getIndexer().getIndexer().commit(); return result; } private void setMetadata(String value, RPAdditionalFieldStorage anagraficaObject, String shortName) { List<RPProperty> nListConnectionRPP = anagraficaObject.getAnagrafica4view().get(shortName); RPProperty nConnectionRPP = null; if (nListConnectionRPP != null && nListConnectionRPP.size() > 0) { List<RPProperty> toRemove = new LinkedList<RPProperty>(); for (RPProperty p : nListConnectionRPP) { toRemove.add(p); } for (RPProperty to : toRemove) { anagraficaObject.removeProprieta(to); } // nConnectionRPP = nListConnectionRPP.get(0); } // else // { nConnectionRPP = anagraficaObject.createProprieta( applicationService.findPropertiesDefinitionByShortName(RPPropertiesDefinition.class, shortName)); // } TextValue nConnectionValue = new TextValue(); nConnectionValue.setOggetto(value); nConnectionRPP.setValue(nConnectionValue); nConnectionRPP.setVisibility(VisibilityConstants.PUBLIC); } protected String getDepartmentFromSOLR(String a_authority) throws SearchServiceException { SolrQuery solrQuery = new SolrQuery(); solrQuery.setQuery("search.resourceid:" + ResearcherPageUtils.getRealPersistentIdentifier(a_authority, ResearcherPage.class) + " AND search.resourcetype:" + CrisConstants.RP_TYPE_ID); solrQuery.setFields("rp_dept"); solrQuery.setRows(1); QueryResponse rsp = getService().getSearcher().search(solrQuery); SolrDocumentList publications = rsp.getResults(); Iterator<SolrDocument> iter = publications.iterator(); String rp_dept = ""; while (iter.hasNext()) { SolrDocument publication = iter.next(); rp_dept = (String) publication.getFirstValue("rp_dept"); break; } return rp_dept; } protected String getStatusFromSOLR(String a_authority) throws SearchServiceException { SolrQuery solrQuery = new SolrQuery(); solrQuery.setQuery("search.resourceid:" + ResearcherPageUtils.getRealPersistentIdentifier(a_authority, ResearcherPage.class) + " AND search.resourcetype:" + CrisConstants.RP_TYPE_ID); solrQuery.setFields("rp_boolean_status"); solrQuery.setRows(1); QueryResponse rsp = getService().getSearcher().search(solrQuery); SolrDocumentList publications = rsp.getResults(); Iterator<SolrDocument> iter = publications.iterator(); String rp_status = ""; while (iter.hasNext()) { SolrDocument publication = iter.next(); rp_status = (String) publication.getFirstValue("rp_boolean_status"); break; } return rp_status; } }