blob: a8d12a524d935afed6bd387b285179d8156ea6f4 [file] [log] [blame]
<?xml version="1.0" encoding="UTF-8"?>
<document>
<properties>
<title>Wicket changes</title>
<author email="dashorst at users.sourceforge.net">Martijn Dashorst</author>
<author email="jonl at muppetlabs.com">Jonathan Locke</author>
</properties>
<body>
<release version="1.1-SNAPSHOT" date="tbd" description="Current CVS HEAD development">
<action type="fix" dev="Martijn Dashorst" issue="1263096" due-to="Simon Berriman">Can't have two FeedbackPanels - fixed in conjunction with 1219458</action>
<action type="fix" dev="Martijn Dashorst" issue="1219458" due-to="Gili Tzabari">FeedbackPanel produces illegal HTML - The initial state of the FeedbackPanel produces empty ul open and close tag since there is no initial message to display. This is illegal HTML according to the HTML validator (XHTML strict mode).</action>
<action type="fix" dev="Juergen Donnerstag" issue="1261052 " due-to="Jan Bares">Fixed WicketServlet.doGet URI bug</action>
<action type="update" dev="Juergen Donnerstag">Extended markup inheritance to support panels and borders as well</action>
<action type="add" dev="Jonathan Locke">Added MarkupContainer.iterator(Comparator comparator)</action>
<action type="fix" dev="Eelco Hillenius">fix for classloading problems that caused problems loading markup/ resources for components that were loaded by another classloader than the current one.</action>
<action type="fix" dev="Gwyn Evans" issue="1249961" due-to="Cameron Braid">Fix HTML generated from AbstractChoice - Added missing space after 'option selected="selected"'</action>
<action type="update" dev="Eelco Hillenius" issue="1254379" due-to="Phil Kulak">Added getBoolean() to ValueMap</action>
<action type="fix" dev="Eelco Hillenius" issue="1253113" due-to="Cameron Braid">AbstractDetachableModel didn't propogate attach/detach</action>
<action type="update" dev="Eelco Hillenius" issue="1253111" due-to="Cameron Braid">Made LoadableDetachableModel.getNestedModel() non final</action>
<action type="update" dev="Jonathan Locke">
Changed implementation of component map in MarkupContainer to an array model
like the validators changed. This made a significant reduction in the size
of pages, especially big pages. For example, nested shrank from 69,958 bytes
to 55,231 bytes which is a savings of 14,727 bytes that was due to HashMap
overhead. Very large containers may run slower, but most containers are likely
to be faster as should be recursion/iteration. The main downside is that this
code is very ugly and involves the same kinds of tests and casts that we did
to make the validators implementation more space efficient.
</action>
<action type="update" dev="Jonathan Locke">
refactored feedback completely. the new code is smaller, more powerful and more elegant. but it will break clients. most clients who are using simple features of the old feedback code will only have to (a) change their package imports from wicket to wicket.feedback (because the feedback stuff is several more class files that are polluting the root package and likely to grow due to the new filtering mechanism) and (b) delete any IFeedback argument to Form.
clients who are looking for more powerful ways to filter their messages will now have completely unlimited capacity to do so through the new IFeedbackMessageFilter interface and the default filter implementations ComponentFeedbackMessageFilter, ContainedByFeedbackMessageFilter and ErrorLevelFeedbackMessageFilter.
the whole model for feedback messages has changed from one of component-orientation, which was a mistake, to one of message orientation. to give feedback, a feedback component implements the new IFeedback interface which contains just updateFeedback(). in this method, which is called before the page is rendered, the component can use the FeedbackMessages.messages() method in combination with a filter implementing IFeedbackMessageFilter to retrieve a list of appropriate messages. all feedback messages on the page are pushed through this filter. messages for which IFeedbackMessageFilter.accept() returns true are added to the list.
for example, the new FormComponentFeedbackBorder uses the ContainedByFeedbackMessageFilter in its call to FeedbackMessages.messages(). The filter being used by the form component feedback border can be changed by overriding the getFeedbackMessagesFilter() method. This combination allows FormComponentFeedbackBorder to show its error indicator by default when a component that it contains has an error, but allows the user to override this behavior.
another example is provided in FormComponentFeedbackIndicator, which is a panel showing a red star (and overridable with you own markup!) that shows or hides itself depending on the result of the filter returned by the overridable getFeedbackMessageFilter() method. if the filter accepts at least one message, the indicator will show itself. if no message matches the filter, the indicator will hide itself.
note that feedback message filters do not necessarily have to have anything to do with components. you can install, for example, an ErrorLevelFeedbackMessageFilter which filters out messages below a certain threshold. or you can make a custom filter that uses any attribute of FeedbackMessage to filter on.
the new FeedbackPanel also provides a getFeedbackMessageFilter() override.
</action>
<action type="update" dev="Jonathan Locke">
Maximized efficiency of validators list by doing a little neat object casting
in the private implementation. This also simplified things conceptually.
</action>
<action type="update" dev="Jonathan Locke">
Made FormComponent more space efficient by using boolean flag bit
in Component superclass to keep track of persistent boolean.
</action>
<action type="update" dev="Jonathan Locke">
Changed RequestCycle.internalOnRuntimeException() implementation so that
it checks the new Page return value from onRuntimeException. if
onRuntimeException returns a Page, it will be redirected to. if not,
wicket will use the default page. this provides a nice low-level way of
doing something totally different to handle runtime exceptions. if you
just want to change the basic look of your InternalErrorPage, you can
still just subclass that. but if you want to do sophisticated things
with runtime exceptions, you want to override RequestCycle's
onRuntimeException method.
</action>
<action type="update" dev="Jonathan Locke">
Refactored intializer code. Now wicket.properties is checked for each jar or
root folder on the classpath. If it contains either initializer=[class]
or [app-name]-initializer=[class], that class is instantiated and the
IInitializer.init(Application) method is called on the resulting object.
So, both libraries and applications can easily initialize their resources now.
For example, the core wicket.properties file contains just this:
"initializer=wicket.Initializer", which invokes the wicket.Initializer class
with the application being loaded. The wicket.Initializer.init() method
will contain a sequence of initializations. For example,
"new TreeComponentInitializer().init(application)". This is a much better
and safer and more Java way of initializing components for a library like core.
Updated the images example to show how this is done.
</action>
<action type="update" dev="Jonathan Locke">
Changed structure of process() back to its original no-parameter form and introduced
a nice, logical return value in onFormSubmitted to determined whether to call delegateSubmit().
</action>
<action type="update" issue="1255293" dev="Juergen Donnerstag" due-to="Gili Tzabari">HtmlHeaderContainer to supports markup inheritance.</action>
<action type="add" dev="Jonathan Locke">
Changed StaticResourceReference and StaticResource to PackageResourceReference and
PackageResource, then added an Application parameter to each to make that explicit.
Added IComponentInitializer method that is called in Application constructor for
each class listed in META-INF/wicket-component-initializers.txt. This will allow
component developers to initialize resources when the app starts up. For applications,
you can also create a META-INF/[ApplicationName]-wicket-component-initializers.txt
if you want to preload resources or otherwise initialize for pages. Made changes
to ImagesApplication to demo this, including an example that preloads the cancel
button via META-INF/ImagesApplication-wicket-component-initializers.txt
</action>
<action type="add" dev="Martijn Dashorst">Added min, max and length parameters to the error message interpolation of LengthValidator</action>
<action type="update" issue="1255297" dev="Jonathan Locke">Added automatic multiPart support to Form. You can still call Form.setMultiPart() if you want to, but it is no longer necessary.</action>
<action type="add" dev="Jonathan Locke">Added WebSession.getId() and WebRequestCycle.getWebSession()</action>
<action type="add" dev="Eelco Hillenius" issue="1250030" due-to="Igor Vaynberg">added AbstractReadOnlyModel</action>
<action type="update" dev="Eelco Hillenius" issue="1249929" due-to="Igor Vaynberg">allow protected access to AttributeModifier's replacement model</action>
</release>
<release version="1.1-b2" date="2005-08-01" description="1.1 Beta 2">
<action type="update" dev="Martijn Dashorst" issue="1231300">Upgraded dependencies to latests versions: log4j (1.2.8 -&gt; 1.2.11), concurrent (1.3.3 -&gt; 1.3.4).</action>
<action type="fix" dev="Martijn Dashorst" due-to="Brad Pardee" issue="1248759">Removed dependency on dom4j</action>
<action type="update" dev="Eelco Hillenius" due-to="Cameron Braid">Folded UploadForm and Form into one (Form). Instead of using UploadForm, you can now just use Form and call setMultipart(true).</action>
<action type="update" dev="Martijn Dashorst" issue="1246322">Made FormComponent.updateModel() public for AJAX support.</action>
</release>
<release version="1.1-b1" date="2005-07-24" description="1.1.0 Beta 1">
<action type="update" dev="Juergen Donnerstag, Eelco Hillenius" issue="1223348">removed wicketNamspace property from ApplicationSettings, instead clients should use the xmlns attribute in the markup file (&lt;html xmlns:namespace&gt;)</action>
<action type="fix" dev="Eelco Hillenius">Component.setShouldEscapeModelStrings renamed to setEscapeModelStrings</action>
<action type="update" dev="Eelco Hillenius">Buttons now have an 'immediate' property. If true, this button behaves much like a normal link; no validation nor updating of the nested form components is done automatically in that case. This property is false by default.</action>
<action type="fix" dev="Eelco Hillenius">Only validate components that are visible</action>
<action type="fix" dev="Juergen Donnerstag" due-to="Janne Hietamäki" issue="1216017">setStripWicketTags now takes Wicket namespaces (setWicketNamespace) into account.</action>
<action type="add" dev="Juergen Donnerstag">Added support for JavaScript and CSS. Please see the Wiki for more details.</action>
<action type="add" dev="Eelco Hillenius">Added component wicket.markup.html.include.Include for including content from non-Wicket resources.</action>
</release>
<release version="1.0.1" date="2005-07-17" description="1.0.1">
<action type="update" dev="Eelco Hillenius" due-to="Phil Kulak">FeedbackPanel: made some methods that were not meant for overriding final, and added methods that make extending feedbackpanel easier</action>
<action type="fix" dev="Eelco Hillenius" due-to="Adam Howard">fixed bug in AbstractPropertyModel which gave problems using custom converters (overriding getConverter for a component) with compound property models</action>
<action type="update" dev="Chris Turner" due-to="Jonathan Carlson">ComponentStringResourceLoader: resources are now inherited from parent classes when components have been subclassed</action>
</release>
<release version="1.0" date="2005-06-21" description="1.0.0 final">
<action type="update" dev="Eelco Hillenius">StaticResourceReference now binds itself immediately so clients don't have to know about the binding internals.</action>
<action type="fix" dev="Juergen Donnerstag" issue="1209753">Pageable list view navigator did not handle the "last" link properly in situations where additional elements have been added to the underlying list.</action>
<action type="fix" dev="Eelco Hillenius" issue="1213229">Image didn't like webapps with urlpattern set to /*. It does now.</action>
<action type="fix" dev="Martijn Dashorst" issue="1275631">Fixed negative numbers in PageParameters.</action>
<action type="update" dev="Eelco Hillenius">added PageableListView.setRowsPerPage</action>
<action type="fix" dev="Eelco Hillenius" issue="1211663" due-to="Martijn Dashorst">Fixed converters once and for all. Null check results so that e.g., empty strings for numbers (e.g.) now return null instead of throwing a NPE</action>
<action type="fix" dev="Eelco Hillenius" issue="1209027">The UploadForm now considers the encoding</action>
<action type="add" dev="Juergen Donnerstag">By means of Component.setRenderBodyOnly(boolean) it is now easily possible to print the tag's body only. This is e.g. necessary with &lt;span&gt; tags and Panels where in cases you want to be strictly HTML compliant the &lt;span&gt; tag itself must be removed. The (tag's) body will always be printed.</action>
</release>
<release version="1.0.0-rc3" date="2005-05-22" description="1.0 Release Candidate 3">
<action type="update" dev="Eelco Hillenius">Added constructors with just the id to the Choice component to be consistent with other Wicket components.</action>
<action type="fix" dev="Eelco Hillenius">Strings.escapeMarkup now properly escapes unicode.</action>
<action type="update" dev="Johan Compagner, Eelco Hillenius" due-to="Martijn Dashorst">Made the rendering strategy pluggable. From javadoc of ApplicationSettings:
<i>renderStrategy</i>- Sets in what way the render part of a request is handled. Basically, there are two different options:
<ul>
<li>Direct, ApplicationSettings.ONE_PASS_RENDER. Everything is handled in one physical request. This is efficient, and is the best option if you want to do sophisticated clustering. It does not however, shield you from what is commonly known as the
<i>Double submit problem</i>
</li>
<li>Using a redirect. This follows the pattern
<a href="http://www.theserverside.com/articles/article.tss?l=RedirectAfterPost">as described at the serverside</a>and that is commonly known as Redirect after post. Wicket takes it one step further to do any rendering after a redirect, so that not only form submits are shielded from the double submit problem, but also the IRequestListener handlers (that could be e.g. a link that deletes a row). With this pattern, you have two options to choose from:
<ul>
<li>ApplicationSettings.REDIRECT_TO_RENDER. This option first handles the 'action' part of the request, which is either page construction (bookmarkable pages or the home page) or calling a IRequestListener handler, such as Link.onClick. When that part is done, a redirect is issued to the render part, which does all the rendering of the page and its components.
<strong>Be aware</strong>that this may mean, depending on whether you access any models in the action part of the request, that attachement and detachement of some models is done twice for a request.
</li>
<li>ApplicationSettings.REDIRECT_TO_BUFFER. This option handles both the action- and the render part of the request in one physical request, but instead of streaming the result to the browser directly, it is kept in memory, and a redirect is issue to get this buffered result (after which it is immediately removed). This option currently is the default render strategy, as it shields you from the double submit problem, while being more efficient and less error prone regarding to detachable models.</li>
</ul>
</li>
</ul>Note that this parameter sets the default behaviour, but that you can manually set whether any redirecting is done by calling method RequestCycle.setRedirect. Setting the redirect flag when the application is configured to use ONE_PASS_RENDER, will result in a redirect of type REDIRECT_TO_RENDER. When the application is configured to use REDIRECT_TO_RENDER or REDIRECT_TO_BUFFER, setting the redirect flag to false, will result in that request begin rendered and streamed in one pass.
</action>
<action type="fix" dev="Eelco Hillenius">Fixed a bug that made MostRecentlyUsedMap (used to store page in the session) behave like a MostRecentlyAddedToMap. Fixes lots of frames/ popup problems in one strike.</action>
<action type="add" dev="Eelco Hillenius" due-to="Jonathan Carlson">Added method setChoices and some np checks to AbstractChoice</action>
<action type="add" dev="Juergen Donnerstag" issue="1169374">Implemented support for obfuscating URLs</action>
<action type="fix" dev="Juergen Donnerstag" issue="1192572">Fixed Javascript parse error. CDATA section are properly handled now.</action>
<action type="update" dev="Johan Compagner, Eelco Hillenius">Refactored resources and fixed some issues along the way. The major change is that we removed ImageResource from the inheritance tree. So, if you have compile problems, replace any reference to ImageResource with wicket.markup.html.WebResource. Furthermore, StaticImageResource and StaticImageResourceReference are renamed to StaticResource and StaticResourceReference, as it is perfectly acceptable to reference e.g. a PDF (we did some testing with this as well). Also, as we fixed a localization bug in this, you could for example package resources like 'mydoc.pdf' and 'mydoc_nl.pdf' and reference them with a StaticResource(Reference), and let Wicket find out which one should be loaded.</action>
<action type="fix" dev="Eelco Hillenius" issue="1188417">ResourceLinks were not binded for static resources.</action>
<action type="fix" dev="Johan Compagner" issue="1192671">Application is not serializable. Application in StaticImageResource is now transient and is set just before it is needed.</action>
<action type="fix" dev="Eelco Hillenius" issue="1197005">Nesting of message receivers should work without any problems due to the recent feedback message refactorings.</action>
<action type="fix" dev="Eelco Hillenius" issue="1198740">Instead of throwing an exception when a request could not be processed, Wicket now sends a 404.</action>
<action type="fix" dev="Eelco Hillenius">in Form: Form components were persisted before the form was updated.</action>
<action type="fix" dev="Eelco Hillenius">When the upload does not validate, super.onSubmit will now not be called anymore.</action>
<action type="update" dev="Eelco Hillenius">It is now possible to set a Comparator for sorting messages on both FeedbackPanel and FeedbackMessagesModel.</action>
<action type="update" dev="Eelco Hillenius">Refactored feedback message handling to be independent (using pull models) of the flow of execution of a page again. This makes it easier to use, and results in less spagethi code. Introduced IFeedbackBoundary that is a tagging interface to implement message hierarchy blocks. Currently it is implemented by Page and Form. IFeedback now has one method that can be used by implementing classes to set (override) the actual component from where messages are collected. Form uses this to set the collection point when a IFeedback instance is provided. The add/remove methods of IFeedback are removed. Made both FeedbackPanel and FormComponentFeedbackBorder non-final, so users can provide their own markup. Also, FeedbackMessagesModel that is used by FeedbackPanel is public, so that it can be used for custom implementations without having to know too much about the internals of message collecting.</action>
<action type="fix" dev="Eelco Hillenius">Added escapes for &amp;, " and ' in Strings utilities class.</action>
<action type="fix" dev="Eelco Hillenius" issue="1196140">This bug prevented running Wicket on VM's that don't use SUN's security implementation classes. Don Ledford reported it for Blackdown 1.4.2 j2sdk. Removed SunJceCrypt's static initializer and put it in it's constructor. Application now reuses the ICrypt instance once it is created, so that it is easier to provide a dummy one. The current ICrypt instances seem to be thread safe, so that shouldn't give any problems, and users can override the factory method if they want to use non-thread safe instances.</action>
<action type="fix" dev="Eelco Hillenius">In ResourceTest URL.getFile() was used while it should use a URI to construct a file.</action>
<action type="fix" dev="Martijn Dashorst" issue="1194464">ClassCastException on ListItem.onAttach using CompoundPropertyModel. When using a CompoundPropertyModel to bind a list to a listview, the ListItem.onAttach throws a ClassCastException. This is because the model of the ListView is not used to cast to an element, but the root model. Fixed by using ListView.getModelObject() instead of having the ListItemModel try to retrieve the model itself. The ListItem now takes a ListView instead of a ListModel, and requests the model on the listview.</action>
<action type="fix" dev="Martijn Dashorst" issue="1194460">RequestCycle.onEndRequest not called after Exception. When an exception occurs, onEndRequest is not always called. This results in open database connections etc. when these are allocated and deallocated using a custom RequestCycle. Fixed by moving the endRequest method calls into the finally block of RequestCycle.request().</action>
<action type="fix" dev="Eelco Hillenius">Fixed the beginning/ending callbacks of pages. This was not done properly for listener interface calls: internalBeginRequest was called to late, or in case the listener set another page to render, not at all. The same problem applied to internalEndRequest. As this method is where the component models must be detached (see earlier fix), this had the effect that models were often not detached. Which in turn gave problems - besides a temporary memory leak - with lazy Hibernate initialization etc.</action>
<action type="fix" dev="Juergen Donnerstag" issue="1192572">Fixed JavaScript parsing bug as reported on the user list by Andrew de Torres.</action>
<action type="fix" dev="Eelco Hillenius">Validators (LengthValidator, IntegerValidator and PatternValidator) now only check non empty values.</action>
<action type="update" dev="Martijn Dashorst" issue="1190287">Made a clear seperation between IModel.getModel(), IModel.getNestedModel() and IModel.getObject(). getNestedModel()/getRootModel() semantics getNestedModel() and getRootModel() returned Objects. They now return IModel.</action>
<action type="add" dev="Eelco Hillenius">Added new Model LoadableDetachableModel that makes working with DetachableModels super easy.</action>
<action type="fix" dev="Johan Compagner" issue="1190208">PageableListviewNavigation number of pages shrinks when the number of listview items gets smaller. This becomes a problem when the number of listitems gets bigger again.</action>
<action type="fix" dev="Johan Compagner" issue="1190148">setModel triggers a model clone. It shouldn't as in fact it is a component state change.</action>
<action type="fix" dev="Martijn Dashorst" issue="1189444">Fixes that BoundCompoundPropertyModel.Binding doesn't implement Serializable.</action>
<action type="update" dev="Jonathan Locke">Made a number of small refactoring changes to support url path encryption. The code is not that far from working, but the feature is turned off. Added a method Session.getPathCrypt() to get an instance of ICrypt for encrypting url paths for a given session (it's probably not a good idea in general to encrypt all paths for an application with the same key). Moved ICrypt and related implementations to wicket.util.crypt since the usage is more general now. Made a first pass at url encoding that doesn't work when path encryption is enabled. Also made a first pass at url decoding/reparsing that doesn't quite work either. If someone out there has the time to fix my implementation (I don't think it's too far off), we could probably ship this with 1.0.</action>
<action type="add" dev="Eelco Hillenius" issue="1185624">Added RadioChoice and multiple select lists to the form input example. Also fixes issue 1185624</action>
<action type="fix" dev="Juergen Donnerstag" issue="1187903">'-' in a attributes are parsed good now.</action>
<action type="add" dev="Eelco">added support for redirecting to external url's (e.g. Google) directly by introducing RedirectPage. Also added an example of this in the link-o-matic example.</action>
<action type="update" dev="Jonathan Locke">Form validation now occurs for every form submit in Form.onValidate(). If the form validates, Form.onSubmit is called unconditionally. If there is more than one button on the form and the form validates, then Button.onSubmit() is also called. Since multi-button forms (which are a common case) are unlikely to want to override Form.onSubmit(), made this method non-abstract.</action>
<action type="fix" dev="Jonathan Locke" issue="1186940">Enhanced CompoundPropertyModel's propertyType method to use the value from any TypeValidator attached to the FormComponent. Also, removed type field from TextField in favor of using the more space-efficient FormComponent.getValidationType() method (which was added to implement CompoundPropertyModel.propertyType()). If no TypeValidator has been assigned, the default OGNL conversion will still occur.</action>
<action type="fix" dev="Jonathan Locke" issue="1186293">Fixed problem with check in add() when undoing a remove operation. Added internalAdd() method to MarkupContainer and used it from Remove.undo() in the undo version manager.</action>
<action type="fix" dev="Martijn Dashorst" issue="1188128">In a search form containing textfields, the input value is set to the empty string when no value is in the textfield. This should be configurable, so the user has the option to override this behaviour. Default usage should be that the value becomes NULL instead of empty string.</action>
<action type="add" dev="Martijn Dashorst" issue="1186504">added support for CompoundPropertyModels to ListView, thus making it possible to add a ListView to a Form with a list property as the model without having to specify a seperate list model.</action>
<action type="update" dev="Eelco Hillenius">removed final from getLocale to enable users to pin a locale (or use another algorithm) for custom sessions.</action>
<action type="add" dev="Martijn Dashorst">Added additional constructor for MultiLineLabel for it to work with CompoundPropertyModels.</action>
<action type="update" dev="Eelco Hillenius">Made constructor of ListItem public as class ListItem is public, and ListView.newItem is overrideable while returning ListItem.</action>
<action type="fix" dev="Eelco Hillenius">as in ListView accessor getOptimizeItemRemoval() is overrideable, the field should never be used directly. Fixed that.</action>
<action type="update" dev="Eelco Hillenius">Introduced property optimizeItemRemoval for tree as well. Many internal improvements that fixed some unreported issues. Tree is versioned again.</action>
</release>
<release version="1.0.0-rc2" date="2005-04-16" description="1.0 Release Candidate 2">
<action type="fix" dev="Eelco Hillenius" issue="1178309">tree does not need versioning by default.</action>
<action type="fix" dev="Juergen Donnerstag" issue="1161111">Wickets mistakes &lt;a .../&gt; for an open-tag.</action>
<action type="update" dev="Eelco Hillenius">Tree can be extended by providing a custom panel for a node. This way the tree can be used to nest arbitrairy components, like input fields and (more) images.</action>
<action type="fix" dev="Eelco Hillenius" issue="1183947">modelChanging and modelChanged were never called in the link handlers of the delete and moveUp/Down listview links</action>
<action type="fix" dev="Eelco Hillenius">Tree is not a listener for tree events by default, as registering the tree as a listener by default can lead to memory leaks</action>
<action type="fix" dev="Johan Compagner">Wrap catched exception so that we not only get the 'markup not found exception', but also what caused the problem in the first place.</action>
<action type="fix" dev="Eelco Hillenius">Removed 'removeAll' from the render method in ListView</action>
<action type="fix" dev="Eelco Hillenius">Added extra null pointer check in MultipartWebRequest</action>
<action type="fix" dev="Eelco Hillenius">Resources were requested from the servlet context by relative path. This gives problems on some containers (like Jetty 5.1.x) with a paths like 'mysubdir/foo.css'. The change is: final String url = '/' + getWebRequest().getRelativeURL();</action>
<action type="fix" dev="Jonathan Locke" issue="1182158">Added updateCluster boolean to RequestCycle. As a request is parsed, this boolean is set in order to determine if the end of the request cycle should update the cluster. In WebRequestCycle, if the resourceReference call returns true, there was a bug where parseRequest would return true, which is incorrect. Now, resourceReference() and staticContent() both return false (since they don't involve pages). In addition, both set the updateCluster boolean to false. Then each of bookmarkablePage, callComponentListener and homePage() set updateCluster to true. Finally, in Page.onRedirect, updateCluster is set to false to override the true value set in callComponentListener for simple page redirects.</action>
<action type="fix" dev="Jonathan Locke" issue="1182728">Added PageMap.remove() method and PopupCloseLink class, which calls this method on Page.getPageMap(), which is now public. A little trick was necessary to invoke the java code AND close the window. When PopupCloseLink is clicked, the page map is removed and then the response page is set to a nested class with markup found in PopupCloseLink$1. This markup contains javascript that closes the window when it is loaded.</action>
<action type="update" dev="Jonathan Locke" issue="">Factored out SharedResources class from Application and made some minor improvements to the static path() methods. This will clear the way to make Session relative SharedResources in the future. It also will enable us to make changes to the SharedResources class without having to add more methods to Application, which is already complex enough.</action>
<action type="fix" dev="Jonathan Locke" issue="1181983">Any image path is now part of the resource key for shared images.</action>
<action type="update" dev="Jonathan Locke" issue="">Added some parameter validation and finalized some methods that should not be overridden. In particular, Component.getSession() is now final as well as Component.getId(). The change to Component.getId() also eliminated a field in Page that is really not necessary. The result of these changes is a tighter API. There will be more changes of this nature as we lock down the API for 1.0 final.</action>
<action type="update" dev="Jonathan Locke" issue="">Minor refactoring in Application and ApplicationSettings. Changed Application.sourcePath property to resourcePath since that's what it really is. Changed getCrypt() and getMarkupParser() to newCrypt() and newMarkupParser() since these are really factory methods and they should indicate that. Made a bunch of methods final that should be and reformatted some stuff. Would like to make getSettings() final too so that hotspot will inline accesses. Unfortunately, some Spring related subclass has already overridden the method and so now we cannot make it final...</action>
<action type="update" dev="Jonathan Locke" issue="">Added FLAG_USER* bits to Component and made setFlag/getFlag protected. This will help avoid flag bit conflicts and will also make it possible to reduce the space needs of Components other than Page (which already uses bits in Component.flags).</action>
<action type="fix" dev="Jonathan Locke" issue="1177751">Added Page.setDirty/isDirty and changed Session to replicate each dirty page in the session based on this flag. Then added code that sets the flag when a Page is modified (in case someone changes some random page), but also set flag on by default and each time a Page object is pulled out of a Session PageMap. This will cause the default replication behavior described in this bug. Unfortunately, even though the change seems to work fine, there appears to be a problem with one of the test cases. It looks like MockWebApplication was subtly dependent on something I changed and I suspect the test case rather than the code since all the examples seem to work fine. So I'm checking in and hoping someone can take a look at the test since I can't make time for a few days.</action>
<action type="fix" dev="Jonathan Locke" issue="1176169">Javadoc enhancement for ResouceReference.</action>
<action type="update" dev="Jonathan Locke" issue="">Changed my mind about defaulting resources that are not lazy-inited. If a resource like "plus-sign.gif" is requested in the netherlands (locale nl_nl), first an attempt is made to load "plus-sign_nl_nl.gif", then the lazy init code is given a chance to create a resource for the nl_nl locale. Then if /that/ doesn't create a resource, we default it to "plus-sign.gif". This kind of defaulting behavior is important in supporting non-localized static resource references (which would not really be possible without this change).</action>
<action type="update" dev="Jonathan Locke" issue="">Fixed a bunch of unreported problems with image resources. The new method Application.localizedPath(name, locale, style) constructs more reasonable paths for images by inserting the locale just before the extension (instead of after it, which looks wrong and confusing). This method will omit the locale if it is equal to Locale.getDefault(), which means foo_en_US.gif and foo.gif are the same resource in the US. Updated Application.getResource() methods to use this method when searching for a resource in the shared resource cache. The new getResource() method will actually fail if it cannot find a resource that matches the locale (as opposed to defaulting to the default locale). This will help keep localization problems to a minimum and also ensures that lazy initialization will work (which it did not, before). Undid a change that Johan made to InputForm since we do not search for anything other than Locale.toString(), meaning nl and nl_nl are not equal in Wicket at this time (which is really a bug if anyone wants to report it). Finally, made changes to the static image resolution code so that it automatically creates shared resources! This means that the code for the Pub example did not have to change in order to be efficient /and/ localized.</action>
<action type="fix" dev="Jonathan Locke" issue="1177942">Changed SharedResource to ResourceReference. ResourceReference does not inherit from Resource since it is a reference to a resource and not an actual resource now. Added StaticImageResourceReference to make it easy to create references to static image resources. See the Tree class for an example usage. SharedResourceLink was changed to ResourceLink.</action>
<action type="update" dev="Jonathan Locke" issue="">Fixed problem where error pages failing could cause recursive redirection. In doing this, added Page.isErrorPage() method that returns false by default. Error pages override this to let RequestCycle know when a recursive failure is happening.</action>
<action type="update" dev="Jonathan Locke" issue="">Moved WebResource from http protocol package to markup.html package, which seems more appropriate since it's used in web markup by ImageResource which is in markup.html.image.resource.</action>
<action type="fix" dev="Jonathan Locke" issue="1175835">Fixed shared resource localization problem manifested in forminput example. Image resources are now correctly shared under a URL that includes locale and style (as originally intended). Switching between locales will be correct and efficient now. The earlier code would result in unpredictable locale shifts when used by multiple users. It would also be very inefficient.</action>
<action type="update" dev="Jonathan Locke" issue="">Added UploadForm.setMaxSize() method to limit the size of uploads. This change includes an update to the upload example which shows how to use the feature and localize the strings involved.</action>
<action type="update" dev="Jonathan Locke" issue="">Changed message model for "exception" to use Exception object: model.put("exception", e); This will allow full access to exception properties in localized Strings. In particular, you can now say ${exception.localizedMessage}.</action>
<action type="update" dev="Jonathan Locke" issue="">Added Component.getString(final String key, final IModel model, final String defaultValue)</action>
</release>
<release version="1.0.0-rc1" date="2005-04-03" description="1.0 Release Candidate 1">
<action type="update" dev="Jonathan Locke" issue="">Reworked SharedResource a bit to address clustering issues for Chris. I think the new structure will work finally, but I don't have a cluster to test it on (which is why I checked in code that didn't work the first time). See SharedResource javadoc and updated Images and Hangman applications for details on how this works now. Updated tree to use this new style. Also, added a small change for Johan to get rid of inefficient asString() implementation in StringBufferResouce and StringResource. Nice find!</action>
<action type="update" dev="Eelco Hillenius" issue="">We've got a new project: Wicket Stuff (aka Wicket Contrib) at: http://sourceforge.net/projects/wicket-stuff Wicket stuff is the project that is meant for contribution components/ utility classes that should not be in either core or extensions. In effect, these are the projects that are specific for an external libraries (like Hibernate, Spring or Velocity) or that are not generic enough to support in the core projects. In future, Wicket stuff can accept more committers than the core project, and also the rules of accepting components for this project can be more relaxed. Most of what was in wicket-contrib moved over to seperate projects. Currently these projects are in wicket stuff: - wicket-contrib-data : generic data models and utilities like PageableList; - wicket-contrib-data-hibernate-2.1 : implementations of wicket-contrib-data for hibernate 2.1; - wicket-contrib-data-hibernate-3.0 : implementations of wicket-contrib-data for hibernate 3.0; - wicket-contrib-examples : meant for examples that use more than one contrib projects, currently only cdapp; - wicket-contrib-fvalidate : javascript validation based on the fvalidate lib (http://www.peterbailey.net/fValidate/); - wicket-contrib-groovy : groovy integration and examples; - wicket-contrib-spring : spring framework integration and examples; - wicket-contrib-velocity : velocity integration and examples. The normal wicket-examples project is trimmed a lot, and has no dependencies on the soon to be removed wicket-contrib project anymore.</action>
<action type="update" dev="Jonathan Locke" issue="">Added Image.getImageResource() method. Removed Component.getModelLock().</action>
<action type="update" dev="Jonathan Locke" issue="">Removed Localizer methods that don't work with Components. Added getString(String key) and getString(String key, IModel model) methods to Component for easy access to localized strings. Changed inheritance hierarchy of models so that AbstractModels are non-detachable and AbstractDetachableModels are all detachable (and consequently implement IModel rather than extends AbstractModel). Finally, removed MapModel class and created two factory methods in Model that take List and Map objects and do appropriate wrapping for non-serializable instances.</action>
<action type="update" dev="Jonathan Locke" issue="">Almost final checkin for RC1. Changed initModel in Component to search the whole parent hierarchy for CompoundModels. Added logic that allows Components to know if they are the root model or a child sharing the parent's compound model. This allowed me to remove getRootModelObject() and incorporate the logic necessary to get the right model directly into getModelObject(), which now always works. It also made it possible to make replication of objects using compound models vastly more efficient since Components that inherit models are now detected and nulled out in detachModel(). When the Component is deserialized, the model will be null and it will be initialied via initModel() when needed as it originally was. Made changes to Images and ImageButtons so that they search for models differently (as a last resort, actually). This means they can be used with CompoundModels like any other Component, although that use-case should be rare.</action>
<action type="fix" dev="Eelco Hillenius" issue="1160518">Support CheckBox / RadioChoice server-side actions.</action>
<action type="update" dev="Martijn Dashorst">Updated the error pages to have Wicket style error messages, made them HTML 4.01 transitional.</action>
<action type="fix" dev="Jonathan Locke" issue="1166432">Fixed lookahead code which was swallowing ?xml encoding header tag.</action>
<action type="update" dev="Jonathan Locke" issue="">Added two convenient ways of constructing shared resources. The first by calling getShared() on an existing Resource. The second by using an implementation of ISharedResourceFactory in combination with new methods in Application.</action>
<action type="update" dev="Jonathan Locke" issue="">Changed Page's request() handling method so that it does not do a component check in the finally block. This was masking exceptions and displaying them as rendering check problems.</action>
<action type="fix" dev="Jonathan Locke" issue="1167377">IMG tags are no longer split into open/close pair.</action>
<action type="fix" dev="Jonathan Locke" issue="1166893">Changed resource urls and added shared resources to Application via new add/getResource() methods. The techniques are pretty well demonstrated in FormInput and Hangman examples, which show how to use the new ResourceFactory code and how to share resources efficiently across an application. Docs are somewhat lacking, but the code should at least make sense now.</action>
<action type="fix" dev="Jonathan Locke" issue="1168600">Added IRequestCycleFactory for first-class request cycle factories to enable such things as a pluggable hibernate session manager in the future.</action>
<action type="update" dev="Jonathan Locke" issue="">Moved ImageResourceFactory map to Application since that's a much more obvious and intuitive place for it to be.</action>
<action type="fix" dev="Jonathan Locke" issue="1167154">Enhanced Component.toString() to include page name.</action>
<action type="update" dev="Jonathan Locke" issue="">Made changes to AutoComponentResolver and AutoLinkResolver (new names) so that they can sneakily add components that don't participate in either versioning or modification checking.</action>
<action type="fix" dev="Jonathan Locke" issue="1167112">Fixed problem with URL.getFile() using the sun suggestion.</action>
<action type="fix" dev="Jonathan Locke" issue="1166811">Added explanatory exception when static images are not found.</action>
<action type="fix" dev="Jonathan Locke" issue="1166597">Added type setter to RenderedDynamicImageResource.</action>
<action type="update" dev="Jonathan Locke" issue="">Changed the render cycle to make it better defined. You can no longer change the component hierarchy during rendering. If you attempt to do so, an exception will be thrown. To allow for modification of the component hierarchy prior to rendering, there is a new onBeginRequest and onEndRequest pair, which wholly replaces onBeginRender / onEndRender. There should be no need to do anything just before something renders now because the whole component tree is expected to be immutable throughout the rendering process. I updated the Link, ListView and Loop components so that they use internalOnBeginRequest() to add their children. But we have an ongoing problem with auto-links and auto-components, which now must be added during internalOnBeginRequest(), requiring changes to the markup parser as well (which should probably just make notes about what components if any need to be added in internalOnBeginRequest()). Also, fixed a major stupid bug in Component where i had implemented space efficient booleans nicely, but failed to initialize them.</action>
<action type="fix" dev="Martijn Dashorst" issue="1167605">Documented running the examples using a binary or source distribution. Made it possible to run the examples using an embedded Jetty server.</action>
<action type="update" dev="Jonathan Locke" issue="">Removed State and refactored clustering.</action>
<action type="update" dev="Jonathan Locke" issue="">Changed loop to use iterations rather than size, since this makes more sense. Removed LoopItem so that Loop is less easily confused with ListView.</action>
<action type="update" dev="Jonathan Locke" issue="">Removed attach() method from IDetachable and added it to IChoiceList.</action>
<action type="fix" dev="Jonathan Locke" issue="1165955">Changed popup settings to use flags instead of booleans.</action>
<action type="update" dev="Jonathan Locke" issue="1157844">Major changes! Added PageMap abstraction to Session to make it possible for multiple browser windows, popups and frames to have their own page maps, avoiding the problem of pages going stale in one window when the other window is used. In the future, this will also allow us to implement a page stack for the page map and using this a back() navigation method that always knows what the previous page was. Adding PageMap required a whole set of changes to the framework. The various urlFor overloads moved from RequestCycle to Page (and they are implemented in WebPage). The reason for this is that each Page belongs to a specific PageMap now and it will render differently in that the url returned by urlFor will have the PageMap encoded in it (if it is not in the default page map). A variety of other changes were necessary to support this abstraction, including changes to state management and clustering code. In addition, this checkin contains a very early implementation of a concept I'm calling "PageSets". The code will eventually apply to security, presentation and navigation, but don't worry about all this just yet. Also created newPage() methods in Component that make it easy to create new pages using the Page's PageFactory.</action>
<action type="fix" dev="Juergen Donnerstag" issue="">Replaced id="wicket-xxx" and wicket="xxx" with wicket:id="xxx".</action>
<action type="fix" dev="Juergen Donnerstag" issue="1124299">Removed setStripComponentId(boolean). setStripWicketTags(boolean) now removes wicket:id="XX" as well.</action>
<action type="update" dev="Jonathan Locke" issue="">Added Netherlands buttons to form input example to demo button factories. Improved DefaultButtonImageResource so that it auto-resizes buttons with text that won't fit (as it most likely won't in Dutch).</action>
<action type="update" dev="Jonathan Locke" issue="">Made FormComponents non-versioned by default. Added override of setVersioned(boolean) to Form which sets the versioning of all its children.</action>
<action type="fix" dev="Jonathan Locke" issue="1162633">Added setImageResource() to Image. Changed image factory syntax from . separator to : separator for eelco.</action>
<action type="fix" dev="Jonathan Locke" issue="1156254">Added setResponsePage(Page) to Component.</action>
<action type="fix" dev="Jonathan Locke" issue="1164326">Changed Panel so you can have preview text inside the wicket:panel tag. Fixed a bug in XmlTag regarding what the attributes map holds. It now holds ordinary Strings.</action>
<action type="update" dev="Jonathan Locke" issue="">Added a protected method to Link and Button to get onClick script code to install from subclasses. Fixed bug where XmlTag attributes were case sensitive!</action>
<action type="update" dev="Jonathan Locke" issue="">File uploading now has its own first class model that abstracts FileItem away. The example has been updated. See that for details.</action>
<action type="fix" dev="Jonathan Locke" issue="1138660">It is now possible to create AttributeModifiers that do arbitrary things to the original and replacement values, such as appending one to the other. See javadoc in AttributeModifier for details.</action>
<action type="update" dev="Jonathan Locke" issue="">Now WebApplication reads the servlet init parameter "configuration". If the parameter has the value "development", settings appropriate for development are set. If it's "deployment", deployment settings are used. If development, configuration is specified and a "sourceFolder" init parameter is also set, then resources in that folder will be polled for changes. Since this all occurs on initialization, the user can still override settings in the usual place.</action>
<action type="update" dev="Jonathan Locke" issue="">Changed Component.name property to Component.id to match upcoming changes.</action>
<action type="update" dev="Jonathan Locke" issue="">Changed RequestCycle.setPage() -&gt; RequestCycle.setResponsePage().</action>
<action type="update" dev="Jonathan Locke" issue="">Added isVersioned boolean to Component. Any child of a Component that is not versioned is not versioned itself. So if you setVersioned(false) on a Page, then no component on that Page will be versioned. Fixed various problems with undoing and tested it a little with Guestbook, which was broken and is now fixed. Added setVersioned(false) to FeedbackPanel's listview so that no listview components will ever be versioned. Made internalX pattern consistent in the framework. Added RequestCycle factory method to WebApplication. Moved static method for creating/attaching sessions from WebSession to WebApplication. Added a notion of Charset to AbstractResource and then used this to implement asString(). Added Component.remove().</action>
<action type="update" dev="Jonathan Locke" issue="">Added the first portion of our framework for doing page versioning, including the IPageVersionManager interface and calls into that from MarkupContainer, Component and elsewhere. Removed all render count functionality and reworked the code to check component renderings as a debug-only Set in Page. Also made more structural changes to onX() handlers so that all internal handlers are onInternalX() now, meaning that user code does not have to call super.onX() ever to have the core functionality work. There are now user methods for each lifecycle event that the user might care about. These are called in the following order: Page.onBeginRequest(), Component.onBeginRender(), Component.onRender(), Component.onEndRender(), Page.onEndRequest(). Component.onModelChanged() is called when a component's model is changed. This is detected when Component.setModel() or Component.setModelObject() are called. If a Component's model is changed by the programmer and they wish to let the framework know that a model change happened, they can call Component.modelChanged() directly.</action>
<action type="update" dev="Jonathan Locke" issue="">Straightened out resource serialization issues. IResource is now serializable and all subclasses need to implement serialization semantics, which is done for all core components now. In particular, all DynamicImageResources now have transient input streams that are recreated using the subclass' image data. The only non-transient image resource is BufferedDynamicImageResource, which rightly has image data that it serializes. Also fixed problems with lastModified timestamps.</action>
<action type="update" dev="Jonathan Locke" issue="">Tightened up semantics of rendering/response overrides, which were much too loose. You can no longer override render() because that method is now final. You can change the rendering process by overriding onRender(). You can do something before rendering by overriding onBeginRender(). You can do something after rendering by overriding onEndRender(). And you can do something like invalidate the session on sign-out by overriding Page.onEndRequest(). It is not necessary to call the super implementation on Component, MarkupContainer or Page. These are now coded defensively, assuming programmers will forget to do this. The only place where you might actually need to do this with a core component would be if you subclassed FeedbackPanel, which overrides onEndRender() to clear out its message components... which makes me wonder if we don't need an auto-reset feature on ListViews...</action>
<action type="update" dev="Jonathan Locke" issue="">Changed clustering code so that PageState records are saved as independent attributes. This should permit correct failover.</action>
<action type="update" dev="Jonathan Locke" issue="">Added onBeginRender() and onEndRender() methods to Page as appropriate places to put code instead of overriding render() and calling super.render(), which is unadvisable. Refactored WicketServlet, RequestCycle, Session, WebRequestCycle and WebSession all somewhat to support clustering. These changes should affect nobody at the moment except that they may break clustering (I have no way to test it right now).</action>
<action type="update" dev="Jonathan Locke" issue="">Removed constructor overloads taking OGNL expressions and Serializable objects, reducing parameters to (String name) and (String name, IModel model) in most places. Made FormComponent and Component look in Form and Page, respectively, for models in their implementations of initModel(). This effectively gives any component missing a model either the parent form's model or the page's model. Made setModel() public again since it's too inconvenient to pass models straight up the constructor chain. So now Forms and Pages can have CompoundPropertyModels and BoundCompoundPropertyModels and their children will essentially inherit this compound model (which is parameterized by component). Since Pages and Forms will typically hold CompoundPropertyModels, it was necessary to make a method getRootModel() which gets the rootmost nested model from the compound model. This is convenient because it means that Forms do not have to have a separate instance variable to track the actual bean being edited. If getRootModel() did not exist, getModelObject() on the Form or Page would fail because the model would be parameterized on the Form or Page itself.</action>
</release>
<release version="0.9.19-beta" date="2005-03-04" description="Pre release candidate?">
<action type="update" dev="Juergen Donnerstag" issue="">Introduced Loop component that can be used in cases where you just want to create a number of components without having the need for a real model.</action>
<action type="update" dev="Martijn Dashorst" due-to="Cameron Braid">Updated all dependencies to be the same, and not to use proprietary Jars (JTA)</action>
<action type="update" dev="Jonathan Locke" issue="">Changed IModel signature to allow models to be parameterized on the requesting Component. Made minor enhancements to AbstractDetachableModel and invented AbstractReadOnlyDetachableModel. Created an abstract base class, AbstractPropertyModel, for all property models dealing with OGNL expressions and type conversions. Implemented the current PropertyModel functionality using this base class. Implemented CompoundPropertyModel to take advantage of the Component parmeter in IModel. Then implemented a fully bindable BoundCompoundPropertyModel class as a subclass of that.</action>
<action type="update" dev="Jonathan Locke" issue="1153227">Generalized IValidationFeedback interface to IFeedback to deal with all kinds of feedback. Then added logic to Page, so that you can set a feedback for the page. If you do this, any messages added to the page using the usual error(), info() etc methods, will be displayed in this feedback.</action>
<action type="fix" dev="Jonathan Locke" issue="1153916">Reworked RadioChoice as a much simpler subclass of AbstractChoice that is much more compatible with other choice components. Also fixed remaining bugs in form repopulation / validation and tested using Library application.</action>
<action type="fix" dev="Jonathan Locke" issue="1153047">Finished working on invalid input problems and model problems in choices. The result is a reworked choice model in a new model sub-package of form (which makes it a lot easier to read the form components in the form package). In addition, this checkin includes significant fixes to the wicket.model package, the most important of which is the elimination of DetachableModel, in favor of typesafe and simple usage patterns in AbstractDetachableModel.</action>
<action type="update" dev="Jonathan Locke" issue="">Folded IDetachableModel methods into IModel to eliminate instanceof checks and make models more automatic.</action>
<action type="fix" dev="Jonathan Locke" issue="1153047">Moved invalid input state logic up into FormComponent and changed form validation logic so that updates to the model only occur when validation of the whole form is successful. This works for textfields now, but we may need to tweak other components so they track invalid state during failed validations.</action>
<action type="update" dev="Jonathan Locke" issue="">Factored out AbstractDetachableModel so that attach/detach logic is encapsulated here and DetachableModel extends it for models with a transient Object property and PropertyModel extends it for models with an OGNL nature which might have nested detachable models.</action>
<action type="fix" dev="Eelco Hillenius" issue="1149610">Removed all the convenience stuff in order to get a better focus. Added FileInput that correspons to the HTML file input tag and that updates it's model with the FileItem commons-fileupload provides.</action>
<action type="update" dev="Eelco Hillenius" issue="1152615">Removed OnClickLink; onclick JS event handler generation is now supported for all link components. Also removed AbstractLink as there is no good reason to have that anymore, and Link seems the best base class. When a link is attached to an anchor ('a' tag), we'll generate the href attribute. In all other cases (e.g. if it is attached to a 'td' tag, we will generate the onclick attribute).</action>
<action type="fix" dev="Jonathan Locke" issue="1151765">Changed DropDownChoice so that you simply return true from wantOnSelectionChangedNotifications() in your subclass and you get calls to onSelectionChanged() via the javascript. The default implementation of wantOnSelectionChangedNotifications() returns false, so this eliminates round trips for dropdowns that don't explicitly enable this feature.</action>
<action type="fix" dev="Jonathan Locke" issue="1152595">Added onRendered() method and reset() and onReset() methods to help with lifecycle problems that were causing problems with feedback panels not resetting properly. This was a pretty intricate and difficult bug to fix because the obvious code to put in onReset to clear feedback messages would include calling modelChangedStructure() on the listview. Unfortunately, this method does not work after rendering has finished because the staleness checks assume it is being called /before/ rendering (which it always is when users call it). The solution was to call removeAll() in FeedbackPanel instead. This causes the panel to repopulate, but without any staleness checking. Also documented why WebPage.getMarkupType() is final and what you would do if you wanted to implement a new markup type. Fixed a serious stack overflow error in setModel where modelChanged() was being called when the model hadn't changed. And made the listview constructors typesafe (the Serializable ones are ambiguous and incorrect).</action>
<action type="fix" dev="Jonathan Locke" issue="1151982">Made setModel() private and added initModel() method for lazy initialization of models in components that cannot set a model in their constructor. Used initModel to rework ListItem class and PageableListViewNavigation. Other minor tweaks and major refactor of hangman example.</action>
<action type="fix" dev="Jonathan Locke" issue="1151403">Added modelChanged() method to Component which is called when setModel() or setModelObject() are called. This method calls onModelChanged() to allow subclasses to respond to model changes. Changed Form to handle onModelChanged() by calling the onModelChanged() method of each contained FormComponent that uses the same root model as the form, as determined by the new sameRootModel() method in Component (which uses the INestedModel interface to look inside compound models such as PropertyModel and StringResourceModel to find the root model). The call to FormComponent.onModelChanged() resets any invalid state information from user editing since the model must now be correct by definition. For example, AbstractTextComponent overrides onModelChanged() and calls onValid() to reset its invalidInput memory.</action>
<action type="fix" dev="Jonathan Locke" issue="1144885">Added automatic image buttons (as demonstrated in FormInput example now) as well as automatic images. Each can generate an image using an image factory based on the value of the component's tag's value attribute. If the value is set to [factoryName].label, the given label will be drawn with the given ImageResourceFactory. The LocalizedImageResource class handles all this as well as localization issues with images attached to components. By default, only DefaultButtonImageFactory() is registered via LocalizedImageResource.add(ImageResourceFactory). The default button image factory has the name 'button', which means that any image or image button component that specifies a value of "button.[label]" will result in a DefaultButtonImage with the given label drawn on it. In addition to these improvements, the ImageResourceFactory base class adds automatic caching of images it creates via a WeakHashMap.</action>
<action type="fix" dev="Jonathan Locke" issue="1150668">Restructured form validation so that feedback is updated for the whole form on success or failure. Fixed additional bug where the form itself was not being considered by the feedback messages model as a place that might be the source of messages. These two changes together fix the bug.</action>
<action type="update" dev="Jonathan Locke" issue="">Refactored and simplified form validation. Added CustomValidator and removed a lot of unnecessary code and complexity.</action>
<action type="fix" dev="Jonathan Locke" issue="1149604">When core calls onClick() it automatically causes redirection to prevent repeating of the action on browser refreshes.</action>
<action type="fix" dev="Jonathan Locke" issue="1149566">Refactored feedback messages code and added a Form parameter to IValidationFeedback which is used by FeedbackPanel to restrict its output to just the Form being validated. This effectively gives us per-form feedback panels again.</action>
<action type="fix" dev="Jonathan Locke" issue="1138665">Created MultipartWebRequest class and used that to rework AbstractUploadForm and FileUploadForm so that validation will work on upload forms.</action>
<action type="update" dev="Jonathan Locke" issue="">Simplified choices so they just have a single is/setNullValid() property. When null is valid, the [name].null string resource is loaded and used. When null is not valid and the selection is null, [name].null is loaded and used to display something like "Choose One", since a null selection is not valid.</action>
<action type="update" dev="Jonathan Locke" issue="">Added relative and absolute path functionality to StaticImage, and in the process, factored out Packages from Classes in wicket.util.lang.</action>
<action type="fix" dev="Jonathan Locke" issue="1145200">Refactored resource locator code, creating a new package wicket.util.resource.locator which contains an SPI interface, IResourceLocator, for implementing resource locators. Then created AbstractResourceLocator as a base class for IResourceLocator implementations, including the new PathResourceLocator and ClassLoaderResourceLocator. Finally, created a helper/wrapper class ResourceLocator which adds convenience methods and then extended that class with DefaultResourceLocator, which extends ResourceLocator and uses PathResourceLocator and ClassLoaderResourceLocator together to emulate the earlier resource location functionality.</action>
</release>
<release version="0.9.18-beta" date="2005-02-20" description="Still more refactorings, documentation upgrades and bug fixes">
<action type="update" dev="Jonathan Locke" issue="">Enhanced WicketComponentTree and added this diagnostic to the bottom of the ExceptionErrorPage.</action>
<action type="update" dev="Jonathan Locke" issue="">Reorganized components and examples for final 1.0 structure. This included moving sortable list view and sign in panel to wicket-contrib and SmartLinkLabel classes to wicket-extensions. Also moved ButtonImageResource to wicket-extensions. In the process, fixed a bug in localized images where they would not change when the session locale was changed. Added an early sketch of stylesheet stuff to sandbox. Trimmed down examples index to just the examples most relevant to wicket core and extensions.</action>
<action type="fix" dev="Martijn Dashorst" issue="1123536">Added
<code>emptyAllowed</code>to the
<code>AbstractChoice</code>class allowing the select components to set the model value to
<code>null</code>.
</action>
<action type="fix" dev="Eelco Hillenius" issue="1120137">Changed selected attribute to selected = "selected" to be XHTML compliant. Added ComponentTag.syntheticCloseTagString() method which returns a close tag for the given component tag. Changed Juergen's fix to Panel use this method and then added another call to the same method to renderClosingComponentTag, which had been ignoring generation of close tags on /all/ openclose tags. This problem was actually a bug in HelloWorld, if you changed the &lt;span&gt; tag to a &lt;span/&gt; tag!</action>
<action type="update" dev="Eelco Hillenius" issue="">Moved tree to contrib until packaged CSS is supported.</action>
<action type="update" dev="Eelco Hillenius" issue="">Tree now images instead of image names and attribute modifiers. Also, some default images that work well with a regular tree are pacakged and used by default.</action>
<action type="update" dev="Eelco Hillenius" issue="">The tree component is now greatly simplified. Users are not required to use unique user objects, but instead the tree nodes are used. Also, as a result of a different rendering strategy, normal links can be used. The IndentTree is now the default tree. Removed the nested tree as that tree had several usability issues.</action>
<action type="fix" dev="Eelco Hillenius" issue="">Fixed JavaScript issue that resulted in problems with Firefox.</action>
<action type="update" dev="Jonathan Locke" issue="">Major refactor of resource handling to separate resource referencing components from the actual resources themselves. Added new Resource base class in wicket top level package. WebResource extends this and AbstractImage extends that. the Image subclass of AbstractImage is the only component for now. It can be either attached to an IMG tag with a src attribute or it can be given a DynamicImageResource and it will draw that.</action>
<action type="update" dev="Jonathan Locke" issue="">Changed methods taking Resource as a parameter to IResource for increased generality. Then added IModifiable interface to IResource to ensure all resources have a last modified time. This will be key in getting browser caching to work correctly. Finally, created AbstractResource and subclasses FileResource and UrlResource and moved the static Resource.locate methods into ResourceLocator.</action>
<action type="update" dev="Jonathan Locke" issue="">Made Link.onLinkClicked() final and added an onClick() method that it calls. This avoids exposing the interface method to subclassing directly. Did a similar thing to Form by making onFormSubmitted() final and exposing onValidate() as the overridable method. Also did a little early refactoring of resources that should affect nobody.</action>
<action type="fix" dev="Jonathan Locke" issue="1121946">The getResource() method in Image now uses the new findParentWithAssociatedMarkup() method to find the nearest parent with associated markup, which it then uses as the base class for image loading. This should always be right for Images since they are referenced from markup and findParentWithAssociatedMarkup() should always find that markup.</action>
<action type="fix" dev="Jonathan Locke" issue="1121959">Added ResourceComponent base class for components that provide resources by implementing IResourceListener. There doesn't appear to be an easy way to generalize this to Pages since they inherit from Component and since their behavior is quite different. Also changed IResource.getExtension() to getContentType() and changed the implementation of this interface in Resource to use the JDK's FileNameMap class to map from filenames to mime types.</action>
<action type="update" dev="Jonathan Locke" issue="">Renamed handleX() methods and other events to conform to the onX() pattern.</action>
<action type="add" dev="Jonathan Locke" issue="">Added ButtonImage DynamicImage subclass and added to images example.</action>
<action type="add" dev="Jonathan Locke" issue="1119620">Added Button class and Form buttons support. When a class has one button, it works pretty much as before. But when it has two or more buttons, the onSubmit() handler is called on the button which submitted the Form.</action>
<action type="add" dev="Jonathan Locke" issue="">Added getSharing() method to Component with values UNSHARED, APPLICATION_SHARED and SESSION_SHARED (see javadoc for details). Changed the AbstractImage class so that it allows a component user to set the sharing mode for an image to one of these values. When an image is SESSION_SHARED, it will have a stable URL within a given session. When an image is APPLICATION_SHARED, it will have a stable URL across all sessions in an application. So, to implement a really efficient dynamic image, simply store the image component in a static variable and set its sharing to APPLICATION_SHARED. Now you will have one object that is shared everywhere that has a stable URL. None of this requires access to temporary storage. One catch that might come up is that shared components will have a URL like /applicationName/a0 for application shared components or /applicationName/s0 for session shared components. In order for an application to handle such URLs it must have a servlet url mapping pattern that includes /* on the end, such as /images/*. Also updated image example to demonstrate all this.</action>
<action type="update" dev="Jonathan Locke" issue="">Created AbstractImage base class and simplified code in Image.</action>
<action type="fix" dev="Jonathan Locke" issue="1119725">Changed DefaultPageFactory so that it always tries default constructor if PageParameters constructor cannot be found and one exists.</action>
<action type="update" dev="Jonathan Locke" issue="">Restructed image component hierarchy to deal with clustering issues that Chris brought up. Changed example to demonstrate both BufferedDynamicImages (which will have a potentially large size when replicated across a cluster) and DynamicImages which draw themselves when they are requested. Caching issues are not addressed by this change, but I will be working on that soon.</action>
<action type="fix" dev="Jonathan Locke" issue="1119560">Restructured class hierarchy for converters a little so that all integral converters such as IntegerConverter extend AbstractIntegerConverter. Then made getNumberFormat() in AbstractNumberConverter abstract and implemented it in AbstractIntegerConverter by creating an integer NumberFormat instance and then turning grouping off and integer-only on. I like this fix because it really respects i18n, which is sometimes very complex stuff.</action>
<action type="update" dev="Jonathan Locke" issue="">Changed HtmlPage to WebPage, HtmlContainer to WebContainer and HtmlComponent to WebComponent for friendliness and consistency with http protocol package.</action>
<action type="update" dev="Jonathan Locke" issue="">Added constructors to TextField that take a class as the last argument. TextFields constructed with a type like this are considered typed and will automatically have a type validator attached to them. In addition, even if the field is not attached to a PropertyModel, conversions will be performed to/from the given type. Also, changed invalid to handleInvalid() and added handleValid(). This allows updateModel() to simply focus on doing that. Finally, worked on forminput to ensure validation works completely. Renamed the horribly named DecimalValidator to IntegerValidator and used all of this to simplify the forminput example.</action>
<action type="update" dev="Jonathan Locke" issue="">Changed inheritance hierarchy of text form components and added an abstract base class AbstractTextComponent. Now PasswordTextField inherits from TextField and TextField inherits from AbstractTextComponent. TextArea also inherits from AbstractTextComponent. This restructuing got rid of some duplication of methods and fields among the text components.</action>
<action type="fix" dev="Jonathan Locke" issue="1118466">Reworked conversion code to deal with the fact that the java.text Format parsing parses /leading/ values and not complete values. In other words, it sees 10foo and parses an Integer without throwing an Exception. The resulting code is smaller, more efficient (since it doesn't rely on exceptions to signal bad parses) and better structured. Also changed the ConversionException class so that it stores the Format used for the conversion instead of just a String 'pattern'.</action>
<action type="fix" dev="Jonathan Locke" issue="1118784">Fixed problem with autolink component resolver where it would continually resolve the same links on every render. The solution is to set the component's name when the auto-id is generated so that it can be found in the container the next time (so the resolver doesn't get called again). Also moved the AutolinkComponentResolver class into markup.html since it is html specific.</action>
<action type="fix" dev="Jonathan Locke" issue="1118413">The Component.getModelLock() method was changed to respond more appropriately when a real model doesn't exist. The code now returns model (without attaching it) if model is non-null and new Object() as a dummy lock if model is null.</action>
<action type="fix" dev="Jonathan Locke" issue="">Fix for unreported synchronization bug in ModificationWatcher where a ConcurrentModificationException can be thrown if the entries to be watched are modified while polling is going on (which takes a while). The solution was to make a defensive copy rather than holding a lock since that might introduce liveness issues since iterating the list of files and checking all their timestamps might take a while.</action>
<action type="update" dev="Jonathan Locke" issue="">Reworked signin panel and signin examples, including the library example so that they work with the new session factory model. Also added remember me functionality to the signin panel and moved localizations of the signin panel into the core.</action>
<action type="fix" dev="Jonathan Locke" issue="1116800">Added Page.reset() method that is called when runtime exceptions prevent full rendering of pages. I highly suspect this is behind bug 1116800 where Eelco reported that "Exception when rendering leaves markup in invalid state".</action>
<action type="fix" dev="Jonathan Locke" issue="1116805">Added BufferedHttpResponse class, along with ApplicationSettings.setBufferResponse to enable response buffering. Response buffering is on by default.</action>
<action type="update" dev="Jonathan Locke" issue="">Added ISessionFactory interface for creating sessions and added an abstract method getSessionFactory() to Application so applications can implement their own session factories. Since the downcasting of getProperty() is obviated by this, removed session properties. Will add a FAQ entry on how to set values on a session using the session factory approach since this will come up /a lot/.</action>
<action type="remove" dev="Jonathan Locke" issue="">Removed IModel constructors throughout the project and added instanceof logic to Component to wrap model objects unless they are already IModel implementors. Updated documentation to reflect this.</action>
<action type="fix" dev="Jonathan Locke" issue="">Implemented getModelLock() method on Component so that client code can synchronize updates to the model for a component. Updated core code so that it synchronizes on the returned lock object (which is currently the model's object as returned by IModel.getObject()) during rendering and form model updating. This lack of synchronization was a bug in the guestbook application which never showed symptoms simply because it had never been used by many users at once.</action>
<action type="update" dev="Jonathan Locke" issue="">Reworked examples navigation. Worked on code for GuestBook and GuestBook2. Provided base classes for future examples to extend (WicketExampleApplication, WicketExamplePage).</action>
<action type="update" dev="Jonathan Locke" issue="">Reworked feedback messages code significantly including the FeedbackMessages container class. Removed all the thread-local code and put feedback messages into Page instead. Added info(), debug(), warning(), error() and fatal() convenience methods to Component which report messages via the Page's FeedbackMessages container object.</action>
<action type="update" dev="Jonathan Locke" issue="">Wrote a new persistence abstraction that is more abstract and free of Cookieness (IValuePersister). Implemented this interface using browser cookies in the new class CookieValuePersister.</action>
<action type="update" dev="Jonathan Locke" issue="">Got rid of ValidationErrorDecorator and other code by doing a major refactor of the form validation package.</action>
<action type="update" dev="Jonathan Locke" issue="">Split up ApplicationSettings and ApplicationPages and moved many of the non-settings getters to Application.</action>
<action type="fix" dev="Jonathan Locke" issue="">Fixed guestbook test and other problems with example tests.</action>
<action type="fix" dev="Jonathan Locke" issue="">Made examples work from http://localhost:8080 via redirecting.</action>
<action type="fix" dev="Jonathan Locke" issue="1113613">Created FAQ page and added an explanation of why so many classes and methods are final</action>
<action type="fix" dev="Jonathan Locke" issue="1091897">Added comments and refactored renderBody to the more illustrative name renderComponentTagBody. Also changed names throughout the project to match this pattern. Simplified renderComponentTag() by folding in stripComponentName() logic and removed the overload of that method which advances the markup stream in addition to rendering the tag.</action>
<action type="fix" dev="Jonathan Locke" issue="1092016">Closed request to make RawMarkup class public since we do not want to expose this implementation detail.</action>
<action type="fix" dev="Jonathan Locke" issue="1091288">Changed parser to allow single quotes as well as double quotes around attribute values in XML tags.</action>
<action type="fix" dev="Jonathan Locke" issue="1106563">Fixed bug where popups expire due to removeNewerThan call in HttpRequestCycle. Also removed the method itself since it is not used for any other purpose.</action>
<action type="fix" dev="Jonathan Locke" issue="1100078">Closed RFE to allow custom object properties on ApplicationSettings since ApplicationSettings is really only for Wicket configuration. To store "global" objects for your application, just put regular old Java properties on your Application subclass. If I'm somehow missing your point, please reopen the bug and explain why subclassing Application won't provide the functionality you need.</action>
<action type="fix" dev="Jonathan Locke" issue="1032465">Closed old RFE for license aggregation since we already have the licenses available in the licenses folder in the core.</action>
<action type="update" dev="Jonathan Locke" issue="">Major reworking of converter code. Folded localized converters into a single set of converters, removing casts to ILocalizable in the process. Implemented converters for all Java primitive types plus Date, Timestamp and String. Added javadoc documentation for converter API. Refactored Component, TypeValidator and Session code to use the new converter code and to enable customization through overrides of getConverter(). Wrote new tests for converters.</action>
<action type="update" dev="Jonathan Locke" issue="">Refactored ComponentTagAttributeModifier and changed name to AttributeModifier. Made more of this class private and removed inappropriate tests of private API.</action>
<action type="update" dev="Jonathan Locke" issue="">Renamed IIdList -&gt; IDetachableChoiceList and IdListAdaptor -&gt; DetachableChoiceList</action>
<action type="update" dev="Jonathan Locke" issue="">Renamed IPageLink.getPageClass() -&gt; IPageLink.getPageIdentity()</action>
</release>
<release version="0.9.17-beta" date="2005-01-26" description="Major refactorings">
<action type="update" dev="Martijn Dashorst" issue="1107845">Moved wicket-examples-hangman into the wicket-examples project.</action>
<action type="fix" dev="Martijn Dashorst" issue="1107802">Hangman gives NPE at startup</action>
<action type="fix" dev="Martijn Dashorst">Made 'maven eclipse:generate-classpath' plugin work with eclipse projects.</action>
<action type="update" dev="Juergen Donnerstag">Changed the component markup to<![CDATA[<wicket:xxxx>]]></action>
<action type="update" dev="Jonathan Locke">Changed the registration of the servlet in web.xml to
<code>wicket.protocol.http.WicketServlet</code>
</action>
<action type="update" dev="Juergen Donnerstag">Refactored
<code>autolink</code>and
<code>border</code>to match the<![CDATA[<wicket:xxxx>]]>component markup
</action>
<action type="update" dev="Jonathan Locke">Simplified
<code>IMarkupParser</code>
</action>
<action type="update">Javadoc for several components updated.</action>
<action type="update" dev="Juergen Donnerstag">Refactored
<code>MarkupParser</code>
</action>
<action type="update" dev="Jonathan Locke">Refactored and documented:
<ul>
<li>wicket</li>
<li>wicket.model</li>
<li>wicket.protocol</li>
<li>wicket.response</li>
<li>wicket.request</li>
<li>wicket.util</li>
</ul>
</action>
<action type="update" dev="Jonathan Locke"/>
</release>
<release version="0.9.16-beta" date="2004-12-26" description="Really the last release before march to 1.0">
<action type="add" dev="Juergen Donnerstag">Added Spring-framework integration example to Wicket-examples.</action>
<action type="add" dev="Juergen Donnerstag">Added support for dynamic languages like Groovy. An example has been added to wicket-examples.</action>
<action type="fix" dev="Eelco Hillenius" issue="1091100" due-to="Gili">Javadoc bug in MultiLineLabel.</action>
<action type="fix" dev="Eelco Hillenius" issue="1091101" due-to="Gili">Font bug in paragraph.</action>
<action type="fix" dev="Martijn Dashorst" issue="1091094" due-to="Gili">Quickstart distribution not downloadable</action>
<action type="fix" dev="Martijn Dashorst">Fixed javadoc warning in ApplicationSettings.</action>
<action type="fix" dev="Eelco Hillenius" issue="1090226" due-to="Alex Chew" due-to-email="alex_chew at users.sourceforge.net">ListChoice Does not Support 'expression' binding</action>
</release>
<release version="0.9.15-beta" date="2004-12-19" description="Last release before march to 1.0">
<action type="add" dev="Eelco Hillenius" issue="1032507">Create a contrib section (site &amp; cvs) where high level components and other contributions that should not be part of the core can be put.</action>
<action type="add" dev="Martijn Dashorst">Added quickstart project</action>
<action type="update" dev="Eelco Hillenius" issue="1087152">Move packages from com.voicetribe.* to wicket.*</action>
<action type="add" dev="Martijn Dashorst" issue="1081709">Replaced the default design of a maven generated website with a more pleasing, non standard look and feel.</action>
<action type="add" dev="Martijn Dashorst" issue="1061782">Added Clover logo to front page of our website.</action>
<action type="add" dev="Juergen Donnerstag">Added support for a configurable character encoding (i18n) for markup files and HTTP response. And added a new example to show how it works.</action>
</release>
<release version="0.9.14-alpha" date="2004-12-06" description="State of CVS">
<action type="add" dev="Juergen Donnerstag">Model for PasswordTextField will now be encrypted for persistence (cookie)</action>
<action type="add" dev="Juergen Donnerstag">Fixed autoIndex bug. AutoIndex numbers are now unique across a whole page.</action>
<action type="add" dev="Juergen Donnerstag">Added lots of new and improved Table features. Examples contain displaytag like demos.</action>
<action type="add" dev="Juergen Donnerstag">signin example now includes a rememberMe functionality</action>
<action type="add" dev="Chris Turner">Introduced new ComponentTagAttributeModifier class and associated methods as a direct replacement for HtmlTagModifier and its subclasses.</action>
<action type="fix" dev="Martijn Dashorst" issue="1072362">Added reset password flag for PasswordTextField in order to support input forms without emptying the contents.</action>
<action type="add" dev="Eelco Hillenius" issue="1072080">Implemented multi field validation.</action>
<action type="add" dev="Eelco Hillenius">Implemented support for ui messaging (also used by validation). FeedbackPanel uses this, and is more generic now as well.</action>
<action type="add" dev="Juergen Donnerstag">Introduced ListView for lists (former Tables) that do not use paging. Table supports paging.</action>
<action type="fix" dev="Eelco Hillenius">Fixed bug that resulted in random session timeouts.</action>
</release>
<release version="0.9.13-alpha" date="25-10-2004" description="State of CVS">
<action type="add" dev="Martijn Dashorst">Converted confluence documentation to xdocs.</action>
</release>
</body>
</document>