<?xml version="1.0"?><st-source><!-- Name: WebMVCBundleName: WebMVCDevelopmentPrerequisites: #(#(#any 'MIME' '') #(#any 'SUnit' '') #(#any 'WebToolkit' ''))Parcel: #('WebMVC')ParcelName: WebMVCPrerequisiteParcels: #(#('MIME' '') #('SUnit' '') #('WebToolkit' ''))Date: 3:20:27 am July 15, 2003 --><time-stamp>From VisualWorks® NonCommercial, Release 7 of March 21, 2003 on July 15, 2003 at 3:20:27 am</time-stamp><do-it>(Dialog confirm: 'You are filing-in a Parcel source file!\\While this is possible it will not have\the same effect as loading the parcel.\None of the Parcel''s prerequisites will\be loaded and none of its load actions\will be performed.\\Are you sure you want to file-in?' withCRs) ifFalse: [self error: 'Parcel file-in abandoned.  Choose terminate or close.']</do-it><name-space><name>WebMVC</name><environment>Smalltalk</environment><private>false</private><imports>			private Smalltalk.*			</imports><category>WebMVC</category><attributes><package>WebMVC</package></attributes></name-space><name-space><name>WebMVCTests</name><environment>Smalltalk</environment><private>false</private><imports>			private Smalltalk.*			private WebMVC.*			private VisualWave.*			</imports><category>WebMVC-Tests</category><attributes><package>WebMVC-Tests</package></attributes></name-space><class><name>InputFieldDescription</name><environment>WebMVC</environment><super>Core.Object</super><private>false</private><indexed-type>none</indexed-type><inst-vars>description type validator </inst-vars><class-inst-vars></class-inst-vars><imports></imports><category>WebMVC-Servlets</category><attributes><package>WebMVC-Servlets</package></attributes></class><class><name>GetPropertyTag</name><environment>WebMVC</environment><super>VisualWave.GetPropertyTag</super><private>false</private><indexed-type>none</indexed-type><inst-vars></inst-vars><class-inst-vars></class-inst-vars><imports></imports><category>WebMVC-Tags</category><attributes><package>WebMVC-Tags</package></attributes></class><comment><class-id>WebMVC.GetPropertyTag</class-id><body>I extend the standard GetPropertyTag to support dotted path notations for the property.  For example:&lt;mvc:getProperty name="someBean" property="address.city"&gt;Would send the object corresponding to someBean the message address and then send the resultingobject the message city.  The resulting object would be returned.  If any of the intermediate path elements isnil, you will probably get a DNU for the next path element.  There is currently no mechanism for handling this.</body></comment><class><name>TagTest</name><environment>WebMVCTests</environment><super>XProgramming.SUnit.TestCase</super><private>false</private><indexed-type>none</indexed-type><inst-vars>site savedPreferences session </inst-vars><class-inst-vars></class-inst-vars><imports></imports><category>WebMVC-Tests</category><attributes><package>WebMVC-Tests</package></attributes></class><class><name>FormTagTest</name><environment>WebMVCTests</environment><super>WebMVCTests.TagTest</super><private>false</private><indexed-type>none</indexed-type><inst-vars></inst-vars><class-inst-vars></class-inst-vars><imports></imports><category>WebMVC-Tests</category><attributes><package>WebMVC-Tests</package></attributes></class><class><name>StringConverter</name><environment>WebMVC</environment><super>Core.Object</super><private>false</private><indexed-type>none</indexed-type><inst-vars></inst-vars><class-inst-vars></class-inst-vars><imports></imports><category>WebMVC-TypeConverters</category><attributes><package>WebMVC-TypeConverters</package></attributes></class><class><name>BeanFinder</name><environment>WebMVC</environment><super>Core.Object</super><private>false</private><indexed-type>none</indexed-type><inst-vars></inst-vars><class-inst-vars></class-inst-vars><imports></imports><category>WebMVC-Servlets</category><attributes><package>WebMVC-Servlets</package></attributes></class><class><name>FrozenViewRequest</name><environment>WebMVC</environment><super>Core.Object</super><private>false</private><indexed-type>none</indexed-type><inst-vars>query attributes path </inst-vars><class-inst-vars></class-inst-vars><imports></imports><category>WebMVC-Servlets</category><attributes><package>WebMVC-Servlets</package></attributes></class><class><name>TagLibrary</name><environment>WebMVC</environment><super>VisualWave.TagLibrary</super><private>false</private><indexed-type>none</indexed-type><inst-vars></inst-vars><class-inst-vars></class-inst-vars><imports></imports><category>WebMVC-Tools</category><attributes><package>WebMVC-Tools</package></attributes></class><class><name>ErrorSourceCommand</name><environment>WebMVCTests</environment><super>Core.Object</super><private>false</private><indexed-type>none</indexed-type><inst-vars></inst-vars><class-inst-vars></class-inst-vars><imports></imports><category>WebMVC-Tests</category><attributes><package>WebMVC-Tests</package></attributes></class><class><name>TagAttribute</name><environment>WebMVC</environment><super>VisualWave.TagAttributeSpec</super><private>false</private><indexed-type>none</indexed-type><inst-vars>description </inst-vars><class-inst-vars></class-inst-vars><imports></imports><category>WebMVC-Tools</category><attributes><package>WebMVC-Tools</package></attributes></class><class><name>WebError</name><environment>WebMVC</environment><super>Core.Object</super><private>false</private><indexed-type>none</indexed-type><inst-vars></inst-vars><class-inst-vars></class-inst-vars><imports></imports><category>WebMVC-Errors</category><attributes><package>WebMVC-Errors</package></attributes></class><class><name>SequencingTest</name><environment>WebMVCTests</environment><super>WebMVCTests.TagTest</super><private>false</private><indexed-type>none</indexed-type><inst-vars></inst-vars><class-inst-vars></class-inst-vars><imports></imports><category>WebMVC-Tests</category><attributes><package>WebMVC-Tests</package></attributes></class><class><name>ValidationError</name><environment>WebMVC</environment><super>Core.Object</super><private>false</private><indexed-type>none</indexed-type><inst-vars>description variableName </inst-vars><class-inst-vars></class-inst-vars><imports></imports><category>WebMVC-Errors</category><attributes><package>WebMVC-Errors</package></attributes></class><class><name>GenericError</name><environment>WebMVC</environment><super>Core.Object</super><private>false</private><indexed-type>none</indexed-type><inst-vars>message </inst-vars><class-inst-vars></class-inst-vars><imports></imports><category>WebMVC-Errors</category><attributes><package>WebMVC-Errors</package></attributes></class><class><name>ServletWithModel</name><environment>WebMVC</environment><super>VisualWave.SingleThreadModelServlet</super><private>false</private><indexed-type>none</indexed-type><inst-vars>adaptor errors formModel formDescription </inst-vars><class-inst-vars></class-inst-vars><imports></imports><category>WebMVC-Servlets</category><attributes><package>WebMVC-Servlets</package></attributes></class><class><name>UseBeanTag</name><environment>WebMVC</environment><super>VisualWave.UseBeanTag</super><private>false</private><indexed-type>none</indexed-type><inst-vars>fromBean fromScope </inst-vars><class-inst-vars></class-inst-vars><imports></imports><category>WebMVC-Tags</category><attributes><package>WebMVC-Tags</package></attributes></class><class><name>ExistsTag</name><environment>WebMVC</environment><super>VisualWave.Tag</super><private>false</private><indexed-type>none</indexed-type><inst-vars>name scope </inst-vars><class-inst-vars></class-inst-vars><imports></imports><category>WebMVC-Tags</category><attributes><package>WebMVC-Tags</package></attributes></class><class><name>StringParameterSubstitution</name><environment>Core</environment><super>Core.Object</super><private>false</private><indexed-type>none</indexed-type><inst-vars>argumentTypeMapping input output defaultEmphasis args argEmphases startDelim endDelim </inst-vars><class-inst-vars></class-inst-vars><imports></imports><category>Collections-Text</category><attributes><package>WebMVC-Extensions</package></attributes></class><comment><class-id>Core.StringParameterSubstitution</class-id><body>This class does parameter substitution on strings.  It can also be used to transform simple escape sequences into non-printable characters.Formal parameters in the string are enclosed in the brackets &lt; &gt;.  Immediately following the opening bracket there may be an integer--this defines which of the arguments should be substituted in here, which means that the string can cause arguments to appear in a different order than they are passed in, and it can also print the same argument more than once.  Following this index, if any, there is a character that identifies how the substitution will be performed--below, you'll find a table describing the default substitution types.  After this type character, the remainder of the characters inside the brackets serve as arguments to the substitution--if the substitution operation is defined as having no arguments, it is an error to include any non-blank characters here.  If there was no index present, the code will assume an index of nil--it's almost certain that this will be an error, unless the character signifies an operation that is parameter-independent, such as 'n' and 't' below.The default formal parameter types are as follows:	&lt;1p&gt;	Replace the formal parameter with the first argument's printString.	&lt;3s&gt;	The third argument must be a CharacterArray.  Replace the formal parameter with that argument.	&lt;4?foo:bar&gt;	The fourth argument must be a Boolean.  If the argument is true, replace the formal parameter with 'foo', otherwise replace it with 'bar'.	&lt;2#foo:bar&gt;	The second argument must be a Number.  If the argument is equal to 1, replace the formal parameter with 'foo', otherwise replace it with 'bar'.	&lt;n&gt;		Insert a CR into the text	&lt;t&gt;		Insert a tab into the textThe character $% acts as the quote character.  Unless otherwise specified, any character following the quote character is itself, and is not treated specially.  For example, '%%' becomes '%', and '%&lt;' becomes '&lt;'--which, since it was preceded by the quote character, is not treated as the beginning of a formal parameter.</body></comment><class><name>WebMVCController</name><environment>WebMVC</environment><super>WebMVC.ServletWithModel</super><private>false</private><indexed-type>none</indexed-type><inst-vars>target </inst-vars><class-inst-vars></class-inst-vars><imports></imports><category>WebMVC-Servlets</category><attributes><package>WebMVC-Servlets</package></attributes></class><class><name>ElementTag</name><environment>WebMVC</environment><super>VisualWave.Tag</super><private>false</private><indexed-type>none</indexed-type><inst-vars>tabIndex accessKey </inst-vars><class-inst-vars></class-inst-vars><imports></imports><category>WebMVC-Tags</category><attributes><package>WebMVC-Tags</package></attributes></class><class><name>MenuTag</name><environment>WebMVC</environment><super>WebMVC.ElementTag</super><private>false</private><indexed-type>none</indexed-type><inst-vars></inst-vars><class-inst-vars></class-inst-vars><imports></imports><category>WebMVC-Tags</category><attributes><package>WebMVC-Tags</package></attributes></class><class><name>ScriptableTag</name><environment>WebMVC</environment><super>WebMVC.ElementTag</super><private>false</private><indexed-type>none</indexed-type><inst-vars>onload onunload onclick ondblclick onmousedown onmouseup onmouseover onmousemove onmouseout onfocus onblur onkeypress onkeydown onkeyup onsubmit onreset onselect onchange </inst-vars><class-inst-vars></class-inst-vars><imports></imports><category>WebMVC-Tags</category><attributes><package>WebMVC-Tags</package></attributes></class><comment><class-id>WebMVC.ScriptableTag</class-id><body>Most of the code for this tag was generated automatically since there are so many annoying ivars.  Here are code snippets to perform the code generation:"Generate the setters"ScriptableTag instVarNames do: [ :var |	| clone |	clone := var copy.	clone at: 1 put: (clone at: 1) asUppercase.	ScriptableTag compile: 'set' , clone , ': aValue	&lt;required: false description: ''Javascript code for the ' , var , ' event.''&gt;	' , var , ' := aValue' classified: 'jsp accessing']"Generate the release method"|ws|ws := WriteStream on: String new.ScriptableTag instVarNames do: [ :var | ws nextPutAll: var; nextPutAll: ' := nil.	'].ScriptableTag compile: 'release	super release.	' , ws contents classified: 'initialize-release'."Generate the tagParametersOn: method"|ws|ws := WriteStream on: String new.ScriptableTag instVarNames do: [ :var |	ws nextPutAll: var;	nextPutAll: ' ifNotNil: [self spacedWriteOn: aStream with: '''; 	nextPutAll: var; 	nextPutAll: '="'' , ';	nextPutAll: var;	nextPutAll: ', ''"''].'].ws contents.ScriptableTag compile: 'tagParametersOn: aStream	super tagParametersOn: aStream.	' , ws contents , '	^aStream' classified: 'api'.Instance Variables:	onblur	&lt;String&gt;	scripting action for onblur	onchange	&lt;String&gt;	scripting action for onchange	onclick	&lt;String&gt;	scripting action for onclick	ondblclick	&lt;String&gt;	scripting action for ondblclick	onfocus	&lt;String&gt;	scripting action for onfocus	onkeydown	&lt;String&gt;	scripting action for onkeydown	onkeypress	&lt;String&gt;	scripting action for onkeypress	onkeyup	&lt;String&gt;	scripting action for onkeyup	onload	&lt;String&gt;	scripting action for onload	onmousedown	&lt;String&gt;	scripting action for onmousedown	onmousemove	&lt;String&gt;	scripting action for onmousemove	onmouseout	&lt;String&gt;	scripting action for onmouseout	onmouseover	&lt;String&gt;	scripting action for onmouseover	onmouseup	&lt;String&gt;	scripting action for onmouseup	onreset	&lt;String&gt;	scripting action for onreset	onselect	&lt;String&gt;	scripting action for onselect	onsubmit	&lt;String&gt;	scripting action for onsubmit	onunload	&lt;String&gt;	scripting action for onunload</body></comment><class><name>MenuItemTag</name><environment>WebMVC</environment><super>WebMVC.ScriptableTag</super><private>false</private><indexed-type>none</indexed-type><inst-vars>text uri </inst-vars><class-inst-vars></class-inst-vars><imports></imports><category>WebMVC-Tags</category><attributes><package>WebMVC-Tags</package></attributes></class><class><name>TagTestModelWithoutSpecs</name><environment>WebMVCTests</environment><super>Core.Object</super><private>false</private><indexed-type>none</indexed-type><inst-vars>username password age </inst-vars><class-inst-vars></class-inst-vars><imports></imports><category>WebMVC-Tests</category><attributes><package>WebMVC-Tests</package></attributes></class><class><name>ButtonDescription</name><environment>WebMVC</environment><super>Core.Object</super><private>false</private><indexed-type>none</indexed-type><inst-vars>invoke </inst-vars><class-inst-vars></class-inst-vars><imports></imports><category>WebMVC-Servlets</category><attributes><package>WebMVC-Servlets</package></attributes></class><class><name>BaseTagTest</name><environment>WebMVCTests</environment><super>WebMVCTests.TagTest</super><private>false</private><indexed-type>none</indexed-type><inst-vars></inst-vars><class-inst-vars></class-inst-vars><imports></imports><category>WebMVC-Tests</category><attributes><package>WebMVC-Tests</package></attributes></class><class><name>BaseTag</name><environment>WebMVC</environment><super>VisualWave.Tag</super><private>false</private><indexed-type>none</indexed-type><inst-vars></inst-vars><class-inst-vars></class-inst-vars><imports></imports><category>WebMVC-Tags</category><attributes><package>WebMVC-Tags</package></attributes></class><class><name>SubmitTag</name><environment>WebMVC</environment><super>VisualWave.Tag</super><private>false</private><indexed-type>none</indexed-type><inst-vars>value invoke name </inst-vars><class-inst-vars></class-inst-vars><imports></imports><category>WebMVC-Tags</category><attributes><package>WebMVC-Tags</package></attributes></class><class><name>ResetTag</name><environment>WebMVC</environment><super>WebMVC.SubmitTag</super><private>false</private><indexed-type>none</indexed-type><inst-vars></inst-vars><class-inst-vars></class-inst-vars><imports></imports><category>WebMVC-Tags</category><attributes><package>WebMVC-Tags</package></attributes></class><class><name>StyledTag</name><environment>WebMVC</environment><super>WebMVC.ScriptableTag</super><private>false</private><indexed-type>none</indexed-type><inst-vars>style styleID styleClass </inst-vars><class-inst-vars></class-inst-vars><imports></imports><category>WebMVC-Tags</category><attributes><package>WebMVC-Tags</package></attributes></class><class><name>ActionTag</name><environment>WebMVC</environment><super>WebMVC.StyledTag</super><private>false</private><indexed-type>none</indexed-type><inst-vars>modelName modelScope formID invoke sequencer targetName targetClass </inst-vars><class-inst-vars></class-inst-vars><imports></imports><category>WebMVC-Tags</category><attributes><package>WebMVC-Tags</package></attributes></class><class><name>PropertyAdaptor</name><environment>WebMVC</environment><super>UI.ValueModel</super><private>false</private><indexed-type>none</indexed-type><inst-vars>model propertyName setMethod getMethod fieldSpec </inst-vars><class-inst-vars></class-inst-vars><imports></imports><category>WebMVC-Servlets</category><attributes><package>WebMVC-Servlets</package></attributes></class><comment><class-id>WebMVC.PropertyAdaptor</class-id><body>PropertyAdaptor knows how to get a value from a model and turn it into a String (value), and convert a value from a String to the appropriate type for the model and store it in the model (value:).  PropertyAdaptor uses a FieldSpec to perform the conversions.  It builds the FieldSpec in one of three ways (corresponding to three instance creation methods):	. if given an InputTag it will request property name, and type information from the tag	. if given a form model it will build the FieldSpec by asking  the form model for it (fieldSpecFor:)	. if given form data it will build the FieldSpec by looking for type information embedded form valuesInstance Variables:	getMethod	&lt;Symbol&gt;	name of method used to set value of property in model	model	&lt;Object&gt;	model	propertyName	&lt;String&gt;	name of property being manipulated	setMethod	&lt;Symbol&gt;	name of method used to get value of property from model	fieldSpec &lt;FieldSpec&gt;	the field spec used to manipulate this property</body></comment><class><name>TLDBuilder</name><environment>WebMVC</environment><super>UI.ApplicationModel</super><private>false</private><indexed-type>none</indexed-type><inst-vars>activeTags tagLibraryChoices tagLibrary </inst-vars><class-inst-vars></class-inst-vars><imports></imports><category>WebMVC-Tools</category><attributes><package>WebMVC-Tools</package></attributes></class><class><name>FormTag</name><environment>WebMVC</environment><super>WebMVC.ActionTag</super><private>false</private><indexed-type>none</indexed-type><inst-vars>modelClassName validationScript firstFocus action </inst-vars><class-inst-vars></class-inst-vars><imports></imports><category>WebMVC-Tags</category><attributes><package>WebMVC-Tags</package></attributes></class><class><name>ActionExecutionTest</name><environment>WebMVCTests</environment><super>WebMVCTests.TagTest</super><private>false</private><indexed-type>none</indexed-type><inst-vars></inst-vars><class-inst-vars></class-inst-vars><imports></imports><category>WebMVC-Tests</category><attributes><package>WebMVC-Tests</package></attributes></class><class><name>FormDescription</name><environment>WebMVC</environment><super>Core.Object</super><private>false</private><indexed-type>none</indexed-type><inst-vars>formID inputFields modelName modelClassName formModelScope invoke forwards buttons invokeOnModel sequencer </inst-vars><class-inst-vars></class-inst-vars><imports></imports><category>WebMVC-Servlets</category><attributes><package>WebMVC-Servlets</package></attributes></class><class><name>ApplicationFormDescription</name><environment>WebMVC</environment><super>WebMVC.FormDescription</super><private>false</private><indexed-type>none</indexed-type><inst-vars>applicationName applicationClassName </inst-vars><class-inst-vars></class-inst-vars><imports></imports><category>WebMVC-Servlets</category><attributes><package>WebMVC-Servlets</package></attributes></class><class><name>CommandFormDescription</name><environment>WebMVC</environment><super>WebMVC.FormDescription</super><private>false</private><indexed-type>none</indexed-type><inst-vars>commandClassName </inst-vars><class-inst-vars></class-inst-vars><imports></imports><category>WebMVC-Servlets</category><attributes><package>WebMVC-Servlets</package></attributes></class><class><name>HtmlTag</name><environment>WebMVC</environment><super>VisualWave.BodyTag</super><private>false</private><indexed-type>none</indexed-type><inst-vars>outgoingRequestMarker outgoingRequestState sequencer </inst-vars><class-inst-vars></class-inst-vars><imports></imports><category>WebMVC-Tags</category><attributes><package>WebMVC-Tags</package></attributes></class><class><name>Forwarder</name><environment>WebMVC</environment><super>Core.Object</super><private>false</private><indexed-type>none</indexed-type><inst-vars>urlString external </inst-vars><class-inst-vars></class-inst-vars><imports></imports><category>WebMVC-Servlets</category><attributes><package>WebMVC-Servlets</package></attributes></class><class><name>IntegerConverter</name><environment>WebMVC</environment><super>Core.Object</super><private>false</private><indexed-type>none</indexed-type><inst-vars></inst-vars><class-inst-vars></class-inst-vars><imports></imports><category>WebMVC-TypeConverters</category><attributes><package>WebMVC-TypeConverters</package></attributes></class><class><name>LabelTag</name><environment>WebMVC</environment><super>WebMVC.StyledTag</super><private>false</private><indexed-type>none</indexed-type><inst-vars>errorClass for </inst-vars><class-inst-vars></class-inst-vars><imports></imports><category>WebMVC-Tags</category><attributes><package>WebMVC-Tags</package></attributes></class><class><name>NotExistsTag</name><environment>WebMVC</environment><super>WebMVC.ExistsTag</super><private>false</private><indexed-type>none</indexed-type><inst-vars></inst-vars><class-inst-vars></class-inst-vars><imports></imports><category>WebMVC-Tags</category><attributes><package>WebMVC-Tags</package></attributes></class><class><name>ActionDataTag</name><environment>WebMVC</environment><super>VisualWave.BodyTag</super><private>false</private><indexed-type>none</indexed-type><inst-vars>name value </inst-vars><class-inst-vars></class-inst-vars><imports></imports><category>WebMVC-Tags</category><attributes><package>WebMVC-Tags</package></attributes></class><class><name>Preferences</name><environment>WebMVC</environment><super>Core.Object</super><private>false</private><indexed-type>none</indexed-type><inst-vars>serializeStateOntoURL useInternalRedirects </inst-vars><class-inst-vars></class-inst-vars><imports></imports><category>WebMVC-Servlets</category><attributes><package>WebMVC-Servlets</package></attributes></class><class><name>ForwardLinkTag</name><environment>WebMVC</environment><super>VisualWave.BodyTag</super><private>false</private><indexed-type>none</indexed-type><inst-vars>name href </inst-vars><class-inst-vars></class-inst-vars><imports></imports><category>WebMVC-Tags</category><attributes><package>WebMVC-Tags</package></attributes></class><class><name>FieldValidator</name><environment>WebMVC</environment><super>Core.Object</super><private>false</private><indexed-type>none</indexed-type><inst-vars></inst-vars><class-inst-vars></class-inst-vars><imports></imports><category>WebMVC-TypeConverters</category><attributes><package>WebMVC-TypeConverters</package></attributes></class><class><name>MaxLengthValidator</name><environment>WebMVC</environment><super>WebMVC.FieldValidator</super><private>false</private><indexed-type>none</indexed-type><inst-vars>maxLength </inst-vars><class-inst-vars></class-inst-vars><imports></imports><category>WebMVC-TypeConverters</category><attributes><package>WebMVC-TypeConverters</package></attributes></class><class><name>CompositeValidator</name><environment>WebMVC</environment><super>WebMVC.FieldValidator</super><private>false</private><indexed-type>none</indexed-type><inst-vars>validators </inst-vars><class-inst-vars></class-inst-vars><imports></imports><category>WebMVC-TypeConverters</category><attributes><package>WebMVC-TypeConverters</package></attributes></class><class><name>MinLengthValidator</name><environment>WebMVC</environment><super>WebMVC.FieldValidator</super><private>false</private><indexed-type>none</indexed-type><inst-vars>minLength </inst-vars><class-inst-vars></class-inst-vars><imports></imports><category>WebMVC-TypeConverters</category><attributes><package>WebMVC-TypeConverters</package></attributes></class><class><name>RequiredFieldValidator</name><environment>WebMVC</environment><super>WebMVC.FieldValidator</super><private>false</private><indexed-type>none</indexed-type><inst-vars></inst-vars><class-inst-vars></class-inst-vars><imports></imports><category>WebMVC-TypeConverters</category><attributes><package>WebMVC-TypeConverters</package></attributes></class><class><name>EMailAddressFormatValidator</name><environment>WebMVC</environment><super>WebMVC.FieldValidator</super><private>false</private><indexed-type>none</indexed-type><inst-vars></inst-vars><class-inst-vars></class-inst-vars><imports></imports><category>WebMVC-TypeConverters</category><attributes><package>WebMVC-TypeConverters</package></attributes></class><class><name>ErrorsTagTest</name><environment>WebMVCTests</environment><super>WebMVCTests.TagTest</super><private>false</private><indexed-type>none</indexed-type><inst-vars></inst-vars><class-inst-vars></class-inst-vars><imports></imports><category>WebMVC-Tests</category><attributes><package>WebMVC-Tests</package></attributes></class><class><name>InternalRequestState</name><environment>WebMVC</environment><super>Core.Object</super><private>false</private><indexed-type>none</indexed-type><inst-vars>id errors forms </inst-vars><class-inst-vars></class-inst-vars><imports></imports><category>WebMVC-Servlets</category><attributes><package>WebMVC-Servlets</package></attributes></class><class><name>ActionLinkTag</name><environment>WebMVC</environment><super>WebMVC.ActionTag</super><private>false</private><indexed-type>none</indexed-type><inst-vars>href dataItems </inst-vars><class-inst-vars></class-inst-vars><imports></imports><category>WebMVC-Tags</category><attributes><package>WebMVC-Tags</package></attributes></class><class><name>ActionRedirectTag</name><environment>WebMVC</environment><super>WebMVC.ActionLinkTag</super><private>false</private><indexed-type>none</indexed-type><inst-vars></inst-vars><class-inst-vars></class-inst-vars><imports></imports><category>WebMVC-Tags</category><attributes><package>WebMVC-Tags</package></attributes></class><class><name>JavascriptScript</name><environment>WebMVC</environment><super>Core.Object</super><private>false</private><indexed-type>none</indexed-type><inst-vars>name scriptText </inst-vars><class-inst-vars></class-inst-vars><imports></imports><category>WebMVC-Tags</category><attributes><package>WebMVC-Tags</package></attributes></class><class><name>OptionTag</name><environment>WebMVC</environment><super>WebMVC.StyledTag</super><private>false</private><indexed-type>none</indexed-type><inst-vars>label selected value </inst-vars><class-inst-vars></class-inst-vars><imports></imports><category>WebMVC-Tags</category><attributes><package>WebMVC-Tags</package></attributes></class><class><name>IntegerValidator</name><environment>WebMVC</environment><super>WebMVC.FieldValidator</super><private>false</private><indexed-type>none</indexed-type><inst-vars></inst-vars><class-inst-vars></class-inst-vars><imports></imports><category>WebMVC-TypeConverters</category><attributes><package>WebMVC-TypeConverters</package></attributes></class><class><name>HtmlTagTest</name><environment>WebMVCTests</environment><super>WebMVCTests.TagTest</super><private>false</private><indexed-type>none</indexed-type><inst-vars></inst-vars><class-inst-vars></class-inst-vars><imports></imports><category>WebMVC-Tests</category><attributes><package>WebMVC-Tests</package></attributes></class><class><name>InputTag</name><environment>WebMVC</environment><super>WebMVC.StyledTag</super><private>false</private><indexed-type>none</indexed-type><inst-vars>name property size redisplay description propertyAdaptor inputTagType type validator </inst-vars><class-inst-vars></class-inst-vars><imports></imports><category>WebMVC-Tags</category><attributes><package>WebMVC-Tags</package></attributes></class><class><name>HiddenTag</name><environment>WebMVC</environment><super>WebMVC.InputTag</super><private>false</private><indexed-type>none</indexed-type><inst-vars></inst-vars><class-inst-vars></class-inst-vars><imports></imports><category>WebMVC-Tags</category><attributes><package>WebMVC-Tags</package></attributes></class><class><name>InputTagTest</name><environment>WebMVCTests</environment><super>WebMVCTests.TagTest</super><private>false</private><indexed-type>none</indexed-type><inst-vars></inst-vars><class-inst-vars></class-inst-vars><imports></imports><category>WebMVC-Tests</category><attributes><package>WebMVC-Tests</package></attributes></class><class><name>CheckBoxTag</name><environment>WebMVC</environment><super>WebMVC.InputTag</super><private>false</private><indexed-type>none</indexed-type><inst-vars>checked </inst-vars><class-inst-vars></class-inst-vars><imports></imports><category>WebMVC-Tags</category><attributes><package>WebMVC-Tags</package></attributes></class><class><name>TextTag</name><environment>WebMVC</environment><super>WebMVC.InputTag</super><private>false</private><indexed-type>none</indexed-type><inst-vars></inst-vars><class-inst-vars></class-inst-vars><imports></imports><category>WebMVC-Tags</category><attributes><package>WebMVC-Tags</package></attributes></class><class><name>TextAreaTag</name><environment>WebMVC</environment><super>WebMVC.InputTag</super><private>false</private><indexed-type>none</indexed-type><inst-vars>rows cols readonly </inst-vars><class-inst-vars></class-inst-vars><imports></imports><category>WebMVC-Tags</category><attributes><package>WebMVC-Tags</package></attributes></class><class><name>SelectTag</name><environment>WebMVC</environment><super>WebMVC.InputTag</super><private>false</private><indexed-type>none</indexed-type><inst-vars>multiple </inst-vars><class-inst-vars></class-inst-vars><imports></imports><category>WebMVC-Tags</category><attributes><package>WebMVC-Tags</package></attributes></class><class><name>RadioTag</name><environment>WebMVC</environment><super>WebMVC.InputTag</super><private>false</private><indexed-type>none</indexed-type><inst-vars>value checked </inst-vars><class-inst-vars></class-inst-vars><imports></imports><category>WebMVC-Tags</category><attributes><package>WebMVC-Tags</package></attributes></class><class><name>ButtonTag</name><environment>WebMVC</environment><super>WebMVC.InputTag</super><private>false</private><indexed-type>none</indexed-type><inst-vars>value </inst-vars><class-inst-vars></class-inst-vars><imports></imports><category>WebMVC-Tags</category><attributes><package>WebMVC-Tags</package></attributes></class><class><name>PasswordTag</name><environment>WebMVC</environment><super>WebMVC.InputTag</super><private>false</private><indexed-type>none</indexed-type><inst-vars></inst-vars><class-inst-vars></class-inst-vars><imports></imports><category>WebMVC-Tags</category><attributes><package>WebMVC-Tags</package></attributes></class><class><name>IfErrorsTag</name><environment>WebMVC</environment><super>VisualWave.Tag</super><private>false</private><indexed-type>none</indexed-type><inst-vars>property </inst-vars><class-inst-vars></class-inst-vars><imports></imports><category>WebMVC-Tags</category><attributes><package>WebMVC-Tags</package></attributes></class><class><name>LoginError</name><environment>WebMVC</environment><super>Core.Object</super><private>false</private><indexed-type>none</indexed-type><inst-vars></inst-vars><class-inst-vars></class-inst-vars><imports></imports><category>WebMVC-Errors</category><attributes><package>WebMVC-Errors</package></attributes></class><class><name>SessionScopeModelTest</name><environment>WebMVCTests</environment><super>WebMVCTests.TagTest</super><private>false</private><indexed-type>none</indexed-type><inst-vars></inst-vars><class-inst-vars></class-inst-vars><imports></imports><category>WebMVC-Tests</category><attributes><package>WebMVC-Tests</package></attributes></class><class><name>EmbeddedTypeTest</name><environment>WebMVCTests</environment><super>WebMVCTests.TagTest</super><private>false</private><indexed-type>none</indexed-type><inst-vars></inst-vars><class-inst-vars></class-inst-vars><imports></imports><category>WebMVC-Tests</category><attributes><package>WebMVC-Tests</package></attributes></class><class><name>OptGroupTag</name><environment>WebMVC</environment><super>WebMVC.StyledTag</super><private>false</private><indexed-type>none</indexed-type><inst-vars>label </inst-vars><class-inst-vars></class-inst-vars><imports></imports><category>WebMVC-Tags</category><attributes><package>WebMVC-Tags</package></attributes></class><class><name>Sequencer</name><environment>WebMVC</environment><super>Core.Object</super><private>false</private><indexed-type>none</indexed-type><inst-vars></inst-vars><class-inst-vars></class-inst-vars><imports></imports><category>WebMVC-Servlets</category><attributes><package>WebMVC-Sequencers</package></attributes></class><class><name>NoRepeatSequencer</name><environment>WebMVC</environment><super>WebMVC.Sequencer</super><private>false</private><indexed-type>none</indexed-type><inst-vars>hasExecuted </inst-vars><class-inst-vars></class-inst-vars><imports></imports><category>WebMVC-Servlets</category><attributes><package>WebMVC-Sequencers</package></attributes></class><class><name>SequencerList</name><environment>WebMVC</environment><super>WebMVC.Sequencer</super><private>false</private><indexed-type>none</indexed-type><inst-vars>sequencers </inst-vars><class-inst-vars></class-inst-vars><imports></imports><category>WebMVC-Servlets</category><attributes><package>WebMVC-Sequencers</package></attributes></class><class><name>InertSequencer</name><environment>WebMVC</environment><super>WebMVC.Sequencer</super><private>false</private><indexed-type>none</indexed-type><inst-vars></inst-vars><class-inst-vars></class-inst-vars><imports></imports><category>WebMVC-Servlets</category><attributes><package>WebMVC-Sequencers</package></attributes></class><class><name>ErrorsTag</name><environment>WebMVC</environment><super>WebMVC.StyledTag</super><private>false</private><indexed-type>none</indexed-type><inst-vars></inst-vars><class-inst-vars></class-inst-vars><imports></imports><category>WebMVC-Tags</category><attributes><package>WebMVC-Tags</package></attributes></class><class><name>InternalStateManager</name><environment>WebMVC</environment><super>Core.Object</super><private>false</private><indexed-type>none</indexed-type><inst-vars>states activeSequencer lastValidRequest </inst-vars><class-inst-vars></class-inst-vars><imports></imports><category>WebMVC-Servlets</category><attributes><package>WebMVC-Servlets</package></attributes></class><class><name>RequiredPageSequencer</name><environment>WebMVC</environment><super>WebMVC.Sequencer</super><private>false</private><indexed-type>none</indexed-type><inst-vars>outgoingMarker incomingMarker pathInfo </inst-vars><class-inst-vars></class-inst-vars><imports></imports><category>WebMVC-Servlets</category><attributes><package>WebMVC-Sequencers</package></attributes></class><comment><class-id>WebMVC.RequiredPageSequencer</class-id><body>I enforce the requirement that the page with the supplied marker is submitted.  If it is not, I redirect control back the the viewURL with a GenericError containing my message.Instance Variables:	marker	&lt;Object&gt;	the marker assigned to the page being displayed	message &lt;String&gt;	the message to be supplied the the GenericError if the marker is not submitted</body></comment><class><name>TagDefinition</name><environment>WebMVC</environment><super>VisualWave.TagSpec</super><private>false</private><indexed-type>none</indexed-type><inst-vars></inst-vars><class-inst-vars></class-inst-vars><imports></imports><category>WebMVC-Tools</category><attributes><package>WebMVC-Tools</package></attributes></class><class><name>FormModelAdaptor</name><environment>WebMVC</environment><super>Core.Object</super><private>false</private><indexed-type>none</indexed-type><inst-vars>formModel propertyAdaptors </inst-vars><class-inst-vars></class-inst-vars><imports></imports><category>WebMVC-Servlets</category><attributes><package>WebMVC-Servlets</package></attributes></class><class><name>IfErrorsTagTest</name><environment>WebMVCTests</environment><super>WebMVCTests.TagTest</super><private>false</private><indexed-type>none</indexed-type><inst-vars></inst-vars><class-inst-vars></class-inst-vars><imports></imports><category>WebMVC-Tests</category><attributes><package>WebMVC-Tests</package></attributes></class><class><name>SingletonCommand</name><environment>WebMVCTests</environment><super>Core.Object</super><private>false</private><indexed-type>none</indexed-type><inst-vars>executionCount </inst-vars><class-inst-vars></class-inst-vars><imports></imports><category>WebMVC-Tests</category><attributes><package>WebMVC-Tests</package></attributes></class><class><name>ValidatingModel</name><environment>WebMVC</environment><super>Core.Object</super><private>false</private><indexed-type>none</indexed-type><inst-vars></inst-vars><class-inst-vars></class-inst-vars><imports></imports><category>WebMVC-Servlets</category><attributes><package>WebMVC-Servlets</package></attributes></class><class><name>TagTestModel</name><environment>WebMVCTests</environment><super>WebMVC.ValidatingModel</super><private>false</private><indexed-type>none</indexed-type><inst-vars>username password age </inst-vars><class-inst-vars></class-inst-vars><imports></imports><category>WebMVC-Tests</category><attributes><package>WebMVC-Tests</package></attributes></class><class><name>FieldSpec</name><environment>WebMVC</environment><super>Core.Object</super><private>false</private><indexed-type>none</indexed-type><inst-vars>name validator converter acceptsList </inst-vars><class-inst-vars></class-inst-vars><imports></imports><category>WebMVC-TypeConverters</category><attributes><package>WebMVC-TypeConverters</package></attributes></class><class><name>NumberConverter</name><environment>WebMVC</environment><super>Core.Object</super><private>false</private><indexed-type>none</indexed-type><inst-vars></inst-vars><class-inst-vars></class-inst-vars><imports></imports><category>WebMVC-TypeConverters</category><attributes><package>WebMVC-TypeConverters</package></attributes></class><class><name>DoNothingCommand</name><environment>WebMVCTests</environment><super>Core.Object</super><private>false</private><indexed-type>none</indexed-type><inst-vars>executed </inst-vars><class-inst-vars></class-inst-vars><imports></imports><category>WebMVC-Tests</category><attributes><package>WebMVC-Tests</package></attributes></class><shared-variable><name>Current</name><environment>WebMVC.Preferences</environment><private>false</private><constant>false</constant><category>singleton</category><initializer>Preferences new</initializer><attributes><package>WebMVC-Servlets</package></attributes></shared-variable><shared-variable><name>ChangeScript</name><environment>WebMVC.MinLengthValidator</environment><private>false</private><constant>false</constant><category>scripts</category><initializer>nil</initializer><attributes><package>WebMVC-TypeConverters</package></attributes></shared-variable><shared-variable><name>RNG</name><environment>WebMVC.ActionTag</environment><private>false</private><constant>false</constant><category>random</category><initializer>Random standard</initializer><attributes><package>WebMVC-Tags</package></attributes></shared-variable><shared-variable><name>URLEncoder</name><environment>WebMVC.InternalRequestState</environment><private>false</private><constant>false</constant><category>url encoding</category><initializer>VisualWave.URLEncoder new</initializer><attributes><package>WebMVC-Servlets</package></attributes></shared-variable><shared-variable><name>UsingBraces</name><environment>Core.StringParameterSubstitution</environment><private>false</private><constant>false</constant><category>As yet unclassified</category><initializer>nil</initializer><attributes><package>WebMVC-Extensions</package></attributes></shared-variable><shared-variable><name>Singleton</name><environment>WebMVCTests.SingletonCommand</environment><private>false</private><constant>false</constant><category>singleton</category><initializer>nil</initializer><attributes><package>WebMVC-Tests</package></attributes></shared-variable><shared-variable><name>KeyMutex</name><environment>WebMVC.InternalStateManager</environment><private>false</private><constant>false</constant><category>state key</category><initializer>Semaphore forMutualExclusion</initializer><attributes><package>WebMVC-Servlets</package></attributes></shared-variable><shared-variable><name>StateKey</name><environment>WebMVC.InternalStateManager</environment><private>false</private><constant>false</constant><category>state key</category><initializer>0</initializer><attributes><package>WebMVC-Servlets</package></attributes></shared-variable><methods><class-id>WebMVC.InputFieldDescription</class-id> <category>accessing</category><body package="WebMVC-Servlets">description	^description</body><body package="WebMVC-Servlets">description: anObject	description := anObject</body><body package="WebMVC-Servlets">type	^type</body><body package="WebMVC-Servlets">type: anObject	type := anObject</body><body package="WebMVC-Servlets">validator	^validator</body><body package="WebMVC-Servlets">validator: anObject	validator := anObject</body></methods><methods><class-id>WebMVC.GetPropertyTag</class-id> <category>api</category><body package="WebMVC-Tags">doStartTag	| value |	value := BeanFinder new 				findBeanWithPathString: name , '.' , property				scope: 'page'				for: self				factoryBlock: [].	pageContext response 		write: (value displayStringForLocale: pageContext session locale).	^#SKIP_BODY</body></methods><methods><class-id>WebMVCTests.TagTest</class-id> <category>status checks</category><body package="WebMVC-Tests">checkRedirect: mimeMessage	self assert: (mimeMessage fieldValueAt: 'status') = '302 '.</body><body package="WebMVC-Tests">checkSuccess: mimeMessage	self assert: (mimeMessage fieldValueAt: 'status') = '200 '.</body></methods><methods><class-id>WebMVCTests.TagTest</class-id> <category>running</category><body package="WebMVC-Tests">executeRequest: internalRequest forForm: formDescription	^self requestServlet: '/servlet/WebMVCController' query: InternalStateManager requestStateKeyName , '=' , internalRequest id printString , '&amp;formID=' , formDescription formID.</body><body package="WebMVC-Tests">executeRequest: internalRequest forForm: formDescription withQuery: queryString	^self requestServlet: '/servlet/WebMVCController' query: queryString , '&amp;' , InternalStateManager requestStateKeyName , '=' , internalRequest id printString , '&amp;formID=' , formDescription formID.</body><body package="WebMVC-Tests">makeRequest: uriString query: queryString 	| request |	request := WebRequest forString: uriString.	request envAt: 'QUERY_STRING' put: queryString.	request envAt: 'HTTP_HOST' put: 'localhost'.	request decodeQueryData.	session ifNotNil: [ :s | request cachedSession: s].	^request</body><body package="WebMVC-Tests">newSession	session := nil</body><body package="WebMVC-Tests">requestPage: uriString	^self requestPage: uriString query: ''</body><body package="WebMVC-Tests">requestPage: uriString query: queryString	| request handler responder |	request := self makeRequest: uriString query: queryString.	handler := JSPHandler for: request webSite: site.	responder := WWResponder new handler: handler.	request answerWith: (responder answerFor: request).	request responseStream commit.	request responseStream position: 0.	session := request cachedSession.	^request</body><body package="WebMVC-Tests">requestServlet: uriString query: queryString 	| request handler responder |	request := self makeRequest: uriString query: queryString.	handler := ServletHandler for: request webSite: site.	responder := WWResponder new handler: handler.	request answerWith: (responder answerFor: request).	request responseStream commit.	request responseStream position: 0.	session := request cachedSession.	^request</body><body package="WebMVC-Tests">setUp	| d |	savedPreferences := Preferences current copy.	Preferences current serializeStateOntoURL: true; useInternalRedirects: true.	site := WebSite newMinimal: 'tests'.	d := (Dictionary new)				add: 'configuration' -&gt; ((Dictionary new)									add: 'directory' -&gt; (Filename defaultDirectory construct: 'tests') asString;									add: 'environment' -&gt; 'WebMVC';									yourself);				yourself.	site initializeFrom: d.	WebSite addSite: site.	self newSession</body><body package="WebMVC-Tests">startSession	self requestPage: '/index.jsp'</body><body package="WebMVC-Tests">tearDown	WebSite removeSite: site.	WebMVC.Preferences current: savedPreferences.	self newSession</body></methods><methods><class-id>WebMVCTests.TagTest</class-id> <category>comparisons</category><body package="WebMVC-Tests">compareResponse: mimeMessage toFileNamed: name	self compareResponse: mimeMessage toStream: name asFilename readStream.</body><body package="WebMVC-Tests">compareResponse: mimeMessage toStream: rs1 	| rs2 |	rs1 lineEndLF.	rs2 := mimeMessage body value readStream.	rs2 lineEndLF.		[| result |	result := self whiteSpaceInsensitiveCompare: rs1 and: rs2.	result 		ifFalse: 			[rs1 position: 0.			rs2 position: 0.			(Differator newOn: rs1 contents asByteString and: rs2 contents asByteString) 				open].	self assert: result] 			ensure: 				[rs1 close.				rs2 close]</body><body package="WebMVC-Tests">condenseWhiteSpaces: rs	"Condence all whitespace (isSeparator = true) characters to a single space and answer the condensed string"	| ws c |	ws := WriteStream on: String new.	[rs atEnd] whileFalse:		[c := rs next.		c isSeparator 			ifFalse: [ws nextPut: c]			ifTrue: 				[ws nextPut: Character space.					[rs atEnd not and: [rs peek isSeparator]] whileTrue: [ rs next ]]].	^ws contents</body><body package="WebMVC-Tests">whiteSpaceInsensitiveCompare: s1 and: s2	| t1 t2 |	t1 := self condenseWhiteSpaces: s1.	t2 := self condenseWhiteSpaces: s2.	^t1 match: t2</body></methods><methods><class-id>WebMVCTests.TagTest</class-id> <category>internal request building</category><body package="WebMVC-Tests">getActiveForm	^self getActiveState formNamed: (self getFormIDFromSession)</body><body package="WebMVC-Tests">getActiveState	^self requestStateManager stateAt: (self requestStateManager states keys asSortedCollection last)</body><body package="WebMVC-Tests">getFormIDFromSession	^self getActiveState forms keys asSortedCollection last</body><body package="WebMVC-Tests">getRequestStateIDFromSession	^self getActiveState id</body><body package="WebMVC-Tests">makeFormForApplication: applicationName class: applicationClass requestState: requestState	| form |	form := requestState newApplicationFormNamed: 'abc'.	form applicationClassName: applicationClass fullName.	form applicationName: applicationName.	form applicationClassName: applicationClass fullName.	form formModelScope: 'request'.	^form</body><body package="WebMVC-Tests">makeFormForCommand: commandClassName requestState: requestState	| form |	form := requestState newCommandFormNamed: 'abc'.	form commandClassName: commandClassName.	^form</body><body package="WebMVC-Tests">makeFormForModel: modelName class: modelClass requestState: requestState	| form |	form := requestState newModelOnlyFormNamed: 'abc'.	form modelClassName: modelClass fullName.	form modelName: modelName.	form formModelScope: 'request'.	^form</body><body package="WebMVC-Tests">makeInputFieldDescription	^InputFieldDescription new</body><body package="WebMVC-Tests">makeRequestState	^self requestStateManager stateAt: (self requestStateManager nextStateKey)</body><body package="WebMVC-Tests">requestStateManager	^session at: ServletWithModel applicationStateVariableName ifAbsentPut: [InternalStateManager new]</body></methods><methods><class-id>WebMVCTests.FormTagTest</class-id> <category>running</category><body package="WebMVC-Tests">testTagInsertion	| request m |	(Preferences current)		serializeStateOntoURL: true;		useInternalRedirects: true.	request := self requestPage: '/FormTagTest_tagInsertion.jsp'.	m := Net.RFC822Message readFrom: request responseStream.	self checkSuccess: m.	self compareResponse: m toFileNamed: 'tests/FormTagTest_tagInsertion.result' </body></methods><methods><class-id>WebMVC.StringConverter</class-id> <category>api</category><body package="WebMVC-TypeConverters">stringToValue: aStringValue	^aStringValue</body><body package="WebMVC-TypeConverters">valueToString: aStringValue	^aStringValue</body></methods><methods><class-id>WebMVC.BeanFinder</class-id> <category>api</category><body package="WebMVC-Servlets">findBeanWithPathString: pathString for: client	^self findBeanWithPathString: pathString for: client factoryBlock: []</body><body package="WebMVC-Servlets">findBeanWithPathString: pathString for: client factoryBlock: factoryBlock	^self findBeanWithPathString: pathString scope: 'page' for: client factoryBlock: factoryBlock</body><body package="WebMVC-Servlets">findBeanWithPathString: pathString scope: scope for: client factoryBlock: factoryBlock 	| path first lastPathElement secondToLast result |	self needsWork: 'too long, refactor.'.	path := pathString tokensBasedOn: $..	first := (client scopeNamed: scope) attributeAt: path first ifAbsent: [nil].	first ifNil: [^path size = 1 ifTrue: [|value|		value := factoryBlock value.		(client scopeNamed: scope) attributeAt: path first put: value.		value] ifFalse: []].	path removeFirst.	path isEmpty ifTrue: [^first].	lastPathElement := path last.	path removeLast.	secondToLast := path inject: first				into: [:current :pathElement | (current perform: pathElement asSymbol) ifNil: [^nil]].	secondToLast ifNil: [^nil].	(result := secondToLast perform: lastPathElement asSymbol) ifNil: 			[result := factoryBlock value.			secondToLast perform: (lastPathElement , ':') asSymbol with: result].	^result</body></methods><methods><class-id>WebMVC.FrozenViewRequest</class-id> <category>accessing</category><body package="WebMVC-Servlets">attributes	^attributes</body><body package="WebMVC-Servlets">attributes: anObject	attributes := anObject</body><body package="WebMVC-Servlets">path	^path</body><body package="WebMVC-Servlets">path: anObject	path := anObject</body><body package="WebMVC-Servlets">query	^query</body><body package="WebMVC-Servlets">query: anObject	query := anObject</body></methods><methods><class-id>WebMVC.FrozenViewRequest class</class-id> <category>instance creation</category><body package="WebMVC-Servlets">fromRequest: request 	^(self new)		path: request webRequest PATH_INFO;		query: request webRequest QUERY_STRING;		attributes: request allAttributes;		yourself</body></methods><methods><class-id>WebMVC.TagLibrary</class-id> <category>tests</category><body package="WebMVC-Tools">affectedByTagClass: aClass 	^self tags anySatisfy: 			[:each | 			((each tagclass = aClass or: [aClass subclasses includes: each tagclass]) 				or: [each tagclass class = aClass]) 					or: [aClass subclasses includes: each tagclass class]]</body></methods><methods><class-id>WebMVC.TagLibrary class</class-id> <category>tag management</category><body package="WebMVC-Tools">allTagDefinitions	|  libraries |	libraries := Dictionary new.	(Pragma allNamed: #tagLibrary:name:bodyContent: withAllSubclassesOf: VisualWave.Tag class) do: [ :pragma |		|tag|		tag := TagDefinition new.		tag perform: pragma  keyword withArguments: pragma arguments.		tag tagclass: pragma methodClass instanceBehavior absoluteName.		tag attributes: (self collectAttributesForClass: pragma methodClass instanceBehavior).		(libraries at: (pragma arguments first) ifAbsentPut: [TagLibrary new uri: (pragma arguments first); name: (pragma arguments first); yourself]) addTag: tag].	^libraries</body></methods><methods><class-id>WebMVC.TagLibrary class</class-id> <category>private-tag management</category><body package="WebMVC-Tools">collectAttributesForClass: class	| attributes |	attributes := OrderedCollection new.	(Pragma allNamed: #required:description: from: class to: VisualWave.Tag) do: [ :pragma |		| attribute |		attribute := TagAttribute new.		attribute name: (self inferNameFromPragma: pragma).		attribute perform: pragma keyword withArguments: pragma arguments.		attributes add: attribute.		].	^attributes</body><body package="WebMVC-Tools">inferNameFromPragma: aPragma	| sel |	sel := aPragma selector.	^sel copyFrom: 4 to: sel size -1</body></methods><methods><class-id>WebMVCTests.ErrorSourceCommand</class-id> <category>api</category><body package="WebMVC-Tests">defaultModelClass	^nil</body><body package="WebMVC-Tests">executeWithModel: anObject controller: aController	aController addError: LoginError new.	^aController findForward: 'failure'</body></methods><methods><class-id>WebMVC.TagAttribute</class-id> <category>accessing</category><body package="WebMVC-Tools">description	^description</body><body package="WebMVC-Tools">required: aBoolean description: aString	required := aBoolean.	description := aString</body></methods><methods><class-id>WebMVC.TagAttribute</class-id> <category>printing</category><body package="WebMVC-Tools">printOn: aStream	super printOn: aStream.	aStream nextPut: $&lt;.	aStream nextPutAll: name.	aStream nextPut: $&gt;.</body></methods><methods><class-id>WebMVC.TagAttribute</class-id> <category>comparing</category><body package="WebMVC-Tools">&lt;= other	^self name &lt;= other name</body><body package="WebMVC-Tools">= other	^(other isKindOf: self class) and: [other name = self name]</body></methods><methods><class-id>WebMVC.WebError class</class-id> <category>from url</category><body package="WebMVC-Errors">fromURLString: aString	| semi type |	semi := (aString indexOf: $;).	type := 'WebMVC.' , (aString copyFrom: 1 to: (semi - 1)).	^type asQualifiedReference value newFromString: (aString copyFrom: semi to: aString size).</body></methods><methods><class-id>WebMVCTests.SequencingTest</class-id> <category>running</category><body package="WebMVC-Tests">testReload	| request m state form |	self newSession.	request := self requestPage: '/SequencingTest_testReload1.jsp'.	m := Net.RFC822Message readFrom: request responseStream.	self checkSuccess: m.	self compareResponse: m		toFileNamed: 'tests/SequencingTest_testReload1.result'.	"submit the page"	state := self getActiveState.	form := self getActiveForm.	request := self executeRequest: self getActiveState forForm: self getActiveForm withQuery: 'username=bob%20smith&amp;password=crap&amp;age=35'.	m := Net.RFC822Message readFrom: request responseStream.	self checkSuccess: m.	self compareResponse: m		toFileNamed: 'tests/SequencingTest_testReload2.result'.	"resubmit the first page -- shouldn't execute the command"	request := self executeRequest: state forForm: form withQuery: 'username=steve&amp;password=yuk&amp;age=999999999'.	m := Net.RFC822Message readFrom: request responseStream.	self checkSuccess: m.	self compareResponse: m		toFileNamed: 'tests/SequencingTest_testReload3.result'</body></methods><methods><class-id>WebMVC.ValidationError</class-id> <category>displaying</category><body package="WebMVC-Errors">errorText	^description</body><body package="WebMVC-Errors">urlErrorText	^'ValidationError;' , self variableName</body></methods><methods><class-id>WebMVC.ValidationError</class-id> <category>accessing</category><body package="WebMVC-Errors">description	^description</body><body package="WebMVC-Errors">description: anObject	description := anObject</body><body package="WebMVC-Errors">fieldName	^(self variableName includes: $;)		ifTrue: [self variableName copyFrom: 1 to: (self variableName indexOf: $;)]		ifFalse: [self variableName]</body><body package="WebMVC-Errors">variableName	^variableName</body><body package="WebMVC-Errors">variableName: anObject	variableName := anObject</body></methods><methods><class-id>WebMVC.ValidationError</class-id> <category>testing</category><body package="WebMVC-Errors">isInputFieldError	^true</body></methods><methods><class-id>WebMVC.ValidationError class</class-id> <category>instance creation</category><body package="WebMVC-Errors">forVariable: aVariable description: aString	^self new variableName: aVariable; description: aString; yourself</body></methods><methods><class-id>WebMVC.GenericError</class-id> <category>accessing</category><body package="WebMVC-Errors">message	^message</body><body package="WebMVC-Errors">message: anObject	message := anObject</body></methods><methods><class-id>WebMVC.GenericError</class-id> <category>displaying</category><body package="WebMVC-Errors">errorText	^message</body></methods><methods><class-id>WebMVC.GenericError</class-id> <category>testing</category><body package="WebMVC-Errors">isInputFieldError	^false</body></methods><methods><class-id>WebMVC.GenericError class</class-id> <category>instance creation</category><body package="WebMVC-Errors">withMessage: aString	^self new message: aString; yourself</body></methods><methods><class-id>WebMVC.ServletWithModel</class-id> <category>subclass responsibility</category><body package="WebMVC-Servlets">continue: aURL	self subclassResponsibility</body><body package="WebMVC-Servlets">defaultModelClass	self subclassResponsibility</body><body package="WebMVC-Servlets">processRequest	self subclassResponsibility</body></methods><methods><class-id>WebMVC.ServletWithModel</class-id> <category>accessing</category><body package="WebMVC-Servlets">addError: anError	self errors add: anError</body><body package="WebMVC-Servlets">errors	^errors ifNil: [errors := OrderedCollection new] ifNotNil: [errors]</body><body package="WebMVC-Servlets">formModel	^formModel</body></methods><methods><class-id>WebMVC.ServletWithModel</class-id> <category>private-model population</category><body package="WebMVC-Servlets">createDefaultModel	^self defaultModelClass ifNotNil: [ :class | formModel := class new]</body><body package="WebMVC-Servlets">createModelForClassNamed: aClassName	^formModel := aClassName asQualifiedReference value new</body><body package="WebMVC-Servlets">findOrCreateModel	formModel := self modelFromAppropriateScope.	self storeModelInAppropriateScope</body><body package="WebMVC-Servlets">modelClassName	^self formDescription ifNotNil: [:des | des modelClassName]</body><body package="WebMVC-Servlets">modelFromAppropriateScope	self modelName ifNil: [^self createDefaultModel].	^BeanFinder new 		findBeanWithPathString: self modelName		scope: self modelScopeString		for: self		factoryBlock: 			[self modelClassName 				ifNotNil: [self createModelForClassNamed: self modelClassName]				ifNil: [self createDefaultModel]]</body><body package="WebMVC-Servlets">modelName	^self formDescription ifNotNil: [:des | des modelName]</body><body package="WebMVC-Servlets">modelScope	^self scopeNamed: self modelScopeString asLowercase</body><body package="WebMVC-Servlets">modelScopeString	^self formDescription formModelScope</body><body package="WebMVC-Servlets">populateModel	"self formDescription ifNil: [^nil]."	self findOrCreateModel.	self createAdaptor.	formModel ifNil: [^nil].	self validateAndAssignVariables</body><body package="WebMVC-Servlets">scopeNamed: scope	scope = 'request'		ifTrue: [^request].	scope = 'session'		ifTrue: [^self session].	scope = 'application'		ifTrue: [^self webSite application].</body><body package="WebMVC-Servlets">storeModelInAppropriateScope	self modelName ifNil: [^nil].	self modelScope attributeAt: self modelName put: formModel</body><body package="WebMVC-Servlets">validateAndAssignVariables	^adaptor		ifNotNil: [adaptor validateAndAssignFor: self formData: self parameters]</body></methods><methods><class-id>WebMVC.ServletWithModel</class-id> <category>servlet</category><body package="WebMVC-Servlets">doGet	self currentSequencer executeIfPermitted: self.</body><body package="WebMVC-Servlets">doPost	^self doGet</body><body package="WebMVC-Servlets">execute	self clearPageSequencer.	"the next page will install it's own sequencer and this one has been satisfied"	self populateModel.	^self processRequest</body></methods><methods><class-id>WebMVC.ServletWithModel</class-id> <category>testing</category><body package="WebMVC-Servlets">hasErrors	^errors ifNil: [false] ifNotNil: [errors notEmpty]</body><body package="WebMVC-Servlets">useInternalRedirects	^Preferences current useInternalRedirects</body></methods><methods><class-id>WebMVC.ServletWithModel</class-id> <category>private-adaptor</category><body package="WebMVC-Servlets">createAdaptor	formModel ifNil: [^adaptor := nil].	formModel isFormModel 		ifTrue: [adaptor := formModel]		ifFalse: 			[adaptor := FormModelAdaptor buildFromFormDescription: self formDescription.			adaptor formModel: self formModel]</body></methods><methods><class-id>WebMVC.ServletWithModel</class-id> <category>command api</category><body package="WebMVC-Servlets">removeModel	self modelName ifNil: [^nil].	self modelScope removeAttribute: self modelName</body></methods><methods><class-id>WebMVC.ServletWithModel</class-id> <category>private-internal request state</category><body package="WebMVC-Servlets">formDescription	^formDescription ifNil: 			[formDescription := self formID 						ifNil: [CommandFormDescription forRequest: self request]						ifNotNil: [self incomingRequestState formNamed: self formID]]</body><body package="WebMVC-Servlets">formID	^self request getParameter: 'formID'</body><body package="WebMVC-Servlets">incomingRequestMarker	^(self request getParameter: InternalStateManager requestStateKeyName) ifNotNil: [:marker| marker asNumber]</body><body package="WebMVC-Servlets">incomingRequestState	^self incomingRequestMarker		ifNil: [InternalRequestState new]		ifNotNil: [self requestStateManager stateAt: self incomingRequestMarker]</body><body package="WebMVC-Servlets">incomingSequencer	^self formDescription ifNotNil: [:des | des sequencer]</body><body package="WebMVC-Servlets">requestStateManager	self needsWork: 'move into HttpSession???'.	^session at: self class applicationStateVariableName		ifAbsentPut: [InternalStateManager new]</body></methods><methods><class-id>WebMVC.ServletWithModel</class-id> <category>private-sequencing</category><body package="WebMVC-Servlets">clearPageSequencer	self requestStateManager activeSequencer: nil</body><body package="WebMVC-Servlets">currentSequencer	^self pageSequencer , self formSequencer</body><body package="WebMVC-Servlets">formSequencer	^self incomingSequencer ifNil: [InertSequencer new]</body><body package="WebMVC-Servlets">forwarderForLostSession	"When we loose the session we need to redirect to the home page for the web site.  This redirect has to be _external_	so that the session cookie gets set for the whole we site and not just that path that led us here"	| f |	f := Forwarder 				fromString: '/' , self webSite name , '/' , self webSite defaultPage.	f beExternal.	^f</body><body package="WebMVC-Servlets">pageSequencer	^self requestStateManager activeSequencer ifNil: [InertSequencer new]</body></methods><methods><class-id>WebMVC.ServletWithModel class</class-id> <category>constants</category><body package="WebMVC-Servlets">applicationStateVariableName	^'_WEBMVC_APPLICATIONSTATE'</body><body package="WebMVC-Servlets">modelClassVariableName	^'_WEBMVC_MODELCLASSNAME'</body></methods><methods><class-id>WebMVC.UseBeanTag</class-id> <category>executing</category><body package="WebMVC-Tags">newInstance	^fromBean ifNotNil: [self newInstanceFromValue] ifNil: [super newInstance]</body><body package="WebMVC-Tags">newInstanceFromValue	fromScope ifNil: [fromScope := 'page'].	^BeanFinder new 		findBeanWithPathString: fromBean		scope: fromScope		for: self		factoryBlock: [super newInstance]</body></methods><methods><class-id>WebMVC.ExistsTag</class-id> <category>executing</category><body package="WebMVC-Tags">doStartTag	| bean |	bean := BeanFinder new 				findBeanWithPathString: name				scope: scope				for: self				factoryBlock: [].	^bean ifNotNil: [self class EVAL_BODY_INCLUDE]		ifNil: [self class SKIP_BODY]</body></methods><methods><class-id>Core.StringParameterSubstitution</class-id> <category>initialize</category><body package="WebMVC-Extensions">initialize	argumentTypeMapping := IdentityDictionary new.	startDelim := $&lt;.	endDelim := $&gt;</body></methods><methods><class-id>Core.StringParameterSubstitution</class-id> <category>accessing</category><body package="WebMVC-Extensions">endDelim	^endDelim</body><body package="WebMVC-Extensions">endDelim: anObject	endDelim := anObject</body><body package="WebMVC-Extensions">startDelim	^startDelim</body><body package="WebMVC-Extensions">startDelim: anObject	startDelim := anObject</body></methods><methods><class-id>Core.StringParameterSubstitution</class-id> <category>transforming</category><body package="WebMVC-Extensions">expandedText	(defaultEmphasis == nil and: [argEmphases == nil])		ifTrue: [output := (String new: 40) writeStream]		ifFalse: [output := TextStream on: (String new: 40)].	output emphasis: defaultEmphasis.	[input atEnd] whileFalse:		[self nextCharDo: [:c |				c == startDelim					ifTrue: [self processInputField]					ifFalse: [output nextPut: c]]			else: [:c | output nextPut: c]].	^output contents</body><body package="WebMVC-Extensions">processInputField	| n type mapBlock |	input skipSeparators.	input peek isDigit		ifTrue: 			[n := Integer readFrom: input.			input skipSeparators.			type := input next.			mapBlock := argumentTypeMapping at: type.			mapBlock value: self value: n]		ifFalse:			[[input peek isLetter]				whileTrue:					[type := input next.					mapBlock := argumentTypeMapping at: type.					mapBlock value: self value: 0]].	output emphasis: defaultEmphasis.	input skipSeparators.	(input peekFor: endDelim)		ifFalse: [self error: (#errSyntax &lt;&lt; #dialogs &gt;&gt; 'Syntax error')]</body><body package="WebMVC-Extensions">showBooleanFor: argIndex	| trueString falseString truth |	trueString := self upTo: $:.	input next.   "get past the colon"	falseString := self upTo: endDelim.	truth := args at: argIndex.	(truth == true or: [truth == false])		ifFalse: [self error: (#errBooleanExpected &lt;&lt; #dialogs &gt;&gt; 'Boolean argument expected')].	truth		ifTrue: [output nextPutAll: trueString]		ifFalse: [output nextPutAll: falseString]</body><body package="WebMVC-Extensions">showMultipleFor: argIndex	| singleString multipleString count |	singleString := self upTo: $:.	input next.   "get past the colon"	multipleString := self upTo: endDelim.	count := args at: argIndex.	count respondsToArithmetic ifFalse: [self error: (#errExpectedNumericArg &lt;&lt; #dialogs &gt;&gt; 'Expected a numeric argument')].	count = 1		ifTrue: [output nextPutAll: singleString]		ifFalse: [output nextPutAll: multipleString]</body></methods><methods><class-id>Core.StringParameterSubstitution class</class-id> <category>class initialization</category><body package="WebMVC-Extensions">initialize	"StringParameterSubstitution initialize"	Default := self new.	Default setDefaultEmphasis: nil.	Default map: $p using: [:mt :index | mt printFor: index].	Default map: $s using: [:mt :index | mt nextPutStringFor: index].	Default map: $? using: [:mt :index | mt showBooleanFor: index].	Default map: $# using: [:mt :index | mt showMultipleFor: index].	Default map: $n using: [:mt :dummy | mt output cr].	Default map: $t using: [:mt :dummy | mt output tab].	UsingBraces := self new.	UsingBraces setDefaultEmphasis: nil.	UsingBraces map: $p using: [:mt :index | mt printFor: index].	UsingBraces map: $s using: [:mt :index | mt nextPutStringFor: index].	UsingBraces map: $? using: [:mt :index | mt showBooleanFor: index].	UsingBraces map: $# using: [:mt :index | mt showMultipleFor: index].	UsingBraces map: $n using: [:mt :dummy | mt output cr].	UsingBraces map: $t using: [:mt :dummy | mt output tab].	UsingBraces startDelim: ${.	UsingBraces endDelim: $}.</body></methods><methods><class-id>Core.StringParameterSubstitution class</class-id> <category>defaults</category><body package="WebMVC-Extensions">usingBraces	^UsingBraces</body></methods><methods><class-id>WebMVC.WebMVCController</class-id> <category>private</category><body package="WebMVC-Servlets">createAction	^self formDescription ifNotNil: [:des | des actionFor: self]</body><body package="WebMVC-Servlets">defaultModelClass	^self target ifNotNil: [:t | t defaultModelClass]</body><body package="WebMVC-Servlets">target	^target ifNil: [target := self createAction]</body></methods><methods><class-id>WebMVC.WebMVCController</class-id> <category>executing</category><body package="WebMVC-Servlets">continue: aForwarder 	| theForwarder |	theForwarder := aForwarder ifNil: [self forwarderForLostSession].	self prepareErrorsForNext.	theForwarder 		forwardForServlet: self		request: request		response: response</body><body package="WebMVC-Servlets">executeRequest	self target ifNil: [^nil].	^self formDescription dispatchRequestFor: self on: self target</body><body package="WebMVC-Servlets">lastValidAttributes	^self requestStateManager lastValidAttributes</body><body package="WebMVC-Servlets">lastValidURL	^self requestStateManager lastValidURL</body><body package="WebMVC-Servlets">processRequest	| maybeForwarder |	self hasErrors ifTrue: [^self continue: (self findForward: 'failure')].	[maybeForwarder := self executeRequest] on: Error		do: 			[:ex | 			self webSite debuggable 				ifTrue: [ex pass]				ifFalse: 					[self addError: (GenericError withMessage: ex messageText).					^self continue: (self findForward: 'failure')]].	maybeForwarder isForwarder 		ifTrue: [self continue: maybeForwarder]		ifFalse: [self continue: (self findForward: 'success')]</body><body package="WebMVC-Servlets">requestSelector	| buttonKey buttonDescription |	self formDescription ifNotNil: 			[buttonKey := self formDescription buttons keys 						detect: [:key | self parameters keys includes: key]						ifNone: [].			buttonKey ifNotNil: 					[buttonDescription := self formDescription buttonNamed: buttonKey.					buttonDescription invoke ifNotNil: [^buttonDescription invoke asSymbol]].			self formDescription invoke ifNotNil: [:inv | ^inv asSymbol]].	^#executeWithModel:controller:</body></methods><methods><class-id>WebMVC.WebMVCController</class-id> <category>field descriptions</category><body package="WebMVC-Servlets">descriptionForProperty: aPropertyName	"Right now property descriptions are stored in HIDDEN fields on the form"	^(self formDescription inputForProperty: aPropertyName) description ifNil: [aPropertyName]</body></methods><methods><class-id>WebMVC.WebMVCController</class-id> <category>command api</category><body package="WebMVC-Servlets">findForward: forwardName 	| relUrl |	relUrl := self formDescription ifNotNil: [:fd | fd forwardNamed: forwardName].	^relUrl ifNotNil: 			[relUrl := request webRequest absoluteURLString: relUrl trimQuotes.			Forwarder fromString: relUrl asURI pathString]	"drop the server and protocol parts"</body></methods><methods><class-id>WebMVC.WebMVCController</class-id> <category>private-internal request state</category><body package="WebMVC-Servlets">applicationStateURL	^Preferences current serializeStateOntoURL 		ifTrue: [self outgoingRequestState urlText]		ifFalse: 			[InternalStateManager requestStateKeyName , '=' 				, self outgoingRequestMarker printString]</body><body package="WebMVC-Servlets">outgoingRequestMarker	^self incomingRequestMarker</body><body package="WebMVC-Servlets">outgoingRequestState	^self incomingRequestState</body><body package="WebMVC-Servlets">prepareErrorsForNext	self useInternalRedirects 		ifTrue: [self request attributeAt: 'errors' put: errors]		ifFalse: [self outgoingRequestState errors: errors]</body></methods><methods><class-id>WebMVC.ElementTag</class-id> <category>initialize-release</category><body package="WebMVC-Tags">release	super release.	tabIndex := nil.	accessKey := nil</body></methods><methods><class-id>WebMVC.ElementTag</class-id> <category>api</category><body package="WebMVC-Tags">spacedWriteOn: aStream with: aString 	^aString ifNil: [aStream]		ifNotNil: 			[aStream notEmpty ifTrue: [aStream space].			aStream nextPutAll: aString]</body><body package="WebMVC-Tags">tagParameters	| ws |	ws := WriteStream on: String new.	self tagParametersOn: ws.	^ws contents</body><body package="WebMVC-Tags">tagParametersOn: aStream 	tabIndex 		ifNotNil: [self spacedWriteOn: aStream with: 'tabindex=' , tabIndex].	accessKey 		ifNotNil: [self spacedWriteOn: aStream with: 'accessKey="' , accessKey , '"'].	^aStream</body></methods><methods><class-id>WebMVC.MenuTag</class-id> <category>api</category><body package="WebMVC-Tags">doAfterBody	pageContext out nextPutAll: self bodyContent string.	^self class SKIP_BODY</body><body package="WebMVC-Tags">doEndTag	pageContext out nextPutAll: '&lt;/ul&gt;&lt;/div&gt;'.	^#EVAL_PAGE</body><body package="WebMVC-Tags">doStartTag	pageContext out nextPutAll: '&lt;div id="Menu"&gt;&lt;ul&gt;'.	^self class EVAL_BODY_INCLUDE</body></methods><methods><class-id>WebMVC.ScriptableTag</class-id> <category>initialize-release</category><body package="WebMVC-Tags">release	super release.	onload := nil.	onunload := nil.	onclick := nil.	ondblclick := nil.	onmousedown := nil.	onmouseup := nil.	onmouseover := nil.	onmousemove := nil.	onmouseout := nil.	onfocus := nil.	onblur := nil.	onkeypress := nil.	onkeydown := nil.	onkeyup := nil.	onsubmit := nil.	onreset := nil.	onselect := nil.	onchange := nil.</body></methods><methods><class-id>WebMVC.ScriptableTag</class-id> <category>javascript</category><body package="WebMVC-Tags">formTag	"If this tag is in a form, return the form"	^(self parent isKindOf: FormTag) ifTrue: [self parent] ifFalse: [nil]</body></methods><methods><class-id>WebMVC.ScriptableTag</class-id> <category>api</category><body package="WebMVC-Tags">tagParametersOn: aStream 	super tagParametersOn: aStream.	onload 		ifNotNil: [self spacedWriteOn: aStream with: 'onload="' , onload , '"'].	onunload 		ifNotNil: [self spacedWriteOn: aStream with: 'onunload="' , onunload , '"'].	onclick 		ifNotNil: [self spacedWriteOn: aStream with: 'onclick="' , onclick , '"'].	ondblclick ifNotNil: 			[self spacedWriteOn: aStream with: 'ondblclick="' , ondblclick , '"'].	onmousedown ifNotNil: 			[self spacedWriteOn: aStream with: 'onmousedown="' , onmousedown , '"'].	onmouseup 		ifNotNil: [self spacedWriteOn: aStream with: 'onmouseup="' , onmouseup , '"'].	onmouseover ifNotNil: 			[self spacedWriteOn: aStream with: 'onmouseover="' , onmouseover , '"'].	onmousemove ifNotNil: 			[self spacedWriteOn: aStream with: 'onmousemove="' , onmousemove , '"'].	onmouseout ifNotNil: 			[self spacedWriteOn: aStream with: 'onmouseout="' , onmouseout , '"'].	onfocus 		ifNotNil: [self spacedWriteOn: aStream with: 'onfocus="' , onfocus , '"'].	onblur 		ifNotNil: [self spacedWriteOn: aStream with: 'onblur="' , onblur , '"'].	onkeypress ifNotNil: 			[self spacedWriteOn: aStream with: 'onkeypress="' , onkeypress , '"'].	onkeydown 		ifNotNil: [self spacedWriteOn: aStream with: 'onkeydown="' , onkeydown , '"'].	onkeyup 		ifNotNil: [self spacedWriteOn: aStream with: 'onkeyup="' , onkeyup , '"'].	onsubmit 		ifNotNil: [self spacedWriteOn: aStream with: 'onsubmit="' , onsubmit , '"'].	onreset 		ifNotNil: [self spacedWriteOn: aStream with: 'onreset="' , onreset , '"'].	onselect 		ifNotNil: [self spacedWriteOn: aStream with: 'onselect="' , onselect , '"'].	onchange 		ifNotNil: [self spacedWriteOn: aStream with: 'onchange="' , onchange , '"'].	^aStream</body></methods><methods><class-id>WebMVC.ScriptableTag class</class-id> <category>constants</category><body package="WebMVC-Tags">scriptsVariableName	^'__MVCWEB_SCRIPTS'</body></methods><methods><class-id>WebMVC.MenuItemTag</class-id> <category>api</category><body package="WebMVC-Tags">doStartTag	pageContext out nextPutAll: '&lt;li&gt;&lt;a href="' , self uri asString , '"&gt;' , self text asString , '&lt;/a&gt;&lt;/li&gt;\' withCRs.	^self class SKIP_BODY</body></methods><methods><class-id>WebMVC.MenuItemTag</class-id> <category>accessing</category><body package="WebMVC-Tags">text	^text</body><body package="WebMVC-Tags">uri	^uri</body></methods><methods><class-id>WebMVC.MenuItemTag</class-id> <category>initialize-release</category><body package="WebMVC-Tags">release	super release.	text := nil.	uri := nil</body></methods><methods><class-id>WebMVCTests.TagTestModelWithoutSpecs</class-id> <category>accessing</category><body package="WebMVC-Tests">age	^age</body><body package="WebMVC-Tests">age: anObject	age := anObject</body><body package="WebMVC-Tests">password	^password</body><body package="WebMVC-Tests">password: anObject	password := anObject</body><body package="WebMVC-Tests">username	^username</body><body package="WebMVC-Tests">username: anObject	username := anObject</body></methods><methods><class-id>WebMVC.ButtonDescription</class-id> <category>accessing</category><body package="WebMVC-Servlets">invoke	^invoke</body><body package="WebMVC-Servlets">invoke: anObject	invoke := anObject</body></methods><methods><class-id>WebMVCTests.BaseTagTest</class-id> <category>running</category><body package="WebMVC-Tests">testTagInsertion	| request m |	request := self 				requestPage: '/BaseTagTest.jsp'.	m := Net.RFC822Message readFrom: request responseStream.	self checkSuccess: m.	self compareResponse: m		toFileNamed: 'tests/BaseTagTest.result'</body><body package="WebMVC-Tests">testTagInsertionOnRedirect	| request m internalRequest formDescription |	self startSession.	internalRequest := self makeRequestState.	formDescription := self makeFormForCommand: 'WebMVCTests.DoNothingCommand' requestState: internalRequest.	formDescription forwardNamed: 'success' put: 'BaseTagTest.jsp'.	request := self executeRequest: internalRequest forForm: formDescription.	m := Net.RFC822Message readFrom: request responseStream.	self checkSuccess: m.	self compareResponse: m		toFileNamed: 'tests/BaseTagTest.result'</body></methods><methods><class-id>WebMVC.BaseTag</class-id> <category>api</category><body package="WebMVC-Tags">doStartTag	pageContext response write: '&lt;base href="' , (pageContext linkNamed: pageContext request webRequest unconsumedPath last) , '"&gt;'.	^self class SKIP_BODY</body></methods><methods><class-id>WebMVC.SubmitTag</class-id> <category>api</category><body package="WebMVC-Tags">doStartTag	pageContext out 		nextPutAll: '&lt;input type="SUBMIT" value="' , value 				, (self name ifNotNil: ['" name="' , self name] ifNil: ['']) , '"&gt;\' withCRs.	self installTarget.	^self class SKIP_BODY</body></methods><methods><class-id>WebMVC.SubmitTag</class-id> <category>initialize-release</category><body package="WebMVC-Tags">release	super release.	value := nil</body></methods><methods><class-id>WebMVC.SubmitTag</class-id> <category>private</category><body package="WebMVC-Tags">installTarget	(self currentActionTag formDescription buttonNamed: self name) invoke: invoke</body></methods><methods><class-id>WebMVC.SubmitTag</class-id> <category>accessing</category><body package="WebMVC-Tags">name	^name ifNil: [name := invoke ifNil: ['submit']]</body></methods><methods><class-id>WebMVC.SubmitTag class</class-id> <category>variables</category><body package="WebMVC-Tags">invocationDescriptionFor: aName	^'_WEBMVC_INVOKE_', aName</body></methods><methods><class-id>WebMVC.ResetTag</class-id> <category>api</category><body package="WebMVC-Tags">doStartTag	pageContext out nextPutAll: '&lt;input type="RESET" value="', value , '"&gt;\' withCRs.	^self class SKIP_BODY</body></methods><methods><class-id>WebMVC.StyledTag</class-id> <category>api</category><body package="WebMVC-Tags">fullStyleString	| ws |	ws := WriteStream on: String new.	styleClass		ifNotNil: [ws nextPutAll: 'class="'; nextPutAll: styleClass; nextPut: $"].	styleID		ifNotNil: [ws nextPutAll: 'id="'; nextPutAll: styleID; nextPut: $"].	style		ifNotNil: [ws nextPutAll: 'style="'; nextPutAll: style; nextPut: $"].	^ws contents</body><body package="WebMVC-Tags">tagParametersOn: ws	super tagParametersOn: ws.	styleClass		ifNotNil: [self spacedWriteOn: ws with: 'class="' , styleClass , '"'].	styleID		ifNotNil: [self spacedWriteOn: ws with: 'id="' , styleID , '"'].	style		ifNotNil: [self spacedWriteOn: ws with: 'style="' ,style , '"'].	^ws</body></methods><methods><class-id>WebMVC.StyledTag</class-id> <category>initialize-release</category><body package="WebMVC-Tags">release	super release.	style := nil.	styleID := nil.	styleClass := nil</body></methods><methods><class-id>WebMVC.ActionTag</class-id> <category>form accessing</category><body package="WebMVC-Tags">currentActionTag	^self</body></methods><methods><class-id>WebMVC.ActionTag</class-id> <category>accessing</category><body package="WebMVC-Tags">formID	^formID ifNil: [formID := self generateFormID]</body><body package="WebMVC-Tags">invoke	^invoke</body><body package="WebMVC-Tags">modelName	^modelName</body><body package="WebMVC-Tags">modelScope	^modelScope</body><body package="WebMVC-Tags">targetClass	^targetClass</body></methods><methods><class-id>WebMVC.ActionTag</class-id> <category>initialize-release</category><body package="WebMVC-Tags">release	super release.	modelName := nil.	modelScope := nil.	targetClass := nil.	invoke := nil</body></methods><methods><class-id>WebMVC.ActionTag</class-id> <category>private-internal request state</category><body package="WebMVC-Tags">formDescription	^self outgoingRequestState formNamed: self formID ifAbsentPut: [self makeNewForm]</body><body package="WebMVC-Tags">generateFormID	^(modelName ifNotNil: [modelName] ifNil: ['']) , self hash printString</body><body package="WebMVC-Tags">makeNewForm	^(targetName isNil or: [targetName isEmpty]) 		ifTrue: [(targetClass isNil or: [targetClass isEmpty])			ifTrue: [self outgoingRequestState newModelOnlyFormNamed: self formID]			ifFalse: [self outgoingRequestState newCommandFormNamed: self formID]]		ifFalse: [self outgoingRequestState newApplicationFormNamed: self formID]</body><body package="WebMVC-Tags">resolveClassName: aClassName 	^pageContext webSite environment at: aClassName		ifAbsent: 			[aClassName asQualifiedReference 				valueOrDo: [self error: aClassName , ' not found.']]</body><body package="WebMVC-Tags">sequencerClass	^(sequencer notNil and: [sequencer notEmpty])		ifTrue: [self resolveClassName: sequencer]		ifFalse: []</body><body package="WebMVC-Tags">sequencerInstance	^self sequencerClass ifNotNil: [:class | class newForTag: self]</body><body package="WebMVC-Tags">storeInternalState	self formDescription stateFromActionTag: self</body></methods><methods><class-id>WebMVC.ActionTag class</class-id> <category>random</category><body package="WebMVC-Tags">nextRandom	^RNG next</body></methods><methods><class-id>WebMVC.PropertyAdaptor</class-id> <category>initialize-release</category><body package="WebMVC-Servlets">converterFromDescription: aTypeString	"For now the validation string is just the class name for the validator"	aTypeString ifNil: [^StringConverter new].	^self resolveClassName: aTypeString, 'Converter'.</body><body package="WebMVC-Servlets">fieldSpecFromInputTag: anInputTag	fieldSpec := FieldSpec new.	fieldSpec validator: (self validatorFromDescription: anInputTag validator).	fieldSpec converter: (self converterFromDescription: anInputTag type).	fieldSpec name: self propertyName.	fieldSpec acceptsList: false.  "for now"	^fieldSpec</body><body package="WebMVC-Servlets">initializeForProperty: property fromDescription: anInputFieldDescription	propertyName := property.	fieldSpec := FieldSpec new.	fieldSpec name: property.	fieldSpec validator: (self validatorFromDescription: anInputFieldDescription validator).	fieldSpec converter: (self converterFromDescription: anInputFieldDescription type).	getMethod := propertyName asSymbol.	setMethod := (propertyName , ':') asSymbol.	^self</body><body package="WebMVC-Servlets">initializeForProperty: property fromFormData: formData	propertyName := property.	fieldSpec := FieldSpec new.	fieldSpec name: property.	fieldSpec validator: (self validatorFromDescription: (formData at: (InputTag validatorVariableNameFor: property)) first).	fieldSpec converter: (self converterFromDescription: (formData at: (InputTag typeVariableNameFor: property)) first).	getMethod := propertyName asSymbol.	setMethod := (propertyName , ':') asSymbol.	^self</body><body package="WebMVC-Servlets">initializeForProperty: property fromFormModel: aModel	aModel isFormModel ifFalse: [self error: 'Your model isn''t a form model (doesn''t answer true to isFormModel) so I can''t ask it for a field spec.'].	propertyName := property.	fieldSpec := aModel fieldSpecFor: property.	getMethod := propertyName asSymbol.	setMethod := (propertyName , ':') asSymbol.	^self</body><body package="WebMVC-Servlets">initializeFromInputTag: anInputTag	propertyName := anInputTag property.	getMethod := propertyName asSymbol.	setMethod := (propertyName , ':') asSymbol.	self fieldSpecFromInputTag: anInputTag.	^self</body><body package="WebMVC-Servlets">resolveClassName: className 	^(className asQualifiedReference valueOrDo: 			[('WebMVC.' , className) asQualifiedReference 				valueOrDo: [self error: className , ' not found.']]) new</body><body package="WebMVC-Servlets">validatorFromDescription: validationString	"For now the validation string is just the class name for the validator"	validationString ifNil: [^nil].	^self resolveClassName: validationString</body></methods><methods><class-id>WebMVC.PropertyAdaptor</class-id> <category>accessing</category><body package="WebMVC-Servlets">fieldSpec	^fieldSpec</body><body package="WebMVC-Servlets">getMethod	^getMethod</body><body package="WebMVC-Servlets">getMethod: anObject	getMethod := anObject</body><body package="WebMVC-Servlets">model	^model</body><body package="WebMVC-Servlets">model: anObject	model := anObject</body><body package="WebMVC-Servlets">propertyName	^propertyName</body><body package="WebMVC-Servlets">propertyName: anObject	propertyName := anObject</body><body package="WebMVC-Servlets">setMethod	^setMethod</body><body package="WebMVC-Servlets">setMethod: anObject	setMethod := anObject</body><body package="WebMVC-Servlets">setValue: aValue	^model perform: setMethod with: (fieldSpec stringToValue: aValue)</body><body package="WebMVC-Servlets">value	^fieldSpec valueToString: (model perform: getMethod)</body></methods><methods><class-id>WebMVC.PropertyAdaptor</class-id> <category>validation api</category><body package="WebMVC-Servlets">validate: value for: aController	^fieldSpec ifNotNil: [fieldSpec validateVariable: self propertyName withValue: value for: aController]</body><body package="WebMVC-Servlets">validateAndAssignFor: aController formData: formData	| result value |	result := true.	value := formData at: self propertyName ifAbsent: [''].	(self validate: value for: aController) 				ifNotNil: [:error | 					aController addError: error.					result := false]				ifNil: [self value: value].	^result</body></methods><methods><class-id>WebMVC.PropertyAdaptor class</class-id> <category>instance creation</category><body package="WebMVC-Servlets">forProperty: property fromDescription: anInputFieldDescription	| instance |	instance := self new.	instance initializeForProperty: property fromDescription: anInputFieldDescription.	^instance</body><body package="WebMVC-Servlets">forProperty: property fromFormData: formData	| instance |	instance := self new.	instance initializeForProperty: property fromFormData: formData.	^instance</body><body package="WebMVC-Servlets">forProperty: property fromFormModel: aModel	| instance |	instance := self new.	instance initializeForProperty: property fromFormModel: aModel.	^instance</body><body package="WebMVC-Servlets">fromInputTag: anInputTag	| instance |	instance := self new.	instance initializeFromInputTag: anInputTag.	^instance</body></methods><methods><class-id>WebMVC.TLDBuilder</class-id> <category>aspects</category><body package="WebMVC-Tools">activeTags	"This method was generated by UIDefiner.  Any edits made here	may be lost whenever methods are automatically defined.  The	initialization provided below may have been preempted by an	initialize method."	^activeTags isNil		ifTrue:			[activeTags := SelectionInList new]		ifFalse:			[activeTags]</body><body package="WebMVC-Tools">tagLibrary	"This method was generated by UIDefiner.  Any edits made here	may be lost whenever methods are automatically defined.  The	initialization provided below may have been preempted by an	initialize method."	^tagLibrary isNil		ifTrue:			[tagLibrary := nil asValue]		ifFalse:			[tagLibrary]</body><body package="WebMVC-Tools">tagLibraryChoices	"This method was generated by UIDefiner.  Any edits made here	may be lost whenever methods are automatically defined.  The	initialization provided below may have been preempted by an	initialize method."	^tagLibraryChoices isNil		ifTrue:			[tagLibraryChoices := List new asValue]		ifFalse:			[tagLibraryChoices]</body></methods><methods><class-id>WebMVC.TLDBuilder</class-id> <category>interface opening</category><body package="WebMVC-Tools">postOpenWith: aBuilder	super postOpenWith: aBuilder.	self updateChoices.	self tagLibrary expressInterestIn: #value for: self sendBack: #libraryChanged.	(self builder componentAt: #List1) widget displayStringSelector: #name</body></methods><methods><class-id>WebMVC.TLDBuilder</class-id> <category>conversion</category><body package="WebMVC-Tools">stringToTagLibrary: aString 	^self tagLibraryChoices value detect: [:each | each uri = aString]		ifNone: [nil]</body><body package="WebMVC-Tools">tagLibraryToString: aTagLibrary	^aTagLibrary uri</body></methods><methods><class-id>WebMVC.TLDBuilder</class-id> <category>private-file generation</category><body package="WebMVC-Tools">fileFooterString	^'&lt;/taglib&gt;'</body><body package="WebMVC-Tools">fileHeaderString	^'&lt;?xml version="1.0" ?&gt;&lt;!-- &lt;!DOCTYPE taglib    PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN"    "http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd"&gt; --&gt;&lt;taglib&gt;    &lt;tlibversion&gt;1.0&lt;/tlibversion&gt;    &lt;shortname&gt;HTML&lt;/shortname&gt;'</body><body package="WebMVC-Tools">generateFile: aFilename  forTagLibrary: library	| ws |	ws := aFilename writeStream.		[ws nextPutAll: self fileHeaderString.	library tags do: 			[:tag | 			ws nextPutAll: '    &lt;tag&gt;'; cr.			ws nextPutAll: '        &lt;name&gt;' , tag name , '&lt;/name&gt;' ; cr.			ws nextPutAll: '        &lt;tagclass&gt;' , tag tagclass fullName  , '&lt;/tagclass&gt;' ; cr.			ws nextPutAll: '        &lt;body-content&gt;' , tag bodyContent , '&lt;/body-content&gt;'; cr.			self writeAttributes: tag attributes to: ws.			ws nextPutAll: '    &lt;/tag&gt;'; cr].	ws nextPutAll: self fileFooterString.] 			ensure: [ws close]</body><body package="WebMVC-Tools">writeAttributes: attributes to: ws	attributes do: [:attribute |		ws nextPutAll: '        &lt;attribute&gt;'; cr.		ws nextPutAll: '            &lt;name&gt;' , attribute name , '&lt;/name&gt;'; cr.		ws nextPutAll: '            &lt;required&gt;' , attribute required printString , '&lt;/required&gt;'; cr.		"ws nextPutAll: '            &lt;description&gt;' , attribute description , '&lt;/description&gt;'; cr."		ws nextPutAll: '        &lt;/attribute&gt;'; cr]</body></methods><methods><class-id>WebMVC.TLDBuilder</class-id> <category>changing</category><body package="WebMVC-Tools">libraryChanged	activeTags list: (self tagLibrary value tags)</body></methods><methods><class-id>WebMVC.TLDBuilder</class-id> <category>actions</category><body package="WebMVC-Tools">createFile	| filename |	filename := self tagLibrary value uri.	(filename isNil or: [filename isEmpty]) ifTrue: [		Dialog warn: 'You must enter a file name first.'.		^nil].	filename asFilename exists ifTrue: [		(Dialog confirm: 'File already exists.  Overwrite?') ifFalse: [^nil].		filename asFilename delete].	self generateFile: filename asFilename forTagLibrary: self tagLibrary value.	self resetServer.</body><body package="WebMVC-Tools">inspectTag	self activeTags selection isNil ifTrue: [Dialog warn: 'select the tag first.'].	self activeTags selection inspect</body><body package="WebMVC-Tools">resetServer	VisualWave.WebConfigurationManager clearAndReconfigure.</body><body package="WebMVC-Tools">updateChoices	| selectedIndex |	selectedIndex := self tagLibraryChoices value indexOf: self tagLibrary value.	self  tagLibraryChoices value: (TagLibrary allTagDefinitions values asList).	selectedIndex &gt; 0		ifTrue: [self tagLibrary value: (self tagLibraryChoices value at: selectedIndex)]</body></methods><methods><class-id>WebMVC.FormTag</class-id> <category>api</category><body package="WebMVC-Tags">activateFormModel	| model |	modelName ifNil: [self error: 'need model name'].	model := self formModelScope attributeAt: modelName ifAbsent: [].	model ifNil: 			[model := self newModel.			self formModelScope attributeAt: modelName put: model].	"make model available as a bean"	pageContext handler attributeAt: self class formModelVariableName		put: model</body><body package="WebMVC-Tags">doEndTag	pageContext out nextPutAll: '&lt;/form&gt;'.	pageContext handler attributeAt: self class formModelVariableName put: nil.	self writeFocusScript.	self installValidationScript.	^#EVAL_PAGE</body><body package="WebMVC-Tags">doStartTag	self activateFormModel.	pageContext out 		nextPutAll: '&lt;form method="POST" action="' , self makeAction , '" id="' 				, self formID , '" onsubmit="return ' 				, self validateFormFunctionName , '(this)"&gt;'.	self storeInternalState.	self writeApplicationState.	self writeFormID.	^self class EVAL_BODY_INCLUDE</body><body package="WebMVC-Tags">formModelScope	^self scopeNamed: self modelScope</body><body package="WebMVC-Tags">installValidationScript	validationScript ifNotNil: [		validationScript scriptText: validationScript scriptText , 'if (theErrors.length &gt; 0) {   var msg = '''';   for(i=0; i &lt; theErrors.length; i++) {      msg += theErrors[i] + ''\n'';   }   alert(msg);   return false;}return true;}'.		self addScript: validationScript]</body><body package="WebMVC-Tags">makeAction	action ifNotNil: [^action].	^pageContext linkNamed: 'servlet/WebMVCController'</body><body package="WebMVC-Tags">newModel	^modelClassName asQualifiedReference value new</body><body package="WebMVC-Tags">writeApplicationState	pageContext out nextPutAll: '&lt;input type="HIDDEN" name="' , InternalStateManager requestStateKeyName , '" value="' 				, self outgoingRequestMarker printString , '"&gt;'.</body><body package="WebMVC-Tags">writeFocusScript	firstFocus ifNotNil: 			[pageContext out 				nextPutAll: '&lt;script language="Javascript"&gt;&lt;!--	document.' , self formID , '.' 						, firstFocus , '.focus();// --&gt;&lt;/script&gt;']</body><body package="WebMVC-Tags">writeFormID	pageContext out 		nextPutAll: '&lt;input type="HIDDEN" name="formID"' , '" value="' 				, self formID , '"&gt;\' withCRs</body></methods><methods><class-id>WebMVC.FormTag</class-id> <category>initialize-release</category><body package="WebMVC-Tags">release	super release.	modelClassName := nil.	action := nil.	firstFocus := nil</body></methods><methods><class-id>WebMVC.FormTag</class-id> <category>javascript</category><body package="WebMVC-Tags">addJSCodeToValidation: aString	self validationScript scriptText: (self validationScript scriptText , aString copyWith: Character cr).</body><body package="WebMVC-Tags">validateFormFunctionName	^'validate_form_' , modelName</body><body package="WebMVC-Tags">validationScript	^validationScript ifNil: 			[validationScript := JavascriptScript new name: 'validation for ' , modelName.			validationScript 				scriptText: 'function ' , self validateFormFunctionName 						, '(theForm) {\' withCRs , 'var theErrors = new Array(0);\' withCRs.			validationScript]</body></methods><methods><class-id>WebMVC.FormTag</class-id> <category>accessing</category><body package="WebMVC-Tags">modelScope	^modelScope ifNil: [modelScope := 'request']</body></methods><methods><class-id>WebMVC.FormTag</class-id> <category>private-internal request state</category><body package="WebMVC-Tags">storeInternalState	super storeInternalState.	self formDescription modelClassName: modelClassName</body></methods><methods><class-id>WebMVC.FormTag</class-id> <category>testing</category><body package="WebMVC-Tags">isActionLink	^false</body></methods><methods><class-id>WebMVC.FormTag class</class-id> <category>constants</category><body package="WebMVC-Tags">formModelVariableName	^'_WEBMVC_FORMMODEL'</body><body package="WebMVC-Tags">formNameVariableName	^'_WEBMVC_FORMNAME'</body><body package="WebMVC-Tags">formScopeVariableName	^'_WEBMVC_FORMSCOPE'</body></methods><methods><class-id>WebMVCTests.ActionExecutionTest</class-id> <category>running</category><body package="WebMVC-Tests">testApplicationExecution	| internalRequest formDescription request m |	self startSession.	internalRequest := self makeRequestState.	formDescription := self makeFormForApplication: 'nothing' class: WebMVCTests.DoNothingCommand requestState: internalRequest.	formDescription forwardNamed: 'success' put: 'BaseTagTest.jsp'.	request := self executeRequest: internalRequest forForm: formDescription.	m := Net.RFC822Message readFrom: request responseStream.	self checkSuccess: m.		self assert: ((session attributeAt: 'nothing') isKindOf: WebMVCTests.DoNothingCommand).	self assert: (session attributeAt: 'nothing') executed.</body><body package="WebMVC-Tests">testCommandExecution	| internalRequest formDescription request m |	self startSession.	SingletonCommand clearDefaultInstance.	internalRequest := self makeRequestState.	formDescription := self makeFormForCommand: 'WebMVCTests.SingletonCommand' requestState: internalRequest.	formDescription forwardNamed: 'success' put: 'BaseTagTest.jsp'.	request := self executeRequest: internalRequest forForm: formDescription.	m := Net.RFC822Message readFrom: request responseStream.	self checkSuccess: m.	self assert: SingletonCommand new executed</body><body package="WebMVC-Tests">testModelExecution	| internalRequest formDescription request m |	self startSession.	SingletonCommand clearDefaultInstance.	internalRequest := self makeRequestState.	formDescription := self makeFormForModel: 'nothing' class: WebMVCTests.SingletonCommand requestState: internalRequest.	formDescription forwardNamed: 'success' put: 'BaseTagTest.jsp'.	request := self executeRequest: internalRequest forForm: formDescription.	m := Net.RFC822Message readFrom: request responseStream.	self checkSuccess: m.	self assert: SingletonCommand new executed</body><body package="WebMVC-Tests">testSingleExecution	| internalRequest formDescription request m |	self startSession.	SingletonCommand clearDefaultInstance.	internalRequest := self makeRequestState.	formDescription := self makeFormForCommand: 'WebMVCTests.SingletonCommand' requestState: internalRequest.	formDescription forwardNamed: 'success' put: 'BaseTagTest.jsp'.	request := self executeRequest: internalRequest forForm: formDescription.	m := Net.RFC822Message readFrom: request responseStream.	self checkSuccess: m.	self assert: SingletonCommand new executionCount = 1</body></methods><methods><class-id>WebMVC.FormDescription</class-id> <category>accessing</category><body package="WebMVC-Servlets">formID	^formID</body><body package="WebMVC-Servlets">formID: anObject	formID := anObject</body><body package="WebMVC-Servlets">formModelScope	^formModelScope</body><body package="WebMVC-Servlets">formModelScope: anObject	formModelScope := anObject</body><body package="WebMVC-Servlets">invoke	^invoke</body><body package="WebMVC-Servlets">invoke: anObject	invoke := anObject</body><body package="WebMVC-Servlets">modelClassName	^modelClassName</body><body package="WebMVC-Servlets">modelClassName: anObject	modelClassName := anObject</body><body package="WebMVC-Servlets">modelName	^modelName</body><body package="WebMVC-Servlets">modelName: anObject	modelName := anObject</body><body package="WebMVC-Servlets">sequencer	^sequencer</body><body package="WebMVC-Servlets">sequencer: anObject	sequencer := anObject</body></methods><methods><class-id>WebMVC.FormDescription</class-id> <category>buttons</category><body package="WebMVC-Servlets">buttonNamed: aName	^self buttons at: aName ifAbsentPut: [ButtonDescription new]</body><body package="WebMVC-Servlets">buttons	^buttons ifNil: [buttons := Dictionary new]</body></methods><methods><class-id>WebMVC.FormDescription</class-id> <category>input fields</category><body package="WebMVC-Servlets">inputFields	^inputFields ifNil: [inputFields := Dictionary new]</body><body package="WebMVC-Servlets">inputForProperty: aString	^self inputFields at: aString ifAbsentPut: [InputFieldDescription new]</body></methods><methods><class-id>WebMVC.FormDescription</class-id> <category>forwards</category><body package="WebMVC-Servlets">forwardNamed: aName	^self forwards at: aName ifAbsent: []</body><body package="WebMVC-Servlets">forwardNamed: aName put: aValue	^self forwards at: aName put: aValue</body><body package="WebMVC-Servlets">forwards	^forwards ifNil: [forwards := Dictionary new]</body></methods><methods><class-id>WebMVC.FormDescription</class-id> <category>api</category><body package="WebMVC-Servlets">actionFor: controller	^controller formModel</body><body package="WebMVC-Servlets">dispatchRequestFor: aController on: target 	| selector |	selector := aController requestSelector.	selector numArgs = 0 ifTrue: [^target perform: selector].	selector numArgs = 1 ifTrue: [^target perform: selector with: aController].	selector numArgs = 2 		ifTrue: 			[^target 				perform: selector				with: aController formModel				with: aController].	self error: 'selector must take zero, one arguments'</body><body package="WebMVC-Servlets">stateFromActionTag: aTag 	self		modelName: aTag modelName;		formModelScope: aTag modelScope;		invoke: aTag invoke;		sequencer: aTag sequencerInstance</body></methods><methods><class-id>WebMVC.ApplicationFormDescription</class-id> <category>api</category><body package="WebMVC-Servlets">actionFor: controller 	^BeanFinder new 		findBeanWithPathString: applicationName		scope: 'session'		for: controller		factoryBlock: [applicationClassName asQualifiedReference value new]</body><body package="WebMVC-Servlets">dispatchRequestFor: aController on: target 	| selector |	selector := aController requestSelector.	selector := aController requestSelector.	selector numArgs = 0 ifTrue: [^target perform: selector].	selector numArgs = 1 		ifTrue: [^target perform: selector with: aController formModel].	selector numArgs = 2 		ifTrue: 			[^target 				perform: selector				with: aController formModel				with: aController].	self error: 'selector must take zero, one or two arguments'</body><body package="WebMVC-Servlets">stateFromActionTag: aTag 	super stateFromActionTag: aTag.	self applicationClassName: aTag targetClass</body></methods><methods><class-id>WebMVC.ApplicationFormDescription</class-id> <category>accessing</category><body package="WebMVC-Servlets">applicationClassName	^applicationClassName</body><body package="WebMVC-Servlets">applicationClassName: anObject	applicationClassName := anObject</body><body package="WebMVC-Servlets">applicationName	^applicationName</body><body package="WebMVC-Servlets">applicationName: anObject	applicationName := anObject</body></methods><methods><class-id>WebMVC.CommandFormDescription</class-id> <category>accessing</category><body package="WebMVC-Servlets">commandClassName	^commandClassName</body><body package="WebMVC-Servlets">commandClassName: anObject	commandClassName := anObject</body></methods><methods><class-id>WebMVC.CommandFormDescription</class-id> <category>api</category><body package="WebMVC-Servlets">actionFor: controller	^self commandClassName asQualifiedReference value new</body><body package="WebMVC-Servlets">dispatchRequestFor: aController on: target 	| selector |	selector := aController requestSelector.	selector := aController requestSelector.	selector numArgs = 0 ifTrue: [^target perform: selector].	selector numArgs = 1 		ifTrue: [^target perform: selector with: aController formModel].	selector numArgs = 2 		ifTrue: 			[^target 				perform: selector				with: aController formModel				with: aController].	self error: 'selector must take zero, one or two arguments'</body><body package="WebMVC-Servlets">stateFromActionTag: aTag 	super stateFromActionTag: aTag.	self commandClassName: aTag targetClass</body></methods><methods><class-id>WebMVC.CommandFormDescription class</class-id> <category>instance creation</category><body package="WebMVC-Servlets">forRequest: aRequest	| instance |	aRequest webRequest unconsumedPath isEmpty ifTrue: [^nil].	instance := self new.	instance commandClassName: aRequest webRequest unconsumedPath first.	aRequest webRequest unconsumedPath size &gt; 1		ifTrue: [instance invoke: (aRequest webRequest unconsumedPath at: 2)].	^instance</body></methods><methods><class-id>WebMVC.HtmlTag</class-id> <category>api</category><body package="WebMVC-Tags">doAfterBody	| body |	body := self bodyContent string.	self writeAllScripts.	pageContext out nextPutAll: body.	^self class SKIP_BODY</body><body package="WebMVC-Tags">doEndTag	pageContext response write: '&lt;/html&gt;'.	^#EVAL_PAGE</body><body package="WebMVC-Tags">doStartTag	self checkPageSequence 		ifTrue: 			[self installIncomingRequestState.			self installPageSequencer.			self markAsLastValidView.			pageContext response write: '&lt;html&gt;'.			^self class EVAL_BODY_INCLUDE]		ifFalse: [self halt]</body></methods><methods><class-id>WebMVC.HtmlTag</class-id> <category>javascript</category><body package="WebMVC-Tags">addScript: aJavascriptScript	self scripts add: aJavascriptScript</body><body package="WebMVC-Tags">scripts	"All scriptable tags on a page share the list of active scripts"	^pageContext handler attributeAt: ScriptableTag scriptsVariableName		ifAbsent: 			[| os |			os := OrderedSet new.			pageContext handler attributeAt: ScriptableTag scriptsVariableName put: os.			os]</body><body package="WebMVC-Tags">writeAllScripts	self scripts do: [ :script | self writeScript: script].</body><body package="WebMVC-Tags">writeScript: aJavascriptScript	pageContext out nextPutAll: aJavascriptScript fullScriptText</body></methods><methods><class-id>WebMVC.HtmlTag</class-id> <category>private-internal request state</category><body package="WebMVC-Tags">checkPageSequence	^self requestStateManager activeSequencer		ifNotNil: [:seq |			seq shouldShowPageWithTag: self]		ifNil: [true]</body><body package="WebMVC-Tags">incomingRequestMarker	| appStateNumber |	appStateNumber := self request 				anyQueryValueAt: InternalStateManager requestStateKeyName.	^appStateNumber ifNil: [nil] ifNotNil: [appStateNumber asNumber]</body><body package="WebMVC-Tags">incomingRequestState	| appStateNumber |	appStateNumber := self incomingRequestMarker.	^self requestStateManager stateAt: appStateNumber ifAbsent: [nil]</body><body package="WebMVC-Tags">installIncomingRequestState	Preferences current useInternalRedirects ifTrue: [^nil].	Preferences current serializeStateOntoURL 		ifTrue: 			[| oc |			self needsWork: 'is this really supported in general anymore?'.			oc := OrderedCollection new.			(pageContext request allQueryValuesAt: 'errors') 				do: [:errorString | oc add: (WebError fromURLString: errorString)].			pageContext request attributeAt: 'errors' put: oc]		ifFalse: 			[self incomingRequestState 				ifNotNil: [:state | state installInContext: pageContext]]</body><body package="WebMVC-Tags">installPageSequencer	sequencer 		ifNil: [self requestStateManager activeSequencer: nil]		ifNotNil: [self requestStateManager activeSequencer: (self sequencerClass newForTag: self)]</body><body package="WebMVC-Tags">markAsLastValidView	(self requestStateManager)		lastValidRequest: (FrozenViewRequest fromRequest: self request)</body><body package="WebMVC-Tags">nextMarker	^InternalStateManager nextStateKey</body><body package="WebMVC-Tags">outgoingRequestMarker	^outgoingRequestMarker ifNil: [outgoingRequestMarker := self nextMarker]</body><body package="WebMVC-Tags">outgoingRequestState	^self requestStateManager stateAt: self outgoingRequestMarker</body><body package="WebMVC-Tags">requestStateManager	self needsWork: 'move into HttpSession???'.	^pageContext session at: ServletWithModel applicationStateVariableName		ifAbsentPut: [InternalStateManager new]</body><body package="WebMVC-Tags">resolveClassName: aClassName	^pageContext webSite environment at: aClassName		ifAbsent: 			[aClassName asQualifiedReference 				valueOrDo: [self error: aClassName , ' not found.']]</body><body package="WebMVC-Tags">sequencerClass	^(sequencer notNil and: [sequencer notEmpty])		ifTrue: [self resolveClassName: sequencer]		ifFalse: []</body></methods><methods><class-id>WebMVC.Forwarder</class-id> <category>accessing</category><body package="WebMVC-Servlets">beExternal	external := true</body><body package="WebMVC-Servlets">external	^external ifNil: [external := false]</body><body package="WebMVC-Servlets">urlString	^urlString</body><body package="WebMVC-Servlets">urlString: anObject	urlString := anObject</body></methods><methods><class-id>WebMVC.Forwarder</class-id> <category>api</category><body package="WebMVC-Servlets">externalForwardForServlet: servlet request: request response: response 	response redirectTo: (self urlWithQueryForController: servlet)</body><body package="WebMVC-Servlets">forwardForServlet: servlet request: request response: response 	self external		ifFalse: [self internalForwardForServlet: servlet request: request response: response]		ifTrue: [self externalForwardForServlet: servlet request: request response: response]</body><body package="WebMVC-Servlets">internalForwardForServlet: servlet request: request response: response 	| dispatcher |	dispatcher := servlet servletContext getRequestDispatcher: (self urlWithQueryForController: servlet).	dispatcher forward: request response: response</body><body package="WebMVC-Servlets">urlWithQueryForController: servlet 	| urlWithQuery |	urlWithQuery := (urlString includes: $?) 				ifTrue: [urlString , '&amp;']				ifFalse: [urlString , '?'].	urlWithQuery := urlWithQuery , InternalStateManager requestStateKeyName 				, '=' , servlet outgoingRequestMarker printString.	^urlWithQuery</body></methods><methods><class-id>WebMVC.Forwarder</class-id> <category>testing</category><body package="WebMVC-Servlets">isForwarder	^true</body></methods><methods><class-id>WebMVC.Forwarder class</class-id> <category>instance creation</category><body package="WebMVC-Servlets">fromString: aString	| instance |	instance := self new urlString: aString; yourself.	WebMVC.Preferences current useInternalRedirects ifFalse: [instance beExternal].	^instance</body></methods><methods><class-id>WebMVC.IntegerConverter</class-id> <category>api</category><body package="WebMVC-TypeConverters">stringToValue: aString	^aString asNumber asInteger</body><body package="WebMVC-TypeConverters">valueToString: aNumber	^aNumber 		ifNil: ['']		ifNotNil: [aNumber printString]</body></methods><methods><class-id>WebMVC.LabelTag</class-id> <category>api</category><body package="WebMVC-Tags">doEndTag	pageContext out nextPutAll: '&lt;/label&gt;'.	^#EVAL_PAGE</body><body package="WebMVC-Tags">doStartTag	pageContext out nextPutAll: '&lt;label ' , self tagParameters , '&gt;'.	^self class EVAL_BODY_INCLUDE</body><body package="WebMVC-Tags">tagParametersOn: aStream 	| errors myError |	super tagParametersOn: aStream.	errors := pageContext request attributeAt: 'errors' ifAbsent: [].	errors ifNil: [myError := nil]		ifNotNil: 			[myError := errors 						detect: [:error | error isInputFieldError and: [error fieldName = for]]						ifNone: [nil]].	(myError notNil and: [errorClass notNil]) 		ifTrue: [self spacedWriteOn: aStream with: 'class="' , errorClass , '"'].	self spacedWriteOn: aStream with: 'for="_' , for , '"'.	^aStream</body></methods><methods><class-id>WebMVC.LabelTag</class-id> <category>initialize-release</category><body package="WebMVC-Tags">initialize	super initialize.	^self</body><body package="WebMVC-Tags">release	super release.	for := nil.	errorClass := nil</body></methods><methods><class-id>WebMVC.NotExistsTag</class-id> <category>executing</category><body package="WebMVC-Tags">doStartTag	^super doStartTag = self class SKIP_BODY		ifTrue: [self class EVAL_BODY_INCLUDE]		ifFalse: [self class SKIP_BODY]</body></methods><methods><class-id>WebMVC.ActionDataTag</class-id> <category>initialize-release</category><body package="WebMVC-Tags">release	super release.	name := nil.	value := nil</body></methods><methods><class-id>WebMVC.ActionDataTag</class-id> <category>api</category><body package="WebMVC-Tags">doAfterBody	| body |	body := self bodyContent string.	(body notNil and: [body trimBlanks notEmpty]) ifTrue:   [self setValue: body trimBlanks].	self currentActionTag addArgument: self.	^self class SKIP_BODY</body><body package="WebMVC-Tags">doStartTag	^self class EVAL_BODY_INCLUDE</body><body package="WebMVC-Tags">urlText	^name , '=' , (VisualWave.URLEncoder new encode: value)</body></methods><methods><class-id>WebMVC.ActionDataTag</class-id> <category>accessing</category><body package="WebMVC-Tags">name	^name</body></methods><methods><class-id>WebMVC.Preferences</class-id> <category>initialize-release</category><body package="WebMVC-Servlets">initialize	useInternalRedirects := true.	serializeStateOntoURL := true.	^self</body></methods><methods><class-id>WebMVC.Preferences</class-id> <category>accessing</category><body package="WebMVC-Servlets">serializeStateOntoURL	^serializeStateOntoURL</body><body package="WebMVC-Servlets">serializeStateOntoURL: anObject	serializeStateOntoURL := anObject</body><body package="WebMVC-Servlets">useInternalRedirects	^useInternalRedirects</body><body package="WebMVC-Servlets">useInternalRedirects: anObject	useInternalRedirects := anObject</body></methods><methods><class-id>WebMVC.Preferences class</class-id> <category>private</category><body package="WebMVC-Servlets">new	^super new initialize</body></methods><methods><class-id>WebMVC.Preferences class</class-id> <category>singleton</category><body package="WebMVC-Servlets">current	^Current</body><body package="WebMVC-Servlets">current: aPreferences	Current := aPreferences</body></methods><methods><class-id>WebMVC.ForwardLinkTag</class-id> <category>api</category><body package="WebMVC-Tags">doAfterBody	| body |	body := self bodyContent string.	(body notNil and: [body trimBlanks notEmpty]) ifTrue:   [self setHref: body trimBlanks].	self install.	^self class SKIP_BODY</body><body package="WebMVC-Tags">doStartTag	^self class EVAL_BODY_INCLUDE</body><body package="WebMVC-Tags">install	self currentActionTag formDescription forwardNamed: name put: href</body></methods><methods><class-id>WebMVC.ForwardLinkTag</class-id> <category>initialize-release</category><body package="WebMVC-Tags">release	super release.	name := nil.	href := nil</body></methods><methods><class-id>WebMVC.ForwardLinkTag class</class-id> <category>hidden variable</category><body package="WebMVC-Tags">variableNameForForward: aString	^'_WEBMVC_FORWARD_' , aString asUppercase</body></methods><methods><class-id>WebMVC.FieldValidator</class-id> <category>api</category><body package="WebMVC-TypeConverters">, validator	^CompositeValidator new , self , validator</body><body package="WebMVC-TypeConverters">installScriptsInTag: aScriptableTag	"Do nothing by default since not all validators support Javascript"</body><body package="WebMVC-TypeConverters">validateVariable: aVariable withValue: aStringValue for: aController	"Answer nil if validation is successful, otherwise answer and error object."	self subclassResponsibility</body></methods><methods><class-id>WebMVC.MaxLengthValidator</class-id> <category>accessing</category><body package="WebMVC-TypeConverters">maxLength	^maxLength</body><body package="WebMVC-TypeConverters">maxLength: anObject	maxLength := anObject</body></methods><methods><class-id>WebMVC.MaxLengthValidator</class-id> <category>api</category><body package="WebMVC-TypeConverters">validateVariable: aVariable withValue: aStringValue for: aController	^(aStringValue isNil or: [aStringValue size &lt;= maxLength])		ifFalse: [ValidationError forVariable: aVariable description: 'Please enter a string shorter than ' , maxLength printString 		, ' characters for the ' , (aController descriptionForProperty: aVariable)		, ' input field.']		ifTrue: [nil]</body></methods><methods><class-id>WebMVC.MaxLengthValidator class</class-id> <category>instance creation</category><body package="WebMVC-TypeConverters">maxLength: aValue	^self new maxLength: aValue; yourself</body></methods><methods><class-id>WebMVC.CompositeValidator</class-id> <category>api</category><body package="WebMVC-TypeConverters">, validator	self validators add: validator.	^self</body><body package="WebMVC-TypeConverters">validate: aStringValue	self validators do: [ :each | (each validate: aStringValue) ifNotNil: [:error | ^error]].	^nil</body></methods><methods><class-id>WebMVC.CompositeValidator</class-id> <category>accessing</category><body package="WebMVC-TypeConverters">validators	^validators		ifNil: [validators := OrderedCollection new]		ifNotNil: [validators]</body></methods><methods><class-id>WebMVC.MinLengthValidator</class-id> <category>accessing</category><body package="WebMVC-TypeConverters">minLength	^minLength</body><body package="WebMVC-TypeConverters">minLength: anObject	minLength := anObject</body></methods><methods><class-id>WebMVC.MinLengthValidator</class-id> <category>api</category><body package="WebMVC-TypeConverters">errorMessageFor: aString	^'Please enter a string longer than ' , minLength printString 		, ' characters for the ' , aString		, ' input field.'</body><body package="WebMVC-TypeConverters">installChangeValidatorInTag: anInputTag 	anInputTag 		setOnchange: 'if (!checkMinStringLength(this.value,' 				, minLength printString , ', ''' 				, anInputTag property , ''')) { alert(''' 				, (self errorMessageFor: anInputTag description) 					, '''); return false; } else { return true; }'</body><body package="WebMVC-TypeConverters">installFormValidatorInTag: anInputTag 	anInputTag formTag ifNotNil: 			[:form | 			form 				addJSCodeToValidation: 'if (!checkMinStringLength(theForm.' 						, anInputTag property , '.value,' 						, minLength printString , ', ''' 						, anInputTag property , ''')) { theErrors.push(''' 						, (self errorMessageFor: anInputTag description) , ''');}']</body><body package="WebMVC-TypeConverters">installScriptsInTag: anInputTag 	anInputTag addScript: self class changeScript.	self installChangeValidatorInTag: anInputTag.	self installFormValidatorInTag: anInputTag</body><body package="WebMVC-TypeConverters">validateVariable: aVariable withValue: aStringValue for: aController	^(aStringValue notNil and: [aStringValue size &gt;= minLength])		ifFalse: [ValidationError forVariable: aVariable description: (self errorMessageFor: (aController descriptionForProperty: aVariable))]		ifTrue: [nil]</body></methods><methods><class-id>WebMVC.MinLengthValidator class</class-id> <category>instance creation</category><body package="WebMVC-TypeConverters">minLength: aValue	^self new minLength: aValue; yourself</body></methods><methods><class-id>WebMVC.MinLengthValidator class</class-id> <category>scripts</category><body package="WebMVC-TypeConverters">changeScript	^ChangeScript		ifNil: [ChangeScript := self makeChangeScript]		ifNotNil: [ChangeScript]</body><body package="WebMVC-TypeConverters">clearChangeScript	"self clearChangeScript"	ChangeScript := nil</body><body package="WebMVC-TypeConverters">makeChangeScript	| script |	script := JavascriptScript new name: 'MinLengthCheck'; yourself.	script scriptText: 'function checkMinStringLength(theString, minLength, name){   if(theString == null || theString.length &lt; minLength) {     return false;   }   return true;}'.	^script</body></methods><methods><class-id>WebMVC.RequiredFieldValidator</class-id> <category>api</category><body package="WebMVC-TypeConverters">errorMessageFor: description	^'A value is required for the field labeled ' , description , '.'</body><body package="WebMVC-TypeConverters">installChangeValidatorInTag: anInputTag 	anInputTag 		setOnchange: 'if (!checkMinStringLength(this.value,1,''' 				, anInputTag property , ''')) { alert(''' 				, (self errorMessageFor: anInputTag description) 					, '''); return false; } else { return true; }'</body><body package="WebMVC-TypeConverters">installFormValidatorInTag: anInputTag 	anInputTag formTag ifNotNil: 			[:form | 			form 				addJSCodeToValidation: 'if (!checkMinStringLength(theForm.' 						, anInputTag property , '.value,1, ''' 						, anInputTag property , ''')) { theErrors.push(''' 						, (self errorMessageFor: anInputTag description) , ''');}']</body><body package="WebMVC-TypeConverters">installScriptsInTag: anInputTag 	anInputTag addScript: MinLengthValidator changeScript.	self installChangeValidatorInTag: anInputTag.	self installFormValidatorInTag: anInputTag</body><body package="WebMVC-TypeConverters">validateVariable: aVariable withValue: aStringValue for: aController 	^(aStringValue notNil and: [aStringValue notEmpty]) 		ifFalse: 			[ValidationError forVariable: aVariable				description: (self 						errorMessageFor: (aController descriptionForProperty: aVariable))]		ifTrue: [nil]</body></methods><methods><class-id>WebMVC.EMailAddressFormatValidator</class-id> <category>api</category><body package="WebMVC-TypeConverters">errorMessageFor: anInputTag	^'A valid email address is required in the field labeled ' , anInputTag , '.'</body><body package="WebMVC-TypeConverters">validateVariable: aVariable withValue: aStringValue for: aController 	^(aStringValue includes: $@) 		ifTrue: []		ifFalse: 			[ValidationError forVariable: aVariable				description: (self 						errorMessageFor: (aController descriptionForProperty: aVariable))]</body></methods><methods><class-id>WebMVCTests.ErrorsTagTest</class-id> <category>running</category><body package="WebMVC-Tests">testTagInsertionWithErrors	"The Html tag is supposed to install internal request state provided by the servlet.  	This state should be available using the attributeAt: style access in the page"	| request m internalRequest formDescription |	self startSession.	internalRequest := self makeRequestState.	formDescription := self makeFormForCommand: 'WebMVCTests.ErrorSourceCommand' requestState: internalRequest.	formDescription forwardNamed: 'failure' put: 'ErrorsTagTest_tagInsertion.jsp'.	request := self executeRequest: internalRequest forForm: formDescription.	m := Net.RFC822Message readFrom: request responseStream.	self checkSuccess: m.	self compareResponse: m		toFileNamed: 'tests/ErrorsTagTest_tagInsertionWithErrors.result'</body></methods><methods><class-id>WebMVC.InternalRequestState</class-id> <category>accessing</category><body package="WebMVC-Servlets">errors	^errors ifNil: [ errors := OrderedCollection new] ifNotNil: [errors]</body><body package="WebMVC-Servlets">errors: anObject	errors := anObject</body><body package="WebMVC-Servlets">formNamed: formName	^forms at: formName</body><body package="WebMVC-Servlets">formNamed: formName ifAbsent: aBlock	^forms at: formName ifAbsent: aBlock</body><body package="WebMVC-Servlets">formNamed: formName ifAbsentPut: aBlock	^forms at: formName ifAbsentPut: aBlock</body><body package="WebMVC-Servlets">forms	^forms</body><body package="WebMVC-Servlets">id	^id</body><body package="WebMVC-Servlets">id: anObject	id := anObject</body><body package="WebMVC-Servlets">newApplicationFormNamed: formName	| form |	form := ApplicationFormDescription new formID: formName; yourself.	forms at: formName put: form.	^form</body><body package="WebMVC-Servlets">newCommandFormNamed: formName	| form |	form := CommandFormDescription new formID: formName; yourself.	forms at: formName put: form.	^form</body><body package="WebMVC-Servlets">newModelOnlyFormNamed: formName	| form |	form := FormDescription new formID: formName; yourself.	forms at: formName put: form.	^form</body></methods><methods><class-id>WebMVC.InternalRequestState</class-id> <category>initialize-release</category><body package="WebMVC-Servlets">initialize	errors := OrderedCollection new.	forms := Dictionary new.	^self</body></methods><methods><class-id>WebMVC.InternalRequestState</class-id> <category>context</category><body package="WebMVC-Servlets">installInContext: aPageContext 	aPageContext request attributeAt: 'errors' put: self errors.</body></methods><methods><class-id>WebMVC.InternalRequestState</class-id> <category>http</category><body package="WebMVC-Servlets">urlText	| ws |	ws := WriteStream on: String new.	self errors do: 			[:each | 			ws				nextPutAll: 'errors=';				nextPutAll: (self class urlEncoder encode: each urlErrorText)]		separatedBy: [ws nextPut: $&amp;].	^ws contents</body></methods><methods><class-id>WebMVC.InternalRequestState class</class-id> <category>instance creation</category><body package="WebMVC-Servlets">new	^super new initialize</body></methods><methods><class-id>WebMVC.InternalRequestState class</class-id> <category>url encoding</category><body package="WebMVC-Servlets">urlEncoder	^URLEncoder</body></methods><methods><class-id>WebMVC.ActionLinkTag</class-id> <category>initialize-release</category><body package="WebMVC-Tags">release	super release.	dataItems := nil.</body></methods><methods><class-id>WebMVC.ActionLinkTag</class-id> <category>body tag</category><body package="WebMVC-Tags">doBeforeBody</body><body package="WebMVC-Tags">processBody	bodyContent pageContext: self pageContext.	[self doBeforeBody.	 self doAfterBody = VisualWave.BodyTag EVAL_BODY_TAG] whileTrue.</body></methods><methods><class-id>WebMVC.ActionLinkTag</class-id> <category>testing</category><body package="WebMVC-Tags">isActionLink	^true</body></methods><methods><class-id>WebMVC.ActionLinkTag</class-id> <category>action arguments</category><body package="WebMVC-Tags">addArgument: anActionArgTag	self formDescription inputForProperty: anActionArgTag name. "create the input property"	self dataItems add: anActionArgTag</body><body package="WebMVC-Tags">dataItems	^dataItems ifNil: [dataItems := OrderedCollection new]</body></methods><methods><class-id>WebMVC.ActionLinkTag</class-id> <category>api</category><body package="WebMVC-Tags">doAfterBody	| body |	body := self bodyContent string.	pageContext out nextPutAll: '&lt;a href=' , self link , '&gt;'.	pageContext out nextPutAll: body.	pageContext out nextPutAll: '&lt;/a&gt;'.	self storeInternalState.	^self class SKIP_BODY</body><body package="WebMVC-Tags">doStartTag	^self class EVAL_BODY_INCLUDE</body><body package="WebMVC-Tags">link	| ws |	ws := WriteStream on: String new.	targetClass ifNil: 			[ws nextPutAll: (pageContext linkNamed: 'servlet/WebMVCController')]		ifNotNil: 			[ws 				nextPutAll: (pageContext linkNamed: 'servlet/WebMVCController')].	ws nextPut: $?.	self dataItems do: [:arg | ws nextPutAll: arg urlText; nextPut: $&amp;].	ws nextPutAll: 'formID=' , self formID , '&amp;'.	ws nextPutAll: InternalStateManager requestStateKeyName , '=' , self outgoingRequestMarker printString.	^ws contents</body></methods><methods><class-id>WebMVC.ActionRedirectTag</class-id> <category>api</category><body package="WebMVC-Tags">doAfterBody	pageContext response redirectTo: self link</body></methods><methods><class-id>WebMVC.JavascriptScript</class-id> <category>accessing</category><body package="WebMVC-Tags">name	^name</body><body package="WebMVC-Tags">name: anObject	name := anObject</body><body package="WebMVC-Tags">scriptText	^scriptText</body><body package="WebMVC-Tags">scriptText: anObject	scriptText := anObject</body></methods><methods><class-id>WebMVC.JavascriptScript</class-id> <category>comparing</category><body package="WebMVC-Tags">= other	^(other isKindOf: self class) and: [self name = other name]</body></methods><methods><class-id>WebMVC.JavascriptScript</class-id> <category>api</category><body package="WebMVC-Tags">fullScriptText	^'&lt;SCRIPT language=javascript&gt;&lt;!--' , self scriptText , '// --&gt;&lt;/SCRIPT&gt;'</body></methods><methods><class-id>WebMVC.OptionTag</class-id> <category>api</category><body package="WebMVC-Tags">doEndTag	pageContext out nextPutAll: '&lt;/option&gt;'.	^#EVAL_PAGE</body><body package="WebMVC-Tags">doStartTag	pageContext out nextPutAll: '&lt;option ' , self tagParameters , '&gt;'.	pageContext out nextPutAll: value.	^self class EVAL_BODY_INCLUDE</body></methods><methods><class-id>WebMVC.OptionTag</class-id> <category>private</category><body package="WebMVC-Tags">activeSelectTag	^pageContext handler attributeAt: SelectTag activeSelectTagVariableName ifAbsent: [nil]</body><body package="WebMVC-Tags">nameIs: aString	^aString = value</body><body package="WebMVC-Tags">shouldBeSelected	self activeSelectTag ifNotNil: 			[:select | 			select findSelectedValue 				ifNotNil: [:v | ^v isString ifTrue: [v = value] ifFalse: [v includes: value]]].	^selected notNil</body><body package="WebMVC-Tags">tagParametersOn: ws 	super tagParametersOn: ws.	self shouldBeSelected ifTrue: [self spacedWriteOn: ws with: 'selected '].	label ifNotNil: [self spacedWriteOn: ws with: 'label="' , label , '"'].	value ifNotNil: [self spacedWriteOn: ws with: 'value="' , value , '"'].	^ws</body></methods><methods><class-id>WebMVC.OptionTag</class-id> <category>initialize-release</category><body package="WebMVC-Tags">release	super release.	label := nil.	selected := nil</body></methods><methods><class-id>WebMVC.IntegerValidator</class-id> <category>api</category><body package="WebMVC-TypeConverters">errorMessageFor: description	^'A numeric value is required for the field labeled ' , description , '.'</body><body package="WebMVC-TypeConverters">validateVariable: aVariable withValue: aStringValue for: aController 	self 		needsWork: 'This stinks.  Checking for Error is too general since it would even catch MNU and makes debugging a chore.  Need better number parsing class.'.	^	[(Locale current numberPolicy reader readFrom: aStringValue readStream		type: Integer) asInteger.	nil] 			on: Error			do: 				[:ex | 				ex return: (ValidationError forVariable: aVariable							description: (self 									errorMessageFor: (aController descriptionForProperty: aVariable)))]</body></methods><methods><class-id>WebMVCTests.HtmlTagTest</class-id> <category>running</category><body package="WebMVC-Tests">testErrorInstallation1	"The Html tag is supposed to install internal request state provided by the servlet.  	This state should be available using the attributeAt: style access in the page"	| request m internalRequest formDescription |	(Preferences current)		serializeStateOntoURL: true;		useInternalRedirects: true.	self startSession.	internalRequest := self makeRequestState.	formDescription := self makeFormForCommand: 'WebMVCTests.ErrorSourceCommand' requestState: internalRequest.	formDescription forwardNamed: 'failure' put: 'HtmlTagTest_errorInstallation.jsp'.	request := self executeRequest: internalRequest forForm: formDescription.	m := Net.RFC822Message readFrom: request responseStream.	self checkSuccess: m.	self compareResponse: m toFileNamed: 'tests/HtmlTagTest_errorInstallation.result'</body><body package="WebMVC-Tests">testErrorInstallation2	"The Html tag is supposed to install internal request state provided by the servlet.  	This state should be available using the attributeAt: style access in the page"	| request m internalRequest formDescription |	(Preferences current)		serializeStateOntoURL: false;		useInternalRedirects: true.	self startSession.	internalRequest := self makeRequestState.	formDescription := self makeFormForCommand: 'WebMVCTests.ErrorSourceCommand' requestState: internalRequest.	formDescription forwardNamed: 'failure' put: 'HtmlTagTest_errorInstallation.jsp'.	request := self executeRequest: internalRequest forForm: formDescription.	m := Net.RFC822Message readFrom: request responseStream.	self checkSuccess: m.	self compareResponse: m		toFileNamed: 'tests/HtmlTagTest_errorInstallation.result'</body><body package="WebMVC-Tests">testErrorInstallation3	"The Html tag is supposed to install internal request state provided by the servlet.  	This state should be available using the attributeAt: style access in the page"	| request m url path query internalRequest formDescription |	(Preferences current)		serializeStateOntoURL: false;		useInternalRedirects: false.	self startSession.	internalRequest := self makeRequestState.	formDescription := self makeFormForCommand: 'WebMVCTests.ErrorSourceCommand' requestState: internalRequest.	formDescription forwardNamed: 'failure' put: 'HtmlTagTest_errorInstallation.jsp'.	request := self executeRequest: internalRequest forForm: formDescription.	m := Net.RFC822Message readFrom: request responseStream.	self checkRedirect: m.	url := m fieldValueAt: 'location'.	self assert: (url includes: $/).	self assert: (url includes: $?).	"I have to get rid of the /tests since I'm passing this request right to the handler"	path := url copyFrom: 7 to: (url indexOf: $?) - 1.	query := url copyFrom: (url indexOf: $?) + 1 to: url size.	request := self requestPage: path query: query.	m := Net.RFC822Message readFrom: request responseStream.	self compareResponse: m		toFileNamed: 'tests/HtmlTagTest_errorInstallation.result'</body><body package="WebMVC-Tests">testTagInsertion	| request m |	request := self requestPage: '/HtmlTagTest_tagInsertion.jsp'.	m := Net.RFC822Message readFrom: request responseStream.	self checkSuccess: m.	self compareResponse: m toFileNamed: 'tests/HtmlTagTest_tagInsertion.result'</body></methods><methods><class-id>WebMVC.InputTag</class-id> <category>accessing</category><body package="WebMVC-Tags">description	^description		ifNil: [property]</body><body package="WebMVC-Tags">formModelName	self needsWork: 'what the heck is this?'.	^name		ifNil: [name := FormTag formModelVariableName]</body><body package="WebMVC-Tags">property	^property</body><body package="WebMVC-Tags">propertyAdaptor	^propertyAdaptor ifNil: [self formModel ifNotNil: [propertyAdaptor := self makePropertyAdaptorForModel: self formModel]]</body><body package="WebMVC-Tags">redisplay	^redisplay		ifNil: [redisplay := true]</body><body package="WebMVC-Tags">type	^type</body><body package="WebMVC-Tags">validator	^validator</body></methods><methods><class-id>WebMVC.InputTag</class-id> <category>api</category><body package="WebMVC-Tags">doStartTag	pageContext out nextPutAll: '&lt;input ' , self tagParameters , '&gt;'.	description ifNotNil: [self storeDescription].	type ifNotNil: [self storeType].	validator ifNotNil: [self storeValidator].	^self class SKIP_BODY</body><body package="WebMVC-Tags">tagParametersOn: ws 	self installValidatorScripts.	super tagParametersOn: ws.	inputTagType ifNotNil: [self spacedWriteOn: ws with: 'type="' , inputTagType , '"'].	property 		ifNotNil: [self spacedWriteOn: ws with: 'name="' , property , '" id="_' , property , '"'].	self findValue ifNotNil: [:v | self spacedWriteOn: ws with: 'value="' , v withHTMLEscapes , '"'].	size ifNotNil: [self spacedWriteOn: ws with: 'size="' , size , '"'].	^ws</body></methods><methods><class-id>WebMVC.InputTag</class-id> <category>initialize-release</category><body package="WebMVC-Tags">release	super release.	name := nil.	property := nil.	size := nil.	redisplay := nil.	inputTagType := nil.	description := nil</body></methods><methods><class-id>WebMVC.InputTag</class-id> <category>private</category><body package="WebMVC-Tags">findValue	property isNil | self redisplay not ifTrue: [^''].	^self propertyAdaptor		ifNil: ['']		ifNotNil: [self propertyAdaptor value ifNil: ['']]."self formModel ifNil: ['']		ifNotNil: 			[:formModel | 			| pa |			pa := self makePropertyAdaptorForModel: formModel.			pa value ifNil: ['']]""			spec := formModel fieldSpecFor: property.			(formModel perform: property asSymbol) 				ifNotNil: [:value | spec valueToString: value]				ifNil: ['']]"</body><body package="WebMVC-Tags">formModel	^pageContext handler attributeAt: self formModelName</body><body package="WebMVC-Tags">installValidatorScripts	(self propertyAdaptor fieldSpec) installValidatorScriptsInTag: self</body><body package="WebMVC-Tags">makePropertyAdaptorForModel: aModel 	^aModel isFormModel 		ifTrue: 			[self 				needsWork: 'maybe I could just return the field spec for this property???  This would be more consistent with the way adaptors are used in ServletWithModel'.			(PropertyAdaptor forProperty: self property fromFormModel: aModel)				model: aModel;				yourself]		ifFalse: 			[(PropertyAdaptor fromInputTag: self)				model: aModel;				yourself]</body><body package="WebMVC-Tags">storeDescription	(self currentActionTag formDescription inputForProperty: property) 		description: description</body><body package="WebMVC-Tags">storeType	(self currentActionTag formDescription inputForProperty: property) 		type: type</body><body package="WebMVC-Tags">storeValidator	(self currentActionTag formDescription inputForProperty: property) 		validator: validator</body></methods><methods><class-id>WebMVC.InputTag class</class-id> <category>variables</category><body package="WebMVC-Tags">descriptionVariableFor: aVariableName	^'_WEBMVC_' , aVariableName , '_DESCRIPTION'</body><body package="WebMVC-Tags">typeVariableNameFor: aString	^'_WEBMVC_TYPE_' , aString</body><body package="WebMVC-Tags">validatorVariableNameFor: aString	^'_WEBMVC_VALIDATOR_' , aString</body></methods><methods><class-id>WebMVC.HiddenTag</class-id> <category>api</category><body package="WebMVC-Tags">doStartTag	inputTagType := 'HIDDEN'.	super doStartTag.	^self class SKIP_BODY</body></methods><methods><class-id>WebMVCTests.InputTagTest</class-id> <category>running</category><body package="WebMVC-Tests">tagInsertionWith: aBoolean1 and: aBoolean2	"request the page with the form"	| request m |	self newSession.	(Preferences current)		serializeStateOntoURL: aBoolean1;		useInternalRedirects: aBoolean2.	request := self requestPage: '/InputTagTest_tagInsertion.jsp'.	m := Net.RFC822Message readFrom: request responseStream.	self checkSuccess: m.	self compareResponse: m		toFileNamed: 'tests/InputTagTest_tagInsertion.result'.	"submit the page"	request := self executeRequest: self getActiveState forForm: self getActiveForm withQuery: 'username=bob%20smith&amp;password=crap&amp;age=35'.	m := Net.RFC822Message readFrom: request responseStream.	self checkSuccess: m.	self compareResponse: m		toFileNamed: 'tests/InputTagTest_tagInsertionWithData.result'</body><body package="WebMVC-Tests">testTagInsertion	| request m |	(Preferences current)		serializeStateOntoURL: true;		useInternalRedirects: true.	request := self requestPage: '/InputTagTest_tagInsertion.jsp'.	m := Net.RFC822Message readFrom: request responseStream.	self checkSuccess: m.	self compareResponse: m toFileNamed: 'tests/InputTagTest_tagInsertion.result'</body><body package="WebMVC-Tests">testTagInsertionAutoFill	self tagInsertionWith: true and: true.	self tagInsertionWith: false and: true.	self needsWork: 'Serialization of the model for external redirects is not supported.'."	self tagInsertionWith: false and: false.	self tagInsertionWith: true and: false."</body></methods><methods><class-id>WebMVC.CheckBoxTag</class-id> <category>private</category><body package="WebMVC-Tags">findValue	^'yes'</body></methods><methods><class-id>WebMVC.CheckBoxTag</class-id> <category>api</category><body package="WebMVC-Tags">doStartTag	inputTagType := 'CHECKBOX'.	super doStartTag.	^self class SKIP_BODY</body></methods><methods><class-id>WebMVC.TextTag</class-id> <category>api</category><body package="WebMVC-Tags">doStartTag	inputTagType := 'TEXT'.	super doStartTag.	^self class SKIP_BODY</body></methods><methods><class-id>WebMVC.TextAreaTag</class-id> <category>private</category><body package="WebMVC-Tags">findValue	^nil</body><body package="WebMVC-Tags">tagParametersOn: ws 	rows ifNotNil: [self spacedWriteOn: ws with: 'rows="' , rows , '"'].	cols ifNotNil: [self spacedWriteOn: ws with: 'cols="' , cols , '"'].	readonly ifNotNil: [self spacedWriteOn: ws with: 'readonly'].	^ws</body><body package="WebMVC-Tags">textAreaValue	^super findValue</body></methods><methods><class-id>WebMVC.TextAreaTag</class-id> <category>api</category><body package="WebMVC-Tags">doStartTag	pageContext out nextPutAll: '&lt;textarea ' , self tagParameters , '&gt;'.	pageContext out nextPutAll: self textAreaValue.	pageContext out nextPutAll: '&lt;/textarea&gt;'.	^self class SKIP_BODY</body></methods><methods><class-id>WebMVC.SelectTag</class-id> <category>api</category><body package="WebMVC-Tags">doEndTag	pageContext out nextPutAll: '&lt;/select&gt;'.	pageContext handler attributeAt: self class activeSelectTagVariableName put: nil.	^#EVAL_PAGE</body><body package="WebMVC-Tags">doStartTag	pageContext out nextPutAll: '&lt;select ' , self tagParameters , '&gt;'.	pageContext handler attributeAt: self class activeSelectTagVariableName put: self.	^self class EVAL_BODY_INCLUDE</body></methods><methods><class-id>WebMVC.SelectTag</class-id> <category>private</category><body package="WebMVC-Tags">allowMultiple	^multiple		ifNotNil: [multiple asLowercase = 'yes']		ifNil: [false]</body><body package="WebMVC-Tags">findSelectedValue	"We don't really want our value displayed in the tag parameters"	^super findValue</body><body package="WebMVC-Tags">findValue	"We don't really want our value displayed in the tag parameters"	^nil</body><body package="WebMVC-Tags">tagParametersOn: aStream	super tagParametersOn: aStream.	self allowMultiple ifNotNil: [self spacedWriteOn: aStream with: 'multiple'].	^aStream</body></methods><methods><class-id>WebMVC.SelectTag</class-id> <category>initialize-release</category><body package="WebMVC-Tags">release	super release.	multiple := nil</body></methods><methods><class-id>WebMVC.SelectTag class</class-id> <category>constants</category><body package="WebMVC-Tags">activeSelectTagVariableName	^'__WEBMVC_ACTIVE_SELECT_TAG'</body></methods><methods><class-id>WebMVC.RadioTag</class-id> <category>private</category><body package="WebMVC-Tags">findValue	^value		ifNil: ['']</body></methods><methods><class-id>WebMVC.RadioTag</class-id> <category>initialize-release</category><body package="WebMVC-Tags">release	super release.	value := nil</body></methods><methods><class-id>WebMVC.RadioTag</class-id> <category>api</category><body package="WebMVC-Tags">doStartTag	inputTagType := 'RADIO'.	super doStartTag.	^self class SKIP_BODY</body><body package="WebMVC-Tags">tagParametersOn: aStream	super tagParametersOn: aStream.	checked ifNotNil: [self spacedWriteOn: aStream with: 'checked'].	^aStream</body></methods><methods><class-id>WebMVC.ButtonTag</class-id> <category>api</category><body package="WebMVC-Tags">doStartTag	pageContext out nextPutAll: '&lt;button ' , self tagParameters , '&gt;'.	^self class SKIP_BODY</body><body package="WebMVC-Tags">findValue	^value</body></methods><methods><class-id>WebMVC.PasswordTag</class-id> <category>api</category><body package="WebMVC-Tags">doStartTag	inputTagType := 'PASSWORD'.	super doStartTag.	^self class SKIP_BODY</body></methods><methods><class-id>WebMVC.IfErrorsTag</class-id> <category>api</category><body package="WebMVC-Tags">doStartTag	| errors |	errors := pageContext request attributeAt: 'errors' ifAbsent: [].	^(self hasErrorForSpecifiedProperty: errors)		ifTrue: [self class EVAL_BODY_INCLUDE]		ifFalse: [self class SKIP_BODY]</body><body package="WebMVC-Tags">hasErrorForSpecifiedProperty: errors	^property		ifNil: [errors notNil and: [errors notEmpty]]		ifNotNil: [errors anySatisfy: [:each | each isInputFieldError and: [each variableName = property]]]</body></methods><methods><class-id>WebMVC.LoginError</class-id> <category>displaying</category><body package="WebMVC-Errors">errorText	^'Incorrect username or password.'</body><body package="WebMVC-Errors">urlErrorText	^'LoginError;'</body></methods><methods><class-id>WebMVC.LoginError</class-id> <category>testing</category><body package="WebMVC-Errors">isInputFieldError	^false</body></methods><methods><class-id>WebMVC.LoginError class</class-id> <category>from url</category><body package="WebMVC-Errors">newFromString: aString	^self new</body></methods><methods><class-id>WebMVCTests.SessionScopeModelTest</class-id> <category>running</category><body package="WebMVC-Tests">tagInsertionWith: aBoolean1 and: aBoolean2	"request the page with the form"	| request m |	self newSession.	(Preferences current)		serializeStateOntoURL: aBoolean1;		useInternalRedirects: aBoolean2.	request := self requestPage: '/SessionScopeTest_page1.jsp'.	m := Net.RFC822Message readFrom: request responseStream.	self checkSuccess: m.	self compareResponse: m		toFileNamed: 'tests/SessionScopeTest_page1.result'.	"submit the page"	request := self executeRequest: self getActiveState forForm: self getActiveForm withQuery: 'username=bob%20smith&amp;password=junk'.	m := Net.RFC822Message readFrom: request responseStream.	self checkSuccess: m.	self compareResponse: m		toFileNamed: 'tests/SessionScopeTest_page2.result'.	"submit the page"	request := self executeRequest: self getActiveState forForm: self getActiveForm withQuery: 'age=35'.	m := Net.RFC822Message readFrom: request responseStream.	self checkSuccess: m.	self compareResponse: m		toFileNamed: 'tests/SessionScopeTest_page3.result'</body><body package="WebMVC-Tests">testTagInsertionAutoFill	self tagInsertionWith: true and: true.	self tagInsertionWith: false and: true.	self needsWork: 'Serialization of the model for external redirects is not supported.'."	self tagInsertionWith: false and: false.	self tagInsertionWith: true and: false."</body></methods><methods><class-id>WebMVCTests.EmbeddedTypeTest</class-id> <category>running</category><body package="WebMVC-Tests">tagInsertionWith: aBoolean1 and: aBoolean2	"request the page with the form"	| request m |	self newSession.	(Preferences current)		serializeStateOntoURL: aBoolean1;		useInternalRedirects: aBoolean2.	request := self requestPage: '/EmbeddedTypeTest_tagInsertion.jsp'.	m := Net.RFC822Message readFrom: request responseStream.	self checkSuccess: m.	self compareResponse: m		toFileNamed: 'tests/EmbeddedTypeTest_tagInsertion.result'.	"submit the page"	request := self executeRequest: self getActiveState forForm: self getActiveForm withQuery: 'username=bob%20smith&amp;password=crap&amp;age=35'.	m := Net.RFC822Message readFrom: request responseStream.	self checkSuccess: m.	self compareResponse: m		toFileNamed: 'tests/EmbeddedTypeTest_tagInsertionWithData.result'</body><body package="WebMVC-Tests">testTagInsertionAutoFill	self tagInsertionWith: true and: true.	self tagInsertionWith: false and: true.	self needsWork: 'Serialization of the model for external redirects is not supported.'."	self tagInsertionWith: false and: false.	self tagInsertionWith: true and: false."</body><body package="WebMVC-Tests">testValidation	"request the page with the form"	| request m |	self newSession.	(Preferences current)		serializeStateOntoURL: false;		useInternalRedirects: true.	request := self requestPage: '/EmbeddedTypeTest_tagInsertion.jsp'.	m := Net.RFC822Message readFrom: request responseStream.	self checkSuccess: m.	self compareResponse: m		toFileNamed: 'tests/EmbeddedTypeTest_tagInsertion.result'.	"submit the page"	request := self executeRequest: self getActiveState forForm: self getActiveForm withQuery: 'password=somthing&amp;age=monkey'.	m := Net.RFC822Message readFrom: request responseStream.	self checkSuccess: m.	self compareResponse: m		toFileNamed: 'tests/EmbeddedTypeTest_validation.result'</body></methods><methods><class-id>WebMVC.OptGroupTag</class-id> <category>api</category><body package="WebMVC-Tags">doEndTag	pageContext out nextPutAll: '&lt;/optgroup&gt;'.	^#EVAL_PAGE</body><body package="WebMVC-Tags">doStartTag	pageContext out nextPutAll: '&lt;optgroup ' , self tagParameters , '&gt;'.	^self class EVAL_BODY_INCLUDE</body><body package="WebMVC-Tags">tagParametersOn: aStream 	super tagParametersOn: aStream.	label 		ifNotNil: [self spacedWriteOn: aStream with: 'label="' , label , '"'].	^aStream</body></methods><methods><class-id>WebMVC.OptGroupTag</class-id> <category>initialize-release</category><body package="WebMVC-Tags">release	super release.	label := nil</body></methods><methods><class-id>WebMVC.Sequencer</class-id> <category>api</category><body package="WebMVC-Sequencers">executed	"Sent affer a request is executed for this sequencer"</body><body package="WebMVC-Sequencers">executeIfPermitted: aController 	"I will send execute to the controller  if and only if the request corresponding to controllerOrTag is in sequence,	otherwise I might install an error and I will redirect to my view"	(self request: aController request isPermittedFor: aController) 		ifTrue: 			[aController execute.			self executed]		ifFalse: [self redirectFor: aController]</body><body package="WebMVC-Sequencers">request: request isPermittedFor: controller	self subclassResponsibility</body><body package="WebMVC-Sequencers">shouldShowPageWithTag: anHtmlTag	^true</body></methods><methods><class-id>WebMVC.Sequencer</class-id> <category>operators</category><body package="WebMVC-Sequencers">, other	^SequencerList with: self with: other</body></methods><methods><class-id>WebMVC.Sequencer</class-id> <category>private-redirecting</category><body package="WebMVC-Sequencers">installAttributes: attributes inRequest: request	request attributes keys copy do: [ :key | request removeAttribute: key].	request attributes addAll: attributes associations</body><body package="WebMVC-Sequencers">redirectFor: controller 	"aControllerOrTag is out of sequence, I will redirect to the view that is the correct one for this sequence"	| dispatcher |	dispatcher := controller servletContext 				getRequestDispatcher: controller lastValidURL.	self installAttributes: controller lastValidAttributes inRequest: controller request.	dispatcher forward: controller request response: controller response</body></methods><methods><class-id>WebMVC.Sequencer class</class-id> <category>instance creation</category><body package="WebMVC-Sequencers">newForTag: anHtmlTag	^self new</body></methods><methods><class-id>WebMVC.NoRepeatSequencer</class-id> <category>api</category><body package="WebMVC-Sequencers">executed	hasExecuted := true.</body><body package="WebMVC-Sequencers">request: request isPermittedFor: controller	^self hasExecuted not</body></methods><methods><class-id>WebMVC.NoRepeatSequencer</class-id> <category>accessing</category><body package="WebMVC-Sequencers">hasExecuted	^hasExecuted ifNil: [hasExecuted := false]</body></methods><methods><class-id>WebMVC.SequencerList</class-id> <category>api</category><body package="WebMVC-Sequencers">executeIfPermitted: aController	self sequencers do: [:sequencer |		(sequencer request: aController request isPermittedFor: aController)			ifFalse: [^sequencer redirectFor: aController]].	[aController execute] ensure: [self sequencers do: [:sequencer | sequencer executed]]</body></methods><methods><class-id>WebMVC.SequencerList</class-id> <category>private</category><body package="WebMVC-Sequencers">addSequencer: aSequencer	self sequencers add: aSequencer</body><body package="WebMVC-Sequencers">sequencers	^sequencers ifNil: [sequencers := OrderedCollection new]</body></methods><methods><class-id>WebMVC.SequencerList</class-id> <category>operators</category><body package="WebMVC-Sequencers">, other	self addSequencer: other.	^self</body></methods><methods><class-id>WebMVC.SequencerList class</class-id> <category>instance creation</category><body package="WebMVC-Sequencers">with: sequencer1 with: sequencer2	^self new addSequencer: sequencer1; addSequencer: sequencer2; yourself</body></methods><methods><class-id>WebMVC.InertSequencer</class-id> <category>api</category><body package="WebMVC-Sequencers">request: request isPermittedFor: controller	^true</body></methods><methods><class-id>WebMVC.ErrorsTag</class-id> <category>api</category><body package="WebMVC-Tags">doStartTag	| errors |	errors := pageContext request attributeAt: 'errors' ifAbsent: [].	(errors isNil or: [errors isEmpty]) ifTrue: [^self class SKIP_BODY].	pageContext response write: '&lt;div ' , self tagParameters ,'&gt;\' withCRs.	errors size = 1		ifTrue: [pageContext response write: 'Your page contained the following error:']		ifFalse: [pageContext response write: 'Your page contained the following errors'].	pageContext out nextPutAll: '&lt;ul&gt;'.	errors do: [ :each | 		pageContext response write: '&lt;li&gt; ' , each errorText , '&lt;/li&gt;'].	pageContext out nextPutAll: '&lt;/ul&gt;'.	errors size = 1		ifTrue: [pageContext response write: 'Please fix this error and submit the form again.']		ifFalse: [pageContext response write: 'Please fix these errors and submit the form again.'].	pageContext out nextPutAll: '&lt;/div&gt;'.	^self class SKIP_BODY</body></methods><methods><class-id>WebMVC.InternalStateManager</class-id> <category>accessing</category><body package="WebMVC-Servlets">activeSequencer	^activeSequencer</body><body package="WebMVC-Servlets">activeSequencer: anObject	activeSequencer := anObject</body><body package="WebMVC-Servlets">lastValidAttributes	^self lastValidRequest ifNotNil: [self lastValidRequest attributes]</body><body package="WebMVC-Servlets">lastValidRequest	^lastValidRequest</body><body package="WebMVC-Servlets">lastValidRequest: anObject	lastValidRequest := anObject</body><body package="WebMVC-Servlets">lastValidURL	| url view query |	self lastValidRequest ifNil: [^nil].	view := self lastValidRequest path.	query := self lastValidRequest query.	view ifNil: [^nil].	query ifNil: [^view].	url := view , ((view includes: $?) ifTrue: ['&amp;'] ifFalse: ['?']).	url := url , query.	^url</body><body package="WebMVC-Servlets">nextStateKey	^self class nextStateKey</body><body package="WebMVC-Servlets">stateAt: aKey	aKey ifNil: [^nil].	^states at: aKey ifAbsentPut: [InternalRequestState new id: aKey; yourself]</body><body package="WebMVC-Servlets">stateAt: aKey ifAbsent: aBlock	^states at: aKey ifAbsent: aBlock</body><body package="WebMVC-Servlets">states	^states</body></methods><methods><class-id>WebMVC.InternalStateManager</class-id> <category>initialize-release</category><body package="WebMVC-Servlets">initialize	states := Dictionary new.	^self</body></methods><methods><class-id>WebMVC.InternalStateManager class</class-id> <category>instance creation</category><body package="WebMVC-Servlets">new	^super new initialize</body></methods><methods><class-id>WebMVC.InternalStateManager class</class-id> <category>state key</category><body package="WebMVC-Servlets">nextStateKey	^KeyMutex critical: [StateKey := StateKey + 1]</body><body package="WebMVC-Servlets">requestStateKeyName	^'_WEBMVC_REQSTATE'</body></methods><methods><class-id>WebMVC.RequiredPageSequencer</class-id> <category>api</category><body package="WebMVC-Sequencers">request: request isPermittedFor: controller	^controller incomingRequestMarker = outgoingMarker</body><body package="WebMVC-Sequencers">shouldShowPageWithTag: anHtmlTag 	^anHtmlTag incomingRequestMarker = incomingMarker 		and: [anHtmlTag request webRequest PATH_INFO = pathInfo]</body></methods><methods><class-id>WebMVC.RequiredPageSequencer</class-id> <category>accessing</category><body package="WebMVC-Sequencers">incomingMarker: anObject	incomingMarker := anObject</body><body package="WebMVC-Sequencers">incomingRequestMarker	^incomingMarker</body><body package="WebMVC-Sequencers">outgoingMarker: anObject	outgoingMarker := anObject</body><body package="WebMVC-Sequencers">outgoingRequestMarker	^outgoingMarker</body><body package="WebMVC-Sequencers">pathInfo	^pathInfo</body><body package="WebMVC-Sequencers">pathInfo: anObject	pathInfo := anObject</body></methods><methods><class-id>WebMVC.RequiredPageSequencer class</class-id> <category>instance creation</category><body package="WebMVC-Sequencers">newForTag: aTag	| instance |	instance := super newForTag: aTag.	instance outgoingMarker: aTag outgoingRequestMarker.	instance incomingMarker: aTag incomingRequestMarker.	instance pathInfo: aTag request webRequest PATH_INFO.	^instance</body></methods><methods><class-id>WebMVC.TagDefinition</class-id> <category>accessing</category><body package="WebMVC-Tools">attributes: anObject	attributes := anObject</body><body package="WebMVC-Tools">tagLibrary: library name: nameString bodyContent: contentString	name := nameString.	bodyContent := contentString</body></methods><methods><class-id>WebMVC.TagDefinition</class-id> <category>printing</category><body package="WebMVC-Tools">printOn: aStream	super printOn: aStream.	aStream nextPut: $&lt;.	aStream nextPutAll: name.	aStream nextPut: $&gt;.</body></methods><methods><class-id>WebMVC.TagDefinition</class-id> <category>comparing</category><body package="WebMVC-Tools">&lt;= other	^(other isKindOf: self class) and: [self name &lt;= other name]</body><body package="WebMVC-Tools">= other	^(other isKindOf: self class) and: [self name = other name]</body></methods><methods><class-id>WebMVC.FormModelAdaptor</class-id> <category>validation api</category><body package="WebMVC-Servlets">validateAndAssignFor: aController formData: formData 	^propertyAdaptors 		do: [:each | each validateAndAssignFor: aController formData: formData]</body></methods><methods><class-id>WebMVC.FormModelAdaptor</class-id> <category>accessing</category><body package="WebMVC-Servlets">formModel	^formModel</body><body package="WebMVC-Servlets">formModel: anObject	formModel := anObject.	propertyAdaptors do: [:each | each model: formModel]</body></methods><methods><class-id>WebMVC.FormModelAdaptor</class-id> <category>initialize-release</category><body package="WebMVC-Servlets">initializeFromFormDescription: formDescription	self makePropertyAdaptorsFromFormDescription: formDescription</body><body package="WebMVC-Servlets">makePropertyAdaptorsFromFormDescription: formDescription 	propertyAdaptors := OrderedCollection new.	formDescription inputFields keysAndValuesDo: 			[:key :value | 			propertyAdaptors 				add: ((PropertyAdaptor forProperty: key fromDescription: value)						model: self formModel;						yourself)]</body></methods><methods><class-id>WebMVC.FormModelAdaptor class</class-id> <category>instance creation</category><body package="WebMVC-Servlets">buildFromFormDescription: formDescription	"Build an instance based on the type and validation information stored in the supplied form data"	| instance |	instance := self new.	instance initializeFromFormDescription: formDescription.	^instance</body></methods><methods><class-id>WebMVCTests.IfErrorsTagTest</class-id> <category>running</category><body package="WebMVC-Tests">testTagInsertionNoErrorState	"The Html tag is supposed to install internal request state provided by the servlet.  	This state should be available using the attributeAt: style access in the page"	| request m |	request := self requestPage: '/IfErrorsTagTest_tagInsertion.jsp'.	m := Net.RFC822Message readFrom: request responseStream.	self checkSuccess: m.	self compareResponse: m		toFileNamed: 'tests/IfErrorsTagTest_tagInsertionWithoutErrors.result'</body><body package="WebMVC-Tests">testTagInsertionWithErrors	"The Html tag is supposed to install internal request state provided by the servlet.  	This state should be available using the attributeAt: style access in the page"	| request m internalRequest formDescription |	self startSession.	internalRequest := self makeRequestState.	formDescription := self makeFormForCommand: 'WebMVCTests.ErrorSourceCommand' requestState: internalRequest.	formDescription forwardNamed: 'failure' put: 'IfErrorsTagTest_tagInsertion.jsp'.	request := self executeRequest: internalRequest forForm: formDescription.	m := Net.RFC822Message readFrom: request responseStream.	self checkSuccess: m.	self compareResponse: m		toFileNamed: 'tests/IfErrorsTagTest_tagInsertionWithErrors.result'</body><body package="WebMVC-Tests">testTagInsertionWithoutErrors	"The Html tag is supposed to install internal request state provided by the servlet.  	This state should be available using the attributeAt: style access in the page"	| request m internalRequest formDescription |	self startSession.	internalRequest := self makeRequestState.	formDescription := self makeFormForCommand: 'WebMVCTests.DoNothingCommand' requestState: internalRequest.	formDescription forwardNamed: 'success' put: 'IfErrorsTagTest_tagInsertion.jsp'.	request := self executeRequest: internalRequest forForm: formDescription.	m := Net.RFC822Message readFrom: request responseStream.	self checkSuccess: m.	self compareResponse: m		toFileNamed: 'tests/IfErrorsTagTest_tagInsertionWithoutErrors.result'</body></methods><methods><class-id>WebMVCTests.SingletonCommand</class-id> <category>accessing</category><body package="WebMVC-Tests">executed	^self executionCount &gt; 0</body><body package="WebMVC-Tests">executionCount	^executionCount ifNil: [executionCount := 0]</body></methods><methods><class-id>WebMVCTests.SingletonCommand</class-id> <category>api</category><body package="WebMVC-Tests">defaultModelClass	^TagTestModel</body><body package="WebMVC-Tests">executeWithModel: anObject controller: aController	executionCount := self executionCount + 1.	^aController findForward: 'success'</body></methods><methods><class-id>WebMVCTests.SingletonCommand class</class-id> <category>instance creation</category><body package="WebMVC-Tests">clearDefaultInstance	Singleton := SingletonCommand basicNew.</body><body package="WebMVC-Tests">new	"The only way to enfore a singleton with a command is to override new.  This 	is unfortunate but the controller creates the command instance with new."	^Singleton</body></methods><methods><class-id>WebMVC.ValidatingModel</class-id> <category>specs</category><body package="WebMVC-Servlets">fieldSpecFor: aVariable	^self class fieldSpecFor: aVariable</body></methods><methods><class-id>WebMVC.ValidatingModel</class-id> <category>http</category><body package="WebMVC-Servlets">urlTextWithID: aFormID 	"You must implement this if you want your form models to be transferable over a URL 	(as query parameters)."	self subclassResponsibility</body></methods><methods><class-id>WebMVC.ValidatingModel</class-id> <category>validating/assigning</category><body package="WebMVC-Servlets">assign: name toValue: value	| selector spec convertedValue |	(spec := self fieldSpecFor: name) ifNil: [^nil].	selector := (name , ':') asSymbol.	convertedValue := spec stringToValue: value.	(self respondsTo: selector) ifTrue: [self perform: selector with: convertedValue]</body><body package="WebMVC-Servlets">validateAndAssignFor: aController formData: formData 	| result |	result := true.	formData keysAndValuesDo: 			[:key :value | 			(self validateVariable: key withValue: value for: aController) 				ifNotNil: [:error | 					aController addError: error.					result := false]				ifNil: [self assign: key toValue: value]].	^result</body><body package="WebMVC-Servlets">validateVariable: aVariable withValue: aValue 	| spec |	spec := self fieldSpecFor: aVariable.	^spec ifNotNil: [spec validate: aValue]</body><body package="WebMVC-Servlets">validateVariable: aVariable withValue: aValue for: aController	| spec |	spec := self fieldSpecFor: aVariable.	^spec ifNotNil: [spec validateVariable: aVariable withValue: aValue for: aController]</body></methods><methods><class-id>WebMVC.ValidatingModel</class-id> <category>testing</category><body package="WebMVC-Servlets">isFormModel	^true</body></methods><methods><class-id>WebMVC.ValidatingModel class</class-id> <category>specs</category><body package="WebMVC-Servlets">fieldSpecFor: aVariable	| selector |	(aVariable isNil or: [aVariable isEmpty or: [aVariable first = $_]]) ifTrue: [^nil].	selector := (aVariable , 'FieldSpec') asSymbol.	^self safelyPerform: selector</body></methods><methods><class-id>WebMVC.ValidatingModel class</class-id> <category>private</category><body package="WebMVC-Servlets">safelyPerform: aSelector	^[self perform: aSelector]		on: self messageNotUnderstoodSignal		do: [:ex | 			ex parameter selector == aSelector				ifTrue: [ex return: nil]				ifFalse: [ex pass]]</body></methods><methods><class-id>WebMVCTests.TagTestModel</class-id> <category>accessing</category><body package="WebMVC-Tests">age	^age</body><body package="WebMVC-Tests">age: anObject	age := anObject</body><body package="WebMVC-Tests">password	^password</body><body package="WebMVC-Tests">password: anObject	password := anObject</body><body package="WebMVC-Tests">username	^username</body><body package="WebMVC-Tests">username: anObject	username := anObject</body></methods><methods><class-id>WebMVCTests.TagTestModel class</class-id> <category>field specs</category><body package="WebMVC-Tests">ageFieldSpec	^FieldSpec name: 'username' validator: (MinLengthValidator minLength: 1) converter: NumberConverter new</body><body package="WebMVC-Tests">passwordFieldSpec	^FieldSpec name: 'username' validator: (MinLengthValidator minLength: 1) converter: StringConverter new</body><body package="WebMVC-Tests">usernameFieldSpec	^FieldSpec name: 'username' validator: (MinLengthValidator minLength: 1) converter: StringConverter new</body></methods><methods><class-id>WebMVC.FieldSpec</class-id> <category>accessing</category><body package="WebMVC-TypeConverters">acceptsList	^acceptsList		ifNil: [acceptsList := false]		ifNotNil: [acceptsList]</body><body package="WebMVC-TypeConverters">acceptsList: anObject	acceptsList := anObject</body><body package="WebMVC-TypeConverters">converter	^converter</body><body package="WebMVC-TypeConverters">converter: anObject	converter := anObject</body><body package="WebMVC-TypeConverters">name	^name</body><body package="WebMVC-TypeConverters">name: anObject	name := anObject</body><body package="WebMVC-TypeConverters">validator	^validator</body><body package="WebMVC-TypeConverters">validator: anObject	validator := anObject</body></methods><methods><class-id>WebMVC.FieldSpec</class-id> <category>api</category><body package="WebMVC-TypeConverters">installValidatorScriptsInTag: aScriptableTag	self validator ifNotNil: [ :v | v installScriptsInTag: aScriptableTag]</body><body package="WebMVC-TypeConverters">stringToValue: aStringOrCollection 	(aStringOrCollection isString or: [self acceptsList]) ifFalse: [^self stringToValue: aStringOrCollection first].	^converter ifNotNil: [converter stringToValue: aStringOrCollection] ifNil: [aStringOrCollection]</body><body package="WebMVC-TypeConverters">validateVariable: aVariable withValue: aStringOrCollection for: aController	((aStringOrCollection isString not and: [self acceptsList not]) and: [aStringOrCollection notNil]) ifTrue: [^self validateVariable: aVariable withValue: aStringOrCollection first for: aController].	^validator ifNotNil: [validator validateVariable: aVariable withValue: aStringOrCollection for: aController]</body><body package="WebMVC-TypeConverters">valueToString: aValue	^converter valueToString: aValue</body></methods><methods><class-id>WebMVC.FieldSpec class</class-id> <category>instance creation</category><body package="WebMVC-TypeConverters">name: aString validator: aValidator converter: aConverter 	^(self new)		name: aString;		validator: aValidator;		converter: aConverter;		yourself</body></methods><methods><class-id>WebMVC.NumberConverter</class-id> <category>api</category><body package="WebMVC-TypeConverters">stringToValue: aString	^aString asNumber</body><body package="WebMVC-TypeConverters">valueToString: aNumber	^aNumber 		ifNil: ['']		ifNotNil: [aNumber printString]</body></methods><methods><class-id>WebMVCTests.DoNothingCommand</class-id> <category>api</category><body package="WebMVC-Tests">defaultModelClass	^nil</body><body package="WebMVC-Tests">executeWithModel: anObject controller: aController	executed := true.	^aController findForward: 'success'</body></methods><methods><class-id>WebMVCTests.DoNothingCommand</class-id> <category>accessing</category><body package="WebMVC-Tests">executed	^executed ifNil: [executed := false]</body></methods><methods><class-id>VisualWave.UseBeanTag</class-id> <category>executing</category><body package="WebMVC-Extensions">doAfterBody	"Since UseBeanTag is a subclass of Body Tag, the absense of this method seems to prevent	it from evaluating it's even when doStartTag returns EVAL_BODY_INCLUDE"	bodyContent string</body><body package="WebMVC-Extensions">doStartTag	"Scope can be page|request|session|application"	| created |	created := false.	instance := self getScope attributeAt: id ifAbsentPut: [created := true. self newInstance].	pageContext handler beanNamed: id put: instance. "Overwrite is easier than checking"	^created 		ifTrue: [self class EVAL_BODY_INCLUDE]		ifFalse: [self class SKIP_BODY].</body><body package="WebMVC-Extensions">getScope	scope = 'page'		ifTrue: [^pageContext handler].	scope = 'request'		ifTrue: [^pageContext request].	scope = 'session'		ifTrue: [^pageContext session].	scope = 'application'		ifTrue: [^pageContext application].</body></methods><methods><class-id>Core.Object</class-id> <category>webmvc extensions</category><body package="WebMVC-Extensions">isFormModel	^false</body><body package="WebMVC-Extensions">isForwarder	^false</body></methods><methods><class-id>Core.String</class-id> <category>converting</category><body package="WebMVC-Extensions">trimQuotes	"Return a copy of the receiver that has one set of leading and trailing blanks removed."	| start end |	(self size) == 0 ifTrue: [^self].	start := self first = $" ifTrue: [2] ifFalse: [1].	end := self last = $" ifTrue: [self size - 1] ifFalse: [self size].	^self copyFrom: start to: end</body></methods><methods><class-id>VisualWave.JSPHandler</class-id> <category>bean tags</category><body package="WebMVC-Extensions">attributeAt: aString ifAbsentPut: aBlock 	^self beanNamed: aString		ifAbsent: 			[| value |			value := aBlock value.			self beanNamed: aString put: value.			value]</body><body package="WebMVC-Extensions">removeAttribute: aString	self removeBeanNamed: aString</body><body package="WebMVC-Extensions">removeBeanNamed: aString	self visibleObjects removeKey: aString ifAbsent: []</body></methods><methods><class-id>Core.CharacterArray</class-id> <category>converting</category><body package="WebMVC-Extensions">% args	^StringParameterSubstitution usingBraces		originalString: self;		args: args;		expandedText</body></methods><methods><class-id>Core.CharacterArray</class-id> <category>auto complete</category><body package="WebMVC-Extensions">endsWith: aSuffixString	| idx |	self size &lt; aSuffixString size ifTrue: [^false].	idx := self indexOfSubCollection: aSuffixString startingAt: 1 ifAbsent: [-1].	^idx = (self size - aSuffixString size + 1)</body></methods><methods><class-id>Tools.Pragma class</class-id> <category>cds extensions</category><body package="WebMVC-Extensions">allNamed: aSymbol withAllSubclassesOf: aClass	"Answer a collection of all pragmas found in methods of all subclasses	(inclusive) whose keyword is equal to the first argument."	| pragmas |	pragmas := OrderedCollection new.	aClass withAllSubclasses do:		[:each |		self withSelectorsAndPragmasIn: each do:			[:selector :pragmaMessage |			pragmaMessage selector = aSymbol ifTrue:				[pragmas add: (self new message: pragmaMessage class: each selector: selector)]]].	^pragmas</body></methods><methods><class-id>VisualWave.WebSite class</class-id> <category>constants</category><body package="WebMVC-Extensions">identifierTag	"I removed this because it makes testing a pain -- sometimes the message shows up and other times it doesn''t depending on the way in which the page is accessed"	^'' "&lt;!-- Built with Cincom Smalltalk. http://www.cincom.com/smalltalk --&gt;'."</body></methods><methods><class-id>VisualWave.HttpApplication</class-id> <category>variables</category><body package="WebMVC-Extensions">attributeAt: aString	^self attributeAt: aString ifAbsent: []</body><body package="WebMVC-Extensions">attributeAt: aString ifAbsent: aBlock	^self contents at: aString ifAbsent: aBlock</body><body package="WebMVC-Extensions">attributeAt: aString ifAbsentPut: aBlock	^self contents at: aString ifAbsentPut: aBlock</body><body package="WebMVC-Extensions">attributeAt: aString put: aValue	^self contents at: aString put: aValue</body><body package="WebMVC-Extensions">removeAttribute: aString	self contents removeKey: aString ifAbsent: []</body></methods><methods><class-id>VisualWave.Request</class-id> <category>variables</category><body package="WebMVC-Extensions">allAttributes	"Return all attributes, even those of my parent."	| d |	self webRequest hasParent ifFalse: [^self attributes].	d := Dictionary withAll: self attributes.	d addAll: self webRequest parent allAttributes associations.	^d</body><body package="WebMVC-Extensions">attributeAt: aString ifAbsentPut: aBlock 	"Return an object which was stored with this key in the request. If it is not found, evaluate aBlock, store it at that key and return the new value"	^self attributeAt: aString		ifAbsent: 			[| value |			value := aBlock value.			self attributeAt: aString put: value.			value]</body><body package="WebMVC-Extensions">removeAttribute: aString 	(self attributes includesKey: aString) 		ifTrue: [^self attributes removeKey: aString ifAbsent: []].	self webRequest hasParent 		ifTrue: 			[self webRequest parent attributeAt: aString				ifPresent: [self webRequest parent removeAttribute: aString]]</body></methods><methods><class-id>VisualWave.JSPTaglibSAXDriver</class-id> <category>content handler</category><body package="WebMVC-Extensions">characters: aString	| target |	target := attributeSpec isNil ifTrue: [currentTag] ifFalse: [attributeSpec].	target isNil ifTrue: [^self].	currentAttribute isNil ifTrue: [^self].	currentAttribute := currentAttribute copyWithout: $-.	target perform: (currentAttribute, ':') asSymbol with: aString.</body></methods><methods><class-id>VisualWave.Tag</class-id> <category>javascript</category><body package="WebMVC-Extensions">addScript: aJavascriptScript 	"Overridden in HtmlTag which should be an ancestor of any tag on the form which generates Javascript"	parent ifNotNil: [parent addScript: aJavascriptScript]</body></methods><methods><class-id>VisualWave.Tag</class-id> <category>form accessing</category><body package="WebMVC-Extensions">currentActionTag	^parent ifNotNil: [parent currentActionTag]</body></methods><methods><class-id>VisualWave.Tag</class-id> <category>internal request state</category><body package="WebMVC-Extensions">outgoingRequestMarker	^parent ifNotNil: [parent outgoingRequestMarker]</body><body package="WebMVC-Extensions">outgoingRequestState	"Overridden in HtmlTag which should be an ancestor of any tag on the form which needs request state"	^parent ifNotNil: [parent outgoingRequestState]</body></methods><methods><class-id>VisualWave.Tag</class-id> <category>api</category><body package="WebMVC-Extensions">scopeNamed: aString	aString = 'page'		ifTrue: [^pageContext handler].	aString = 'request'		ifTrue: [^pageContext request].	aString = 'session'		ifTrue: [^pageContext session].	aString = 'application'		ifTrue: [^pageContext application].</body></methods><methods><class-id>Core.UndefinedObject</class-id> <category>webmvc extensions</category><body package="WebMVC-Extensions">isFormModel	^false</body><body package="WebMVC-Extensions">isFowarder	^false</body></methods><methods><class-id>WebMVC.GetPropertyTag class</class-id> <category>pragma</category><body package="WebMVC-Tags">tagDefinition	&lt;tagLibrary: 'mvc.tld' name: 'getProperty' bodyContent: 'EMPTY'&gt;</body></methods><methods><class-id>WebMVC.UseBeanTag</class-id> <category>jsp accessing</category><body package="WebMVC-Tags">setFromBean: aString	&lt;required: false description: 'Specify the initial value of this bean using properties of existing beans.'&gt;	fromBean := aString</body><body package="WebMVC-Tags">setFromScope: aString	&lt;required: false description: 'The scope to use to look up the bean specified in fromBean.  Defaults to "page" (that is, 								    the bean must have been brought into page scope usually by useBean).'&gt;	fromScope := aString</body></methods><methods><class-id>WebMVC.UseBeanTag class</class-id> <category>pragma</category><body package="WebMVC-Tags">tagDefinition	&lt;tagLibrary: 'mvc.tld' name: 'useBean' bodyContent: 'JSP'&gt;</body></methods><methods><class-id>WebMVC.ExistsTag</class-id> <category>jsp accessing</category><body package="WebMVC-Tags">setName: aName	&lt;required: true description: 'The name of the bean to look for.'&gt;	name := aName</body><body package="WebMVC-Tags">setScope: aString	&lt;required:true description: 'The scope in which to look.'&gt;	scope := aString</body></methods><methods><class-id>WebMVC.ExistsTag class</class-id> <category>pragma</category><body package="WebMVC-Tags">tagDefinition	&lt;tagLibrary: 'mvc.tld' name: 'exists' bodyContent: 'JSP'&gt;</body></methods><methods><class-id>WebMVC.ElementTag</class-id> <category>jsp accessing</category><body package="WebMVC-Tags">setAccessKey: aValue	&lt;required: false description: 'keyboard shortcut'&gt;	accessKey := aValue</body><body package="WebMVC-Tags">setTabIndex: aValue	&lt;required: false description: 'tab order index'&gt;	tabIndex := aValue</body></methods><methods><class-id>WebMVC.MenuTag class</class-id> <category>pragma</category><body package="WebMVC-Tags">tagDefinition	&lt;tagLibrary: 'mvc.tld' name: 'menu' bodyContent: 'JSP'&gt;</body></methods><methods><class-id>WebMVC.ScriptableTag</class-id> <category>jsp accessing</category><body package="WebMVC-Tags">setOnblur: aValue	&lt;required: false description: 'Javascript code for the onblur event.'&gt;	onblur := aValue</body><body package="WebMVC-Tags">setOnchange: aValue	&lt;required: false description: 'Javascript code for the onchange event.'&gt;	onchange := aValue</body><body package="WebMVC-Tags">setOnclick: aValue	&lt;required: false description: 'Javascript code for the onclick event.'&gt;	onclick := aValue</body><body package="WebMVC-Tags">setOndblclick: aValue	&lt;required: false description: 'Javascript code for the ondblclick event.'&gt;	ondblclick := aValue</body><body package="WebMVC-Tags">setOnfocus: aValue	&lt;required: false description: 'Javascript code for the onfocus event.'&gt;	onfocus := aValue</body><body package="WebMVC-Tags">setOnkeydown: aValue	&lt;required: false description: 'Javascript code for the onkeydown event.'&gt;	onkeydown := aValue</body><body package="WebMVC-Tags">setOnkeypress: aValue	&lt;required: false description: 'Javascript code for the onkeypress event.'&gt;	onkeypress := aValue</body><body package="WebMVC-Tags">setOnkeyup: aValue	&lt;required: false description: 'Javascript code for the onkeyup event.'&gt;	onkeyup := aValue</body><body package="WebMVC-Tags">setOnload: aValue	&lt;required: false description: 'Javascript code for the onload event.'&gt;	onload := aValue</body><body package="WebMVC-Tags">setOnmousedown: aValue	&lt;required: false description: 'Javascript code for the onmousedown event.'&gt;	onmousedown := aValue</body><body package="WebMVC-Tags">setOnmousemove: aValue	&lt;required: false description: 'Javascript code for the onmousemove event.'&gt;	onmousemove := aValue</body><body package="WebMVC-Tags">setOnmouseout: aValue	&lt;required: false description: 'Javascript code for the onmouseout event.'&gt;	onmouseout := aValue</body><body package="WebMVC-Tags">setOnmouseover: aValue	&lt;required: false description: 'Javascript code for the onmouseover event.'&gt;	onmouseover := aValue</body><body package="WebMVC-Tags">setOnmouseup: aValue	&lt;required: false description: 'Javascript code for the onmouseup event.'&gt;	onmouseup := aValue</body><body package="WebMVC-Tags">setOnreset: aValue	&lt;required: false description: 'Javascript code for the onreset event.'&gt;	onreset := aValue</body><body package="WebMVC-Tags">setOnselect: aValue	&lt;required: false description: 'Javascript code for the onselect event.'&gt;	onselect := aValue</body><body package="WebMVC-Tags">setOnsubmit: aValue	&lt;required: false description: 'Javascript code for the onsubmit event.'&gt;	onsubmit := aValue</body><body package="WebMVC-Tags">setOnunload: aValue	&lt;required: false description: 'Javascript code for the onunload event.'&gt;	onunload := aValue</body></methods><methods><class-id>WebMVC.MenuItemTag</class-id> <category>jsp accessing</category><body package="WebMVC-Tags">setText: anObject	&lt;required: false description: 'The text to be displayed in this menu item.'&gt;	text := anObject</body><body package="WebMVC-Tags">setUri: anObject	&lt;required: false description: 'The URL action for this menu item.'&gt;	uri := anObject</body></methods><methods><class-id>WebMVC.MenuItemTag class</class-id> <category>pragma</category><body package="WebMVC-Tags">tagDefinition	&lt;tagLibrary: 'mvc.tld' name: 'mi' bodyContent: 'EMPTY'&gt;</body></methods><methods><class-id>WebMVC.BaseTag class</class-id> <category>pragma</category><body package="WebMVC-Tags">tagDefinition	&lt;tagLibrary: 'mvc.tld' name: 'base' bodyContent: 'EMPTY'&gt;</body></methods><methods><class-id>WebMVC.SubmitTag</class-id> <category>jsp accessing</category><body package="WebMVC-Tags">setInvoke: aString	&lt;required: false description: 'The method to invoke on the model or command object when this button is pressed.  Zero, one and two argument methods are supported.  One argument methods are invoked with the model as the argument.  Two argument methods are invoked with the model and the controller as the arguments.'&gt;	invoke := aString</body><body package="WebMVC-Tags">setName: aString	&lt;required: false description: 'The name of this button.'&gt;	value := aString</body><body package="WebMVC-Tags">setValue: aString	&lt;required: false description: 'The text to be displayed in this button.'&gt;	value := aString</body></methods><methods><class-id>WebMVC.SubmitTag class</class-id> <category>pragma</category><body package="WebMVC-Tags">tagDefinition	&lt;tagLibrary: 'mvc.tld' name: 'submit' bodyContent: 'EMPTY'&gt;</body></methods><methods><class-id>WebMVC.ResetTag class</class-id> <category>pragma</category><body package="WebMVC-Tags">tagDefinition	&lt;tagLibrary: 'mvc.tld' name: 'reset' bodyContent: 'EMPTY'&gt;</body></methods><methods><class-id>WebMVC.StyledTag</class-id> <category>jsp accessing</category><body package="WebMVC-Tags">setStyle: aString	&lt;required: false description: 'CSS style string.'&gt;	style := aString</body><body package="WebMVC-Tags">setStyleClass: aString	&lt;required: false description: 'CSS style class.'&gt;	styleClass := aString</body><body package="WebMVC-Tags">setStyleID: aString	&lt;required: false description: 'CSS style id.'&gt;	styleID := aString</body></methods><methods><class-id>WebMVC.ActionTag</class-id> <category>jsp accessing</category><body package="WebMVC-Tags">setFormID: aString	&lt;required: false description: 'The ID for this form.  This sets the ID parameter for FORM tags (for Javascript or DHTML reference).'&gt;	formID := aString</body><body package="WebMVC-Tags">setInvoke: aValue	&lt;required: false description: 'The name of the method to be invoked.  Zero, one and two argument methods are supported.'&gt;	invoke := aValue</body><body package="WebMVC-Tags">setModelName: aString	&lt;required: false description: 'The name of the model upon which the command will act.'&gt;	modelName := aString</body><body package="WebMVC-Tags">setModelScope: aString	&lt;required: false description: 'The scope of the model upon which the command will act. (must be request or session).'&gt;	modelScope := aString</body><body package="WebMVC-Tags">setSequencer: aString	&lt;required: false description: 'The class name of the sequencer for this form or action link'&gt;	sequencer := aString</body><body package="WebMVC-Tags">setTargetClass: aValue	&lt;required: false description: 'The class of the target to be used as a command.'&gt;	targetClass := aValue</body><body package="WebMVC-Tags">setTargetName: aValue	&lt;required: false description: 'The name target to be used as a command.  Only session scope is searched for this name.'&gt;	targetName := aValue</body></methods><methods><class-id>WebMVC.TLDBuilder class</class-id> <category>interface specs</category><body package="WebMVC-Tools">windowSpec	"Tools.UIPainter new openOnClass: self andSelector: #windowSpec"	&lt;resource: #canvas&gt;	^#(#{UI.FullSpec} 		#window: 		#(#{UI.WindowSpec} 			#properties: #(#{UI.PropertyListDictionary} #sizeType #specifiedSize #positionType #positionSystemDefault #openType #advanced ) 			#label: 			#(#{Kernel.UserMessage} 				#key: #UnlabeledCanvas 				#defaultString: 'TLD Builder' 				#catalogID: #labels ) 			#min: #(#{Core.Point} 265 167 ) 			#max: #(#{Core.Point} 766 516 ) 			#bounds: #(#{Graphics.Rectangle} 840 525 1151 811 ) ) 		#component: 		#(#{UI.SpecCollection} 			#collection: #(				#(#{UI.ComboBoxSpec} 					#layout: #(#{Graphics.LayoutFrame} 53 0 13 0 -15 1 38 0 ) 					#name: #ComboBox1 					#model: #tagLibrary 					#type: #object 					#comboList: #tagLibraryChoices 					#readSelector: 					#stringToTagLibrary: 					#printSelector: 					#tagLibraryToString: ) 				#(#{UI.ActionButtonSpec} 					#layout: #(#{Graphics.LayoutFrame} -98 1 -45 1 -10 1 -10 1 ) 					#name: #ActionButton1 					#model: #createFile 					#label: 'Create' 					#defaultable: true ) 				#(#{UI.ActionButtonSpec} 					#layout: #(#{Graphics.Rectangle} 53 239 141 274 ) 					#name: #ActionButton2 					#model: #updateChoices 					#label: 'Update list' 					#defaultable: true ) 				#(#{UI.SequenceViewSpec} 					#layout: #(#{Graphics.LayoutFrame} 53 0 49 0 -15 1 -55 1 ) 					#name: #List1 					#model: #activeTags 					#callbacksSpec: 					#(#{UI.UIEventCallbackSubSpec} 						#doubleClickSelector: #inspectTag ) 					#useModifierKeys: true 					#selectionType: #highlight ) ) ) )</body></methods><methods><class-id>WebMVC.FormTag</class-id> <category>jsp accessing</category><body package="WebMVC-Tags">setAction: aString	&lt;required: false description: 'The full URL for the form action.  Inserted directly into the action part of the FORM tag.  Usually the COMMAND parameter is used in place of this tag however setting the action to "/echo" can be a useful debugging tool.'&gt;	action := aString</body><body package="WebMVC-Tags">setFirstFocus: aValue	&lt;required: false description: 'The name of the component to get focus when this form is displayed.  If a page contains multiple forms, only one form should have a firstFocus parameter.'&gt;	firstFocus := aValue</body><body package="WebMVC-Tags">setModelClass: aString	&lt;required: false description: 'The name of the class whose instances are models for this form.'&gt;	modelClassName := aString</body></methods><methods><class-id>WebMVC.FormTag class</class-id> <category>pragma</category><body package="WebMVC-Tags">tagDefinition	&lt;tagLibrary: 'mvc.tld' name: 'form' bodyContent: 'JSP'&gt;</body></methods><methods><class-id>WebMVC.HtmlTag</class-id> <category>jsp accessing</category><body package="WebMVC-Tags">setSequencer: aString	&lt;required: false description: 'The specified value should be a the class name for the desired sequencer for this page.  This sequencer will be installed as the active page sequencer and, upon submission of any action (from this page or any other) it will be combined with any sequencers specified for that action and the resulting combination will be asked to permit or disallow the submission.'&gt;	sequencer := aString</body></methods><methods><class-id>WebMVC.HtmlTag class</class-id> <category>pragma</category><body package="WebMVC-Tags">tagDefinition	&lt;tagLibrary: 'mvc.tld' name: 'html' bodyContent: 'JSP'&gt;</body></methods><methods><class-id>WebMVC.LabelTag</class-id> <category>jsp accessing</category><body package="WebMVC-Tags">setErrorClass: aString	&lt;required: false description: 'The CSS class to use if the field corresponding to this label had a validation error during the last submit.'&gt;	errorClass := aString</body><body package="WebMVC-Tags">setFor: aString	&lt;required: false description: 'The name (property) of the INPUT tag that this label is labeling.'&gt;	for := aString</body></methods><methods><class-id>WebMVC.LabelTag class</class-id> <category>pragma</category><body package="WebMVC-Tags">tagDefinition	&lt;tagLibrary: 'mvc.tld' name: 'label' bodyContent: 'EMPTY'&gt;</body></methods><methods><class-id>WebMVC.NotExistsTag class</class-id> <category>pragma</category><body package="WebMVC-Tags">tagDefinition	&lt;tagLibrary: 'mvc.tld' name: 'notExists' bodyContent: 'JSP'&gt;</body></methods><methods><class-id>WebMVC.ActionDataTag</class-id> <category>jsp accessing</category><body package="WebMVC-Tags">setName: aString	&lt;required: true description: 'The name of the argument to the command.'&gt;	name := aString</body><body package="WebMVC-Tags">setValue: aString	&lt;required: false description: 'The value of this argument,  If this tag as a non-empty (or only whitespace) body, this parameter is IGNORED.'&gt;	value := aString</body></methods><methods><class-id>WebMVC.ActionDataTag class</class-id> <category>pragma</category><body package="WebMVC-Tags">tagDefinition	&lt;tagLibrary: 'mvc.tld' name: 'actionData' bodyContent: 'JSP'&gt;</body></methods><methods><class-id>WebMVC.ForwardLinkTag</class-id> <category>jsp accessing</category><body package="WebMVC-Tags">setHref: aString	&lt;required: true description: 'The URL to forward to.  If this tag as a non-empty (or only whitespace) body, this parameter is IGNORED.'&gt;	href := aString</body><body package="WebMVC-Tags">setName: aString	&lt;required: true description: 'The name of this forward link.  Used by the command object to resolve this forward link.'&gt;	name := aString</body></methods><methods><class-id>WebMVC.ForwardLinkTag class</class-id> <category>pragma</category><body package="WebMVC-Tags">tagDefinition	&lt;tagLibrary: 'mvc.tld' name: 'forward' bodyContent: 'EMPTY'&gt;</body></methods><methods><class-id>WebMVC.ActionLinkTag</class-id> <category>jsp accessing</category><body package="WebMVC-Tags">setHref: aValue	&lt;required: false description: 'Set the href of the page to go to.  Normally you don''t use this parameter 									since WebMVC will automatically choose the controller as the target of the link'&gt;</body></methods><methods><class-id>WebMVC.ActionLinkTag class</class-id> <category>pragma</category><body package="WebMVC-Tags">tagDefinition	&lt;tagLibrary: 'mvc.tld' name: 'actionLink' bodyContent: 'JSP'&gt;</body></methods><methods><class-id>WebMVC.ActionRedirectTag class</class-id> <category>pragma</category><body package="WebMVC-Tags">tagDefinition	&lt;tagLibrary: 'mvc.tld' name: 'actionRedirect' bodyContent: 'JSP'&gt;</body></methods><methods><class-id>WebMVC.OptionTag</class-id> <category>jsp accessing</category><body package="WebMVC-Tags">setLabel: aString	&lt;required: false description: 'The label for this option.'&gt;	label := aString</body><body package="WebMVC-Tags">setSelected: aString	&lt;required: false description: 'Should this option be selected by default?  (overridden by the value in the form model, if there is one).'&gt;	selected := aString</body><body package="WebMVC-Tags">setValue: aString	&lt;required: false description: 'The value to be placed in the form model if this option is selected.'&gt;	value := aString</body></methods><methods><class-id>WebMVC.OptionTag class</class-id> <category>pragma</category><body package="WebMVC-Tags">tagDefinition	&lt;tagLibrary: 'mvc.tld' name: 'option' bodyContent: 'JSP'&gt;</body></methods><methods><class-id>WebMVC.InputTag</class-id> <category>jsp accessing</category><body package="WebMVC-Tags">setDescription: aString	&lt;required: false description: 'Description of this input tag.  This description is displayed in error messages produced by the validators.'&gt;	description := aString</body><body package="WebMVC-Tags">setName: aString	&lt;required: false description: 'Name of the form model to which this component is connected.  Normally this parameter is not supplied since it is generated automatically.  Instead, the PROPERTY parameter is used to specify which propert of the form model to edit.'&gt;	name := aString</body><body package="WebMVC-Tags">setProperty: aString	&lt;required: false description: 'Which property of the form model is displayed/edited by this input field.'&gt;	property := aString</body><body package="WebMVC-Tags">setRedisplay: aString	&lt;required: false description: 'When form is displayed, should the current contents of the model be displayed in this field?'&gt;	redisplay := aString asLowercase = 'yes'</body><body package="WebMVC-Tags">setSize: aString	&lt;required: false description: 'Translates directly to the SIZE parameter of this INPUT tag.'&gt;	size := aString</body><body package="WebMVC-Tags">setType: aValue	&lt;required: false description: 'Specify the data type of this input field.  Used for conversion before storage in the model'&gt;	type := aValue</body><body package="WebMVC-Tags">setValidator: aValue	&lt;required: false description: 'Specify the validator for this input field.'&gt;	validator := aValue</body></methods><methods><class-id>WebMVC.HiddenTag class</class-id> <category>pragma</category><body package="WebMVC-Tags">tagDefinition	&lt;tagLibrary: 'mvc.tld' name: 'hidden' bodyContent: 'EMPTY'&gt;</body></methods><methods><class-id>WebMVC.CheckBoxTag</class-id> <category>jsp accessing</category><body package="WebMVC-Tags">setChecked: aString	&lt;required: false description: 'default value for the checked property (overriden by value in model)'&gt;	checked := aString</body></methods><methods><class-id>WebMVC.CheckBoxTag class</class-id> <category>pragma</category><body package="WebMVC-Tags">tagDefinition	&lt;tagLibrary: 'mvc.tld' name: 'checkbox' bodyContent: 'EMPTY'&gt;</body></methods><methods><class-id>WebMVC.TextTag class</class-id> <category>pragma</category><body package="WebMVC-Tags">tagDefinition	&lt;tagLibrary: 'mvc.tld' name: 'text' bodyContent: 'EMPTY'&gt;</body></methods><methods><class-id>WebMVC.TextAreaTag</class-id> <category>jsp accessing</category><body package="WebMVC-Tags">setCols: aString	&lt;required: false description: 'Number of columns to be displayed.'&gt;	cols := aString</body><body package="WebMVC-Tags">setReadonly: aString	&lt;required: false description: 'If this is set (to any value) the textarea will be readonly.'&gt;	readonly := aString</body><body package="WebMVC-Tags">setRows: aString	&lt;required: false description: 'The number of rows to display.'&gt;	rows := aString</body></methods><methods><class-id>WebMVC.TextAreaTag class</class-id> <category>pragma</category><body package="WebMVC-Tags">tagDefinition	&lt;tagLibrary: 'mvc.tld' name: 'textarea' bodyContent: 'JSP'&gt;</body></methods><methods><class-id>WebMVC.SelectTag</class-id> <category>jsp accessing</category><body package="WebMVC-Tags">setMultiple: aString	&lt;required: false description: 'Set this parameter to "yes" if multiple selection is allowed.  Defaults to "no".'&gt;	multiple := aString</body></methods><methods><class-id>WebMVC.SelectTag class</class-id> <category>pragma</category><body package="WebMVC-Tags">tagDefinition	&lt;tagLibrary: 'mvc.tld' name: 'select' bodyContent: 'JSP'&gt;</body></methods><methods><class-id>WebMVC.RadioTag</class-id> <category>jsp accessing</category><body package="WebMVC-Tags">setChecked: aString	&lt;required: false description: 'default value for the checked property (overriden by value in model)'&gt;	checked := aString</body><body package="WebMVC-Tags">setValue: aString	&lt;required: true description: 'The value to be assigned to the form model property if this radio button is selected.'&gt;	value := aString</body></methods><methods><class-id>WebMVC.RadioTag class</class-id> <category>pragma</category><body package="WebMVC-Tags">tagDefinition	&lt;tagLibrary: 'mvc.tld' name: 'radio' bodyContent: 'EMPTY'&gt;</body></methods><methods><class-id>WebMVC.ButtonTag</class-id> <category>jsp accessing</category><body package="WebMVC-Tags">setValue: aString	&lt;required: false description: 'text to be displayed in the button'&gt;	value := aString</body></methods><methods><class-id>WebMVC.ButtonTag class</class-id> <category>pragma</category><body package="WebMVC-Tags">tagDefinition	&lt;tagLibrary: 'mvc.tld' name: 'button' bodyContent: 'EMPTY'&gt;</body></methods><methods><class-id>WebMVC.PasswordTag class</class-id> <category>pragma</category><body package="WebMVC-Tags">tagDefinition	&lt;tagLibrary: 'mvc.tld' name: 'password' bodyContent: 'EMPTY'&gt;</body></methods><methods><class-id>WebMVC.IfErrorsTag</class-id> <category>jsp accessing</category><body package="WebMVC-Tags">setProperty: aValue	&lt;required: false description: 'If this parameter is supplied, the body of this tag is only evaluted if the error supplied corresponds to the indicated property'&gt;	property := aValue</body></methods><methods><class-id>WebMVC.IfErrorsTag class</class-id> <category>pragma</category><body package="WebMVC-Tags">tagDefinition	&lt;tagLibrary: 'mvc.tld' name: 'ifErrors' bodyContent: 'JSP'&gt;</body></methods><methods><class-id>WebMVC.OptGroupTag</class-id> <category>jsp accessing</category><body package="WebMVC-Tags">setLabel: aString	&lt;required: true description: 'The label to be displayed above this group of options.'&gt;	label := aString</body></methods><methods><class-id>WebMVC.OptGroupTag class</class-id> <category>pragma</category><body package="WebMVC-Tags">tagDefinition	&lt;tagLibrary: 'mvc.tld' name: 'optgroup' bodyContent: 'JSP'&gt;</body></methods><methods><class-id>WebMVC.ErrorsTag class</class-id> <category>pragma</category><body package="WebMVC-Tags">tagDefinition	&lt;tagLibrary: 'mvc.tld' name: 'errors' bodyContent: 'EMPTY'&gt;</body></methods><methods><class-id>Tools.VisualLauncher</class-id> <category>actions</category><body package="WebMVC-Extensions">inspectSessions	&lt;menuItem: 'Inspect sessions'		nameKey: #inspectSessions		menu: #(#menuBar #web)		position: 4.1&gt;	#{VisualWave.HttpSession} value allInstances inspect</body></methods><methods><class-id>VisualWave.Tag class</class-id> <category>tag description</category><body package="WebMVC-Extensions">tagDescriptionPragmas	&lt;pragmas: #instance&gt;	&lt;pragmas: #class&gt;	^#(tagLibrary:name:bodyContent: required:description:)</body></methods><initialize><class-id>Core.StringParameterSubstitution</class-id></initialize><do-it>"Imported Classes:"</do-it><do-it>self error: 'Attempting to file-in parcel imports.  Choose terminate or close'</do-it><class><name>Object</name><environment>Core</environment><super></super><private>false</private><indexed-type>none</indexed-type><inst-vars></inst-vars><class-inst-vars></class-inst-vars><imports></imports><category>Kernel-Objects</category><attributes><package>Kernel-Objects</package></attributes></class><class><name>CharacterArray</name><environment>Core</environment><super>Core.ArrayedCollection</super><private>false</private><indexed-type>none</indexed-type><inst-vars></inst-vars><class-inst-vars></class-inst-vars><imports></imports><category>Collections-Text</category><attributes><package>Collections-Text</package></attributes></class><class><name>TagAttributeSpec</name><environment>VisualWave</environment><super>Core.Object</super><private>false</private><indexed-type>none</indexed-type><inst-vars>name required permitsExpressionsForArguments </inst-vars><class-inst-vars></class-inst-vars><imports></imports><category>Web Toolkit-JSP</category><attributes><package>JSP</package></attributes></class><class><name>Tag</name><environment>VisualWave</environment><super>Core.Object</super><private>false</private><indexed-type>none</indexed-type><inst-vars>parent pageContext bodyContent allAttributes </inst-vars><class-inst-vars></class-inst-vars><imports></imports><category>Web Toolkit-JSP</category><attributes><package>JSP</package></attributes></class><class><name>TagSpec</name><environment>VisualWave</environment><super>Core.Object</super><private>false</private><indexed-type>none</indexed-type><inst-vars>name tagclass info bodyContent attributes </inst-vars><class-inst-vars></class-inst-vars><imports></imports><category>Web Toolkit-JSP</category><attributes><package>JSP</package></attributes></class><class><name>GetPropertyTag</name><environment>VisualWave</environment><super>VisualWave.Tag</super><private>false</private><indexed-type>none</indexed-type><inst-vars>name property selector </inst-vars><class-inst-vars></class-inst-vars><imports></imports><category>Web Toolkit-JSP</category><attributes><package>JSP</package></attributes></class><class><name>UndefinedObject</name><environment>Core</environment><super>Core.Object</super><private>false</private><indexed-type>none</indexed-type><inst-vars></inst-vars><class-inst-vars></class-inst-vars><imports></imports><category>Kernel-Objects</category><attributes><package>Kernel-Objects</package></attributes></class><class><name>ValueModel</name><environment>UI</environment><super>UI.Model</super><private>false</private><indexed-type>none</indexed-type><inst-vars></inst-vars><class-inst-vars></class-inst-vars><imports></imports><category>Interface-Support</category><attributes><package>Interface-Support</package></attributes></class><class><name>Request</name><environment>VisualWave</environment><super>Core.Object</super><private>false</private><indexed-type>none</indexed-type><inst-vars>webRequest cookies form query attributes handler </inst-vars><class-inst-vars></class-inst-vars><imports></imports><category>Web Toolkit-ASP</category><attributes><package>ASP</package></attributes></class><class><name>TestCase</name><environment>XProgramming.SUnit</environment><super>Core.Object</super><private>false</private><indexed-type>none</indexed-type><inst-vars>testSelector </inst-vars><class-inst-vars></class-inst-vars><imports></imports><category>SUnit</category><attributes><package>SUnit</package></attributes></class><class><name>HttpApplication</name><environment>VisualWave</environment><super>Core.Object</super><private>false</private><indexed-type>none</indexed-type><inst-vars>contents webSite </inst-vars><class-inst-vars></class-inst-vars><imports></imports><category>Web Toolkit-ASP</category><attributes><package>ASP</package></attributes></class><class><name>JSPTaglibSAXDriver</name><environment>VisualWave</environment><super>XML.SAXDriver</super><private>false</private><indexed-type>none</indexed-type><inst-vars>taglib currentTag currentAttribute attributeSpec </inst-vars><class-inst-vars></class-inst-vars><imports></imports><category>Web Toolkit-JSP</category><attributes><package>JSP</package></attributes></class><class><name>SingleThreadModelServlet</name><environment>VisualWave</environment><super>VisualWave.HttpServlet</super><private>false</private><indexed-type>none</indexed-type><inst-vars>request response session </inst-vars><class-inst-vars></class-inst-vars><imports></imports><category>Web Toolkit-Servlet</category><attributes><package>Servlet</package></attributes></class><class><name>String</name><environment>Core</environment><super>Core.CharacterArray</super><private>false</private><indexed-type>none</indexed-type><inst-vars></inst-vars><class-inst-vars></class-inst-vars><imports></imports><category>Collections-Text</category><attributes><package>Collections-Text</package></attributes></class><class><name>BodyTag</name><environment>VisualWave</environment><super>VisualWave.Tag</super><private>false</private><indexed-type>none</indexed-type><inst-vars></inst-vars><class-inst-vars></class-inst-vars><imports></imports><category>Web Toolkit-JSP</category><attributes><package>JSP</package></attributes></class><class><name>UseBeanTag</name><environment>VisualWave</environment><super>VisualWave.BodyTag</super><private>false</private><indexed-type>none</indexed-type><inst-vars>id scope className instance </inst-vars><class-inst-vars></class-inst-vars><imports></imports><category>Web Toolkit-JSP</category><attributes><package>JSP</package></attributes></class><class><name>JSPHandler</name><environment>VisualWave</environment><super>VisualWave.ASPHandler</super><private>false</private><indexed-type>none</indexed-type><inst-vars>taglibs visibleObjects currentTag </inst-vars><class-inst-vars>allTaglibs allTaglibsMutex </class-inst-vars><imports>			XML.*			</imports><category>Web Toolkit-JSP</category><attributes><package>JSP</package></attributes></class><class><name>TagLibrary</name><environment>VisualWave</environment><super>Core.Object</super><private>false</private><indexed-type>none</indexed-type><inst-vars>name prefix uri tags tlibversion jspversion shortname info </inst-vars><class-inst-vars></class-inst-vars><imports></imports><category>Web Toolkit-JSP</category><attributes><package>JSP</package></attributes></class><class><name>ApplicationModel</name><environment>UI</environment><super>UI.Model</super><private>false</private><indexed-type>none</indexed-type><inst-vars>builder uiSession eventHandlers </inst-vars><class-inst-vars>savedWindowInformation </class-inst-vars><imports></imports><category>UIBuilder-Framework</category><attributes><package>UIBuilder-Framework</package></attributes></class><class><name>VisualLauncher</name><environment>Tools</environment><super>UI.ApplicationModel</super><private>false</private><indexed-type>none</indexed-type><inst-vars>menuBar toolBar oldHeight textCollector toolDock </inst-vars><class-inst-vars></class-inst-vars><imports></imports><category>Tools-Misc</category><attributes><package>Tools-Misc</package></attributes></class></st-source>