[Building Sakai] Use Sakai Help Tool to access customized external help source?

Walters, Cynthia (cmw6s) cmw6s at eservices.virginia.edu
Wed Nov 30 09:48:59 PST 2011


Hello:

I've been reading past references about how to change the default behavior of the Help Tool to read external help files that have been customized.  I've not been successful in my attempts to get this to work with Sakai 2.7.1 so far, and wonder if someone with knowledge of the tool and/or a similar set-up could give me some guidance with questions I have?

We want the online help files to be editable by non-programming staff.  We would like the help source files located on a shared file system such that Sakai Help Tool knows how to access them, and the trusted members of our support team can edit/customize them without the need to rebuild and redeploy as in the default help tool configuration.

Thanks in advance for help with this - questions follow,
Cynthia Gast Walters @ UVa


What do we need to change, from the default configuration, to get this to work?
These are the steps I've taken so far, but it is not working yet:
    a)  Copy each tool's help files source and help.xml file to our external location. (testing with only announcements, assignments)
             - Do all the tool's HTML files need to be in one directory, or can per-tool sub-directories be used?

    b)  Create a 'help.xml' file (see contents below) patterned after https://confluence.sakaiproject.org/display/HELP/Help+Configuration+Examples, but using the distributed help files.

    c)  Set sakai.properties to include "help.location=" a URL for the shared location.
             - Our example: help.location=http://collab-dev.itc.virginia.edu/usr/local/sakai/content/docs/help

    d)  How is the current tool's help.xml file used (if at all)?  (it contains spring bean syntax...)

    e)  Is there anything else needed to adjust the current default configuration to use our external help files?
             - A web.xml file is mentioned; does the one deployed with the help tool suffice?  Or do I need to modify that one?


My test help.xml contents:

$ cat help.xml
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

<!-- Help External Configuration -->
<help-reg>
    <!-- Announcements -->
    <category name="Announcements">
        <resource name="Announcements Overview"
            location="http://collab-dev.itc.virginia.edu/usr/local/sakai/content/docs/help/sakai_announcements/argc.html"
            defaultForTool="sakai.announcements">
        </resource>
    </category>
    <!-- Assignments -->
    <category name="Assignments">
        <resource name="Assignments Overview"
           location="http://collab-dev.itc.virginia.edu/usr/local/sakai/content/docs/help/sakai_assignment_grades/argj.html"
           defaultForTool="sakai.assignment">
        </resource>
    </category>
</help-reg>


With these change in place:
1) the help tool displays the 'welcome' text, but there is no table of contents, so no help topics available...
2) catalina.out shows the following when I click on the Help menu item...  is it still trying to use the 'default' configuration?


2011-11-30 12:37:25,930 ERROR TP-Processor49 org.sakaiproject.component.app.help.HelpManagerImpl - White spaces are required between publicId and systemId.
org.xml.sax.SAXParseException: White spaces are required between publicId and systemId.
    at org.apache.xerces.parsers.DOMParser.parse(Unknown Source)
    at org.apache.xerces.jaxp.DocumentBuilderImpl.parse(Unknown Source)
    at org.sakaiproject.component.app.help.HelpManagerImpl.registerExternalHelpContent(HelpManagerImpl.java:1060)
    at org.sakaiproject.component.app.help.HelpManagerImpl.registerHelpContent(HelpManagerImpl.java:984)
    at org.sakaiproject.component.app.help.HelpManagerImpl.initialize(HelpManagerImpl.java:906)
    at org.sakaiproject.component.app.help.HelpManagerImpl.getWelcomePage(HelpManagerImpl.java:673)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:307)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:182)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:149)
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:106)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
    at $Proxy57.getWelcomePage(Unknown Source)
    at org.sakaiproject.jsf.help.HelpFrameSetRender.encodeBegin(HelpFrameSetRender.java:113)
    at javax.faces.component.UIComponentBase.encodeBegin(UIComponentBase.java:683)
    at javax.faces.component.UIData.encodeBegin(UIData.java:681)
    at javax.faces.webapp.UIComponentTag.encodeBegin(UIComponentTag.java:591)
    at javax.faces.webapp.UIComponentTag.doStartTag(UIComponentTag.java:478)
    at org.apache.jsp.main_jsp._jspx_meth_help_005fhelpFrameSet_005f0(main_jsp.java:133)
    at org.apache.jsp.main_jsp._jspx_meth_f_005fview_005f0(main_jsp.java:102)
    at org.apache.jsp.main_jsp._jspService(main_jsp.java:69)
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:98)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:369)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:308)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:259)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
    at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:659)
    at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:457)
    at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:395)
    at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:311)
    at com.sun.faces.context.ExternalContextImpl.dispatch(ExternalContextImpl.java:322)
    at com.sun.faces.application.ViewHandlerImpl.renderView(ViewHandlerImpl.java:130)
    at org.sakaiproject.jsf.app.SakaiViewHandler.renderView(SakaiViewHandler.java:137)
    at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:87)
    at com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:200)
    at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:117)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:198)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
    at org.sakaiproject.util.RequestFilter.doFilter(RequestFilter.java:585)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
    at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:659)
    at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:457)
    at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:395)
    at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:311)
    at org.sakaiproject.jsf.util.JsfTool.dispatch(JsfTool.java:221)
    at org.sakaiproject.tool.help.HelpJsfTool.dispatch(HelpJsfTool.java:96)
    at org.sakaiproject.jsf.util.JsfTool.doGet(JsfTool.java:241)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:627)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
    at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:659)
    at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:457)
    at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:359)
    at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:311)
    at org.sakaiproject.tool.impl.ActiveToolComponent$MyActiveTool.forward(ActiveToolComponent.java:512)
    at org.sakaiproject.portal.charon.SkinnableCharonPortal.forwardTool(SkinnableCharonPortal.java:1221)
    at org.sakaiproject.portal.charon.handlers.HelpHandler.doHelp(HelpHandler.java:107)
    at org.sakaiproject.portal.charon.handlers.HelpHandler.doGet(HelpHandler.java:69)
    at org.sakaiproject.portal.charon.SkinnableCharonPortal.doGet(SkinnableCharonPortal.java:768)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:627)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
    at org.sakaiproject.util.RequestFilter.doFilter(RequestFilter.java:646)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:172)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:174)
    at org.apache.jk.server.JkCoyoteHandler.invoke(JkCoyoteHandler.java:200)
    at org.apache.jk.common.HandlerRequest.invoke(HandlerRequest.java:291)
    at org.apache.jk.common.ChannelSocket.invoke(ChannelSocket.java:775)
    at org.apache.jk.common.ChannelSocket.processConnection(ChannelSocket.java:704)
    at org.apache.jk.common.ChannelSocket$SocketConnection.runIt(ChannelSocket.java:897)
    at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689)
    at java.lang.Thread.run(Thread.java:662)
2011-11-30 12:37:25,965  INFO TP-Processor49 org.sakaiproject.component.app.help.HelpManagerImpl - finished initializing lucene for 'default' in 31 total milliseconds







-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://collab.sakaiproject.org/pipermail/sakai-dev/attachments/20111130/40877ba9/attachment.html 


More information about the sakai-dev mailing list