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