From fd0df8b28130a11faacb0a3c1fc9f628405f430b Mon Sep 17 00:00:00 2001 From: rjy7 Date: Tue, 29 Jun 2010 16:15:49 +0000 Subject: [PATCH] NIHVIVO-646 Autocomplete, remove author functionality --- webapp/config/default.log4j.properties | 3 + webapp/config/web.xml | 11 +- .../controller/edit/PrimitiveRdfDelete.java | 51 +++ .../controller/edit/PrimitiveRdfEdit.java | 327 +++++++++--------- .../controller/AutocompleteController.java | 12 +- .../controller/edit/PrimitiveRdfEditTest.java | 17 +- .../freemarker/body/primitiveRdfEdit.ftl | 9 +- 7 files changed, 259 insertions(+), 171 deletions(-) create mode 100644 webapp/src/edu/cornell/mannlib/vitro/webapp/controller/edit/PrimitiveRdfDelete.java diff --git a/webapp/config/default.log4j.properties b/webapp/config/default.log4j.properties index d0f36b7cf..ee1eb7d60 100644 --- a/webapp/config/default.log4j.properties +++ b/webapp/config/default.log4j.properties @@ -36,3 +36,6 @@ log4j.rootLogger=INFO, AllAppender log4j.logger.org.apache.catalina=INFO log4j.logger.edu.cornell.mannlib.vitro.webapp.ConfigurationProperties=INFO log4j.logger.edu.cornell.mannlib.vitro.webapp.filestorage.updater.FileStorageUpdater=INFO + +log4j.logger.edu.cornell.mannlib.vitro.webapp.search.controller=DEBUG + diff --git a/webapp/config/web.xml b/webapp/config/web.xml index bc0f7d4d1..abfc24005 100644 --- a/webapp/config/web.xml +++ b/webapp/config/web.xml @@ -1143,7 +1143,16 @@ primitiveRdfEdit /edit/primitiveRdfEdit - + + + primitiveRdfDelete + edu.cornell.mannlib.vitro.webapp.controller.edit.PrimitiveRdfDelete + + + primitiveRdfDelete + /edit/primitiveRdfDelete + + fetch diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/edit/PrimitiveRdfDelete.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/edit/PrimitiveRdfDelete.java new file mode 100644 index 000000000..fa06d65a1 --- /dev/null +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/edit/PrimitiveRdfDelete.java @@ -0,0 +1,51 @@ +package edu.cornell.mannlib.vitro.webapp.controller.edit; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.servlet.http.HttpServletResponse; + +import org.apache.commons.httpclient.HttpStatus; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest; +import edu.cornell.mannlib.vitro.webapp.dao.IndividualDao; +import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory; +import edu.cornell.mannlib.vitro.webapp.utils.StringUtils; +import freemarker.template.Configuration; + +public class PrimitiveRdfDelete extends PrimitiveRdfEdit { + + private static final long serialVersionUID = 1L; + private static final Log log = LogFactory.getLog(PrimitiveRdfDelete.class); + + protected void processRequest(VitroRequest vreq, HttpServletResponse response) { + + String uriToDelete = vreq.getParameter("deletion"); + if (StringUtils.isEmpty(uriToDelete)) { + doError(response, "No individual specified for deletion", 500); + return; + } + + // Check permissions + // The permission-checking code should be inherited from superclass + boolean hasPermission = true; + + if( !hasPermission ){ + //if not okay, send error message + doError(response,"Insufficent permissions.",HttpStatus.SC_UNAUTHORIZED); + return; + } + + WebappDaoFactory wdf = vreq.getWebappDaoFactory(); + IndividualDao idao = wdf.getIndividualDao(); + int result = idao.deleteIndividual(uriToDelete); + if (result == 1) { + doError(response, "Error deleting individual", 500); + } + } + +} diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/edit/PrimitiveRdfEdit.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/edit/PrimitiveRdfEdit.java index 44563bcdd..a8adf577c 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/edit/PrimitiveRdfEdit.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/edit/PrimitiveRdfEdit.java @@ -4,11 +4,14 @@ package edu.cornell.mannlib.vitro.webapp.controller.edit; import java.io.IOException; import java.io.StringReader; +import java.util.Arrays; import java.util.HashMap; import java.util.HashSet; +import java.util.List; import java.util.Map; import java.util.Set; +import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -25,6 +28,8 @@ import com.hp.hpl.jena.shared.Lock; import edu.cornell.mannlib.vedit.beans.LoginFormBean; import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest; import edu.cornell.mannlib.vitro.webapp.controller.freemarker.FreeMarkerHttpServlet; +import edu.cornell.mannlib.vitro.webapp.dao.IndividualDao; +import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory; import edu.cornell.mannlib.vitro.webapp.dao.jena.DependentResourceDeleteJena; import edu.cornell.mannlib.vitro.webapp.dao.jena.event.EditEvent; import edu.cornell.mannlib.vitro.webapp.edit.n3editing.EditN3Utils; @@ -32,34 +37,34 @@ import freemarker.template.Configuration; public class PrimitiveRdfEdit extends FreeMarkerHttpServlet{ - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 1L; - @Override - protected String getBody(VitroRequest vreq, Map body, Configuration config) { -// boolean loggedIn = checkLoginStatus(request, response); -// if( !loggedIn){ -// doError(response,"You must be logged in to use this servlet.",HttpStatus.SC_UNAUTHORIZED); -// return; -// } - return mergeBodyToTemplate("primitiveRdfEdit.ftl",new HashMap(), config); - } + @Override + protected String getBody(VitroRequest vreq, Map body, Configuration config) { +// boolean loggedIn = checkLoginStatus(request, response); +// if( !loggedIn){ +// doError(response,"You must be logged in to use this servlet.",HttpStatus.SC_UNAUTHORIZED); +// return; +// } + return mergeBodyToTemplate("primitiveRdfEdit.ftl",new HashMap(), config); + } - @Override - protected String getTitle(String siteName) { - return "RDF edit"; - } + @Override + protected String getTitle(String siteName) { + return "RDF edit"; + } - @Override - public void doPost(HttpServletRequest request, - HttpServletResponse response) throws ServletException, IOException { - + @Override + public void doPost(HttpServletRequest request, + HttpServletResponse response) throws ServletException, IOException { + VitroRequest vreq = new VitroRequest(request); - boolean loggedIn = checkLoginStatus(request, response); - if( !loggedIn){ - doError(response,"You must be logged in to use this servlet.",HttpStatus.SC_UNAUTHORIZED); - return; - } - + boolean loggedIn = checkLoginStatus(request, response); + if( !loggedIn){ + doError(response,"You must be logged in to use this servlet.",HttpStatus.SC_UNAUTHORIZED); + return; + } + // PolicyIface policy = RequestPolicyList.getPolicies( request ); // // if( policy == null || ( policy instanceof PolicyList && ((PolicyList)policy).size() == 0 )){ @@ -80,149 +85,159 @@ public class PrimitiveRdfEdit extends FreeMarkerHttpServlet{ // return; // } + processRequest(vreq, response); + + } + + protected void processRequest(VitroRequest vreq, HttpServletResponse response) { /* Predefined values for RdfFormat are "RDF/XML", * "N-TRIPLE", "TURTLE" (or "TTL") and "N3". null represents * the default language, "RDF/XML". "RDF/XML-ABBREV" is a synonym for "RDF/XML" */ - String format = request.getParameter("RdfFormat"); - if( format == null ) - format = "N3"; - if ( ! ("N-TRIPLE".equals(format) || "TURTLE".equals(format) || "TTL".equals(format) - || "N3".equals(format)|| "RDF/XML-ABBREV".equals(format) || "RDF/XML".equals(format) )){ - doError(response,"RdfFormat was not recoganized.",500); - return; - } - - //parse RDF - Set additions= null; - try { - additions = parseRdfParam(request.getParameterValues("additions"),format); - } catch (Exception e) { - doError(response,"Error reading RDF, set log level to debug for this class to get error messages in the server logs.",HttpStatus.SC_BAD_REQUEST); - return; - } - - Set retractions = null; - try { - retractions = parseRdfParam(request.getParameterValues("retractions"),format); - } catch (Exception e) { - doError(response,"Error reading RDF, set log level to debug for this class to get error messages in the server logs.",HttpStatus.SC_BAD_REQUEST); - return; - } - - //check permissions - //TODO: (bdc34)This is not yet implemented, must check the IDs against the policies for permissons before doing an edit! - boolean hasPermission = true; - - if( !hasPermission ){ - //if not okay, send error message - doError(response,"Insufficent permissions.",HttpStatus.SC_UNAUTHORIZED); - } - - if( hasPermission ){ - String editorUri = EditN3Utils.getEditorUri(vreq,request.getSession(false),getServletContext()); - try { - processChanges( additions, retractions, getWriteModel(request),getQueryModel(request), editorUri); - } catch (Exception e) { - doError(response,e.getMessage(),HttpStatus.SC_INTERNAL_SERVER_ERROR); - } - } - } - - protected void processChanges(Set additions, Set retractions, OntModel writeModel, OntModel queryModel, String editorURI ) throws Exception{ - Model a = com.hp.hpl.jena.rdf.model.ModelFactory.createDefaultModel(); - for(Model m : additions) - a.add(m); - - Model r = com.hp.hpl.jena.rdf.model.ModelFactory.createDefaultModel(); - for(Model m : retractions) - r.add(m); - - procesChanges(a,r,writeModel,queryModel,editorURI); - } - - protected void procesChanges(Model additions, Model retractions, OntModel writeModel, OntModel queryModel, String editorURI ) throws Exception{ - /* - * Do a diff on the additions and retractions and then only add the delta to the jenaOntModel. - */ - Model assertionsAdded = additions.difference( retractions ); - Model assertionsRetracted = retractions.difference( additions ); + String format = vreq.getParameter("RdfFormat"); + if( format == null ) + format = "N3"; + if ( ! ("N-TRIPLE".equals(format) || "TURTLE".equals(format) || "TTL".equals(format) + || "N3".equals(format)|| "RDF/XML-ABBREV".equals(format) || "RDF/XML".equals(format) )){ + doError(response,"RdfFormat was not recognized.",500); + return; + } + + //parse RDF + Set additions= null; + try { + additions = parseRdfParam(vreq.getParameterValues("additions"),format); + } catch (Exception e) { + doError(response,"Error reading RDF, set log level to debug for this class to get error messages in the server logs.",HttpStatus.SC_BAD_REQUEST); + return; + } + + Set retractions = null; + try { + retractions = parseRdfParam(vreq.getParameterValues("retractions"),format); + } catch (Exception e) { + doError(response,"Error reading RDF, set log level to debug for this class to get error messages in the server logs.",HttpStatus.SC_BAD_REQUEST); + return; + } + + + //check permissions + //TODO: (bdc34)This is not yet implemented, must check the IDs against the policies for permissons before doing an edit! + // rjy7 put policy check in separate method so subclasses can inherit + boolean hasPermission = true; + + if( !hasPermission ){ + //if not okay, send error message + doError(response,"Insufficent permissions.",HttpStatus.SC_UNAUTHORIZED); + return; + } + + ServletContext sc = getServletContext(); + String editorUri = EditN3Utils.getEditorUri(vreq, vreq.getSession(false), sc); + try { + processChanges( additions, retractions, getWriteModel(vreq),getQueryModel(vreq), editorUri); + } catch (Exception e) { + doError(response,e.getMessage(),HttpStatus.SC_INTERNAL_SERVER_ERROR); + } - Model depResRetractions = - DependentResourceDeleteJena - .getDependentResourceDeleteForChange(assertionsAdded, assertionsRetracted, queryModel); - assertionsRetracted.add( depResRetractions ); - - Lock lock = null; - try{ - lock = writeModel.getLock(); - lock.enterCriticalSection(Lock.WRITE); - writeModel.getBaseModel().notifyEvent(new EditEvent(editorURI,true)); - writeModel.add( assertionsAdded ); - writeModel.remove( assertionsRetracted ); - }catch(Throwable t){ - throw new Exception("Error while modifying model \n" + t.getMessage()); - }finally{ - writeModel.getBaseModel().notifyEvent(new EditEvent(editorURI,false)); - lock.leaveCriticalSection(); } -} - - /** - * Convert the values from a parameters into RDF models. - * @param parameters - the result of request.getParameters(String) - * @param format - a valid format string for Jena's Model.read() - * @return - * @throws Exception - */ - protected Set parseRdfParam(String[] parameters, String format) throws Exception{ - Set models = new HashSet(); - for( String param : parameters){ - try{ - StringReader reader = new StringReader(param); - Model model = com.hp.hpl.jena.rdf.model.ModelFactory.createDefaultModel(); - model.read(reader, null, format); - models.add(model); - }catch(Error ex){ - log.error("Error reading RDF as " + format + " in " + param); - throw new Exception("Error reading RDF, set log level to debug for this class to get error messages in the sever logs."); - } - } - return models; - } - - private void doError(HttpServletResponse response, String errorMsg,int httpstatus){ - response.setStatus(httpstatus); - try { - response.getWriter().write(errorMsg); - } catch (IOException e) { - log.debug("IO exception during output",e ); - } - } - - protected OntModel getWriteModel(HttpServletRequest request){ - HttpSession session = request.getSession(false); - if( session == null || session.getAttribute("jenaOntModel") == null ) - return (OntModel)getServletContext().getAttribute("jenaOntModel"); - else - return (OntModel)session.getAttribute("jenaOntModel"); - } - - protected OntModel getQueryModel(HttpServletRequest request){ - return getWriteModel(request); - } - - Log log = LogFactory.getLog(PrimitiveRdfEdit.class.getName()); + protected void processChanges(Set additions, Set retractions, OntModel writeModel, OntModel queryModel, String editorURI ) throws Exception{ + Model a = com.hp.hpl.jena.rdf.model.ModelFactory.createDefaultModel(); + for(Model m : additions) + a.add(m); + + Model r = com.hp.hpl.jena.rdf.model.ModelFactory.createDefaultModel(); + for(Model m : retractions) + r.add(m); + + processChanges(a,r,writeModel,queryModel,editorURI); + + } + + protected void processChanges(Model additions, Model retractions, OntModel writeModel, OntModel queryModel, String editorURI ) throws Exception{ + /* + * Do a diff on the additions and retractions and then only add the delta to the jenaOntModel. + */ + Model assertionsAdded = additions.difference( retractions ); + Model assertionsRetracted = retractions.difference( additions ); + + Model depResRetractions = + DependentResourceDeleteJena + .getDependentResourceDeleteForChange(assertionsAdded, assertionsRetracted, queryModel); + assertionsRetracted.add( depResRetractions ); + + Lock lock = null; + try{ + lock = writeModel.getLock(); + lock.enterCriticalSection(Lock.WRITE); + writeModel.getBaseModel().notifyEvent(new EditEvent(editorURI,true)); + writeModel.add( assertionsAdded ); + writeModel.remove( assertionsRetracted ); + }catch(Throwable t){ + throw new Exception("Error while modifying model \n" + t.getMessage()); + }finally{ + writeModel.getBaseModel().notifyEvent(new EditEvent(editorURI,false)); + lock.leaveCriticalSection(); + } + } + - static public boolean checkLoginStatus(HttpServletRequest request, HttpServletResponse response){ + /** + * Convert the values from a parameters into RDF models. + * @param parameters - the result of request.getParameters(String) + * @param format - a valid format string for Jena's Model.read() + * @return + * @throws Exception + */ + protected Set parseRdfParam(String[] parameters, String format) throws Exception{ + Set models = new HashSet(); + for( String param : parameters){ + try{ + StringReader reader = new StringReader(param); + Model model = com.hp.hpl.jena.rdf.model.ModelFactory.createDefaultModel(); + model.read(reader, null, format); + models.add(model); + }catch(Error ex){ + log.error("Error reading RDF as " + format + " in " + param); + throw new Exception("Error reading RDF, set log level to debug for this class to get error messages in the sever logs."); + } + } + return models; + } + + protected void doError(HttpServletResponse response, String errorMsg,int httpstatus){ + response.setStatus(httpstatus); + try { + response.getWriter().write(errorMsg); + } catch (IOException e) { + log.debug("IO exception during output",e ); + } + } + + protected OntModel getWriteModel(HttpServletRequest request){ + HttpSession session = request.getSession(false); + if( session == null || session.getAttribute("jenaOntModel") == null ) + return (OntModel)getServletContext().getAttribute("jenaOntModel"); + else + return (OntModel)session.getAttribute("jenaOntModel"); + } + + protected OntModel getQueryModel(HttpServletRequest request){ + return getWriteModel(request); + } + + Log log = LogFactory.getLog(PrimitiveRdfEdit.class.getName()); + + + static public boolean checkLoginStatus(HttpServletRequest request, HttpServletResponse response){ LoginFormBean loginBean = (LoginFormBean) request.getSession().getAttribute("loginHandler"); if (loginBean == null){ - return false; - } else { - return true; + return false; + } else { + return true; } - } + } } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/search/controller/AutocompleteController.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/search/controller/AutocompleteController.java index 67004aaf4..d944e6c97 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/search/controller/AutocompleteController.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/search/controller/AutocompleteController.java @@ -226,12 +226,16 @@ public class AutocompleteController extends FreeMarkerHttpServlet implements Sea // Run the search term through the query parser so that it gets normalized in the same // way the index is normalized. - QueryParser queryParser = new QueryParser(Entity2LuceneDoc.term.NAME, analyzer); - query = queryParser.parse(querystr + "*"); - +// QueryParser queryParser = new QueryParser(Entity2LuceneDoc.term.NAMEUNSTEMMED, analyzer); +// query = queryParser.parse(querystr + "*"); + + querystr = querystr.toLowerCase(); { BooleanQuery boolQuery = new BooleanQuery(); - boolQuery.add(query, BooleanClause.Occur.MUST); + boolQuery.add( + new WildcardQuery(new Term(Entity2LuceneDoc.term.NAME, querystr + '*')), + BooleanClause.Occur.MUST); + //boolQuery.add(query, BooleanClause.Occur.MUST); Object param = request.getParameter("type"); boolQuery.add( new TermQuery( new Term(Entity2LuceneDoc.term.RDFTYPE, diff --git a/webapp/test/edu/cornell/mannlib/vitro/webapp/controller/edit/PrimitiveRdfEditTest.java b/webapp/test/edu/cornell/mannlib/vitro/webapp/controller/edit/PrimitiveRdfEditTest.java index 987790506..c1215997e 100644 --- a/webapp/test/edu/cornell/mannlib/vitro/webapp/controller/edit/PrimitiveRdfEditTest.java +++ b/webapp/test/edu/cornell/mannlib/vitro/webapp/controller/edit/PrimitiveRdfEditTest.java @@ -11,10 +11,17 @@ import org.junit.Before; import org.junit.Test; import com.hp.hpl.jena.ontology.OntModel; +import com.hp.hpl.jena.ontology.OntModelSpec; import com.hp.hpl.jena.rdf.model.Model; import com.hp.hpl.jena.rdf.model.ModelFactory; +import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory; +import edu.cornell.mannlib.vitro.webapp.dao.jena.WebappDaoFactoryJena; + public class PrimitiveRdfEditTest { + + OntModel testModel; + WebappDaoFactory wdf; private String testN3a = " \"1000cm3\" ." + @@ -25,18 +32,12 @@ public class PrimitiveRdfEditTest { @Before - public void setUp() throws Exception { - } + public void setUp() throws Exception { } @Test public void testProcessChanges() throws Exception { OntModel writeModel = ModelFactory.createOntologyModel(); - - String testN3a = - " \"1000cm3\" ." + - " \"919cm3\" ." ; - String testN3b = - " ." ; + int totalStmts = 3; PrimitiveRdfEdit pre = new PrimitiveRdfEdit(); diff --git a/webapp/web/templates/freemarker/body/primitiveRdfEdit.ftl b/webapp/web/templates/freemarker/body/primitiveRdfEdit.ftl index 0bc4d9612..ed34c67a2 100644 --- a/webapp/web/templates/freemarker/body/primitiveRdfEdit.ftl +++ b/webapp/web/templates/freemarker/body/primitiveRdfEdit.ftl @@ -3,11 +3,16 @@
-additions: +Addition:
-retractions: +

+ +Retraction:
+ +

+
N3 TURTLE