diff --git a/webapp/config/web.xml b/webapp/config/web.xml index fc1c291b4..35b781cc3 100644 --- a/webapp/config/web.xml +++ b/webapp/config/web.xml @@ -886,13 +886,19 @@ /individuallist - - EntityURLController + + IndividualListRdf edu.cornell.mannlib.vitro.webapp.controller.EntityURLController + + - EntityURLController - /entityurl/* + IndividualListRdf + /listrdf/* diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/EntityURLController.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/EntityURLController.java index 1f874b601..f925042b4 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/EntityURLController.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/EntityURLController.java @@ -44,18 +44,18 @@ public void doGet (HttpServletRequest req, HttpServletResponse res) throws IOExc String url = req.getRequestURI().substring(req.getContextPath().length()); ContentType contentType = checkForRequestType(req.getHeader("accept")); - if(Pattern.compile("^/entityurl/$").matcher(url).matches()){ + if(Pattern.compile("^/listrdf/$").matcher(url).matches()){ String redirectURL = null; if(contentType!=null){ if ( RDFXML_MIMETYPE.equals(contentType.getMediaType())) - redirectURL = "/entityurl/entityurl.rdf"; + redirectURL = "/listrdf/listrdf.rdf"; else if( N3_MIMETYPE.equals(contentType.getMediaType())) - redirectURL = "/entityurl/entityurl.n3"; + redirectURL = "/listrdf/listrdf.n3"; else if ( TTL_MIMETYPE.equals(contentType.getMediaType())) - redirectURL = "/entityurl/entityurl.ttl"; + redirectURL = "/listrdf/listrdf.ttl"; } else{ - redirectURL = "/entityurl/entityrurl.rdf"; + redirectURL = "/listrdf/listrdf.rdf"; } String hn = req.getHeader("Host"); diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/IndividualListRdfController.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/IndividualListRdfController.java new file mode 100644 index 000000000..1c195f18a --- /dev/null +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/IndividualListRdfController.java @@ -0,0 +1,159 @@ +/* $This file is distributed under the terms of the license in /doc/license.txt$ */ +package edu.cornell.mannlib.vitro.webapp.controller; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +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 org.apache.lucene.document.Document; +import org.apache.lucene.search.ScoreDoc; +import org.apache.solr.client.solrj.SolrQuery; +import org.apache.solr.client.solrj.SolrServer; +import org.apache.solr.client.solrj.response.QueryResponse; +import org.apache.solr.common.SolrDocument; +import org.apache.solr.common.SolrDocumentList; + +import com.hp.hpl.jena.rdf.model.Model; +import com.hp.hpl.jena.rdf.model.ModelFactory; +import com.hp.hpl.jena.rdf.model.RDFNode; +import com.hp.hpl.jena.rdf.model.Resource; +import com.hp.hpl.jena.rdf.model.ResourceFactory; +import com.hp.hpl.jena.vocabulary.RDF; + +import edu.cornell.mannlib.vitro.webapp.search.lucene.Entity2LuceneDoc.VitroLuceneTermNames; +import edu.cornell.mannlib.vitro.webapp.search.solr.SolrSetup; +import edu.cornell.mannlib.vitro.webapp.web.ContentType; + +public class IndividualListRdfController extends VitroHttpServlet { + + private static final long serialVersionUID = 1L; + private static final Log log = LogFactory.getLog(IndividualListRdfController.class.getName()); + + private static final String PATH = "listrdf"; + private static final String FILENAME = PATH; + public static final String URL = "/" + PATH + "/"; + + public static final int ENTITY_LIST_CONTROLLER_MAX_RESULTS = 30000; + + public void doGet (HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException { + + String url = req.getRequestURI().substring(req.getContextPath().length()); + ContentType contentType = checkForRequestType(req.getHeader("accept")); + + if (url.equals(URL)) { + String redirectURL = URL + FILENAME; + if (contentType!=null) { + if (RDFXML_MIMETYPE.equals(contentType.getMediaType())) + redirectURL += ".rdf"; + else if (N3_MIMETYPE.equals(contentType.getMediaType())) + redirectURL += ".n3"; + else if (TTL_MIMETYPE.equals(contentType.getMediaType())) + redirectURL += ".ttl"; + } else { + redirectURL += ".rdf"; + } + + String hn = req.getHeader("Host"); + if (req.isSecure()) { + res.setHeader("Location", res.encodeURL("https://" + hn + + req.getContextPath() + redirectURL)); + log.info("doRedirect by using HTTPS"); + } else { + res.setHeader("Location", res.encodeURL("http://" + hn + + req.getContextPath() + redirectURL)); + log.info("doRedirect by using HTTP"); + } + res.setStatus(HttpServletResponse.SC_SEE_OTHER); + return; + } + + // Make the query + String classUri = (String) getServletContext().getAttribute("classuri"); + String queryStr = VitroLuceneTermNames.RDFTYPE + ":\"" + classUri + "\""; + SolrQuery query = new SolrQuery(queryStr); + query.setStart(0) + .setRows(ENTITY_LIST_CONTROLLER_MAX_RESULTS) + .setFields(VitroLuceneTermNames.URI) + .setSortField(VitroLuceneTermNames.NAME_LOWERCASE_SINGLE_VALUED, SolrQuery.ORDER.asc); + + // Execute the query + SolrServer solr = SolrSetup.getSolrServer(getServletContext()); + QueryResponse response = null; + + try { + response = solr.query(query); + } catch (Throwable t) { + log.error(t, t); + } + + if ( response == null ) { + throw new ServletException("Could not run search in IndividualListRdfController"); + } + + SolrDocumentList docs = response.getResults(); + + if (docs == null) { + throw new ServletException("Could not run search in IndividualListRdfController"); + } + + Model model = ModelFactory.createDefaultModel(); + for (SolrDocument doc : docs) { + String uri = doc.get(VitroLuceneTermNames.URI).toString(); + Resource resource = ResourceFactory.createResource(uri); + RDFNode node = (RDFNode) ResourceFactory.createResource(classUri); + model.add(resource, RDF.type, node); + } + + String format = ""; + if(contentType != null){ + if ( RDFXML_MIMETYPE.equals(contentType.getMediaType())) + format = "RDF/XML"; + else if( N3_MIMETYPE.equals(contentType.getMediaType())) + format = "N3"; + else if ( TTL_MIMETYPE.equals(contentType.getMediaType())) + format ="TTL"; + res.setContentType(contentType.getMediaType()); + } + else{ + res.setContentType(RDFXML_MIMETYPE); + format = "RDF/XML"; + } + model.write(res.getOutputStream(), format); + } + + public void doPost (HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException{ + doGet(req,res); + } + + protected ContentType checkForRequestType(String acceptHeader) { + try { + //check the accept header + if (acceptHeader != null) { + List actualContentTypes = new ArrayList(); + actualContentTypes.add(new ContentType( XHTML_MIMETYPE )); + actualContentTypes.add(new ContentType( HTML_MIMETYPE )); + + actualContentTypes.add(new ContentType( RDFXML_MIMETYPE )); + actualContentTypes.add(new ContentType( N3_MIMETYPE )); + actualContentTypes.add(new ContentType( TTL_MIMETYPE )); + + + ContentType best = ContentType.getBestContentType(acceptHeader,actualContentTypes); + if (best!=null && ( + RDFXML_MIMETYPE.equals(best.getMediaType()) || + N3_MIMETYPE.equals(best.getMediaType()) || + TTL_MIMETYPE.equals(best.getMediaType()) )) + return best; + } + } + catch (Throwable th) { + log.error("problem while checking accept header " , th); + } + return null; + } +} diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/SolrEntityUrlController.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/SolrEntityUrlController.java deleted file mode 100644 index 2cfea4d85..000000000 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/SolrEntityUrlController.java +++ /dev/null @@ -1,162 +0,0 @@ -/* $This file is distributed under the terms of the license in /doc/license.txt$ */ -package edu.cornell.mannlib.vitro.webapp.controller; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; -import java.util.regex.Pattern; - -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 org.apache.lucene.document.Document; -import org.apache.lucene.index.Term; -import org.apache.lucene.search.BooleanClause; -import org.apache.lucene.search.BooleanQuery; -import org.apache.lucene.search.IndexSearcher; -import org.apache.lucene.search.ScoreDoc; -import org.apache.lucene.search.Sort; -import org.apache.lucene.search.TermQuery; -import org.apache.lucene.search.TopDocs; - -import com.hp.hpl.jena.rdf.model.Model; -import com.hp.hpl.jena.rdf.model.ModelFactory; -import com.hp.hpl.jena.rdf.model.RDFNode; -import com.hp.hpl.jena.rdf.model.Resource; -import com.hp.hpl.jena.rdf.model.ResourceFactory; -import com.hp.hpl.jena.vocabulary.RDF; - -import edu.cornell.mannlib.vitro.webapp.search.lucene.Entity2LuceneDoc; -import edu.cornell.mannlib.vitro.webapp.search.lucene.Entity2LuceneDoc.VitroLuceneTermNames; -import edu.cornell.mannlib.vitro.webapp.search.lucene.LuceneIndexFactory; -import edu.cornell.mannlib.vitro.webapp.web.ContentType; - - - -public class SolrEntityUrlController extends VitroHttpServlet { - - private static final long serialVersionUID = 1L; - private static final Log log = LogFactory.getLog(SolrEntityUrlController.class.getName()); - public static final int ENTITY_LIST_CONTROLLER_MAX_RESULTS = 30000; - -public void doGet (HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException{ - - String url = req.getRequestURI().substring(req.getContextPath().length()); - ContentType contentType = checkForRequestType(req.getHeader("accept")); - - if(Pattern.compile("^/entityurl/$").matcher(url).matches()){ - String redirectURL = null; - if(contentType!=null){ - if ( RDFXML_MIMETYPE.equals(contentType.getMediaType())) - redirectURL = "/entityurl/entityurl.rdf"; - else if( N3_MIMETYPE.equals(contentType.getMediaType())) - redirectURL = "/entityurl/entityurl.n3"; - else if ( TTL_MIMETYPE.equals(contentType.getMediaType())) - redirectURL = "/entityurl/entityurl.ttl"; - } - else{ - redirectURL = "/entityurl/entityrurl.rdf"; - } - - String hn = req.getHeader("Host"); - if (req.isSecure()) { - res.setHeader("Location", res.encodeURL("https://" + hn - + req.getContextPath() + redirectURL)); - log.info("doRedirect by using HTTPS"); - } else { - res.setHeader("Location", res.encodeURL("http://" + hn - + req.getContextPath() + redirectURL)); - log.info("doRedirect by using HTTP"); - } - res.setStatus(res.SC_SEE_OTHER); - return; - } - - String classUri = (String) getServletContext().getAttribute("classuri"); - BooleanQuery query = new BooleanQuery(); - query.add( - new TermQuery( new Term(VitroLuceneTermNames.RDFTYPE, classUri)), - BooleanClause.Occur.MUST ); - - IndexSearcher index = LuceneIndexFactory.getIndexSearcher(getServletContext()); - TopDocs docs = index.search(query, null, - ENTITY_LIST_CONTROLLER_MAX_RESULTS, - new Sort(VitroLuceneTermNames.NAME_LOWERCASE)); - - if( docs == null ){ - log.error("Search of lucene index returned null"); - throw new ServletException("Search of lucene index returned null"); - } - - int ii = 0; - int size = docs.totalHits; - Resource resource = null; - RDFNode node = null; - Model model = ModelFactory.createDefaultModel(); - while( ii < size ){ - ScoreDoc hit = docs.scoreDocs[ii]; - if (hit != null) { - Document doc = index.doc(hit.doc); - if (doc != null) { - String uri = doc.getField(VitroLuceneTermNames.URI).stringValue(); - resource = ResourceFactory.createResource(uri); - node = (RDFNode) ResourceFactory.createResource(classUri); - model.add(resource, RDF.type, node); - } else { - log.warn("no document found for lucene doc id " + hit.doc); - } - } else { - log.debug("hit was null"); - } - ii++; - } - - String format = ""; - if(contentType != null){ - if ( RDFXML_MIMETYPE.equals(contentType.getMediaType())) - format = "RDF/XML"; - else if( N3_MIMETYPE.equals(contentType.getMediaType())) - format = "N3"; - else if ( TTL_MIMETYPE.equals(contentType.getMediaType())) - format ="TTL"; - res.setContentType(contentType.getMediaType()); - } - else{ - res.setContentType(RDFXML_MIMETYPE); - format = "RDF/XML"; - } - model.write(res.getOutputStream(), format); -} -public void doPost (HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException{ - doGet(req,res); -} - -protected ContentType checkForRequestType(String acceptHeader) { - try { - //check the accept header - if (acceptHeader != null) { - List actualContentTypes = new ArrayList(); - actualContentTypes.add(new ContentType( XHTML_MIMETYPE )); - actualContentTypes.add(new ContentType( HTML_MIMETYPE )); - - actualContentTypes.add(new ContentType( RDFXML_MIMETYPE )); - actualContentTypes.add(new ContentType( N3_MIMETYPE )); - actualContentTypes.add(new ContentType( TTL_MIMETYPE )); - - - ContentType best = ContentType.getBestContentType(acceptHeader,actualContentTypes); - if (best!=null && ( - RDFXML_MIMETYPE.equals(best.getMediaType()) || - N3_MIMETYPE.equals(best.getMediaType()) || - TTL_MIMETYPE.equals(best.getMediaType()) )) - return best; - } - } - catch (Throwable th) { - log.error("problem while checking accept header " , th); - } - return null; -} -} diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/IndividualListController.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/IndividualListController.java index 531bb833e..b2a3a8b0a 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/IndividualListController.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/IndividualListController.java @@ -125,7 +125,7 @@ public class IndividualListController extends FreemarkerHttpServlet { body.put("subtitle", vclass.getName()); } body.put("title", title); - body.put("redirecturl", vreq.getContextPath()+"/entityurl/"); + body.put("rdfUrl", vreq.getContextPath()+"/listrdf/"); getServletContext().setAttribute("classuri", vclass.getURI()); } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/SolrIndividualListController.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/SolrIndividualListController.java index 924a6722f..cf39fd05c 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/SolrIndividualListController.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/SolrIndividualListController.java @@ -25,6 +25,7 @@ import org.apache.solr.common.SolrDocumentList; import edu.cornell.mannlib.vitro.webapp.beans.Individual; import edu.cornell.mannlib.vitro.webapp.beans.VClass; import edu.cornell.mannlib.vitro.webapp.beans.VClassGroup; +import edu.cornell.mannlib.vitro.webapp.controller.IndividualListRdfController; import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest; import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.ExceptionResponseValues; import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.ResponseValues; @@ -56,7 +57,6 @@ public class SolrIndividualListController extends FreemarkerHttpServlet { String templateName = TEMPLATE_DEFAULT; Map body = new HashMap(); String errorMessage = null; - String message = null; try { Object obj = vreq.getAttribute("vclass"); @@ -72,7 +72,7 @@ public class SolrIndividualListController extends FreemarkerHttpServlet { errorMessage = "Class " + vitroClassIdStr + " not found"; } } catch (Exception ex) { - throw new HelpException("IndividualListController: request parameter 'vclassId' must be a URI string."); + throw new HelpException("IndividualListController: url parameter 'vclassId' must be a URI string."); } } } else if (obj instanceof VClass) { @@ -95,14 +95,16 @@ public class SolrIndividualListController extends FreemarkerHttpServlet { getServletContext()); body.putAll(map); + @SuppressWarnings("unchecked") List inds = (List)map.get("entities"); List indsTm = new ArrayList(); - for(Individual ind : inds ){ + for ( Individual ind : inds ) { indsTm.add(new ListedIndividualTemplateModel(ind,vreq)); } body.put("individuals", indsTm); List wpages = new ArrayList(); + @SuppressWarnings("unchecked") List pages = (List)body.get("pages"); BeansWrapper wrapper = new BeansWrapper(); for( PageRecord pr: pages ){ @@ -119,10 +121,10 @@ public class SolrIndividualListController extends FreemarkerHttpServlet { body.put("subtitle", vclass.getName()); } body.put("title", title); - body.put("redirecturl", vreq.getContextPath()+"/entityurl/"); + body.put("rdfUrl", vreq.getContextPath() + IndividualListRdfController.URL); getServletContext().setAttribute("classuri", vclass.getURI()); } - + } catch (HelpException help){ errorMessage = "Request attribute 'vclass' or request parameter 'vclassId' must be set before calling. Its value must be a class uri."; } catch (Throwable e) { @@ -132,10 +134,8 @@ public class SolrIndividualListController extends FreemarkerHttpServlet { if (errorMessage != null) { templateName = Template.ERROR_MESSAGE.toString(); body.put("errorMessage", errorMessage); - } else if (message != null) { - body.put("message", message); } - + return new TemplateResponseValues(templateName, body); } @@ -244,7 +244,7 @@ public class SolrIndividualListController extends FreemarkerHttpServlet { int start = (page-1)*INDIVIDUALS_PER_PAGE; query.setStart(start) .setRows(INDIVIDUALS_PER_PAGE) - .setSortField("nameLowercaseSingleValued", SolrQuery.ORDER.asc); + .setSortField(VitroLuceneTermNames.NAME_LOWERCASE_SINGLE_VALUED, SolrQuery.ORDER.asc); log.debug("Query: " + query); return query; diff --git a/webapp/web/templates/freemarker/body/individualList.ftl b/webapp/web/templates/freemarker/body/individualList.ftl index dd544ba0a..d44f1283d 100644 --- a/webapp/web/templates/freemarker/body/individualList.ftl +++ b/webapp/web/templates/freemarker/body/individualList.ftl @@ -7,7 +7,7 @@ ${stylesheets.add('')}
-

${title} RDF

+

${title} RDF

<#if subtitle??>

${subtitle}