Dovetail TODO list
Kevin Gilpin
Last Updated...
Priority
Bug Feature
--- -------
5: crashing usability or functionality must-have
4: data corruption major usability enhancement or major feature
3: incorrect behavior significant
2: annoying nice-to-have
1: no plan no plan
Not all issues are prioritized yet.
BUGS
5:
Need to better document the Test DTD
4:
No JavaDoc for QueryString
Need to verify whether the following are implemented or not. They are all not documented.
site.dtd : query-result/default
site.dtd : cookie-value
site.dtd : style
site.dtd : stored-procedure
site.dtd : required-if
3:
It is still possible to get a value from JDBCQueryResult after next() returns false. I think that there is a bug in the MM JDBC ResultSet.isAfterLast method. See TJDBCQueryResult_1#countRows
Test logging is pretty messy
Un-prioritized:
Java test (TUserSite_*) don't have a clean consistent way of destroying the SQLDatabase connection. They should probably be migrated to JUnit tests which call SQLDatabase.destroy() in the tearDown method
Should verify that links referred to in the <redirect> tags actually exist
Check parameters on JSP pages (session, etc)
SQLDatabase.getErrorColumn doesn't work if there are unique Indexes on the table. I think the best thing to do here would be to figure out how to query the MySQL or other database for the Index information, and use that.
You can't use FormElement.getValue() to get the values of parameters that can't be represented as Strings (e.g. ZIP file byte[]). Instead you have to use IParameterSource form.getContext().getParameterSource()
enum is only supported by generate-schema-mysql.xsl
validate-site.xsl may generate spurious 'cannot find table' messages if some columns in the referenced table do not have a 'displayText' element
validate-site.xsl doesn't check that a query-value specified to a url-parameter actually references a valid query-value
Test defining default values for 'int' parameters and make sure they are type-converted properly
FEATURES
5:
4:
Need a consistent way to perform security checks in Beans, and redirect the user to a login screen if necessary.
- There is a mix of Login redirects and Authorization errors. I think it won't usually matter b/c the page will re-direct to the login screen anyways
- Would be easy to plug in now that the <page> taglib is used everywhere
Definitely need a way to specify a 'query' body which is a fixed enumeration of values, e.g. true/false or 10, 20, 50, 1000
Need a better way to free pages, when a bunch of them are being used within a method.
- Looks like a good way to do this would be to have a generated Page.instance([params], Map, Page parentPage) method, in
which case the newly created page could use parentPage.addOwnedPage(this) to make sure it is freed when parentPage is freed
Check out the Tapestry Logging page, which implements admin of log4j logging
Likewise for ValidatingTextField
I also like how its error messages are localized
Could implement a site-map stylesheet for the site document
- have locations, pages, titles, links
- what kind of layout would you want to see?
- site document doesn't describe static HTML links
- need to add links if you want them to show up
Add a 'new-record' tag to site.qjml, and validate that every column required by the table will have a value
Do the same for 'update-record'
Add a 'search' tag to site.qjml
<search>
<parameter
<rootTable>
<table>ChallengeMatch</table>
<filter>
<column>eventID</column>
<operator>=</operator>
<parameter-value>eventID</parameter-value>
</filter>
<filter>
<column>eventID</column>
<operator>=</operator>
<parameter-value>eventID</parameter-value>
</filter>
<join>
<table>Contestant</table>
<firstColumn>id</firstColumn>
<secondColumn>challengeMatchID</secondColumn>
<join>
<table>Avatar</table>
<firstColumn>id</firstColumn>
<secondColumn>challengeMatchID</secondColumn>
</join>
</join>
<join>
<table>ChallengeMatch</table>
<firstColumn>id</firstColumn>
<secondColumn>id</secondColumn>
<join>
<table>Contestant</table>
<firstColumn>id</firstColumn>
<secondColumn>challengeMatchID</secondColumn>
<join>
<table>Avatar</table>
<firstColumn>avatarID</firstColumn>
<secondColumn>id</secondColumn>
</join>
</join>
</join>
</rootTable>
</search>
Should an un-parseable date return as new Date(), or null or some other kind of error?
Should have an easy way to define a list of choices as a <query>. e.g. instead of doing a database query, just enumerate the values in the site document
All pages should have a 'self' link automatically. Will need to update generate-page.xsl so that links named 'self' are checked to ensure that they are 'toself', and ignored
Need to verify the last-modified-id.tableName attribute value (that it is a real table)
Need a way to test session values against 'null'
Would be cool to have a way to test error messages, e.g. by a regular expression. Seems pretty easy to implement...
Would be cool to automatically generate a Constants class for each Enum column
Need to add validation for form-value
How to make a unified 'value' element, and have link-value, literal-value, cookie-value, etc all be 'types of values'
- Quick4 should make this possible. I think it can be done with Quick3 even
Implement an 'java-expr-value' element that uses JEL to compute a dynamic expression (for example, <java-expr-value>new Date()</java-expr-value>
Add 'date' (not DATETIME) specification to schema.qjml and SQL generation
Support checking/requiring a user login in the site XML
Add 'fileName' attribute to pages so that the name of the file can be different than the name of the element
Handle References properly in test Suite
- meaning generate test data properly for column references
Check and see if color=red is standard HTML (FormElement.renderLabel)
Add & use Page.getTitle()
Add Context.include(Page) or Page.writeHeader() & Page.writeFooter() ( or both )
Implement ILocation.getURL()
Page.java :
and preferences.jsp :
validate that all required input parameters have been supplied to the page
QueryResult.java
a lot of testing of type conversion and access
Parameter.java :
has notion of 'value' and multiple 'defaultValue's. This may be the way that all the Value objects should work
Value.java, FormElement.java, Query.java :
how does this relate to allowing a prioritized list of possible values (e.g. prefer Cookie, then Query)
how about multi-valued values (e.g. an IN clause)
generate-query.xsl :
share getColumnName & getTableName with validate-site
dovetail.qjml : replace 'password=true' syntax with the ability to define and use element rendering templates
generate-form.xsl :
better logging of event processing
generate typed convenience methods for getting parameter values (e.g. getUserIDValue())
generate-form.xsl : Implement base-url actions
DispatchServlet.java : Add the referer URL to DispatchServlet errors. See issue for getReferer
Site.handleException : How to handle errors in Site.handleException? Have e-mail address of administrator? Mail exception to administrator? Specify error message in the Site XML?
validate-site.xsl :
Check that none of the Submit names conflict
share getColumnName & getTableName with generate-query
Maybe allow query elements to be defined on locations?
Generate an output XML document that describes the errors, instead of terminating on error
agonism.util.Utils : Reconcile the Utils trim(), nullify() methods
POSTPONE
Dovetail doesn't support multiple options for a parameter value, e.g. you can't specify muliple ways that a parameter or url-parameter value can be determined
- This is low priority for now, because a page parameter may have a default, which serves as a secondary way to provide a value for the url-parameter
DuplicateKeyException and MissingValueException should be checked exceptions
- The framework handles these almost all the time so it's not a big deal. They are not exposed to the API users
Make the required form-element rendering customizable through a properties file or something
- Done with the taglib. I guess the story is that you can write your own taglibs; they're not complicated
** Doesn't make much sense to have 'link' under url-parameter. should be link-value
Need a way to supply values for database insertion other than hidden form-elements. The problem with form-elements is that the values have to be known at page-rendering time. So for example you can't use them to refer to row IDs that have not been created (e.g. LAST_INSERT_ID())
- The workaround for this is to use a session-value, or define a query that queries for e.g. LAST_INSERT_ID
Implement checking for required parameters in a page (low-priority b/c this should be checked by validate.xsl)
SQLDatabase.java :
implement SafeConnection that releases itself on finalize()
resolve unique lookup of pages & locations (e.g. page 'games' within location 'games')
- requiring unique names makes thigs so much easier
VERIFY
Proof-Read:
JavaDoc for agonism.dovetail.taglibs.Text
JavaDoc for agonism.dovetail.site.Form
Updating a duplicate value using UpdateRecord (should get a nice error, just getting a SQLException right now)
last-modified-id element
Test using AbstractInstance.Update
Exceptions that show up in form tests aren't properly propagated to the system output
Running a test with a ZIP 'isFile' form element
test that you can't use FormElement.getValue() to access the value, b/c FormElement does a String conversion of the data
The behavior of 'default' elements in parameter-value, when the default does not evaluate to anything (e.g. if default is a session variable that may not be set)
form-value
Why does validate-site.xsl fail sometimes if displayText is not specified?
Add Page#getTitle
NewRecord.java
Column.comment
duplicate keys
missing values
Setting NOT NULL string columns to empty string (""). What to do about the fact that the Value objects return "" as a default when there is no value?
FormElement.renderRadioInput(String)
test exceptions (e.g. assertions) thrown by Actions
get the type of a reference column
A FormElement with a value specified in the site document will have a value (which can be inserted into the database) even if the user doesn't supply a value. For example, the radio buttons on survey-ask.jsp
checkbox values stay checked when un-checked by the user and the form is rejected
- I think this has been fixed by null-ing the FORM_DATA in the session before re-saving it after a failed request
DONE
FR [3] : Add 'length' to text input
*** Need to make an HTTP test for Dovetail's ability to save user input when a form error occurs
- Dovetail doesn't do anything special now; since the pages are self-posting, the user input is in the FORM parameters
Have the ConnectionHelper record the stack frame when it was created, so that it can print it out if it is freed in finalize()
Value.java, FormElement.java, Query.java :
how should missing values be reported, as "" or null? what is the protocol & what is an error?
- Have basically reconciled this. Value returns null if the supplied raw value is not parseable. FormElement always returns an empty string if the value is null, so that HTML will render nicely (e.g. won't have the string 'null' written into it)
DB seems to enjoy stuffing bogus values into the database, e.g. unparseable integers and dates
- Changed Insert and Update to do type-conversion and null-checking on parameter values
- Before, an empty String was being passed as an int or Date parameter, and the driver was doing funky things with it
Page.java :
implement a free() method that will free all the page resources
If there are two forms on a page, and you submit one with errors, then the other with no errors, and return to the page, the errors will still show up b/c Form only removes its own errors in postProcess, not all errors
If you submit an invalid date, the form-element is re-populated with the wrong representation (it is not re-formatted back into the right String)
Why aren't the temp files from DoveTail2Java being deleted properly?
- temp files are no longer generated
Add a request-value tag to the site DTD that can be used to access request values. This would be used to construct links that use newly created row IDs
- Have the last-modified-id tag which solves this problem specificall
Change form processing so that forms post to themselves
* - Remove the FORM_DATA_KEY session variable, b/c all posted values will be in form parameters
* - Remove the FORM_ERROR_KEY, b/c the request will be using the same IRequestContext which already has the getErrors() collection
* - Don't redirect when an error occurs
* - Add a page.process(), page.hasBeenRedirected() methods which should be invoked by all JSP pages
* - Don't post PAGE_NAME_INPUT_NAME
* - Don't need to set the agonism.dovetail.IFormData request attribute, b/c the default HttpRequestContext constructor should work fine
- Basically the page should just find out which form has been posted to, and process it. Then it should return true from hasBeenRedirected() if there were any redirections made.
- Could use the Form.preProcess method to do authentication
Test the fancy connection stuff
validate-site.xsl :
Check that none of the form-parameter names conflict
check that form-element and database types match
Check that all query names with in a location are unique (b/c they will generate the same code)
Implement query parameter checking for links
Implement checking parameters in links to make sure that everything that is required is there
validating no conflicts of page/location names
Test UpdateRecord
Implement 'this' as a valid page-ref, so that it is easy to link a page back to itself (e.g. for returnToURL)
Make a page-ref or link automatically handle passing parameters to a page that are passed into the page?
Implement testing of forms
Test DuplicateKeyException with the Column and Value filled it
Incorporate redirection after form processing as a standard action
test : add tests for register.jsp
Form.java : looks like getReferer doesn't include the query parameters in the URL. That could be a problem. Can probably use HttpServletRequest.getQueryString, URL-encode it, and stick it in a form parameter
( I took this to mean that the form submission should include the query parameters passed to the form )
Link.java : Render Link URL parameters
run t-usersite-2.xml
Move NewRecord.java from .db to .site package
test.db.TDuplicateKeyException_1
test/xml/t-usersite-2.xml
agonism.dovetail.test.FormTest
Value.java :
can Boolean.valueOf throw an exception?
no
render checkbox input
Use Insert & MissingValueException from Dovetail
Support multiple values in a url-parameter (e.g. returnToURL=/games/updategamecode.jsp?challengeID=<id>)
How to specify a default for type.size attribute?
move IParameterSource to the db package
Either support multiple schemas in the tests, or merge the test files
You don't really know how weak references are supposed to work.
test getColumnName when columnName=''
QueryValue :
implement
used by Value.parse
tested by TUserSite_3
Column.java :
implement a getTypeID() method that will do the right thing wrt references etc
- pretty much have this with site.Type.parseType
DoveTail2Java :
move to agonism/dovetail/util
QueryResult.java
implement getType
implement getString, getInt, getFloat, etc
need to implement getting the data type from the Database schema
Value.java
Blob type is not supported yet
FormElement.java :
it's a little strange that getValue() is used both for populating form inputs and for running actions on the back end
- oh well
get the type from a Database description
generate-query.xsl :
implement
add methods for getting typed values
fix getting the $column
generate-site.xsl :
check the page names of Form and Queries when constructing them
implement newQuery
Implement a standard way to render form errors (basically the code that is used in each of the JSP pages that loops through them)
IRequestContext.java : Add error messages to IRequestContext
Form.java, generate-form.java, rendering form parameters : How to store the user's form input between screens? Need to store some named data in the session
for some reason:
- rs.beforeFirst(); rs.isBeforeFirst(); is returning true for an empty rs
- changed to if ( rs.next() )
Form.process, generate-form.xsl : What to do about Form.process? Leave empty, make abstract?
Form.process is an empty method. It is over-ridden by the generated Form classes
Home