From 25f602778deee94ef9cc138cce359b471b15bdee Mon Sep 17 00:00:00 2001 From: Curtis D'Entremont Date: Thu, 15 Mar 2007 15:36:58 +0000 Subject: 138390 [Help] reconsider Tomcat --- org.eclipse.help.webapp/.classpath | 1 - .../.externalToolBuilders/JSP Builder.launch | 39 ++ org.eclipse.help.webapp/.project | 10 + org.eclipse.help.webapp/META-INF/MANIFEST.MF | 12 +- org.eclipse.help.webapp/WEB-INF/.cvsignore | 1 - org.eclipse.help.webapp/WEB-INF/lib/.cvsignore | 3 - org.eclipse.help.webapp/WEB-INF/web.xml | 176 ----- org.eclipse.help.webapp/build.properties | 38 +- org.eclipse.help.webapp/build.xml | 360 ---------- org.eclipse.help.webapp/buildJSPs.xml | 212 ++++++ org.eclipse.help.webapp/plugin.xml | 143 +++- .../help/internal/webapp/data/ActivitiesData.java | 66 ++ .../help/internal/webapp/data/BookmarksData.java | 104 +++ .../internal/webapp/data/EnabledTopicUtils.java | 99 +++ .../help/internal/webapp/data/IndexData.java | 360 ++++++++++ .../help/internal/webapp/data/LayoutData.java | 146 +++++ .../help/internal/webapp/data/LinksData.java | 120 ++++ .../help/internal/webapp/data/PrintData.java | 260 ++++++++ .../help/internal/webapp/data/RequestData.java | 108 +++ .../help/internal/webapp/data/SearchData.java | 520 +++++++++++++++ .../internal/webapp/data/ServletResources.java | 131 ++++ .../eclipse/help/internal/webapp/data/TocData.java | 730 +++++++++++++++++++++ .../help/internal/webapp/data/ToolbarButton.java | 113 ++++ .../help/internal/webapp/data/ToolbarData.java | 119 ++++ .../eclipse/help/internal/webapp/data/Topic.java | 30 + .../eclipse/help/internal/webapp/data/UrlUtil.java | 627 ++++++++++++++++++ .../eclipse/help/internal/webapp/data/View.java | 71 ++ .../internal/webapp/data/WebappPreferences.java | 146 +++++ .../help/internal/webapp/data/WorkingSetData.java | 156 +++++ .../webapp/data/WorkingSetManagerData.java | 184 ++++++ .../internal/webapp/servlet/BreadcrumbsFilter.java | 117 ++++ .../internal/webapp/servlet/ContentServlet.java | 58 ++ .../internal/webapp/servlet/ContextServlet.java | 76 +++ .../internal/webapp/servlet/ControlServlet.java | 317 +++++++++ .../help/internal/webapp/servlet/CookieUtil.java | 170 +++++ .../webapp/servlet/DynamicXHTMLFilter.java | 118 ++++ .../internal/webapp/servlet/EclipseConnector.java | 244 +++++++ .../internal/webapp/servlet/ExtensionServlet.java | 76 +++ .../servlet/FilterHTMLHeadAndBodyOutputStream.java | 292 +++++++++ .../webapp/servlet/FilterHTMLHeadOutputStream.java | 161 +++++ .../internal/webapp/servlet/FramesetFilter.java | 67 ++ .../internal/webapp/servlet/HighlightFilter.java | 214 ++++++ .../help/internal/webapp/servlet/IFilter.java | 32 + .../webapp/servlet/IndexFragmentServlet.java | 356 ++++++++++ .../help/internal/webapp/servlet/IndexServlet.java | 85 +++ .../servlet/InfocenterWorkingSetManager.java | 276 ++++++++ .../internal/webapp/servlet/InjectionFilter.java | 136 ++++ .../internal/webapp/servlet/LiveHelpServlet.java | 70 ++ .../help/internal/webapp/servlet/NavServlet.java | 96 +++ .../internal/webapp/servlet/SearchServlet.java | 110 ++++ .../webapp/servlet/TocFragmentServlet.java | 258 ++++++++ .../help/internal/webapp/servlet/TocServlet.java | 96 +++ .../webapp/servlet/WebappWorkingSetManager.java | 114 ++++ .../help/internal/webapp/servlet/XMLGenerator.java | 94 +++ .../help/internal/webapp/data/ActivitiesData.java | 66 -- .../help/internal/webapp/data/BookmarksData.java | 104 --- .../internal/webapp/data/EnabledTopicUtils.java | 99 --- .../help/internal/webapp/data/IndexData.java | 360 ---------- .../help/internal/webapp/data/LayoutData.java | 146 ----- .../help/internal/webapp/data/LinksData.java | 120 ---- .../help/internal/webapp/data/PrintData.java | 260 -------- .../help/internal/webapp/data/RequestData.java | 108 --- .../help/internal/webapp/data/SearchData.java | 520 --------------- .../internal/webapp/data/ServletResources.java | 131 ---- .../eclipse/help/internal/webapp/data/TocData.java | 730 --------------------- .../help/internal/webapp/data/ToolbarButton.java | 113 ---- .../help/internal/webapp/data/ToolbarData.java | 119 ---- .../eclipse/help/internal/webapp/data/Topic.java | 30 - .../eclipse/help/internal/webapp/data/UrlUtil.java | 627 ------------------ .../eclipse/help/internal/webapp/data/View.java | 71 -- .../internal/webapp/data/WebappPreferences.java | 146 ----- .../help/internal/webapp/data/WorkingSetData.java | 156 ----- .../webapp/data/WorkingSetManagerData.java | 184 ------ .../internal/webapp/servlet/BreadcrumbsFilter.java | 117 ---- .../internal/webapp/servlet/ContentServlet.java | 58 -- .../internal/webapp/servlet/ContextServlet.java | 76 --- .../internal/webapp/servlet/ControlServlet.java | 317 --------- .../help/internal/webapp/servlet/CookieUtil.java | 170 ----- .../webapp/servlet/DynamicXHTMLFilter.java | 118 ---- .../internal/webapp/servlet/EclipseConnector.java | 244 ------- .../internal/webapp/servlet/ExtensionServlet.java | 76 --- .../servlet/FilterHTMLHeadAndBodyOutputStream.java | 292 --------- .../webapp/servlet/FilterHTMLHeadOutputStream.java | 161 ----- .../internal/webapp/servlet/FramesetFilter.java | 67 -- .../internal/webapp/servlet/HighlightFilter.java | 214 ------ .../help/internal/webapp/servlet/IFilter.java | 32 - .../webapp/servlet/IndexFragmentServlet.java | 356 ---------- .../help/internal/webapp/servlet/IndexServlet.java | 85 --- .../servlet/InfocenterWorkingSetManager.java | 276 -------- .../internal/webapp/servlet/InjectionFilter.java | 136 ---- .../internal/webapp/servlet/LiveHelpServlet.java | 70 -- .../help/internal/webapp/servlet/NavServlet.java | 96 --- .../internal/webapp/servlet/SearchServlet.java | 110 ---- .../webapp/servlet/TocFragmentServlet.java | 258 -------- .../help/internal/webapp/servlet/TocServlet.java | 96 --- .../webapp/servlet/WebappWorkingSetManager.java | 114 ---- .../help/internal/webapp/servlet/XMLGenerator.java | 94 --- 97 files changed, 8140 insertions(+), 8301 deletions(-) create mode 100644 org.eclipse.help.webapp/.externalToolBuilders/JSP Builder.launch delete mode 100644 org.eclipse.help.webapp/WEB-INF/.cvsignore delete mode 100644 org.eclipse.help.webapp/WEB-INF/lib/.cvsignore delete mode 100644 org.eclipse.help.webapp/WEB-INF/web.xml delete mode 100644 org.eclipse.help.webapp/build.xml create mode 100644 org.eclipse.help.webapp/buildJSPs.xml create mode 100644 org.eclipse.help.webapp/src/org/eclipse/help/internal/webapp/data/ActivitiesData.java create mode 100644 org.eclipse.help.webapp/src/org/eclipse/help/internal/webapp/data/BookmarksData.java create mode 100644 org.eclipse.help.webapp/src/org/eclipse/help/internal/webapp/data/EnabledTopicUtils.java create mode 100644 org.eclipse.help.webapp/src/org/eclipse/help/internal/webapp/data/IndexData.java create mode 100644 org.eclipse.help.webapp/src/org/eclipse/help/internal/webapp/data/LayoutData.java create mode 100644 org.eclipse.help.webapp/src/org/eclipse/help/internal/webapp/data/LinksData.java create mode 100644 org.eclipse.help.webapp/src/org/eclipse/help/internal/webapp/data/PrintData.java create mode 100644 org.eclipse.help.webapp/src/org/eclipse/help/internal/webapp/data/RequestData.java create mode 100644 org.eclipse.help.webapp/src/org/eclipse/help/internal/webapp/data/SearchData.java create mode 100644 org.eclipse.help.webapp/src/org/eclipse/help/internal/webapp/data/ServletResources.java create mode 100644 org.eclipse.help.webapp/src/org/eclipse/help/internal/webapp/data/TocData.java create mode 100644 org.eclipse.help.webapp/src/org/eclipse/help/internal/webapp/data/ToolbarButton.java create mode 100644 org.eclipse.help.webapp/src/org/eclipse/help/internal/webapp/data/ToolbarData.java create mode 100644 org.eclipse.help.webapp/src/org/eclipse/help/internal/webapp/data/Topic.java create mode 100644 org.eclipse.help.webapp/src/org/eclipse/help/internal/webapp/data/UrlUtil.java create mode 100644 org.eclipse.help.webapp/src/org/eclipse/help/internal/webapp/data/View.java create mode 100644 org.eclipse.help.webapp/src/org/eclipse/help/internal/webapp/data/WebappPreferences.java create mode 100644 org.eclipse.help.webapp/src/org/eclipse/help/internal/webapp/data/WorkingSetData.java create mode 100644 org.eclipse.help.webapp/src/org/eclipse/help/internal/webapp/data/WorkingSetManagerData.java create mode 100644 org.eclipse.help.webapp/src/org/eclipse/help/internal/webapp/servlet/BreadcrumbsFilter.java create mode 100644 org.eclipse.help.webapp/src/org/eclipse/help/internal/webapp/servlet/ContentServlet.java create mode 100644 org.eclipse.help.webapp/src/org/eclipse/help/internal/webapp/servlet/ContextServlet.java create mode 100644 org.eclipse.help.webapp/src/org/eclipse/help/internal/webapp/servlet/ControlServlet.java create mode 100644 org.eclipse.help.webapp/src/org/eclipse/help/internal/webapp/servlet/CookieUtil.java create mode 100644 org.eclipse.help.webapp/src/org/eclipse/help/internal/webapp/servlet/DynamicXHTMLFilter.java create mode 100644 org.eclipse.help.webapp/src/org/eclipse/help/internal/webapp/servlet/EclipseConnector.java create mode 100644 org.eclipse.help.webapp/src/org/eclipse/help/internal/webapp/servlet/ExtensionServlet.java create mode 100644 org.eclipse.help.webapp/src/org/eclipse/help/internal/webapp/servlet/FilterHTMLHeadAndBodyOutputStream.java create mode 100644 org.eclipse.help.webapp/src/org/eclipse/help/internal/webapp/servlet/FilterHTMLHeadOutputStream.java create mode 100644 org.eclipse.help.webapp/src/org/eclipse/help/internal/webapp/servlet/FramesetFilter.java create mode 100644 org.eclipse.help.webapp/src/org/eclipse/help/internal/webapp/servlet/HighlightFilter.java create mode 100644 org.eclipse.help.webapp/src/org/eclipse/help/internal/webapp/servlet/IFilter.java create mode 100644 org.eclipse.help.webapp/src/org/eclipse/help/internal/webapp/servlet/IndexFragmentServlet.java create mode 100644 org.eclipse.help.webapp/src/org/eclipse/help/internal/webapp/servlet/IndexServlet.java create mode 100644 org.eclipse.help.webapp/src/org/eclipse/help/internal/webapp/servlet/InfocenterWorkingSetManager.java create mode 100644 org.eclipse.help.webapp/src/org/eclipse/help/internal/webapp/servlet/InjectionFilter.java create mode 100644 org.eclipse.help.webapp/src/org/eclipse/help/internal/webapp/servlet/LiveHelpServlet.java create mode 100644 org.eclipse.help.webapp/src/org/eclipse/help/internal/webapp/servlet/NavServlet.java create mode 100644 org.eclipse.help.webapp/src/org/eclipse/help/internal/webapp/servlet/SearchServlet.java create mode 100644 org.eclipse.help.webapp/src/org/eclipse/help/internal/webapp/servlet/TocFragmentServlet.java create mode 100644 org.eclipse.help.webapp/src/org/eclipse/help/internal/webapp/servlet/TocServlet.java create mode 100644 org.eclipse.help.webapp/src/org/eclipse/help/internal/webapp/servlet/WebappWorkingSetManager.java create mode 100644 org.eclipse.help.webapp/src/org/eclipse/help/internal/webapp/servlet/XMLGenerator.java delete mode 100644 org.eclipse.help.webapp/src_servlets/org/eclipse/help/internal/webapp/data/ActivitiesData.java delete mode 100644 org.eclipse.help.webapp/src_servlets/org/eclipse/help/internal/webapp/data/BookmarksData.java delete mode 100644 org.eclipse.help.webapp/src_servlets/org/eclipse/help/internal/webapp/data/EnabledTopicUtils.java delete mode 100644 org.eclipse.help.webapp/src_servlets/org/eclipse/help/internal/webapp/data/IndexData.java delete mode 100644 org.eclipse.help.webapp/src_servlets/org/eclipse/help/internal/webapp/data/LayoutData.java delete mode 100644 org.eclipse.help.webapp/src_servlets/org/eclipse/help/internal/webapp/data/LinksData.java delete mode 100644 org.eclipse.help.webapp/src_servlets/org/eclipse/help/internal/webapp/data/PrintData.java delete mode 100644 org.eclipse.help.webapp/src_servlets/org/eclipse/help/internal/webapp/data/RequestData.java delete mode 100644 org.eclipse.help.webapp/src_servlets/org/eclipse/help/internal/webapp/data/SearchData.java delete mode 100644 org.eclipse.help.webapp/src_servlets/org/eclipse/help/internal/webapp/data/ServletResources.java delete mode 100644 org.eclipse.help.webapp/src_servlets/org/eclipse/help/internal/webapp/data/TocData.java delete mode 100644 org.eclipse.help.webapp/src_servlets/org/eclipse/help/internal/webapp/data/ToolbarButton.java delete mode 100644 org.eclipse.help.webapp/src_servlets/org/eclipse/help/internal/webapp/data/ToolbarData.java delete mode 100644 org.eclipse.help.webapp/src_servlets/org/eclipse/help/internal/webapp/data/Topic.java delete mode 100644 org.eclipse.help.webapp/src_servlets/org/eclipse/help/internal/webapp/data/UrlUtil.java delete mode 100644 org.eclipse.help.webapp/src_servlets/org/eclipse/help/internal/webapp/data/View.java delete mode 100644 org.eclipse.help.webapp/src_servlets/org/eclipse/help/internal/webapp/data/WebappPreferences.java delete mode 100644 org.eclipse.help.webapp/src_servlets/org/eclipse/help/internal/webapp/data/WorkingSetData.java delete mode 100644 org.eclipse.help.webapp/src_servlets/org/eclipse/help/internal/webapp/data/WorkingSetManagerData.java delete mode 100644 org.eclipse.help.webapp/src_servlets/org/eclipse/help/internal/webapp/servlet/BreadcrumbsFilter.java delete mode 100644 org.eclipse.help.webapp/src_servlets/org/eclipse/help/internal/webapp/servlet/ContentServlet.java delete mode 100644 org.eclipse.help.webapp/src_servlets/org/eclipse/help/internal/webapp/servlet/ContextServlet.java delete mode 100644 org.eclipse.help.webapp/src_servlets/org/eclipse/help/internal/webapp/servlet/ControlServlet.java delete mode 100644 org.eclipse.help.webapp/src_servlets/org/eclipse/help/internal/webapp/servlet/CookieUtil.java delete mode 100644 org.eclipse.help.webapp/src_servlets/org/eclipse/help/internal/webapp/servlet/DynamicXHTMLFilter.java delete mode 100644 org.eclipse.help.webapp/src_servlets/org/eclipse/help/internal/webapp/servlet/EclipseConnector.java delete mode 100644 org.eclipse.help.webapp/src_servlets/org/eclipse/help/internal/webapp/servlet/ExtensionServlet.java delete mode 100644 org.eclipse.help.webapp/src_servlets/org/eclipse/help/internal/webapp/servlet/FilterHTMLHeadAndBodyOutputStream.java delete mode 100644 org.eclipse.help.webapp/src_servlets/org/eclipse/help/internal/webapp/servlet/FilterHTMLHeadOutputStream.java delete mode 100644 org.eclipse.help.webapp/src_servlets/org/eclipse/help/internal/webapp/servlet/FramesetFilter.java delete mode 100644 org.eclipse.help.webapp/src_servlets/org/eclipse/help/internal/webapp/servlet/HighlightFilter.java delete mode 100644 org.eclipse.help.webapp/src_servlets/org/eclipse/help/internal/webapp/servlet/IFilter.java delete mode 100644 org.eclipse.help.webapp/src_servlets/org/eclipse/help/internal/webapp/servlet/IndexFragmentServlet.java delete mode 100644 org.eclipse.help.webapp/src_servlets/org/eclipse/help/internal/webapp/servlet/IndexServlet.java delete mode 100644 org.eclipse.help.webapp/src_servlets/org/eclipse/help/internal/webapp/servlet/InfocenterWorkingSetManager.java delete mode 100644 org.eclipse.help.webapp/src_servlets/org/eclipse/help/internal/webapp/servlet/InjectionFilter.java delete mode 100644 org.eclipse.help.webapp/src_servlets/org/eclipse/help/internal/webapp/servlet/LiveHelpServlet.java delete mode 100644 org.eclipse.help.webapp/src_servlets/org/eclipse/help/internal/webapp/servlet/NavServlet.java delete mode 100644 org.eclipse.help.webapp/src_servlets/org/eclipse/help/internal/webapp/servlet/SearchServlet.java delete mode 100644 org.eclipse.help.webapp/src_servlets/org/eclipse/help/internal/webapp/servlet/TocFragmentServlet.java delete mode 100644 org.eclipse.help.webapp/src_servlets/org/eclipse/help/internal/webapp/servlet/TocServlet.java delete mode 100644 org.eclipse.help.webapp/src_servlets/org/eclipse/help/internal/webapp/servlet/WebappWorkingSetManager.java delete mode 100644 org.eclipse.help.webapp/src_servlets/org/eclipse/help/internal/webapp/servlet/XMLGenerator.java (limited to 'org.eclipse.help.webapp') diff --git a/org.eclipse.help.webapp/.classpath b/org.eclipse.help.webapp/.classpath index 923835d54..ce7393340 100644 --- a/org.eclipse.help.webapp/.classpath +++ b/org.eclipse.help.webapp/.classpath @@ -1,7 +1,6 @@ - diff --git a/org.eclipse.help.webapp/.externalToolBuilders/JSP Builder.launch b/org.eclipse.help.webapp/.externalToolBuilders/JSP Builder.launch new file mode 100644 index 000000000..99fd7a284 --- /dev/null +++ b/org.eclipse.help.webapp/.externalToolBuilders/JSP Builder.launch @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/org.eclipse.help.webapp/.project b/org.eclipse.help.webapp/.project index e8e323a49..bf7471ad5 100644 --- a/org.eclipse.help.webapp/.project +++ b/org.eclipse.help.webapp/.project @@ -20,6 +20,16 @@ + + org.eclipse.ui.externaltools.ExternalToolBuilder + auto,full,incremental, + + + LaunchConfigHandle + <project>/.externalToolBuilders/JSP Builder.launch + + + org.eclipse.jdt.core.javanature diff --git a/org.eclipse.help.webapp/META-INF/MANIFEST.MF b/org.eclipse.help.webapp/META-INF/MANIFEST.MF index 2336248d4..c772b718b 100644 --- a/org.eclipse.help.webapp/META-INF/MANIFEST.MF +++ b/org.eclipse.help.webapp/META-INF/MANIFEST.MF @@ -1,17 +1,21 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %help_webapp_plugin_name -Bundle-SymbolicName: org.eclipse.help.webapp; singleton:=true +Bundle-SymbolicName: org.eclipse.help.webapp;singleton:=true Bundle-Version: 3.3.0.qualifier -Bundle-ClassPath: webapp.jar, - WEB-INF/lib/servlets.jar Bundle-Activator: org.eclipse.help.internal.webapp.HelpWebappPlugin Bundle-Vendor: %providerName Bundle-Localization: plugin Require-Bundle: org.eclipse.help.base;bundle-version="[3.1.0,4.0.0)", - org.eclipse.core.runtime;bundle-version="[3.1.0,4.0.0)" + org.eclipse.core.runtime;bundle-version="[3.1.0,4.0.0)", + org.apache.jasper Eclipse-LazyStart: true Export-Package: org.eclipse.help.internal.webapp;x-friends:="org.eclipse.ua.tests", org.eclipse.help.internal.webapp.data;x-friends:="org.eclipse.ua.tests", org.eclipse.help.internal.webapp.servlet;x-friends:="org.eclipse.ua.tests" Bundle-RequiredExecutionEnvironment: J2SE-1.4 +Import-Package: javax.servlet;version="2.4.0", + javax.servlet.http;version="2.4.0", + org.apache.jasper.servlet, + org.eclipse.equinox.jsp.jasper.registry, + org.osgi.service.http;version="1.2.0" diff --git a/org.eclipse.help.webapp/WEB-INF/.cvsignore b/org.eclipse.help.webapp/WEB-INF/.cvsignore deleted file mode 100644 index 90b07e9d4..000000000 --- a/org.eclipse.help.webapp/WEB-INF/.cvsignore +++ /dev/null @@ -1 +0,0 @@ -classes diff --git a/org.eclipse.help.webapp/WEB-INF/lib/.cvsignore b/org.eclipse.help.webapp/WEB-INF/lib/.cvsignore deleted file mode 100644 index 3adad4940..000000000 --- a/org.eclipse.help.webapp/WEB-INF/lib/.cvsignore +++ /dev/null @@ -1,3 +0,0 @@ -jsp.jar -servlets.jar -servletssrc.zip diff --git a/org.eclipse.help.webapp/WEB-INF/web.xml b/org.eclipse.help.webapp/WEB-INF/web.xml deleted file mode 100644 index 0045e8592..000000000 --- a/org.eclipse.help.webapp/WEB-INF/web.xml +++ /dev/null @@ -1,176 +0,0 @@ - - - - - - - - - control - org.eclipse.help.internal.webapp.servlet.ControlServlet - - - - content - org.eclipse.help.internal.webapp.servlet.ContentServlet - - - - livehelp - org.eclipse.help.internal.webapp.servlet.LiveHelpServlet - - - - toc - org.eclipse.help.internal.webapp.servlet.TocServlet - - - - nav - org.eclipse.help.internal.webapp.servlet.NavServlet - - - - tocfragment - org.eclipse.help.internal.webapp.servlet.TocFragmentServlet - - - - indexfragment - org.eclipse.help.internal.webapp.servlet.IndexFragmentServlet - - - - index - org.eclipse.help.internal.webapp.servlet.IndexServlet - - - - search - org.eclipse.help.internal.webapp.servlet.SearchServlet - - - - context - org.eclipse.help.internal.webapp.servlet.ContextServlet - - - - extension - org.eclipse.help.internal.webapp.servlet.ExtensionServlet - - - - - - control - /control.html - - - - content - /content/* - - - - content - /topic/* - - - - nav - /nav/* - - - - content - /nftopic/* - - - - content - /ntopic/* - - - - content - /rtopic/* - - - - livehelp - /livehelp/* - - - - toc - /toc/* - - - - tocfragment - /tocfragment/* - - - - indexfragment - /indexfragment/* - - - - index - /index/* - - - - search - /search/* - - - - context - /context/* - - - - extension - /extension/* - - - - index.html - index.htm - index.jsp - - - - - diff --git a/org.eclipse.help.webapp/build.properties b/org.eclipse.help.webapp/build.properties index 57bb0bbbd..5c54b4e7a 100644 --- a/org.eclipse.help.webapp/build.properties +++ b/org.eclipse.help.webapp/build.properties @@ -8,30 +8,18 @@ # Contributors: # IBM Corporation - initial API and implementation ############################################################################### -custom=true -# properties for building a plugin; create project source folder - temp.folder/jsp.jar.src source before using pde to generate skeleton script -source.webapp.jar=src/ -source.WEB-INF/lib/servlets.jar=src_servlets/ -source.WEB-INF/lib/jsp.jar=${temp.folder}/jsp.jar.src/ +source.. = src/ src.includes=about.html -bin.includes=META-INF/,advanced/,basic/,WEB-INF/,*.html,*.jar,*.jsp,plugin.properties,plugin.xml,.options -bin.excludes=WEB-INF/classes/ -jars.compile.order=webapp.jar,WEB-INF/lib/servlets.jar,WEB-INF/lib/jsp.jar -jars.extra.classpath=../org.eclipse.osgi/bin,\ - ../org.eclipse.osgi,\ - ../org.eclipse.osgi/@dot,\ - ../org.eclipse.core.runtime/bin,\ - ../org.eclipse.core.runtime,\ - ../org.eclipse.core.runtime/@dot,\ - ../org.eclipse.help/bin,\ - ../org.eclipse.help,\ - ../org.eclipse.help/@dot,\ - ../org.eclipse.help.base/bin,\ - ../org.eclipse.help.base,\ - ../org.eclipse.help.base/@dot,\ - ../org.eclipse.help.appserver/bin,\ - ../org.eclipse.help.appserver,\ - ../org.eclipse.help.appserver/@dot,\ - ../org.eclipse.tomcat/servlet.jar,\ - ../org.eclipse.tomcat/jasper-runtime.jar +customBuildCallbacks=buildJSPs.xml +bin.includes = plugin.xml,\ + .,\ + plugin.properties,\ + about.html,\ + META-INF/,\ + index.jsp,\ + basic/,\ + advanced/,\ + .options +output.. = bin/ + diff --git a/org.eclipse.help.webapp/build.xml b/org.eclipse.help.webapp/build.xml deleted file mode 100644 index 52612fc32..000000000 --- a/org.eclipse.help.webapp/build.xml +++ /dev/null @@ -1,360 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/org.eclipse.help.webapp/buildJSPs.xml b/org.eclipse.help.webapp/buildJSPs.xml new file mode 100644 index 000000000..38f83e88f --- /dev/null +++ b/org.eclipse.help.webapp/buildJSPs.xml @@ -0,0 +1,212 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/org.eclipse.help.webapp/plugin.xml b/org.eclipse.help.webapp/plugin.xml index 41fd612e8..07589d8a3 100644 --- a/org.eclipse.help.webapp/plugin.xml +++ b/org.eclipse.help.webapp/plugin.xml @@ -1,12 +1,139 @@ - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/org.eclipse.help.webapp/src/org/eclipse/help/internal/webapp/data/ActivitiesData.java b/org.eclipse.help.webapp/src/org/eclipse/help/internal/webapp/data/ActivitiesData.java new file mode 100644 index 000000000..d487ce913 --- /dev/null +++ b/org.eclipse.help.webapp/src/org/eclipse/help/internal/webapp/data/ActivitiesData.java @@ -0,0 +1,66 @@ +/******************************************************************************* + * Copyright (c) 2000, 2005 IBM Corporation and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.help.internal.webapp.data; +import javax.servlet.*; +import javax.servlet.http.*; + +import org.eclipse.help.internal.base.*; +/** + * Helper for pages in navigation frames. Used enabling/disabling activity + * filtering + */ +public class ActivitiesData extends RequestData { + /** + * Constructs the data for a request. + * + * @param context + * @param request + */ + public ActivitiesData(ServletContext context, HttpServletRequest request, + HttpServletResponse response) { + super(context, request, response); + String changeShowAll = request.getParameter("showAll"); //$NON-NLS-1$ + if (changeShowAll != null) { + if ("off".equalsIgnoreCase(changeShowAll)) { //$NON-NLS-1$ + HelpBasePlugin.getActivitySupport().setFilteringEnabled(true); + } else if ("on".equalsIgnoreCase(changeShowAll)) { //$NON-NLS-1$ + HelpBasePlugin.getActivitySupport().setFilteringEnabled(false); + } else { + // not supported value + } + } else { + // no change to afilter + } + String confirmShowAll = request.getParameter("showconfirm"); //$NON-NLS-1$ + if ("false".equalsIgnoreCase(confirmShowAll)) { //$NON-NLS-1$ + preferences.setDontConfirmShowAll(true); + } + } + /** + * @return Checks if filtering is enabled. + */ + public boolean isActivityFiltering() { + return HelpBasePlugin.getActivitySupport().isFilteringEnabled(); + } + /** + * Gives state of show all topics button + * + * @return "hidden", "off", or "on" + */ + public String getButtonState() { + if (!HelpBasePlugin.getActivitySupport().isUserCanToggleFiltering()) + return "hidden"; //$NON-NLS-1$ + else if (HelpBasePlugin.getActivitySupport().isFilteringEnabled()) + return "off"; //$NON-NLS-1$ + else + return "on"; //$NON-NLS-1$ + } +} diff --git a/org.eclipse.help.webapp/src/org/eclipse/help/internal/webapp/data/BookmarksData.java b/org.eclipse.help.webapp/src/org/eclipse/help/internal/webapp/data/BookmarksData.java new file mode 100644 index 000000000..368988a65 --- /dev/null +++ b/org.eclipse.help.webapp/src/org/eclipse/help/internal/webapp/data/BookmarksData.java @@ -0,0 +1,104 @@ +/******************************************************************************* + * Copyright (c) 2000, 2005 IBM Corporation and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.help.internal.webapp.data; + +import javax.servlet.ServletContext; +import javax.servlet.http.*; + +import org.eclipse.help.IHelpResource; +import org.eclipse.help.internal.base.*; + +/** + * This class manages bookmarks. + */ +public class BookmarksData extends RequestData { + public final static int NONE = 0; + public final static int ADD = 1; + public final static int REMOVE = 2; + public final static int REMOVE_ALL = 3; + + public BookmarksData(ServletContext context, HttpServletRequest request, + HttpServletResponse response) { + super(context, request, response); + + switch (getOperation()) { + case ADD : + addBookmark(); + break; + case REMOVE : + removeBookmark(); + break; + case REMOVE_ALL : + removeAllBookmarks(); + break; + default : + break; + } + } + + public void addBookmark() { + String bookmarkURL = request.getParameter("bookmark"); //$NON-NLS-1$ + if (bookmarkURL != null && bookmarkURL.length() > 0 + && !bookmarkURL.equals("about:blank")) { //$NON-NLS-1$ + String title = request.getParameter("title"); //$NON-NLS-1$ + if (title == null) { + return; + } + BookmarkManager manager = BaseHelpSystem.getBookmarkManager(); + manager.addBookmark(bookmarkURL, title); + } + } + + public void removeBookmark() { + String bookmarkURL = request.getParameter("bookmark"); //$NON-NLS-1$ + if (bookmarkURL != null && bookmarkURL.length() > 0 + && !bookmarkURL.equals("about:blank")) { //$NON-NLS-1$ + String title = request.getParameter("title"); //$NON-NLS-1$ + if (title == null) { + return; + } + BookmarkManager manager = BaseHelpSystem.getBookmarkManager(); + manager.removeBookmark(bookmarkURL, title); + } + } + + public void removeAllBookmarks() { + BookmarkManager manager = BaseHelpSystem.getBookmarkManager(); + manager.removeAllBookmarks(); + } + + public Topic[] getBookmarks() { + // sanity test for infocenter, but this could not work anyway... + if (BaseHelpSystem.getMode() != BaseHelpSystem.MODE_INFOCENTER) { + BookmarkManager manager = BaseHelpSystem.getBookmarkManager(); + IHelpResource [] bookmarks = manager.getBookmarks(); + Topic [] topics = new Topic[bookmarks.length]; + for (int i=0; i 0) { + if (first) { + first = false; + } else { + out.write(",\n"); //$NON-NLS-1$ + } + out.write("\""); //$NON-NLS-1$ + out.write(UrlUtil.JavaScriptEncode(entry.getKeyword())); + out.write("\""); //$NON-NLS-1$ + } + } + } + + /** + * Generates the HTML code (a list) for the index. + * + * @param out + * @throws IOException + */ + public void generateIndex(Writer out) throws IOException { + this.out = out; + IIndexEntry[] entries = index.getEntries(); + for (int i=0;i[ plus_image ]... + * [
    list of topics
] + * [
    nested entries
] + * + * + * For basic UI: + *
  • ... + * [
      + * list of topics + * nested entries + *
    ] + *
  • + */ + private void generateEntry(IIndexEntry entry, int level) throws IOException { + if (entry.getKeyword() != null && entry.getKeyword().length() > 0) { + ITopic[] topics = EnabledTopicUtils.getEnabled(entry.getTopics()); + IIndexEntry[] subentries = EnabledTopicUtils.getEnabled(entry.getSubentries()); + boolean multipleTopics = topics.length > 1; + boolean singleTopic = topics.length == 1; + + out.write("
  • "); //$NON-NLS-1$ + if (usePlusMinus && advancedUI) generatePlusImage(multipleTopics); + generateAnchor(singleTopic, entry, level); + if (multipleTopics || subentries.length > 0) { + if (!advancedUI) { + out.write("
      \n"); //$NON-NLS-1$ + } + if (multipleTopics) generateTopicList(entry); + generateSubentries(entry, level + 1); + if (!advancedUI) { + out.write("
    \n"); //$NON-NLS-1$ + } + } + out.write("
  • \n"); //$NON-NLS-1$ + } + } + + /** + * Generates the HTML code (a list) for the index. + * Basic UI version. + * + * @param out + * @throws IOException + */ + public void generateBasicIndex(Writer out) throws IOException { + this.out = out; + IIndexEntry[] entries = index.getEntries(); + for (int i=0;i + * ... + * + * [
      + * list of topics + * nested entries + *
    ] + */ + private void generateBasicEntry(IIndexEntry entry, int level) throws IOException { + ITopic[] topics = entry.getTopics(); + IIndexEntry[] subentries = entry.getSubentries(); + boolean multipleTopics = topics.length > 1; + boolean singleTopic = topics.length == 1; + + out.write("\n"); //$NON-NLS-1$ + generateAnchor(singleTopic, entry, level); + out.write("\n"); //$NON-NLS-1$ + if (multipleTopics || subentries.length > 0) { + out.write("
      \n"); //$NON-NLS-1$ + if (multipleTopics) generateTopicList(entry); + generateSubentries(entry, level + 1); + out.write("
    \n"); //$NON-NLS-1$ + } + } + + /** + * Generates the HTML code for the plus/minus image. + * + * @param multipleTopics + * @throws IOException + */ + /* + * ... + */ + private void generatePlusImage(boolean multipleTopics) throws IOException { + out.write("\"");"); //$NON-NLS-1$ + } + + /** + * Generates the HTML code for an index entry anchor tag. + * + * @param singleTopic + * @param entry + * @param level + * @throws IOException + */ + /* + * For advanced UI: + * ... + * + * For basic UI: + * ... + */ + private void generateAnchor(boolean singleTopic, IIndexEntry entry, int level) throws IOException { + out.write(""); //$NON-NLS-1$ + } else { + if (advancedUI) { + out.write("class=\"nolink\" "); //$NON-NLS-1$ + } + out.write("href=\"about:blank\">"); //$NON-NLS-1$ + } + out.write(UrlUtil.htmlEncode(entry.getKeyword())); + out.write("\n"); //$NON-NLS-1$ + } + + /** + * Generates the HTML code for a list of topics. + * + * @param entry + * @throws IOException + */ + /* + * For advanced UI: + *
      + *
    • ...
    • + *
    • ... + *
    + * + * For basic UI: + *
  • ...
  • + *
  • ... + */ + private void generateTopicList(IIndexEntry entry) throws IOException { + ITopic[] topics = entry.getTopics(); + + if (advancedUI) { + out.write("\n\n"); //$NON-NLS-1$ + } + } + + /** + * Generates the HTML for nested index entries. + * + * @param entry + * @param level + * @throws IOException + */ + /* + * For advanced UI: + *
      + * entries... + *
    + * + * For basic UI: + * entries... + */ + private void generateSubentries(IIndexEntry entry, int level) throws IOException { + if (advancedUI) { + out.write("
      \n"); //$NON-NLS-1$ + } + IIndexEntry[] subentries = entry.getSubentries(); + for (int i=0;i\n"); //$NON-NLS-1$ + } + } +} diff --git a/org.eclipse.help.webapp/src/org/eclipse/help/internal/webapp/data/LayoutData.java b/org.eclipse.help.webapp/src/org/eclipse/help/internal/webapp/data/LayoutData.java new file mode 100644 index 000000000..fb74116e7 --- /dev/null +++ b/org.eclipse.help.webapp/src/org/eclipse/help/internal/webapp/data/LayoutData.java @@ -0,0 +1,146 @@ +/******************************************************************************* + * Copyright (c) 2000, 2006 IBM Corporation and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.help.internal.webapp.data; + +import java.util.ArrayList; + +import javax.servlet.*; +import javax.servlet.http.*; + +import org.eclipse.help.internal.HelpPlugin; +import org.eclipse.help.internal.base.*; + +public class LayoutData extends RequestData { + + private String query = ""; //$NON-NLS-1$ + private View[] views; + + public LayoutData(ServletContext context, HttpServletRequest request, + HttpServletResponse response) { + super(context, request, response); + + // initialize the query string + String qs = request.getQueryString(); + if (qs != null && qs.length() > 0) + query = "?" + qs; //$NON-NLS-1$ + } + + public String getQuery() { + return query; + } + + public String getBannerURL() { + String banner = preferences.getBanner(); + if (banner == null || banner.trim().length() == 0) { + banner = "about:blank"; //$NON-NLS-1$ + } else if (banner.startsWith("http:/") || banner.startsWith("https:/")) { //$NON-NLS-1$ //$NON-NLS-2$ + } else if (banner.startsWith("file:/") || banner.startsWith("jar:file:/")) { //$NON-NLS-1$ //$NON-NLS-2$ + banner = "topic/" + banner; //$NON-NLS-1$ + } else { + banner = "topic" + banner; //$NON-NLS-1$ + } + return banner; + } + + public String getBannerHeight() { + String height = preferences.getBannerHeight(); + if (height == null || height.length() == 0) { + height = "0"; //$NON-NLS-1$ + } + return height; + } + + public String getContentURL() { + String topicHref = request.getParameter("topic"); //$NON-NLS-1$ + if (topicHref == null || topicHref.length() == 0) { + return UrlUtil.getHelpURL(preferences.getHelpHome()); + } + else { + TocData tocData = new TocData(context, request, response); + String topic = tocData.getSelectedTopic(); + return topic != null ? topic : UrlUtil.getHelpURL(preferences.getHelpHome()); + } + } + + /** + * Return array of length 0 if no views + */ + public View[] getViews() { + if (views != null) + return views; + + View tocview = new View("toc", //$NON-NLS-1$ + "", //$NON-NLS-1$ + preferences.getImagesDirectory() + "/contents_view.gif", 'C', !HelpPlugin.getTocManager().isTocLoaded(getLocale())); //$NON-NLS-1$ + View indexview = null; + View searchview = new View("search", //$NON-NLS-1$ + "", //$NON-NLS-1$ + preferences.getImagesDirectory() + "/search_results_view.gif", 'R', false); //$NON-NLS-1$ + View linksview = null; + View bookmarksview = null; + + if (preferences.isIndexView()) + indexview = new View("index", //$NON-NLS-1$ + "", //$NON-NLS-1$ + preferences.getImagesDirectory() + "/index_view.gif", 'I', false); //$NON-NLS-1$ + if (preferences.isLinksView()) + linksview = new View("links", //$NON-NLS-1$ + "", //$NON-NLS-1$ + preferences.getImagesDirectory() + "/links_view.gif", (char)0, false); //$NON-NLS-1$ + if (preferences.isBookmarksView()) + bookmarksview = new View("bookmarks", //$NON-NLS-1$ + "", //$NON-NLS-1$ + preferences.getImagesDirectory() + "/bookmarks_view.gif", (char)0, false); //$NON-NLS-1$ + + ArrayList viewList = new ArrayList(); + viewList.add(tocview); + if (indexview != null) { + viewList.add(indexview); + } + viewList.add(searchview); + if (linksview != null) { + viewList.add(linksview); + } + if (bookmarksview !=null) { + viewList.add(bookmarksview); + } + + views = (View[]) viewList.toArray(new View[viewList.size()]); + return views; + } + + public String getVisibleView() { + String requestedView = request.getParameter("tab"); //$NON-NLS-1$ + View[] allViews = getViews(); + for (int i = 0; i < allViews.length; i++) { + if (allViews[i].getName().equals(requestedView)) { + return requestedView; + } + } + return "toc"; //$NON-NLS-1$ + } + + public View getCurrentView() { + String name = request.getParameter("view"); //$NON-NLS-1$ + views = getViews(); + for (int i = 0; i < views.length; i++) + if (views[i].getName().equals(name)) + return views[i]; + return null; + } + public String getWindowTitle() { + if (preferences.isWindowTitlePrefix()) { + return ServletResources.getString("browserTitle", //$NON-NLS-1$ + BaseHelpSystem.getProductName(), request); + } + return BaseHelpSystem.getProductName(); + } +} diff --git a/org.eclipse.help.webapp/src/org/eclipse/help/internal/webapp/data/LinksData.java b/org.eclipse.help.webapp/src/org/eclipse/help/internal/webapp/data/LinksData.java new file mode 100644 index 000000000..a444106bc --- /dev/null +++ b/org.eclipse.help.webapp/src/org/eclipse/help/internal/webapp/data/LinksData.java @@ -0,0 +1,120 @@ +/******************************************************************************* + * Copyright (c) 2000, 2005 IBM Corporation and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.help.internal.webapp.data; +import javax.servlet.*; +import javax.servlet.http.*; + +import org.eclipse.help.*; +import org.eclipse.help.internal.*; + +/** + * Helper class for linksView.jsp initialization + */ +public class LinksData extends RequestData { + + // Request parameters + private String topicHref; + private String selectedTopicId = ""; //$NON-NLS-1$ + + // list of related links + private IHelpResource[] links; + + /** + * Constructs data for the links page. + * + * @param context + * @param request + */ + public LinksData(ServletContext context, HttpServletRequest request, + HttpServletResponse response) { + super(context, request, response); + this.topicHref = request.getParameter("topic"); //$NON-NLS-1$ + if (topicHref != null && topicHref.length() == 0) + topicHref = null; + + if (isLinksRequest()) + loadLinks(); + } + + /** + * Returns true when there is a search request + * + * @return boolean + */ + public boolean isLinksRequest() { + return (request.getParameter("contextId") != null); //$NON-NLS-1$ + } + + /** + * Return the number of links + * + * @return int + */ + public int getLinksCount() { + return links.length; + } + + public String getSelectedTopicId() { + return selectedTopicId; + } + + public String getTopicHref(int i) { + return UrlUtil.getHelpURL(links[i].getHref()); + } + + public String getTopicLabel(int i) { + return UrlUtil.htmlEncode(links[i].getLabel()); + } + + public String getTopicTocLabel(int i) { + IToc toc = findTocForTopic(links[i].getHref()); + if (toc != null) + return UrlUtil.htmlEncode(toc.getLabel()); + return ""; //$NON-NLS-1$ + } + + /** + * Finds a topic in a toc or within a scope if specified + */ + private IToc findTocForTopic(String href) { + IToc[] tocs = HelpPlugin.getTocManager().getTocs(getLocale()); + for (int i = 0; i < tocs.length; i++) { + ITopic topic = tocs[i].getTopic(href); + if (topic != null) + return tocs[i]; + } + return null; + } + + private void loadLinks() { + + String contextId = request.getParameter("contextId"); //$NON-NLS-1$ + IContext context = HelpSystem.getContext(contextId); + if (context == null) { + links = new IHelpResource[0]; + return; + } + links = context.getRelatedTopics(); + if (links == null) { + links = new IHelpResource[0]; + return; + } + + for (int i = 0; i < links.length; i++) { + // the following assume topic numbering as in linksView.jsp + if (links[i].getHref().equals(topicHref)) { + selectedTopicId = "a" + i; //$NON-NLS-1$ + break; + } + } + } + +} diff --git a/org.eclipse.help.webapp/src/org/eclipse/help/internal/webapp/data/PrintData.java b/org.eclipse.help.webapp/src/org/eclipse/help/internal/webapp/data/PrintData.java new file mode 100644 index 000000000..3fdb09d6f --- /dev/null +++ b/org.eclipse.help.webapp/src/org/eclipse/help/internal/webapp/data/PrintData.java @@ -0,0 +1,260 @@ +/******************************************************************************* + * Copyright (c) 2007 IBM Corporation and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.help.internal.webapp.data; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.Reader; +import java.io.Writer; +import java.util.StringTokenizer; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import javax.servlet.ServletContext; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.eclipse.help.HelpSystem; +import org.eclipse.help.IToc; +import org.eclipse.help.ITopic; +import org.eclipse.help.internal.HelpPlugin; +import org.eclipse.help.internal.search.HTMLDocParser; +import org.eclipse.help.internal.webapp.HelpWebappPlugin; + +/* + * Used by the print jsp to access print-related data. + */ +public class PrintData extends RequestData { + + // where to inject the section numbers + private static final Pattern PATTERN_HEADING = Pattern.compile("[\\s]*?([\\w])", Pattern.MULTILINE | Pattern.DOTALL | Pattern.CASE_INSENSITIVE); //$NON-NLS-1$ + + // to normalize external links to new base href + private static final Pattern PATTERN_LINK = Pattern.compile("(src|href)=\"(.*?\")", Pattern.MULTILINE | Pattern.DOTALL | Pattern.CASE_INSENSITIVE); //$NON-NLS-1$ + + /* + * Constructs the print data for the given request. + */ + public PrintData(ServletContext context, HttpServletRequest request, HttpServletResponse response) { + super(context, request, response); + } + + /* + * Returns the overall topic's title. + */ + public String getTitle() { + return getTopic().getLabel(); + } + + /* + * Returns the href of the toc containing the topic(s) to print. + */ + public String getTocHref() { + return getToc().getHref(); + } + + /* + * Returns the href of the root topic to print. + */ + public String getTopicHref() { + return getTopic().getHref(); + } + + /* + * Generates and outputs a table of contents div with links. + */ + public void generateToc(Writer out) throws IOException { + out.write("
      "); //$NON-NLS-1$ + out.write("

      "); //$NON-NLS-1$ + out.write(getTitle()); + out.write("

      "); //$NON-NLS-1$ + out.write("

      "); //$NON-NLS-1$ + out.write(ServletResources.getString("TocHeading", request)); //$NON-NLS-1$ + out.write("

      "); //$NON-NLS-1$ + out.write("
      "); //$NON-NLS-1$ + ITopic topic = getTopic(); + ITopic[] subtopics = topic.getSubtopics(); + for (int i=0;i"); //$NON-NLS-1$ + out.write("
      "); //$NON-NLS-1$ + } + + /* + * Auxiliary method for recursively generating table of contents div. + */ + private void generateToc(ITopic topic, String sectionId, Writer out) throws IOException { + out.write("
      2 ? "sub" : "") + "entry\">"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ + out.write(sectionId + ". " + "" + topic.getLabel() + ""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ + ITopic[] subtopics = topic.getSubtopics(); + for (int i=0;i"); //$NON-NLS-1$ + } + + /* + * Generates the content to print (the merged topics). + */ + public void generateContent(Writer out) throws IOException { + generateContent(getTopic(), null, out); + } + + /* + * Auxiliary method for recursively generating print content. + */ + private void generateContent(ITopic topic, String sectionId, Writer out) throws IOException { + String href = topic.getHref(); + if (href != null) { + // get the topic content + String pathHref = href.substring(0, href.lastIndexOf('/') + 1); + String baseHref = "http://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath() + "/topic" + pathHref; //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$ + String content = getContent(href, locale); + + // root topic doesn't have sectionId + if (sectionId != null) { + content = injectHeading(content, sectionId); + } + content = normalizeHrefs(content, baseHref); + out.write(content); + } + ITopic[] subtopics = topic.getSubtopics(); + for (int i=0;i" + sectionId + ". "; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + return content.substring(0, matcher.start(1)) + heading + content.substring(matcher.start(1)); + } + return content; + } + + /* + * Normalizes all external links since we're not at the same base href as the + * topics we're printing. + */ + private String normalizeHrefs(String content, String baseHref) { + StringBuffer buf = new StringBuffer(); + Matcher matcher = PATTERN_LINK.matcher(content); + int prev = 0; + while (matcher.find()) { + buf.append(content.substring(prev, matcher.start(2))); + buf.append(baseHref); + buf.append(matcher.group(2)); + prev = matcher.end(); + } + buf.append(content.substring(prev)); + return buf.toString(); + } + + /* + * Returns the string content of the referenced topic in UTF-8. + */ + private String getContent(String href, String locale) { + InputStream in = HelpSystem.getHelpContent(href, locale); + StringBuffer buf = new StringBuffer(); + if (in != null) { + try { + String charset = HTMLDocParser.getCharsetFromHTML(in); + if (charset == null) { + charset = "UTF-8"; //$NON-NLS-1$ + } + in = HelpSystem.getHelpContent(href, locale); + Reader reader = new BufferedReader(new InputStreamReader(in, charset)); + char[] cbuf = new char[4096]; + int num; + while ((num = reader.read(cbuf)) > 0) { + buf.append(cbuf, 0, num); + } + } + catch (Exception e) { + String msg = "Error retrieving print preview content for " + href; //$NON-NLS-1$ + HelpWebappPlugin.logError(msg, e); + } + finally { + try { + in.close(); + } + catch (Exception e) {} + } + } + return buf.toString(); + } + + /* + * Returns the toc containing the selected topic(s). + */ + private IToc getToc() { + String tocParam = request.getParameter("toc"); //$NON-NLS-1$ + if (tocParam != null && tocParam.length() > 0) { + return HelpPlugin.getTocManager().getToc(tocParam, getLocale()); + } + String topicParam = request.getParameter("topic"); //$NON-NLS-1$ + if (topicParam != null && topicParam.length() > 0) { + if (topicParam.startsWith("/../nav/")) { //$NON-NLS-1$ + String navPath = topicParam.substring(8); + StringTokenizer tok = new StringTokenizer(navPath, "_"); //$NON-NLS-1$ + int index = Integer.parseInt(tok.nextToken()); + return HelpPlugin.getTocManager().getTocs(getLocale())[index]; + } + IToc[] tocs = HelpPlugin.getTocManager().getTocs(getLocale()); + for (int i=0;i 0) { + if (topicParam.startsWith("/../nav/")) { //$NON-NLS-1$ + String navPath = topicParam.substring(8); + StringTokenizer tok = new StringTokenizer(navPath, "_"); //$NON-NLS-1$ + int index = Integer.parseInt(tok.nextToken()); + ITopic topic = HelpPlugin.getTocManager().getTocs(getLocale())[index].getTopic(null); + while (tok.hasMoreTokens()) { + index = Integer.parseInt(tok.nextToken()); + topic = topic.getSubtopics()[index]; + } + return topic; + } + else { + IToc[] tocs = HelpPlugin.getTocManager().getTocs(getLocale()); + for (int i=0;i 0) { + wsmgr.setCurrentWorkingSet(""); //$NON-NLS-1$ + } + } + + /** + * Call the search engine, and get results or the percentage of indexed + * documents. + */ + private void loadSearchResults() { + try { + SearchProgressMonitor pm = SearchProgressMonitor + .getProgressMonitor(getLocale()); + if (pm.isDone()) { + this.indexCompletion = 100; + SearchResults results = createHitCollector(); + BaseHelpSystem.getSearchManager().search(createSearchQuery(), + results, pm); + hits = results.getSearchHits(); + if (hits == null) { + HelpWebappPlugin + .logWarning("No search results returned. Help index is in use."); //$NON-NLS-1$ + } + else { + if (isShowCategories()) { + Arrays.sort(hits, new SearchResultComparator()); + } + } + return; + } + // progress + indexCompletion = pm.getPercentage(); + if (indexCompletion >= 100) { + // 38573 We do not have results, so index cannot be 100 + indexCompletion = 100 - 1; + } + return; + } catch (QueryTooComplexException qe) { + queryException = qe; + } catch (Exception e) { + this.indexCompletion = 0; + } + + } + + private ISearchQuery createSearchQuery() { + String fieldSearchStr = request.getParameter("fieldSearch"); //$NON-NLS-1$ + boolean fieldSearch = fieldSearchStr != null ? new Boolean( + fieldSearchStr).booleanValue() : false; + return new SearchQuery(searchWord, fieldSearch, new ArrayList(), + getLocale()); + } + + private SearchResults createHitCollector() { + WorkingSet[] workingSets; + if (request.getParameterValues("scopedSearch") == null) { //$NON-NLS-1$ + // scopes are working set names + workingSets = getWorkingSets(); + } else { + // scopes are books (advanced search) + workingSets = createTempWorkingSets(); + } + + int maxHits = 500; + String maxHitsStr = request.getParameter("maxHits"); //$NON-NLS-1$ + if (maxHitsStr != null) { + try { + int clientmaxHits = Integer.parseInt(maxHitsStr); + if (0 < clientmaxHits && clientmaxHits < 500) { + maxHits = clientmaxHits; + } + } catch (NumberFormatException nfe) { + } + } + return new SearchResultFilter(workingSets, maxHits, getLocale()); + } + + /** + * @return WorkingSet[] or null + */ + private WorkingSet[] getWorkingSets() { + String[] scopes = request.getParameterValues("scope"); //$NON-NLS-1$ + if (scopes == null) { + return null; + } + // confirm working set exists and use it + ArrayList workingSetCol = new ArrayList(scopes.length); + for (int s = 0; s < scopes.length; s++) { + WorkingSet ws = wsmgr.getWorkingSet(scopes[s]); + if (ws != null) { + workingSetCol.add(ws); + } + } + if (workingSetCol.size() == 0) { + return null; + } + return (WorkingSet[]) workingSetCol + .toArray(new WorkingSet[workingSetCol.size()]); + } + + /** + * @return WorkingSet[] or null + */ + private WorkingSet[] createTempWorkingSets() { + String[] scopes = request.getParameterValues("scope"); //$NON-NLS-1$ + if (scopes == null) { + // it is possible that filtering is used, but all books are + // deselected + return new WorkingSet[0]; + } + if (scopes.length == HelpPlugin.getTocManager().getTocs(getLocale()).length) { + // do not filter if all books are selected + return null; + } + // create working set from books + ArrayList tocs = new ArrayList(scopes.length); + for (int s = 0; s < scopes.length; s++) { + AdaptableToc toc = wsmgr.getAdaptableToc(scopes[s]); + if (toc != null) { + tocs.add(toc); + } + } + AdaptableToc[] adaptableTocs = (AdaptableToc[]) tocs + .toArray(new AdaptableToc[tocs.size()]); + WorkingSet[] workingSets = new WorkingSet[1]; + workingSets[0] = wsmgr.createWorkingSet("temp", adaptableTocs); //$NON-NLS-1$ + return workingSets; + } + + public String getQueryExceptionMessage() { + if (queryException == null) { + return null; + } + return ServletResources.getString("searchTooComplex", request); //$NON-NLS-1$ + } + + /* + * Filters out results that help doesn't know how to open (i.e. those hits + * that implement ISearchEngineResult2 and canOpen() returns true. + */ + private static class SearchResultFilter extends SearchResults { + public SearchResultFilter(WorkingSet[] workingSets, int maxHits, String locale) { + super(workingSets, maxHits, locale); + } + public void addHits(List hits, String highlightTerms) { + List filtered = new ArrayList(); + Iterator iter = hits.iterator(); + while (iter.hasNext()) { + Object obj = iter.next(); + if (!(obj instanceof ISearchEngineResult2 && ((ISearchEngineResult2)obj).canOpen())) { + filtered.add(obj); + } + } + super.addHits(filtered, highlightTerms); + } + } + + private static class SearchResultComparator implements Comparator { + public int category(Object element) { + if (element instanceof ISearchEngineResult) { + ISearchEngineResult r = (ISearchEngineResult)element; + IHelpResource c = r.getCategory(); + if (c!=null) { + String label = c.getLabel(); + if (label.length()==0) + return 10; + return 5; + } + } + return 0; + } + + public int compare(Object e1, Object e2) { + int cat1 = category(e1); + int cat2 = category(e2); + if (cat1 != cat2) { + return cat1 - cat2; + } + ISearchEngineResult r1 = (ISearchEngineResult)e1; + ISearchEngineResult r2 = (ISearchEngineResult)e2; + IHelpResource c1 = r1.getCategory(); + IHelpResource c2 = r2.getCategory(); + if (c1 != null && c2 != null) { + int cat = c1.getLabel().compareToIgnoreCase(c2.getLabel()); + if (cat != 0) { + return cat; + } + } + float rank1 = ((ISearchEngineResult)e1).getScore(); + float rank2 = ((ISearchEngineResult)e2).getScore(); + if (rank1 - rank2 > 0) { + return -1; + } + else if (rank1 == rank2) { + return 0; + } + else { + return 1; + } + } + } +} diff --git a/org.eclipse.help.webapp/src/org/eclipse/help/internal/webapp/data/ServletResources.java b/org.eclipse.help.webapp/src/org/eclipse/help/internal/webapp/data/ServletResources.java new file mode 100644 index 000000000..ff94f2243 --- /dev/null +++ b/org.eclipse.help.webapp/src/org/eclipse/help/internal/webapp/data/ServletResources.java @@ -0,0 +1,131 @@ +/******************************************************************************* + * Copyright (c) 2000, 2006 IBM Corporation and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.help.internal.webapp.data; + +import java.util.*; + +import javax.servlet.http.*; + +import org.eclipse.help.internal.base.HelpBasePlugin; +import org.eclipse.help.internal.webapp.*; + +/** + * Uses a resource bundle to load images and strings from a property file in a + * documentation plugin + */ +public class ServletResources { + + /** + * Resources constructor. + */ + protected ServletResources() { + super(); + } + + public static String getConfirmShowAllExplanation(HttpServletRequest request) { + String message = HelpBasePlugin.getActivitySupport().getShowAllMessage(); + if (message==null) + message = getString("confirmShowAllExplanation", request); //$NON-NLS-1$ + return message; + } + + /** + * Returns a string from a property file. It uses 'name' as a the key to + * retrieve from the webapp.properties file. + * + * @param request + * HttpServletRequest or null; default locale will be used if + * null passed + */ + public static String getString(String name, HttpServletRequest request) { + String property = WebappResources.getString(name, UrlUtil.getLocaleObj( + request, null)); + if (property == null || property.length() <= 0) { + return property; + } + int amp = property.indexOf('&'); + if (amp <0 || amp >= property.length() - 1) { + return property; + } + return property.substring(0, amp) + + property.substring(amp + 1, property.length()); + } + + /** + * Returns a string from a property file. It uses 'name' as a the key to + * retrieve from the webapp.properties file. + * + * @param request + * HttpServletRequest or null; default locale will be used if + * null passed + */ + public static String getString(String name, String replace0, + HttpServletRequest request) { + String property = WebappResources.getString(name, UrlUtil.getLocaleObj( + request, null), replace0); + if (property == null || property.length() <= 0) { + return property; + } + int amp = property.indexOf('&'); + if (amp <0 || amp >= property.length() - 1) { + return property; + } + return property.substring(0, amp - 1) + + property.substring(amp + 1, property.length()); + } + /** + * Returns a string from a property file, with underlined access key. Access + * key can be specified in the label by &: character following character + * in the label that is to serve as access key It uses 'name' as a the key + * to retrieve from the webapp.properties file. + * + * @param request + * HttpServletRequest or null; default locale will be used if + * null passed + */ + public static String getLabel(String name, HttpServletRequest request) { + String property = WebappResources.getString(name, UrlUtil.getLocaleObj( + request, null)); + if (property == null || property.length() <= 0) { + return property; + } + int amp = property.indexOf('&'); + if (amp <0 || amp >= property.length() - 1) { + return property; + } + return property.substring(0, amp) + + "" //$NON-NLS-1$ + + property.charAt(amp+1) + "" //$NON-NLS-1$ + + property.substring(amp + 2, property.length()); + } + + /** + * Returns access key for a named label from property file. It uses 'name' + * as a the key to retrieve from the webapp.properties file. + * + * @param request + * HttpServletRequest or null; default locale will be used if + * null passed + */ + public static String getAccessKey(String name, HttpServletRequest request) { + String property = WebappResources.getString(name, UrlUtil.getLocaleObj( + request, null)); + if (property == null || property.length() <= 0) { + return null; + } + int amp = property.indexOf('&'); + if (amp <0 || amp >= property.length() - 1) { + return null; + } + return ("" + property.charAt(amp +1)).toLowerCase(Locale.ENGLISH); //$NON-NLS-1$ + } + +} diff --git a/org.eclipse.help.webapp/src/org/eclipse/help/internal/webapp/data/TocData.java b/org.eclipse.help.webapp/src/org/eclipse/help/internal/webapp/data/TocData.java new file mode 100644 index 000000000..399c04e6d --- /dev/null +++ b/org.eclipse.help.webapp/src/org/eclipse/help/internal/webapp/data/TocData.java @@ -0,0 +1,730 @@ +/******************************************************************************* + * Copyright (c) 2000, 2007 IBM Corporation and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.help.internal.webapp.data; + +import java.io.IOException; +import java.io.Writer; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.Iterator; +import java.util.List; +import java.util.StringTokenizer; + +import javax.servlet.ServletContext; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.eclipse.help.IToc; +import org.eclipse.help.ITopic; +import org.eclipse.help.UAContentFilter; +import org.eclipse.help.internal.HelpPlugin; +import org.eclipse.help.internal.base.HelpBasePlugin; +import org.eclipse.help.internal.base.HelpEvaluationContext; +import org.eclipse.help.internal.base.remote.RemoteHelp; + +/** + * Helper class for tocView.jsp initialization + */ +public class TocData extends ActivitiesData { + // maximum number of topics in a book for generating all topics at once + private static int loadBookAtOnceLimit; + // suggested number of topic levels for large books + private static int dynamicLoadDepths; + // maximum number of topics generated when loading levels dynamically + // above which dynamicLoadDepths is ignored, the rest of branches will be 1 + // deep + private static int honorLevelsLimit; + + // Request parameters + private String tocParameter; + private String topicHref; + + // help form of selected topic href + private String topicHelpHref; + // Selected TOC + private int selectedToc; + // path from TOC to the root topic of the TOC fragment + private int[] rootPath = null; + // path from TOC to the selected topic, excluding TOC; + private ITopic[] topicPath = null; + // Number of topics generated so far + private int topicsGenerated = 0; + + // List of TOC's, unfiltered + private IToc[] tocs; + // List of TOC's, filtered by roles + //private IToc[] filteredTocs; + + // images directory + private String imagesDirectory; + + /** + * Constructs the xml data for the contents page. + * + * @param context + * @param request + */ + public TocData(ServletContext context, HttpServletRequest request, + HttpServletResponse response) { + super(context, request, response); + if (dynamicLoadDepths < 1) { + WebappPreferences pref = new WebappPreferences(); + loadBookAtOnceLimit = pref.getBookAtOnceLimit(); + dynamicLoadDepths = pref.getLoadDepth(); + honorLevelsLimit = loadBookAtOnceLimit / 4; + } + + this.tocParameter = request.getParameter("toc"); //$NON-NLS-1$ + this.topicHref = request.getParameter("topic"); //$NON-NLS-1$ + if (tocParameter != null && tocParameter.length() == 0) + tocParameter = null; + if (topicHref != null && topicHref.length() == 0) + topicHref = null; + + String anchor = request.getParameter("anchor"); //$NON-NLS-1$ + if (topicHref != null && anchor != null) { + topicHref = topicHref + '#' + anchor; + } + // initialize rootPath + String pathStr = request.getParameter("path"); //$NON-NLS-1$ + if (pathStr != null && pathStr.length() > 0) { + String[] paths = pathStr.split("_", -1); //$NON-NLS-1$ + int[] indexes = new int[paths.length]; + boolean indexesOK = true; + for (int i = 0; i < paths.length; i++) { + try { + indexes[i] = Integer.parseInt(paths[i]); + } catch (NumberFormatException nfe) { + indexesOK = false; + break; + } + if (indexesOK) { + rootPath = indexes; + } + } + } + + imagesDirectory = preferences.getImagesDirectory(); + + loadTocs(); + } + + /* + * Counts and returns the number of topics inside the given TOC (all + * descendants, not just subtopics), including the overall book's topic. + */ + private static int countTopics(IToc toc) { + return countTopics(toc.getTopics()) + 1; + } + + /* + * Counts and returns the number of topics in the given array and all + * subtopics. + */ + private static int countTopics(ITopic[] topics) { + int count = topics.length; + for (int i=0;i 0) { + count += countTopics(subtopics); + } + } + return count; + } + + // Accessor methods to avoid exposing help classes directly to JSP. + // Note: this seems ok for now, but maybe we need to reconsider this + // and allow help classes in JSP's. + + public boolean isRemoteHelpError() { + boolean isError = (RemoteHelp.getError() != null); + if (isError) { + RemoteHelp.clearError(); + } + return isError; + } + + public int getTocCount() { + return tocs.length; + } + + public String getTocLabel(int i) { + return tocs[i].getLabel(); + } + + public String getTocHref(int i) { + return tocs[i].getHref(); + } + + public String getTocDescriptionTopic(int i) { + return UrlUtil.getHelpURL(tocs[i].getTopic(null).getHref()); + } + + /* + * Finds a path of ITopics in the given IToc to the given topic. If the + * toc doesn't contain the topic, returns null. + */ + private static ITopic[] getTopicPathInToc(ITopic topicToFind, IToc toc) { + ITopic topics[] = toc.getTopics(); + if (topics != null) { + for (int i=0;i 0) + return UrlUtil.getHelpURL(topicHref); + else + if (selectedToc == -1) + return null; + IToc toc = tocs[selectedToc]; + ITopic tocDescription = toc.getTopic(null); + if (tocDescription != null) + return UrlUtil.getHelpURL(tocDescription.getHref()); + return UrlUtil.getHelpURL(null); + } + + /** + * Returns a list of all the TOC's as xml elements. Individual TOC's are not + * loaded yet. + * + * @return IToc[] + */ + public IToc[] getTocs() { + return tocs; + } + + /** + * Check if given TOC is visible + * + * @param toc + * @return true if TOC should be visible + */ + public boolean isEnabled(int toc) { + if (!isEnabled(tocs[toc])) { + return false; + } + // do not generate toc when there are no leaf topics + return (getEnabledSubtopicList(tocs[toc]).size() > 0); + } + /** + * Check if given TOC is visible + * + * @param toc + * @return true if TOC should be visible + */ + private boolean isEnabled(IToc toc) { + if(!isAdvancedUI()){ + // activities never filtered for basic browsers + return true; + } + return HelpBasePlugin.getActivitySupport().isEnabled(toc.getHref()) && + !UAContentFilter.isFiltered(toc, HelpEvaluationContext.getContext()); + } + + private void loadTocs() { + tocs = HelpPlugin.getTocManager().getTocs(getLocale()); + // Find the requested TOC + selectedToc = -1; + if (tocParameter != null && tocParameter.length() > 0) { + tocs = getTocs(); + for (int i = 0; selectedToc == -1 && i < tocs.length; i++) { + if (tocParameter.equals(tocs[i].getHref())) { + selectedToc = i; + } + } + } else { + // try obtaining the TOC from the topic + selectedToc = findTocContainingTopic(topicHref); + + ITopic topic = findTopic(); + if (topic != null) { + topicPath = getTopicPathInToc(topic, tocs[selectedToc]); + } + } + } + + /** + * Finds a TOC that contains specified topic + * + * @param topic + * the topic href + */ + private int findTocContainingTopic(String topic) { + if (topic == null || topic.equals("")) //$NON-NLS-1$ + return -1; + + int index = topic.indexOf("/topic/"); //$NON-NLS-1$ + if (index != -1) { + topic = topic.substring(index + 6); + } + else { + // auto-generated nav urls, e.g. "/help/nav/0_1_5" + index = topic.indexOf("/nav/"); //$NON-NLS-1$ + if (index != -1) { + // first number is toc index + String nav = topic.substring(index + 5); + index = nav.indexOf('_'); + if (index != -1) { + try { + return Integer.parseInt(nav.substring(0, index)); + } + catch (Exception e) { + // shouldn't happen + } + } + } + } + index = topic.indexOf('?'); + if (index != -1) + topic = topic.substring(0, index); + + if (topic == null || topic.equals("")) //$NON-NLS-1$ + return -1; + + tocs = getTocs(); + // try to find in enabled tocs first + for (int i = 0; i < tocs.length; i++) + if (isEnabled(i)) + if (tocs[i].getTopic(topic) != null) + return i; + // try disabled tocs second + for (int i = 0; i < tocs.length; i++) + if (!isEnabled(i)) + if (tocs[i].getTopic(topic) != null) + return i; + + // nothing found + return -1; + } + /** + * Finds topic in a TOC + * + * @return ITopic or null + */ + private ITopic findTopic() { + String topic = getSelectedTopic(); + if (topic == null || topic.equals("")) //$NON-NLS-1$ + return null; + + int index = topic.indexOf("/topic/"); //$NON-NLS-1$ + if (index != -1) { + topic = topic.substring(index + 6); + } + else { + // auto-generated nav urls, e.g. "/help/nav/0_1_5" + index = topic.indexOf("/nav/"); //$NON-NLS-1$ + if (index != -1) { + String nav = topic.substring(index + 5); + StringTokenizer tok = new StringTokenizer(nav, "_"); //$NON-NLS-1$ + try { + // first number is toc index + index = Integer.parseInt(tok.nextToken()); + ITopic current = getTocs()[index].getTopic(null); + while (tok.hasMoreTokens()) { + index = Integer.parseInt(tok.nextToken()); + current = current.getSubtopics()[index]; + } + return current; + } + catch (Exception e) { + // shouldn't happen + } + } + } + index = topic.indexOf('?'); + if (index != -1) + topic = topic.substring(0, index); + + if (topic == null || topic.equals("")) //$NON-NLS-1$ + return null; + + if (getSelectedToc() < 0) + return null; + IToc selectedToc = getTocs()[getSelectedToc()]; + if (selectedToc == null) + return null; + return selectedToc.getTopic(topic); + } + + /** + * Generates the HTML code (a tree) for a TOC. + * + * @param toc + * @param out + * @throws IOException + */ + public void generateToc(int toc, Writer out) throws IOException { + ITopic[] topics = getEnabledSubtopics(tocs[toc]); + if (topics.length <= 0) { + // do not generate toc when there are no leaf topics + return; + } + + int maxLevels = dynamicLoadDepths; + if (countTopics(tocs[toc]) <= loadBookAtOnceLimit) { + maxLevels = -1; + } + // Construct ID of subtree root + StringBuffer id = new StringBuffer(); + if (rootPath != null) { + // navigate to root topic, skipping parents + for (int p = 0; p < rootPath.length; p++) { + if (id.length() > 0) { + id.append('_'); + } + topics = getEnabledSubtopics(topics[rootPath[p]]); + id.append(rootPath[p]); + } + out.write("
        \n"); //$NON-NLS-1$ //$NON-NLS-2$ + } + + for (int i = 0; i < topics.length; i++) { + String idPrefix = id.toString(); + if (idPrefix.length() > 0) { + idPrefix = idPrefix + "_" + Integer.toString(i); //$NON-NLS-1$ + } else { + idPrefix = Integer.toString(i); + } + + generateTopic(topics[i], out, idPrefix, maxLevels, rootPath == null + ? 0 + : rootPath.length); + } + + if (rootPath != null) { + out.write("
      \n"); //$NON-NLS-1$ + } + + } + + /** + * @param topic + * @param out + * @param maxLevels + * relative number of topic levels to generate (pass <0 for + * inifinite), 1 generates this topic as last level topic + * @param currentLevel + * current level of topic, 0 is first Level under TOC + * @throws IOException + */ + private void generateTopic(ITopic topic, Writer out, String id, + int maxLevels, int currentLevel) throws IOException { + if (maxLevels == 0) { + return; + } + + topicsGenerated++; + if (maxLevels > 1 && topicsGenerated > honorLevelsLimit) { + maxLevels = 1; + } + + ITopic[] topics = getEnabledSubtopics(topic); + boolean hasNodes = topics.length > 0; + + if (hasNodes) { + out.write("
    • "); //$NON-NLS-1$ + out.write(""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ + out.write(""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ + out.write("\"\""); //$NON-NLS-1$ + out.write(UrlUtil.htmlEncode(topic.getLabel())); + out.write(""); //$NON-NLS-1$ + + // is it ancestor of topic to reveal + boolean isAncestor = topicPath != null + && topicPath.length > currentLevel + 1 + && topicPath[currentLevel] == topic; + + if (maxLevels != 1 || isAncestor) { + out.write("