/** * Alernate mutator for key property. * Used to override ancestor setKey method. */ public void setArticleString(String article) { if (isBlank(article)) setArticle(null); else setArticle(Integer.valueOf(article)); } /** * Alernate accessor for key property. * Used to override ancestor getKey method. */ public String getArticleString() { Integer article = getArticle(); if (article==null) return null; return article.toString(); } [ARTIMUS] [Ordering is LIFO. Last thing done for a day is the first item listed.] TODO: - Add now string for articleInsert - Check with HypersonicSQL - Unit tests 31-DEC-01 --------- + article.http.Form: Change reset to use setters. 06-NOV-01 --------- + Rename article/Model,key/Model to Access (i.e. Data Access). + Update README.txt + Rename ApplicationResources to Resources 30-OCT-01 --------- + article/SearchHours,SearchLast,SearchTitle,SearchProperty: Change check for parameters to occur before call to Model. 27-OCT-01 --------- + wizard/*: Expand additional example code. + */Model,*/sql/Statement: update to use Scaffold StatementUtils, ConnectionPool. + classes/poolman.xml: update for new default resource name. + ConnectionPool, StatementUtils: move to Scaffolding. 26-OCT-01 --------- + keys: add package. + http/ArticleForm: move to article/http/Form. + http/ModelHelper: Move to Scaffold. + sql/ConnectionPool: Move to Scaffold, and add wrapper. 25-OCT-01 --------- + wizard/*: Initial version to test data access routines. + Search/*: Refactor most to subclass SearchProperties. + articles/SearchProperty: initial version. + sql/Statements: rename as StatementUtils. + articles/sql/Commands,Statements: initial versions. + sql/Data: Move most methods to articles/Model + articles/*: Refactor names from "query" to "model. 24-OCT-01 --------- + search/Engine: update to throw QueryExceptions (per LuceneUtil changes). + articles/*: Refactor for changes in Scaffold. + *.jsp: Correct usage of html:html tag. + build.xml: Add WAR to deployment target. 23-OCT-01 --------- + Store: let insert/update exceptions pass thru. + HelperAction: Enhance exception handling to use new ChainedException methods. + Refactor to use Scaffold query package (instead of util). + change "sql.*" tokens to "data.*" 21-OCT-01 --------- + Refactor to use new Scaffold Query* and HelperAction class. 09-OCT-01 --------- + Rename articles to artimus. + Rename ext to scaffold. 08-OCT-01 --------- + AccessBean: refactor getMap(int) method. + AccessBean,AccessBeanList: Add first() method + client: refactor to call performCrud on ancestor. + ext.http.Access: add performCrud method. 27-SEP-01 --------- + Access,AccessBean: General refactoring. + ArticleForm: Remove toMap method in favor of ancestor. + AccessBean: Conform to new DataBeanBase source. + DataBeanBase: Add default behavior for toMap using BeanUtil.describe + Convert MapAccess to DataBean, and refactor. Add getKeyInt,setKeyInt methods. + *: Review and revise Javadoc. 26-SEP-01 --------- + AccessBeanMap: Remove unused class. + AccessBean,AccessBeanList: Remove methods not used in current version of application. + Access,Client: Refactor SaveConfirm method from ancestor Client class. + ArticleHelper: Move call to allocateKey from Access.crud. + ArticleHelper: Add loops around update,insert for multiple forms. + README.TXT: Update for Tomcat 4.0 production release. + ConnectionPool: Eliminate unnecessary statics + build.xml: Add Javadoc targete + com/*: Shorten package name to proweb + src/*: Move source under java, per new conventions. + WEB-INF/pages/*: Move pages to root; add stylesheet. 18-SEP-01 --------- + ApplicationResources: Add missingHTML markup to error tags. + Engine: Update path for index (/var/lucene/articles) + poolman.xml 13-SEP-01 --------- + LuceneUtils 10-SEP-01 --------- + Menu.jsp: Add Create Index button for Lucene. + CreateIndex,Data,Statements,Commands: Add support for Lucene. + ConnectionPool: Add check for null connection. + README.TXT 09-SEP-01 --------- + Render.java: intial version. + ArticleHelper,build.xml,strut.xml,: Add Lucene support. + ArticleForm, CreateTables, web.xml, 26-AUG-01 --------- + ext.search.LucineUtils: initial version. + search.Engine: initial version. + Data: add selectArticle(target) method. + CreateIndex: initial version. + Add lucene.jar to lib 22-AUG-01 --------- + Statements,Data,ArticleHelper: refactor. + ListForm: remove as redundant. + RequestUtils.getCollection: initial version. 20-AUG-01 --------- + AccessBeanMap - initial version + Change ListAccessBean to AccessBeanList + Refactor ResultList as ResultCollection + Change package name to org.apache.struts.artimus 03-AUG-01 --------- + ArticleHelper,Menu: Add support for title, author, content search. + ArticleList: initial version. + Commands: add SQL statments for title,author search. + Statements.getResultsLike: initial version. 02-AUG-01 --------- + TASK: Test revised pages and control flow. All OK, but text search (need to recreate tables). + Access.setDispatch: initial version to maintain DispatchBean property. + Menu.jsp: initial version (should have done this first!). + config: Refactor to implement only what's needed for "Artimus-1". + ext: General refactoring and clean-up. 01-AUG-01 --------- + : Refactor to use DispatchBean interface. + TASK: Refactor classes to use "dispatch" rather than "task" + Data,Statement: Add ResultList version of Select, to return a List. + Data,Statement: Add all String signatures for insert,update. + ListAccessBean: initial version. + TASK: Refactor DataAccess/AccessBean/Access/Helper classes to implement a List rather than a RowSet. Remove dependancies on Iterators for now, since this was causing ConcurrentModificationException's. + DispatchBean,ResultList: intial versions. 31-JUL-01 --------- + TASK: Test input/output. + pages/List,Article: Enable bean, logic, and dbTags libs. + struts-config: update to use Client for Entry mappings. + Helper,Data,Commands: Add CRUD for Entry form. + Form: Update to declare AccessMap interface (methods already implemented). + Helper,Access,AccessMap: Initial version + CreateTables: Revise to call Data.object methods. Remove obsolete dependancies on SQL packages. + Data: initial version. Create high-level wrappers around calls to Statement. + CreateTables: Refactor DAO code into sql/Statements class. + CreateTables: Add insert of starter keys for other tables. Drop, create, test. + CreateTables: Change text to blob and varchar to char, for better compatability. We will be using Lucene for full-text search, and MySQL will change char to varchar anyway. + TASK: test CreateTables. + mysql: create database artimus. 30-JUL-01 --------- + struts-config: Add mapping for CreateTables. + CreateTables,Commands,ConnectionPool,RowSets,Statements: initial versions. + struts-config: update mappings for Form, including welcome and done. + pages/Article,Entry,List: update for Article properties, including field types and lengths. Add data-entry comments from spec. + http/Form: initial version. + Update "spec" (chapter 17) to reflect development changes. 29-JUL-01 --------- + Extended headbanging session with Validator library. The client-side scripts are present but broken. Server-side validation is fine. Posted query to Struts list. Will proceed and return to this later + Draft Article, List, and Entry skeletons. + Test building javadoc (not working?) + Setup build.xml. Create src/build folder. Build skeleton classes. + Setup skeleton pages, forwards, mappings, Form, and Action. + struts-config.xml: Config for MySql, and ready alternate configs for hSQL and postgres. + web.xml: Add default config for validator, validator tags, dbTags. + lib: Place validator.jar, dbTags.jar, and hsqldb.jar under lib. + WEB-INF: Move *.tld's under tablibs; update web.xml + WEB-INF: Create src,doc,taglibs, and pages folders. + ROOT: Create artimus from Struts blank. 28-JUL-01 --------- + doc: Second draft of "spec" as Chapter 17 text. [] dc: title creator subject description contributor date publisher type format identifier (url) source language relation coverage rights ocs: image 88x31 format contentType updatePeriod updateFrequency updateBasis ical: COMPLETED DTEND DUE DTSTART DURATION DTSTAMP LAST-MODIFIED RECUR VEVENT VTODO VJOURNAL eventDateStart eventDateEnd alarmDateStart alarmDataEnd [] // Using Skeletons files with Struts. Integrating Artimus in your own application (artimus.jar) Internationalizing Artimus [] copy skel/View.jsp as ../Article.jsp comment include for bean and logic tags at the top, and browser will ignore them. insert {placeholders} next to bean:write tages where runtime content will go. update the property setting so these will be ready-to-go later. remove right and left columns, so this is a one-column table. add filter="false" to bean:write tag for article. this will output HTML as is, so we can use it in our article. remove form buttons; body onload change paths for local forwards on /Skel mapping to "/WEB-INF/pages/Article.jsp" load and test. reloading mappings. [] copy skel/Result.jsp as ../List.jsp link date,topic,article as plain forwards add forwards,actions to mappings [] copy skel/Form.jsp as ../Entry.jsp change labels, but leave property1..0 adding fowards, actions to mappings. [] package naming - callout box error handlng - log [] Thanks, Hans. We're on the same page now ;-) I imagine you've also looked at the Oracle Portlet? http://otn.oracle.com/products/iportal/htdocs/3_0_8_qt/qt_home.htm http://otn.oracle.com/products/iportal/htdocs/3_0_8_qt/qt_frm.htm http://otn.oracle.com/products/iportal/htdocs/kci/kcihome.html In this context, I was thinking of creating backend "Providers" for things like RSS, and exposing this resource using Tiles as the actual "Portlet" part. == Provides a communication link between the portal services and portlets. Implements session startup and provider login. Acts as a proxy to all portlet calls. Manages the portlet repository list. == I think what I wanted to look at first was an API for what Oracle calls "Providers". http://portalstudio.oracle.com/servlet/page?_pageid=475&_dad=ops&_schema=OPSTUDIO&_mode=3 The idea being that a Provider could be plugged into an Action as a helper class, and wrap up what's needed into a bean to be displayed in a Tile. The Providers could be setup as application resources, the way the Struts ActionMappings are setup, and the way the ValidatorForm configurations and Tiles definitions are setup. At this point, I would look to container-managed security for the users, extending the idea of a database or JDBCRealm to provide single logon for the Providers, and as the basis for a user profile object to store customization options for the view. At this point, some questions occur: Does this intersect with the workflow API proposed to the commons and struts-dev last week? What's the difference between a portlet and a persistant workflow? Are Jakarta portlets to be servlets, the way JSPs are servlets? If not, should they be? Or, from a patterns perspective, are portlets just some kind of helper object? Could some kind of porlet be packaged as a set of ActionMappings, Actions, JSPs, and associated classes, and plunked into the middle of a Struts application? Oracle Portlet Provider -> Struts Action What essential services does a portlet API need to provide? * Discovery * Authorization * Profiles (user customization, skins) * Presentation fragments (scrape) * Resource configuration, application and user (profiles?) Could an abstract PortletProfile object (or interface) be used to manage My initial feeling is that, in a Java MVC environment, a Portlet should be a specialized controller servlet that exposes services to the application's controller servlet through a specific API. The Portlet would expose itself through the ServletContext, where it can be called upon by other servlets in the application. We should be able to load a portlet servlet into any arbitrary application, just as we can load a JSP servlet into any arbitrary application, without modifying the container. [] select donor,fullName,street,postOffice,postalCode,item,name,qtyReceived,market from gavel_donor D,gavel_item I where D.donor=I.donor order by donor; SELECT I.donor,fullName,item,name FROM gavel_item I LEFT OUTER JOIN gavel_donor D ON (I.donor=D.donor) ORDER BY fullName,donor; [] /* public void setNext(Object source) { // java.lang.IllegalAccessException // pop: IllegalAccessException, InvocationTargetException // des: + NoSuchMethodException BeanUtils.populate( this.rows.next(), BeanUtils.describe(source) ); } public void getNext(Object target) { BeanUtils.populate( target, BeanUtils.describe(this.rows.next()) ); } public Map nextToMap() { return BeanUtils.describe(this.rows.next()); } public static void populateBean(Object target, Object source) { BeanUtils.populate( target, BeanUtils.describe(source) ); } */