1. Added code related to Visualization Framework.
2. Added code related to Person Publication count visualization. 3. Added code related to College Publication count visualization. 4. Added code related to PDF Report visualization.
This commit is contained in:
parent
d4fe92441c
commit
25e534e23f
30 changed files with 3697 additions and 1 deletions
|
@ -1086,6 +1086,26 @@
|
||||||
<url-pattern>/admin/sparqlquery</url-pattern>
|
<url-pattern>/admin/sparqlquery</url-pattern>
|
||||||
</servlet-mapping>
|
</servlet-mapping>
|
||||||
|
|
||||||
|
<servlet>
|
||||||
|
<servlet-name>DummyVisClient</servlet-name>
|
||||||
|
<servlet-class>edu.cornell.mannlib.vitro.webapp.controller.visualization.DummyVisClientController</servlet-class>
|
||||||
|
</servlet>
|
||||||
|
|
||||||
|
<servlet-mapping>
|
||||||
|
<servlet-name>DummyVisClient</servlet-name>
|
||||||
|
<url-pattern>/admin/dummyVisClient</url-pattern>
|
||||||
|
</servlet-mapping>
|
||||||
|
|
||||||
|
<servlet>
|
||||||
|
<servlet-name>VisualizationController</servlet-name>
|
||||||
|
<servlet-class>edu.cornell.mannlib.vitro.webapp.controller.visualization.VisualizationController</servlet-class>
|
||||||
|
</servlet>
|
||||||
|
|
||||||
|
<servlet-mapping>
|
||||||
|
<servlet-name>VisualizationController</servlet-name>
|
||||||
|
<url-pattern>/admin/visQuery</url-pattern>
|
||||||
|
</servlet-mapping>
|
||||||
|
|
||||||
<servlet>
|
<servlet>
|
||||||
<servlet-name>authtest</servlet-name>
|
<servlet-name>authtest</servlet-name>
|
||||||
<servlet-class>edu.cornell.mannlib.vitro.webapp.auth.AuthTestController</servlet-class>
|
<servlet-class>edu.cornell.mannlib.vitro.webapp.auth.AuthTestController</servlet-class>
|
||||||
|
|
BIN
webapp/lib/iText-5.0.2.jar
Normal file
BIN
webapp/lib/iText-5.0.2.jar
Normal file
Binary file not shown.
|
@ -418,6 +418,10 @@ public class SparqlQueryServlet extends BaseEditController {
|
||||||
"PREFIX swrlb: <http://www.w3.org/2003/11/swrlb#>\n" +
|
"PREFIX swrlb: <http://www.w3.org/2003/11/swrlb#>\n" +
|
||||||
"PREFIX vitro: <http://vitro.mannlib.cornell.edu/ns/vitro/0.7#>\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 vivo: <http://vivo.library.cornell.edu/ns/0.1#>\n" +
|
||||||
|
"PREFIX bibo: <http://purl.org/ontology/bibo/>\n" +
|
||||||
|
"PREFIX foaf: <http://xmlns.com/foaf/0.1/>\n" +
|
||||||
|
"PREFIX core: <http://vivoweb.org/ontology/core#>\n" +
|
||||||
|
"PREFIX aktp: <http://www.aktors.org/ontology/portal#>\n"+
|
||||||
"#\n" +
|
"#\n" +
|
||||||
"# This query gets all range entities labels and types of a person\n"+
|
"# This query gets all range entities labels and types of a person\n"+
|
||||||
"# A query like this could be used to get enough info to create a display\n"+
|
"# A query like this could be used to get enough info to create a display\n"+
|
||||||
|
|
|
@ -0,0 +1,136 @@
|
||||||
|
package edu.cornell.mannlib.vitro.webapp.controller.visualization;
|
||||||
|
|
||||||
|
/*
|
||||||
|
Copyright (c) 2010, Cornell University
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright notice,
|
||||||
|
this list of conditions and the following disclaimer.
|
||||||
|
* Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
this list of conditions and the following disclaimer in the documentation
|
||||||
|
and/or other materials provided with the distribution.
|
||||||
|
* Neither the name of Cornell University nor the names of its contributors
|
||||||
|
may be used to endorse or promote products derived from this software
|
||||||
|
without specific prior written permission.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||||
|
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
||||||
|
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||||
|
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||||
|
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
import javax.servlet.RequestDispatcher;
|
||||||
|
import javax.servlet.ServletException;
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
|
||||||
|
import org.apache.commons.logging.Log;
|
||||||
|
import org.apache.commons.logging.LogFactory;
|
||||||
|
|
||||||
|
import edu.cornell.mannlib.vedit.beans.LoginFormBean;
|
||||||
|
import edu.cornell.mannlib.vedit.controller.BaseEditController;
|
||||||
|
import edu.cornell.mannlib.vitro.webapp.beans.Portal;
|
||||||
|
import edu.cornell.mannlib.vitro.webapp.controller.Controllers;
|
||||||
|
import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Services a sparql query. This will return a simple error message and a 501 if
|
||||||
|
* there is no jena Model.
|
||||||
|
*
|
||||||
|
* @author bdc34
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class DummyVisClientController extends BaseEditController {
|
||||||
|
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
private static final Log log = LogFactory.getLog(DummyVisClientController.class.getName());
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void doPost(HttpServletRequest request, HttpServletResponse response)
|
||||||
|
throws ServletException, IOException
|
||||||
|
{
|
||||||
|
this.doGet(request,response);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void doGet(HttpServletRequest request, HttpServletResponse response)
|
||||||
|
throws ServletException, IOException
|
||||||
|
{
|
||||||
|
super.doGet(request, response);
|
||||||
|
|
||||||
|
VitroRequest vreq = handleLoginAuthentication(request, response);
|
||||||
|
prepareVisualizationQueryResponse(request, response, vreq);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void prepareVisualizationQueryResponse(HttpServletRequest request,
|
||||||
|
HttpServletResponse response, VitroRequest vreq) {
|
||||||
|
|
||||||
|
Portal portal = vreq.getPortal();
|
||||||
|
|
||||||
|
RequestDispatcher requestDispatcher = request.getRequestDispatcher(Controllers.BASIC_JSP);
|
||||||
|
request.setAttribute("bodyJsp", "/templates/visualization/dummy_vis_client.jsp");
|
||||||
|
request.setAttribute("portalBean", portal);
|
||||||
|
request.setAttribute("title", "Dummy Visualization Client");
|
||||||
|
request.setAttribute("scripts", "/templates/visualization/visualization_scripts.jsp");
|
||||||
|
|
||||||
|
try {
|
||||||
|
requestDispatcher.forward(request, response);
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("EntityEditController could not forward to view.");
|
||||||
|
log.error(e.getMessage());
|
||||||
|
log.error(e.getStackTrace());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private VitroRequest handleLoginAuthentication(HttpServletRequest request,
|
||||||
|
HttpServletResponse response) throws IOException {
|
||||||
|
// This might not be required
|
||||||
|
/*
|
||||||
|
* why are there multiple places where the login is checked? shud be abtracted into
|
||||||
|
* new methoid?
|
||||||
|
* */
|
||||||
|
// if( !checkLoginStatus(request, response) )
|
||||||
|
// return null;
|
||||||
|
|
||||||
|
VitroRequest vreq = new VitroRequest(request);
|
||||||
|
|
||||||
|
Object obj = vreq.getSession().getAttribute("loginHandler");
|
||||||
|
LoginFormBean loginHandler = null;
|
||||||
|
|
||||||
|
if( obj != null && obj instanceof LoginFormBean )
|
||||||
|
loginHandler = ((LoginFormBean)obj);
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* what is the speciality of 5 in the conditions?
|
||||||
|
*
|
||||||
|
if( loginHandler == null ||
|
||||||
|
! "authenticated".equalsIgnoreCase(loginHandler.getLoginStatus()) ||
|
||||||
|
Integer.parseInt(loginHandler.getLoginRole()) <= 5 ){
|
||||||
|
HttpSession session = request.getSession(true);
|
||||||
|
|
||||||
|
session.setAttribute("postLoginRequest",
|
||||||
|
vreq.getRequestURI()+( vreq.getQueryString()!=null?('?' + vreq.getQueryString()):"" ));
|
||||||
|
String redirectURL = request.getContextPath() + Controllers.SITE_ADMIN + "?login=block";
|
||||||
|
response.sendRedirect(redirectURL);
|
||||||
|
return null;
|
||||||
|
}*/
|
||||||
|
return vreq;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,295 @@
|
||||||
|
package edu.cornell.mannlib.vitro.webapp.controller.visualization;
|
||||||
|
|
||||||
|
/*
|
||||||
|
Copyright (c) 2010, Cornell University
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright notice,
|
||||||
|
this list of conditions and the following disclaimer.
|
||||||
|
* Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
this list of conditions and the following disclaimer in the documentation
|
||||||
|
and/or other materials provided with the distribution.
|
||||||
|
* Neither the name of Cornell University nor the names of its contributors
|
||||||
|
may be used to endorse or promote products derived from this software
|
||||||
|
without specific prior written permission.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||||
|
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
||||||
|
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||||
|
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||||
|
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.HashMap;
|
||||||
|
|
||||||
|
import javax.servlet.RequestDispatcher;
|
||||||
|
import javax.servlet.ServletException;
|
||||||
|
import javax.servlet.ServletOutputStream;
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
import javax.servlet.http.HttpSession;
|
||||||
|
|
||||||
|
import org.apache.commons.logging.Log;
|
||||||
|
import org.apache.commons.logging.LogFactory;
|
||||||
|
|
||||||
|
import com.hp.hpl.jena.query.DataSource;
|
||||||
|
import com.hp.hpl.jena.query.DatasetFactory;
|
||||||
|
import com.hp.hpl.jena.query.Syntax;
|
||||||
|
import com.hp.hpl.jena.rdf.model.Model;
|
||||||
|
import com.hp.hpl.jena.rdf.model.ModelMaker;
|
||||||
|
import com.hp.hpl.jena.sparql.resultset.ResultSetFormat;
|
||||||
|
|
||||||
|
import edu.cornell.mannlib.vedit.beans.LoginFormBean;
|
||||||
|
import edu.cornell.mannlib.vedit.controller.BaseEditController;
|
||||||
|
import edu.cornell.mannlib.vitro.webapp.beans.Portal;
|
||||||
|
import edu.cornell.mannlib.vitro.webapp.controller.Controllers;
|
||||||
|
import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Services a sparql query. This will return a simple error message and a 501 if
|
||||||
|
* there is no jena Model.
|
||||||
|
*
|
||||||
|
* @author bdc34
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class VisualizationController extends BaseEditController {
|
||||||
|
|
||||||
|
private static final String VIS_TYPE_URL_HANDLE = "vis";
|
||||||
|
|
||||||
|
public static final String URL_ENCODING_SCHEME = "UTF-8";
|
||||||
|
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
private static final Log log = LogFactory.getLog(VisualizationController.class.getName());
|
||||||
|
|
||||||
|
protected static final Syntax SYNTAX = Syntax.syntaxARQ;
|
||||||
|
|
||||||
|
protected static HashMap<String,ResultSetFormat> formatSymbols = new HashMap<String,ResultSetFormat>();
|
||||||
|
static{
|
||||||
|
formatSymbols.put( ResultSetFormat.syntaxXML.getSymbol(), ResultSetFormat.syntaxXML);
|
||||||
|
formatSymbols.put( ResultSetFormat.syntaxRDF_XML.getSymbol(), ResultSetFormat.syntaxRDF_XML);
|
||||||
|
formatSymbols.put( ResultSetFormat.syntaxRDF_N3.getSymbol(), ResultSetFormat.syntaxRDF_N3);
|
||||||
|
formatSymbols.put( ResultSetFormat.syntaxText.getSymbol() , ResultSetFormat.syntaxText);
|
||||||
|
formatSymbols.put( ResultSetFormat.syntaxJSON.getSymbol() , ResultSetFormat.syntaxJSON);
|
||||||
|
formatSymbols.put( "vitro:csv", null);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected static HashMap<String,String> rdfFormatSymbols = new HashMap<String,String>();
|
||||||
|
static {
|
||||||
|
rdfFormatSymbols.put( "RDF/XML", "application/rdf+xml" );
|
||||||
|
rdfFormatSymbols.put( "RDF/XML-ABBREV", "application/rdf+xml" );
|
||||||
|
rdfFormatSymbols.put( "N3", "text/n3" );
|
||||||
|
rdfFormatSymbols.put( "N-TRIPLE", "text/plain" );
|
||||||
|
rdfFormatSymbols.put( "TTL", "application/x-turtle" );
|
||||||
|
}
|
||||||
|
|
||||||
|
protected static HashMap<String, String> mimeTypes = new HashMap<String,String>();
|
||||||
|
static{
|
||||||
|
mimeTypes.put( ResultSetFormat.syntaxXML.getSymbol() , "text/xml" );
|
||||||
|
mimeTypes.put( ResultSetFormat.syntaxRDF_XML.getSymbol(), "application/rdf+xml" );
|
||||||
|
mimeTypes.put( ResultSetFormat.syntaxRDF_N3.getSymbol(), "text/plain" );
|
||||||
|
mimeTypes.put( ResultSetFormat.syntaxText.getSymbol() , "text/plain");
|
||||||
|
mimeTypes.put( ResultSetFormat.syntaxJSON.getSymbol(), "application/javascript" );
|
||||||
|
mimeTypes.put( "vitro:csv", "text/csv");
|
||||||
|
}
|
||||||
|
|
||||||
|
public static final String PERSON_PUBLICATION_COUNT_VIS_URL_VALUE
|
||||||
|
= "person_pub_count";
|
||||||
|
|
||||||
|
public static final String PDF_REPORT_VIS_URL_VALUE
|
||||||
|
= "pdf_report";
|
||||||
|
|
||||||
|
|
||||||
|
public static final String COLLEGE_PUBLICATION_COUNT_VIS_URL_VALUE
|
||||||
|
= "college_pub_count";
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void doPost(HttpServletRequest request, HttpServletResponse response)
|
||||||
|
throws ServletException, IOException
|
||||||
|
{
|
||||||
|
this.doGet(request,response);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void doGet(HttpServletRequest request, HttpServletResponse response)
|
||||||
|
throws ServletException, IOException
|
||||||
|
{
|
||||||
|
super.doGet(request, response);
|
||||||
|
|
||||||
|
VitroRequest vreq = handleLoginAuthentication(request, response);
|
||||||
|
|
||||||
|
|
||||||
|
if (PERSON_PUBLICATION_COUNT_VIS_URL_VALUE
|
||||||
|
.equalsIgnoreCase(vreq.getParameter(VIS_TYPE_URL_HANDLE))) {
|
||||||
|
|
||||||
|
edu.cornell.mannlib.vitro.webapp.visualization.personpubcount.VisualizationRequestHandler visRequestHandler =
|
||||||
|
new edu.cornell.mannlib.vitro.webapp.visualization.personpubcount.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 Empty");
|
||||||
|
}
|
||||||
|
|
||||||
|
} else if (COLLEGE_PUBLICATION_COUNT_VIS_URL_VALUE
|
||||||
|
.equalsIgnoreCase(vreq.getParameter(VIS_TYPE_URL_HANDLE))) {
|
||||||
|
|
||||||
|
edu.cornell.mannlib.vitro.webapp.visualization.collegepubcount.VisualizationRequestHandler visRequestHandler =
|
||||||
|
new edu.cornell.mannlib.vitro.webapp.visualization.collegepubcount.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 if (PDF_REPORT_VIS_URL_VALUE
|
||||||
|
.equalsIgnoreCase(vreq.getParameter(VIS_TYPE_URL_HANDLE))) {
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
log.debug("vis uqery parameter value -> " + vreq.getParameter("vis"));
|
||||||
|
log.debug("uri uqery parameter value -> " + vreq.getParameter("uri"));
|
||||||
|
log.debug("render_mode query parameter value -> " + vreq.getParameter("render_mode"));
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This is side-effecting because the error content is directly
|
||||||
|
* added to the request object. From where it is redirected to
|
||||||
|
* the error page.
|
||||||
|
* */
|
||||||
|
handleMalformedParameters("Inappropriate query parameters were submitted. ", request, response);
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
private VitroRequest handleLoginAuthentication(HttpServletRequest request,
|
||||||
|
HttpServletResponse response) throws IOException {
|
||||||
|
// This might not be required
|
||||||
|
/*
|
||||||
|
* why are there multiple places where the login is checked? shud be abtracted into
|
||||||
|
* new methoid?
|
||||||
|
* */
|
||||||
|
// if( !checkLoginStatus(request, response) )
|
||||||
|
// return null;
|
||||||
|
|
||||||
|
VitroRequest vreq = new VitroRequest(request);
|
||||||
|
|
||||||
|
Object obj = vreq.getSession().getAttribute("loginHandler");
|
||||||
|
LoginFormBean loginHandler = null;
|
||||||
|
|
||||||
|
|
||||||
|
if( obj != null && obj instanceof LoginFormBean )
|
||||||
|
loginHandler = ((LoginFormBean)obj);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* what is the speciality of 5 in the conditions?
|
||||||
|
*
|
||||||
|
if( loginHandler == null ||
|
||||||
|
! "authenticated".equalsIgnoreCase(loginHandler.getLoginStatus()) ||
|
||||||
|
Integer.parseInt(loginHandler.getLoginRole()) <= 5 ){
|
||||||
|
HttpSession session = request.getSession(true);
|
||||||
|
|
||||||
|
session.setAttribute("postLoginRequest",
|
||||||
|
vreq.getRequestURI()+( vreq.getQueryString()!=null?('?' + vreq.getQueryString()):"" ));
|
||||||
|
String redirectURL = request.getContextPath() + Controllers.SITE_ADMIN + "?login=block";
|
||||||
|
response.sendRedirect(redirectURL);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
return vreq;
|
||||||
|
}
|
||||||
|
|
||||||
|
private DataSource setupJENADataSource(HttpServletRequest request,
|
||||||
|
HttpServletResponse response, VitroRequest vreq,
|
||||||
|
String rdfResultFormatParam) {
|
||||||
|
|
||||||
|
Model model = vreq.getJenaOntModel(); // getModel()
|
||||||
|
if( model == null ){
|
||||||
|
doNoModelInContext(request,response);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
log.debug("rdfResultFormat was: " + rdfResultFormatParam);
|
||||||
|
|
||||||
|
DataSource dataSource = DatasetFactory.create() ;
|
||||||
|
ModelMaker maker = (ModelMaker) getServletContext().getAttribute("vitroJenaModelMaker");
|
||||||
|
|
||||||
|
dataSource.setDefaultModel(model) ;
|
||||||
|
|
||||||
|
return dataSource;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void doNoModelInContext(HttpServletRequest request, HttpServletResponse res){
|
||||||
|
try {
|
||||||
|
res.setStatus(HttpServletResponse.SC_NOT_IMPLEMENTED);
|
||||||
|
ServletOutputStream sos = res.getOutputStream();
|
||||||
|
sos.println("<html><body>this service is not supporeted by the current " +
|
||||||
|
"webapp configuration. A jena model is required in the servlet context.</body></html>" );
|
||||||
|
} catch (IOException e) {
|
||||||
|
log.error("Could not write to ServletOutputStream");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private void handleMalformedParameters(String errorMessage, HttpServletRequest request,
|
||||||
|
HttpServletResponse response)
|
||||||
|
throws ServletException, IOException {
|
||||||
|
|
||||||
|
VitroRequest vreq = new VitroRequest(request);
|
||||||
|
Portal portal = vreq.getPortal();
|
||||||
|
|
||||||
|
request.setAttribute("error", errorMessage);
|
||||||
|
|
||||||
|
RequestDispatcher requestDispatcher = request.getRequestDispatcher(Controllers.BASIC_JSP);
|
||||||
|
request.setAttribute("bodyJsp", "/templates/visualization/visualization_error.jsp");
|
||||||
|
request.setAttribute("portalBean", portal);
|
||||||
|
request.setAttribute("title", "Visualization Query Error");
|
||||||
|
|
||||||
|
try {
|
||||||
|
requestDispatcher.forward(request, response);
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("EntityEditController could not forward to view.");
|
||||||
|
log.error(e.getMessage());
|
||||||
|
log.error(e.getStackTrace());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,295 @@
|
||||||
|
package edu.cornell.mannlib.vitro.webapp.visualization;
|
||||||
|
|
||||||
|
import java.awt.BasicStroke;
|
||||||
|
import java.awt.Color;
|
||||||
|
import java.awt.Stroke;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.net.MalformedURLException;
|
||||||
|
import java.net.URL;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Map.Entry;
|
||||||
|
|
||||||
|
import com.itextpdf.text.BadElementException;
|
||||||
|
import com.itextpdf.text.BaseColor;
|
||||||
|
import com.itextpdf.text.Chunk;
|
||||||
|
import com.itextpdf.text.Document;
|
||||||
|
import com.itextpdf.text.DocumentException;
|
||||||
|
import com.itextpdf.text.Element;
|
||||||
|
import com.itextpdf.text.Font;
|
||||||
|
import com.itextpdf.text.FontFactory;
|
||||||
|
import com.itextpdf.text.Image;
|
||||||
|
import com.itextpdf.text.Paragraph;
|
||||||
|
import com.itextpdf.text.Phrase;
|
||||||
|
import com.itextpdf.text.pdf.ColumnText;
|
||||||
|
import com.itextpdf.text.pdf.PdfContentByte;
|
||||||
|
import com.itextpdf.text.pdf.PdfGState;
|
||||||
|
import com.itextpdf.text.pdf.PdfPCell;
|
||||||
|
import com.itextpdf.text.pdf.PdfPTable;
|
||||||
|
import com.itextpdf.text.pdf.PdfWriter;
|
||||||
|
|
||||||
|
public class PDFDocument{
|
||||||
|
|
||||||
|
|
||||||
|
static Stroke stroke = new BasicStroke(5.f, BasicStroke.CAP_ROUND,
|
||||||
|
BasicStroke.JOIN_ROUND);
|
||||||
|
|
||||||
|
final static Color bg = Color.green;
|
||||||
|
|
||||||
|
final static Color fg = Color.black;
|
||||||
|
|
||||||
|
public PDFDocument(String authorName,
|
||||||
|
Map<String, Integer> yearToPublicationCount,
|
||||||
|
Document document,
|
||||||
|
PdfWriter pdfWriter) {
|
||||||
|
|
||||||
|
// setPreferredSize(new Dimension(600,400));
|
||||||
|
|
||||||
|
try {
|
||||||
|
|
||||||
|
document.addTitle("PDF Pipeline iText Prototype");
|
||||||
|
document.addAuthor(authorName);
|
||||||
|
document.addSubject("This example tests text, color, image, transparency & table functionality.");
|
||||||
|
document.addKeywords("text, color, image, transparency, table");
|
||||||
|
document.addCreator("Standalone PDF Renderer using iText");
|
||||||
|
|
||||||
|
Paragraph header = new Paragraph();
|
||||||
|
|
||||||
|
Font pageHeaderStyle = FontFactory.getFont(FontFactory.TIMES_ROMAN, 15, Font.BOLDITALIC | Font.UNDERLINE);
|
||||||
|
Font featureHeaderStyle = FontFactory.getFont(FontFactory.TIMES_ROMAN, 10, new BaseColor(Color.red));
|
||||||
|
|
||||||
|
header.add(new Chunk("PDF Pipeline Prototype v2 using iText\n",
|
||||||
|
pageHeaderStyle));
|
||||||
|
|
||||||
|
header.setSpacingAfter(15f);
|
||||||
|
|
||||||
|
|
||||||
|
document.add(header);
|
||||||
|
|
||||||
|
|
||||||
|
Paragraph content = new Paragraph();
|
||||||
|
|
||||||
|
content.add(new Chunk("Publication Count - Author Name - " + authorName,
|
||||||
|
featureHeaderStyle));
|
||||||
|
|
||||||
|
content.setSpacingAfter(15f);
|
||||||
|
|
||||||
|
document.add(content);
|
||||||
|
// step4
|
||||||
|
|
||||||
|
PdfPTable publicationCount = createTable(yearToPublicationCount);
|
||||||
|
|
||||||
|
document.add(publicationCount);
|
||||||
|
|
||||||
|
content = new Paragraph();
|
||||||
|
|
||||||
|
content.add(new Chunk("Transparency of Shapes",
|
||||||
|
featureHeaderStyle));
|
||||||
|
|
||||||
|
content.setSpacingAfter(15f);
|
||||||
|
|
||||||
|
document.add(content);
|
||||||
|
|
||||||
|
createTransparencyShapes(document, pdfWriter);
|
||||||
|
|
||||||
|
|
||||||
|
createImage(document, pdfWriter, featureHeaderStyle);
|
||||||
|
|
||||||
|
} catch (DocumentException e) {
|
||||||
|
// TODO Auto-generated catch block
|
||||||
|
e.printStackTrace();
|
||||||
|
} catch (Exception e) {
|
||||||
|
// TODO Auto-generated catch block
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private void createImage(Document document, PdfWriter writer,
|
||||||
|
Font featureHeaderStyle) throws BadElementException,
|
||||||
|
MalformedURLException, IOException, DocumentException {
|
||||||
|
Image imageSprite = Image.getInstance(new URL("http://lh3.ggpht.com/_4msVPAgKJv8/SCRYD-pPVKI/AAAAAAAAAYU/zUN963EPoZc/s1024/102_0609.JPG"));
|
||||||
|
imageSprite.setAbsolutePosition(400, 500);
|
||||||
|
imageSprite.scaleAbsolute(171.0f, 250.0f);
|
||||||
|
float imageSpriteY = document.getPageSize().getHeight() * 0.60f;
|
||||||
|
float imageSpriteX = document.getPageSize().getWidth() * 0.65f;
|
||||||
|
imageSprite.setAlignment(Image.UNDERLYING);
|
||||||
|
|
||||||
|
document.add(imageSprite);
|
||||||
|
|
||||||
|
PdfContentByte cb = writer.getDirectContent();
|
||||||
|
ColumnText ct = new ColumnText(cb);
|
||||||
|
Chunk imageHeader = new Chunk("Images",
|
||||||
|
featureHeaderStyle);
|
||||||
|
ct.addText(imageHeader);
|
||||||
|
ct.setAlignment(Element.ALIGN_LEFT);
|
||||||
|
ct.setSimpleColumn(imageSpriteX, imageSpriteY - imageSprite.getScaledHeight(),
|
||||||
|
imageSpriteX + imageSprite.getScaledWidth(), imageSpriteY + imageSprite.getScaledHeight() + 20);
|
||||||
|
ct.go();
|
||||||
|
|
||||||
|
ct = new ColumnText(cb);
|
||||||
|
Chunk imageFooter = new Chunk("Footer to be set for a figure. Similar to 'image cpation'.",
|
||||||
|
FontFactory.getFont(FontFactory.TIMES_ROMAN, 8));
|
||||||
|
ct.addText(imageFooter);
|
||||||
|
ct.setAlignment(Element.ALIGN_CENTER);
|
||||||
|
ct.setSimpleColumn(imageSpriteX, imageSpriteY - 150, imageSpriteX + imageSprite.getScaledWidth(), imageSpriteY);
|
||||||
|
ct.go();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void createTransparencyShapes(Document document,
|
||||||
|
PdfWriter writer) throws Exception {
|
||||||
|
PdfContentByte cb = writer.getDirectContent();
|
||||||
|
|
||||||
|
pictureBackdrop(document.leftMargin(), 350, cb);
|
||||||
|
cb.saveState();
|
||||||
|
PdfGState gs1 = new PdfGState();
|
||||||
|
gs1.setFillOpacity(0.5f);
|
||||||
|
cb.setGState(gs1);
|
||||||
|
pictureCircles(document.leftMargin(), 350, cb);
|
||||||
|
cb.restoreState();
|
||||||
|
|
||||||
|
cb.resetRGBColorFill();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Prints a square and fills half of it with a gray rectangle.
|
||||||
|
* @param x
|
||||||
|
* @param y
|
||||||
|
* @param cb
|
||||||
|
* @throws Exception
|
||||||
|
*/
|
||||||
|
public void pictureBackdrop(float x, float y, PdfContentByte cb) throws Exception {
|
||||||
|
cb.setColorStroke(new BaseColor(Color.black));
|
||||||
|
cb.setColorFill(new BaseColor(Color.gray));
|
||||||
|
cb.rectangle(x, y, 100, 200);
|
||||||
|
cb.fill();
|
||||||
|
cb.setLineWidth(2);
|
||||||
|
cb.rectangle(x, y, 200, 200);
|
||||||
|
cb.stroke();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Prints 3 circles in different colors that intersect with eachother.
|
||||||
|
* @param x
|
||||||
|
* @param y
|
||||||
|
* @param cb
|
||||||
|
* @throws Exception
|
||||||
|
*/
|
||||||
|
public void pictureCircles(float x, float y, PdfContentByte cb) throws Exception {
|
||||||
|
|
||||||
|
cb.saveState();
|
||||||
|
PdfGState gs1 = new PdfGState();
|
||||||
|
gs1.setFillOpacity(1.0f);
|
||||||
|
cb.setGState(gs1);
|
||||||
|
cb.setColorFill(new BaseColor(Color.red));
|
||||||
|
cb.circle(x + 70, y + 70, 50);
|
||||||
|
cb.fill();
|
||||||
|
cb.restoreState();
|
||||||
|
|
||||||
|
cb.setColorFill(new BaseColor(Color.yellow));
|
||||||
|
cb.circle(x + 100, y + 130, 50);
|
||||||
|
cb.fill();
|
||||||
|
cb.setColorFill(new BaseColor(Color.blue));
|
||||||
|
cb.circle(x + 130, y + 70, 50);
|
||||||
|
cb.fill();
|
||||||
|
}
|
||||||
|
|
||||||
|
private PdfPTable createTable(Map<String, Integer> yearToPublicationCount) {
|
||||||
|
|
||||||
|
Font normalContentStyle = FontFactory.getFont(FontFactory.TIMES_ROMAN, 11);
|
||||||
|
Font summaryContentStyle = FontFactory.getFont(FontFactory.TIMES_ROMAN, 11, Font.BOLDITALIC);
|
||||||
|
BaseColor summaryBackgroundColor = new BaseColor(0xEE, 0xEE, 0xEE);
|
||||||
|
BaseColor headerBackgroundColor = new BaseColor(0xC3, 0xD9, 0xFF);
|
||||||
|
BaseColor bodyBackgroundColor = new BaseColor(Color.white);
|
||||||
|
|
||||||
|
PdfPTable table = new PdfPTable(2);
|
||||||
|
table.setWidthPercentage(36.0f);
|
||||||
|
|
||||||
|
table.setHorizontalAlignment(Element.ALIGN_LEFT);
|
||||||
|
table.getDefaultCell().setBorderWidth(0.0f);
|
||||||
|
table.setHeaderRows(2);
|
||||||
|
|
||||||
|
PdfPCell cell;
|
||||||
|
cell = new PdfPCell(new Phrase("Publications per year", normalContentStyle));
|
||||||
|
setTableCaptionStyle(summaryBackgroundColor, cell);
|
||||||
|
table.addCell(cell);
|
||||||
|
|
||||||
|
cell = new PdfPCell(new Phrase("Year", normalContentStyle));
|
||||||
|
setTableHeaderStyle(headerBackgroundColor, cell);
|
||||||
|
table.addCell(cell);
|
||||||
|
|
||||||
|
cell.setPhrase(new Phrase("Publications", normalContentStyle));
|
||||||
|
table.addCell(cell);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
setTableBodyStyle(bodyBackgroundColor, cell);
|
||||||
|
int totalPublications = 0;
|
||||||
|
|
||||||
|
for (Entry<String, Integer> currentEntry : yearToPublicationCount.entrySet()) {
|
||||||
|
|
||||||
|
cell.setPhrase(new Phrase(currentEntry.getKey(), normalContentStyle));
|
||||||
|
table.addCell(cell);
|
||||||
|
|
||||||
|
cell.setPhrase(new Phrase(currentEntry.getValue().toString(), normalContentStyle));
|
||||||
|
table.addCell(cell);
|
||||||
|
|
||||||
|
totalPublications += currentEntry.getValue();
|
||||||
|
}
|
||||||
|
|
||||||
|
setTableFooterStyle(summaryBackgroundColor, cell);
|
||||||
|
cell.setPhrase(new Phrase("Total", summaryContentStyle));
|
||||||
|
table.addCell(cell);
|
||||||
|
|
||||||
|
cell.setPhrase(new Phrase(String.valueOf(totalPublications), summaryContentStyle));
|
||||||
|
table.addCell(cell);
|
||||||
|
|
||||||
|
return table;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setTableFooterStyle(BaseColor footerBackgroundColor,
|
||||||
|
PdfPCell cell) {
|
||||||
|
cell.setBorderWidth(0.0f);
|
||||||
|
cell.setBackgroundColor(footerBackgroundColor);
|
||||||
|
cell.setHorizontalAlignment(Element.ALIGN_CENTER);
|
||||||
|
cell.setPaddingTop(5f);
|
||||||
|
cell.setPaddingRight(10f);
|
||||||
|
cell.setPaddingBottom(5f);
|
||||||
|
cell.setPaddingLeft(10f);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setTableBodyStyle(BaseColor bodyBackgroundColor,
|
||||||
|
PdfPCell cell) {
|
||||||
|
cell.setBorderWidth(0.0f);
|
||||||
|
cell.setBackgroundColor(bodyBackgroundColor);
|
||||||
|
cell.setHorizontalAlignment(Element.ALIGN_CENTER);
|
||||||
|
cell.setPaddingTop(5f);
|
||||||
|
cell.setPaddingRight(10f);
|
||||||
|
cell.setPaddingBottom(5f);
|
||||||
|
cell.setPaddingLeft(10f);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setTableHeaderStyle(BaseColor headerBackgroundColor,
|
||||||
|
PdfPCell cell) {
|
||||||
|
cell.setBorderWidth(0.0f);
|
||||||
|
cell.setBackgroundColor(headerBackgroundColor);
|
||||||
|
cell.setHorizontalAlignment(Element.ALIGN_CENTER);
|
||||||
|
cell.setPaddingTop(5f);
|
||||||
|
cell.setPaddingRight(10f);
|
||||||
|
cell.setPaddingBottom(5f);
|
||||||
|
cell.setPaddingLeft(10f);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setTableCaptionStyle(BaseColor summaryBackgroundColor,
|
||||||
|
PdfPCell cell) {
|
||||||
|
cell.setBorderWidth(0.0f);
|
||||||
|
cell.setBackgroundColor(summaryBackgroundColor);
|
||||||
|
cell.setHorizontalAlignment(Element.ALIGN_CENTER);
|
||||||
|
cell.setPaddingTop(5.0f);
|
||||||
|
cell.setPaddingRight(10.0f);
|
||||||
|
cell.setPaddingBottom(5.0f);
|
||||||
|
cell.setPaddingLeft(10.0f);
|
||||||
|
cell.setColspan(2);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,86 @@
|
||||||
|
package edu.cornell.mannlib.vitro.webapp.visualization;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.TreeMap;
|
||||||
|
|
||||||
|
import com.hp.hpl.jena.iri.IRIFactory;
|
||||||
|
|
||||||
|
public class TestJava {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param args
|
||||||
|
*/
|
||||||
|
public static void main(String[] args) {
|
||||||
|
String uriStr = "http%3A%2F%2Fvivo.library.cornell.edu%2Fns%2F0.1%23individual8588";
|
||||||
|
IRIFactory factory = IRIFactory.jenaImplementation();
|
||||||
|
|
||||||
|
String[] sampleBlurns = {"Gold, J R [Reprint Author, Author]; Perkins, G A; Erb, H N; Ainsworth, D M | Journal of Veterinary Internal Medicine, 2006; 20(3): 720",
|
||||||
|
"Goldstein, Richard E; Lin, Rebecca C; Langston, Catherine E; Scrivani, Peter V; Erb, Hollis N; Barr, Stephen C | Journal of Veterinary Internal Medicine, 2006; 20(3): 489-494",
|
||||||
|
"McClellan, Jennifer M; Goldstein, Richard E; Erb, Hollis N; Dykes, Ned L; Cowgill, Larry D | American Journal of Veterinary Research, 2006; 67(4): 715-722",
|
||||||
|
"Cook, Christopher P; Scott, Danny W; Erb, Hollis N; Miller, William H | Vet Dermatol. 2005; 16(1): 47-51",
|
||||||
|
"Estrada, Amara; Moise, N Sydney; Erb, Hollis N; McDonough, Sean P; Renaud, Farrell, Shari | Journal of Veterinary Internal Medicine, 2006; 20(4): 862-872",
|
||||||
|
"Aguirre, A L [Reprint Author, Author]; Center, S A; Yeager, A E; Randolph, J F; Erb, H N | Journal of Veterinary Internal Medicine, 2006; 20(3): 787-788",
|
||||||
|
"MacLeod, K D; Scott, D W; Erb, H N | Journal of Veterinary Medicine Series A, 2004; 51(9-10): 400-404",
|
||||||
|
"Bailey, Dennis B; Rassnick, Kenneth M; Erb, Hollis N; Dykes, Nathan L; Hoopes, P Jack; Page, Rodney L | American Journal of Veterinary Research, 2004; 65(11): 1502-1507",
|
||||||
|
"Ainsworth, Dorothy M; Wagner, Bettina; Franchini, Marco; Grunig, Gabriele; Erb, Hollis N; Tan, Jean Yin | American Journal of Veterinary Research, 2006; 67(4): 669-677",
|
||||||
|
"Page, Richard B; Scrivani, Peter V; Dykes, Nathan L; Erb, Hollis N; Hobbs, Jeff M | Veterinary Radiology and Ultrasound, 2006; 47(2): 206-211",
|
||||||
|
"Scrivani, Peter V; Dykes, Nathan L; Erb, Hollis N | Veterinary Radiology and Ultrasound, 2004; 45(5): 419-423",
|
||||||
|
"Sepesy, Lisa M; Center, Sharon A; Randolph, John F; Warner, Karen L; Erb, Hollis N | Journal of the American Veterinary Medical Association, 2006; 229(2): 246-252",
|
||||||
|
"Dereszynski, D [Reprint Author, Author]; Center, S; Hadden, A; Randolph, J; Brooks, M; Palyada, K; McDonough, S; Messick, J; Bischoff, K; Erb, H; Gluckman, S; Sanders, S | Journal of Veterinary Internal Medicine, 2006; 20(3): 751-752",
|
||||||
|
"Kroll, Tracy L; Houpt, Katherine A; Erb, Hollis N | Journal of the American Animal Hospital Association, 2004; 40(1): 13-19",
|
||||||
|
"Fortier, Lisa A; Gregg, Abigail J; Erb, Hollis N; Fubini, Susan L | Vet Surg. 33(6): 661-7",
|
||||||
|
"Wagner, Bettina; Flaminio, Julia B F; Hillegas, Julie; Leibold, Wolfgang; Erb, Hollis N; Antczak, Douglas F | Veterinary Immunology and Immunopathology, 2006; 110(3-4): 269-278",
|
||||||
|
"Chalmers, H J; Scrivani, Peter V; Dykes, Nathan L; Erb, Hollis N; Hobbs, J M; Hubble, Lorna J | Veterinary Radiology and Ultrasound, 2006; 47(5): 507-509",
|
||||||
|
"Center, Sharon A; Warner, Karen L; McCabe, Jennifer; Foureman, Polly; Hoffmann, Walter E; Erb, Hollis N | Am J Vet Res. 2005; 66(2): 330-41"};
|
||||||
|
|
||||||
|
System.out.println(sampleBlurns);
|
||||||
|
for (String blurb : sampleBlurns) {
|
||||||
|
|
||||||
|
System.out.println(blurb);
|
||||||
|
}
|
||||||
|
Map<String, Integer> yearToPublicationCount = new TreeMap<String, Integer>();
|
||||||
|
|
||||||
|
yearToPublicationCount.put("2003", 5);
|
||||||
|
yearToPublicationCount.put("2001", 5);
|
||||||
|
yearToPublicationCount.put("2002", 5);
|
||||||
|
yearToPublicationCount.put("2090", 7);
|
||||||
|
yearToPublicationCount.put("2087", 6);
|
||||||
|
|
||||||
|
// System.out.println(Collections.max(yearToPublicationCount.keySet()));
|
||||||
|
// System.out.println(Collections.min(yearToPublicationCount.keySet()));
|
||||||
|
|
||||||
|
// yearToPublicationCount.put("2087", testIt(5, yearToPublicationCount.get("2087")));
|
||||||
|
|
||||||
|
// try {
|
||||||
|
// factory.setEncoding("HEX");
|
||||||
|
// } catch (UnsupportedEncodingException e) {
|
||||||
|
// // TODO Auto-generated catch block
|
||||||
|
// e.printStackTrace();
|
||||||
|
// }
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
IRI iri = factory.create(uriStr);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if (iri.hasViolation(false) ) {
|
||||||
|
boolean validURI = false;
|
||||||
|
String errorMsg = ((Violation)iri.violations(false).next()).getShortMessage()+" ";
|
||||||
|
System.out.println("MURDER!!!!!" + errorMsg);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
System.out.println(iri.hasViolation(true));
|
||||||
|
|
||||||
|
}*/
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Integer testIt(int i, Integer integer) {
|
||||||
|
// System.out.println("testit - " + i + " --- " + integer);
|
||||||
|
|
||||||
|
return 10;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,442 @@
|
||||||
|
package edu.cornell.mannlib.vitro.webapp.visualization;
|
||||||
|
|
||||||
|
import java.io.UnsupportedEncodingException;
|
||||||
|
import java.net.URLEncoder;
|
||||||
|
import java.util.Calendar;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.NoSuchElementException;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.Map.Entry;
|
||||||
|
|
||||||
|
import org.apache.commons.logging.Log;
|
||||||
|
|
||||||
|
import edu.cornell.mannlib.vitro.webapp.controller.visualization.VisualizationController;
|
||||||
|
import edu.cornell.mannlib.vitro.webapp.visualization.personpubcount.VisualizationRequestHandler;
|
||||||
|
import edu.cornell.mannlib.vitro.webapp.visualization.valueobjects.BiboDocument;
|
||||||
|
|
||||||
|
|
||||||
|
public class VisualizationCodeGenerator {
|
||||||
|
|
||||||
|
private final static Map<String, String> visDivNames = new HashMap<String, String>() {{
|
||||||
|
|
||||||
|
put("SHORT_SPARK", "pub_count_short_sparkline_vis");
|
||||||
|
put("FULL_SPARK", "pub_count_full_sparkline_vis");
|
||||||
|
|
||||||
|
}};
|
||||||
|
|
||||||
|
private static final String visualizationStyleClass = "sparkline_style";
|
||||||
|
|
||||||
|
private static final String defaultVisContainerDivID = "vis_container";
|
||||||
|
|
||||||
|
private static final String SHORT_SPARKLINE_MODE_URL_HANDLE = "short";
|
||||||
|
|
||||||
|
private static final String FULL_SPARKLINE_MODE_URL_HANDLE = "full";
|
||||||
|
|
||||||
|
private Map<String, Integer> yearToPublicationCount;
|
||||||
|
|
||||||
|
private Log log;
|
||||||
|
|
||||||
|
public VisualizationCodeGenerator(Map<String, Integer> yearToPublicationCount, Log log) {
|
||||||
|
this.yearToPublicationCount = yearToPublicationCount;
|
||||||
|
this.log = log;
|
||||||
|
}
|
||||||
|
public String getMainVisualizationCode(List<BiboDocument> authorDocuments,
|
||||||
|
Set<String> publishedYears,
|
||||||
|
String visMode,
|
||||||
|
String providedVisContainerID) {
|
||||||
|
|
||||||
|
int numOfYearsToBeRendered = 0;
|
||||||
|
int currentYear = Calendar.getInstance().get(Calendar.YEAR);
|
||||||
|
int shortSparkMinYear = currentYear - 10 + 1;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* We are setting the default value of minPublishedYear to be 10 years before
|
||||||
|
* the current year (which is suitably represented by the shortSparkMinYear),
|
||||||
|
* this in case we run into invalid set of published years.
|
||||||
|
* */
|
||||||
|
int minPublishedYear = shortSparkMinYear;
|
||||||
|
|
||||||
|
String visContainerID = null;
|
||||||
|
|
||||||
|
StringBuilder visualizationCode = new StringBuilder();
|
||||||
|
|
||||||
|
// System.out.println(yearToPublicationCount);
|
||||||
|
if (yearToPublicationCount.size() > 0) {
|
||||||
|
try {
|
||||||
|
minPublishedYear = Integer.parseInt(Collections.min(publishedYears));
|
||||||
|
} catch (NoSuchElementException e1) {
|
||||||
|
log.debug("vis: " + e1.getMessage() + " error occurred for " + yearToPublicationCount.toString());
|
||||||
|
} catch (NumberFormatException e2) {
|
||||||
|
log.debug("vis: " + e2.getMessage() + " error occurred for " + yearToPublicationCount.toString());
|
||||||
|
}
|
||||||
|
numOfYearsToBeRendered = currentYear - minPublishedYear + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
visualizationCode.append("<style type='text/css'>" +
|
||||||
|
"." + visualizationStyleClass + " table{" +
|
||||||
|
" margin: 0;" +
|
||||||
|
" padding: 0;" +
|
||||||
|
" width: auto;" +
|
||||||
|
" border-collapse: collapse;" +
|
||||||
|
" border-spacing: 0;" +
|
||||||
|
" vertical-align: inherit;" +
|
||||||
|
"}" +
|
||||||
|
"#sparkline_data_table {" +
|
||||||
|
"width: auto;" +
|
||||||
|
"}" +
|
||||||
|
"#sparkline_data_table tfoot {" +
|
||||||
|
"color: red;" +
|
||||||
|
"font-size:0.9em;" +
|
||||||
|
"}" +
|
||||||
|
".sparkline_text {" +
|
||||||
|
"margin-left:72px;" +
|
||||||
|
"position:absolute;" +
|
||||||
|
"}" +
|
||||||
|
"</style>\n");
|
||||||
|
|
||||||
|
visualizationCode.append("<script type=\"text/javascript\">\n" +
|
||||||
|
"function drawVisualization() {\n" +
|
||||||
|
"var data = new google.visualization.DataTable();\n" +
|
||||||
|
"data.addColumn('string', 'Year');\n" +
|
||||||
|
"data.addColumn('number', 'Publications');\n" +
|
||||||
|
"data.addRows(" + numOfYearsToBeRendered + ");\n");
|
||||||
|
|
||||||
|
int publicationCounter = 0;
|
||||||
|
int totalPublications = 0;
|
||||||
|
int renderedFullSparks = 0;
|
||||||
|
for (int publishedYear = minPublishedYear; publishedYear <= currentYear; publishedYear++) {
|
||||||
|
|
||||||
|
String stringPublishedYear = String.valueOf(publishedYear);
|
||||||
|
Integer currentPublications = yearToPublicationCount.get(stringPublishedYear);
|
||||||
|
|
||||||
|
if (currentPublications == null) {
|
||||||
|
currentPublications = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
visualizationCode.append("data.setValue("
|
||||||
|
+ publicationCounter
|
||||||
|
+ ", 0, '"
|
||||||
|
+ stringPublishedYear
|
||||||
|
+ "');\n");
|
||||||
|
|
||||||
|
visualizationCode.append("data.setValue("
|
||||||
|
+ publicationCounter
|
||||||
|
+ ", 1, "
|
||||||
|
+ currentPublications
|
||||||
|
+ ");\n");
|
||||||
|
|
||||||
|
totalPublications += currentPublications;
|
||||||
|
publicationCounter++;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Sparks that will be rendered in full mode will always be the one's which has any year
|
||||||
|
* associated with it. Hence.
|
||||||
|
* */
|
||||||
|
renderedFullSparks = totalPublications;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Total publications will also consider publications that have no year associated with
|
||||||
|
* it. Hence.
|
||||||
|
* */
|
||||||
|
if (yearToPublicationCount.get(BiboDocument.DEFAULT_PUBLICATION_YEAR) != null) {
|
||||||
|
totalPublications += yearToPublicationCount.get(BiboDocument.DEFAULT_PUBLICATION_YEAR);
|
||||||
|
}
|
||||||
|
|
||||||
|
String sparklineDisplayOptions = "{width: 63, height: 21, showAxisLines: false, " +
|
||||||
|
"showValueLabels: false, labelPosition: 'none'}";
|
||||||
|
|
||||||
|
if (providedVisContainerID != null) {
|
||||||
|
visContainerID = providedVisContainerID;
|
||||||
|
} else {
|
||||||
|
visContainerID = defaultVisContainerDivID;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The Full Sparkline will be rendered by default. Only if the url has specific mention of
|
||||||
|
* SHORT_SPARKLINE_MODE_URL_HANDLE then we render the short sparkline and not otherwise.
|
||||||
|
* */
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Since building StringBuilder objects (which is being used to store the vis code) is
|
||||||
|
* essentially a side-effecting process, we have both the activators method as side-effecting.
|
||||||
|
* They both side-effect "visualizationCode"
|
||||||
|
* */
|
||||||
|
if (SHORT_SPARKLINE_MODE_URL_HANDLE.equalsIgnoreCase(visMode)) {
|
||||||
|
generateShortSparklineVisualizationContent(currentYear,
|
||||||
|
shortSparkMinYear,
|
||||||
|
visContainerID,
|
||||||
|
visualizationCode,
|
||||||
|
totalPublications,
|
||||||
|
sparklineDisplayOptions);
|
||||||
|
} else {
|
||||||
|
generateFullSparklineVisualizationContent(visContainerID,
|
||||||
|
visualizationCode,
|
||||||
|
totalPublications,
|
||||||
|
renderedFullSparks,
|
||||||
|
sparklineDisplayOptions);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// System.out.println("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
|
||||||
|
log.debug(visualizationCode);
|
||||||
|
// System.out.println("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
|
||||||
|
|
||||||
|
return visualizationCode.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void generateShortSparklineVisualizationContent(int currentYear,
|
||||||
|
int shortSparkMinYear, String visContainerID,
|
||||||
|
StringBuilder visualizationCode, int totalPublications,
|
||||||
|
String sparklineDisplayOptions) {
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Create a view of the data containing only the column pertaining to publication count.
|
||||||
|
* */
|
||||||
|
visualizationCode.append("var shortSparklineView = new google.visualization.DataView(data);\n" +
|
||||||
|
"shortSparklineView.setColumns([1]);\n");
|
||||||
|
|
||||||
|
/*
|
||||||
|
* For the short view we only want the last 10 year's view of publication count,
|
||||||
|
* hence we filter the data we actually want to use for render.
|
||||||
|
* */
|
||||||
|
visualizationCode.append("shortSparklineView.setRows(" +
|
||||||
|
"data.getFilteredRows([{column: 0, " +
|
||||||
|
"minValue: '" + shortSparkMinYear + "', " +
|
||||||
|
"maxValue: '" + currentYear+ "'}])" +
|
||||||
|
");\n");
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Create the vis object and draw it in the div pertaining to short-sparkline.
|
||||||
|
* */
|
||||||
|
visualizationCode.append("var short_spark = new google.visualization.ImageSparkLine(" +
|
||||||
|
"document.getElementById('" + visDivNames.get("SHORT_SPARK") + "')" +
|
||||||
|
");\n" +
|
||||||
|
"short_spark.draw(shortSparklineView, " + sparklineDisplayOptions + ");\n");
|
||||||
|
|
||||||
|
/*
|
||||||
|
* We want to display how many publication counts were considered, so this is used
|
||||||
|
* to calculate this.
|
||||||
|
* */
|
||||||
|
visualizationCode.append("var shortSparkRows = shortSparklineView.getViewRows();\n" +
|
||||||
|
"var renderedShortSparks = 0;\n" +
|
||||||
|
"$.each(shortSparkRows, function(index, value) {" +
|
||||||
|
"renderedShortSparks += data.getValue(value, 1);" +
|
||||||
|
"});\n");
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Generate the text introducing the vis.
|
||||||
|
* */
|
||||||
|
visualizationCode.append("var shortSparksText = '<p class=\"sparkline_text\">'" +
|
||||||
|
"+ renderedShortSparks" +
|
||||||
|
"+ ' Papers with year from '" +
|
||||||
|
"+ ' " + totalPublications + " '" +
|
||||||
|
"+ ' total'" +
|
||||||
|
"+ '</p>';" +
|
||||||
|
"$(shortSparksText).prependTo('#" + visDivNames.get("SHORT_SPARK") + "');");
|
||||||
|
|
||||||
|
visualizationCode.append("}\n ");
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Generate the code that will activate the visualization. It takes care of creating div elements to hold
|
||||||
|
* the actual sparkline image and then calling the drawVisualization function.
|
||||||
|
* */
|
||||||
|
visualizationCode.append(generateVisualizationActivator(visDivNames.get("SHORT_SPARK"), visContainerID));
|
||||||
|
|
||||||
|
}
|
||||||
|
private void generateFullSparklineVisualizationContent(
|
||||||
|
String visContainerID, StringBuilder visualizationCode,
|
||||||
|
int totalPublications, int renderedFullSparks,
|
||||||
|
String sparklineDisplayOptions) {
|
||||||
|
visualizationCode.append("var fullSparklineView = new google.visualization.DataView(data);\n" +
|
||||||
|
"fullSparklineView.setColumns([1]);\n");
|
||||||
|
|
||||||
|
visualizationCode.append("var full_spark = new google.visualization.ImageSparkLine(" +
|
||||||
|
"document.getElementById('" + visDivNames.get("FULL_SPARK") + "')" +
|
||||||
|
");\n" +
|
||||||
|
"full_spark.draw(fullSparklineView, " + sparklineDisplayOptions + ");\n");
|
||||||
|
|
||||||
|
visualizationCode.append("var allSparksText = '<p class=\"sparkline_text\"><b>Full Timeline</b> '" +
|
||||||
|
"+ " + renderedFullSparks + "" +
|
||||||
|
"+ ' papers with year from '" +
|
||||||
|
"+ ' " + totalPublications + " '" +
|
||||||
|
"+ ' total'" +
|
||||||
|
"+ '</p>';" +
|
||||||
|
"$(allSparksText).prependTo('#" + visDivNames.get("FULL_SPARK") +"');");
|
||||||
|
|
||||||
|
visualizationCode.append("}\n ");
|
||||||
|
|
||||||
|
visualizationCode.append(generateVisualizationActivator(visDivNames.get("FULL_SPARK"), visContainerID));
|
||||||
|
|
||||||
|
}
|
||||||
|
private String generateVisualizationActivator(String sparklineID, String visContainerID) {
|
||||||
|
|
||||||
|
return "$(document).ready(function() {" +
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This is a nuclear option (creating the container in which everything goes)
|
||||||
|
* the only reason this will be ever used is the API user never submitted a
|
||||||
|
* container ID in which everything goes. The alternative was to let the
|
||||||
|
* vis not appear in the calling page at all. So now atleast vis appears but
|
||||||
|
* appended at the bottom of the body.
|
||||||
|
* */
|
||||||
|
"if ($('#" + visContainerID + "').length == 0) {" +
|
||||||
|
" $('<div/>', {'id': '" + visContainerID + "'" +
|
||||||
|
" }).appendTo('body');" +
|
||||||
|
"}" +
|
||||||
|
|
||||||
|
"if ($('#" + sparklineID + "').length == 0) {" +
|
||||||
|
"$('<div/>', {'id': '" + sparklineID + "'," +
|
||||||
|
"'class': '" + visualizationStyleClass + "'" +
|
||||||
|
"}).prependTo('#" + visContainerID + "');" +
|
||||||
|
"}" +
|
||||||
|
|
||||||
|
"drawVisualization();" +
|
||||||
|
"});" +
|
||||||
|
"</script>\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getVisualizationContextCode(String uri, String individualURI, String visMode) {
|
||||||
|
|
||||||
|
String visualizationContextCode = "";
|
||||||
|
if (SHORT_SPARKLINE_MODE_URL_HANDLE.equalsIgnoreCase(visMode)) {
|
||||||
|
visualizationContextCode = generateShortVisContext(uri, individualURI);
|
||||||
|
} else {
|
||||||
|
visualizationContextCode = generateFullVisContext(uri, individualURI);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// System.out.println("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
|
||||||
|
log.debug(visualizationContextCode);
|
||||||
|
// System.out.println("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
|
||||||
|
|
||||||
|
return visualizationContextCode;
|
||||||
|
}
|
||||||
|
|
||||||
|
private String generateFullVisContext(String uri,
|
||||||
|
String individualURI) {
|
||||||
|
|
||||||
|
StringBuilder divContextCode = new StringBuilder();
|
||||||
|
|
||||||
|
try {
|
||||||
|
|
||||||
|
String downloadFileCode;
|
||||||
|
if (yearToPublicationCount.size() > 0) {
|
||||||
|
downloadFileCode = "Download data as <a href='" + uri.toString() + "?" +
|
||||||
|
VisualizationRequestHandler.INDIVIDUAL_URI_URL_HANDLE +
|
||||||
|
"=" + URLEncoder.encode(individualURI,
|
||||||
|
VisualizationController.URL_ENCODING_SCHEME).toString() +
|
||||||
|
"&" +
|
||||||
|
"vis" +
|
||||||
|
"=" + URLEncoder.encode(VisualizationController
|
||||||
|
.PERSON_PUBLICATION_COUNT_VIS_URL_VALUE,
|
||||||
|
VisualizationController.URL_ENCODING_SCHEME).toString() +
|
||||||
|
"&" +
|
||||||
|
VisualizationRequestHandler.RENDER_MODE_URL_HANDLE +
|
||||||
|
"=" + URLEncoder.encode(VisualizationRequestHandler
|
||||||
|
.DATA_RENDER_MODE_URL_VALUE,
|
||||||
|
VisualizationController.URL_ENCODING_SCHEME).toString() +
|
||||||
|
"'>.csv</a> file.<br />";
|
||||||
|
} else {
|
||||||
|
downloadFileCode = "No data available to export.<br />";
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
divContextCode.append("<p>" + generateDataTable() +
|
||||||
|
downloadFileCode + "</p>");
|
||||||
|
|
||||||
|
} catch (UnsupportedEncodingException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
return divContextCode.toString();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private String generateShortVisContext(String uri,
|
||||||
|
String individualURI) {
|
||||||
|
|
||||||
|
StringBuilder divContextCode = new StringBuilder();
|
||||||
|
|
||||||
|
try {
|
||||||
|
|
||||||
|
String fullTimelineLink;
|
||||||
|
if (yearToPublicationCount.size() > 0) {
|
||||||
|
fullTimelineLink = "<a href='" + uri.toString() + "?" +
|
||||||
|
VisualizationRequestHandler.INDIVIDUAL_URI_URL_HANDLE +
|
||||||
|
"=" + URLEncoder.encode(individualURI,
|
||||||
|
VisualizationController.URL_ENCODING_SCHEME).toString() +
|
||||||
|
"&" +
|
||||||
|
"vis" +
|
||||||
|
"=" + URLEncoder.encode(VisualizationController
|
||||||
|
.PERSON_PUBLICATION_COUNT_VIS_URL_VALUE,
|
||||||
|
VisualizationController.URL_ENCODING_SCHEME).toString() +
|
||||||
|
"&" +
|
||||||
|
VisualizationRequestHandler.RENDER_MODE_URL_HANDLE +
|
||||||
|
"=" + URLEncoder.encode(VisualizationRequestHandler
|
||||||
|
.STANDALONE_RENDER_MODE_URL_VALUE,
|
||||||
|
VisualizationController.URL_ENCODING_SCHEME).toString() +
|
||||||
|
"'>View full timeline and network.</a><br />";
|
||||||
|
} else {
|
||||||
|
fullTimelineLink = "No data available to render full timeline.<br />";
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
divContextCode.append("<p>" + fullTimelineLink + "</p>");
|
||||||
|
|
||||||
|
} catch (UnsupportedEncodingException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
return divContextCode.toString();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private String generateDataTable() {
|
||||||
|
|
||||||
|
StringBuilder dataTable = new StringBuilder();
|
||||||
|
|
||||||
|
dataTable.append("<table id='sparkline_data_table'>" +
|
||||||
|
"<caption>Publications per year</caption>" +
|
||||||
|
"<thead>" +
|
||||||
|
"<tr>" +
|
||||||
|
"<th>Year</th>" +
|
||||||
|
"<th>Publications</th>" +
|
||||||
|
"</tr>" +
|
||||||
|
"</thead>" +
|
||||||
|
"<tbody>");
|
||||||
|
|
||||||
|
for (Entry<String, Integer> currentEntry : yearToPublicationCount.entrySet()) {
|
||||||
|
dataTable.append("<tr>" +
|
||||||
|
"<td>" + currentEntry.getKey() + "</td>" +
|
||||||
|
"<td>" + currentEntry.getValue() + "</td>" +
|
||||||
|
"</tr>");
|
||||||
|
}
|
||||||
|
|
||||||
|
dataTable.append("</tbody>\n" +
|
||||||
|
"</tfoot>" +
|
||||||
|
// "<tfoot>" +
|
||||||
|
// "<tr><td colspan='2'>*DNA - Data not available</td></tr>" +
|
||||||
|
// "</tfoot>\n" +
|
||||||
|
"</table>\n");
|
||||||
|
|
||||||
|
|
||||||
|
return dataTable.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,366 @@
|
||||||
|
package edu.cornell.mannlib.vitro.webapp.visualization.collegepubcount;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.TreeMap;
|
||||||
|
|
||||||
|
import org.apache.commons.logging.Log;
|
||||||
|
|
||||||
|
import com.hp.hpl.jena.iri.IRI;
|
||||||
|
import com.hp.hpl.jena.iri.IRIFactory;
|
||||||
|
import com.hp.hpl.jena.iri.Violation;
|
||||||
|
import com.hp.hpl.jena.query.DataSource;
|
||||||
|
import com.hp.hpl.jena.query.Query;
|
||||||
|
import com.hp.hpl.jena.query.QueryExecution;
|
||||||
|
import com.hp.hpl.jena.query.QueryExecutionFactory;
|
||||||
|
import com.hp.hpl.jena.query.QueryFactory;
|
||||||
|
import com.hp.hpl.jena.query.QuerySolution;
|
||||||
|
import com.hp.hpl.jena.query.ResultSet;
|
||||||
|
import com.hp.hpl.jena.query.Syntax;
|
||||||
|
import com.hp.hpl.jena.rdf.model.RDFNode;
|
||||||
|
|
||||||
|
import edu.cornell.mannlib.vitro.webapp.visualization.exceptions.MalformedQueryParametersException;
|
||||||
|
import edu.cornell.mannlib.vitro.webapp.visualization.sparqlutils.QueryConstants;
|
||||||
|
import edu.cornell.mannlib.vitro.webapp.visualization.sparqlutils.QueryFieldLabels;
|
||||||
|
import edu.cornell.mannlib.vitro.webapp.visualization.valueobjects.BiboDocument;
|
||||||
|
import edu.cornell.mannlib.vitro.webapp.visualization.valueobjects.VivoCollegeOrSchool;
|
||||||
|
import edu.cornell.mannlib.vitro.webapp.visualization.valueobjects.VivoDepartmentOrDivision;
|
||||||
|
import edu.cornell.mannlib.vitro.webapp.visualization.valueobjects.VivoEmployee;
|
||||||
|
import edu.cornell.mannlib.vitro.webapp.visualization.valueobjects.VOConstants.EmployeeType;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Very dumb name of the class. change it.
|
||||||
|
* @author cdtank
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class QueryHandler {
|
||||||
|
|
||||||
|
protected static final Syntax SYNTAX = Syntax.syntaxARQ;
|
||||||
|
|
||||||
|
private String collegeURIParam, resultFormatParam, rdfResultFormatParam;
|
||||||
|
private Map<String, VivoCollegeOrSchool> collegeURLToVO = new HashMap<String, VivoCollegeOrSchool>();
|
||||||
|
private DataSource dataSource;
|
||||||
|
|
||||||
|
private Log log;
|
||||||
|
|
||||||
|
public QueryHandler(String collegeURIParam,
|
||||||
|
String resultFormatParam, String rdfResultFormatParam,
|
||||||
|
DataSource dataSource, Log log) {
|
||||||
|
|
||||||
|
this.collegeURIParam = collegeURIParam;
|
||||||
|
this.resultFormatParam = resultFormatParam;
|
||||||
|
this.rdfResultFormatParam = rdfResultFormatParam;
|
||||||
|
this.dataSource = dataSource;
|
||||||
|
this.log = log;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private Set<VivoEmployee> createJavaValueObjects(ResultSet resultSet) {
|
||||||
|
|
||||||
|
Set<VivoEmployee> collegeAcademicEmployees = new HashSet<VivoEmployee>();
|
||||||
|
|
||||||
|
Map<String, VivoDepartmentOrDivision> departmentURLToVO = new HashMap<String, VivoDepartmentOrDivision>();
|
||||||
|
Map<String, VivoEmployee> employeeURLToVO = new HashMap<String, VivoEmployee>();
|
||||||
|
|
||||||
|
while (resultSet.hasNext()) {
|
||||||
|
QuerySolution solution = resultSet.nextSolution();
|
||||||
|
|
||||||
|
String collegeURL = solution.get(QueryFieldLabels.COLLEGE_URL).toString();
|
||||||
|
|
||||||
|
VivoCollegeOrSchool currentCollege;
|
||||||
|
|
||||||
|
if (collegeURLToVO.containsKey(collegeURL)) {
|
||||||
|
currentCollege = collegeURLToVO.get(collegeURL);
|
||||||
|
} else {
|
||||||
|
currentCollege = new VivoCollegeOrSchool(collegeURL);
|
||||||
|
collegeURLToVO.put(collegeURL, currentCollege);
|
||||||
|
|
||||||
|
RDFNode collegeLabelNode = solution.get(QueryFieldLabels.COLLEGE_LABEL);
|
||||||
|
if (collegeLabelNode != null) {
|
||||||
|
currentCollege.setCollegeLabel(collegeLabelNode.toString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
String departmentURL = solution.get(QueryFieldLabels.DEPARTMENT_URL).toString();
|
||||||
|
|
||||||
|
VivoDepartmentOrDivision currentDepartment;
|
||||||
|
|
||||||
|
if (departmentURLToVO.containsKey(departmentURL)) {
|
||||||
|
currentDepartment = departmentURLToVO.get(departmentURL);
|
||||||
|
currentDepartment.addParentCollege(currentCollege);
|
||||||
|
} else {
|
||||||
|
currentDepartment = new VivoDepartmentOrDivision(departmentURL, currentCollege);
|
||||||
|
departmentURLToVO.put(departmentURL, currentDepartment);
|
||||||
|
|
||||||
|
RDFNode departmentLabelNode = solution.get(QueryFieldLabels.DEPARTMENT_LABEL);
|
||||||
|
if (departmentLabelNode != null) {
|
||||||
|
currentDepartment.setDepartmentLabel(departmentLabelNode.toString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
currentCollege.addDepartment(currentDepartment);
|
||||||
|
|
||||||
|
RDFNode employeeNode = solution.get(QueryFieldLabels.ACADEMIC_FACULTY_EMPLOYEE_URL);
|
||||||
|
EmployeeType currentEmployeeType;
|
||||||
|
VivoEmployee currentEmployee;
|
||||||
|
|
||||||
|
if (employeeNode != null) {
|
||||||
|
currentEmployeeType = EmployeeType.ACADEMIC_FACULTY_EMPLOYEE;
|
||||||
|
} else {
|
||||||
|
currentEmployeeType = EmployeeType.ACADEMIC_STAFF_EMPLOYEE;
|
||||||
|
employeeNode = solution.get(QueryFieldLabels.ACADEMIC_STAFF_EMPLOYEE_URL);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (employeeURLToVO.containsKey(employeeNode.toString())) {
|
||||||
|
currentEmployee = employeeURLToVO.get(employeeNode.toString());
|
||||||
|
currentEmployee.addParentDepartment(currentDepartment);
|
||||||
|
} else {
|
||||||
|
currentEmployee = new VivoEmployee(employeeNode.toString(), currentEmployeeType, currentDepartment);
|
||||||
|
employeeURLToVO.put(employeeNode.toString(), currentEmployee);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
RDFNode documentNode = solution.get(QueryFieldLabels.DOCUMENT_URL);
|
||||||
|
if (documentNode != null) {
|
||||||
|
|
||||||
|
/*
|
||||||
|
* A document can have multiple authors but if the same author serves in multiple departments
|
||||||
|
* then we need to account for "An Authored Document" only once. This check will make sure that
|
||||||
|
* a document by same author is not added twice just because that author serves in 2 distinct
|
||||||
|
* department.
|
||||||
|
* */
|
||||||
|
boolean isNewDocumentAlreadyAdded = testForDuplicateEntryOfDocument(
|
||||||
|
currentEmployee,
|
||||||
|
documentNode);
|
||||||
|
|
||||||
|
if (!isNewDocumentAlreadyAdded) {
|
||||||
|
currentEmployee.addAuthorDocument(createAuthorDocumentsVO(solution, documentNode.toString()));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
collegeAcademicEmployees.add(currentEmployee);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* System.out.println(collegeURLToVO);
|
||||||
|
System.out.println("------------------------------------------------------------");
|
||||||
|
System.out.println(departmentURLToVO);
|
||||||
|
System.out.println("------------------------------------------------------------");
|
||||||
|
System.out.println(employeeURLToVO);
|
||||||
|
System.out.println("------------------------------------------------------------");
|
||||||
|
*/
|
||||||
|
return collegeAcademicEmployees;
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean testForDuplicateEntryOfDocument(
|
||||||
|
VivoEmployee currentEmployee, RDFNode documentNode) {
|
||||||
|
boolean isNewDocumentAlreadyAdded = false;
|
||||||
|
|
||||||
|
for (BiboDocument currentAuthoredDocument : currentEmployee.getAuthorDocuments()) {
|
||||||
|
if (currentAuthoredDocument.getDocumentURL().equalsIgnoreCase(documentNode.toString())) {
|
||||||
|
isNewDocumentAlreadyAdded = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return isNewDocumentAlreadyAdded;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Map<String, VivoCollegeOrSchool> getCollegeURLToVO() {
|
||||||
|
return collegeURLToVO;
|
||||||
|
}
|
||||||
|
|
||||||
|
private BiboDocument createAuthorDocumentsVO(QuerySolution solution, String documentURI) {
|
||||||
|
|
||||||
|
BiboDocument biboDocument = new BiboDocument(documentURI);
|
||||||
|
|
||||||
|
RDFNode documentLabelNode = solution.get(QueryFieldLabels.DOCUMENT_LABEL);
|
||||||
|
if (documentLabelNode != null) {
|
||||||
|
biboDocument.setDocumentLabel(documentLabelNode.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
RDFNode documentBlurbNode = solution.get(QueryFieldLabels.DOCUMENT_BLURB);
|
||||||
|
if (documentBlurbNode != null) {
|
||||||
|
biboDocument.setDocumentBlurb(documentBlurbNode.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
RDFNode documentMonikerNode = solution.get(QueryFieldLabels.DOCUMENT_MONIKER);
|
||||||
|
if (documentMonikerNode != null) {
|
||||||
|
biboDocument.setDocumentMoniker(documentMonikerNode.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
RDFNode documentDescriptionNode = solution.get(QueryFieldLabels.DOCUMENT_DESCRIPTION);
|
||||||
|
if (documentDescriptionNode != null) {
|
||||||
|
biboDocument.setDocumentDescription(documentDescriptionNode.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
RDFNode publicationYearNode = solution.get(QueryFieldLabels.DOCUMENT_PUBLICATION_YEAR);
|
||||||
|
if (publicationYearNode != null) {
|
||||||
|
biboDocument.setPublicationYear(publicationYearNode.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
RDFNode authorLabelNode = solution.get(QueryFieldLabels.AUTHOR_LABEL);
|
||||||
|
if (authorLabelNode != null) {
|
||||||
|
biboDocument.setAuthorLabel(authorLabelNode.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
return biboDocument;
|
||||||
|
}
|
||||||
|
|
||||||
|
private ResultSet executeQuery(String queryText,
|
||||||
|
String resultFormatParam,
|
||||||
|
String rdfResultFormatParam,
|
||||||
|
DataSource dataSource) {
|
||||||
|
|
||||||
|
QueryExecution queryExecution = null;
|
||||||
|
try{
|
||||||
|
Query query = QueryFactory.create(queryText, SYNTAX);
|
||||||
|
|
||||||
|
// QuerySolutionMap qs = new QuerySolutionMap();
|
||||||
|
// qs.add("authPerson", queryParam); // bind resource to s
|
||||||
|
|
||||||
|
queryExecution = QueryExecutionFactory.create(query, dataSource);
|
||||||
|
|
||||||
|
|
||||||
|
//remocve this if loop after knowing what is describe & construct sparql stuff.
|
||||||
|
if (query.isSelectType()){
|
||||||
|
return queryExecution.execSelect();
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
if(queryExecution != null) {
|
||||||
|
queryExecution.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private String generateCollegeEmployeeSparqlQuery(String queryURI) {
|
||||||
|
// Resource uri1 = ResourceFactory.createResource(queryURI);
|
||||||
|
|
||||||
|
String sparqlQuery = QueryConstants.SPARQL_QUERY_PREFIXES
|
||||||
|
+ "SELECT (str(?collegeLabel) as ?" + QueryFieldLabels.COLLEGE_LABEL + ") "
|
||||||
|
+ " (str(?department) as ?" + QueryFieldLabels.DEPARTMENT_URL + ") "
|
||||||
|
+ " (str(?departmentLabel) as ?" + QueryFieldLabels.DEPARTMENT_LABEL + ") "
|
||||||
|
+ " (str(?academicFacultyEmployee) as ?" + QueryFieldLabels.ACADEMIC_FACULTY_EMPLOYEE_URL + ") "
|
||||||
|
+ " (str(?academicStaffEmployee) as ?" + QueryFieldLabels.ACADEMIC_STAFF_EMPLOYEE_URL + ") "
|
||||||
|
+ " (str(<" + queryURI + ">) as ?" + QueryFieldLabels.COLLEGE_URL + ") "
|
||||||
|
+ " (str(?authorLabel) as ?" + QueryFieldLabels.AUTHOR_LABEL + ") "
|
||||||
|
+ " (str(?document) as ?" + QueryFieldLabels.DOCUMENT_URL + ") "
|
||||||
|
+ " (str(?documentMoniker) as ?" + QueryFieldLabels.DOCUMENT_MONIKER + ") "
|
||||||
|
+ " (str(?documentLabel) as ?" + QueryFieldLabels.DOCUMENT_LABEL + ") "
|
||||||
|
+ " (str(?documentBlurb) as ?" + QueryFieldLabels.DOCUMENT_BLURB + ") "
|
||||||
|
+ " (str(?documentDescription) as ?" + QueryFieldLabels.DOCUMENT_DESCRIPTION + ") "
|
||||||
|
+ " (str(?publicationYear) as ?" + QueryFieldLabels.DOCUMENT_PUBLICATION_YEAR + ") "
|
||||||
|
+ "WHERE { "
|
||||||
|
+ "<" + queryURI + "> rdf:type vivo:CollegeOrSchoolWithinUniversity; " +
|
||||||
|
"rdfs:label ?collegeLabel; " +
|
||||||
|
"vivo:hasAcademicDepartmentOrDivision ?department . "
|
||||||
|
+ "?department rdfs:label ?departmentLabel ."
|
||||||
|
+ "{ "
|
||||||
|
+ getAcademicEmployeePublicationsSparqlQuery("academicFacultyEmployee", "vivo:hasEmployeeAcademicFacultyMember")
|
||||||
|
+ " UNION "
|
||||||
|
+ getAcademicEmployeePublicationsSparqlQuery("academicStaffEmployee", "vivo:hasEmployeeAcademicStaffMember")
|
||||||
|
+ "}"
|
||||||
|
+ "}";
|
||||||
|
|
||||||
|
System.out.println(sparqlQuery);
|
||||||
|
|
||||||
|
return sparqlQuery;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private String getAcademicEmployeePublicationsSparqlQuery(String employeeHandle,
|
||||||
|
String ontologyHandle) {
|
||||||
|
|
||||||
|
String sparqlQuery = " {?department " + ontologyHandle + " ?" + employeeHandle + " . "
|
||||||
|
+ "?" + employeeHandle + " rdf:type foaf:Person; rdfs:label ?authorLabel. "
|
||||||
|
+ "OPTIONAL { ?" + employeeHandle + " vivo:authorOf ?document ." +
|
||||||
|
" ?document rdf:type bibo:Document ." +
|
||||||
|
" ?document rdfs:label ?documentLabel ." +
|
||||||
|
" OPTIONAL { ?document vitro:moniker ?documentMoniker } ." +
|
||||||
|
" OPTIONAL { ?document vitro:blurb ?documentBlurb } ." +
|
||||||
|
" OPTIONAL { ?document vitro:description ?documentDescription } ." +
|
||||||
|
" OPTIONAL { ?document vivo:publicationYear ?publicationYear } ." +
|
||||||
|
"}" +
|
||||||
|
"} ";
|
||||||
|
|
||||||
|
return sparqlQuery;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public Set<VivoEmployee> getVisualizationJavaValueObjects()
|
||||||
|
throws MalformedQueryParametersException {
|
||||||
|
|
||||||
|
if (this.collegeURIParam == null || "".equals(collegeURIParam)) {
|
||||||
|
throw new MalformedQueryParametersException("URI parameter is either null or empty.");
|
||||||
|
} else {
|
||||||
|
|
||||||
|
/*
|
||||||
|
* To test for the validity of the URI submitted.
|
||||||
|
* */
|
||||||
|
IRIFactory iRIFactory = IRIFactory.jenaImplementation();
|
||||||
|
IRI iri = iRIFactory.create(this.collegeURIParam);
|
||||||
|
if (iri.hasViolation(false)) {
|
||||||
|
String errorMsg = ((Violation)iri.violations(false).next()).getShortMessage()+" ";
|
||||||
|
log.error("Pub Count Vis Query " + errorMsg);
|
||||||
|
throw new MalformedQueryParametersException("URI provided for an individual is malformed.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ResultSet resultSet = executeQuery(generateCollegeEmployeeSparqlQuery(this.collegeURIParam),
|
||||||
|
this.resultFormatParam,
|
||||||
|
this.rdfResultFormatParam,
|
||||||
|
this.dataSource);
|
||||||
|
|
||||||
|
return createJavaValueObjects(resultSet);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Map<String, Integer> getYearToPublicationCount(
|
||||||
|
Set<BiboDocument> authorDocuments) {
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Create a map from the year to number of publications. Use the BiboDocument's
|
||||||
|
* parsedPublicationYear to populate the data.
|
||||||
|
* */
|
||||||
|
Map<String, Integer> yearToPublicationCount = new TreeMap<String, Integer>();
|
||||||
|
|
||||||
|
for (BiboDocument curr : authorDocuments) {
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Increment the count because there is an entry already available for
|
||||||
|
* that particular year.
|
||||||
|
* */
|
||||||
|
String publicationYear;
|
||||||
|
if (curr.getPublicationYear() != null
|
||||||
|
&& curr.getPublicationYear().length() != 0
|
||||||
|
&& curr.getPublicationYear().trim().length() != 0) {
|
||||||
|
publicationYear = curr.getPublicationYear();
|
||||||
|
} else {
|
||||||
|
publicationYear = curr.getParsedPublicationYear();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (yearToPublicationCount.containsKey(publicationYear)) {
|
||||||
|
yearToPublicationCount.put(publicationYear,
|
||||||
|
yearToPublicationCount
|
||||||
|
.get(publicationYear) + 1);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
yearToPublicationCount.put(publicationYear, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// System.out.println("****************************\n" + yearToPublicationCount);
|
||||||
|
return yearToPublicationCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,482 @@
|
||||||
|
package edu.cornell.mannlib.vitro.webapp.visualization.collegepubcount;
|
||||||
|
|
||||||
|
import java.io.ByteArrayOutputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.PrintWriter;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.TreeMap;
|
||||||
|
import java.util.Map.Entry;
|
||||||
|
|
||||||
|
import javax.servlet.RequestDispatcher;
|
||||||
|
import javax.servlet.ServletException;
|
||||||
|
import javax.servlet.ServletOutputStream;
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
|
||||||
|
import org.apache.commons.logging.Log;
|
||||||
|
import org.skife.csv.CSVWriter;
|
||||||
|
import org.skife.csv.SimpleWriter;
|
||||||
|
|
||||||
|
import com.hp.hpl.jena.query.DataSource;
|
||||||
|
import com.itextpdf.text.Document;
|
||||||
|
import com.itextpdf.text.DocumentException;
|
||||||
|
import com.itextpdf.text.pdf.PdfWriter;
|
||||||
|
|
||||||
|
import edu.cornell.mannlib.vitro.webapp.beans.Portal;
|
||||||
|
import edu.cornell.mannlib.vitro.webapp.controller.Controllers;
|
||||||
|
import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
|
||||||
|
import edu.cornell.mannlib.vitro.webapp.visualization.PDFDocument;
|
||||||
|
import edu.cornell.mannlib.vitro.webapp.visualization.exceptions.MalformedQueryParametersException;
|
||||||
|
import edu.cornell.mannlib.vitro.webapp.visualization.valueobjects.BiboDocument;
|
||||||
|
import edu.cornell.mannlib.vitro.webapp.visualization.valueobjects.VivoCollegeOrSchool;
|
||||||
|
import edu.cornell.mannlib.vitro.webapp.visualization.valueobjects.VivoDepartmentOrDivision;
|
||||||
|
import edu.cornell.mannlib.vitro.webapp.visualization.valueobjects.VivoEmployee;
|
||||||
|
|
||||||
|
public class VisualizationRequestHandler {
|
||||||
|
|
||||||
|
public static final String VIS_CONTAINER_URL_HANDLE = "container";
|
||||||
|
|
||||||
|
public static final String COLLEGE_URI_URL_HANDLE = "uri";
|
||||||
|
|
||||||
|
public static final String VIS_MODE_URL_HANDLE = "vis_mode";
|
||||||
|
|
||||||
|
public static final String RENDER_MODE_URL_HANDLE = "render_mode";
|
||||||
|
|
||||||
|
public static final String STANDALONE_RENDER_MODE_URL_VALUE = "standalone";
|
||||||
|
|
||||||
|
public static final String DYNAMIC_RENDER_MODE_URL_VALUE = "dynamic";
|
||||||
|
|
||||||
|
public static final String DATA_RENDER_MODE_URL_VALUE = "data";
|
||||||
|
|
||||||
|
public static final String PDF_RENDER_MODE_URL_VALUE = "pdf";
|
||||||
|
|
||||||
|
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 resultFormatParam = "RS_TEXT";
|
||||||
|
String rdfResultFormatParam = "RDF/XML-ABBREV";
|
||||||
|
|
||||||
|
String collegeURIParam = vitroRequest.getParameter(COLLEGE_URI_URL_HANDLE);
|
||||||
|
|
||||||
|
String renderMode = vitroRequest.getParameter(RENDER_MODE_URL_HANDLE);
|
||||||
|
|
||||||
|
String visMode = vitroRequest.getParameter(VIS_MODE_URL_HANDLE);
|
||||||
|
|
||||||
|
String visContainer = vitroRequest.getParameter(VIS_CONTAINER_URL_HANDLE);
|
||||||
|
|
||||||
|
QueryHandler queryManager =
|
||||||
|
new QueryHandler(collegeURIParam,
|
||||||
|
resultFormatParam,
|
||||||
|
rdfResultFormatParam,
|
||||||
|
dataSource,
|
||||||
|
log);
|
||||||
|
|
||||||
|
try {
|
||||||
|
|
||||||
|
Set<VivoEmployee> employees = queryManager.getVisualizationJavaValueObjects();
|
||||||
|
|
||||||
|
Map<VivoDepartmentOrDivision, Map<String, Integer>> departmentToPublicationsOverTime =
|
||||||
|
new HashMap<VivoDepartmentOrDivision, Map<String,Integer>>();
|
||||||
|
|
||||||
|
Set<String> publishedYearsForCollege = new HashSet<String>();
|
||||||
|
|
||||||
|
for (VivoEmployee currentEmployee : employees) {
|
||||||
|
|
||||||
|
Map<String, Integer> currentEmployeeYearToPublicationCount =
|
||||||
|
queryManager.getYearToPublicationCount(currentEmployee.getAuthorDocuments());
|
||||||
|
|
||||||
|
if (currentEmployeeYearToPublicationCount.size() > 0) {
|
||||||
|
|
||||||
|
|
||||||
|
publishedYearsForCollege.addAll(currentEmployeeYearToPublicationCount.keySet());
|
||||||
|
|
||||||
|
for (VivoDepartmentOrDivision currentDepartment : currentEmployee.getParentDepartments()) {
|
||||||
|
|
||||||
|
departmentToPublicationsOverTime.put(currentDepartment,
|
||||||
|
getUpdatedDepartmentPublicationsOverTime(
|
||||||
|
currentEmployeeYearToPublicationCount,
|
||||||
|
departmentToPublicationsOverTime
|
||||||
|
.get(currentDepartment)));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* In order to avoid unneeded computations we have pushed this "if" condition up.
|
||||||
|
* This case arises when the render mode is data. In that case we dont want to generate
|
||||||
|
* HTML code to render sparkline, tables etc. Ideally I would want to avoid this flow.
|
||||||
|
* It is ugly!
|
||||||
|
* */
|
||||||
|
if (DATA_RENDER_MODE_URL_VALUE.equalsIgnoreCase(renderMode)) {
|
||||||
|
prepareVisualizationQueryDataResponse(departmentToPublicationsOverTime,
|
||||||
|
queryManager.getCollegeURLToVO());
|
||||||
|
|
||||||
|
System.out.println(publishedYearsForCollege);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
if (PDF_RENDER_MODE_URL_VALUE.equalsIgnoreCase(renderMode)) {
|
||||||
|
prepareVisualizationQueryPDFResponse(authorDocuments,
|
||||||
|
yearToPublicationCount);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Computations required to generate HTML for the sparklines & related context.
|
||||||
|
* */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This is required because when deciding the range of years over which the vis
|
||||||
|
* was rendered we dont want to be influenced by the "DEFAULT_PUBLICATION_YEAR".
|
||||||
|
* */
|
||||||
|
publishedYearsForCollege.remove(BiboDocument.DEFAULT_PUBLICATION_YEAR);
|
||||||
|
|
||||||
|
/*
|
||||||
|
VisualizationCodeGenerator visualizationCodeGenerator =
|
||||||
|
new VisualizationCodeGenerator(yearToPublicationCount, log);
|
||||||
|
|
||||||
|
String visContentCode = visualizationCodeGenerator
|
||||||
|
.getMainVisualizationCode(authorDocuments,
|
||||||
|
publishedYears,
|
||||||
|
visMode,
|
||||||
|
visContainer);
|
||||||
|
|
||||||
|
String visContextCode = visualizationCodeGenerator
|
||||||
|
.getVisualizationContextCode(vitroRequest.getRequestURI(),
|
||||||
|
collegeURIParam,
|
||||||
|
visMode);
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This is side-effecting because the response of this method is just to redirect to
|
||||||
|
* a page with visualization on it.
|
||||||
|
* */
|
||||||
|
|
||||||
|
/*
|
||||||
|
RequestDispatcher requestDispatcher = null;
|
||||||
|
|
||||||
|
if (DYNAMIC_RENDER_MODE_URL_VALUE.equalsIgnoreCase(renderMode)) {
|
||||||
|
|
||||||
|
prepareVisualizationQueryDynamicResponse(request, response, vitroRequest,
|
||||||
|
visContentCode, visContextCode);
|
||||||
|
requestDispatcher = request.getRequestDispatcher("/templates/page/blankPage.jsp");
|
||||||
|
|
||||||
|
} else {
|
||||||
|
prepareVisualizationQueryStandaloneResponse(request, response, vitroRequest,
|
||||||
|
visContentCode, visContextCode);
|
||||||
|
|
||||||
|
requestDispatcher = request.getRequestDispatcher(Controllers.BASIC_JSP);
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
requestDispatcher.forward(request, response);
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("EntityEditController could not forward to view.");
|
||||||
|
log.error(e.getMessage());
|
||||||
|
log.error(e.getStackTrace());
|
||||||
|
}
|
||||||
|
|
||||||
|
*/
|
||||||
|
} catch (MalformedQueryParametersException e) {
|
||||||
|
try {
|
||||||
|
handleMalformedParameters(e.getMessage());
|
||||||
|
} catch (ServletException e1) {
|
||||||
|
log.error(e1.getStackTrace());
|
||||||
|
} catch (IOException e1) {
|
||||||
|
log.error(e1.getStackTrace());
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private Map<String, Integer> getUpdatedDepartmentPublicationsOverTime(
|
||||||
|
Map<String, Integer> currentEmployeeYearToPublicationCount,
|
||||||
|
Map<String, Integer> currentDepartmentYearToPublicationCount) {
|
||||||
|
|
||||||
|
Map<String, Integer> departmentYearToPublicationCount;
|
||||||
|
|
||||||
|
// System.out.println("inside get updated dept pub obr time");
|
||||||
|
|
||||||
|
/*
|
||||||
|
* In case this is the first time we are consolidating publication counts over time for a department.
|
||||||
|
* */
|
||||||
|
if (currentDepartmentYearToPublicationCount == null) {
|
||||||
|
departmentYearToPublicationCount = new TreeMap<String, Integer>();
|
||||||
|
|
||||||
|
// System.out.println("new dept yr pub cnt");
|
||||||
|
|
||||||
|
} else {
|
||||||
|
departmentYearToPublicationCount = currentDepartmentYearToPublicationCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Iterator employeePubCountIterator = currentEmployeeYearToPublicationCount.entrySet().iterator();
|
||||||
|
|
||||||
|
while (employeePubCountIterator.hasNext()) {
|
||||||
|
Map.Entry<String, Integer> employeePubCountEntry = (Map.Entry) employeePubCountIterator.next();
|
||||||
|
|
||||||
|
String employeePublicationYear = employeePubCountEntry.getKey();
|
||||||
|
Integer employeePublicationCount = employeePubCountEntry.getValue();
|
||||||
|
|
||||||
|
try {
|
||||||
|
if (departmentYearToPublicationCount.containsKey(employeePublicationYear)) {
|
||||||
|
departmentYearToPublicationCount.put(employeePublicationYear,
|
||||||
|
departmentYearToPublicationCount
|
||||||
|
.get(employeePublicationYear)
|
||||||
|
+ employeePublicationCount);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
departmentYearToPublicationCount.put(employeePublicationYear, employeePublicationCount);
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return departmentYearToPublicationCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void prepareVisualizationQueryPDFResponse(List<BiboDocument> authorDocuments,
|
||||||
|
Map<String, Integer> yearToPublicationCount) {
|
||||||
|
|
||||||
|
String authorName = null;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* To protect against cases where there are no author documents associated with the
|
||||||
|
* individual.
|
||||||
|
* */
|
||||||
|
if (authorDocuments.size() > 0) {
|
||||||
|
authorName = ((BiboDocument) authorDocuments.get(0)).getAuthorLabel();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* To make sure that null/empty records for author names do not cause any mischief.
|
||||||
|
* */
|
||||||
|
if (authorName == null) {
|
||||||
|
authorName = "";
|
||||||
|
}
|
||||||
|
|
||||||
|
String outputFileName = slugify(authorName + "-report")
|
||||||
|
+ ".pdf";
|
||||||
|
|
||||||
|
response.setContentType("application/pdf");
|
||||||
|
response.setHeader("Content-Disposition","attachment;filename=" + outputFileName);
|
||||||
|
|
||||||
|
ServletOutputStream responseOutputStream;
|
||||||
|
try {
|
||||||
|
responseOutputStream = response.getOutputStream();
|
||||||
|
|
||||||
|
|
||||||
|
Document document = new Document();
|
||||||
|
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||||
|
PdfWriter pdfWriter = PdfWriter.getInstance(document, baos);
|
||||||
|
document.open();
|
||||||
|
// document.add(new Paragraph("JSS Chintan Deepak Tank "));
|
||||||
|
// document.add(Chunk.NEWLINE);
|
||||||
|
// document.add(new Paragraph("The method used to generate this PDF was: TEST OPST"));
|
||||||
|
|
||||||
|
PDFDocument pdfDocument = new PDFDocument(authorName, yearToPublicationCount, document, pdfWriter);
|
||||||
|
|
||||||
|
|
||||||
|
document.close();
|
||||||
|
|
||||||
|
// setting some response headers
|
||||||
|
response.setHeader("Expires", "0");
|
||||||
|
response.setHeader("Cache-Control", "must-revalidate, post-check=0, pre-check=0");
|
||||||
|
response.setHeader("Pragma", "public");
|
||||||
|
// setting the content type
|
||||||
|
// the contentlength is needed for MSIE!!!
|
||||||
|
response.setContentLength(baos.size());
|
||||||
|
// write ByteArrayOutputStream to the ServletOutputStream
|
||||||
|
baos.writeTo(responseOutputStream);
|
||||||
|
responseOutputStream.flush();
|
||||||
|
responseOutputStream.close();
|
||||||
|
|
||||||
|
// System.out.println("done with response o/p stream");
|
||||||
|
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
} catch (DocumentException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void prepareVisualizationQueryDataResponse(
|
||||||
|
Map<VivoDepartmentOrDivision, Map<String, Integer>> departmentToPublicationsOverTime,
|
||||||
|
Map<String, VivoCollegeOrSchool> collegeURLToVO) {
|
||||||
|
|
||||||
|
String collegeName = null;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* To protect against cases where there are no author documents associated with the
|
||||||
|
* individual.
|
||||||
|
* */
|
||||||
|
// System.out.println(collegeURLToVO);
|
||||||
|
if (collegeURLToVO.size() > 0) {
|
||||||
|
// collegeName = ((VivoCollegeOrSchool) collegeURLToVO.entrySet().iterator().next()).getCollegeLabel();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* To make sure that null/empty records for author names do not cause any mischief.
|
||||||
|
* */
|
||||||
|
if (collegeName == null) {
|
||||||
|
collegeName = "";
|
||||||
|
}
|
||||||
|
|
||||||
|
String outputFileName = slugify(collegeName + "depts-pub-count")
|
||||||
|
+ ".csv";
|
||||||
|
|
||||||
|
response.setContentType("application/octet-stream");
|
||||||
|
response.setHeader("Content-Disposition","attachment;filename=" + outputFileName);
|
||||||
|
|
||||||
|
try {
|
||||||
|
|
||||||
|
PrintWriter responseWriter = response.getWriter();
|
||||||
|
|
||||||
|
/*
|
||||||
|
* We are side-effecting responseWriter since we are directly manipulating the response
|
||||||
|
* object of the servlet.
|
||||||
|
* */
|
||||||
|
generateCsvFileBuffer(departmentToPublicationsOverTime,
|
||||||
|
collegeURLToVO,
|
||||||
|
responseWriter);
|
||||||
|
|
||||||
|
responseWriter.close();
|
||||||
|
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Currently the approach for slugifying filenames is naive. In future if there is need,
|
||||||
|
* we can write more sophisticated method.
|
||||||
|
* @param textToBeSlugified
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
private String slugify(String textToBeSlugified) {
|
||||||
|
return textToBeSlugified.toLowerCase().replaceAll("[^a-zA-Z0-9-]", "-");
|
||||||
|
}
|
||||||
|
|
||||||
|
private void generateCsvFileBuffer(
|
||||||
|
Map<VivoDepartmentOrDivision, Map<String, Integer>> departmentToPublicationsOverTime,
|
||||||
|
Map<String, VivoCollegeOrSchool> collegeURLToVO, PrintWriter printWriter) {
|
||||||
|
|
||||||
|
CSVWriter csvWriter = new SimpleWriter(printWriter);
|
||||||
|
|
||||||
|
try {
|
||||||
|
csvWriter.append(new String[]{"School", "Department", "Year", "Publications"});
|
||||||
|
|
||||||
|
Iterator<VivoCollegeOrSchool> collegeIterator = collegeURLToVO.values().iterator();
|
||||||
|
|
||||||
|
while (collegeIterator.hasNext()) {
|
||||||
|
VivoCollegeOrSchool college = collegeIterator.next();
|
||||||
|
String collegeLabel = college.getCollegeLabel();
|
||||||
|
for (VivoDepartmentOrDivision currentDepartment : college.getDepartments()) {
|
||||||
|
|
||||||
|
Map<String, Integer> currentDepartmentPublicationsOverTime = departmentToPublicationsOverTime.get(currentDepartment);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This because many departments might not have any publication.
|
||||||
|
* */
|
||||||
|
if (currentDepartmentPublicationsOverTime != null) {
|
||||||
|
|
||||||
|
for (Entry<String, Integer> currentEntry : currentDepartmentPublicationsOverTime.entrySet()) {
|
||||||
|
csvWriter.append(new Object[]{collegeLabel,
|
||||||
|
currentDepartment.getDepartmentLabel(),
|
||||||
|
currentEntry.getKey(),
|
||||||
|
currentEntry.getValue()});
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
printWriter.flush();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private void prepareVisualizationQueryStandaloneResponse(HttpServletRequest request,
|
||||||
|
HttpServletResponse response, VitroRequest vreq,
|
||||||
|
String visContentCode, String visContextCode) {
|
||||||
|
|
||||||
|
Portal portal = vreq.getPortal();
|
||||||
|
|
||||||
|
request.setAttribute("visContentCode", visContentCode);
|
||||||
|
request.setAttribute("visContextCode", visContextCode);
|
||||||
|
|
||||||
|
request.setAttribute("bodyJsp", "/templates/visualization/publication_count.jsp");
|
||||||
|
request.setAttribute("portalBean", portal);
|
||||||
|
request.setAttribute("title", "Person Publication Count Visualization");
|
||||||
|
request.setAttribute("scripts", "/templates/visualization/visualization_scripts.jsp");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private void prepareVisualizationQueryDynamicResponse(HttpServletRequest request,
|
||||||
|
HttpServletResponse response, VitroRequest vreq,
|
||||||
|
String visContentCode, String visContextCode) {
|
||||||
|
|
||||||
|
Portal portal = vreq.getPortal();
|
||||||
|
|
||||||
|
request.setAttribute("visContentCode", visContentCode);
|
||||||
|
request.setAttribute("visContextCode", visContextCode);
|
||||||
|
|
||||||
|
request.setAttribute("portalBean", portal);
|
||||||
|
request.setAttribute("bodyJsp", "/templates/visualization/ajax_vis_content.jsp");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private void handleMalformedParameters(String errorMessage)
|
||||||
|
throws ServletException, IOException {
|
||||||
|
|
||||||
|
Portal portal = vitroRequest.getPortal();
|
||||||
|
|
||||||
|
request.setAttribute("error", errorMessage);
|
||||||
|
|
||||||
|
RequestDispatcher requestDispatcher = request.getRequestDispatcher(Controllers.BASIC_JSP);
|
||||||
|
request.setAttribute("bodyJsp", "/templates/visualization/visualization_error.jsp");
|
||||||
|
request.setAttribute("portalBean", portal);
|
||||||
|
request.setAttribute("title", "Visualization Query Error - Person Publication Count");
|
||||||
|
|
||||||
|
try {
|
||||||
|
requestDispatcher.forward(request, response);
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("EntityEditController could not forward to view.");
|
||||||
|
log.error(e.getMessage());
|
||||||
|
log.error(e.getStackTrace());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,19 @@
|
||||||
|
package edu.cornell.mannlib.vitro.webapp.visualization.exceptions;
|
||||||
|
|
||||||
|
public class DocumentFieldNotFoundException extends Exception {
|
||||||
|
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
public DocumentFieldNotFoundException(String message) {
|
||||||
|
super(message);
|
||||||
|
}
|
||||||
|
|
||||||
|
public DocumentFieldNotFoundException(Exception cause) {
|
||||||
|
super(createMessage(cause), cause);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String createMessage(Exception cause) {
|
||||||
|
return "Document Field is empty " + cause.getMessage();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,19 @@
|
||||||
|
package edu.cornell.mannlib.vitro.webapp.visualization.exceptions;
|
||||||
|
|
||||||
|
public class MalformedQueryParametersException extends Exception {
|
||||||
|
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
public MalformedQueryParametersException(String message) {
|
||||||
|
super(message);
|
||||||
|
}
|
||||||
|
|
||||||
|
public MalformedQueryParametersException(Exception cause) {
|
||||||
|
super(createMessage(cause), cause);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String createMessage(Exception cause) {
|
||||||
|
return "Malformed Query Params " + cause.getMessage();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,243 @@
|
||||||
|
package edu.cornell.mannlib.vitro.webapp.visualization.personpubcount;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.TreeMap;
|
||||||
|
|
||||||
|
import org.apache.commons.logging.Log;
|
||||||
|
|
||||||
|
import com.hp.hpl.jena.iri.IRI;
|
||||||
|
import com.hp.hpl.jena.iri.IRIFactory;
|
||||||
|
import com.hp.hpl.jena.iri.Violation;
|
||||||
|
import com.hp.hpl.jena.query.DataSource;
|
||||||
|
import com.hp.hpl.jena.query.Query;
|
||||||
|
import com.hp.hpl.jena.query.QueryExecution;
|
||||||
|
import com.hp.hpl.jena.query.QueryExecutionFactory;
|
||||||
|
import com.hp.hpl.jena.query.QueryFactory;
|
||||||
|
import com.hp.hpl.jena.query.QuerySolution;
|
||||||
|
import com.hp.hpl.jena.query.ResultSet;
|
||||||
|
import com.hp.hpl.jena.query.Syntax;
|
||||||
|
import com.hp.hpl.jena.rdf.model.RDFNode;
|
||||||
|
|
||||||
|
import edu.cornell.mannlib.vitro.webapp.visualization.exceptions.MalformedQueryParametersException;
|
||||||
|
import edu.cornell.mannlib.vitro.webapp.visualization.sparqlutils.QueryConstants;
|
||||||
|
import edu.cornell.mannlib.vitro.webapp.visualization.sparqlutils.QueryFieldLabels;
|
||||||
|
import edu.cornell.mannlib.vitro.webapp.visualization.valueobjects.BiboDocument;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Very dumb name of the class. change it.
|
||||||
|
* @author cdtank
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class QueryHandler {
|
||||||
|
|
||||||
|
protected static final Syntax SYNTAX = Syntax.syntaxARQ;
|
||||||
|
|
||||||
|
private String queryParam, resultFormatParam, rdfResultFormatParam;
|
||||||
|
private DataSource dataSource;
|
||||||
|
|
||||||
|
private Log log;
|
||||||
|
|
||||||
|
private static final String SPARQL_QUERY_COMMON_SELECT_CLAUSE = "" +
|
||||||
|
"SELECT (str(?authorLabel) as ?authorLabelLit) " +
|
||||||
|
" (str(?document) as ?documentLit) " +
|
||||||
|
" (str(?documentMoniker) as ?documentMonikerLit) " +
|
||||||
|
" (str(?documentLabel) as ?documentLabelLit) " +
|
||||||
|
" (str(?documentBlurb) as ?documentBlurbLit) " +
|
||||||
|
" (str(?publicationYear) as ?publicationYearLit) " +
|
||||||
|
" (str(?documentDescription) as ?documentDescriptionLit) ";
|
||||||
|
|
||||||
|
private static final String SPARQL_QUERY_COMMON_WHERE_CLAUSE = "" +
|
||||||
|
"?document rdf:type bibo:Document ." +
|
||||||
|
"?document rdfs:label ?documentLabel ." +
|
||||||
|
"OPTIONAL { ?document vivo:publicationYear ?publicationYear } ." +
|
||||||
|
"OPTIONAL { ?document vitro:moniker ?documentMoniker } ." +
|
||||||
|
"OPTIONAL { ?document vitro:blurb ?documentBlurb } ." +
|
||||||
|
"OPTIONAL { ?document vitro:description ?documentDescription }";
|
||||||
|
|
||||||
|
public QueryHandler(String queryParam,
|
||||||
|
String resultFormatParam, String rdfResultFormatParam,
|
||||||
|
DataSource dataSource, Log log) {
|
||||||
|
|
||||||
|
this.queryParam = queryParam;
|
||||||
|
this.resultFormatParam = resultFormatParam;
|
||||||
|
this.rdfResultFormatParam = rdfResultFormatParam;
|
||||||
|
this.dataSource = dataSource;
|
||||||
|
this.log = log;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<BiboDocument> createJavaValueObjects(ResultSet resultSet) {
|
||||||
|
List<BiboDocument> authorDocuments = new ArrayList<BiboDocument>();
|
||||||
|
|
||||||
|
while (resultSet.hasNext()) {
|
||||||
|
QuerySolution solution = resultSet.nextSolution();
|
||||||
|
|
||||||
|
BiboDocument biboDocument = new BiboDocument(
|
||||||
|
solution.get(QueryFieldLabels.DOCUMENT_URL)
|
||||||
|
.toString());
|
||||||
|
|
||||||
|
RDFNode documentLabelNode = solution.get(QueryFieldLabels.DOCUMENT_LABEL);
|
||||||
|
if (documentLabelNode != null) {
|
||||||
|
biboDocument.setDocumentLabel(documentLabelNode.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
RDFNode documentBlurbNode = solution.get(QueryFieldLabels.DOCUMENT_BLURB);
|
||||||
|
if (documentBlurbNode != null) {
|
||||||
|
biboDocument.setDocumentBlurb(documentBlurbNode.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
RDFNode documentmonikerNode = solution.get(QueryFieldLabels.DOCUMENT_MONIKER);
|
||||||
|
if (documentmonikerNode != null) {
|
||||||
|
biboDocument.setDocumentMoniker(documentmonikerNode.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
RDFNode documentDescriptionNode = solution.get(QueryFieldLabels.DOCUMENT_DESCRIPTION);
|
||||||
|
if (documentDescriptionNode != null) {
|
||||||
|
biboDocument.setDocumentDescription(documentDescriptionNode.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
RDFNode publicationYearNode = solution.get(QueryFieldLabels.DOCUMENT_PUBLICATION_YEAR);
|
||||||
|
if (publicationYearNode != null) {
|
||||||
|
biboDocument.setPublicationYear(publicationYearNode.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
RDFNode authorURLNode = solution.get(QueryFieldLabels.AUTHOR_URL);
|
||||||
|
if (authorURLNode != null) {
|
||||||
|
biboDocument.setAuthorURL(authorURLNode.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
RDFNode authorLabelNode = solution.get(QueryFieldLabels.AUTHOR_LABEL);
|
||||||
|
if (authorLabelNode != null) {
|
||||||
|
biboDocument.setAuthorLabel(authorLabelNode.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
authorDocuments.add(biboDocument);
|
||||||
|
}
|
||||||
|
return authorDocuments;
|
||||||
|
}
|
||||||
|
|
||||||
|
private ResultSet executeQuery(String queryURI,
|
||||||
|
String resultFormatParam, String rdfResultFormatParam, DataSource dataSource) {
|
||||||
|
|
||||||
|
QueryExecution queryExecution = null;
|
||||||
|
try{
|
||||||
|
Query query = QueryFactory.create(generateSparqlQuery(queryURI), SYNTAX);
|
||||||
|
|
||||||
|
// QuerySolutionMap qs = new QuerySolutionMap();
|
||||||
|
// qs.add("authPerson", queryParam); // bind resource to s
|
||||||
|
|
||||||
|
queryExecution = QueryExecutionFactory.create(query, dataSource);
|
||||||
|
|
||||||
|
|
||||||
|
//remocve this if loop after knowing what is describe & construct sparql stuff.
|
||||||
|
if( query.isSelectType() ){
|
||||||
|
return queryExecution.execSelect();
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
if(queryExecution != null) {
|
||||||
|
queryExecution.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private String generateSparqlQuery(String queryURI) {
|
||||||
|
// Resource uri1 = ResourceFactory.createResource(queryURI);
|
||||||
|
|
||||||
|
String sparqlQuery = QueryConstants.SPARQL_QUERY_PREFIXES
|
||||||
|
+ SPARQL_QUERY_COMMON_SELECT_CLAUSE
|
||||||
|
+ "(str(<" + queryURI + ">) as ?authPersonLit) "
|
||||||
|
+ "WHERE { "
|
||||||
|
+ "<" + queryURI + "> rdf:type foaf:Person ; vivo:authorOf ?document ; rdfs:label ?authorLabel. "
|
||||||
|
+ SPARQL_QUERY_COMMON_WHERE_CLAUSE
|
||||||
|
+ "}";
|
||||||
|
|
||||||
|
log.debug("SPARQL query for person pub count -> \n" + sparqlQuery);
|
||||||
|
|
||||||
|
return sparqlQuery;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<BiboDocument> getVisualizationJavaValueObjects()
|
||||||
|
throws MalformedQueryParametersException {
|
||||||
|
|
||||||
|
if(this.queryParam == null || "".equals(queryParam)) {
|
||||||
|
throw new MalformedQueryParametersException("URI parameter is either null or empty.");
|
||||||
|
} else {
|
||||||
|
|
||||||
|
/*
|
||||||
|
* To test for the validity of the URI submitted.
|
||||||
|
* */
|
||||||
|
IRIFactory iRIFactory = IRIFactory.jenaImplementation();
|
||||||
|
IRI iri = iRIFactory.create(this.queryParam);
|
||||||
|
if (iri.hasViolation(false)) {
|
||||||
|
String errorMsg = ((Violation)iri.violations(false).next()).getShortMessage()+" ";
|
||||||
|
log.error("Pub Count vis Query " + errorMsg);
|
||||||
|
throw new MalformedQueryParametersException("URI provided for an individual is malformed.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
ResultSet resultSet = executeQuery(this.queryParam,
|
||||||
|
this.resultFormatParam,
|
||||||
|
this.rdfResultFormatParam,
|
||||||
|
this.dataSource);
|
||||||
|
|
||||||
|
return createJavaValueObjects(resultSet);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Map<String, Integer> getYearToPublicationCount(
|
||||||
|
List<BiboDocument> authorDocuments) {
|
||||||
|
|
||||||
|
//List<Integer> publishedYears = new ArrayList<Integer>();
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Create a map from the year to number of publications. Use the BiboDocument's
|
||||||
|
* parsedPublicationYear to populate the data.
|
||||||
|
* */
|
||||||
|
Map<String, Integer> yearToPublicationCount = new TreeMap<String, Integer>();
|
||||||
|
|
||||||
|
for (BiboDocument curr : authorDocuments) {
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Increment the count because there is an entry already available for
|
||||||
|
* that particular year.
|
||||||
|
* */
|
||||||
|
String publicationYear;
|
||||||
|
if (curr.getPublicationYear() != null
|
||||||
|
&& curr.getPublicationYear().length() != 0
|
||||||
|
&& curr.getPublicationYear().trim().length() != 0) {
|
||||||
|
publicationYear = curr.getPublicationYear();
|
||||||
|
} else {
|
||||||
|
publicationYear = curr.getParsedPublicationYear();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (yearToPublicationCount.containsKey(publicationYear)) {
|
||||||
|
yearToPublicationCount.put(publicationYear,
|
||||||
|
yearToPublicationCount
|
||||||
|
.get(publicationYear) + 1);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
yearToPublicationCount.put(publicationYear, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
// if (!parsedPublicationYear.equalsIgnoreCase(BiboDocument.DEFAULT_PUBLICATION_YEAR)) {
|
||||||
|
// publishedYears.add(Integer.parseInt(parsedPublicationYear));
|
||||||
|
// }
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return yearToPublicationCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,366 @@
|
||||||
|
package edu.cornell.mannlib.vitro.webapp.visualization.personpubcount;
|
||||||
|
|
||||||
|
import java.io.ByteArrayOutputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.PrintWriter;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.Map.Entry;
|
||||||
|
|
||||||
|
import javax.servlet.RequestDispatcher;
|
||||||
|
import javax.servlet.ServletException;
|
||||||
|
import javax.servlet.ServletOutputStream;
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
|
||||||
|
import org.apache.commons.logging.Log;
|
||||||
|
import org.skife.csv.CSVWriter;
|
||||||
|
import org.skife.csv.SimpleWriter;
|
||||||
|
|
||||||
|
import com.hp.hpl.jena.query.DataSource;
|
||||||
|
import com.itextpdf.text.Document;
|
||||||
|
import com.itextpdf.text.DocumentException;
|
||||||
|
import com.itextpdf.text.pdf.PdfWriter;
|
||||||
|
|
||||||
|
import edu.cornell.mannlib.vitro.webapp.beans.Portal;
|
||||||
|
import edu.cornell.mannlib.vitro.webapp.controller.Controllers;
|
||||||
|
import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
|
||||||
|
import edu.cornell.mannlib.vitro.webapp.visualization.PDFDocument;
|
||||||
|
import edu.cornell.mannlib.vitro.webapp.visualization.VisualizationCodeGenerator;
|
||||||
|
import edu.cornell.mannlib.vitro.webapp.visualization.exceptions.MalformedQueryParametersException;
|
||||||
|
import edu.cornell.mannlib.vitro.webapp.visualization.valueobjects.BiboDocument;
|
||||||
|
|
||||||
|
public class VisualizationRequestHandler {
|
||||||
|
|
||||||
|
public static final String VIS_CONTAINER_URL_HANDLE = "container";
|
||||||
|
|
||||||
|
public static final String INDIVIDUAL_URI_URL_HANDLE = "uri";
|
||||||
|
|
||||||
|
public static final String VIS_MODE_URL_HANDLE = "vis_mode";
|
||||||
|
|
||||||
|
public static final String RENDER_MODE_URL_HANDLE = "render_mode";
|
||||||
|
|
||||||
|
public static final String STANDALONE_RENDER_MODE_URL_VALUE = "standalone";
|
||||||
|
|
||||||
|
public static final String DYNAMIC_RENDER_MODE_URL_VALUE = "dynamic";
|
||||||
|
|
||||||
|
public static final String DATA_RENDER_MODE_URL_VALUE = "data";
|
||||||
|
|
||||||
|
public static final String PDF_RENDER_MODE_URL_VALUE = "pdf";
|
||||||
|
|
||||||
|
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 resultFormatParam = "RS_TEXT";
|
||||||
|
String rdfResultFormatParam = "RDF/XML-ABBREV";
|
||||||
|
|
||||||
|
String individualURIParam = vitroRequest.getParameter(INDIVIDUAL_URI_URL_HANDLE);
|
||||||
|
|
||||||
|
String renderMode = vitroRequest.getParameter(RENDER_MODE_URL_HANDLE);
|
||||||
|
|
||||||
|
String visMode = vitroRequest.getParameter(VIS_MODE_URL_HANDLE);
|
||||||
|
|
||||||
|
String visContainer = vitroRequest.getParameter(VIS_CONTAINER_URL_HANDLE);
|
||||||
|
|
||||||
|
QueryHandler queryManager =
|
||||||
|
new QueryHandler(individualURIParam,
|
||||||
|
resultFormatParam,
|
||||||
|
rdfResultFormatParam,
|
||||||
|
dataSource,
|
||||||
|
log);
|
||||||
|
|
||||||
|
try {
|
||||||
|
List<BiboDocument> authorDocuments = queryManager.getVisualizationJavaValueObjects();
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Create a map from the year to number of publications. Use the BiboDocument's
|
||||||
|
* parsedPublicationYear to populate the data.
|
||||||
|
* */
|
||||||
|
Map<String, Integer> yearToPublicationCount =
|
||||||
|
queryManager.getYearToPublicationCount(authorDocuments);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* In order to avoid unneeded computations we have pushed this "if" condition up.
|
||||||
|
* This case arises when the render mode is data. In that case we dont want to generate
|
||||||
|
* HTML code to render sparkline, tables etc. Ideally I would want to avoid this flow.
|
||||||
|
* It is ugly!
|
||||||
|
* */
|
||||||
|
if (DATA_RENDER_MODE_URL_VALUE.equalsIgnoreCase(renderMode)) {
|
||||||
|
prepareVisualizationQueryDataResponse(authorDocuments,
|
||||||
|
yearToPublicationCount);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (PDF_RENDER_MODE_URL_VALUE.equalsIgnoreCase(renderMode)) {
|
||||||
|
prepareVisualizationQueryPDFResponse(authorDocuments,
|
||||||
|
yearToPublicationCount);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Computations required to generate HTML for the sparklines & related context.
|
||||||
|
* */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This is required because when deciding the range of years over which the vis
|
||||||
|
* was rendered we dont want to be influenced by the "DEFAULT_PUBLICATION_YEAR".
|
||||||
|
* */
|
||||||
|
Set<String> publishedYears = new HashSet(yearToPublicationCount.keySet());
|
||||||
|
publishedYears.remove(BiboDocument.DEFAULT_PUBLICATION_YEAR);
|
||||||
|
|
||||||
|
VisualizationCodeGenerator visualizationCodeGenerator =
|
||||||
|
new VisualizationCodeGenerator(yearToPublicationCount, log);
|
||||||
|
|
||||||
|
String visContentCode = visualizationCodeGenerator
|
||||||
|
.getMainVisualizationCode(authorDocuments,
|
||||||
|
publishedYears,
|
||||||
|
visMode,
|
||||||
|
visContainer);
|
||||||
|
|
||||||
|
String visContextCode = visualizationCodeGenerator
|
||||||
|
.getVisualizationContextCode(vitroRequest.getRequestURI(),
|
||||||
|
individualURIParam,
|
||||||
|
visMode);
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This is side-effecting because the response of this method is just to redirect to
|
||||||
|
* a page with visualization on it.
|
||||||
|
* */
|
||||||
|
RequestDispatcher requestDispatcher = null;
|
||||||
|
|
||||||
|
if (DYNAMIC_RENDER_MODE_URL_VALUE.equalsIgnoreCase(renderMode)) {
|
||||||
|
|
||||||
|
prepareVisualizationQueryDynamicResponse(request, response, vitroRequest,
|
||||||
|
visContentCode, visContextCode);
|
||||||
|
requestDispatcher = request.getRequestDispatcher("/templates/page/blankPage.jsp");
|
||||||
|
|
||||||
|
} else {
|
||||||
|
prepareVisualizationQueryStandaloneResponse(request, response, vitroRequest,
|
||||||
|
visContentCode, visContextCode);
|
||||||
|
|
||||||
|
requestDispatcher = request.getRequestDispatcher(Controllers.BASIC_JSP);
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
requestDispatcher.forward(request, response);
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("EntityEditController could not forward to view.");
|
||||||
|
log.error(e.getMessage());
|
||||||
|
log.error(e.getStackTrace());
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (MalformedQueryParametersException e) {
|
||||||
|
try {
|
||||||
|
handleMalformedParameters(e.getMessage());
|
||||||
|
} catch (ServletException e1) {
|
||||||
|
log.error(e1.getStackTrace());
|
||||||
|
} catch (IOException e1) {
|
||||||
|
log.error(e1.getStackTrace());
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private void prepareVisualizationQueryPDFResponse(List<BiboDocument> authorDocuments,
|
||||||
|
Map<String, Integer> yearToPublicationCount) {
|
||||||
|
|
||||||
|
String authorName = null;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* To protect against cases where there are no author documents associated with the
|
||||||
|
* individual.
|
||||||
|
* */
|
||||||
|
if (authorDocuments.size() > 0) {
|
||||||
|
authorName = ((BiboDocument) authorDocuments.get(0)).getAuthorLabel();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* To make sure that null/empty records for author names do not cause any mischief.
|
||||||
|
* */
|
||||||
|
if (authorName == null) {
|
||||||
|
authorName = "";
|
||||||
|
}
|
||||||
|
|
||||||
|
String outputFileName = slugify(authorName + "report")
|
||||||
|
+ ".pdf";
|
||||||
|
|
||||||
|
response.setContentType("application/pdf");
|
||||||
|
response.setHeader("Content-Disposition", "attachment;filename=" + outputFileName);
|
||||||
|
|
||||||
|
ServletOutputStream responseOutputStream;
|
||||||
|
try {
|
||||||
|
responseOutputStream = response.getOutputStream();
|
||||||
|
|
||||||
|
|
||||||
|
Document document = new Document();
|
||||||
|
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||||
|
PdfWriter pdfWriter = PdfWriter.getInstance(document, baos);
|
||||||
|
document.open();
|
||||||
|
|
||||||
|
PDFDocument pdfDocument = new PDFDocument(authorName, yearToPublicationCount, document, pdfWriter);
|
||||||
|
|
||||||
|
document.close();
|
||||||
|
|
||||||
|
// setting some response headers & content type
|
||||||
|
response.setHeader("Expires", "0");
|
||||||
|
response.setHeader("Cache-Control", "must-revalidate, post-check=0, pre-check=0");
|
||||||
|
response.setHeader("Pragma", "public");
|
||||||
|
response.setContentLength(baos.size());
|
||||||
|
// write ByteArrayOutputStream to the ServletOutputStream
|
||||||
|
baos.writeTo(responseOutputStream);
|
||||||
|
responseOutputStream.flush();
|
||||||
|
responseOutputStream.close();
|
||||||
|
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
} catch (DocumentException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void prepareVisualizationQueryDataResponse(List<BiboDocument> authorDocuments,
|
||||||
|
Map<String, Integer> yearToPublicationCount) {
|
||||||
|
|
||||||
|
String authorName = null;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* To protect against cases where there are no author documents associated with the
|
||||||
|
* individual.
|
||||||
|
* */
|
||||||
|
if (authorDocuments.size() > 0) {
|
||||||
|
authorName = ((BiboDocument) authorDocuments.get(0)).getAuthorLabel();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* To make sure that null/empty records for author names do not cause any mischief.
|
||||||
|
* */
|
||||||
|
if (authorName == null) {
|
||||||
|
authorName = "";
|
||||||
|
}
|
||||||
|
|
||||||
|
String outputFileName = slugify(authorName + "pub-count-sparkline")
|
||||||
|
+ ".csv";
|
||||||
|
|
||||||
|
response.setContentType("application/octet-stream");
|
||||||
|
response.setHeader("Content-Disposition","attachment;filename=" + outputFileName);
|
||||||
|
|
||||||
|
try {
|
||||||
|
|
||||||
|
PrintWriter responseWriter = response.getWriter();
|
||||||
|
|
||||||
|
/*
|
||||||
|
* We are side-effecting responseWriter since we are directly manipulating the response
|
||||||
|
* object of the servlet.
|
||||||
|
* */
|
||||||
|
generateCsvFileBuffer(yearToPublicationCount,
|
||||||
|
responseWriter);
|
||||||
|
|
||||||
|
responseWriter.close();
|
||||||
|
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Currently the approach for slugifying filenames is naive. In future if there is need,
|
||||||
|
* we can write more sophisticated method.
|
||||||
|
* @param textToBeSlugified
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
private String slugify(String textToBeSlugified) {
|
||||||
|
return textToBeSlugified.toLowerCase().replaceAll("[^a-zA-Z0-9-]", "-");
|
||||||
|
}
|
||||||
|
|
||||||
|
private void generateCsvFileBuffer(Map<String, Integer> yearToPublicationCount,
|
||||||
|
PrintWriter responseWriter) {
|
||||||
|
|
||||||
|
CSVWriter csvWriter = new SimpleWriter(responseWriter);
|
||||||
|
|
||||||
|
try {
|
||||||
|
csvWriter.append(new String[]{"Year", "Publications"});
|
||||||
|
for (Entry<String, Integer> currentEntry : yearToPublicationCount.entrySet()) {
|
||||||
|
csvWriter.append(new Object[]{currentEntry.getKey(), currentEntry.getValue()});
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
responseWriter.flush();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private void prepareVisualizationQueryStandaloneResponse(HttpServletRequest request,
|
||||||
|
HttpServletResponse response, VitroRequest vreq,
|
||||||
|
String visContentCode, String visContextCode) {
|
||||||
|
|
||||||
|
Portal portal = vreq.getPortal();
|
||||||
|
|
||||||
|
request.setAttribute("visContentCode", visContentCode);
|
||||||
|
request.setAttribute("visContextCode", visContextCode);
|
||||||
|
|
||||||
|
request.setAttribute("bodyJsp", "/templates/visualization/publication_count.jsp");
|
||||||
|
request.setAttribute("portalBean", portal);
|
||||||
|
request.setAttribute("title", "Person Publication Count visualization");
|
||||||
|
request.setAttribute("scripts", "/templates/visualization/visualization_scripts.jsp");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private void prepareVisualizationQueryDynamicResponse(HttpServletRequest request,
|
||||||
|
HttpServletResponse response, VitroRequest vreq,
|
||||||
|
String visContentCode, String visContextCode) {
|
||||||
|
|
||||||
|
Portal portal = vreq.getPortal();
|
||||||
|
|
||||||
|
request.setAttribute("visContentCode", visContentCode);
|
||||||
|
request.setAttribute("visContextCode", visContextCode);
|
||||||
|
|
||||||
|
request.setAttribute("portalBean", portal);
|
||||||
|
request.setAttribute("bodyJsp", "/templates/visualization/ajax_vis_content.jsp");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private void handleMalformedParameters(String errorMessage)
|
||||||
|
throws ServletException, IOException {
|
||||||
|
|
||||||
|
Portal portal = vitroRequest.getPortal();
|
||||||
|
|
||||||
|
request.setAttribute("error", errorMessage);
|
||||||
|
|
||||||
|
RequestDispatcher requestDispatcher = request.getRequestDispatcher(Controllers.BASIC_JSP);
|
||||||
|
request.setAttribute("bodyJsp", "/templates/visualization/visualization_error.jsp");
|
||||||
|
request.setAttribute("portalBean", portal);
|
||||||
|
request.setAttribute("title", "Visualization Query Error - Person Publication Count");
|
||||||
|
|
||||||
|
try {
|
||||||
|
requestDispatcher.forward(request, response);
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("EntityEditController could not forward to view.");
|
||||||
|
log.error(e.getMessage());
|
||||||
|
log.error(e.getStackTrace());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,16 @@
|
||||||
|
package edu.cornell.mannlib.vitro.webapp.visualization.sparqlutils;
|
||||||
|
|
||||||
|
public class QueryConstants {
|
||||||
|
|
||||||
|
public static final String SPARQL_QUERY_PREFIXES = "" +
|
||||||
|
"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";
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,40 @@
|
||||||
|
package edu.cornell.mannlib.vitro.webapp.visualization.sparqlutils;
|
||||||
|
|
||||||
|
public class QueryFieldLabels {
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Document related field labels
|
||||||
|
* */
|
||||||
|
public static final String DOCUMENT_URL = "documentLit";
|
||||||
|
public static final String DOCUMENT_MONIKER = "documentMonikerLit";
|
||||||
|
public static final String DOCUMENT_LABEL = "documentLabelLit";
|
||||||
|
public static final String DOCUMENT_BLURB = "documentBlurbLit";
|
||||||
|
public static final String DOCUMENT_DESCRIPTION = "documentDescriptionLit";
|
||||||
|
public static final String DOCUMENT_PUBLICATION_YEAR = "publicationYearLit";
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Author related field labels
|
||||||
|
* */
|
||||||
|
public static final String AUTHOR_URL = "authPersonLit";
|
||||||
|
public static final String AUTHOR_LABEL = "authorLabelLit";
|
||||||
|
|
||||||
|
/*
|
||||||
|
* College related field labels
|
||||||
|
* */
|
||||||
|
public static final String COLLEGE_URL = "collegeLit";
|
||||||
|
public static final String COLLEGE_LABEL = "collegeLabelLit";
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Department related field labels
|
||||||
|
* */
|
||||||
|
public static final String DEPARTMENT_URL = "departmentLit";
|
||||||
|
public static final String DEPARTMENT_LABEL = "departmentLabelLit";
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Employee related field labels
|
||||||
|
* */
|
||||||
|
public static final String ACADEMIC_FACULTY_EMPLOYEE_URL = "academicFacultyEmployeeLit";
|
||||||
|
public static final String ACADEMIC_STAFF_EMPLOYEE_URL = "academicStaffEmployeeLit";
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,145 @@
|
||||||
|
package edu.cornell.mannlib.vitro.webapp.visualization.valueobjects;
|
||||||
|
|
||||||
|
import java.util.Calendar;
|
||||||
|
import java.util.regex.Matcher;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
|
public class BiboDocument {
|
||||||
|
|
||||||
|
public static final String DEFAULT_PUBLICATION_YEAR = "Unknown";
|
||||||
|
public static final int MINIMUM_PUBLICATION_YEAR = 1800;
|
||||||
|
private static final int CURRENT_YEAR = Calendar.getInstance().get(Calendar.YEAR);
|
||||||
|
|
||||||
|
private String authorURL;
|
||||||
|
private String authorLabel;
|
||||||
|
private String documentURL;
|
||||||
|
private String documentMoniker;
|
||||||
|
private String documentLabel;
|
||||||
|
private String documentBlurb;
|
||||||
|
private String documentDescription;
|
||||||
|
private String publicationYear;
|
||||||
|
private String parsedPublicationYear = DEFAULT_PUBLICATION_YEAR;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public BiboDocument(String documentURL) {
|
||||||
|
this.documentURL = documentURL;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getAuthorURL() {
|
||||||
|
return authorURL;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAuthorURL(String authorURL) {
|
||||||
|
this.authorURL = authorURL;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getAuthorLabel() {
|
||||||
|
return authorLabel;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAuthorLabel(String authorLabel) {
|
||||||
|
this.authorLabel = authorLabel;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDocumentURL() {
|
||||||
|
return documentURL;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDocumentURL(String documentURL) {
|
||||||
|
this.documentURL = documentURL;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDocumentMoniker() {
|
||||||
|
return documentMoniker;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDocumentMoniker(String documentMoniker) {
|
||||||
|
this.documentMoniker = documentMoniker;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDocumentLabel() {
|
||||||
|
return documentLabel;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDocumentLabel(String documentLabel) {
|
||||||
|
this.documentLabel = documentLabel;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDocumentBlurb() {
|
||||||
|
return documentBlurb;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDocumentBlurb(String documentBlurb) {
|
||||||
|
this.documentBlurb = documentBlurb;
|
||||||
|
|
||||||
|
if (documentBlurb != null) {
|
||||||
|
this.setParsedPublicationYear(parsePublicationYear(documentBlurb));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private String parsePublicationYear(String documentBlurb) {
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This pattern will match all group of numbers which have only 4 digits
|
||||||
|
* delimited by the word boundary.
|
||||||
|
* */
|
||||||
|
// String pattern = "\\b\\d{4}\\b";
|
||||||
|
String pattern = "(?<!-)\\b\\d{4}\\b(?=[^-])";
|
||||||
|
|
||||||
|
Pattern yearPattern = Pattern.compile(pattern);
|
||||||
|
String publishedYear = DEFAULT_PUBLICATION_YEAR;
|
||||||
|
|
||||||
|
Matcher yearMatcher = yearPattern.matcher(documentBlurb);
|
||||||
|
|
||||||
|
while (yearMatcher.find()) {
|
||||||
|
|
||||||
|
String yearCandidate = yearMatcher.group();
|
||||||
|
|
||||||
|
Integer candidateYearInteger = Integer.valueOf(yearCandidate);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Published year has to be equal or less than the current year
|
||||||
|
* and more than a minimum default year.
|
||||||
|
* */
|
||||||
|
if (candidateYearInteger <= CURRENT_YEAR
|
||||||
|
&& candidateYearInteger >= MINIMUM_PUBLICATION_YEAR) {
|
||||||
|
publishedYear = candidateYearInteger.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return publishedYear;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDocumentDescription() {
|
||||||
|
return documentDescription;
|
||||||
|
}
|
||||||
|
public void setDocumentDescription(String documentDescription) {
|
||||||
|
this.documentDescription = documentDescription;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Only the
|
||||||
|
* */
|
||||||
|
private void setParsedPublicationYear(String parsedPublicationYear) {
|
||||||
|
this.parsedPublicationYear = parsedPublicationYear;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getParsedPublicationYear() {
|
||||||
|
return parsedPublicationYear;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This publicationYear value is directly from the data supported by the ontology. If this is empty only
|
||||||
|
* then use the parsedPublicationYear.
|
||||||
|
* */
|
||||||
|
public String getPublicationYear() {
|
||||||
|
return publicationYear;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPublicationYear(String publicationYear) {
|
||||||
|
this.publicationYear = publicationYear;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,12 @@
|
||||||
|
package edu.cornell.mannlib.vitro.webapp.visualization.valueobjects;
|
||||||
|
|
||||||
|
public class VOConstants {
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Employee related constants
|
||||||
|
* */
|
||||||
|
public static enum EmployeeType {
|
||||||
|
ACADEMIC_FACULTY_EMPLOYEE, ACADEMIC_STAFF_EMPLOYEE
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,46 @@
|
||||||
|
package edu.cornell.mannlib.vitro.webapp.visualization.valueobjects;
|
||||||
|
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* This is the Value Object equivalent for vivo:CollegeOrSchoolWithinUniversity object type.
|
||||||
|
* @author cdtank
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class VivoCollegeOrSchool {
|
||||||
|
|
||||||
|
private String collegeURL;
|
||||||
|
private String collegeLabel;
|
||||||
|
private Set<VivoDepartmentOrDivision> departments = new HashSet<VivoDepartmentOrDivision>();
|
||||||
|
|
||||||
|
public VivoCollegeOrSchool(String collegeURL) {
|
||||||
|
this.collegeURL = collegeURL;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Set<VivoDepartmentOrDivision> getDepartments() {
|
||||||
|
return departments;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addDepartment(VivoDepartmentOrDivision department) {
|
||||||
|
this.departments.add(department);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getCollegeURL() {
|
||||||
|
return collegeURL;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getCollegeLabel() {
|
||||||
|
if (collegeLabel != null) {
|
||||||
|
return collegeLabel;
|
||||||
|
} else {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setCollegeLabel(String collegeLabel) {
|
||||||
|
this.collegeLabel = collegeLabel;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,47 @@
|
||||||
|
package edu.cornell.mannlib.vitro.webapp.visualization.valueobjects;
|
||||||
|
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* This is the Value Object equivalent for vivo:AcademicDepartmentOrDivision object type.
|
||||||
|
* @author cdtank
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class VivoDepartmentOrDivision {
|
||||||
|
|
||||||
|
private String departmentURL;
|
||||||
|
private String departmentLabel;
|
||||||
|
private Set<VivoCollegeOrSchool> parentColleges = new HashSet<VivoCollegeOrSchool>();
|
||||||
|
|
||||||
|
public VivoDepartmentOrDivision(String departmentURL, VivoCollegeOrSchool parentCollege) {
|
||||||
|
this.departmentURL = departmentURL;
|
||||||
|
addParentCollege(parentCollege);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Set<VivoCollegeOrSchool> getParentCollege() {
|
||||||
|
return parentColleges;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addParentCollege(VivoCollegeOrSchool parentCollege) {
|
||||||
|
this.parentColleges.add(parentCollege);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDepartmentURL() {
|
||||||
|
return departmentURL;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDepartmentLabel() {
|
||||||
|
if (departmentLabel != null) {
|
||||||
|
return departmentLabel;
|
||||||
|
} else {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDepartmentLabel(String departmentLabel) {
|
||||||
|
this.departmentLabel = departmentLabel;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,59 @@
|
||||||
|
package edu.cornell.mannlib.vitro.webapp.visualization.valueobjects;
|
||||||
|
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import edu.cornell.mannlib.vitro.webapp.visualization.valueobjects.VOConstants.EmployeeType;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* This is the Value Object equivalent for vivo's Employee object type.
|
||||||
|
* @author cdtank
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class VivoEmployee {
|
||||||
|
|
||||||
|
private String employeeURL;
|
||||||
|
private EmployeeType employeeType;
|
||||||
|
private Set<VivoDepartmentOrDivision> parentDepartments = new HashSet<VivoDepartmentOrDivision>();
|
||||||
|
private Set<BiboDocument> authorDocuments = new HashSet<BiboDocument>();
|
||||||
|
|
||||||
|
public VivoEmployee(String employeeURL, EmployeeType employeeType, VivoDepartmentOrDivision parentDepartment) {
|
||||||
|
this.employeeURL = employeeURL;
|
||||||
|
addParentDepartment(parentDepartment);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getEmployeeURL() {
|
||||||
|
return employeeURL;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setEmployeeURL(String employeeURL) {
|
||||||
|
this.employeeURL = employeeURL;
|
||||||
|
}
|
||||||
|
|
||||||
|
public EmployeeType getEmployeeType() {
|
||||||
|
return employeeType;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setEmployeeType(EmployeeType employeeType) {
|
||||||
|
this.employeeType = employeeType;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Set<VivoDepartmentOrDivision> getParentDepartments() {
|
||||||
|
return parentDepartments;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addParentDepartment(VivoDepartmentOrDivision parentDepartment) {
|
||||||
|
this.parentDepartments.add(parentDepartment);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Set<BiboDocument> getAuthorDocuments() {
|
||||||
|
return authorDocuments;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addAuthorDocument(BiboDocument authorDocument) {
|
||||||
|
this.authorDocuments.add(authorDocument);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -131,6 +131,10 @@ if (VitroRequestPrep.isSelfEditing(request) || LoginFormBean.loggedIn(request, L
|
||||||
</c:choose>
|
</c:choose>
|
||||||
</div> <!-- end labelAndMoniker -->
|
</div> <!-- end labelAndMoniker -->
|
||||||
|
|
||||||
|
<!-- START Sparkline Visualization -->
|
||||||
|
<jsp:include page="sparklineVisualization.jsp"/>
|
||||||
|
<!-- END Sparkline Visualization -->
|
||||||
|
|
||||||
<%-- Links --%>
|
<%-- Links --%>
|
||||||
<c:if test="${ showEdits || !empty entity.url || !empty entity.linksList }">
|
<c:if test="${ showEdits || !empty entity.url || !empty entity.linksList }">
|
||||||
<div id="dprop-vitro-links" class="propsItem ${editingClass}">
|
<div id="dprop-vitro-links" class="propsItem ${editingClass}">
|
||||||
|
|
|
@ -26,6 +26,7 @@
|
||||||
<c:url var="vitroControls" value="/js/controls.js"/>
|
<c:url var="vitroControls" value="/js/controls.js"/>
|
||||||
<c:url var="jqueryForm" value="/js/jquery_plugins/jquery.form.js"/>
|
<c:url var="jqueryForm" value="/js/jquery_plugins/jquery.form.js"/>
|
||||||
<c:url var="tinyMCE" value="/js/tiny_mce/tiny_mce.js"/>
|
<c:url var="tinyMCE" value="/js/tiny_mce/tiny_mce.js"/>
|
||||||
|
<c:url var="googleVisualizationAPI" value="http://www.google.com/jsapi?autoload=%7B%22modules%22%3A%5B%7B%22name%22%3A%22visualization%22%2C%22version%22%3A%221%22%2C%22packages%22%3A%5B%22areachart%22%2C%22imagesparkline%22%5D%7D%5D%7D"/>
|
||||||
|
|
||||||
<script type="text/javascript" src="${jquery}"></script>
|
<script type="text/javascript" src="${jquery}"></script>
|
||||||
<script type="text/javascript" src="${getURLParam}"></script>
|
<script type="text/javascript" src="${getURLParam}"></script>
|
||||||
|
@ -34,3 +35,4 @@
|
||||||
<script type="text/javascript" src="${jqueryForm}"></script>
|
<script type="text/javascript" src="${jqueryForm}"></script>
|
||||||
<script type="text/javascript" src="${tinyMCE}"></script>
|
<script type="text/javascript" src="${tinyMCE}"></script>
|
||||||
<script type="text/javascript" src="${vitroControls}"></script>
|
<script type="text/javascript" src="${vitroControls}"></script>
|
||||||
|
<script type="text/javascript" src="${googleVisualizationAPI}"></script>
|
||||||
|
|
135
webapp/web/templates/entity/sparklineVisualization.jsp
Normal file
135
webapp/web/templates/entity/sparklineVisualization.jsp
Normal file
|
@ -0,0 +1,135 @@
|
||||||
|
<%@ page import="edu.cornell.mannlib.vitro.webapp.beans.ApplicationBean"%>
|
||||||
|
<%@ page import="edu.cornell.mannlib.vitro.webapp.beans.Individual" %>
|
||||||
|
<%@ page import="edu.cornell.mannlib.vitro.webapp.beans.VClass" %>
|
||||||
|
<%@ page import="edu.cornell.mannlib.vitro.webapp.flags.PortalFlagChoices" %>
|
||||||
|
<%@ page import="edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory" %>
|
||||||
|
<%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %>
|
||||||
|
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
|
||||||
|
<%@ page errorPage="/error.jsp"%>
|
||||||
|
<% /***********************************************
|
||||||
|
Displays the little group of things at the bottom of the page
|
||||||
|
for administrators and editors.
|
||||||
|
|
||||||
|
request.attributes:
|
||||||
|
an Entity object with the name "entity"
|
||||||
|
|
||||||
|
|
||||||
|
request.parameters:
|
||||||
|
None, should only work with requestScope attributes for security reasons.
|
||||||
|
|
||||||
|
Consider sticking < % = MiscWebUtils.getReqInfo(request) % > in the html output
|
||||||
|
for debugging info.
|
||||||
|
|
||||||
|
bdc34 2006-01-22 created
|
||||||
|
**********************************************/
|
||||||
|
Individual entity = (Individual)request.getAttribute("entity");
|
||||||
|
boolean displayVisualization = false;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if (entity == null){
|
||||||
|
String e = "sparklineVisuzalition.jsp expects that request attribute 'entity' be set to the Entity object to display.";
|
||||||
|
displayVisualization = false;
|
||||||
|
throw new JspException(e);
|
||||||
|
} else {
|
||||||
|
for (VClass currClass : entity.getVClasses()) {
|
||||||
|
//System.out.println(">> " + currClass.getName());
|
||||||
|
if (currClass.getName().equalsIgnoreCase("Person")) {
|
||||||
|
displayVisualization = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//System.out.println("visualization is supposed to be displayed? > " + displayVisualization);
|
||||||
|
if (displayVisualization) {
|
||||||
|
|
||||||
|
%>
|
||||||
|
|
||||||
|
|
||||||
|
<c:set var='portalBean' value='${currentPortal}'/>
|
||||||
|
<c:set var="themeDir"><c:out value="${portalBean.themeDir}" /></c:set>
|
||||||
|
|
||||||
|
<!-- START Visualization Code -->
|
||||||
|
<c:url var="visualizationURL" value="/admin/visQuery">
|
||||||
|
<c:param name="render_mode" value="dynamic"/>
|
||||||
|
<c:param name="container" value="vis_container"/>
|
||||||
|
<c:param name="vis" value="person_pub_count"/>
|
||||||
|
<c:param name="vis_mode" value="short"/>
|
||||||
|
<c:param name="uri" value="${entity.URI}"/>
|
||||||
|
</c:url>
|
||||||
|
|
||||||
|
<!-- PDF Visualization URL
|
||||||
|
|
||||||
|
For now we have disabled this.
|
||||||
|
|
||||||
|
<c:url var="pdfURL" value="/admin/visQuery">
|
||||||
|
<c:param name="render_mode" value="pdf"/>
|
||||||
|
<c:param name="container" value="vis_container"/>
|
||||||
|
<c:param name="vis" value="person_pub_count"/>
|
||||||
|
<c:param name="vis_mode" value="full"/>
|
||||||
|
<c:param name="uri" value="${entity.URI}"/>
|
||||||
|
</c:url>
|
||||||
|
|
||||||
|
-->
|
||||||
|
|
||||||
|
<style type="text/css">
|
||||||
|
#vis_container {
|
||||||
|
cursor:pointer;
|
||||||
|
height:36px;
|
||||||
|
margin-left:24%;
|
||||||
|
margin-top:-2%;
|
||||||
|
position:absolute;
|
||||||
|
width:275px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<script type="text/javascript">
|
||||||
|
<!--
|
||||||
|
|
||||||
|
$(document).ready(function() {
|
||||||
|
|
||||||
|
function renderVisualization(visualizationURL) {
|
||||||
|
|
||||||
|
$("#vis_container").empty().html('<img src="/vivo/${themeDir}utility/ajax-loader.gif" />');
|
||||||
|
|
||||||
|
$.ajax({
|
||||||
|
url: visualizationURL,
|
||||||
|
dataType: "html",
|
||||||
|
success:function(data){
|
||||||
|
$("#vis_container").html(data);
|
||||||
|
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
renderVisualization('${visualizationURL}');
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//-->
|
||||||
|
</script>
|
||||||
|
<div id="vis_container">
|
||||||
|
${entity.URI}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
|
||||||
|
For now we have disabled PDF report vis.
|
||||||
|
|
||||||
|
<div id="pdf_url">
|
||||||
|
This is the <a href="${pdfURL}">link</a> to PDF report.
|
||||||
|
</div>
|
||||||
|
|
||||||
|
-->
|
||||||
|
|
||||||
|
<!-- END Visualization Code -->
|
||||||
|
|
||||||
|
<%
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
%>
|
46
webapp/web/templates/page/blankPage.jsp
Normal file
46
webapp/web/templates/page/blankPage.jsp
Normal file
|
@ -0,0 +1,46 @@
|
||||||
|
<%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %>
|
||||||
|
|
||||||
|
<% /***********************************************
|
||||||
|
Display a single Page in the most basic fashion.
|
||||||
|
The html <HEAD> is generated followed by the banners and menu.
|
||||||
|
After that the result of the jsp in the attribute bodyJsp is inserted.
|
||||||
|
Finally comes the footer.
|
||||||
|
|
||||||
|
request.attributes:
|
||||||
|
"bodyJsp" - jsp of the body of this page.
|
||||||
|
"title" - title of page
|
||||||
|
"css" - optional additional css for page
|
||||||
|
"scripts" - optional name of file containing <script> elements to be included in the page
|
||||||
|
"bodyAttr" - optional attributes for the <body> tag, e.g. 'onload': use leading space
|
||||||
|
"portalBean" - PortalBean object for request.
|
||||||
|
|
||||||
|
Consider sticking < % = MiscWebUtils.getReqInfo(request) % > in the html output
|
||||||
|
for debugging info.
|
||||||
|
|
||||||
|
bdc34 2006-02-03 created
|
||||||
|
**********************************************/
|
||||||
|
/*
|
||||||
|
String e = "";
|
||||||
|
if (request.getAttribute("bodyJsp") == null){
|
||||||
|
e+="basicPage.jsp expects that request parameter 'bodyJsp' be set to the jsp to display as the page body.\n";
|
||||||
|
}
|
||||||
|
if (request.getAttribute("title") == null){
|
||||||
|
e+="basicPage.jsp expects that request parameter 'title' be set to the title to use for page.\n";
|
||||||
|
}
|
||||||
|
if (request.getAttribute("css") == null){
|
||||||
|
e+="basicPage.jsp expects that request parameter 'css' be set to css to include in page.\n";
|
||||||
|
}
|
||||||
|
if( request.getAttribute("portalBean") == null){
|
||||||
|
e+="basicPage.jsp expects that request attribute 'portalBean' be set.\n";
|
||||||
|
}
|
||||||
|
if( request.getAttribute("appBean") == null){
|
||||||
|
e+="basicPage.jsp expects that request attribute 'appBean' be set.\n";
|
||||||
|
}
|
||||||
|
if( e.length() > 0 ){
|
||||||
|
throw new JspException(e);
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
%>
|
||||||
|
|
||||||
|
<c:set var="bodyJsp"><c:out value="${requestScope.bodyJsp}" default="/debug.jsp"/></c:set>
|
||||||
|
<c:import url="${bodyJsp}"/>
|
97
webapp/web/templates/visualization/ajax_vis_content.jsp
Normal file
97
webapp/web/templates/visualization/ajax_vis_content.jsp
Normal file
|
@ -0,0 +1,97 @@
|
||||||
|
<%--
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Number of Publications with NO parseable "Publication Year" => 6
|
||||||
|
<br />
|
||||||
|
{2004=2, 2005=2, 2006=8, DNA=6}
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<style type="text/css">
|
||||||
|
.sparkline_style table{
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
width: auto;
|
||||||
|
border-collapse: collapse;
|
||||||
|
border-spacing: 0;
|
||||||
|
vertical-align: inherit;
|
||||||
|
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<script type="text/javascript">
|
||||||
|
function drawVisualization() {
|
||||||
|
var data = new google.visualization.DataTable();
|
||||||
|
data.addColumn('string', 'Year');
|
||||||
|
data.addColumn('number', 'Publications');
|
||||||
|
data.addRows(7);
|
||||||
|
data.setValue(0, 0, '2004');
|
||||||
|
data.setValue(0, 1, 2);
|
||||||
|
data.setValue(1, 0, '2005');
|
||||||
|
data.setValue(1, 1, 2);
|
||||||
|
data.setValue(2, 0, '2006');
|
||||||
|
data.setValue(2, 1, 8);
|
||||||
|
data.setValue(3, 0, '2007');
|
||||||
|
data.setValue(3, 1, 0);
|
||||||
|
data.setValue(4, 0, '2008');
|
||||||
|
data.setValue(4, 1, 0);
|
||||||
|
data.setValue(5, 0, '2009');
|
||||||
|
data.setValue(5, 1, 0);
|
||||||
|
data.setValue(6, 0, '2010');
|
||||||
|
data.setValue(6, 1, 0);
|
||||||
|
var fullSparklineView = new google.visualization.DataView(data);
|
||||||
|
var shortSparklineView = new google.visualization.DataView(data);
|
||||||
|
shortSparklineView.setColumns([1]);
|
||||||
|
fullSparklineView.setColumns([1]);
|
||||||
|
shortSparklineView.setRows(data.getFilteredRows([{
|
||||||
|
column: 0,
|
||||||
|
minValue: '2001',
|
||||||
|
maxValue: '2010'}]));
|
||||||
|
var full_spark = new google.visualization.ImageSparkLine(document.getElementById('pub_count_full_sparkline_viz'));
|
||||||
|
full_spark.draw(fullSparklineView, {
|
||||||
|
width: 63,
|
||||||
|
height: 21,
|
||||||
|
showAxisLines: false,
|
||||||
|
showValueLabels: false,
|
||||||
|
labelPosition: 'none'
|
||||||
|
});
|
||||||
|
var short_spark = new google.visualization.ImageSparkLine(document.getElementById('pub_count_short_sparkline_viz'));
|
||||||
|
short_spark.draw(shortSparklineView, {
|
||||||
|
width: 63,
|
||||||
|
height: 21,
|
||||||
|
showAxisLines: false,
|
||||||
|
showValueLabels: false,
|
||||||
|
labelPosition: 'none'
|
||||||
|
});
|
||||||
|
var shortSparkRows = shortSparklineView.getViewRows();
|
||||||
|
var renderedShortSparks = 0;
|
||||||
|
$.each(shortSparkRows, function(index, value) {
|
||||||
|
renderedShortSparks += data.getValue(value, 1);
|
||||||
|
});
|
||||||
|
var shortSparksText = '<p>' + renderedShortSparks + ' Papers with year from ' + ' 18 ' + ' total' + '</p>';
|
||||||
|
$(shortSparksText).prependTo('#pub_count_short_sparkline_viz');
|
||||||
|
var allSparksText = '<p><b>Full Timeline</b> ' + 12 + ' Papers with year from ' + ' 18 ' + ' total' + '</p>';
|
||||||
|
$(allSparksText).prependTo('#pub_count_full_sparkline_viz');
|
||||||
|
}
|
||||||
|
$(document).ready(function() {
|
||||||
|
if ($('#pub_count_short_sparkline_viz').length == 0) {
|
||||||
|
$('<div/>', {
|
||||||
|
'id': 'pub_count_short_sparkline_viz',
|
||||||
|
'class': 'sparkline_style'
|
||||||
|
|
||||||
|
}).appendTo('#ajax_recipient');
|
||||||
|
}
|
||||||
|
if ($('#pub_count_full_sparkline_viz').length == 0) {
|
||||||
|
$('<div/>', {
|
||||||
|
'id': 'pub_count_full_sparkline_viz',
|
||||||
|
'class': 'sparkline_style'
|
||||||
|
}).appendTo('#ajax_recipient');
|
||||||
|
}
|
||||||
|
drawVisualization();
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
--%>
|
||||||
|
|
||||||
|
${requestScope.visContentCode}
|
||||||
|
|
||||||
|
${requestScope.visContextCode}
|
227
webapp/web/templates/visualization/dummy_vis_client.jsp
Normal file
227
webapp/web/templates/visualization/dummy_vis_client.jsp
Normal file
|
@ -0,0 +1,227 @@
|
||||||
|
<%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %>
|
||||||
|
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
|
||||||
|
|
||||||
|
<c:set var="portal" value="${requestScope.portalBean}"/>
|
||||||
|
<c:set var="themeDir"><c:out value="${portal.themeDir}" /></c:set>
|
||||||
|
|
||||||
|
<c:url var="staticHref" value="/admin/visQuery">
|
||||||
|
<c:param name="vis" value="person_pub_count"/>
|
||||||
|
<c:param name="render_mode" value="standalone"/>
|
||||||
|
<c:param name="vis_mode" value="wth"/>
|
||||||
|
<c:param name="uri" value="http://vivo.library.cornell.edu/ns/0.1#individual5156"/>
|
||||||
|
</c:url>
|
||||||
|
|
||||||
|
<c:url var="staticHref2" value="/admin/visQuery">
|
||||||
|
<c:param name="vis" value="person_pub_count"/>
|
||||||
|
<c:param name="vis_mode" value="short"/>
|
||||||
|
<c:param name="uri" value="http://vivo.library.cornell.edu/ns/0.1#individual5611"/>
|
||||||
|
</c:url>
|
||||||
|
|
||||||
|
<c:url var="staticHref_d" value="/admin/visQuery">
|
||||||
|
<c:param name="render_mode" value="dynamic"/>
|
||||||
|
<c:param name="container" value="ajax_recipient"/>
|
||||||
|
<c:param name="vis" value="person_pub_count"/>
|
||||||
|
<c:param name="vis_mode" value="short"/>
|
||||||
|
<c:param name="uri" value="http://vivo.library.cornell.edu/ns/0.1#individual5156"/>
|
||||||
|
</c:url>
|
||||||
|
|
||||||
|
<c:url var="staticHref2_d" value="/admin/visQuery">
|
||||||
|
<c:param name="render_mode" value="dynamic"/>
|
||||||
|
<c:param name="container" value="ajax_recipient"/>
|
||||||
|
<c:param name="vis" value="person_pub_count"/>
|
||||||
|
<c:param name="vis_mode" value="full"/>
|
||||||
|
<c:param name="uri" value="http://vivo.library.cornell.edu/ns/0.1#individual5611"/>
|
||||||
|
</c:url>
|
||||||
|
|
||||||
|
|
||||||
|
<c:url var="staticHref3" value="/admin/visQuery">
|
||||||
|
<c:param name="vis" value="person_pub_count"/>
|
||||||
|
<c:param name="vis_mode" value="short"/>
|
||||||
|
<c:param name="uri" value="http://vivo.library.cornell.edu/ns/0.1#individual5748"/>
|
||||||
|
</c:url>
|
||||||
|
|
||||||
|
|
||||||
|
<c:url var="staticHref3_d" value="/admin/visQuery">
|
||||||
|
<c:param name="render_mode" value="dynamic"/>
|
||||||
|
<c:param name="vis" value="person_pub_count"/>
|
||||||
|
<c:param name="container" value="ajax_recipient"/>
|
||||||
|
<c:param name="uri" value="http://vivo.library.cornell.edu/ns/0.1#individual22919"/>
|
||||||
|
</c:url>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<c:url var="collegeCSV" value="/admin/visQuery">
|
||||||
|
<c:param name="vis" value="college_pub_count"/>
|
||||||
|
<c:param name="render_mode" value="data"/>
|
||||||
|
<c:param name="vis_mode" value="wth"/>
|
||||||
|
<c:param name="uri" value="http://vivo.library.cornell.edu/ns/0.1#individual5249"/>
|
||||||
|
</c:url>
|
||||||
|
|
||||||
|
<c:url var="collegeCSV2" value="/admin/visQuery">
|
||||||
|
<c:param name="vis" value="college_pub_count"/>
|
||||||
|
<c:param name="render_mode" value="data"/>
|
||||||
|
<c:param name="vis_mode" value="wth"/>
|
||||||
|
<c:param name="uri" value="http://vivo.library.cornell.edu/ns/0.1#individual134"/>
|
||||||
|
</c:url>
|
||||||
|
|
||||||
|
|
||||||
|
<c:url var="collegeCSV3" value="/admin/visQuery">
|
||||||
|
<c:param name="vis" value="college_pub_count"/>
|
||||||
|
<c:param name="render_mode" value="data"/>
|
||||||
|
<c:param name="vis_mode" value="wth"/>
|
||||||
|
<c:param name="uri" value="http://vivo.library.cornell.edu/ns/0.1#individual249"/>
|
||||||
|
</c:url>
|
||||||
|
|
||||||
|
|
||||||
|
<c:url var="collegeCSV4" value="/admin/visQuery">
|
||||||
|
<c:param name="vis" value="college_pub_count"/>
|
||||||
|
<c:param name="render_mode" value="data"/>
|
||||||
|
<c:param name="vis_mode" value="wth"/>
|
||||||
|
<c:param name="uri" value="http://vivo.library.cornell.edu/ns/0.1#individual250"/>
|
||||||
|
</c:url>
|
||||||
|
|
||||||
|
<c:url var="collegeCSV5" value="/admin/visQuery">
|
||||||
|
<c:param name="vis" value="college_pub_count"/>
|
||||||
|
<c:param name="render_mode" value="data"/>
|
||||||
|
<c:param name="vis_mode" value="wth"/>
|
||||||
|
<c:param name="uri" value="http://vivo.library.cornell.edu/ns/0.1#individual192"/>
|
||||||
|
</c:url>
|
||||||
|
|
||||||
|
<style type="text/css">
|
||||||
|
.get_vis {
|
||||||
|
background-color:Yellow;
|
||||||
|
color:blue;
|
||||||
|
cursor:pointer;
|
||||||
|
height:36px;
|
||||||
|
width:225px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
|
||||||
|
<script type="text/javascript">
|
||||||
|
<!--
|
||||||
|
|
||||||
|
$(document).ready(function() {
|
||||||
|
|
||||||
|
function renderVisualization(visualizationURL) {
|
||||||
|
|
||||||
|
$("#ajax_recipient").empty().html('<img src="/vivo/${themeDir}utility/ajax-loader.gif" />');
|
||||||
|
|
||||||
|
$.ajax({
|
||||||
|
url: visualizationURL,
|
||||||
|
dataType: "html",
|
||||||
|
success:function(data){
|
||||||
|
$("#ajax_recipient").html(data);
|
||||||
|
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
$("#ajax_activator").click(function() {
|
||||||
|
$.ajax({
|
||||||
|
url: '${staticHref3_d}',
|
||||||
|
dataType: "html",
|
||||||
|
success:function(data){
|
||||||
|
|
||||||
|
|
||||||
|
$("#ajax_recipient").text(data);
|
||||||
|
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
$("#ajax_activator_1").click(function() {
|
||||||
|
|
||||||
|
renderVisualization('${staticHref_d}');
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
$("#ajax_activator_2").click(function() {
|
||||||
|
|
||||||
|
renderVisualization('${staticHref2_d}');
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
$("#ajax_activator_3").click(function() {
|
||||||
|
|
||||||
|
renderVisualization('${staticHref3_d}');
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//-->
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<div class="staticPageBackground">
|
||||||
|
|
||||||
|
<a href='<c:out value="${collegeCSV}"/>'>vis data query for college -> "School of Industrial and Labor Relations (ILR)"</a><br />
|
||||||
|
<a href='<c:out value="${collegeCSV2}"/>'>vis data query for college -> "College of Agriculture and Life Sciences (CALS)"</a><br />
|
||||||
|
<a href='<c:out value="${collegeCSV3}"/>'>vis data query for college -> "College of Arts and Sciences"</a><br />
|
||||||
|
<a href='<c:out value="${collegeCSV4}"/>'>vis data query for college -> "College of Engineering"</a><br />
|
||||||
|
<a href='<c:out value="${collegeCSV5}"/>'>vis data query for college -> "Joan and Sanford I. Weill Medical College"</a><br />
|
||||||
|
|
||||||
|
<a href='<c:out value="${staticHref}"/>'>vis query for person -> "Crane, Brian"</a>
|
||||||
|
|
||||||
|
|
||||||
|
<div id="ajax_activator_1" class="get_vis">
|
||||||
|
Click to render this Person's vis via AJAX.
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<br />
|
||||||
|
|
||||||
|
<a href='<c:out value="${staticHref2}"/>'>vis query for person -> "Merwin, Ian A"</a>
|
||||||
|
|
||||||
|
<div id="ajax_activator_2" class="get_vis">
|
||||||
|
Click to render this Person's vis via AJAX.
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<br />
|
||||||
|
|
||||||
|
|
||||||
|
<a href='<c:out value="${staticHref3}"/>'>vis query for person -> "Erb, Hollis Nancy"</a>
|
||||||
|
|
||||||
|
<div id="ajax_activator_3" class="get_vis">
|
||||||
|
Click to render this Person's vis via AJAX.
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<br />
|
||||||
|
|
||||||
|
<br />
|
||||||
|
<div id="ajax_activator" class="get_vis">
|
||||||
|
AJAX Content in Text (only for research)
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<br />
|
||||||
|
<br />
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<div id="ajax_recipient">
|
||||||
|
vis Content via AJAX here
|
||||||
|
|
||||||
|
<!--
|
||||||
|
|
||||||
|
<div id="pub_count_areachart_vis">AREA CHART</div>
|
||||||
|
|
||||||
|
<div id="pub_count_sparkline_vis">pub sparkline chart</div>
|
||||||
|
|
||||||
|
|
||||||
|
-->
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
14
webapp/web/templates/visualization/publication_count.jsp
Normal file
14
webapp/web/templates/visualization/publication_count.jsp
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
<%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %>
|
||||||
|
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<div class="staticPageBackground">
|
||||||
|
|
||||||
|
|
||||||
|
<div id="vis_container">
|
||||||
|
${requestScope.visContentCode}
|
||||||
|
</div>
|
||||||
|
${requestScope.visContextCode}
|
||||||
|
|
||||||
|
</div>
|
|
@ -0,0 +1,9 @@
|
||||||
|
<%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %>
|
||||||
|
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
|
||||||
|
|
||||||
|
<div class="staticPageBackground">
|
||||||
|
|
||||||
|
${requestScope.error}
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
24
webapp/web/templates/visualization/visualization_scripts.jsp
Normal file
24
webapp/web/templates/visualization/visualization_scripts.jsp
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
<%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %>
|
||||||
|
|
||||||
|
<% /***********************************************
|
||||||
|
This file is used to inject <link> and <script> elements
|
||||||
|
into the head element of the generated source of a VITRO
|
||||||
|
page that is being displayed by the entity controller.
|
||||||
|
|
||||||
|
In other words, anything like domain.com/entity?...
|
||||||
|
will have the lines specified here added in the <head>
|
||||||
|
of the page.
|
||||||
|
|
||||||
|
This is a great way to specify JavaScript or CSS files
|
||||||
|
at the entity display level as opposed to globally.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
<link rel="stylesheet" type="text/css" href="/css/entity.css"/>" media="screen"/>
|
||||||
|
<script type="text/javascript" src="/js/jquery.js"></script>
|
||||||
|
****************************************************/ %>
|
||||||
|
|
||||||
|
<c:url var="jquery" value="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"/>
|
||||||
|
<c:url var="googleVisualizationAPI" value="http://www.google.com/jsapi?autoload=%7B%22modules%22%3A%5B%7B%22name%22%3A%22visualization%22%2C%22version%22%3A%221%22%2C%22packages%22%3A%5B%22areachart%22%2C%22imagesparkline%22%5D%7D%5D%7D"/>
|
||||||
|
|
||||||
|
<script type="text/javascript" src="${jquery}"></script>
|
||||||
|
<script type="text/javascript" src="${googleVisualizationAPI}"></script>
|
Loading…
Add table
Reference in a new issue