001// Copyright (c) 2001 Hursh Jain (http://www.mollypages.org) 002// The Molly framework is freely distributable under the terms of an 003// MIT-style license. For details, see the molly pages web site at: 004// http://www.mollypages.org/. Use, modify, have fun ! 005 006package fc.web.forms; 007 008import javax.servlet.*; 009import javax.servlet.http.*; 010import java.io.*; 011import java.util.*; 012 013import fc.io.*; 014import fc.util.*; 015 016/** 017A container for a sequence of forms. 018<p> 019 020@author hursh jain 021**/ 022public class FormSequence 023{ 024Map sequence; 025Map doneMap; 026 027public FormSequence() 028 { 029 sequence = new LinkedHashMap(); 030 doneMap = new HashMap(); 031 } 032 033/** 034Adds a form to the sequence 035 036@throws IllegalStateException if a form with the same name already 037 exists in this sequence. 038**/ 039public void add(Form f) { 040 Argcheck.notnull(f, "param f was null"); 041 sequence.put(f.getName(), f); 042 doneMap.put(f.getName(), Boolean.valueOf(false)); 043 } 044 045/** specify <tt>true</tt> to mark the form as done**/ 046public void setDone(Form form, boolean done) 047 { 048 Form f = (Form) sequence.get(form.getName()); 049 if (f == null) { 050 return; 051 } 052 doneMap.put(form.getName(), Boolean.valueOf(done)); 053 } 054 055/** 056@return <tt>true</tt> is the specified form is marked 057 as done. 058**/ 059public boolean isDone(Form f) 060 { 061 if (! sequence.containsKey(f.getName()) ) 062 return false; 063 064 Boolean b = (Boolean) doneMap.get(f.getName()); 065 return b.booleanValue(); 066 } 067 068/** 069Returns the form with the specified name or <tt>null</tt> 070if a form with that name does not exist 071**/ 072public Form get(String name) { 073 return (Form) sequence.get(name); 074 } 075 076/** 077@return the first form which is still not done or <tt>null</tt> 078 if none are remaining to be done. 079**/ 080public Form getFirstRemaining() 081 { 082 Form f = null; 083 Iterator it = sequence.values().iterator(); 084 while (it.hasNext()) { 085 f = (Form) it.next(); 086 if (! isDone(f) ) { 087 break; 088 } 089 } 090 return f; 091 } 092 093/** 094@return <tt>true</tt> is all forms in the sequence are 095 marked as done <tt>false</tt> otherwise. Also 096 returns <tt>false</tt> if this sequence contains 097 no forms at all. 098**/ 099public boolean isFinished() { 100 return getFirstRemaining() == null; 101 } 102 103}