1. Modified the edge generation logic in co-author vis to exclude all the edges between an ego & it self.
2. Refactored some portion of the code. 3. Added another utilities vis - whose sole job is to generate URLs on the fly for requested individuals - whether it be profile urls or some other vis specific urls.
This commit is contained in:
parent
32bbd519c2
commit
954b726904
12 changed files with 185 additions and 48 deletions
|
@ -112,6 +112,10 @@ public class VisualizationController extends BaseEditController {
|
||||||
|
|
||||||
public static final String COAUTHORSHIP_VIS_URL_VALUE
|
public static final String COAUTHORSHIP_VIS_URL_VALUE
|
||||||
= "coauthorship";
|
= "coauthorship";
|
||||||
|
|
||||||
|
public static final String UTILITIES_URL_VALUE
|
||||||
|
= "utilities";
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -209,6 +213,31 @@ public class VisualizationController extends BaseEditController {
|
||||||
} else if (PDF_REPORT_VIS_URL_VALUE
|
} else if (PDF_REPORT_VIS_URL_VALUE
|
||||||
.equalsIgnoreCase(vreq.getParameter(VIS_TYPE_URL_HANDLE))) {
|
.equalsIgnoreCase(vreq.getParameter(VIS_TYPE_URL_HANDLE))) {
|
||||||
|
|
||||||
|
} else if (UTILITIES_URL_VALUE
|
||||||
|
.equalsIgnoreCase(vreq.getParameter(VIS_TYPE_URL_HANDLE))) {
|
||||||
|
|
||||||
|
edu.cornell.mannlib.vitro.webapp.visualization.utilities.VisualizationRequestHandler visRequestHandler =
|
||||||
|
new edu.cornell.mannlib.vitro.webapp.visualization.utilities.VisualizationRequestHandler(vreq, request, response, log);
|
||||||
|
|
||||||
|
String rdfResultFormatParam = "RDF/XML-ABBREV";
|
||||||
|
|
||||||
|
DataSource dataSource = setupJENADataSource(request,
|
||||||
|
response,
|
||||||
|
vreq,
|
||||||
|
rdfResultFormatParam);
|
||||||
|
|
||||||
|
if (dataSource != null) {
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This is side-effecting because the visualization content is added
|
||||||
|
* to the request object.
|
||||||
|
* */
|
||||||
|
visRequestHandler.generateVisualization(dataSource);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
log.error("ERROR! data model empoty");
|
||||||
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
log.debug("vis uqery parameter value -> " + vreq.getParameter("vis"));
|
log.debug("vis uqery parameter value -> " + vreq.getParameter("vis"));
|
||||||
|
@ -319,3 +348,4 @@ public class VisualizationController extends BaseEditController {
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2,6 +2,7 @@ package edu.cornell.mannlib.vitro.webapp.controller.visualization;
|
||||||
|
|
||||||
public class VisualizationFrameworkConstants {
|
public class VisualizationFrameworkConstants {
|
||||||
|
|
||||||
|
public static final String VIS_TYPE_URL_HANDLE = "vis";
|
||||||
public static final String VIS_CONTAINER_URL_HANDLE = "container";
|
public static final String VIS_CONTAINER_URL_HANDLE = "container";
|
||||||
public static final String INDIVIDUAL_URI_URL_HANDLE = "uri";
|
public static final String INDIVIDUAL_URI_URL_HANDLE = "uri";
|
||||||
public static final String VIS_MODE_URL_HANDLE = "vis_mode";
|
public static final String VIS_MODE_URL_HANDLE = "vis_mode";
|
||||||
|
|
|
@ -339,7 +339,7 @@ public class VisualizationCodeGenerator {
|
||||||
"=" + URLEncoder.encode(individualURI,
|
"=" + URLEncoder.encode(individualURI,
|
||||||
VisualizationController.URL_ENCODING_SCHEME).toString() +
|
VisualizationController.URL_ENCODING_SCHEME).toString() +
|
||||||
"&" +
|
"&" +
|
||||||
"vis" +
|
VisualizationFrameworkConstants.VIS_TYPE_URL_HANDLE +
|
||||||
"=" + URLEncoder.encode(VisualizationController
|
"=" + URLEncoder.encode(VisualizationController
|
||||||
.PERSON_PUBLICATION_COUNT_VIS_URL_VALUE,
|
.PERSON_PUBLICATION_COUNT_VIS_URL_VALUE,
|
||||||
VisualizationController.URL_ENCODING_SCHEME).toString() +
|
VisualizationController.URL_ENCODING_SCHEME).toString() +
|
||||||
|
|
|
@ -26,11 +26,11 @@ import com.hp.hpl.jena.rdf.model.RDFNode;
|
||||||
import edu.cornell.mannlib.vitro.webapp.visualization.constants.QueryConstants;
|
import edu.cornell.mannlib.vitro.webapp.visualization.constants.QueryConstants;
|
||||||
import edu.cornell.mannlib.vitro.webapp.visualization.constants.QueryFieldLabels;
|
import edu.cornell.mannlib.vitro.webapp.visualization.constants.QueryFieldLabels;
|
||||||
import edu.cornell.mannlib.vitro.webapp.visualization.exceptions.MalformedQueryParametersException;
|
import edu.cornell.mannlib.vitro.webapp.visualization.exceptions.MalformedQueryParametersException;
|
||||||
import edu.cornell.mannlib.vitro.webapp.visualization.utils.UniqueIDGenerator;
|
|
||||||
import edu.cornell.mannlib.vitro.webapp.visualization.valueobjects.BiboDocument;
|
import edu.cornell.mannlib.vitro.webapp.visualization.valueobjects.BiboDocument;
|
||||||
import edu.cornell.mannlib.vitro.webapp.visualization.valueobjects.Edge;
|
import edu.cornell.mannlib.vitro.webapp.visualization.valueobjects.Edge;
|
||||||
import edu.cornell.mannlib.vitro.webapp.visualization.valueobjects.Node;
|
import edu.cornell.mannlib.vitro.webapp.visualization.valueobjects.Node;
|
||||||
import edu.cornell.mannlib.vitro.webapp.visualization.valueobjects.VivoCollegeOrSchool;
|
import edu.cornell.mannlib.vitro.webapp.visualization.valueobjects.VivoCollegeOrSchool;
|
||||||
|
import edu.cornell.mannlib.vitro.webapp.visualization.visutils.UniqueIDGenerator;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -116,6 +116,16 @@ public class QueryHandler {
|
||||||
|
|
||||||
egoNode.addAuthorDocument(biboDocument);
|
egoNode.addAuthorDocument(biboDocument);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* After some discussion we concluded that for the purpose of this visualization
|
||||||
|
* we do not want a co-author node or edge if the publication has only one
|
||||||
|
* author and that happens to be the ego.
|
||||||
|
* */
|
||||||
|
if (solution.get(QueryFieldLabels.AUTHOR_URL).toString().equalsIgnoreCase(
|
||||||
|
solution.get(QueryFieldLabels.CO_AUTHOR_URL).toString())) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
Node coAuthorNode;
|
Node coAuthorNode;
|
||||||
|
|
||||||
RDFNode coAuthorURLNode = solution.get(QueryFieldLabels.CO_AUTHOR_URL);
|
RDFNode coAuthorURLNode = solution.get(QueryFieldLabels.CO_AUTHOR_URL);
|
||||||
|
|
|
@ -21,8 +21,8 @@ import edu.cornell.mannlib.vitro.webapp.controller.visualization.VisualizationCo
|
||||||
import edu.cornell.mannlib.vitro.webapp.controller.visualization.VisualizationFrameworkConstants;
|
import edu.cornell.mannlib.vitro.webapp.controller.visualization.VisualizationFrameworkConstants;
|
||||||
import edu.cornell.mannlib.vitro.webapp.visualization.constants.QueryConstants;
|
import edu.cornell.mannlib.vitro.webapp.visualization.constants.QueryConstants;
|
||||||
import edu.cornell.mannlib.vitro.webapp.visualization.exceptions.MalformedQueryParametersException;
|
import edu.cornell.mannlib.vitro.webapp.visualization.exceptions.MalformedQueryParametersException;
|
||||||
import edu.cornell.mannlib.vitro.webapp.visualization.utils.GenericQueryHandler;
|
|
||||||
import edu.cornell.mannlib.vitro.webapp.visualization.valueobjects.GenericQueryMap;
|
import edu.cornell.mannlib.vitro.webapp.visualization.valueobjects.GenericQueryMap;
|
||||||
|
import edu.cornell.mannlib.vitro.webapp.visualization.visutils.GenericQueryHandler;
|
||||||
|
|
||||||
public class VisualizationRequestHandler {
|
public class VisualizationRequestHandler {
|
||||||
|
|
||||||
|
@ -54,8 +54,10 @@ public class VisualizationRequestHandler {
|
||||||
|
|
||||||
String visContainer = vitroRequest.getParameter(VisualizationFrameworkConstants.VIS_CONTAINER_URL_HANDLE);
|
String visContainer = vitroRequest.getParameter(VisualizationFrameworkConstants.VIS_CONTAINER_URL_HANDLE);
|
||||||
|
|
||||||
|
System.out.println("******************************************************");
|
||||||
|
System.out.println(VisualizationFrameworkConstants.VIS_MODE_URL_HANDLE);
|
||||||
|
System.out.println(vitroRequest.getParameter(VisualizationFrameworkConstants.VIS_MODE_URL_HANDLE));
|
||||||
|
System.out.println(VisualizationFrameworkConstants.IMAGE_VIS_MODE_URL_VALUE);
|
||||||
/*
|
/*
|
||||||
* If the data being requested is about a standalone image, which is used when we want
|
* If the data being requested is about a standalone image, which is used when we want
|
||||||
* to render an image & other info for a co-author OR ego for that matter.
|
* to render an image & other info for a co-author OR ego for that matter.
|
||||||
|
@ -99,7 +101,7 @@ public class VisualizationRequestHandler {
|
||||||
|
|
||||||
File imageFile = new File(imageServerPath) ;
|
File imageFile = new File(imageServerPath) ;
|
||||||
|
|
||||||
if (imageFile == null) {
|
if (!imageFile.exists()) {
|
||||||
|
|
||||||
Portal portal = vitroRequest.getPortal();
|
Portal portal = vitroRequest.getPortal();
|
||||||
String themeDir = portal != null ? portal.getThemeDir() : Portal.DEFAULT_THEME_DIR_FROM_CONTEXT;
|
String themeDir = portal != null ? portal.getThemeDir() : Portal.DEFAULT_THEME_DIR_FROM_CONTEXT;
|
||||||
|
@ -114,6 +116,17 @@ public class VisualizationRequestHandler {
|
||||||
|
|
||||||
System.out.println(imagePath);
|
System.out.println(imagePath);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
System.out.println("ABSOLUTE PATH : " + imageFile.getAbsolutePath());
|
||||||
|
try {
|
||||||
|
System.out.println("ABSOLUTE PATH : " + imageFile.getCanonicalPath());
|
||||||
|
} catch (IOException e) {
|
||||||
|
// TODO Auto-generated catch block
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
System.out.println("ABSOLUTE PATH : " + imageFile.getName());
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -136,6 +149,9 @@ public class VisualizationRequestHandler {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
prepareVisualizationQueryImageResponse(imagePath);
|
||||||
|
return;
|
||||||
|
|
||||||
|
|
||||||
} catch (MalformedQueryParametersException e) {
|
} catch (MalformedQueryParametersException e) {
|
||||||
try {
|
try {
|
||||||
|
@ -148,6 +164,7 @@ public class VisualizationRequestHandler {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -5,41 +5,6 @@ import java.util.Map;
|
||||||
|
|
||||||
public class QueryConstants {
|
public class QueryConstants {
|
||||||
|
|
||||||
/*
|
|
||||||
* This is not supposed to be used. Will remove after verifying that the dynamic prefix
|
|
||||||
* section generation works.
|
|
||||||
* */
|
|
||||||
public static final String SPARQL_QUERY_PREFIXES_DEP = "" +
|
|
||||||
"PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>\n" +
|
|
||||||
"PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>\n" +
|
|
||||||
"PREFIX vitro: <http://vitro.mannlib.cornell.edu/ns/vitro/0.7#>\n" +
|
|
||||||
"PREFIX vivo: <http://vivo.library.cornell.edu/ns/0.1#>\n" +
|
|
||||||
"PREFIX core: <http://vivoweb.org/ontology/core#>\n" +
|
|
||||||
"PREFIX bibo: <http://purl.org/ontology/bibo/>\n" +
|
|
||||||
"PREFIX foaf: <http://xmlns.com/foaf/0.1/>\n" +
|
|
||||||
"PREFIX aktp: <http://www.aktors.org/ontology/portal#>\n" +
|
|
||||||
"PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>\n" +
|
|
||||||
"PREFIX owl: <http://www.w3.org/2002/07/owl#>\n" +
|
|
||||||
"PREFIX swrl: <http://www.w3.org/2003/11/swrl#>\n" +
|
|
||||||
"PREFIX swrlb: <http://www.w3.org/2003/11/swrlb#>\n" +
|
|
||||||
"PREFIX far: <http://vitro.mannlib.cornell.edu/ns/reporting#>\n" +
|
|
||||||
"PREFIX ai: <http://vitro.mannlib.cornell.edu/ns/hotel#>\n" +
|
|
||||||
"PREFIX akts: <http://www.aktors.org/ontology/support#>\n" +
|
|
||||||
"PREFIX hr: <http://vivo.cornell.edu/ns/hr/0.9/hr.owl#>\n" +
|
|
||||||
"PREFIX dcterms: <http://purl.org/dc/terms/>\n" +
|
|
||||||
"PREFIX dcelem: <http://purl.org/dc/elements/1.1/>\n" +
|
|
||||||
"PREFIX event: <http://purl.org/NET/c4dm/event.owl#>\n" +
|
|
||||||
"PREFIX geo: <http://aims.fao.org/aos/geopolitical.owl#>\n" +
|
|
||||||
"PREFIX mann: <http://vivo.cornell.edu/ns/mannadditions/0.1#>\n" +
|
|
||||||
"PREFIX pubmed: <http://vitro.mannlib.cornell.edu/ns/pubmed#>\n" +
|
|
||||||
"PREFIX rdfsyn: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>\n" +
|
|
||||||
"PREFIX skos: <http://www.w3.org/2004/02/skos/core#>\n" +
|
|
||||||
"PREFIX socsci: <http://vivo.library.cornell.edu/ns/vivo/socsci/0.1#>\n" +
|
|
||||||
"PREFIX stars: <http://vitro.mannlib.cornell.edu/ns/cornell/stars/classes#>\n" +
|
|
||||||
"PREFIX temp: <http://vitro.mannlib.cornell.edu/ns/temp#>\n" +
|
|
||||||
"PREFIX wos: <http://vivo.mannlib.cornell.edu/ns/ThomsonWOS/0.1#>\n";
|
|
||||||
|
|
||||||
|
|
||||||
public static final Map<String, String> PREFIX_TO_NAMESPACE = new HashMap<String, String>() {{
|
public static final Map<String, String> PREFIX_TO_NAMESPACE = new HashMap<String, String>() {{
|
||||||
|
|
||||||
put("rdf", "http://www.w3.org/1999/02/22-rdf-syntax-ns#");
|
put("rdf", "http://www.w3.org/1999/02/22-rdf-syntax-ns#");
|
||||||
|
|
|
@ -0,0 +1,114 @@
|
||||||
|
package edu.cornell.mannlib.vitro.webapp.visualization.utilities;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.PrintWriter;
|
||||||
|
import java.io.UnsupportedEncodingException;
|
||||||
|
import java.net.URLEncoder;
|
||||||
|
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
|
||||||
|
import org.apache.commons.logging.Log;
|
||||||
|
|
||||||
|
import com.hp.hpl.jena.query.DataSource;
|
||||||
|
|
||||||
|
import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
|
||||||
|
import edu.cornell.mannlib.vitro.webapp.controller.visualization.VisualizationController;
|
||||||
|
import edu.cornell.mannlib.vitro.webapp.controller.visualization.VisualizationFrameworkConstants;
|
||||||
|
|
||||||
|
public class VisualizationRequestHandler {
|
||||||
|
|
||||||
|
private VitroRequest vitroRequest;
|
||||||
|
private HttpServletRequest request;
|
||||||
|
private HttpServletResponse response;
|
||||||
|
private Log log;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public VisualizationRequestHandler(VitroRequest vitroRequest,
|
||||||
|
HttpServletRequest request, HttpServletResponse response, Log log) {
|
||||||
|
|
||||||
|
this.vitroRequest = vitroRequest;
|
||||||
|
this.request = request;
|
||||||
|
this.response = response;
|
||||||
|
this.log = log;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void generateVisualization(DataSource dataSource) {
|
||||||
|
|
||||||
|
String individualURIParam = vitroRequest.getParameter(VisualizationFrameworkConstants.INDIVIDUAL_URI_URL_HANDLE);
|
||||||
|
|
||||||
|
String visMode = vitroRequest.getParameter(VisualizationFrameworkConstants.VIS_MODE_URL_HANDLE);
|
||||||
|
|
||||||
|
String profileVisMode = "PROFILE_URL";
|
||||||
|
|
||||||
|
String coAuthorVisMode = "COAUTHORSHIP_URL";
|
||||||
|
|
||||||
|
String preparedURL = "";
|
||||||
|
|
||||||
|
try {
|
||||||
|
|
||||||
|
/*
|
||||||
|
* By default we will be generating profile url else some specific url like coAuthorShip vis
|
||||||
|
* url for that individual.
|
||||||
|
* */
|
||||||
|
if (coAuthorVisMode.equalsIgnoreCase(visMode)) {
|
||||||
|
|
||||||
|
preparedURL += request.getContextPath()
|
||||||
|
+ "/admin/visQuery"
|
||||||
|
+ "?"
|
||||||
|
+ VisualizationFrameworkConstants.INDIVIDUAL_URI_URL_HANDLE
|
||||||
|
+ "=" + URLEncoder.encode(individualURIParam,
|
||||||
|
VisualizationController.URL_ENCODING_SCHEME).toString()
|
||||||
|
+ "&"
|
||||||
|
+ VisualizationFrameworkConstants.VIS_TYPE_URL_HANDLE
|
||||||
|
+ "=" + URLEncoder.encode("coauthorship",
|
||||||
|
VisualizationController.URL_ENCODING_SCHEME).toString()
|
||||||
|
+ "&"
|
||||||
|
+ VisualizationFrameworkConstants.RENDER_MODE_URL_HANDLE
|
||||||
|
+ "=" + URLEncoder.encode(VisualizationFrameworkConstants.STANDALONE_RENDER_MODE_URL_VALUE,
|
||||||
|
VisualizationController.URL_ENCODING_SCHEME).toString();
|
||||||
|
|
||||||
|
|
||||||
|
prepareVisualizationQueryResponse(preparedURL);
|
||||||
|
return;
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
preparedURL += request.getContextPath()
|
||||||
|
+ "/individual"
|
||||||
|
+ "?"
|
||||||
|
+ VisualizationFrameworkConstants.INDIVIDUAL_URI_URL_HANDLE
|
||||||
|
+ "=" + URLEncoder.encode(individualURIParam,
|
||||||
|
VisualizationController.URL_ENCODING_SCHEME).toString();
|
||||||
|
|
||||||
|
prepareVisualizationQueryResponse(preparedURL);
|
||||||
|
return;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (UnsupportedEncodingException e) {
|
||||||
|
log.error(e.getLocalizedMessage());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private void prepareVisualizationQueryResponse(String preparedURL) {
|
||||||
|
|
||||||
|
response.setContentType("text/plain");
|
||||||
|
|
||||||
|
try {
|
||||||
|
|
||||||
|
PrintWriter responseWriter = response.getWriter();
|
||||||
|
|
||||||
|
responseWriter.append(preparedURL);
|
||||||
|
|
||||||
|
responseWriter.close();
|
||||||
|
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -7,8 +7,8 @@ import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
import edu.cornell.mannlib.vitro.webapp.visualization.constants.VOConstants;
|
import edu.cornell.mannlib.vitro.webapp.visualization.constants.VOConstants;
|
||||||
import edu.cornell.mannlib.vitro.webapp.visualization.utils.UniqueIDGenerator;
|
import edu.cornell.mannlib.vitro.webapp.visualization.visutils.UniqueIDGenerator;
|
||||||
import edu.cornell.mannlib.vitro.webapp.visualization.utils.VOUtils;
|
import edu.cornell.mannlib.vitro.webapp.visualization.visutils.VOUtils;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
|
|
|
@ -7,8 +7,8 @@ import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
import edu.cornell.mannlib.vitro.webapp.visualization.constants.VOConstants;
|
import edu.cornell.mannlib.vitro.webapp.visualization.constants.VOConstants;
|
||||||
import edu.cornell.mannlib.vitro.webapp.visualization.utils.UniqueIDGenerator;
|
import edu.cornell.mannlib.vitro.webapp.visualization.visutils.UniqueIDGenerator;
|
||||||
import edu.cornell.mannlib.vitro.webapp.visualization.utils.VOUtils;
|
import edu.cornell.mannlib.vitro.webapp.visualization.visutils.VOUtils;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
package edu.cornell.mannlib.vitro.webapp.visualization.utils;
|
package edu.cornell.mannlib.vitro.webapp.visualization.visutils;
|
||||||
|
|
||||||
import org.apache.commons.logging.Log;
|
import org.apache.commons.logging.Log;
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
package edu.cornell.mannlib.vitro.webapp.visualization.utils;
|
package edu.cornell.mannlib.vitro.webapp.visualization.visutils;
|
||||||
|
|
||||||
public class UniqueIDGenerator {
|
public class UniqueIDGenerator {
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
package edu.cornell.mannlib.vitro.webapp.visualization.utils;
|
package edu.cornell.mannlib.vitro.webapp.visualization.visutils;
|
||||||
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
Loading…
Add table
Reference in a new issue