- From: Anselm Baird_Smith <abaird@www43.inria.fr>
- Date: Thu, 7 Nov 1996 19:26:04 +0100 (MET)
- To: Dave Makower <davemak@pencom.com>
- Cc: www-jigsaw@w3.org
Dave Makower writes: > Here is the html generated by the FormCardResource. > It seems that the HTML that results (eventually) from > addButton() causes a <form> tag without a </form> closing > tag. Perhaps this is what's causing the strange behavior > I described? Correct, I have enclosed a version of FormCardResource tha fixes this problem, let me know if it works better with this (it should now close the form tag, unchecked). Anselm. ----- Jigsaw/src/classes/w3c/jigsaw/forms/FormCardResource.java // FormCardResource.java // $Id: FormCardResource.java,v 1.7 1996/10/01 18:49:37 abaird Exp $ // (c) COPYRIGHT MIT and INRIA, 1996. // Please first read the full copyright statement in file COPYRIGHT.html package w3c.jigsaw.forms; import java.util.*; import java.net.URLEncoder; import w3c.www.http.*; import w3c.jigsaw.http.* ; import w3c.jigsaw.resources.*; import w3c.jigsaw.html.HtmlGenerator ; public class FormCardResource extends PostableResource { FormResource form = null ; FormCardHandler handler = null ; Vector vfields = null ; String name = null ; String title = null ; String url = null ; String okLabel = "Ok"; String resetLabel = "Reset"; Vector vbuttons = null ; boolean deleted = false ; /** * Mark this card as removed. */ public synchronized void delete() { deleted = true ; } /** * Is this card deleted ? */ public synchronized boolean isDeleted() { return deleted ; } /** * Set the Ok button label. * @param label The label to use for the commit button. */ public void setOkLabel(String label) { okLabel = label; } /** * Set the reset button label. * @param label The label to use for the reset button. */ public void setResetLabel(String label) { resetLabel = label; } /** * Our own lookup, to implement multiple buttons: */ public boolean lookup(LookupState ls, LookupResult lr) throws HTTPException { if ( super.lookup(ls, lr) ) return true; String label = ls.getNextComponent() ; // Is this a valid button ? for (int i = 0 ; i < vbuttons.size() ; i++) { String button = (String) vbuttons.elementAt(i) ; if ( button.equals(label) ) { // Notify the button click: try { handler.notifyButtonClick(label) ; } catch (FormProcessingException ex) { lr.setTarget(null); return false; } lr.setTarget(this); return true; } } // Unknown button: lr.setTarget(null); return true; } /** * Get this card name. */ public String getName() { return name ; } public void rename(String name) { this.name = name; this.url = form.getURL()+"/"+URLEncoder.encode(name); } /** * Get this card title. */ public String getTitle() { return title ; } /** * Dump this card into the given HtmlGenerator. * @param into The HtmlGenerator to dump ourself into. */ protected void dump (HtmlGenerator g) { // Dump the fields: g.append ("<form action=\"" + url + "\" method=\"POST\">") ; g.append("<table width=\"100%\">"); if ( vfields.size() > 0 ) { for (int i = 0 ; i < vfields.size() ; i++) ((FormField) vfields.elementAt(i)).dump(g) ; } g.append("</table>"); g.append ("<p><input type=\"submit\" name=\"submit\" value=\"" + okLabel + "\">"); g.append ("<input type=\"reset\" name=\"submit\" value=\"" + resetLabel + "\">"); g.append ("</form>") ; // Dump the buttons: if ( vbuttons.size() > 0 ) { g.append("<hr>"); for (int i = 0 ; i < vbuttons.size() ; i++) { String label = (String) vbuttons.elementAt(i) ; g.append("<form method=\"GET\" action=\"" + url+"/"+label +"\">"); g.append("<input type=\"submit\"" + " name=\"BUTTONRESERVEDBUTTON\"" + " value=\""+label+"\"></form>"); } } } /** * Add a new field to this form. * @param field The field to add. */ public void addField (FormFieldInterface field) { vfields.addElement (field) ; } /** * Add a new button. * Button click are simulated, the form handler will get notified of * them through the notifyButtonClick callback. * @param label The button name. */ public void addButton(String label) { vbuttons.addElement(label) ; } /** * remove the field whose name is given. * @param name The name of the field to remove. */ public void removeField(String name) { for (int i = 0 ; i < vfields.size() ; i++) { FormField field = (FormField) vfields.elementAt(i) ; if ( field.getName().equals(name) ) { vfields.removeElementAt(i) ; return ; } } } /** * Reset this form card. * Remove all the fields and all the buttons defined for this card. */ public void reset() { vfields.setSize(0) ; vbuttons.setSize(0) ; } /** * Lookup a field in this card. * @param name The name of the field to look for. * @return An instance of FormFieldInterface or <strong>null</strong> * if none was found. */ public FormFieldInterface lookupField (String name) { for (int i = 0 ; i < vfields.size() ; i++) { FormField field = (FormField) vfields.elementAt(i) ; if ( field.getName().equals(name) ) return field ; } return null ; } /** * Update the field whose name is given, with the provided value. * @param name The field name. * @param value The new value for this field. * @exception HTTPException If the field couldn't be set. */ protected void updateField (String name, String value) throws FormFieldException { FormFieldInterface field = lookupField (name) ; if ( field == null ) return ; if ( field.setValue (value) ) { if ( handler != null ) handler.notifyChange (field, field.getValue()) ; } } /** * Get this form card entity. * This dumps the whole form (including the card button controlers). */ public Reply get (Request request) throws HTTPException { // If the card has been deleted (for some reason), delegate to form if ( isDeleted() ) return form.get(request) ; // Is is time to update our HTML for the card, checkit: FormCardResource updated = handler.updateFormCard(this) ; if ( updated == null ) updated = this ; // Emit the HTML: Reply reply = request.makeReply(HTTP.OK) ; HtmlGenerator g = new HtmlGenerator (title) ; form.dump (g, updated) ; reply.setHeaderValue(reply.H_CACHE_CONTROL , FormResource.CACHE_CONTROL_NOCACHE); reply.setHeaderValue(reply.H_PRAGMA , FormResource.PRAGMA_NOCACHE); reply.setStream (g) ; return reply ; } /** * Handle a post to this card. * This method is synchronized so that only one thread of control executes * the sequence of <code>notifyBeginProcessing</code>, * <code>notifyEndProcessing</code> and <code>notifyChange</code>. * @param client The clien tthat issued the request. * @param request The request to fullfill. * @param data The form data. * @exception HTTPException If the form processing erred. */ public synchronized Reply handle (Request request, URLDecoder data) throws HTTPException { // Run the begin processing handler: try { handler.notifyBeginProcessing(this, request) ; } catch (FormProcessingException ex) { Reply error = request.makeReply(HTTP.BAD_REQUEST) ; error.setContent (ex.getMessage()) ; throw new HTTPException (error) ; } // Change the fields value apprpriately: Enumeration e = data.keys() ; while ( e.hasMoreElements() ) { String name = (String) e.nextElement() ; String value = data.getValue(name) ; try { updateField (name, value) ; } catch (FormFieldException ex) { Reply r = request.makeReply(HTTP.OK) ; HtmlGenerator g = new HtmlGenerator ("error for " + name) ; g.append ("<p>The field " + name + " has an incorrect value:</p><hr>" + "<p>" + ex.getMessage() + "</p><hr>" + "<p>Click <a href=\"" + url + "\">here</a> to continue."); r.setHeaderValue(r.H_CACHE_CONTROL , FormResource.CACHE_CONTROL_NOCACHE); r.setHeaderValue(r.H_PRAGMA , FormResource.PRAGMA_NOCACHE); r.setStream (g) ; return r ; } } // Run the end processing handler: String location = null ; try { location = handler.notifyEndProcessing(this, request) ; } catch (FormProcessingException ex) { Reply error = request.makeReply(HTTP.BAD_REQUEST) ; error.setContent(ex.getMessage()) ; throw new HTTPException (error) ; } // If a location provided, redirect else get: if ( location == null ) { return get(request) ; } else { Reply reloc = request.makeReply(HTTP.MOVED_TEMPORARILY) ; reloc.setContentLength(0) ; reloc.setLocation(location) ; reloc.setHeaderValue(reloc.H_CACHE_CONTROL , FormResource.CACHE_CONTROL_NOCACHE); reloc.setHeaderValue(reloc.H_PRAGMA , FormResource.PRAGMA_NOCACHE); throw new HTTPException(reloc) ; } } /** * Create a new form card. * Users of the package should create new form cards through the form * object itself. * @param form The form we are attached to. * @param handler This card form handler. * @param name This card's name, * @param title The card displayed title. */ protected FormCardResource (FormResource form , FormCardHandler handler , String name, String title) { this.form = form ; this.handler = handler ; this.name = name ; this.title = title ; this.vfields = new Vector() ; this.vbuttons = new Vector() ; this.url = form.getURL() + "/" + URLEncoder.encode(name) ; } }
Received on Thursday, 7 November 1996 13:26:21 UTC