Jetspeed TODO Last Modified: $Date$ Latest version at: http://www.working-dogs.com/jetspeed/cvsweb/index.cgi/jetspeed/docs Author: burton@apache.org *************************************** TODO *********************************** - remove PortletFactory from CVS - remove xml.peer.registrymarkup classes ****** TEST SUITE TODO ******* - write a test to make sure OCS stream processing works - make sure that jetspeed-config gets processed again when I modify file settings. ****** PSML.NEXT support ***** - DO NOT USE THE SAME INSTANCE OF THE REGISTRIES EVERYWHERE. - Simply most of the factories... there is a *lot* of duplicate code here. Make sure that we clean this up. Especially PortletControlRegistry - make sure that all factories *only* use either *Ref classes or *Entry classes. do not allow classnames, etc. - remove PortletExport from CVS. - org.apache.jetspeed.portal.PortletSet should go away in favor of .psml.peer.PortletSet - write docs on the new jetspeed-config and PSML. This should be how to use this as an API and also how to configure it. - rework JetspeedConfig: - RegistryManager becomes a Singleton based on URL. all REGISTRY classes move to point to JetspeedConfig.getInstance().getRegistryManager() - essentially we need to make all instances of the RegistryManager tied under JetspeedConfig so that we can have multiple JetspeedConfigs... one for each OCS stream. - remove LayoutFactory from .portal.factory - convert the .xml.api.portletmarkup package to .psml - make sure BasePortletSet.init is always called - move around the org.apache.jetspeed.registry package. This should become an org.apache.jetspeed.config.registry package. The org.apache.jetspeed.config should now have a JetspeedConfig object which handles initializing the registry. This way we can further extend the Jetspeed configuration mechanism without having to modify the registry. - move the org.apache.jetspeed.registry.backend package to .factory - setup org.apache.jetspeed.psml package: - .factory ... all factories for PSML operation - move PortletSetFactory to .factory - setup the peer package - put PortletSet within this package - remove registry.xsd from CVS... obsolete - implement profile support - ProfileRegistry support (and put all object in there). - section 4 correctly implemented - implement all easy registry reference mechanisms (PortletRegistry class, etc) - reimplement skins and make sure they work - remove registry.xsd from CVS. - remove portletregistry.psml from CVS - change the PSML implementation around correctly: - root (use namespaces correctly) - portlets -> - home dir should be /users/burton - xmlns set correctly - section 4 correctly implemented - (DONE)port the old PortletRegistry code over to use the new PortletRegistry - (DONE)implement PortletControlRegistry and PortletControllerRegistry - have PSML use the entries within the registry - have the PortletControlFactory and PortletControllerFactory use the registry reference and *not* the classname. ****** HIGH PRIORITY ****** - BUG/FEATURE: In the CocoonPortlet make sure that we put PortletConfig within the ServletRequest. This way an XSP page can get it without creating its own instance of it (which will end up being buggy anyway). - ARCHITECTURE: see if it is possible to remove all explicit package declarations within the API. IE do not refer to any classes with the full name.. org.apache.jetspeed.etc. - MAJOR BUG: Currently Jetspeed doesn't support more than 2 level on PortletEntry inheritence. Since it just normalizes from ref -> ref -> abstract only the first ref will get any values. The second ref will not. The correct way to do this is from abstrace -> ref -> ref on down the chain - BUG in FeedDaemon: > There remains a problem when the FeedDaemon runs twice (it should also be in > the cvs version). The Feeder can not know if a portlet is in the registry, > and both the getPortlet (if it is not) and the addPortlet (if it is) throw > PortletExceptions. So, the second time the feeder runs, it removes all > entries from the registry that are already there. The third time, it puts > them again, and so on... - TODO: Add a test for the DiskCache. Should test local URLs so that NT/UNIX and all JDKs work. IE file:// mapping. - FEATURE: convert all XML parser requests to use JAXP. - BUG: make sure that I can logon with the Hypersonic SQL configuration - Should I create a CapabilityMap entry in PortletConfig??? This would certainly increase performance and since the CapabilityMap never changes... - Fix the Turbine infinite redirect problem. This is still within CVS and it appears to manifest itself when the client can't establish (or doesn't support) session management. This is very important to get this fixed within Jetspeed because the WAP functionality will break if it can't establish a new session as this will infinitely redirect. We will also loose performance here because a new ClientCapabilityMap will have to be created for every new client request - FEATURE: Rework the Channel Browser and Channel Search so that MimeType content is used correctly. - BUG: Many content engines are NOT using the correct getLastModification() or 'Last-Modified' header impl. PHP is a major offender here. It returns the last modification date of the .php file on the filesystem. Therefore this Portlet will *never* get updated. We need to use the OCS XSLT mechanism to build out a deployment expiration mechanism. - We should use the OCS refresh mechanism to dynamically reload this info. There was a PROPOSAL sent to the mailing list. Provide an impl of this if no other is provided. - BUG: if Jetspeed is serving a local URL that is a CGI/dynamic content, it tries to read this from the disk instead of HTTP. We need a failover if the content isn't on disk: This was done for performance reasons. It is much cheaper to fetch this URL from the filesystem instead of the HTTP server. There needs to be some detection code here. - if file exists - use local file - if file does not exist - assume URL is some type of CGI/dynamic content. - if url does not exist allow the webserver to report an error. - BUG: FileServerPortlet doesn't not expire itself when running under Tomcat? - BUG: When running in a new Servlet Context under Tomcat (reported by Neeme Praks): > I have context for jetspeed set to "/jetspeed" and I have my XSP file in > http://myhost/jetspeed/myfile.xml, the physical path is > root-to-tomcat\webapps\jetspeed\myfile.xml (Win2K system). When > resolving the URL to physical, JetspeedDiskCache returns > file://root-to-tomcat/webapps/jetspeed/jetspeed/myfile.xml. > As much as I understand, EngineContext.getInstance().getDocumentRoot() > returns root-to-tomcat\webapps\jetspeed and then the > /jetspeed/myfile.xml from URL is appended to this, resulting in one > extra "jetspeed". Haven't figured a way out yet how to fix this... - Add support to that Jetspeed can resolve its own document root mapping. ****** NORMAL PRIORITY ****** - FEATURE: In MetaData (meta-data) add a "default=boolean" attribute. This is necessary because sometimes you want to use metadata to provide a default title/description but still let a portlet define its own. OCS should use the dublic core metatdata as defaults but still let portlets provide their own... if they don't then we can fall back on the defaults. - We should apply the following patch to ocs.xsl: Index: src/content/xsl/ocs.xsl ================================================================== RCS file: /products/cvs/jetspeed/jetspeed/src/content/xsl/ocs.xsl,v retrieving revision 1.6 diff -r1.6 ocs.xsl 28a29,30 > > 38a41,44 > > <xsl:value-of select="$tit"/> > > 46a53,56 > > <xsl:value-of select="$tit"/> > > - BUG: If the PortletRegistry receives another Application then the Applications Portlet isn't smart enough to realize that its content has changed. It needs to expire itself when another application has been added to PSML - Improve Portlet subcription. You should be able to pick from a couple of generic portlets. Then you should also be able to search from additional portlets using keywords (from OCS) or domain name. - Portlets should have the the ability to be added to a users profile so they when they logon they get their own profile and their own portlets. - Under scripts/sql create an external/turbine and external/jyve directories. Jyve and Turbine should go under both. - FEATURE: Move ClientCapabilityMap string matches into the JetspeedResources.properties file as regexp - BUG: Make the Portlet CapabilityMap have inheritance. This is important so that we can have an abstract RSS-WML Portlet - Take this out into the PortletRegistry... replace all the Mozilla-WML entries, etc with this. - BUG: Make JCM more WAP/XSL/Cocoon friendly by not including the stylesheet within JetspeedResources.properties. Instead, put this within the PSML registry - For 1.2b2 move this over to xml.apache.org - FEATURE: Put portlet editing and maximization in PSML. - FEATURE: Do documentation on JCM for 1.2 - FEATURE: Build in a daemon to syndicate JCM via RSS and OCS ******* REQUIRED DOCUMENTATION FOR 1.2 ******** - Better documentation on the control panel and daemons is required for 1.2 - Document how the PortletRegistry works. - Document properties files better - Document the Daemon package - Document the Admin console - Document how the updated FeedDaemon works - Document how user customization works - ... on JCM, what it is and how to use it. - describe what the bookmarklet does - tell them that it stores the password in clear text - Documentation on how to setup user authentication - Docs and a dist of Turbine for setting up SQL ********************************** 1.2b2 *************************************** - (DONE) ARCHITECTURE: try to move all castor generated code references into one single peer package. The peer-factory package should be a factory and used to obtain references to objects in the registry.peer package - (DONE) in the PortletRegistry... addEntry and removeEntry should throw PortletExceptions - (DONE) FEATURE/BUG: Jetspeed internals (PortletRegistry.getEntry()) was throwing a RuntimeException if default.psml was specifying an entry that was never registered. Rework the PortletRegistry so that it throws a *real* Exception - (DONE) REWORK: rework the way Portlets are viewed: - (DONE) Remove the PortletViewerScreen - (DONE) The Home screen should except: /portlet /portlet-controller as path info. - (DONE) PortletControllerFactory should have a new method: getPortletController( MimeType mimeType )... this will return the default PortletController for the specified mimetype. - (DONE) (BUG): The URLFetcherDownloader wasn't adding content to the DiskCache - (DONE) in Home.java rework WAP/HTML support so that: - (DONE) if non-HTML MimeTypes are used - (DONE) at the begining: turn off Layout (IE: use EmptyLayout) - (DONE) at the end: instead of returning an element, output directly to the Servlet output stream - (DONE) build out a MOTD for Jetspeed so that after users start it they know exactly how to run it. - (DONE) Fix the 'tomcat-build' so that we don't have to go to /servlet/jetspeed but just /jetspeed - (DONE) remove need to build classpath by putting files in WEB-INF/lib - (DONE) BUG: Make sure that portlet property inheritance works. - (DONE) Moreover links seem to fail within Jetspeed. The reason seems to be that if can't figure out that the URL is really in the cache. - (DONE) FEATURE: Fix my Ant build script for the Jetspeed/Tomcat distribution. There should be a target for 'jetspeed-tomcat-dist' - (DONE) Provide a CapabilityMap for Portlets - (DONE) Provide a in PSML. - (DONE) BUG: remove enable.userauthentication. If this is set to false it causes the User object to be null which then throws NPEs during Jetspeeds operation Since a database is now a required component within Jetspeed this shouldn't be a problem. - (DONE) FEATURE: Put all PROPOSALS into CVS as /docs/proposals with STATUS, AUTHOR, etc as a header - (DONE) FEATURE: upgrade to Xerces 1.1.2 and Xalan 1.1 - (DONE) BUG: Make absolute SURE that the DTD for my.netscape.com is NOT getting fetched by Xerces. Try this with the latest version of Xerces and Xalan. - (DONE) FEATURE: ECS performance improvement... is it a waste to continually call output() within ECS. Should I buffer this up? Should ECS internally handle buffering its output with a String? If I have AbstractPortlet have a String named 'content' and a boolean flag named 'dirty' I can have setContent() dynamically generate the correct output. - (DONE) BUG: Have the public.cache.url resolve from a Jetspeed URL resolver (ServerContext?) and remove public.cache.directory... just one more thing to break - (DONE) Put the XML.com jetspeed article within sitebook ********************************** 1.3 ***************************************** - Support the refreshRate in OCS. This should map to the expire mechanism in Jetspeed. We should put this in PSML and we can get the data via XSLT - implement support to dynamically reload: TurbineResources.properties JetspeedResources.properties - When using the DiskCache to fetch a URL... we have been serving it from the local filesystem if this is on LOCALHOST. This is done so that the URL isn't slowed down by being placed in the cache. However it doesn't work for dynamic content.. IE .jsp, .asp, etc. Implement this: We need a regular expression entry within JetspeedResources.properties http.server.dynamic.content=*.jsp http.server.dynamic.content=*.cfm http.server.dynamic.content=*/servlet/* This way we can say that if these URLs are dynamic not to read them from the filesystem. - In PSML rename to - Make all methods that aren't inherited either static or final. This should improve performance on some JVMs... This way the JIT can inline the code because it knows that it doesn't have to worry about inheritance. - Add the ability for a URL to bypass the cache. Maybe: http://www.cnn.com - Add the ability to set a mime type for a url. Maybe: http://localhost/test.gif This would work well for a FileServerPortlet so that it can have an tag For WAP this would work for text/wap or something - Support a configuration interface for Portlets. Provide a mechanism so that you can edit a Portlets init parameters. Use PortletConfig.getInitParameterNames() to figure out what to allow for editing. - Rework the way navigations are used with Turbine/Jetspeed. Make it possible to kill these off via specifying them in the URI. - Write a portlet that allows the USER to input a remote URL into Jetspeed. This URL should have some tags stripped.