JetSpeed CHANGELOG Last Modified: $Date$ Latest version at: http://www.working-dogs.com/jetspeed/cvsweb/index.cgi/jetspeed/docs/misc/ Author: burton@apache.org ********************************** 1.2b1 *************************************** - Make sure that ALL screens perform initialization so that Jetspeed isn't used in a configuration where it wouldn't be solid. It might be possible to startup Jetspeed in a configuration where it isn't stable. - BUG: The default PortletController is not leaving a space between portlets under Mozilla or IE. Fix this. - BUG: Next does not work on the Channel Browser - BUG: When you try to view a URL that was from the FeedDaemon and has a URI as it's name it shows up as an invalid URL under Apache. - Fix the FeedDaemon to only fetch updated content. - Make the PortletViewerScreen and the PortletInfoScreen use PathInfo: - /servlet/jetspeed/screen/portlets.PortletViewerScreen/portlet/Search - This should fix bugs with using this and
tag and is more elegant. - Integrate Jetspeed Portal Content - Build a GUI for manipulating the content - Ability to browse by topic. - Short circuit "file" scheme URLS so that they are never put in the PersistentDocument cache. This should allow less complicated caching and we don't get any advantage to putting them there. - move all castor generated APIs to org.apache.jetspeed.xml.api - Better handle file not found Exceptions here: Exception: java.io.FileNotFoundException: /tmp/JetspeedDocumentCache\file..tmp.JetspeedDocumentCache\http..trinidad......80..content..dynamic..index....xml Stack Trace follows: java.io.FileNotFoundException: /tmp/JetspeedDocumentCache\file..tmp.JetspeedDocumentCache\http..trinidad......80..content..dynamic..index....xml at java.io.FileOutputStream.(FileOutputStream.java:61) at org.apache.jetspeed.cache.PersistentDocument.getRemoteFile(PersistentDocument.java:360) - Include support for refreshing Factory instance stores once they are parsed out. IE defaultPortlets.xml shouldn't just sit there forever if you modify it. It should try to find out if there is a new version or you could manually refresh it through a control panel item. (carefull. Might need a synchonized access call here. Just synchronize around the instance though) - Improve documentation with this suggestion. It basically involves doing a map of logic processing within Jetspeed (UML here). "A lot of Jetspeed has nothing to do with XML. By the time it gets to the API level, it's all pretty abstract. But, for somebody who doesn't know Turbine, Village, Castor, or ECS, what exactly is going on? First, a glossary of basic terms. Then a description of what processing actually takes place when Turbine starts up. Something like a roadmap of how the different branches of the API work together. It will be a nice complement to the descriptions of the components that the existing Turbine and Jetspeed documentation provide." - Make PortletConfig.getRunData() deprecated - any time you encounter the MarshalException make sure to output the content it couldn't marshal against. - Rework PersistentDocumentDaemon and FeedDaemon as daemon - rework the FeedDaemon (and all daemons) to be Runnable and not a Thread - Update libraries with the newest: - Castor 0.8.0 - Xalan 0.20.0 - Xerces 1.0.3 - Cocoon 1.7.2 - Should we get rid of feeds.xml and just put them in JetspeedResources? - Improve the CacheHandleManager to work with property values so that these are part of the handle that is used when placed into the cache. Right now if you have two portlets and they each have the same class and URL but different properties then they won't get two cache entries but will merge - Migration of PersistentDocumentDaemon - DiskCacheDaemon and update of docs - Migrate all APIs that return Portlet[] to return a PortletSet which encapsulates that array. This way we can build in future options like page configuration on the PortletController. This should also speed performance slightly as there would be no more vector creation/modification and less garbage collection. - In the daemon control panel make sure to add support for manually starting and refresing them. - Content feeds are currently broken. Why is it writing two entries? - Rework all Portlets so that they use methods from AbstractPortlet and reuse as much code as possible. - Within PortletControl have getTitle return a ConcreteElement - set the title to this.getPortlet().getTitle() - Change the parameters obtained from PortletMarkup and are in PortletConfig to getInitParameters() and the HTTP params to getParameters() - "file://" URLs are still getting put in the DiskCache. Make sure that this is cleaned up. - Also provide a central way to override title and description - Do this in DefaultPortletControl - Do description in the PortletFactory - Consider removing the PortletConfig from the Portlet.init() method... this can get confusing for new people - Try to remove the method: PortletConfig.getMetaData() and only allow the Factories to have access to this information. - I am not happy with this either. The metainfo really isn't needed anymore. I reworked the PortletFactory to force titles/descriptions on the Portlet after it was instantiated so that the user can override the title and description if we want. There shouldn't be any need for this anymore. I will put it in the TODO. - Allow the navigations within Jetspeed to be swapped out via properties - It appears there is a thread locking the FeedDaemon. Find what is keeping the PortletBrowser from working with jetspeed once the FeedDaemons are run. Reduce the lock ganularity within the daemons and look over this situation again. - Rework the way objects are initialized so that they are marked as initialized and placed into the SingletonHolder - Implement a mechanism for marking URLs as "bad". Basically the first time a URL can not be fetched because it throws an Exception place it in a "bad URL store". The DiskCache should check if the URL it want's is in the "bad URL store" before returning it. If the URL is in the "bad URL store" then throw an IOException right away. Then have a BadURLUpdater which is a Thread that would run at a given interval and update this cache. When the site becomes available *then* bring it locally. - When the PortletFactory encounters a Portlet that it wants expired, don't expire it right away. Simply add this to a queue - "Preview" on the portlet browser should actually go to the "edit" screen" - Convert the PortletBrowser over to XSP - remove the old PortletBrowser when the new one is working really good - Make the BadURLManager persistent and when it calls init() have it load its bad URLs from disk. - Figure out how to handle Portlet Parameters as well as Servlet Parameters. - the problem is that the Servlet API could have some parameters and then the portlet could also have some parameters in PML. Try to define a seperate API for accessing both. In this manner it should be possible to abstract things so that you don't directly access the Servlet API at all. - Debug what is going on with Cocoon and why it isn't allowing XSP to function. This appears to be a bug within the Cocoon internals and with its actual XSL resource still allowing itself to be null. Bring my own local version of cocoon and put some debug code in there. - Performance BUG: Currently JetspeedDiskCache.getInstance().getEntry() is taking an average of 1.3 seconds to resolve URLs... This is *way* too long. - Have a boolean property defined so that people can run Jetspeed but that it doesn't *require* user authentication. This would just run Jetspeed but never give you the option to logon. - new feature for the disk cache. Add the ability to run without Portlets fetching URLs during runtime. This should increase the performance of Jetspeed when URLs aren't in the disk cache. - Add a new Exception NotFoundInDiskCacheException. This is thrown when a URL is fetched from anywhere but the daemons and there isn't an entry. This is thrown from getEntry() but not add() - (burton) provide a second cache mechanism so that if content isn't in the cache then the DiskCache will NOT try to fetch this. This is used in situations where 100% performance is needed. In this way content will never be fetched by a user. - if the content isn't in the cache then just throw an IOException - FeedDaemon should put its entries into the PortletRegistry - RSS XSL FIX: - Parse out the source XML and then retrieve the Image URL (possibly as a lazy operation) - At this point you should have a DOM tree. Grab the title and the description for this in XML and put this into the Portlet with setTitle and setDescription - Then pass the DOM over to Xalan and it should be able to parse out and build a destination XML document. - At this point remove all the RSS parsing code (Castor and its peers) - Figure out why jetspeed is taking 100% CPU with the recent modifications. - This turned out to be a Cocoon problem where it was creating a high priority thread with too short of a sleep cycle. - Use the PortletFactory to instantiate all known Portlet Entries. - If any throw PortletExceptions then make sure to remove them form the list of entries so that when the user browses the list they don't see these. - Make sure that an Entry with the type of "abstract" can't be instantiated. - PortletBrowser should only use instance and ref types - Portlet bulk instantiation FIX: - build in the ContentNotAvailableException which extends IOException when content is not in the cache. If it *is* in the cache then do nothing but if it isn't then create a low priority thread to update the cache. - You can now have a linear instantiation algorithm. It should be predictable and won't stall out due to URLs that aren't available. - Also add in some logging information which can help the user figure out what is going on. - Get the PortletRegistry "Entry" unification fix into CVS and then make sure this works. - it is important that Jetspeed (STOP/synchronize) operation until it is initialized. This is required so that all objects are setup. If this doesn't happen we will bet NPEs everywhere. - PortletBrowser: Have a search option - Editing of Portlets does not work. When you try to edit the JCM it throws an NPE. When it does work content isn't aligned correctly - When the FeedDaemon is running it appears that for some reason it is locking up the JVM. Put it into debug and see if there is any Thread contention. - Fix portlet editing so that it works for all users. - Fix bug that causes normalization() not to work with Entries - Add a Logout entry to Jetspeed - BUG: When the PortletRegistry gets updated on disk, don't flush the whole thing (replace this.registry with a new var). Instead merge the two. - Integrate Jyves user creation mechanism in Jetspeed. - Make sure that logon and then customize still works. - Make sure you can still replicate content to AvantGo - rework the navigation so that "Add channels" and "preferences", etc are always available. These should point to XSP apps - Remove layout information from the portlets info when placing an object into the cache (CacheHandleManager) - Don't let PortletInfoPortlet become browsable. - get XSP to work under Tomcat - FileServerPortlet should expire itself if it's on disk content changes. - Rework the way RSSPortlet is expired - only expire it when its on-disk content has changed - Use URLConnection.getLastModified() from withing the FeedDaemon to *only* update content that is newer than what is in the disk cache. - Add a getCreationTime() (or similar method) that can be used with the Portlet so that it can determine when it was created. Use this info as metadata within most PortletControls and put it at the bottom of the content. ********************************** 1.1 ***************************************** - Finish up integration of the PortletBrowser - Developer docs - Add Portlet caching issues within the docs: - All portlets are cached with their portlet config - tell them how to tweak their expiration and how to turn off caching,. - Portlets can turn off caching if it would make no sense to do so: mail applications, etc - updated Jetspeed logo on website - the "use jetspeed now" link should mention that it is a beta version and may not currently be working - remove XSP portlet until 1.1 - Fix the problem with feeds. Currently they are broken. Why are they not getting processed. ... now using Xalan directly. - fix edit and maximize images - secure the admin page - Add ECS 1.3 - Remove my old elements - Clean up configuration file: - All URL based params should be property.url - All File based params should be property.file - Get rid of the multiple PortletController, etc definitions portletcontroller.defaultinstance=org.apache.jetspeed.portal.DefaultPortletController defaultportletcontrol.instance=org.apache.jetspeed.portal.DefaultPortletControl should become portletcontroller.default.classname portletmarkup.default=/content/xml/defaultPortlets.xml portlet.default.url=/content/xml/defaultPortlets.xml should become portletmarkup.default.url - Add "Default" entries for all values - Fix up artwork (have a powered by Jetspeed logo) so that it appears on the home page. - Put the FAQ-O-MATIC in the faq. - put number of channel items in the FeedDaemon - don't allow the user to try and process the feeds while they are already processing - Fix the portlet browsing feature. Why isn't this working? - Write a FeedAdminPortlet to show how many Feeds there are and so that you can kick off the daemon - Remove the PortletBrowserPortlet and put this logic into a screen. Way to slow under Netscape. All the porlets should go into a PortletBrowser. - remove the logger from org.apache.jetspeed.util - SingletonHolder - add JetspeedResources - add PortletFactory - add FeedFactory - Caching is currently broken in Jetspeed... all portlets are always added to the cache (only under Linux IBM JDK 1.1.8 is this reproducable) - Fix this so that JDK 1.1.8 doesn't GC the objects... look at the thread for this. - Add a FAQ entry that details that if you are getting MarshalExceptions it could be due to that fact that Cocoon is pre-processing that file and not turning the source document over to Jetspeed. Quote Raphael on this. - Ability to flush the cache without restarting Jetspeed or the servlet engine - Mention something in the requirements section about databases and user authentication. This isn't a requirement. Mention the databases this works with. - have a property to allow user authentication or not. - remove the LDAP option within Cocoon. This is breaking remote installations of Jetspeed that don't have the LDAP classes - Redo the cache infrastucture. - Note: need a better way to get cache handles before their impls are instantiated. - Note: Portlets handles shouldnt be obtained by the AbstractPortlet - Right now the cache is getting 100% misses. Fix this. - improve memory usage stats within Cocoon - Use the CacheHandleManager: - Use this instead of AbstractPortlet - Cacheable.getHandle() should return from CacheHandleManager - Within Cacheable have: String getHandle(); void setHandle(String handle); - then make these final in their abstract implementations - Within PortletFactory if you get a Marshal exception tell the user what file it couldn't marshal - Admin interface - Java Runtime information - Memory Store information - JetspeedProperty information - Add notes within the installation logs about the following exception and that it is because Turbine is within the classpath but Jetspeed isn't - Rework JetspeedResources.properties - should become JetspeedResources.properties. - move SAXPIFilter within the same package as the CocoonRenderer - Specify how to setup content under Tomcat (/webpages) - If an exception happens within Home... put it on the web page. This should help during debuging. - Add "Use Jetspeed" which should point to my home system within the docs. - JetSpeed -> Jetspeed everywhere. ********************************** 1.0 ********************************** - Further abstract Jetspeed runtime: - Place defaultPortlet.xml as a Jetspeed property. - AvantGo synch should have a "Jetspeed Channel" added to it - Build in support to have Jetspeed dump out it's content on a psuedo basis. This can be used to build a static version of a website - http://www.xmltree.com/export/ocs.cfm - subscription support - Broken down tasks for 1.0: - logon to turbine - OCS content feeds - have the default portlets describe better content... the current default portlets never really change. Go through multiple ones an redo defaultPortlets.xml to include these. - ArrayOutOfBoundsException when the BulkDownloader get's to the end - Portlet Feed rules: - the default feed (assuming you don't get one from XMLTree) includes the Jetspeed portlets in defaultPortlets.xml - No locks are ever allowed for more than a few seconds (bulk adding of new portlets). The user should never experience a delay - Make sure that CocoonPortlet test works fine - All content fetcher. This will be used: - when you first setup jetspeed so that XML documents are in the cache - everytime you want to see if new documents are available. - Should load every URL and cache it - Write my own Logon screen for Turbine so that Turbine's is not not displayed to the user. - RSSPortlet needs to refresh itself every hour: refresh.portlet.default - PersistentDocumentDaemon needs to pay attention to its value in JetSpeedResources -> refresh.persistentdocument.default - When you explicity request an individual Portlet from a remote client that hasn't gone to the main page the client isn't returned anything. - PersistentDocumentDaemon: Should fetch every document within the cache and redownload a new version - Plugin/Portlet Application infrastructure - Portlet's can become Portlications by defining within PML. An Application basicially is like a Turbine screen but this setting suggests that it runs only as a single Portlet runnign at 100% of the browser. - Build out Web Application infrastructure... - Add to portlet markup. This will especially be cool for JetSpeed applications. This should allow you to list Web applications and provide a description of what they can do. - If you don't specify a protocol for a Portlet URL (/content/test.html) assume the current server and the current port. Also rewrite defaultPortlets.xml when done. - Ability to refer to a URL in both a local and remote context and it should always figure out the remote. - Avantgo synch not working due to the fact that JetSpeed requires a new session and will redir you to the Home screen - File Server portlet. One that serves files from a remote URL. - ECS element that doesn't do any escaping - Cocoon as a Portlet - Turbine authentication - Home as a Turbine screen - using ECS: - Installing turbine and giving it a servlet name of "jetspeed" and defining it's own configuration. This configuration should point to the default jetspeed screen that I implement as my own code base. - org.apache.jetspeed.Home should be a Turbine screen - File Server portlet. One that serves files from a remote URL. - ECS element that doesn't do any escaping - Cocoon as a Portlet - Rework the PersistentDocument cache to support multiple stores - Don't have RSS images stored remotely... store them locally within the PersistentDocument cache. This should save some client time when loading the image from a Remote URL - Move getTopicBar() to the default navigation. - JetSpeed should work under Apache JServ - Put the turbine RunData within Portlets - Caching isn't working correctly - 1. Throws an Exception within Cocoon - 2. Return's only the default entries.. when they are first cached. - factory for getting the current portlet controller -> PortletControllerFactory - factory for getting Portlets -> PortletFactory - default portlets and their controllers should be set via properties - Improve cache API so that the only thing that can be cached is a Cacheable interface - add String Cacheable.getHandle() method so that this is stored unique within the cache - Tweak them Memory store to take in Cacheable(s) and not just objects. - remove RESOURCES form JetSpeed.java - any definitions should be done with JetSpeedResources - remove legacy code - Specify the width of default portlets within resources - Specify the number of columns within the default porlet controller - Support for adding a JetSpeed portlet to Avantgo to by synched with a handheld device. - Store the portlet cache directory within JetSpeed resources - Don't have PersistentDocument store right to the tmpdir... store the contents within /tmp/ or perhaps a property - Write a LRU based cache based on hitcounts on PortletControls - Portlets that don't throw an exception should be cached. - Remove as many services from JetSpeed.java and use Turbine's features. If these aren't available within Turbine then make them new Turbine features - Write documentation for developing Portlets - Better support for using PortletMarkupLanguage - should have it's own XML Schema - should use castor - Currently right now portlets are getting loaded by the PortletController 3 times... once for each colun. Fix this so that it is only loaded once. - Move all portlet implemtnations under org.jetspeed.apache.portal.portlets - Get JetSpeed configuration from a property file. - org.apache.jetspeed.Home should become a stand alone servlet. - Portlet docs - Make it JDK 1.1 compatible - Vector.toArray should migrate to Vector.copyInto - no System.setProperty() - no add() remove() or get() within Vector - Portlet interface gets an init() method with an optional URL and string settings - Write JavaDoc for developing Portlets - Ant build initiated - Portlets use ECS - RSSPortlet should use Castor generated code - Add image support to RSS serialization. - All portlets no longer use setUrl() and getUrl() - Single document interface - Add castor jars to CVS - Portlet.init() should throw a PortletException so that I can catch this within the renderer and throw back a porlet with error content and an exception string - ALL RSS should render 100%. This should never fail. - Better portlet browsing support - Setup a list of default portlet document for rendering the home page. This shouldn't be hard coded into the application