Compare commits

...

228 Commits

Author SHA1 Message Date
René Gielen 645d06e116 WW-2836: Tag r705105 as Struts 2.0.12
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/tags/STRUTS_2_0_12@705106 13f79535-47bb-0310-9956-ffa450edef68
2008-10-16 00:41:59 +00:00
René Gielen fd687de750 WW-2836:
Preparing Struts 2.0.12 release

git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@705105 13f79535-47bb-0310-9956-ffa450edef68
2008-10-16 00:19:37 +00:00
Rainer Hermanns 9438281e6a WW-2836
Updated xwork dep to latest bugfix/security fix release 2.0.6

git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@704626 13f79535-47bb-0310-9956-ffa450edef68
2008-10-14 19:17:32 +00:00
René Gielen 34521fb906 XW-623:
Change MULTI_TEXTVALUE_SPARATOR into a property configurable by injection of constant named xwork.validatorfileparser.multi_textvalue_separator

git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@694960 13f79535-47bb-0310-9956-ffa450edef68
2008-09-13 15:01:00 +00:00
David Newton 8ab8bfeb04 Backing out premature change :(
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@692669 13f79535-47bb-0310-9956-ffa450edef68
2008-09-06 15:46:52 +00:00
David Newton 2d3a1a8b88 Changed includeParams default to "none".
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@692661 13f79535-47bb-0310-9956-ffa450edef68
2008-09-06 15:26:29 +00:00
René Gielen ff8b655c4b WW-2779:
Applying Musachy's fix to 2.0.x branch

git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@687874 13f79535-47bb-0310-9956-ffa450edef68
2008-08-21 21:56:46 +00:00
Wendy Smoak 9ee344feca Avoid overwriting the 2.x website where we publish 2.1.x snapshot docs.
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@680226 13f79535-47bb-0310-9956-ffa450edef68
2008-07-28 02:37:07 +00:00
Wendy Smoak f382908469 [WW-2734] Fix impossible casts, reported by FindBugs.
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@680067 13f79535-47bb-0310-9956-ffa450edef68
2008-07-27 06:25:58 +00:00
Wendy Smoak 6cda019a6c [WW-2734] Fix an impossible cast, reported by FindBugs.
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@680066 13f79535-47bb-0310-9956-ffa450edef68
2008-07-27 06:00:31 +00:00
René Gielen 061d23071a Fix broken jar signing with maven
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@678133 13f79535-47bb-0310-9956-ffa450edef68
2008-07-19 11:25:19 +00:00
René Gielen 94dfae3ef1 Back to 2.0.12-SNAPSHOT
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@670494 13f79535-47bb-0310-9956-ffa450edef68
2008-06-23 09:31:49 +00:00
René Gielen 52b6a00e37 WW-2693:
Preparing security fix release 2.0.11.2

git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@670383 13f79535-47bb-0310-9956-ffa450edef68
2008-06-22 16:55:23 +00:00
Antonio Petrelli ee2d3371e1 WW-2538
Removed the "close" call of the writer of the response.

git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@668256 13f79535-47bb-0310-9956-ffa450edef68
2008-06-16 18:27:18 +00:00
Rainer Hermanns 1470efd592 WW-2541 Backport WW-1951 to struts stable
o patch by Jelmer Kuperus applied

git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@667583 13f79535-47bb-0310-9956-ffa450edef68
2008-06-13 16:19:32 +00:00
Rainer Hermanns 190c97eb71 updated to use xwork 2.0.5 security fix release
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@667582 13f79535-47bb-0310-9956-ffa450edef68
2008-06-13 16:15:54 +00:00
James Mitchell da6a6df41c WW-2567 Backported DateTimePicker thread safety issues.
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@658363 13f79535-47bb-0310-9956-ffa450edef68
2008-05-20 17:59:18 +00:00
Donald J. Brown 90083b4255 Adding cargo version to fix tests
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@649044 13f79535-47bb-0310-9956-ffa450edef68
2008-04-17 10:34:27 +00:00
René Gielen 6294ee38c1 WW-2524,WW-2482:
Re-applying fix after doing the 2.0.11.1 security fix release

git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@632856 13f79535-47bb-0310-9956-ffa450edef68
2008-03-02 21:54:46 +00:00
René Gielen 9bda39bc2f WW-2524:
Switching back to 2.0.12-SNAPSHOT for 2.0.x branch HEAD

git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@632851 13f79535-47bb-0310-9956-ffa450edef68
2008-03-02 21:41:37 +00:00
René Gielen 20f933e780 WW-2524:
setting 2.0.11.1 version labels for upcoming release

git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@632761 13f79535-47bb-0310-9956-ffa450edef68
2008-03-02 14:07:28 +00:00
René Gielen 9f556fdbac WW-2524:
setting 2.0.11.1 version labels for upcoming release

git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@632759 13f79535-47bb-0310-9956-ffa450edef68
2008-03-02 14:01:14 +00:00
René Gielen b24d376038 WW-2524:
Temporarily disabling patch for a clean 2.0.11.1 fast track security fix release

git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@632754 13f79535-47bb-0310-9956-ffa450edef68
2008-03-02 13:15:57 +00:00
René Gielen 93866341ec WW-2427:
Applied Don Brown's fix for escaping double quote in href to 2.0.x tree

git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@630742 13f79535-47bb-0310-9956-ffa450edef68
2008-02-25 06:26:12 +00:00
René Gielen dbc620f84f WW-2414:
Applied James Mitchell's patch for critical XSS bug to 2.0.x tree

git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@630740 13f79535-47bb-0310-9956-ffa450edef68
2008-02-25 06:09:14 +00:00
René Gielen f88805221f WW-2482:
Fix Freemarker exception when model list entry has null value field

git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@620838 13f79535-47bb-0310-9956-ffa450edef68
2008-02-12 16:05:59 +00:00
James Holmes a784fd662c Update Struts 2 version.
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@579250 13f79535-47bb-0310-9956-ffa450edef68
2007-09-25 13:59:01 +00:00
Ted Nathan Husted 9e468f66ec WW-2054 Update poms for 2.0.12-SNAPSHOT.
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@578352 13f79535-47bb-0310-9956-ffa450edef68
2007-09-22 01:49:24 +00:00
Ted Nathan Husted d347672f8f WW-2054 Update poms for 2.0.11 tag.
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@578325 13f79535-47bb-0310-9956-ffa450edef68
2007-09-21 23:58:16 +00:00
James Holmes 9118148e08 WW-2181 SessionAware documentation is misleading about unit testing
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@576956 13f79535-47bb-0310-9956-ffa450edef68
2007-09-18 15:52:26 +00:00
James Holmes 564cff6a13 WW-2188 Incompatible API Change in Component.java
Deprecate the old method.

git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@576454 13f79535-47bb-0310-9956-ffa450edef68
2007-09-17 14:35:17 +00:00
James Holmes 0dd1925b4d WW-2188 Incompatible API Change in Component.java
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@576442 13f79535-47bb-0310-9956-ffa450edef68
2007-09-17 13:57:39 +00:00
James Holmes 155b9120cf WW-2183 XSLT result type is extremely slow for actions that produce a large xml document
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@575840 13f79535-47bb-0310-9956-ffa450edef68
2007-09-15 01:05:16 +00:00
Ted Nathan Husted 48c056c3ec ww-2054 Update POMs for Struts 2.0.11-SNAPSHOT.
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@575137 13f79535-47bb-0310-9956-ffa450edef68
2007-09-13 01:41:55 +00:00
Ted Nathan Husted 07e24cccbf ww-2054 Update POMs for second 2.0.10 run. Fix portlet artifact name.
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@575121 13f79535-47bb-0310-9956-ffa450edef68
2007-09-12 23:34:52 +00:00
Ted Nathan Husted a81e5db09d [maven-release-plugin] prepare for next development iteration
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@574412 13f79535-47bb-0310-9956-ffa450edef68
2007-09-10 23:56:19 +00:00
Ted Nathan Husted 93948e3287 [maven-release-plugin] prepare release struts2-parent-2.0.10
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@574410 13f79535-47bb-0310-9956-ffa450edef68
2007-09-10 23:55:54 +00:00
Nils-Helge Garli 6793ca3737 WW-2164 Backport to 2.0.x branch for error in url when namespace is blank.
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@574349 13f79535-47bb-0310-9956-ffa450edef68
2007-09-10 19:55:07 +00:00
Antonio Petrelli b2dc2d3e0e WW-2075
Merge from trunk to STRUTS_2_0_X.
Added configuration to "struts-parent".

git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@574268 13f79535-47bb-0310-9956-ffa450edef68
2007-09-10 14:49:47 +00:00
James Holmes f69f5bd22f Fix typo.
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@572864 13f79535-47bb-0310-9956-ffa450edef68
2007-09-05 02:42:24 +00:00
Donald J. Brown afe66729d2 Added better error message when a Struts tag is used w/o its filter
WW-1969


git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@572226 13f79535-47bb-0310-9956-ffa450edef68
2007-09-03 03:25:47 +00:00
Donald J. Brown 6d7038d9ee Fixing j5-j6 bug in test WW-2045
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@572220 13f79535-47bb-0310-9956-ffa450edef68
2007-09-03 02:46:43 +00:00
James Holmes 7705a823d0 WW-2135 The FreeMarker tag name for the DateTimePicker doesn't match TLD
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@570529 13f79535-47bb-0310-9956-ffa450edef68
2007-08-28 19:04:52 +00:00
James Holmes 7e52314ff9 WW-2142 input streams need to be explicitly closed
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@570513 13f79535-47bb-0310-9956-ffa450edef68
2007-08-28 18:14:00 +00:00
Nils-Helge Garli 16cf6524e4 WW-2105 Added redirectAction-example
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@569333 13f79535-47bb-0310-9956-ffa450edef68
2007-08-24 10:30:27 +00:00
Nils-Helge Garli 76e76ffe95 Backported changes to portlet sample application from 2.1
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@569307 13f79535-47bb-0310-9956-ffa450edef68
2007-08-24 09:16:30 +00:00
Nils-Helge Garli 21ae89b1a8 WW-2013 Backport to 2.0.x
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@569305 13f79535-47bb-0310-9956-ffa450edef68
2007-08-24 09:13:29 +00:00
Nils-Helge Garli da14faef1e WW-1713 Backport to 2.0.x
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@569304 13f79535-47bb-0310-9956-ffa450edef68
2007-08-24 09:12:20 +00:00
René Gielen accd8b1761 WW-1989, WW-2052, WW-2053, WW-2101, WW-2105:
Backporting portlet servlet wrapping, portlet redirect/redirectAction result and related issues to 2.0.x

git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@568896 13f79535-47bb-0310-9956-ffa450edef68
2007-08-23 09:05:56 +00:00
René Gielen a794a46e37 WW-1989, WW-2052, WW-2053, WW-2101, WW-2105:
Backporting portlet servlet wrapping, portlet redirect/redirectAction result and related issues to 2.0.x

git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@568895 13f79535-47bb-0310-9956-ffa450edef68
2007-08-23 08:57:36 +00:00
René Gielen 34591eb73a WW-1989, WW-2052, WW-2053, WW-2101, WW-2105:
Backporting portlet servlet wrapping, portlet redirect/redirectAction result and related issues to 2.0.x

git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@568894 13f79535-47bb-0310-9956-ffa450edef68
2007-08-23 08:54:10 +00:00
René Gielen e87f7868c1 WW-1989, WW-2052, WW-2053, WW-2101, WW-2105:
Backporting portlet servlet wrapping, portlet redirect/redirectAction result and related issues to 2.0.x

git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@568892 13f79535-47bb-0310-9956-ffa450edef68
2007-08-23 08:51:20 +00:00
René Gielen 87f408fd81 WW-1989, WW-2052, WW-2053, WW-2101, WW-2105:
Backporting portlet servlet wrapping, portlet redirect/redirectAction result and related issues to 2.0.x

git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@568888 13f79535-47bb-0310-9956-ffa450edef68
2007-08-23 08:48:28 +00:00
James Holmes 4c851bb36c WW-2015 url tag, method attribute not evaluating expressions (ognl)
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@566730 13f79535-47bb-0310-9956-ffa450edef68
2007-08-16 14:32:53 +00:00
James Holmes 67066e0ded WW-1977 Struts throws stack trace instead of 404 when an action doesn't exist
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@566474 13f79535-47bb-0310-9956-ffa450edef68
2007-08-16 02:55:44 +00:00
James Holmes bd2eb6b8f8 WW-2115 Add Portuguese translation of struts-messages.properties
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@566417 13f79535-47bb-0310-9956-ffa450edef68
2007-08-15 23:59:21 +00:00
James Holmes e89e5934da WW-2115 Add Portuguese translation of struts-messages.properties
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@566414 13f79535-47bb-0310-9956-ffa450edef68
2007-08-15 23:58:15 +00:00
James Holmes 53d1d54536 WW-2103 Invalid Javascript generated for StringLength validator
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@566209 13f79535-47bb-0310-9956-ffa450edef68
2007-08-15 14:55:54 +00:00
James Holmes 6a2daa73cf WW-2058 Client side validation in xhtml template and clearErrorMessages not working in firefox with hidden fields
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@566190 13f79535-47bb-0310-9956-ffa450edef68
2007-08-15 14:35:19 +00:00
James Mitchell 91bbaf81cb WW-2089 align jetty config as to what is in trunk
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@565854 13f79535-47bb-0310-9956-ffa450edef68
2007-08-14 18:50:57 +00:00
James Holmes 7323b8176e WW-2110 css_xhtml checkbox.ftl renders one </div> to many when no label exists
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@565842 13f79535-47bb-0310-9956-ffa450edef68
2007-08-14 17:25:15 +00:00
James Holmes 09628422b9 WW-1761 templates don't specify type="text/javascript"; break W3C validation
Fixed issue of extra type="text/javascript" that was added during the fix for the original opening of the WW-1761 ticket.

git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@565752 13f79535-47bb-0310-9956-ffa450edef68
2007-08-14 13:45:49 +00:00
René Gielen 4717110ea2 WW-2109:
id resolution for <s:form> - minor cleanups

git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@565746 13f79535-47bb-0310-9956-ffa450edef68
2007-08-14 13:40:12 +00:00
René Gielen 065844e9bf WW-2109:
- "Intelligent" id resolution for <s:form> does not work as documented
- minor cleanups

git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@565697 13f79535-47bb-0310-9956-ffa450edef68
2007-08-14 10:28:35 +00:00
René Gielen 28d5931300 WW-2109:
"Intelligent" id resolution for <s:form> does not work as documented

git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@565695 13f79535-47bb-0310-9956-ffa450edef68
2007-08-14 10:21:53 +00:00
René Gielen 2fa6e12b41 WW-1993:
Clarification about XWorks's new DefaultObjectDeterminer which includes the generics funtionailty of deprecated GenericsObjectDeterminer

git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@565686 13f79535-47bb-0310-9956-ffa450edef68
2007-08-14 10:02:21 +00:00
James Holmes a96e4bc920 WW-1950 UrlHelper.buildUrl does not output port even if forceAddSchemeHostAndPort turned on (TestCase included)
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@565492 13f79535-47bb-0310-9956-ffa450edef68
2007-08-13 20:00:08 +00:00
James Holmes 1dcfb715c7 WW-1948 s:url tag does not provide forceAddSchemeHostAndPort parameter
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@565422 13f79535-47bb-0310-9956-ffa450edef68
2007-08-13 17:09:16 +00:00
René Gielen 02c7107516 WW-2108:
Make <s:tabbedpanel> being able to remember last selected tab using a cookie

git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@565265 13f79535-47bb-0310-9956-ffa450edef68
2007-08-13 08:18:07 +00:00
Donald J. Brown 00cf94d8e5 Turning off JSP EL for all Struts 2 tag attributes, as they are all processed for OGNL
expressions
WW-2107


git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@565259 13f79535-47bb-0310-9956-ffa450edef68
2007-08-13 07:55:18 +00:00
James Mitchell df634942e5 WW-2060 remove exclusion reference to domTT.js, which is not even in svn
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@563502 13f79535-47bb-0310-9956-ffa450edef68
2007-08-07 13:58:00 +00:00
James Mitchell 2b96ceaaa1 WW-2054 fix simple typos
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@563491 13f79535-47bb-0310-9956-ffa450edef68
2007-08-07 13:05:43 +00:00
James Mitchell 3e6d92462c WW-2060 add credit where credit is due
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@563483 13f79535-47bb-0310-9956-ffa450edef68
2007-08-07 13:00:08 +00:00
James Holmes 8f18766de8 Fix typos.
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@562019 13f79535-47bb-0310-9956-ffa450edef68
2007-08-02 05:28:56 +00:00
James Holmes 57b5229afd Fix typos.
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@562016 13f79535-47bb-0310-9956-ffa450edef68
2007-08-02 05:15:23 +00:00
James Holmes 24940124fc WW-2080 actionError, actionMessage and fieldError Freemarker templates do not honor the cssClass and cssStyle attributes
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@561850 13f79535-47bb-0310-9956-ffa450edef68
2007-08-01 16:02:23 +00:00
James Holmes 13bd5c8b3e Fix typo.
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@561842 13f79535-47bb-0310-9956-ffa450edef68
2007-08-01 15:32:30 +00:00
James Holmes 011021a77f Fix typo.
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@561837 13f79535-47bb-0310-9956-ffa450edef68
2007-08-01 15:19:22 +00:00
James Holmes ab035f743d Fix typo.
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@561831 13f79535-47bb-0310-9956-ffa450edef68
2007-08-01 15:16:04 +00:00
James Holmes 2735f31349 Log a warning if user specifies a namespace and action with the <s:form> tag and the action is not found in the namespace. Right now this fails silently and the user gets an HTTP 404 typically. I've had this happen to me and it took a little while to realize I had the wrong namespace or action name. This warning should help users figure out the issue faster by giving them a heads up.
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@561617 13f79535-47bb-0310-9956-ffa450edef68
2007-08-01 01:08:36 +00:00
James Holmes 01705e68ec Fix typos.
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@561601 13f79535-47bb-0310-9956-ffa450edef68
2007-07-31 23:54:34 +00:00
James Holmes 9ed9973e1f Fix formatting to be all spaces instead of a mix of spaces and tabs.
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@561222 13f79535-47bb-0310-9956-ffa450edef68
2007-07-31 02:57:33 +00:00
James Holmes f11cc5c69c Specify XML version and encoding.
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@561220 13f79535-47bb-0310-9956-ffa450edef68
2007-07-31 02:45:40 +00:00
James Holmes db3b2c6b4b Fix formatting to be all spaces instead of a mix of spaces and tabs. Also fix init param comments that were incorrect.
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@561217 13f79535-47bb-0310-9956-ffa450edef68
2007-07-31 02:35:32 +00:00
René Gielen 7b5a6d4b38 Code cleanups / generification
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@560894 13f79535-47bb-0310-9956-ffa450edef68
2007-07-30 09:05:32 +00:00
René Gielen acc7495fe9 WW-1661:
Backporting Freemarker template caching to 2.0.x tree

git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@560881 13f79535-47bb-0310-9956-ffa450edef68
2007-07-30 07:05:55 +00:00
Antonio Petrelli 7b2fb236fc WW-2049
Merge from trunk to STRUTS_2_0_X branch.
Added licenses to plugins code.

git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@560753 13f79535-47bb-0310-9956-ffa450edef68
2007-07-29 16:18:28 +00:00
Antonio Petrelli 5b5ac79c76 WW-2049
Added licenses specific of STRUTS_2_0_X branch.
Added configuration of RAT plugin in core/pom.xml to exclude some third-party files.


git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@560697 13f79535-47bb-0310-9956-ffa450edef68
2007-07-29 08:58:03 +00:00
Antonio Petrelli c6e94237f9 WW-2049
Merge from trunk to STRUTS_2_0_X branch.
Added license to core/pom.xml.
Added configuration of RAT plugin in core/pom.xml to exclude some testing and generated files.
Third bunch of added licenses.
The STRUTS_2_0_X branch has special files that need to be license-fixed.

git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@560558 13f79535-47bb-0310-9956-ffa450edef68
2007-07-28 15:47:10 +00:00
Musachy Barroso e6a0b64097 WW-2048 AnchorTag has no setter method corresponding to TLD declared attribute 'onLoadJS'
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@560385 13f79535-47bb-0310-9956-ffa450edef68
2007-07-27 21:13:04 +00:00
René Gielen 29cf30f7ed WW-2007:
Fixing problems with generated javascript idetitifiers containing unescaped id parameter value

git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@560260 13f79535-47bb-0310-9956-ffa450edef68
2007-07-27 14:57:26 +00:00
James Holmes 1d5b8d05a7 WW-2064 XHTML checkbox template does not include tooltip consistently
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@559846 13f79535-47bb-0310-9956-ffa450edef68
2007-07-26 15:12:01 +00:00
Antonio Petrelli 5101ea1019 WW-2049
Merge from trunk to STRUTS_2_0_X branch.
Second bunch of added licenses.

git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@559615 13f79535-47bb-0310-9956-ffa450edef68
2007-07-25 21:25:25 +00:00
Antonio Petrelli df8e7346c2 WW-2049
Merge from trunk to STRUTS_2_0_X branch.
Added RAT report to the site.
First bunch of corrected licenses.

git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@559543 13f79535-47bb-0310-9956-ffa450edef68
2007-07-25 18:05:51 +00:00
James Holmes 5bbc080605 WW-1911 File Upload: content-type validation fails when no file is uploaded
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@559304 13f79535-47bb-0310-9956-ffa450edef68
2007-07-25 03:39:12 +00:00
James Holmes aa17d06e76 WW-1938 Bug with multiple s:param tags inside s:url tag
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@559146 13f79535-47bb-0310-9956-ffa450edef68
2007-07-24 18:15:13 +00:00
James Holmes 8c11875991 WW-2038 Extra carriage returns in simple theme templates
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@558925 13f79535-47bb-0310-9956-ffa450edef68
2007-07-24 04:29:25 +00:00
Ted Nathan Husted 0364dfa037 WW-2054 Update POM for Struts 2.0.10-SNAPSHOT.
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@558852 13f79535-47bb-0310-9956-ffa450edef68
2007-07-23 20:18:39 +00:00
Ted Nathan Husted 43d490927d WW-1974 Update POM for Struts 2.0.9. Small changes to Showcase prompts. See issue comment, items (5)-(7)
* The Ajax Hangman isn't "broken" anymore, but it does fail to report when a player wins. 
* At Validation/Field Validators <http://planetstruts.org/struts2-showcase/validation/showFieldValidatorsExamples.action>, the prompt for the date field is still misleading and encourages entry of the wrong style. 
* At Validation <http://localhost:8080/struts2-showcase/validation/index.jsp>, Validation (ajax) is no longer "broken". 


git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@558747 13f79535-47bb-0310-9956-ffa450edef68
2007-07-23 14:39:55 +00:00
Ted Nathan Husted d53c2bfff3 WW-1974 Update for latest Retrotranslator.
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@558690 13f79535-47bb-0310-9956-ffa450edef68
2007-07-23 11:43:05 +00:00
James Holmes a14bf5e249 Minor error message change.
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@558574 13f79535-47bb-0310-9956-ffa450edef68
2007-07-23 01:01:37 +00:00
James Holmes 55a551baa2 WW-2051 add additional javascript hooks for optiontransferselect
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@558460 13f79535-47bb-0310-9956-ffa450edef68
2007-07-22 04:16:29 +00:00
Antonio Petrelli 9f68f0446c WW-1724
Merge from trunk to STRUTS_2_0_X branch.
Added code to Struts 2 showcase to show that the content type is present even with a FreeMarker result, i.e. with a FreeMarker layout page.

git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@558289 13f79535-47bb-0310-9956-ffa450edef68
2007-07-21 10:41:12 +00:00
James Holmes 8db503996d Fix test failures caused by the fix for WW-1887. FreeMarker was complaining about the toString() call when it was applied to the value created by this tag: <#assign itemKey = ''/>.
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@557736 13f79535-47bb-0310-9956-ffa450edef68
2007-07-19 18:57:37 +00:00
Rainer Hermanns 50c3b36776 Tag doc update
Issue Number: WW-1974

git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@557702 13f79535-47bb-0310-9956-ffa450edef68
2007-07-19 17:32:48 +00:00
Rainer Hermanns 329bb930f0 Updating to xwork 2.0.4 release
o xwork 2.0.4 contains the fix for the critical security issue
  (see https://issues.apache.org/struts/browse/WW-2030 for details)

Note: The xwork group id changed from 'opensymphony' to 'com.opensymphony'

Issue Number: WW-2030

git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@557701 13f79535-47bb-0310-9956-ffa450edef68
2007-07-19 17:31:26 +00:00
James Holmes 3ccfbbfde0 Update to conform to the Struts 2 DTD instead of the XWork DTD.
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@557691 13f79535-47bb-0310-9956-ffa450edef68
2007-07-19 17:05:24 +00:00
James Holmes b23b4f0cc3 WW-1887 struts template/simple/select.ftl error/fix
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@557644 13f79535-47bb-0310-9956-ffa450edef68
2007-07-19 14:47:28 +00:00
James Holmes ac503f6260 WW-1850 struts-default package in struts-default.xml should be abstract
This is a backport of the fix made on the trunk for 2.1.

git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@557639 13f79535-47bb-0310-9956-ffa450edef68
2007-07-19 14:23:05 +00:00
James Holmes 165b4e7799 WW-1854 XSLTResult excludingPattern Property is Missing
This is a backport of the fix made on the trunk for 2.1.

git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@557637 13f79535-47bb-0310-9956-ffa450edef68
2007-07-19 14:20:13 +00:00
James Holmes 6fcf3cfb56 WW-2020 bug in struts.xml of the portlet demo (bad result URL)
This is a backport of the fix made on the trunk for 2.1.

git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@557624 13f79535-47bb-0310-9956-ffa450edef68
2007-07-19 13:49:57 +00:00
James Holmes 3559945b53 Fix some typos and bad english.
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@557614 13f79535-47bb-0310-9956-ffa450edef68
2007-07-19 13:28:49 +00:00
Antonio Petrelli df0084419b WW-1724
Merged from trunk to 2_0_X branch.
The request context for Struts 2 - Tiles 2 integration tries to dispatch the request if possible.
It includes it only if the response has been committed, or if it is a FreeMarker request (this must be fixed).

git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@557352 13f79535-47bb-0310-9956-ffa450edef68
2007-07-18 18:23:36 +00:00
James Holmes 4f11ad0878 Update docs per WW-1954.
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@557348 13f79535-47bb-0310-9956-ffa450edef68
2007-07-18 18:15:37 +00:00
James Holmes 5ae898d0c8 Fix test failures caused by the fix for WW-1618. It turns out that the doubleId was not being handled consistent with the way id is handled. I updated DoubleListUIBean.java to handle doubleId the same way as id. Basically doubleId will now be assigned the same value as doubleName if doubleId does not have a value.
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@557345 13f79535-47bb-0310-9956-ffa450edef68
2007-07-18 18:05:09 +00:00
James Holmes 473deb12f2 WW-2031 Update struts-2.0.dtd for empty interceptor stack
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@557317 13f79535-47bb-0310-9956-ffa450edef68
2007-07-18 16:33:55 +00:00
James Holmes 68a045ccc7 WW-1851 Struts 2.0 DTD missing "default-class-ref" element
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@557299 13f79535-47bb-0310-9956-ffa450edef68
2007-07-18 15:41:06 +00:00
James Holmes 2522690491 WW-1618 ww:doubleselect javascript uses name instead of id, resulting in array names that don't work
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@557294 13f79535-47bb-0310-9956-ffa450edef68
2007-07-18 15:26:59 +00:00
James Holmes 99be8e33cd WW-2011 Struts result are not parsed by default
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@557291 13f79535-47bb-0310-9956-ffa450edef68
2007-07-18 15:17:41 +00:00
Antonio Petrelli 350ffdcf87 WW-1992
Merge from Struts 2 trunk to 2.0 branch.
Added tiles-jsp to assembly.


git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@547709 13f79535-47bb-0310-9956-ffa450edef68
2007-06-15 15:20:10 +00:00
Musachy Barroso e5b380be24 Update version number to 2.0.8
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@546850 13f79535-47bb-0310-9956-ffa450edef68
2007-06-13 12:56:06 +00:00
Antonio Petrelli 3285a37ebd WW-1973
Merge from trunk.
Updated Struts2-Tiles plugin to depend on Tiles 2.0.4.

git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@545186 13f79535-47bb-0310-9956-ffa450edef68
2007-06-07 14:12:59 +00:00
Rainer Hermanns d4f5483489 Updating link to 2.0.9 release notes
Issue Number: WW-1974

git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@544898 13f79535-47bb-0310-9956-ffa450edef68
2007-06-06 17:51:00 +00:00
Rainer Hermanns 66a507c643 Adding a translate.sh script to backports for OSX/Linux environments
Issue Number: WW-1974

git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@544884 13f79535-47bb-0310-9956-ffa450edef68
2007-06-06 16:55:42 +00:00
Rainer Hermanns 9bca8b98cc Preparing 2.0.9 development
o updating pom.xml to 2.0.9-SNAPSHOT

Issue Number: WW-1974

git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@544883 13f79535-47bb-0310-9956-ffa450edef68
2007-06-06 16:54:35 +00:00
Rainer Hermanns 76b2800d18 Commenting api inclusion for assembly goal
Issue Number: WW-1834

git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@544865 13f79535-47bb-0310-9956-ffa450edef68
2007-06-06 15:24:26 +00:00
Rainer Hermanns 8373599f01 Removing SNAPSHOT for Struts 2.0.8 release
o updated all pom.xml
o updated backport/translate.bat
o updated dependency on struts-annotations to 1.0.2 release

git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@544857 13f79535-47bb-0310-9956-ffa450edef68
2007-06-06 14:45:50 +00:00
Musachy Barroso 70341ac8b0 Fix example typo
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@543179 13f79535-47bb-0310-9956-ffa450edef68
2007-05-31 16:28:42 +00:00
Musachy Barroso d304ea3ffd Remove confusing comment
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@543174 13f79535-47bb-0310-9956-ffa450edef68
2007-05-31 16:04:00 +00:00
Rainer Hermanns 97d6872beb Bundle XWork 2.0.3
o updating XWork dep to 2.0.3 release
o added OpenSymphony maven2 repository

Issue Number: WW-1902

git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@542529 13f79535-47bb-0310-9956-ffa450edef68
2007-05-29 14:13:56 +00:00
Donald J. Brown 042e6c0422 Fixing tag output to be more xhtml compliant, adding mapper extension test
WW-1649


git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@541982 13f79535-47bb-0310-9956-ffa450edef68
2007-05-27 13:04:02 +00:00
Antonio Petrelli 157cc6583c WW-1942
Merge from trunk to STRUTS_2_0_X branch.
In the URL spaces are converted into %20, while in the file must be spaces.

git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@541676 13f79535-47bb-0310-9956-ffa450edef68
2007-05-25 14:48:33 +00:00
Donald J. Brown 13e976f502 Fixed request parameters to use linkedhashmap
WW-1942


git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@541528 13f79535-47bb-0310-9956-ffa450edef68
2007-05-25 04:01:23 +00:00
Donald J. Brown 411ffc127a Changing component parameters to use linkedHashMap (preserve order), fixed tests
to reflect this
WW-1942


git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@541522 13f79535-47bb-0310-9956-ffa450edef68
2007-05-25 03:33:45 +00:00
Wendy Smoak 2c9a23eaef Use released version 2.0-alpha-4 of maven-dependency-plugin
WW-1943


git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@541185 13f79535-47bb-0310-9956-ffa450edef68
2007-05-24 05:41:11 +00:00
Wendy Smoak 4a6c4ad085 Update to released 1.0-alpha-10 version of plexus-container-default.
The latest release is 1.0-alpha-24 but the plugin will not compile against it.
WW-1943


git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@541178 13f79535-47bb-0310-9956-ffa450edef68
2007-05-24 05:33:05 +00:00
Wendy Smoak 53d2f7ea4a Use the 1.0-alpha-2 release (2007-03-14) of retrotranslator-maven-plugin.
WW-1943


git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@541159 13f79535-47bb-0310-9956-ffa450edef68
2007-05-24 04:36:53 +00:00
Antonio Petrelli d176c997bf WW-1941
Merge from trunk to STRUTS_2_0_X branch.
Updated Struts 2 - Tiles 2 plugin to use Tiles 2.0.3 in trunk.
Updated Struts 2 showcase to the changes of Struts 2 - Tiles 2 plugin.

git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@540974 13f79535-47bb-0310-9956-ffa450edef68
2007-05-23 15:16:35 +00:00
Donald J. Brown d543af34cc Changing id parameter name on restful action mapper to optional
WW-1715


git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@540814 13f79535-47bb-0310-9956-ffa450edef68
2007-05-23 02:46:05 +00:00
Donald J. Brown 845f524255 Fixed NPE in subset iterator tag
WW-1932


git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@540569 13f79535-47bb-0310-9956-ffa450edef68
2007-05-22 12:54:52 +00:00
Donald J. Brown 6b9175c510 Better handling of requests that have no cookies
WW-1920


git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@540560 13f79535-47bb-0310-9956-ffa450edef68
2007-05-22 12:31:49 +00:00
Donald J. Brown 0a70a1e477 Fixing selected item not recognized
WW-1907


git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@540554 13f79535-47bb-0310-9956-ffa450edef68
2007-05-22 12:18:33 +00:00
Donald J. Brown 29b1593301 Restoring the 'id' attribute to the sort and subset tags in the tld
WW-1905


git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@540552 13f79535-47bb-0310-9956-ffa450edef68
2007-05-22 12:13:00 +00:00
Donald J. Brown 77d7527d51 Improving javadoc
WW-1939


git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@540146 13f79535-47bb-0310-9956-ffa450edef68
2007-05-21 13:54:32 +00:00
Donald J. Brown 4253375672 Adding ability to set id parameter automatically in restful 2 action mapper
WW-1939


git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@540141 13f79535-47bb-0310-9956-ffa450edef68
2007-05-21 13:46:48 +00:00
Donald J. Brown 344eaf3e33 Added tests showing WW-1519 has been fixed
WW-1519


git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@539825 13f79535-47bb-0310-9956-ffa450edef68
2007-05-20 04:28:35 +00:00
Donald J. Brown 9a278838c2 Improving opt groups to use toString on key, adding tests
WW-1672


git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@539819 13f79535-47bb-0310-9956-ffa450edef68
2007-05-20 03:06:34 +00:00
Donald J. Brown d0f1acad94 Updated blank pom to use newer jetty plugin WW-1715
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@539817 13f79535-47bb-0310-9956-ffa450edef68
2007-05-20 03:02:23 +00:00
Donald J. Brown 44c2413ad2 Changed to correct snapshot jar of struts-annotations
WW-1834


git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@539805 13f79535-47bb-0310-9956-ffa450edef68
2007-05-19 22:18:56 +00:00
Donald J. Brown f796b25f33 Improved how properties are loaded, added closing tr tag for debug tag
WW-1746 WW-1712


git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@539688 13f79535-47bb-0310-9956-ffa450edef68
2007-05-19 05:12:22 +00:00
Musachy Barroso 862a6ed36e WW-1830 Support non-String attributes to freemarker JSP tag extensions
*  port from fix on WebWork rev 2866

git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@539660 13f79535-47bb-0310-9956-ffa450edef68
2007-05-19 01:25:31 +00:00
Musachy Barroso 0a1d4d7728 WW-1858 combobox template is not correct when there is '.' in the name attribute (use id instead of name)
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@539116 13f79535-47bb-0310-9956-ffa450edef68
2007-05-17 21:07:16 +00:00
Musachy Barroso 1b3f6102f6 WW-1752 cssStyle and cssClass are ignored in optiontransfer and doubleselect tags
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@539100 13f79535-47bb-0310-9956-ffa450edef68
2007-05-17 20:19:02 +00:00
Donald J. Brown 2ab4926795 Upgrading spring plugin to 2.0.5
WW-1834


git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@538403 13f79535-47bb-0310-9956-ffa450edef68
2007-05-16 01:58:46 +00:00
Musachy Barroso b734e6e2e4 WW-1914 attribute tabindex does not get rendered for submit tag
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@537478 13f79535-47bb-0310-9956-ffa450edef68
2007-05-12 16:25:59 +00:00
Musachy Barroso 2f101588c9 WW-1915 Showcase App, File Download section throws Exception
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@536023 13f79535-47bb-0310-9956-ffa450edef68
2007-05-07 23:44:06 +00:00
René Gielen 30359e5f62 WW-1758:
"disabled" attribute was not rendered for <s:submit> tag - modified template, added tests

git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@534889 13f79535-47bb-0310-9956-ffa450edef68
2007-05-03 14:25:50 +00:00
Musachy Barroso 3a14ddcaba Improve how the autocompleter gets the data from the JSON response (backport from 2.1)
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@533542 13f79535-47bb-0310-9956-ffa450edef68
2007-04-29 18:47:31 +00:00
Donald J. Brown cae4e442ed Fixing initialisation order problem
WW-1753


git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@532759 13f79535-47bb-0310-9956-ffa450edef68
2007-04-26 14:27:47 +00:00
Donald J. Brown b9d365a04c Minor javadoc fix
WW-1834


git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@532363 13f79535-47bb-0310-9956-ffa450edef68
2007-04-25 14:18:34 +00:00
Donald J. Brown 34993c7473 Backporting fixes to restful2 mapper (confused post w/ put, bad docs, more tests) from trunk
WW-1834


git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@531140 13f79535-47bb-0310-9956-ffa450edef68
2007-04-22 04:16:23 +00:00
Rainer Hermanns 6a46ca7fcd FilterDispatcher not always calling ActionContextCleanUp.cleanUp(Request)
o applied patch submitted by Jasper Rosenberg

Issue Number: WW-1816

git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@530439 13f79535-47bb-0310-9956-ffa450edef68
2007-04-19 15:00:20 +00:00
Rainer Hermanns 13b136c559 Updated xwork dependency to release 2.0.2
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@530357 13f79535-47bb-0310-9956-ffa450edef68
2007-04-19 10:06:32 +00:00
Musachy Barroso 909f724288 WW-1886 Renaming attribute "searchLimit" to "resultsLimit" as it makes more sense
(the results are the one limited, not the search text)

git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@529622 13f79535-47bb-0310-9956-ffa450edef68
2007-04-17 14:24:01 +00:00
Musachy Barroso 60b108e05e WW-1886 Add searchLimit attribute to autocompleter tag
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@529618 13f79535-47bb-0310-9956-ffa450edef68
2007-04-17 14:13:03 +00:00
Rainer Hermanns 60f1622f3d Unit Test fixes for failing tests in Bamboo
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@527824 13f79535-47bb-0310-9956-ffa450edef68
2007-04-12 07:53:39 +00:00
Rainer Hermanns d62437ee75 Upgrading surefire plugin to version 2.3 to get rid off strange unit test failures
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@527821 13f79535-47bb-0310-9956-ffa450edef68
2007-04-12 07:42:56 +00:00
Ted Nathan Husted 2543a00e62 WW-1834 Update release notes link.
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@526420 13f79535-47bb-0310-9956-ffa450edef68
2007-04-07 12:16:44 +00:00
Rainer Hermanns e83468aee5 Updating the xwork dependency to 2.0.2-SNAPSHOT to fix several problems reported to XWork and S2:
WW-1635 struts.xml include dependant packages not loading properly
WW-1856 s18n tag appears to be broken

NOTE on XWork 2.x updates: All validators.xml files are now validated, a DTD header is required.

git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@526222 13f79535-47bb-0310-9956-ffa450edef68
2007-04-06 16:37:54 +00:00
Musachy Barroso 20f7cdc513 WW-1869 Dojo ContentPane fails to parse paths with "!"
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@525342 13f79535-47bb-0310-9956-ffa450edef68
2007-04-04 00:46:57 +00:00
René Gielen 652cd4a899 WW-1856:
Use changed TextProviderFactory (for upcoming XW 2.0.2) to fix issue with broken i18n tag / missing thread safety for TPF

See also:
http://jira.opensymphony.com/browse/XW-487
http://jira.opensymphony.com/browse/XW-476

git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@523619 13f79535-47bb-0310-9956-ffa450edef68
2007-03-29 08:31:43 +00:00
James Mitchell 9b8f0a99c5 WW-1840 -- Mailreader -- either show passwords as *** or show them as readonly (text) or remove them
WW-1841 -- Mailreader -- msg text showing in place of logo image (struts.logo.alt)
WW-1842 -- Mailreader -- Remove walking tour

 * 1841 is not resolved, due to an issue with the i18n tag not finding the alternate bundle
 * remove extra extra params from css href and back links





git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@522729 13f79535-47bb-0310-9956-ffa450edef68
2007-03-27 03:47:48 +00:00
Ted Nathan Husted 8df1a49e44 WW-1767 Set STRUTS_2_0_X "head" to 2.0.8-SNAPSHOT
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@520399 13f79535-47bb-0310-9956-ffa450edef68
2007-03-20 14:04:53 +00:00
Ted Nathan Husted 1e769cc3b3 WW-1767 Update POMs for 2.0.7 build.
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@520258 13f79535-47bb-0310-9956-ffa450edef68
2007-03-20 03:38:45 +00:00
Ted Nathan Husted 299579aef2 WW-1828 "Login Action validation config file named "Logon-validation.xml" so doesn't validate" - Apply patch submitted by Dave Newton
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@520254 13f79535-47bb-0310-9956-ffa450edef68
2007-03-20 03:26:25 +00:00
Ted Nathan Husted 85c9e4c171 WW-1825 "Anchor tag inserts newline at end of tag" apply patch submitted by Claus Ibsen
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@520249 13f79535-47bb-0310-9956-ffa450edef68
2007-03-20 03:18:23 +00:00
Ted Nathan Husted 6d3cceca00 WW-1814 "Default TypeConverters always created with default ObjectFactory" Reorder statics as suggested by Jasper Rosenberg
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@520241 13f79535-47bb-0310-9956-ffa450edef68
2007-03-20 02:56:03 +00:00
Ted Nathan Husted 2154ad8513 WW-1799 "StringLength validator is inconsistent client side and server side" submitted by Mads Riise Rasmussen
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@520235 13f79535-47bb-0310-9956-ffa450edef68
2007-03-20 02:45:07 +00:00
Ted Nathan Husted fa754949ab WW-1803 "ScopeIntercaptor null references on session serialization" apply patch submitted by Sylvain RIBEYRON.
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@520151 13f79535-47bb-0310-9956-ffa450edef68
2007-03-19 22:48:16 +00:00
Ted Nathan Husted 9d71021b14 WW-1767 quickstart is gone, so this should be too!
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@520128 13f79535-47bb-0310-9956-ffa450edef68
2007-03-19 22:27:53 +00:00
Donald J. Brown b6be295074 Improved error handling for invalid package
WW-1826


git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@519452 13f79535-47bb-0310-9956-ffa450edef68
2007-03-17 21:50:09 +00:00
Musachy Barroso 13e6ae21d4 WW-1710 Fix wrong reference to dojo tooltip
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@519213 13f79535-47bb-0310-9956-ffa450edef68
2007-03-17 02:05:48 +00:00
Musachy Barroso 1e73567cec WW-1823 rename getAutocompleterModel to getAutocompleter in StrutsModels
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@519207 13f79535-47bb-0310-9956-ffa450edef68
2007-03-17 01:45:04 +00:00
René Gielen 8fa480d66b WW-1707:
Re-add deprecated "plaintext" result name for backwards compatibility

git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@518921 13f79535-47bb-0310-9956-ffa450edef68
2007-03-16 10:24:19 +00:00
Ted Nathan Husted 8910d90721 WW-18O4 "Showcase - view source throws NumberFormatException". The problem is that config parameter on the URL is empty (config=). It can be fixed by checing if the parameters are not empty instead of just != null in the ViewSourceAction.java. Submitted by Claus Ibsen.
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@517510 13f79535-47bb-0310-9956-ffa450edef68
2007-03-13 03:24:41 +00:00
Ted Nathan Husted db2bf7b4e3 WW-1526 "Error with handling static resources under WebSphere 6". Flush output after copy to appease WebLogic and possibly other containers. Submitted by Adam Czysciak.
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@517504 13f79535-47bb-0310-9956-ffa450edef68
2007-03-13 03:12:20 +00:00
Ted Nathan Husted 77cb215263 WW-1787 "Token session interceptor faiing with redirect-action" Apply patch based on WebWork #1404.
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@517433 13f79535-47bb-0310-9956-ffa450edef68
2007-03-12 22:34:58 +00:00
Ted Nathan Husted 51d985b3b7 WW-1786 "using session-token interceptor generates FreeMarker template error" Apply patch submitted by Tom Schneider. The change synchronizes on the Ognl context so we don't concurrently execute results. The issue was that we were getting concurrency exceptions around the ognl context because the results were being executed concurrently. The change will reduce throughput when using the session-token interceptor, but it avoids the concurrency issues.
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@517424 13f79535-47bb-0310-9956-ffa450edef68
2007-03-12 22:18:44 +00:00
Ted Nathan Husted 3563fe21e7 WW-1754 "The current struts-default.xml prevents TypeConverter wiring." Swap ObjectFactory and XWorkConverter load order per suggestion of Nicolas Berthet.
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@517408 13f79535-47bb-0310-9956-ffa450edef68
2007-03-12 21:32:01 +00:00
Ted Nathan Husted 8f589c03db WW-1678 - Port cookie interceptor from WW 2.2.5. Patch submitted by Nate Drake based on code contributed to WebWork2/Open Symphony by Toby Jee and Mathew Payne.
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@517374 13f79535-47bb-0310-9956-ffa450edef68
2007-03-12 20:25:06 +00:00
Ted Nathan Husted bb8d0bf28a WW-1619 URL component and URLHelper class do not handle multiple request parameters with the same name correctly when includeParams="get". Apply patch submitted by Tom Schneider.
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@517363 13f79535-47bb-0310-9956-ffa450edef68
2007-03-12 20:05:02 +00:00
Ted Nathan Husted 09f11dac5c WW-1707 Apply consistent naming for the results in struts-default.xml
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@517341 13f79535-47bb-0310-9956-ffa450edef68
2007-03-12 19:13:13 +00:00
Ted Nathan Husted fbe7fe226f WW-1801 Remove Spring dependency by copying properties manually.
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@517026 13f79535-47bb-0310-9956-ffa450edef68
2007-03-11 21:58:50 +00:00
Donald J. Brown 4e78cfce78 Fixed mailreader to use correct version and spring plugin
WW-1767


git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@517002 13f79535-47bb-0310-9956-ffa450edef68
2007-03-11 19:53:46 +00:00
Donald J. Brown 004ab6c47c Fixed bad character in file
WW-1767


git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@516997 13f79535-47bb-0310-9956-ffa450edef68
2007-03-11 19:40:40 +00:00
Ted Nathan Husted ff7144ca42 WW-1707 Apply consistent naming for the interceptors in struts-default.xml per report by Philip Luppens.
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@516937 13f79535-47bb-0310-9956-ffa450edef68
2007-03-11 15:50:48 +00:00
Ted Nathan Husted ae053fb669 WW-1781 - Delete redundant struts.properties file.
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@516929 13f79535-47bb-0310-9956-ffa450edef68
2007-03-11 15:34:01 +00:00
Ted Nathan Husted f621683dc1 WW-1781 - Set DevMode to false for example appliations. Remove other redundant or obsolete settings. Conform indentation n struts-default.xml.
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@516927 13f79535-47bb-0310-9956-ffa450edef68
2007-03-11 15:29:54 +00:00
René Gielen 209965eff0 WW-1768:
Applied Oleg Gorobets' patch to make Set tag support JSP body as String value to set. Added also some words of documentation of this new feature.

git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@516197 13f79535-47bb-0310-9956-ffa450edef68
2007-03-08 22:32:20 +00:00
René Gielen 0a64f616e8 WW-1750:
fixing <script> tags in templates using deprecated language attribute, therefore breaking W3C validation

git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@516176 13f79535-47bb-0310-9956-ffa450edef68
2007-03-08 21:12:40 +00:00
René Gielen 6f97753eec WW-1756:
Applied Erik Berg's patch to avoid unchecked reference to name parameter in radio tag freemarker template

git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@516164 13f79535-47bb-0310-9956-ffa450edef68
2007-03-08 20:08:21 +00:00
René Gielen 46dd4d4ca6 WW-1762:
Applied Erik Berg's patch to beautify anchor tag output

git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@516161 13f79535-47bb-0310-9956-ffa450edef68
2007-03-08 19:59:35 +00:00
René Gielen 98d4313537 WW-1748:
Applied Oleg Gorobets patch to support TextProvider to be configured with struts.properties

git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@515978 13f79535-47bb-0310-9956-ffa450edef68
2007-03-08 09:10:31 +00:00
René Gielen 231e27fd5e WW-1747:
- improved format pattern for fraction digits

git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@515885 13f79535-47bb-0310-9956-ffa450edef68
2007-03-08 01:49:31 +00:00
René Gielen 08f5faf1af Removed broken character encodings, as indicated by bamboo reports
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@515882 13f79535-47bb-0310-9956-ffa450edef68
2007-03-08 01:33:04 +00:00
René Gielen 1be016ae02 WW-1747:
- updated test to show number formatting issue pointed out by Mike Baroukh
- fixed issue by preventing freemarker from formatting numbers for this template

git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@515872 13f79535-47bb-0310-9956-ffa450edef68
2007-03-08 01:07:38 +00:00
Musachy Barroso 0a6c72e0c7 Fix form tag failing tests (add type="text/javascript")
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@515839 13f79535-47bb-0310-9956-ffa450edef68
2007-03-07 23:12:45 +00:00
Musachy Barroso dceee365c0 Add field "name" to autocompleter example
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@514170 13f79535-47bb-0310-9956-ffa450edef68
2007-03-03 15:19:30 +00:00
Musachy Barroso eca621ef35 WW-1777 DateTimePicker now supports expressions in the property "displayFormat"
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@512578 13f79535-47bb-0310-9956-ffa450edef68
2007-02-28 02:44:58 +00:00
Musachy Barroso fdcfcb8c15 WW-1771 Update DateTimePicker tag documentation. Sytax from:
http://www.unicode.org/reports/tr35/tr35-4.html#Date_Format_Patterns

git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@512130 13f79535-47bb-0310-9956-ffa450edef68
2007-02-27 04:12:59 +00:00
Musachy Barroso 422c84f511 WW-1771 Update DateTimePicker tag documentation. Sytax from:
http://www.unicode.org/reports/tr35/tr35-4.html#Date_Format_Patterns

git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@512128 13f79535-47bb-0310-9956-ffa450edef68
2007-02-27 04:10:16 +00:00
Thomas Schneider 16939ed8b1 WW-1733 Fixed request not being wrapped issue
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@511453 13f79535-47bb-0310-9956-ffa450edef68
2007-02-25 05:35:20 +00:00
Musachy Barroso b39e1f24c2 WW-1671 templates don't specify type="text/javascript"; break W3C validation
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@511302 13f79535-47bb-0310-9956-ffa450edef68
2007-02-24 16:49:02 +00:00
Musachy Barroso a1e9ba6aa4 WW-1766 div tag needs the scriptSeparation attribute
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@511299 13f79535-47bb-0310-9956-ffa450edef68
2007-02-24 16:39:53 +00:00
Musachy Barroso 7da5f114b4 WW-1589: Linked autocompleter reset on page reload
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@511295 13f79535-47bb-0310-9956-ffa450edef68
2007-02-24 16:23:00 +00:00
Musachy Barroso 4fd5d2ab15 Add breaklines to javadoc
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@511291 13f79535-47bb-0310-9956-ffa450edef68
2007-02-24 16:12:38 +00:00
Ted Nathan Husted fe3d2c2228 WW-1705 Remove link to "new API".
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@511218 13f79535-47bb-0310-9956-ffa450edef68
2007-02-24 05:38:34 +00:00
Ted Nathan Husted e75a5ae946 WW-1705 Update site for 2.0.6 release.
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@511178 13f79535-47bb-0310-9956-ffa450edef68
2007-02-24 01:01:11 +00:00
Musachy Barroso a4e91a9581 add images to homepage
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@511016 13f79535-47bb-0310-9956-ffa450edef68
2007-02-23 16:58:03 +00:00
Ted Nathan Husted 5c1593c02e WW-1705 Encode example URL in MailReader tour.
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@510919 13f79535-47bb-0310-9956-ffa450edef68
2007-02-23 12:03:36 +00:00
Musachy Barroso 28a98b5757 WW-1763: autocompleter tag isn´t present in the documentation
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@510771 13f79535-47bb-0310-9956-ffa450edef68
2007-02-23 02:43:40 +00:00
Musachy Barroso df14a287d0 WW-1763: autocompleter tag isn´t present in the documentation
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@510770 13f79535-47bb-0310-9956-ffa450edef68
2007-02-23 02:40:03 +00:00
Musachy Barroso 60391db64f WW-1602: Autocompleter is not rendering label
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@510748 13f79535-47bb-0310-9956-ffa450edef68
2007-02-23 01:20:37 +00:00
Musachy Barroso 6692879894 WW-1659:
* Update autocompleter to accept JSON generated using the JSON plugin
 * Add "dataFieldName" to identify the field to be used as the data source in the returned JSON string


git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@510742 13f79535-47bb-0310-9956-ffa450edef68
2007-02-23 01:04:18 +00:00
Musachy Barroso 9452a5c591 WW-1644 DateTimerPicker problems when type="time". Inherit from Dojo's DropDownTimePicker, the name cannot be "TimePicker" or Dojo gets really confused
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@510351 13f79535-47bb-0310-9956-ffa450edef68
2007-02-22 02:31:23 +00:00
René Gielen a181296a17 WW-1747 / WW-1711:
- applied Stuart Piltch's patch to add an additional string representation comparison in ContainUtil
- removed now unnecessary second check in select freemarker template

git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@509959 13f79535-47bb-0310-9956-ffa450edef68
2007-02-21 10:18:24 +00:00
René Gielen 94d7466015 WW-1747 / WW-1711:
Working with real types rather than String representations as long as possible should fix both issues with select tag.
Additional test added and verified.

git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@509812 13f79535-47bb-0310-9956-ffa450edef68
2007-02-20 23:37:47 +00:00
Ted Nathan Husted c6c51c6ba4 WW-1705 Update POMs for 2.0.7-SNAPSHOT.
git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/branches/STRUTS_2_0_X@509055 13f79535-47bb-0310-9956-ffa450edef68
2007-02-19 01:37:38 +00:00
606 changed files with 15263 additions and 4069 deletions
+4 -12
View File
@@ -1,11 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-apps</artifactId>
<version>2.0.6</version>
<version>2.0.12</version>
</parent>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-blank</artifactId>
@@ -47,18 +46,11 @@
<plugins>
<plugin>
<groupId>org.mortbay.jetty</groupId>
<artifactId>maven-jetty6-plugin</artifactId>
<artifactId>maven-jetty-plugin</artifactId>
<version>6.0.1</version>
<configuration>
<scanIntervalSeconds>10</scanIntervalSeconds>
</configuration>
<dependencies>
<dependency>
<groupId>org.apache.geronimo.specs</groupId>
<artifactId>geronimo-j2ee_1.4_spec</artifactId>
<version>1.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
+1 -1
View File
@@ -6,7 +6,7 @@
<struts>
<constant name="struts.enable.DynamicMethodInvocation" value="false" />
<constant name="struts.devMode" value="true" />
<constant name="struts.devMode" value="false" />
<include file="example.xml"/>
+2 -9
View File
@@ -1,11 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-apps</artifactId>
<version>2.0.6</version>
<version>2.0.12</version>
</parent>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-mailreader</artifactId>
@@ -31,12 +30,6 @@
<artifactId>struts-mailreader-dao</artifactId>
<version>1.3.5</version>
</dependency>
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-spring-plugin</artifactId>
<version>${pom.version}</version>
</dependency>
</dependencies>
<build>
@@ -1,6 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans default-autowire="autodetect">
<!-- add your spring beans here -->
</beans>
@@ -32,8 +32,6 @@ import org.apache.struts.apps.mailreader.dao.User;
import org.apache.struts.apps.mailreader.dao.UserDatabase;
import org.apache.struts.apps.mailreader.dao.impl.memory.MemorySubscription;
import org.apache.struts.apps.mailreader.dao.impl.memory.MemoryUser;
import org.springframework.beans.BeanUtils;
import java.util.Map;
/**
@@ -63,6 +61,28 @@ public class MailreaderSupport extends ActionSupport
return Constants.CANCEL;
}
/**
* Convenience method to copy User properties.
**/
protected void copyUser(User source, User target) {
if ((source==null) || (target==null)) return;
target.setFromAddress(source.getFromAddress());
target.setFullName(source.getFullName());
target.setPassword(source.getPassword());
target.setReplyToAddress(source.getReplyToAddress());
}
/**
* Convenience method to copy Subscription properties.
**/
protected void copySubscription(Subscription source, Subscription target) {
if ((source==null) || (target==null)) return;
target.setAutoConnect(source.getAutoConnect());
target.setPassword(source.getPassword());
target.setType(source.getType());
target.setUsername(source.getUsername());
}
// ---- ApplicationAware ----
@@ -435,7 +455,7 @@ public class MailreaderSupport extends ActionSupport
input.setPassword(_password);
User user = createUser(_username, _password);
if (null != user) {
BeanUtils.copyProperties(input,user);
copyUser(input,user);
setUser(user);
}
}
@@ -532,7 +552,7 @@ public class MailreaderSupport extends ActionSupport
Subscription input = getSubscription();
Subscription sub = createSubscription(host);
if (null != sub) {
BeanUtils.copyProperties(input, sub);
copySubscription(input, sub);
setSubscription(sub);
setHost(sub.getHost());
}
+1 -2
View File
@@ -6,9 +6,8 @@
<struts>
<constant name="struts.action.extension" value="do" />
<constant name="struts.devMode" value="false" />
<constant name="struts.devMode" value="true" />
<constant name="struts.enable.DynamicMethodInvocation" value="false" />
<constant name="struts.objectFactory" value="spring" />
<include file="mailreader-default.xml"/>
+1 -1
View File
@@ -2,5 +2,5 @@
<hr/>
<p>
<a href="<s:url action="Welcome" />"><s:text name="index.title"/></a>
<a href="<s:url action="Welcome" includeParams="none"/>"><s:text name="index.title"/></a>
</p>
+4 -1
View File
@@ -9,14 +9,17 @@
type="text/css"/>
</head>
<body onLoad="self.focus();document.Login.username.focus()">
<body onload="self.focus();document.Login.username.focus()">
<s:actionerror />
<s:text name="doesntexist" />
<s:form action="Login" validate="true">
<s:textfield key="username" />
<s:password key="password" showPassword="true"/>
<s:textfield name="doesntexist" />
<s:submit key="button.save"/>
<s:reset key="button.reset"/>
@@ -20,6 +20,7 @@
<li><a href="<s:url action="Logout"/>">
<s:text name="mainMenu.logout"/>
</a>
</li>
</ul>
</body>
</html>
@@ -14,7 +14,7 @@
type="text/css"/>
</head>
<body onLoad="self.focus();document.Registration_save_username.focus()">
<body onload="self.focus();document.Registration_save_username.focus()">
<s:actionerror/>
<s:form action="Registration_save" validate="false">
@@ -28,7 +28,7 @@
<s:hidden name="username"/>
</s:else>
<s:password key="password"/>
<s:password key="password" showPassword="true"/>
<s:password key="password2"/>
<s:textfield key="user.fullName"/>
<s:textfield key="user.fromAddress"/>
@@ -13,11 +13,11 @@
<s:if test="task=='Delete'">
<title><s:text name="subscription.title.delete"/></title>
</s:if>
<link href="<s:url value="/css/mailreader.css"/>" rel="stylesheet"
<link href="<s:url value="/css/mailreader.css" includeParams="none"/>" rel="stylesheet"
type="text/css"/>
</head>
<body onLoad="self.focus();document.Subscription.username.focus()">
<body onload="self.focus();document.Subscription.username.focus()">
<s:actionerror/>
<s:form action="Subscription_save" validate="true">
@@ -4,11 +4,6 @@
<display-name>Struts 2 Mailreader</display-name>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:applicationContext*.xml</param-value>
</context-param>
<filter>
<filter-name>Struts2</filter-name>
<filter-class>
@@ -18,22 +13,16 @@
<filter-mapping>
<filter-name>Struts2</filter-name>
<url-pattern>/*</url-pattern>
<url-pattern>*.do</url-pattern>
</filter-mapping>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<!-- Application Listener for Mailreader database -->
<listener>
<listener-class>
mailreader2.ApplicationListener
</listener-class>
</listener>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
+3 -4
View File
@@ -44,13 +44,12 @@
<hr/>
<p><s:i18n name="alternate">
<p><s:i18n name="alternate"><a href="http://struts.apache.org/">
<img src="<s:text name="struts.logo.path"/>"
alt="<s:text name="struts.logo.alt"/>"/>
alt="<s:text name="struts.logo.alt"/>" border="0px"/>
</a>
</s:i18n></p>
<p><a href="<s:url action="Tour" />"><s:text name="index.tour"/></a></p>
</body>
</html>
+33 -33
View File
@@ -182,36 +182,36 @@
&lt;display-name>Struts 2 MailReader&lt;/display-name>
<strong>&lt;filter>
&lt;filter-name>struts2&lt;/filter-name>
&lt;filter-class>
<strong>&lt;filter&gt;
&lt;filter-name&gt;struts2&lt;/filter-name&gt;
&lt;filter-class&gt;
org.apache.struts2.dispatcher.FilterDispatcher
&lt;/filter-class>
&lt;/filter></strong>
&lt;/filter-class&gt;
&lt;/filter&gt;</strong>
&lt;filter-mapping>
&lt;filter-name><strong>struts2</strong>&lt;/filter-name>
&lt;url-pattern>/*&lt;/url-pattern>
&lt;/filter-mapping>
&lt;filter-mapping&gt;
&lt;filter-name&gt;<strong>struts2</strong>&lt;/filter-name&gt;
&lt;url-pattern&gt;/*&lt;/url-pattern&gt;
&lt;/filter-mapping&gt;
&lt;listener>
&lt;listener-class>
&lt;listener&gt;
&lt;listener-class&gt;
org.springframework.web.context.ContextLoaderListener
&lt;/listener-class>
&lt;/listener>
&lt;/listener-class&gt;
&lt;/listener&gt;
&lt;!-- Application Listener for MailReader database -->
&lt;listener>
&lt;listener-class>
&lt;!-- Application Listener for MailReader database --&gt;
&lt;listener&gt;
&lt;listener-class&gt;
mailreader2.ApplicationListener
&lt;/listener-class>
&lt;/listener>
&lt;/listener-class&gt;
&lt;/listener&gt;
&lt;welcome-file-list>
&lt;welcome-file>index.html&lt;/welcome-file>
&lt;/welcome-file-list>
&lt;welcome-file-list&gt;
&lt;welcome-file&gt;index.html&lt;/welcome-file&gt;
&lt;/welcome-file-list&gt;
&lt;/web-app></code></pre>
&lt;/web-app&gt;</code></pre>
<hr/>
<p>
@@ -281,13 +281,13 @@
<hr/>
<h5>MailReader's index.html</h5>
<pre><code>&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
&lt;html>&lt;head>
&lt;META HTTP-EQUIV="Refresh" CONTENT="0;<strong>URL=Welcome.do</strong>">
&lt;/head>
&lt;body>
&lt;p>Loading ...&lt;/p>
&lt;/body>&lt;/html></code></pre>
<pre><code>&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"&gt;
&lt;html&gt;&lt;head&gt;
&lt;META HTTP-EQUIV="Refresh" CONTENT="0;<strong>URL=Welcome.do</strong>"&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;p&gt;Loading ...&lt;/p&gt;
&lt;/body&gt;&lt;/html&gt;</code></pre>
<hr/>
<p>
@@ -820,7 +820,7 @@ public class Welcome extends MailreaderSupport {
</p>
<hr/>
<pre><code>&lt;#if (actionErrors?exists && actionErrors?size > 0)>
<pre><code>&lt;#if (actionErrors?exists &amp;&amp; actionErrors?size > 0)>
&lt;ul>
&lt;#list actionErrors as error>
&lt;li>&lt;span class="errorMessage">${error}&lt;/span>&lt;/li>
@@ -837,7 +837,7 @@ public class Welcome extends MailreaderSupport {
</p>
<hr/>
<pre><code>&lt;#if (actionErrors?exists && actionErrors?size > 0)>
<pre><code>&lt;#if (actionErrors?exists &amp;&amp; actionErrors?size > 0)>
<strong>&lt;table></strong>
&lt;#list actionErrors as error>
<strong>&lt;tr>&lt;td></strong>&lt;span class="errorMessage">${error}&lt;/span><strong>&lt;/td>&lt;/tr></strong>
@@ -1064,7 +1064,7 @@ public void setPassword(String password) {
<pre><code>public User <strong>findUser</strong>(String username, String password)
throws <strong>ExpiredPasswordException</strong> {
User user = <strong>getDatabase().findUser(username)</strong>;
if ((user != null) && !user.getPassword().equals(password)) {
if ((user != null) &amp;&amp; !user.getPassword().equals(password)) {
user = null;
}
if (user == null) {
@@ -1427,7 +1427,7 @@ public class <strong>AuthenticationInterceptor</strong> implements Interceptor {
public String <strong>intercept</strong>(ActionInvocation actionInvocation) throws Exception {
Map session = actionInvocation.getInvocationContext().getSession();
User user = (User) session.get(Constants.USER_KEY);
boolean isAuthenticated = (null!=user) && (null!=user.getDatabase());
boolean isAuthenticated = (null!=user) &amp;&amp; (null!=user.getDatabase());
if (<strong>isAuthenticated</strong>) {
return actionInvocation.invoke();
}
+10 -37
View File
@@ -1,31 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
/*
* Copyright 2005-2006 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* $Id$
*/
-->
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-parent</artifactId>
<version>2.0.6</version>
<version>2.0.12</version>
</parent>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-apps</artifactId>
@@ -105,14 +83,10 @@
</goals>
<configuration>
<tasks>
<taskdef resource="hostedqatasks" classpathref="maven.plugin.classpath"/>
<upload file="${project.build.directory}/${project.build.finalName}.war"
account="struts" email="${email}"
password="${password}" resourceId="${resourceId}"/>
<taskdef resource="hostedqatasks" classpathref="maven.plugin.classpath" />
<upload file="${project.build.directory}/${project.build.finalName}.war" account="struts" email="${email}" password="${password}" resourceId="${resourceId}" />
<playsuite suiteId="${suiteId}" clientConfigs="${clientConfigs}" appConfigs="${appConfigs}" account="struts"
email="${email}"
password="${password}"/>
<playsuite suiteId="${suiteId}" clientConfigs="${clientConfigs}" appConfigs="${appConfigs}" account="struts" email="${email}" password="${password}" />
</tasks>
</configuration>
</execution>
@@ -135,6 +109,7 @@
<plugin>
<groupId>org.codehaus.cargo</groupId>
<artifactId>cargo-maven2-plugin</artifactId>
<version>0.3.1</version>
<configuration>
<container>
<containerId>tomcat5x</containerId>
@@ -156,13 +131,11 @@
<phase>process-sources</phase>
<configuration>
<tasks>
<copy todir="${project.build.directory}/${pom.artifactId}/WEB-INF/src/java"
failonerror="false">
<fileset dir="${basedir}/src/main/java"/>
<copy todir="${project.build.directory}/${pom.artifactId}/WEB-INF/src/java" failonerror="false">
<fileset dir="${basedir}/src/main/java" />
</copy>
<copy todir="${project.build.directory}/${pom.artifactId}/WEB-INF/src/java"
failonerror="false">
<fileset dir="${basedir}/src/main/resources"/>
<copy todir="${project.build.directory}/${pom.artifactId}/WEB-INF/src/java" failonerror="false">
<fileset dir="${basedir}/src/main/resources" />
</copy>
</tasks>
</configuration>
+24 -14
View File
@@ -1,11 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-apps</artifactId>
<version>2.0.6</version>
<version>2.0.12</version>
</parent>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-portlet</artifactId>
@@ -29,6 +28,12 @@
<groupId>org.apache.struts</groupId>
<artifactId>struts2-spring-plugin</artifactId>
<version>${pom.version}</version>
<exclusions>
<exclusion>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.struts</groupId>
@@ -51,20 +56,25 @@
<artifactId>commons-digester</artifactId>
<version>1.8</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.4</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.0</version>
<version>2.1</version>
</dependency>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.1.1</version>
</dependency>
<dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
<version>3.1</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.12</version>
</dependency>
</dependencies>
</project>
@@ -44,4 +44,7 @@ public class FormExample extends ActionSupport {
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String displayResult() {
return "displayResult";
}
}
@@ -0,0 +1,37 @@
/*
* $Id: FormExample.java 471756 2006-11-06 15:01:43Z husted $
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.struts2.portlet.example;
import org.apache.struts2.portlet.example.model.Name;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
/**
*/
public class FormExampleModelDriven extends ActionSupport implements ModelDriven<Name> {
private Name name = new Name();
public Name getModel() {
return name;
}
}
@@ -0,0 +1,81 @@
/*
* $Id: $
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.struts2.portlet.example.fileupload;
import java.io.File;
import org.apache.struts2.dispatcher.DefaultActionSupport;
/**
* File Upload example's action. <code>FileUploadAction</code>
*
*/
public class FileUploadAction extends DefaultActionSupport {
private static final long serialVersionUID = 5156288255337069381L;
private String contentType;
private File upload;
private String fileName;
private String caption;
// since we are using <s:file name="upload" .../> the file name will be
// obtained through getter/setter of <file-tag-name>FileName
public String getUploadFileName() {
return fileName;
}
public void setUploadFileName(String fileName) {
this.fileName = fileName;
}
// since we are using <s:file name="upload" ... /> the content type will be
// obtained through getter/setter of <file-tag-name>ContentType
public String getUploadContentType() {
return contentType;
}
public void setUploadContentType(String contentType) {
this.contentType = contentType;
}
// since we are using <s:file name="upload" ... /> the File itself will be
// obtained through getter/setter of <file-tag-name>
public File getUpload() {
return upload;
}
public void setUpload(File upload) {
this.upload = upload;
}
public String getCaption() {
return caption;
}
public void setCaption(String caption) {
this.caption = caption;
}
public String upload() throws Exception {
return SUCCESS;
}
}
@@ -0,0 +1,18 @@
package org.apache.struts2.portlet.example.model;
public class Name {
private String firstName;
private String lastName;
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
}
@@ -0,0 +1,48 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="edit" extends="struts-portlet-default"
namespace="/edit">
<action name="index"
class="com.opensymphony.xwork2.ActionSupport">
<result name="success">/WEB-INF/edit/index.jsp</result>
</action>
<action name="test"
class="com.opensymphony.xwork2.ActionSupport">
<result name="success">/WEB-INF/edit/test.jsp</result>
</action>
<action name="formExampleEdit"
class="org.apache.struts2.portlet.example.FormExample" method="input">
<result name="input">
/WEB-INF/edit/formExampleInput.jsp
</result>
</action>
<action name="processFormExampleEdit"
class="org.apache.struts2.portlet.example.FormExample">
<result name="input">
/WEB-INF/edit/formExampleInput.jsp
</result>
<result name="success">
/edit/processFormExampleForward.action?firstName=${firstName}&amp;lastName=${lastName}
</result>
</action>
<action name="processFormExampleForward"
class="org.apache.struts2.portlet.example.FormExample">
<result name="success">
/WEB-INF/edit/formExample.jsp
</result>
</action>
</package>
<package name="editTest" extends="edit" namespace="/edit/dummy/test">
<action name="testAction"
class="com.opensymphony.xwork2.ActionSupport">
<result name="success">/WEB-INF/edit/namespaceTest.jsp</result>
</action>
</package>
</struts>
@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="help" extends="struts-portlet-default"
namespace="/help">
<action name="index"
class="com.opensymphony.xwork2.ActionSupport">
<result name="success">/WEB-INF/help/index.jsp</result>
</action>
</package>
</struts>
@@ -0,0 +1,130 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="view" extends="struts-portlet-default"
namespace="/view">
<action name="index"
class="com.opensymphony.xwork2.ActionSupport">
<result name="success">/WEB-INF/view/index.jsp</result>
</action>
<action name="formExample"
class="org.apache.struts2.portlet.example.FormExample" method="input">
<result name="input">
/WEB-INF/view/formExampleInput.jsp
</result>
</action>
<action name="processFormExample"
class="org.apache.struts2.portlet.example.FormExample">
<result name="input">
/WEB-INF/view/formExampleInput.jsp
</result>
<result name="success">
/WEB-INF/view/formExample.jsp
</result>
</action>
<action name="formExamplePrg" class="org.apache.struts2.portlet.example.FormExample">
<result name="input">
/WEB-INF/view/formExampleInputPrg.jsp
</result>
<result name="success" type="redirectAction">
<param name="actionName">formExamplePrg</param>
<param name="method">displayResult</param>
<param name="firstName">${firstName}</param>
<param name="lastName">${lastName}</param>
</result>
<result name="displayResult">
/WEB-INF/view/formExample.jsp
</result>
</action>
<action name="formExampleModelDriven"
class="org.apache.struts2.portlet.example.FormExampleModelDriven">
<result name="input">
/WEB-INF/view/formExampleInputModelDriven.jsp
</result>
<result name="success">
/WEB-INF/view/formExample.jsp
</result>
</action>
<action name="validationExample"
class="org.apache.struts2.portlet.example.FormExample" method="input">
<result name="input">
/WEB-INF/view/formExampleInputValidation.jsp
</result>
</action>
<action name="processValidationExample"
class="org.apache.struts2.portlet.example.FormExample">
<result name="success">
/WEB-INF/view/formExample.jsp
</result>
<result name="input">
/WEB-INF/view/formExampleInputValidation.jsp
</result>
</action>
<action name="fileUpload" class="org.apache.struts2.portlet.example.fileupload.FileUploadAction">
<result name="input">
/WEB-INF/view/fileUpload.jsp
</result>
<result name="success">
/WEB-INF/view/fileUploadSuccess.jsp
</result>
</action>
<action name="tokenExample"
class="com.opensymphony.xwork2.ActionSupport" method="input">
<result name="input">
/WEB-INF/view/tokenExampleInput.jsp
</result>
</action>
<action name="processTokenExample"
class="com.opensymphony.xwork2.ActionSupport">
<result name="input">
/WEB-INF/view/tokenExampleInput.jsp
</result>
<result name="invalid.token">
/WEB-INF/view/tokenExampleInput.jsp
</result>
<result name="success">
/WEB-INF/view/tokenExample.jsp
</result>
<interceptor-ref name="portletDefaultStackWithToken" />
</action>
<action name="springExample" class="springAction">
<result name="success">
/WEB-INF/view/springExample.jsp
</result>
</action>
<action name="freeMarkerExample"
class="com.opensymphony.xwork2.ActionSupport" method="input">
<result type="freemarker" name="input">
/WEB-INF/view/freeMarkerExampleInput.ftl
</result>
</action>
<action name="processFreeMarkerExample"
class="org.apache.struts2.portlet.example.FormExample">
<result name="success">/view/processFreeMarkerView.action?firstName=${firstName}&amp;lastName=${lastName}</result>
</action>
<action name="processFreeMarkerView" class="org.apache.struts2.portlet.example.FormExample">
<result type="freemarker" name="success">/WEB-INF/view/freeMarkerExample.ftl</result>
</action>
<action name="velocityHelloWorld" class="com.opensymphony.xwork2.ActionSupport">
<result type="velocity" name="success">/WEB-INF/view/helloWorld.vm</result>
</action>
</package>
</struts>
+10 -160
View File
@@ -1,161 +1,11 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE xwork PUBLIC
"-//OpenSymphony Group//XWork 1.1.1//EN"
"http://www.opensymphony.com/xwork/xwork-1.1.1.dtd">
<xwork>
<include file="struts-portlet-default.xml" />
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<package name="view" extends="struts-portlet-default"
namespace="/view">
<action name="index"
class="com.opensymphony.xwork2.ActionSupport">
<result name="success">/WEB-INF/view/index.jsp</result>
</action>
<action name="formExample"
class="org.apache.struts2.portlet.example.FormExample" method="input">
<result name="input">
/WEB-INF/view/formExampleInput.jsp
</result>
</action>
<action name="processFormExample"
class="org.apache.struts2.portlet.example.FormExample">
<result name="input">
/WEB-INF/view/formExampleInput.jsp
</result>
<result name="success">
/WEB-INF/view/formExample.jsp
</result>
</action>
<action name="validationExample"
class="org.apache.struts2.portlet.example.FormExample" method="input">
<result name="input">
/WEB-INF/view/formExampleInputValidation.jsp
</result>
</action>
<action name="processValidationExample"
class="org.apache.struts2.portlet.example.FormExample">
<result name="success">
/WEB-INF/view/formExample.jsp
</result>
<result name="input">
/WEB-INF/view/formExampleInputValidation.jsp
</result>
<interceptor-ref name="validationWorkflowStack" />
</action>
<action name="tokenExample"
class="com.opensymphony.xwork2.ActionSupport" method="input">
<result name="input">
/WEB-INF/view/tokenExampleInput.jsp
</result>
</action>
<action name="processTokenExample"
class="com.opensymphony.xwork2.ActionSupport">
<result name="input">
/WEB-INF/view/tokenExampleInput.jsp
</result>
<result name="invalid.token">
/WEB-INF/view/tokenExampleInput.jsp
</result>
<result name="success">
/WEB-INF/view/tokenExample.jsp
</result>
<interceptor-ref name="token" />
<interceptor-ref name="defaultStack" />
</action>
<action name="springExample" class="springAction">
<result name="success">
/WEB-INF/view/springExample.jsp
</result>
</action>
<action name="ajaxExample"
class="com.opensymphony.xwork2.ActionSupport">
<result name="success">
/WEB-INF/view/ajaxExample.jsp
</result>
</action>
<action name="ajaxData"
class="com.opensymphony.xwork2.ActionSupport">
<result name="success">/WEB-INF/view/ajaxData.jsp</result>
</action>
<action name="freeMarkerExample"
class="com.opensymphony.xwork2.ActionSupport" method="input">
<result type="freemarker" name="input">
/WEB-INF/view/freeMarkerExampleInput.ftl
</result>
</action>
<action name="processFreeMarkerExample"
class="org.apache.struts2.portlet.example.FormExample">
<result name="success">/view/processFreeMarkerView.action?firstName=${firstName}&amp;lastName=${lastName}</result>
</action>
<action name="processFreeMarkerView" class="org.apache.struts2.portlet.example.FormExample">
<result type="freemarker" name="success">/WEB-INF/view/freeMarkerExample.ftl</result>
</action>
<action name="velocityHelloWorld" class="com.opensymphony.xwork2.ActionSupport">
<result type="velocity" name="success">/WEB-INF/view/helloWorld.vm</result>
</action>
</package>
<package name="edit" extends="struts-portlet-default"
namespace="/edit">
<action name="index"
class="com.opensymphony.xwork2.ActionSupport">
<result name="success">/WEB-INF/edit/index.jsp</result>
</action>
<action name="test"
class="com.opensymphony.xwork2.ActionSupport">
<result name="success">/WEB-INF/edit/test.jsp</result>
</action>
<action name="formExampleEdit"
class="org.apache.struts2.portlet.example.FormExample" method="input">
<result name="input">
/WEB-INF/edit/formExampleInput.jsp
</result>
</action>
<action name="processFormExampleEdit"
class="org.apache.struts2.portlet.example.FormExample">
<result name="input">
/WEB-INF/edtt/formExampleInput.jsp
</result>
<result name="success">
/edit/processFormExampleForward.action?firstName=${firstName}&amp;lastName=${lastName}
</result>
</action>
<action name="processFormExampleForward"
class="org.apache.struts2.portlet.example.FormExample">
<result name="success">
/WEB-INF/edit/formExample.jsp
</result>
</action>
</package>
<package name="editTest" extends="edit" namespace="/edit/dummy/test">
<action name="testAction"
class="com.opensymphony.xwork2.ActionSupport">
<result name="success">/WEB-INF/edit/namespaceTest.jsp</result>
</action>
</package>
<package name="help" extends="struts-portlet-default"
namespace="/help">
<action name="index"
class="com.opensymphony.xwork2.ActionSupport">
<result name="success">/WEB-INF/help/index.jsp</result>
</action>
</package>
</xwork>
<struts>
<include file="struts-portlet-default.xml"/>
<include file="struts-view.xml"/>
<include file="struts-edit.xml"/>
<include file="struts-help.xml"/>
</struts>
@@ -1,3 +1,6 @@
<!DOCTYPE validators PUBLIC
"-//OpenSymphony Group//XWork Validator Config 1.0//EN"
"http://www.opensymphony.com/xwork/xwork-validator-config-1.0.dtd">
<validators>
<validator name="required" class="com.opensymphony.xwork2.validator.validators.RequiredFieldValidator"/>
<validator name="requiredstring" class="com.opensymphony.xwork2.validator.validators.RequiredStringValidator"/>
+117 -103
View File
@@ -1,118 +1,132 @@
<portlet-app version="1.0" xmlns="http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd" id="struts-portlet">
<portlet id="StrutsPortlet">
<description xml:lang="EN">Struts Test Portlet</description>
<portlet-name>StrutsPortlet</portlet-name>
<display-name xml:lang="EN">Struts Test Portlet</display-name>
<?xml version="1.0" encoding="UTF-8"?>
<portlet-app
version="1.0"
xmlns="http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd"
id="struts-portlet">
<portlet id="StrutsPortlet">
<description xml:lang="EN">Struts Test Portlet</description>
<portlet-name>StrutsPortlet</portlet-name>
<display-name xml:lang="EN">Struts Test Portlet</display-name>
<portlet-class>org.apache.struts2.portlet.dispatcher.Jsr168Dispatcher</portlet-class>
<portlet-class>org.apache.struts2.portlet.dispatcher.Jsr168Dispatcher</portlet-class>
<init-param>
<!-- The view mode namespace. Maps to a namespace in the xwork config file -->
<name>viewNamespace</name>
<value>/view</value>
</init-param>
<init-param>
<!-- The default action to invoke in view mode -->
<name>defaultViewAction</name>
<value>index</value>
</init-param>
<init-param>
<!-- The view mode namespace. Maps to a namespace in the xwork config file -->
<name>editNamespace</name>
<value>/edit</value>
</init-param>
<init-param>
<!-- The default action to invoke in view mode -->
<name>defaultEditAction</name>
<value>index</value>
</init-param>
<init-param>
<!-- The view mode namespace. Maps to a namespace in the xwork config file -->
<name>helpNamespace</name>
<value>/help</value>
</init-param>
<init-param>
<!-- The default action to invoke in view mode -->
<name>defaultHelpAction</name>
<value>index</value>
</init-param>
<!-- The view mode namespace. Maps to a namespace in the Struts 2 config file. -->
<init-param>
<name>viewNamespace</name>
<value>/view</value>
</init-param>
<!-- The default action to invoke in view mode. -->
<init-param>
<name>defaultViewAction</name>
<value>index</value>
</init-param>
<!-- The edit mode namespace. Maps to a namespace in the Struts 2 config file. -->
<init-param>
<name>editNamespace</name>
<value>/edit</value>
</init-param>
<!-- The default action to invoke in edit mode. -->
<init-param>
<name>defaultEditAction</name>
<value>index</value>
</init-param>
<!-- The help mode namespace. Maps to a namespace in the Struts 2 config file. -->
<init-param>
<name>helpNamespace</name>
<value>/help</value>
</init-param>
<!-- The default action to invoke in help mode. -->
<init-param>
<name>defaultHelpAction</name>
<value>index</value>
</init-param>
<expiration-cache>0</expiration-cache>
<expiration-cache>0</expiration-cache>
<supports>
<mime-type>text/html</mime-type>
<portlet-mode>edit</portlet-mode>
<portlet-mode>help</portlet-mode>
<portlet-mode>view</portlet-mode>
</supports>
<supports>
<mime-type>text/html</mime-type>
<portlet-mode>edit</portlet-mode>
<portlet-mode>help</portlet-mode>
</supports>
<supported-locale>en</supported-locale>
<supported-locale>en</supported-locale>
<portlet-info>
<title>My StrutsPortlet portlet</title>
<short-title>SP</short-title>
<keywords>struts,portlet</keywords>
</portlet-info>
</portlet>
<portlet-info>
<title>My StrutsPortlet portlet</title>
<short-title>SP</short-title>
<keywords>struts,portlet</keywords>
</portlet-info>
</portlet>
<portlet id="StrutsPortlet2">
<description xml:lang="EN">Struts Test Portlet2</description>
<portlet-name>StrutsPortlet2</portlet-name>
<display-name xml:lang="EN">Struts Test Portlet2</display-name>
<portlet id="StrutsPortlet2">
<description xml:lang="EN">Struts Test Portlet2</description>
<portlet-name>StrutsPortlet2</portlet-name>
<display-name xml:lang="EN">Struts Test Portlet2</display-name>
<portlet-class>org.apache.struts2.portlet.dispatcher.Jsr168Dispatcher</portlet-class>
<portlet-class>org.apache.struts2.portlet.dispatcher.Jsr168Dispatcher</portlet-class>
<init-param>
<!-- The view mode namespace. Maps to a namespace in the xwork config file -->
<name>viewNamespace</name>
<value>/view</value>
</init-param>
<init-param>
<!-- The default action to invoke in view mode -->
<name>defaultViewAction</name>
<value>index</value>
</init-param>
<init-param>
<!-- The view mode namespace. Maps to a namespace in the xwork config file -->
<name>editNamespace</name>
<value>/edit</value>
</init-param>
<init-param>
<!-- The default action to invoke in view mode -->
<name>defaultEditAction</name>
<value>index</value>
</init-param>
<init-param>
<!-- The view mode namespace. Maps to a namespace in the xwork config file -->
<name>helpNamespace</name>
<value>/help</value>
</init-param>
<init-param>
<!-- The default action to invoke in view mode -->
<name>defaultHelpAction</name>
<value>index</value>
</init-param>
<!-- The view mode namespace. Maps to a namespace in the Struts 2 config file. -->
<init-param>
<name>viewNamespace</name>
<value>/view</value>
</init-param>
<expiration-cache>0</expiration-cache>
<!-- The default action to invoke in view mode. -->
<init-param>
<name>defaultViewAction</name>
<value>index</value>
</init-param>
<supports>
<mime-type>text/html</mime-type>
<portlet-mode>edit</portlet-mode>
<portlet-mode>help</portlet-mode>
</supports>
<!-- The edit mode namespace. Maps to a namespace in the Struts 2 config file. -->
<init-param>
<name>editNamespace</name>
<value>/edit</value>
</init-param>
<supported-locale>en</supported-locale>
<!-- The default action to invoke in edit mode. -->
<init-param>
<name>defaultEditAction</name>
<value>index</value>
</init-param>
<portlet-info>
<title>My StrutsPortlet portlet2</title>
<short-title>SP2</short-title>
<keywords>struts,portlet</keywords>
</portlet-info>
</portlet>
<!-- The help mode namespace. Maps to a namespace in the Struts 2 config file. -->
<init-param>
<name>helpNamespace</name>
<value>/help</value>
</init-param>
<!-- The default action to invoke in help mode. -->
<init-param>
<name>defaultHelpAction</name>
<value>index</value>
</init-param>
<expiration-cache>0</expiration-cache>
<supports>
<mime-type>text/html</mime-type>
<portlet-mode>edit</portlet-mode>
<portlet-mode>help</portlet-mode>
<portlet-mode>view</portlet-mode>
</supports>
<supported-locale>en</supported-locale>
<portlet-info>
<title>My StrutsPortlet portlet2</title>
<short-title>SP2</short-title>
<keywords>struts,portlet</keywords>
</portlet-info>
</portlet>
</portlet-app>
@@ -0,0 +1,13 @@
<%@ taglib prefix="s" uri="/struts-tags" %>
<h1>Fileupload sample</h1>
<s:actionerror />
<s:fielderror />
<s:form action="fileUpload" method="POST" enctype="multipart/form-data">
<s:file name="upload" label="File"/>
<s:textfield name="caption" label="Caption"/>
<s:submit />
</s:form>
@@ -0,0 +1,14 @@
<%@ taglib prefix="s" uri="/struts-tags" %>
<h1>Fileupload sample</h1>
<p>
<ul>
<li>ContentType: <s:property value="uploadContentType" /></li>
<li>FileName: <s:property value="uploadFileName" /></li>
<li>File: <s:property value="upload" /></li>
<li>Caption:<s:property value="caption" /></li>
</ul>
</p>
@@ -0,0 +1,8 @@
<%@ taglib prefix="s" uri="/struts-tags" %>
<H2>Input your name</H2>
<s:form action="formExampleModelDriven" method="POST">
<s:textfield label="First name" name="firstName" value="%{firstName}"/>
<s:textfield label="Last name" name="lastName" value="%{lastName}"/>
<s:submit value="Submit the form"/>
</s:form>
@@ -0,0 +1,8 @@
<%@ taglib prefix="s" uri="/struts-tags" %>
<H2>Input your name</H2>
<s:form action="formExamplePrg" method="POST">
<s:textfield label="First name" name="firstName" value="%{firstName}"/>
<s:textfield label="Last name" name="lastName" value="%{lastName}"/>
<s:submit value="Submit the form"/>
</s:form>
@@ -4,10 +4,12 @@
Here you'll find examples of what is possible with the Struts Portlet integration framework.
<ul>
<li><a href="<s:url action="formExample"/>">A simple form</a></li>
<li><a href="<s:url action="formExamplePrg" method="input"/>">Form example with proper PRG</a></li>
<li><a href="<s:url action="formExampleModelDriven" method="input"/>">Model driven example</li>
<li><a href="<s:url action="validationExample"/>">Validation</a></li>
<li><a href="<s:url action="tokenExample"/>">Token</a></li>
<li><a href="<s:url action="springExample"/>">Spring integration</a></li>
<li><a href="<s:url action="ajaxExample"/>">Ajax</a></li>
<li><a href="<s:url action="fileUpload" method="input"/>">File upload</li>
<li><a href="<s:url action="freeMarkerExample"/>">FreeMarker</a></li>
<li><a href="<s:url action="velocityHelloWorld"/>">Velocity</a></li>
<li><a href="<s:url action="index" portletMode="edit"/>">Go to edit mode and see what's there</a></li>
+23 -42
View File
@@ -1,49 +1,30 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app id="StrutsPortlet">
<!-- Uncomment/comment this if you need/don't need Spring support -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext*.xml</param-value>
</context-param>
<filter id="filterdispatcher">
<filter-name>action2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.FilterDispatcher
</filter-class>
</filter>
<filter-mapping>
<filter-name>action2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- Uncomment/comment this if you need/don't need Spring support -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext*.xml</param-value>
</context-param>
<filter id="filterdispatcher">
<filter-name>Struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</filter>
<filter-mapping>
<filter-name>Struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<listener>
<listener-class>
org.apache.struts2.portlet.context.ServletContextHolderListener
</listener-class>
</listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet id="preparator">
<servlet-name>preparator</servlet-name>
<servlet-class>
org.apache.struts2.portlet.context.PreparatorServlet
</servlet-class>
</servlet>
<servlet id="dwr">
<servlet-name>dwr</servlet-name>
<servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>dwr</servlet-name>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>
</web-app>
+9 -3
View File
@@ -1,11 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-apps</artifactId>
<version>2.0.6</version>
<version>2.0.12</version>
</parent>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-showcase</artifactId>
@@ -62,6 +61,13 @@
<version>${pom.version}</version>
</dependency>
<dependency>
<groupId>org.apache.tiles</groupId>
<artifactId>tiles-jsp</artifactId>
<version>2.0.4</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-codebehind-plugin</artifactId>
-66
View File
@@ -1,66 +0,0 @@
<configuration>
<!--
QuickStart can be used to extend other QuickStart configurations.
This is great for applications that have multiple "editions" and
extend upon a base webapp or evven just a base set of classes.
-->
<!--<extendsConfig>../path/to/quickstart.xml</extendsConfig>-->
<!--
QuickStart supports reading your IDEA module configuration and
using the libraries there. This is especially useful for maven
users who don't have a single directory in their project that
contains all the libraries they need.
-->
<ideaConfig>../../../xwork/xwork.iml,../../core/struts2-core.iml,struts2-showcase.iml</ideaConfig>
<!-- The context in which to deploy the web application -->
<context>/showcase</context>
<!-- The port in which to deploy the web application -->
<port>8080</port>
<!--
The libs directories can be a jar, a directory of jars, or even
a directory of directories (searched recursively)
<libs>
<dir>../../lib</dir>
</libs>
-->
<!--
Optional: the location where your source files are. If this is
not included, the auto-recompiling feature of QuickStart will
not be enabled. You may wish to do this anyway, as this feature
has been known to cause strange side effects. If you don't
specify your sources, you must specify where your classes are by
using the classDirs and libs elements
<sources>
<dir>src/main/java</dir>
</sources>
-->
<!--
The classDirs directories can be a jar or a directory of classes.
The WEB-INF/classes directory for each webDir (below) will automatically
be added if it exists.
-->
<classDirs>
<dir>src/main/resources</dir>
<dir>target/classes</dir>
<dir>../../core/target/classes</dir>
</classDirs>
<!--
You can specify one or more directories where your webapp files
are located. This is useful if you have your project split up in
unique ways. You can also specify the path that the directory is
mapped to, relative to the context.
-->
<webDirs>
<webDir>
<path>/</path>
<dir>src/main/webapp</dir>
</webDir>
</webDirs>
</configuration>
@@ -57,7 +57,7 @@ public class ViewSourceAction extends ActionSupport implements ServletContextAwa
public String execute() throws MalformedURLException, IOException {
if (page != null) {
if (page != null && page.trim().length() > 0) {
InputStream in = ClassLoaderUtil.getResourceAsStream(page.substring(page.indexOf("//")+1), getClass());
page = page.replace("//", "/");
@@ -70,18 +70,26 @@ public class ViewSourceAction extends ActionSupport implements ServletContextAwa
}
}
pageLines = read(in, -1);
if (in != null) {
in.close();
}
}
if (className != null) {
className = "/"+className.replace('.', '/') + ".java";
if (className != null && className.trim().length() > 0) {
className = "/" + className.replace('.', '/') + ".java";
InputStream in = getClass().getResourceAsStream(className);
if (in == null) {
in = servletContext.getResourceAsStream("/WEB-INF/src"+className);
}
classLines = read(in, -1);
if (in != null) {
in.close();
}
}
if (config != null) {
if (config != null && config.trim().length() > 0) {
int pos = config.lastIndexOf(':');
configLine = Integer.parseInt(config.substring(pos+1));
config = config.substring(0, pos).replace("//", "/");
@@ -118,8 +126,6 @@ public class ViewSourceAction extends ActionSupport implements ServletContextAwa
this.padding = padding;
}
/**
* @return the classLines
*/
@@ -215,6 +221,4 @@ public class ViewSourceAction extends ActionSupport implements ServletContextAwa
public void setServletContext(ServletContext arg0) {
this.servletContext = arg0;
}
}
+2 -1
View File
@@ -2,4 +2,5 @@ Apache Struts
Copyright 2000-2007 The Apache Software Foundation
This product includes software developed by
The Apache Software Foundation (http://www.apache.org/).
The Apache Software Foundation (http://www.apache.org/).
Nifty Corners (http://www.html.it/articoli/nifty/index.html).
@@ -1,73 +1,73 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE validators PUBLIC
"-//OpenSymphony Group//XWork Validator 1.0//EN"
"http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
<!-- START SNIPPET: fieldValidatorsExample -->
"-//OpenSymphony Group//XWork Validator 1.0//EN"
"http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
<!-- START SNIPPET: fieldValidatorsExample -->
<validators>
<field name="requiredValidatorField">
<field-validator type="required">
<message><![CDATA[ required ]]></message>
</field-validator>
</field>
<field name="requiredStringValidatorField">
<field-validator type="requiredstring">
<param name="trim">true</param>
<field name="requiredValidatorField">
<field-validator type="required">
<message><![CDATA[ required ]]></message>
</field-validator>
</field>
<field name="requiredStringValidatorField">
<field-validator type="requiredstring">
<param name="trim">true</param>
<message key="i18n.nothing.here"><![CDATA[ required and must be string ]]></message>
</field-validator>
</field>
<field name="requiredStringValidatorField">
<field-validator type="requiredstring">
<param name="trim">true</param>
</field-validator>
</field>
<field name="requiredStringValidatorField">
<field-validator type="requiredstring">
<param name="trim">true</param>
<message key="i18n.requiredstring"><![CDATA[ required and must be string ]]></message>
</field-validator>
</field>
<field name="integerValidatorField">
<field-validator type="int">
<param name="min">1</param>
<param name="max">10</param>
<message><![CDATA[ must be integer min 1 max 10 if supplied ]]></message>
</field-validator>
</field>
<field name="dateValidatorField">
<field-validator type="date">
<param name="min">01/01/1990</param>
<param name="max">01/01/2000</param>
<message><![CDATA[ must be a min 01-01-1990 max 01-01-2000 if supplied ]]></message>
</field-validator>
</field>
<field name="emailValidatorField">
<field-validator type="email">
<message><![CDATA[ must be a valid email if supplied ]]></message>
</field-validator>
</field>
<field name="urlValidatorField">
<field-validator type="url">
<message><![CDATA[ must be a valid url if supplied ]]></message>
</field-validator>
</field>
<field name="stringLengthValidatorField">
<field-validator type="stringlength">
<param name="maxLength">4</param>
<param name="minLength">2</param>
<param name="trim">true</param>
<message><![CDATA[ must be a String of a specific greater than 1 less than 5 if specified ]]></message>
</field-validator>
</field>
<field name="regexValidatorField">
<field-validator type="regex">
<param name="expression">.*\.txt</param>
<message><![CDATA[ regexValidatorField must match a regexp (.*\.txt) if specified ]]></message>
</field-validator>
</field>
<field name="fieldExpressionValidatorField">
<field-validator type="fieldexpression">
<param name="expression">(fieldExpressionValidatorField == requiredValidatorField)</param>
<message><![CDATA[ must be the same as the Required Validator Field if specified ]]></message>
</field-validator>
</field>
</field-validator>
</field>
<field name="integerValidatorField">
<field-validator type="int">
<param name="min">1</param>
<param name="max">10</param>
<message><![CDATA[ must be integer min 1 max 10 if supplied ]]></message>
</field-validator>
</field>
<field name="dateValidatorField">
<field-validator type="date">
<param name="min">01/01/1990</param>
<param name="max">01/01/2000</param>
<message><![CDATA[ must be a min 01/01/1990 max 01/01/2000 if supplied ]]></message>
</field-validator>
</field>
<field name="emailValidatorField">
<field-validator type="email">
<message><![CDATA[ must be a valid email if supplied ]]></message>
</field-validator>
</field>
<field name="urlValidatorField">
<field-validator type="url">
<message><![CDATA[ must be a valid url if supplied ]]></message>
</field-validator>
</field>
<field name="stringLengthValidatorField">
<field-validator type="stringlength">
<param name="maxLength">4</param>
<param name="minLength">2</param>
<param name="trim">true</param>
<message><![CDATA[ must be a String of a specific greater than 1 less than 5 if specified ]]></message>
</field-validator>
</field>
<field name="regexValidatorField">
<field-validator type="regex">
<param name="expression">.*\.txt</param>
<message><![CDATA[ regexValidatorField must match a regexp (.*\.txt) if specified ]]></message>
</field-validator>
</field>
<field name="fieldExpressionValidatorField">
<field-validator type="fieldexpression">
<param name="expression">(fieldExpressionValidatorField == requiredValidatorField)</param>
<message><![CDATA[ must be the same as the Required Validator Field if specified ]]></message>
</field-validator>
</field>
</validators>
<!-- END SNIPPET: fieldValidatorsExample -->
@@ -10,7 +10,7 @@
<default-action-ref name="download"/>
<action name="download" class="org.apache.struts2.showcase.filedownload.FileDownloadAction">
<param name="inputPath">\images\struts.gif</param>
<param name="inputPath">/images/struts.gif</param>
<result name="success" type="stream">
<param name="contentType">image/gif</param>
<param name="inputName">inputStream</param>
@@ -20,7 +20,7 @@
</action>
<action name="download2" class="org.apache.struts2.showcase.filedownload.FileDownloadAction">
<param name="inputPath">\images\struts-gif.zip</param>
<param name="inputPath">/images/struts-gif.zip</param>
<result name="success" type="stream">
<param name="contentType">application/zip</param>
<param name="inputName">inputStream</param>
@@ -30,7 +30,7 @@
<default-interceptor-ref name="integration" />
<default-action-ref name="editGangster" />
<!-- Diplay entry page that uses Model-Driven technique -->
<!-- Display entry page that uses Model-Driven technique -->
<action name="editGangster" class="org.apache.struts2.s1.Struts1Action">
<param name="className">org.apache.struts2.showcase.integration.EditGangsterAction</param>
<result>modelDriven.jsp</result>
@@ -17,6 +17,10 @@
<result type="tiles">showcase.freemarker</result>
</action>
<action name="freemarkerLayout">
<result type="tiles">showcase.freemarkerLayout</result>
</action>
<action name="sanity">
<result type="redirect">/tiles/layout.jsp</result>
<result type="redirect" name="success">/tiles/layout.jsp</result>
@@ -1,11 +0,0 @@
struts.i18n.reload=true
struts.devMode = true
struts.configuration.xml.reload=true
struts.continuations.package=org.apache.struts2.showcase
struts.custom.i18n.resources=globalMessages
#struts.action.extension=jspa
struts.url.http.port = 8080
struts.freemarker.manager.classname=customFreemarkerManager
struts.serve.static=true
struts.serve.static.browserCache=false
struts.codebehind.defaultPackage=person
@@ -7,10 +7,23 @@
<!-- START SNIPPET: xworkSample -->
<struts>
<!-- Some or all of these can be flipped to true for debugging -->
<constant name="struts.i18n.reload" value="false" />
<constant name="struts.devMode" value="false" />
<constant name="struts.configuration.xml.reload" value="false" />
<constant name="struts.custom.i18n.resources" value="globalMessages" />
<constant name="struts.codebehind.defaultPackage" value="person" />
<constant name="struts.freemarker.manager.classname" value="customFreemarkerManager" />
<constant name="struts.serve.static" value="true" />
<constant name="struts.serve.static.browserCache" value="false" />
<include file="struts-chat.xml" />
<include file="struts-hangman.xml" />
<include file="struts-continuations.xml"/>
<include file="struts-tags.xml"/>
<include file="struts-validation.xml" />
@@ -28,15 +28,21 @@
<tiles-definitions>
<definition name="showcase.index" template="/tiles/layout.jsp">
<put name="title" value="Tiles Showcase"/>
<put name="header" value="/tiles/header.jsp"/>
<put name="body" value="/tiles/body.jsp"/>
<put-attribute name="title" value="Tiles Showcase"/>
<put-attribute name="header" value="/tiles/header.jsp"/>
<put-attribute name="body" value="/tiles/body.jsp"/>
</definition>
<definition name="showcase.freemarker" template="/tiles/layout.jsp">
<put name="title" value="Tiles/Freemarker Showcase"/>
<put name="header" value="/tiles/header.jsp"/>
<put name="body" value="/tiles/body.ftl"/>
<put-attribute name="title" value="Tiles/Freemarker Showcase"/>
<put-attribute name="header" value="/tiles/header.jsp"/>
<put-attribute name="body" value="/tiles/body.ftl"/>
</definition>
<definition name="showcase.freemarkerLayout" template="/tiles/layout.ftl">
<put-attribute name="title" value="Tiles/Freemarker Showcase"/>
<put-attribute name="header" value="/tiles/header.jsp"/>
<put-attribute name="body" value="/tiles/body.ftl"/>
</definition>
</tiles-definitions>
@@ -5,11 +5,6 @@
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<display-name>Struts Showcase Application</display-name>
<context-param>
<param-name>org.apache.tiles.CONTAINER_FACTORY</param-name>
<param-value>org.apache.struts2.tiles.StrutsTilesContainerFactory</param-value>
</context-param>
<filter>
<filter-name>struts-cleanup</filter-name>
@@ -57,7 +52,7 @@
<listener>
<listener-class>
org.apache.tiles.listener.TilesListener
org.apache.struts2.tiles.StrutsTilesListener
</listener-class>
</listener>
@@ -85,6 +80,12 @@
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet>
<servlet-name>JspSupportServlet</servlet-name>
<servlet-class>org.apache.struts2.views.JspSupportServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- JavaServer Faces Servlet Mapping, not called directly -->
<servlet-mapping>
@@ -24,7 +24,7 @@ Using a JSON list returned from an action (href="/JSONList.action"), without aut
Reload on type (loadOnTextChange="true"), after 3 characters (loadMinimumCout="3", it is "3" by default), without the down arrow button (showDownArrow="false")
<br/>
<s:autocompleter theme="ajax" indicator="indicator" href="%{jsonList}" cssStyle="width: 200px;" autoComplete="false" loadOnTextChange="true" loadMinimumCount="3" showDownArrow="false"/>
<s:autocompleter name="state" theme="ajax" indicator="indicator" href="%{jsonList}" cssStyle="width: 200px;" autoComplete="false" loadOnTextChange="true" loadMinimumCount="3" showDownArrow="false"/>
<img id="indicator" src="${pageContext.request.contextPath}/images/indicator.gif" alt="Loading..." style="display:none"/>
<br/>
@@ -11,7 +11,7 @@
</li>
<li>
<@s.url id="url" action="hangmanAjax" namespace="/hangman" />
(broken) <@s.a href="%{#url}">Hangman (Ajax - Experimental)</@s.a>
<@s.a href="%{#url}">Hangman (Ajax - Experimental)</@s.a>
</li>
</ul>
</body>
@@ -10,6 +10,9 @@
<li>
<a href="freemarker.action">View FreeMarker Example</a>
</li>
<li>
<a href="freemarkerLayout.action">View Example with a FreeMarker Layout</a>
</li>
</ul>
</div>
@@ -0,0 +1,12 @@
<#assign tiles=JspTaglibs["http://tiles.apache.org/tags-tiles"]>
<@tiles.importAttribute name="title" scope="request"/>
<html>
<head><title><@tiles.getAsString name="title"/></title></head>
<body>
<@tiles.insertAttribute name="header"/>
<p id="body">
<@tiles.insertAttribute name="body"/>
</p>
<p>Notice that this is a layout made in FreeMarker</p>
</body>
</html>
@@ -11,5 +11,7 @@
<p id="body">
<tiles:insertAttribute name="body"/>
</p>
<p>Notice that this is a layout made in JSP</p>
</body>
</html>
@@ -13,7 +13,7 @@
</head>
<body>
<h1>Validation Examples</h1>
<s:url id="quizBasic" namespace="/validation" action="quizBasic" method="input"/>
<s:url id="quizClient" namespace="/validation" action="quizClient" method="input"/>
<s:url id="quizClientCss" namespace="/validation" action="quizClientCss" method="input"/>
@@ -24,13 +24,13 @@
<s:url id="clientSideValidationUrl" action="clientSideValidationExample" namespace="/validation" />
<s:url id="backToShowcase" action="showcase" namespace="/" />
<s:url id="storeMessageAcrossRequestExample" value="/validation/storeErrorsAcrossRequestExample.jsp" />
<ul>
<li><s:a href="%{fieldValidatorUrl}">Field Validators</s:a></li>
<li><s:a href="%{clientSideValidationUrl}">Field Validators with client-side JavaScript</s:a></li>
<li><s:a href="%{nonFieldValidatorUrl}">Non Field Validator</s:a></li>
<li><s:a href="%{storeMessageAcrossRequestExample}">Store across request using MessageStoreInterceptor (Example)</s:a></li>
<li>(broken) <s:a href="%{quizAjax}">Validation (ajax)</s:a></li>
<li><s:a href="%{quizAjax}">Validation (ajax)</s:a></li>
<li><s:a href="%{quizBasic}">Validation (basic)</s:a></li>
<li><s:a href="%{quizClient}">Validation (client)</s:a></li>
<li><s:a href="%{quizClientCss}">Validation (client using css_xhtml theme)</s:a></li>
+10 -4
View File
@@ -33,7 +33,7 @@
<parent>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-parent</artifactId>
<version>2.0.6</version>
<version>2.0.12</version>
</parent>
<scm>
@@ -100,10 +100,10 @@
<configuration>
<artifactItems>
<artifactItem>
<groupId>opensymphony</groupId>
<groupId>com.opensymphony</groupId>
<artifactId>xwork</artifactId>
<classifier>javadoc</classifier>
<version>2.0.0</version>
<version>2.0.6</version>
</artifactItem>
</artifactItems>
<outputDirectory>${project.build.directory}/xwork-apidocs</outputDirectory>
@@ -231,6 +231,12 @@
<version>${version}</version>
</dependency>
<dependency>
<groupId>org.apache.tiles</groupId>
<artifactId>tiles-jsp</artifactId>
<version>2.0.4</version>
<scope>runtime</scope>
</dependency>
<!-- Include optional dependencies -->
<dependency>
@@ -384,7 +390,7 @@
<dependency>
<groupId>org.codehaus.plexus</groupId>
<artifactId>plexus-container-default</artifactId>
<version>1.0-alpha-10-SNAPSHOT</version>
<version>1.0-alpha-10</version>
<scope>provided</scope>
</dependency>
+4 -4
View File
@@ -58,10 +58,10 @@
<directory>../target/site</directory>
<outputDirectory>docs</outputDirectory>
</fileSet>
<fileSet>
<!--fileSet>
<directory>../api/target/site</directory>
<outputDirectory>docs/struts2-api</outputDirectory>
</fileSet>
</fileSet-->
<fileSet>
<directory>../core/target/site</directory>
<outputDirectory>docs/struts2-core</outputDirectory>
@@ -130,14 +130,14 @@
<include>src/</include>
</includes>
</fileSet>
<fileSet>
<!--fileSet>
<directory>../api</directory>
<outputDirectory>src/api</outputDirectory>
<includes>
<include>pom.xml</include>
<include>src/</include>
</includes>
</fileSet>
</fileSet-->
<fileSet>
<directory>../apps</directory>
<outputDirectory>src/apps</outputDirectory>
+2 -2
View File
@@ -60,14 +60,14 @@
<include>src/</include>
</includes>
</fileSet>
<fileSet>
<!--fileSet>
<directory>../api</directory>
<outputDirectory>src/api</outputDirectory>
<includes>
<include>pom.xml</include>
<include>src/</include>
</includes>
</fileSet>
</fileSet-->
<fileSet>
<directory>../apps</directory>
<outputDirectory>src/apps</outputDirectory>
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+2 -3
View File
@@ -1,3 +1,2 @@
java -jar retrotranslator-transformer-1.2.0.jar -advanced -srcjar ../lib/struts2-core-2.0.4.jar -destjar struts2-core-j4-2.0.4.jar
java -jar retrotranslator-transformer-1.2.0.jar -advanced -srcjar ../lib/struts2-api-2.0.4.jar -destjar struts2-api-j4-2.0.4.jar
java -jar retrotranslator-transformer-1.2.0.jar -advanced -srcjar ../lib/xwork-2.0.0.jar -destjar xwork-j4-2.0.0.jar
java -jar retrotranslator-transformer-1.2.2.jar -advanced -srcjar ../lib/struts2-core-2.0.12.jar -destjar struts2-core-j4-2.0.12.jar
java -jar retrotranslator-transformer-1.2.2.jar -advanced -srcjar ../lib/xwork-2.0.6.jar -destjar xwork-j4-2.0.6.jar
+3
View File
@@ -0,0 +1,3 @@
#!/bin/sh
java -jar retrotranslator-transformer-1.2.2.jar -advanced -srcjar ../lib/struts2-core-2.0.12.jar -destjar struts2-core-j4-2.0.12.jar
java -jar retrotranslator-transformer-1.2.2.jar -advanced -srcjar ../lib/xwork-2.0.6.jar -destjar xwork-j4-2.0.6.jar
+52 -10
View File
@@ -1,11 +1,32 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<!--
/*
* $Id$
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
-->
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-parent</artifactId>
<version>2.0.6</version>
<version>2.0.12</version>
</parent>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-core</artifactId>
@@ -22,7 +43,7 @@
<plugins>
<plugin>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.0-alpha-1-SNAPSHOT</version>
<version>2.0-alpha-4</version>
<executions>
<execution>
<id>unpack-xwork</id>
@@ -33,9 +54,9 @@
<configuration>
<artifactItems>
<artifactItem>
<groupId>opensymphony</groupId>
<groupId>com.opensymphony</groupId>
<artifactId>xwork</artifactId>
<version>2.0.1</version>
<version>2.0.6</version>
<classifier>sources</classifier>
</artifactItem>
</artifactItems>
@@ -107,6 +128,26 @@
</links>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>rat-maven-plugin</artifactId>
<version>1.0-alpha-2</version>
<configuration>
<includes>
<include>pom.xml</include>
<include>src/**</include>
</includes>
<excludes>
<exclude>src/test/resources/org/apache/struts2/views/jsp/ui/*</exclude>
<exclude>src/main/etc/**</exclude>
<exclude>src/main/resources/org/apache/struts2/static/dojo/src/**</exclude>
<exclude>src/main/resources/org/apache/struts2/static/dojo/*</exclude>
<exclude>src/main/resources/org/apache/struts2/static/niftycorners/**</exclude>
<exclude>src/test/resources/org/apache/struts2/interceptor/validation/*</exclude>
<exclude>src/site/resources/tags/**</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</reporting>
@@ -115,9 +156,10 @@
<!--
Run the translator for Java 1.4 compatiblity
Sample:
Samples:
$ cd struts/struts2/
$ mvn clean install -Papps,j4 -Djava14.jar=$JAVA_HOME/../Classes/classes.jar
$ mvn clean install -Papps,j4 -Djava14.jar="$JAVA_HOME/jre/lib/rt.jar"
-->
<id>j4</id>
@@ -250,9 +292,9 @@
<dependencies>
<dependency>
<groupId>opensymphony</groupId>
<groupId>com.opensymphony</groupId>
<artifactId>xwork</artifactId>
<version>2.0.1</version>
<version>2.0.6</version>
</dependency>
<dependency>
@@ -461,7 +503,7 @@
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts-annotations</artifactId>
<version>1.0-SNAPSHOT</version>
<version>1.0.2</version>
<optional>true</optional>
</dependency>
@@ -76,6 +76,9 @@ public final class StrutsConstants {
/** The org.apache.struts2.views.freemarker.FreemarkerManager implementation class */
public static final String STRUTS_FREEMARKER_MANAGER_CLASSNAME = "struts.freemarker.manager.classname";
/** Cache Freemarker templates */
public static final String STRUTS_FREEMARKER_TEMPLATES_CACHE = "struts.freemarker.templatesCache";
/** org.apache.struts2.views.velocity.VelocityManager implementation class */
public static final String STRUTS_VELOCITY_MANAGER_CLASSNAME = "struts.velocity.manager.classname";
@@ -147,4 +150,11 @@ public final class StrutsConstants {
public static final String STRUTS_XWORKCONVERTER = "struts.xworkConverter";
public static final String STRUTS_ALWAYS_SELECT_FULL_NAMESPACE = "struts.mapper.alwaysSelectFullNamespace";
/** XWork default text provider */
public static final String STRUTS_XWORKTEXTPROVIDER = "struts.xworkTextProvider";
/** The name of the parameter to create when mapping an id (used by some action mappers) */
public static final String STRUTS_ID_PARAMETER_NAME = "struts.mapper.idParameterName";
}
@@ -60,7 +60,7 @@ public abstract class AbstractRemoteCallUIBean extends ClosingUIBean implements
super.evaluateExtraParams();
if (href != null)
addParameter("href", findString(href));
addParameter("href", ensureAttributeSafelyNotEscaped(findString(href)));
if (errorText != null)
addParameter("errorText", findString(errorText));
if (loadingText != null)
@@ -41,7 +41,7 @@ import com.opensymphony.xwork2.util.ValueStack;
* <!-- START SNIPPET: example -->
*
* &lt;s:actionerror /&gt;
* &lt;s:form .... &gt;>
* &lt;s:form .... &gt;
* ....
* &lt;/s:form&gt;
*
@@ -29,18 +29,10 @@ import org.apache.struts2.views.annotations.StrutsTagAttribute;
import com.opensymphony.xwork2.util.ValueStack;
/**
* <!-- START SNIPPET: javadoc -->
* <p>The autocomplete tag is a combobox that can autocomplete text entered on the input box.
* When used on the "simple" theme, the autocompleter can be used like the ComboBox.
* When used on the "ajax" theme, the list can be retieved from an action. This action must
* return a JSON list in the format:</p>
* <pre>
* [
* ["Text 1","Value1"],
* ["Text 2","Value2"],
* ["Text 3","Value3"]
* ]
* </pre>
* <!-- START SNIPPET: ajaxJavadoc -->
* When used on the "ajax" theme, the list can be retieved from an action. </p>
* <B>THE FOLLOWING IS ONLY VALID WHEN AJAX IS CONFIGURED</B>
* <ul>
* <li>href</li>
@@ -70,18 +62,27 @@ import com.opensymphony.xwork2.util.ValueStack;
* 'showErrorTransportText': whether errors should be displayed (on 'targets')<p/>
* 'loadOnTextChange' options will be reloaded everytime a character is typed on the textbox<p/>
* 'loadMinimumCount' minimum number of characters that will force the content to be loaded<p/>
* 'showDownError' show or hide the down arrow button
* 'showDownError' show or hide the down arrow button<p/>
* 'searchType' how the search must be performed, options are: "startstring", "startword" and "substring"<p/>
* 'keyName' name of the field to which the selected key will be assigned<p/>
* 'iconPath' path of icon used for the dropdown
* 'templateCssPath' path to css file used to customize Dojo's widget
* 'iconPath' path of icon used for the dropdown<p/>
* 'templateCssPath' path to css file used to customize Dojo's widget<p/>
* 'dataFieldName' name of the field to be used as the list in the returned JSON string<p/>
* 'notifyTopics' comma separated list of topics names, that will be published. Three parameters are passed:<p/>
* <ul>
* <li>data: selected value when type='valuechanged'</li>
* <li>type: 'before' before the request is made, 'valuechanged' when selection changes, 'load' when the request succeeds, or 'error' when it fails</li>
* <li>request: request javascript object, when type='load' or type='error'</li>
* <ul>
*
*<!-- END SNIPPET: javadoc -->
*<!-- START SNIPPET: example -->
*<p>Autocompleter that gets its list from an action:</p>
*&lt;s:autocompleter name="test" href="%{jsonList}" autoComplete="false"/&gt;
*<br/>
**<p>Autocompleter that uses a list:</p>
*&lt;s:autocompleter name="test" list="{'apple','banana','grape','pear'}" autoComplete="false"/&gt;
*<br/>
*<!-- END SNIPPET: example -->
*/
@StrutsTag(name="autocompleter", tldTagClass="org.apache.struts2.views.jsp.ui.AutocompleterTag", description="Renders a combobox with autocomplete and AJAX capabilities")
public class Autocompleter extends ComboBox {
@@ -107,6 +108,8 @@ public class Autocompleter extends ComboBox {
protected String templateCssPath;
protected String iconPath;
protected String keyName;
protected String dataFieldName;
protected String resultsLimit;
public Autocompleter(ValueStack stack, HttpServletRequest request,
HttpServletResponse response) {
@@ -169,6 +172,8 @@ public class Autocompleter extends ComboBox {
addParameter("templateCssPath", findString(templateCssPath));
if(iconPath != null)
addParameter("iconPath", findString(iconPath));
if(dataFieldName != null)
addParameter("dataFieldName", findString(dataFieldName));
if(keyName != null)
addParameter("keyName", findString(keyName));
else {
@@ -178,6 +183,8 @@ public class Autocompleter extends ComboBox {
String keyNameExpr = "%{" + keyName + "}";
addParameter("key", findString(keyNameExpr));
if(resultsLimit != null)
addParameter("searchLimit", findString(resultsLimit));
}
protected Object findListValue() {
@@ -285,4 +292,14 @@ public class Autocompleter extends ComboBox {
public void setKeyName(String keyName) {
this.keyName = keyName;
}
@StrutsTagAttribute(description="Name of the field in the returned JSON object that contains the data array", defaultValue="Value specified in 'name'")
public void setDataFieldName(String dataFieldName) {
this.dataFieldName = dataFieldName;
}
@StrutsTagAttribute(description="Limit how many results are shown as autocompletion options", defaultValue="30")
public void setResultsLimit(String resultsLimit) {
this.resultsLimit = resultsLimit;
}
}
@@ -23,8 +23,8 @@ package org.apache.struts2.components;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.Writer;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Stack;
@@ -65,12 +65,12 @@ public class Component {
*/
public Component(ValueStack stack) {
this.stack = stack;
this.parameters = new HashMap();
this.parameters = new LinkedHashMap();
getComponentStack().push(this);
}
/**
* Get's the name of this component.
* Gets the name of this component.
* @return the name of this component.
*/
private String getComponentName() {
@@ -87,7 +87,7 @@ public class Component {
}
/**
* Get's the OGNL value stack assoicated with this component.
* Gets the OGNL value stack assoicated with this component.
* @return the OGNL value stack assoicated with this component.
*/
public ValueStack getStack() {
@@ -95,7 +95,7 @@ public class Component {
}
/**
* Get's the component stack of this component.
* Gets the component stack of this component.
* @return the component stack of this component, never <tt>null</tt>.
*/
public Stack getComponentStack() {
@@ -215,7 +215,7 @@ public class Component {
}
/**
* Constructs?a <code>RuntimeException</code> based on the given information.
* Constructs a <code>RuntimeException</code> based on the given information.
* <p/>
* A message is constructed and logged at ERROR level before being returned
* as a <code>RuntimeException</code>.
@@ -323,7 +323,7 @@ public class Component {
}
}
/**
/**
* Renders an action URL by consulting the {@link org.apache.struts2.dispatcher.mapper.ActionMapper}.
* @param action the action
* @param namespace the namespace
@@ -336,14 +336,38 @@ public class Component {
* @param encodeResult should the url be encoded
* @return the action url.
*/
@Deprecated
protected String determineActionURL(String action, String namespace, String method,
HttpServletRequest req, HttpServletResponse res, Map parameters, String scheme,
boolean includeContext, boolean encodeResult) {
return determineActionURL(action, namespace, method, req, res, parameters, scheme, includeContext, encodeResult, false, true);
}
/**
* Renders an action URL by consulting the {@link org.apache.struts2.dispatcher.mapper.ActionMapper}.
* @param action the action
* @param namespace the namespace
* @param method the method
* @param req HTTP request
* @param res HTTP response
* @param parameters parameters
* @param scheme http or https
* @param includeContext should the context path be included or not
* @param encodeResult should the url be encoded
* @param forceAddSchemeHostAndPort should the scheme host and port be added to the url no matter what
* @param escapeAmp should the ampersands used separate parameters be escaped or not
* @return the action url.
*/
protected String determineActionURL(String action, String namespace, String method,
HttpServletRequest req, HttpServletResponse res, Map parameters, String scheme,
boolean includeContext, boolean encodeResult, boolean forceAddSchemeHostAndPort,
boolean escapeAmp) {
String finalAction = findString(action);
String finalMethod = method != null ? findString(method) : method;
String finalNamespace = determineNamespace(namespace, getStack(), req);
ActionMapping mapping = new ActionMapping(finalAction, finalNamespace, method, parameters);
ActionMapping mapping = new ActionMapping(finalAction, finalNamespace, finalMethod, parameters);
String uri = actionMapper.getUriFromActionMapping(mapping);
return UrlHelper.buildUrl(uri, req, res, parameters, scheme, includeContext, encodeResult);
return UrlHelper.buildUrl(uri, req, res, parameters, scheme, includeContext, encodeResult, forceAddSchemeHostAndPort, escapeAmp);
}
/**
@@ -407,7 +431,7 @@ public class Component {
}
/**
* Get's the parameters.
* Gets the parameters.
* @return the parameters. Is never <tt>null</tt>.
*/
public Map getParameters() {
@@ -415,7 +439,7 @@ public class Component {
}
/**
* Add's all the given parameters to this componenets own parameters.
* Adds all the given parameters to this component's own parameters.
* @param params the parameters to add.
*/
public void addAllParameters(Map params) {
@@ -423,9 +447,9 @@ public class Component {
}
/**
* Add's the given key and value to this components own parameter.
* Adds the given key and value to this component's own parameter.
* <p/>
* If the provided key is <tt>null</tt> nothing happends.
* If the provided key is <tt>null</tt> nothing happens.
* If the provided value is <tt>null</tt> any existing parameter with
* the given key name is removed.
* @param key the key of the new parameter to add.
@@ -444,7 +468,7 @@ public class Component {
}
/**
* Get's the id for referencing element.
* Gets the id for referencing element.
* @return the id for referencing element.
*/
public String getId() {
@@ -465,5 +489,4 @@ public class Component {
public boolean usesBody() {
return false;
}
}
@@ -21,7 +21,9 @@
package org.apache.struts2.components;
import java.text.ParseException;
import java.text.MessageFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import javax.servlet.http.HttpServletRequest;
@@ -43,51 +45,53 @@ import com.opensymphony.xwork2.util.ValueStack;
* A stand-alone DateTimePicker widget that makes it easy to select a date/time, or increment by week, month,
* and/or year.
* </p>
* Dates attributes passed in the `RFC 3339` format:
*
* Renders date/time picker element.</p>
* Format supported by this component are:-
* <p>
* It is possible to customize the user-visible formatting with either the
* 'formatLength' (long, short, medium or full) or 'displayFormat' attributes. By defaulty current
* locale will be used.</p>
* </p>
*
* Syntax supported by 'displayFormat' is (http://www.unicode.org/reports/tr35/tr35-4.html#Date_Format_Patterns):-
* <table border="1">
* <tr>
* <td>Format</td>
* <td>Description</td>
* </tr>
* <tr>
* <td>#dd</td>
* <td>Display day in two digits format</td>
* <td>d</td>
* <td>Day of the month</td>
* </tr>
* <tr>
* <td>#d</td>
* <td>Try to display day in one digit format, if cannot use 2 digit format</td>
* <td>D</td>
* <td>Day of year</td>
* </tr>
* <tr>
* <td>#MM</td>
* <td>Display month in two digits format</td>
* <td>M</td>
* <td>Month - Use one or two for the numerical month, three for the abbreviation, or four for the full name, or 5 for the narrow name.</td>
* </tr>
* <tr>
* <td>#M</td>
* <td>Try to display month in one digits format, if cannot use 2 digit format</td>
* <td>h</td>
* <td>Hour [1-12].</td>
* </tr>
* <tr>
* <td>#yyyy</td>
* <td>Display year in four digits format</td>
* <td>H</td>
* <td>Hour [0-23].</td>
* </tr>
* <tr>
* <td>#yy</td>
* <td>Display the last two digits of the yaer</td>
* <td>m</td>
* <td>Minute. Use one or two for zero padding.</td>
* </tr>
* <tr>
* <td>#y</td>
* <td>Display the last digits of the year</td>
* <td>s</td>
* <td>Second. Use one or two for zero padding.</td>
* </tr>
* </table>
*
* <p>
* It is possible to customize the user-visible formatting with either the
* formatLength or displayFormat attributes. The value sent to the server is
* The value sent to the server is
* typically a locale-independent value in a hidden field as defined by the name
* attribute. RFC3339 representation is used by default, but other options are
* available with saveFormat
* attribute. RFC3339 representation is the format used.
* </p>
*
* <p/>
@@ -102,7 +106,7 @@ import com.opensymphony.xwork2.util.ValueStack;
* Example 1:
* &lt;s:datetimepicker name="order.date" label="Order Date" /&gt;
* Example 2:
* &lt;s:datetimepicker name="delivery.date" label="Delivery Date" format="#yyyy-#MM-#dd" /&gt;
* &lt;s:datetimepicker name="delivery.date" label="Delivery Date" format="yyyy-MM-dd" /&gt;
*
* <!-- END SNIPPET: expl1 -->
* </pre>
@@ -127,8 +131,10 @@ import com.opensymphony.xwork2.util.ValueStack;
public class DateTimePicker extends UIBean {
final public static String TEMPLATE = "datetimepicker";
final private static SimpleDateFormat RFC3339_FORMAT = new SimpleDateFormat(
"yyyy-MM-dd'T'HH:mm:ss");
// Backported changes from s2 trunk (r657936)
// final private static SimpleDateFormat RFC3339_FORMAT = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
final private static String RFC3339_FORMAT = "yyyy-MM-dd'T'HH:mm:ss";
final private static String RFC3339_PATTERN = "{0,date," + RFC3339_FORMAT + "}";
final protected static Log LOG = LogFactory.getLog(DateTimePicker.class);
protected String iconPath;
@@ -292,20 +298,22 @@ public class DateTimePicker extends UIBean {
return null;
if(obj instanceof Date) {
return RFC3339_FORMAT.format((Date) obj);
return MessageFormat.format(RFC3339_PATTERN, (Date) obj);
} else if(obj instanceof Calendar) {
return MessageFormat.format(RFC3339_PATTERN, ((Calendar) obj).getTime());
} else {
// try to parse a date
String dateStr = obj.toString();
if(dateStr.equalsIgnoreCase("today"))
return RFC3339_FORMAT.format(new Date());
return MessageFormat.format(RFC3339_PATTERN, new Date());
try {
Date date = null;
if(this.displayFormat != null) {
SimpleDateFormat format = new SimpleDateFormat(
this.displayFormat);
(String) getParameters().get("displayFormat"));
date = format.parse(dateStr);
return RFC3339_FORMAT.format(date);
return MessageFormat.format(RFC3339_PATTERN, date);
} else {
// last resource to assume already in correct/default format
return dateStr;
@@ -69,15 +69,16 @@ import com.opensymphony.xwork2.util.ValueStack;
* 'formFilter' is the name of a function which will be used to filter the fields that will be
* seralized. This function takes as a parameter the element and returns true if the element
* should be included.<p/>
* 'updateFreq' sets(in milliseconds) the update interval.
* 'autoStart' if set to true(true by default) starts the timer automatically
* 'startTimerListenTopics' is a comma-separated list of topics used to start the timer
* 'stopTimerListenTopics' is a comma-separated list of topics used to stop the timer
* 'listenTopics' comma separated list of topics names, that will trigger a request
* 'indicator' element to be shown while the request executing
* 'updateFreq' sets(in milliseconds) the update interval.<p/>
* 'autoStart' if set to true(true by default) starts the timer automatically<p/>
* 'startTimerListenTopics' is a comma-separated list of topics used to start the timer<p/>
* 'stopTimerListenTopics' is a comma-separated list of topics used to stop the timer<p/>
* 'listenTopics' comma separated list of topics names, that will trigger a request<p/>
* 'indicator' element to be shown while the request executing<p/>
* 'showErrorTransportText': whether errors should be displayed (on 'targets')</p>
* 'showLoadingText' show loading text on targets</p>
* 'notifyTopics' comma separated list of topics names, that will be published. Three parameters are passed:
* 'separateScript' Run scripts in a separate scope, unique for each Div<p/>
* 'notifyTopics' comma separated list of topics names, that will be published. Three parameters are passed:<p/>
* <ul>
* <li>data: html or json object when type='load' or type='error'</li>
* <li>type: 'before' before the request is made, 'load' when the request succeeds, or 'error' when it fails</li>
@@ -117,6 +118,7 @@ public class Div extends AbstractRemoteCallUIBean {
protected String startTimerListenTopics;
protected String stopTimerListenTopics;
protected String refreshOnShow;
protected String separateScripts;
public Div(ValueStack stack, HttpServletRequest request, HttpServletResponse response) {
super(stack, request, response);
@@ -145,6 +147,8 @@ public class Div extends AbstractRemoteCallUIBean {
addParameter("startTimerListenTopics", findString(startTimerListenTopics));
if (stopTimerListenTopics != null)
addParameter("stopTimerListenTopics", findString(stopTimerListenTopics));
if (separateScripts != null)
addParameter("separateScripts", findValue(separateScripts, Boolean.class));
}
@StrutsTagAttribute(description="Start timer automatically", type="Boolean", defaultValue="true")
@@ -181,4 +185,9 @@ public class Div extends AbstractRemoteCallUIBean {
public void setAfterLoading(String afterLoading) {
this.afterLoading = afterLoading;
}
@StrutsTagAttribute(description="Run scripts in a separate scope, unique for each Div", defaultValue="true")
public void setSeparateScripts(String separateScripts) {
this.separateScripts = separateScripts;
}
}
@@ -192,6 +192,8 @@ public abstract class DoubleListUIBean extends ListUIBean {
}
} else if (form != null) {
addParameter("doubleId", form.getParameters().get("id") + "_" +escape(this.doubleName));
} else {
addParameter("doubleId", escape(doubleName !=null ? findString(doubleName) : null));
}
if (doubleOnclick != null) {
@@ -51,7 +51,7 @@ import com.opensymphony.xwork2.util.ValueStack;
* &lt;s:param&gt;field1&lt;/s:param&gt;
* &lt;s:param&gt;field2&lt;/s:param&gt;
* &lt;/s:fielderror&gt;
* &lt;s:form .... &gt;>
* &lt;s:form .... &gt;
* ....
* &lt;/s:form&gt;
*
@@ -61,7 +61,7 @@ import com.opensymphony.xwork2.util.ValueStack;
* &lt;s:param value="%{'field1'}" /&gt;
* &lt;s:param value="%{'field2'}" /&gt;
* &lt;/s:fielderror&gt;
* &lt;s:form .... &gt;>
* &lt;s:form .... &gt;
* ....
* &lt;/s:form&gt;
*
@@ -20,24 +20,6 @@
*/
package org.apache.struts2.components;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts2.views.annotations.StrutsTag;
import org.apache.struts2.views.annotations.StrutsTagAttribute;
import org.apache.struts2.StrutsConstants;
import org.apache.struts2.dispatcher.Dispatcher;
import org.apache.struts2.dispatcher.mapper.ActionMapping;
import org.apache.struts2.portlet.context.PortletActionContext;
import org.apache.struts2.portlet.util.PortletUrlHelper;
import org.apache.struts2.views.util.UrlHelper;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.ObjectFactory;
@@ -47,12 +29,29 @@ import com.opensymphony.xwork2.config.entities.ActionConfig;
import com.opensymphony.xwork2.config.entities.InterceptorMapping;
import com.opensymphony.xwork2.inject.Inject;
import com.opensymphony.xwork2.interceptor.MethodFilterInterceptorUtil;
import com.opensymphony.xwork2.util.ValueStack;
import com.opensymphony.xwork2.util.TextUtils;
import com.opensymphony.xwork2.util.ValueStack;
import com.opensymphony.xwork2.validator.ActionValidatorManagerFactory;
import com.opensymphony.xwork2.validator.FieldValidator;
import com.opensymphony.xwork2.validator.ValidationInterceptor;
import com.opensymphony.xwork2.validator.Validator;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.struts2.StrutsConstants;
import org.apache.struts2.dispatcher.Dispatcher;
import org.apache.struts2.dispatcher.mapper.ActionMapping;
import org.apache.struts2.portlet.context.PortletActionContext;
import org.apache.struts2.portlet.util.PortletUrlHelper;
import org.apache.struts2.views.annotations.StrutsTag;
import org.apache.struts2.views.annotations.StrutsTagAttribute;
import org.apache.struts2.views.util.UrlHelper;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Set;
/**
* <!-- START SNIPPET: javadoc -->
@@ -95,6 +94,11 @@ import com.opensymphony.xwork2.validator.Validator;
*/
@StrutsTag(name="form", tldTagClass="org.apache.struts2.views.jsp.ui.FormTag", description="Renders an input form")
public class Form extends ClosingUIBean {
/**
* Provide a logging instance.
*/
private static final Log LOG = LogFactory.getLog(Form.class);
public static final String OPEN_TEMPLATE = "form";
public static final String TEMPLATE = "form-close";
@@ -204,7 +208,7 @@ public class Form extends ClosingUIBean {
}
/**
* Form component determine the its HTML element id as follows:-
* The Form component determines its HTML element id as follows:-
* <ol>
* <li>if an 'id' attribute is specified.</li>
* <li>if an 'action' attribute is specified, it will be used as the id.</li>
@@ -222,6 +226,9 @@ public class Form extends ClosingUIBean {
if (id != null) {
addParameter("id", escape(id));
}
// if no id given, it will be tried to generate it from the action attribute in the
// corresponding evaluateExtraParams method
if (Dispatcher.getInstance().isPortletSupportActive() && PortletActionContext.isPortletRequest()) {
evaluateExtraParamsPortletRequest(namespace, action);
} else {
@@ -287,14 +294,20 @@ public class Form extends ClosingUIBean {
}
// if the id isn't specified, use the action name
if (id == null) {
addParameter("id", action);
if (id == null && action!=null) {
addParameter("id", escape(action));
}
} else if (action != null) {
// Since we can't find an action alias in the configuration, we just assume
// the action attribute supplied is the path to be used as the uri this
// the action attribute supplied is the path to be used as the URI this
// form is submitting to.
// Warn user that the specified namespace/action combo
// was not found in the configuration.
if (namespace != null) {
LOG.warn("No configuration found for the specified action: '" + action + "' in namespace: '" + namespace + "'. Form action defaulting to 'action' attribute's literal value.");
}
String result = UrlHelper.buildUrl(action, request, response, null);
addParameter("action", result);
@@ -329,7 +342,7 @@ public class Form extends ClosingUIBean {
// Only evaluate if Client-Side js is to be enable when validate=true
Boolean validate = (Boolean) getParameters().get("validate");
if (validate != null && validate.booleanValue()) {
if (validate != null && validate) {
addParameter("performValidation", Boolean.FALSE);
@@ -337,9 +350,8 @@ public class Form extends ClosingUIBean {
ActionConfig actionConfig = runtimeConfiguration.getActionConfig(namespace, actionName);
if (actionConfig != null) {
List interceptors = actionConfig.getInterceptors();
for (Iterator i = interceptors.iterator(); i.hasNext();) {
InterceptorMapping interceptorMapping = (InterceptorMapping) i.next();
List<InterceptorMapping> interceptors = actionConfig.getInterceptors();
for (InterceptorMapping interceptorMapping : interceptors) {
if (ValidationInterceptor.class.isInstance(interceptorMapping.getInterceptor())) {
ValidationInterceptor validationInterceptor = (ValidationInterceptor) interceptorMapping.getInterceptor();
@@ -363,11 +375,6 @@ public class Form extends ClosingUIBean {
*/
private void evaluateExtraParamsPortletRequest(String namespace, String action) {
if (this.action != null) {
// if it isn't specified, we'll make somethig up
action = findString(this.action);
}
String type = "action";
if (TextUtils.stringSet(method)) {
if ("GET".equalsIgnoreCase(method.trim())) {
@@ -375,7 +382,7 @@ public class Form extends ClosingUIBean {
}
}
if (action != null) {
String result = PortletUrlHelper.buildUrl(action, namespace,
String result = PortletUrlHelper.buildUrl(action, namespace, null,
getParameters(), type, portletMode, windowState);
addParameter("action", result);
@@ -409,10 +416,9 @@ public class Form extends ClosingUIBean {
return Collections.EMPTY_LIST;
}
List all = ActionValidatorManagerFactory.getInstance().getValidators(actionClass, (String) getParameters().get("actionName"));
List validators = new ArrayList();
for (Iterator iterator = all.iterator(); iterator.hasNext();) {
Validator validator = (Validator) iterator.next();
List<Validator> all = ActionValidatorManagerFactory.getInstance().getValidators(actionClass, (String) getParameters().get("actionName"));
List<Validator> validators = new ArrayList<Validator>();
for (Validator validator : all) {
if (validator instanceof FieldValidator) {
FieldValidator fieldValidator = (FieldValidator) validator;
if (fieldValidator.getFieldName().equals(name)) {
@@ -440,7 +446,7 @@ public class Form extends ClosingUIBean {
this.onsubmit = onsubmit;
}
@StrutsTagAttribute(description="Set action nane to submit to, without .action suffix", defaultValue="current action")
@StrutsTagAttribute(description="Set action name to submit to, without .action suffix", defaultValue="current action")
public void setAction(String action) {
this.action = action;
}
@@ -471,7 +477,7 @@ public class Form extends ClosingUIBean {
this.validate = validate;
}
@StrutsTagAttribute(description="he portlet mode to display after the form submit")
@StrutsTagAttribute(description="The portlet mode to display after the form submit")
public void setPortletMode(String portletMode) {
this.portletMode = portletMode;
}
@@ -20,20 +20,20 @@
*/
package org.apache.struts2.components;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.LocaleProvider;
import com.opensymphony.xwork2.TextProviderFactory;
import com.opensymphony.xwork2.util.LocalizedTextUtil;
import com.opensymphony.xwork2.util.ValueStack;
import org.apache.struts2.StrutsException;
import org.apache.struts2.dispatcher.Dispatcher;
import org.apache.struts2.views.annotations.StrutsTag;
import org.apache.struts2.views.annotations.StrutsTagAttribute;
import java.io.Writer;
import java.util.Locale;
import java.util.ResourceBundle;
import org.apache.struts2.views.annotations.StrutsTag;
import org.apache.struts2.views.annotations.StrutsTagAttribute;
import org.apache.struts2.StrutsException;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.LocaleProvider;
import com.opensymphony.xwork2.TextProviderSupport;
import com.opensymphony.xwork2.util.LocalizedTextUtil;
import com.opensymphony.xwork2.util.ValueStack;
/**
* <!-- START SNIPPET: javadoc -->
*
@@ -102,10 +102,12 @@ public class I18n extends Component {
if (bundle != null) {
final Locale locale = (Locale) getStack().getContext().get(ActionContext.LOCALE);
getStack().push(new TextProviderSupport(bundle, new LocaleProvider() {
public Locale getLocale() {
return locale;
}
TextProviderFactory tpf = new TextProviderFactory();
Dispatcher.getInstance().getContainer().inject(tpf);
getStack().push(tpf.createInstance(bundle, new LocaleProvider() {
public Locale getLocale() {
return locale;
}
}));
pushed = true;
}
@@ -123,6 +123,14 @@ public class OptionTransferSelect extends DoubleListUIBean {
protected String rightUpLabel;
protected String rightDownLabel;
protected String addToLeftOnclick;
protected String addToRightOnclick;
protected String addAllToLeftOnclick;
protected String addAllToRightOnclick;
protected String selectAllOnclick;
protected String upDownOnLeftOnclick;
protected String upDownOnRightOnclick;
public OptionTransferSelect(ValueStack stack, HttpServletRequest request, HttpServletResponse response) {
super(stack, request, response);
@@ -252,6 +260,34 @@ public class OptionTransferSelect extends DoubleListUIBean {
rightDownLabel != null ? findValue(rightDownLabel, String.class) : "v");
// selectAllOnclick
addParameter("selectAllOnclick",
selectAllOnclick != null ? findValue(selectAllOnclick, String.class) : "");
// addToLeftOnclick
addParameter("addToLeftOnclick",
addToLeftOnclick != null ? findValue(addToLeftOnclick, String.class) : "");
// addToRightOnclick
addParameter("addToRightOnclick",
addToRightOnclick != null ? findValue(addToRightOnclick, String.class) : "");
// addAllToLeftOnclick
addParameter("addAllToLeftOnclick",
addAllToLeftOnclick != null ? findValue(addAllToLeftOnclick, String.class) : "");
// addAllToRightOnclick
addParameter("addAllToRightOnclick",
addAllToRightOnclick != null ? findValue(addAllToRightOnclick, String.class) : "");
// upDownOnLeftOnclick
addParameter("upDownOnLeftOnclick",
upDownOnLeftOnclick != null ? findValue(upDownOnLeftOnclick, String.class) : "");
// upDownOnRightOnclick
addParameter("upDownOnRightOnclick",
upDownOnRightOnclick != null ? findValue(upDownOnRightOnclick, String.class) : "");
// inform the form component our select tag infos, so they know how to select
// its elements upon onsubmit
@@ -476,5 +512,66 @@ public class OptionTransferSelect extends DoubleListUIBean {
return rightDownLabel;
}
public String getAddAllToLeftOnclick() {
return addAllToLeftOnclick;
}
@StrutsTagAttribute(description="Javascript to run after Add All To Left button pressed")
public void setAddAllToLeftOnclick(String addAllToLeftOnclick) {
this.addAllToLeftOnclick = addAllToLeftOnclick;
}
public String getAddAllToRightOnclick() {
return addAllToRightOnclick;
}
@StrutsTagAttribute(description="Javascript to run after Add All To Right button pressed")
public void setAddAllToRightOnclick(String addAllToRightOnclick) {
this.addAllToRightOnclick = addAllToRightOnclick;
}
public String getAddToLeftOnclick() {
return addToLeftOnclick;
}
@StrutsTagAttribute(description="Javascript to run after Add To Left button pressed")
public void setAddToLeftOnclick(String addToLeftOnclick) {
this.addToLeftOnclick = addToLeftOnclick;
}
public String getAddToRightOnclick() {
return addToRightOnclick;
}
@StrutsTagAttribute(description="Javascript to run after Add To Right button pressed")
public void setAddToRightOnclick(String addToRightOnclick) {
this.addToRightOnclick = addToRightOnclick;
}
@StrutsTagAttribute(description="Javascript to run after up / down on the left side buttons pressed")
public void setUpDownOnLeftOnclick(String upDownOnLeftOnclick) {
this.upDownOnLeftOnclick = upDownOnLeftOnclick;
}
public String getUpDownOnLeftOnclick() {
return this.upDownOnLeftOnclick;
}
@StrutsTagAttribute(description="Javascript to run after up / down on the right side buttons pressed")
public void setUpDownOnRightOnclick(String upDownOnRightOnclick) {
this.upDownOnRightOnclick = upDownOnRightOnclick;
}
public String getUpDownOnRightOnclick() {
return this.upDownOnRightOnclick;
}
@StrutsTagAttribute(description="Javascript to run after Select All button pressed")
public void setSelectAllOnclick(String selectAllOnclick) {
this.selectAllOnclick = selectAllOnclick;
}
public String getSelectAllOnclick() {
return this.selectAllOnclick;
}
}
@@ -32,7 +32,9 @@ import com.opensymphony.xwork2.util.ValueStack;
* <p>The set tag assigns a value to a variable in a specified scope. It is useful when you wish to assign a variable to a
* complex expression and then simply reference that variable each time rather than the complex expression. This is
* useful in both cases: when the complex expression takes time (performance improvement) or is hard to read (code
* readability improvement).</P>
* readability improvement).</p>
* <p>If the tag is used with body content, the evaluation of the value parameter is omitted. Instead, the String to
* which the body eveluates is set as value for the scoped variable.</p>
*
* The scopes available are as follows :-
* <ul>
@@ -75,7 +77,7 @@ import com.opensymphony.xwork2.util.ValueStack;
* </pre>
*
*/
@StrutsTag(name="set", tldBodyContent="empty", tldTagClass="org.apache.struts2.views.jsp.SetTag", description="Assigns a value to a variable in a specified scope")
@StrutsTag(name="set", tldBodyContent="JSP", tldTagClass="org.apache.struts2.views.jsp.SetTag", description="Assigns a value to a variable in a specified scope")
public class Set extends Component {
protected String name;
protected String scope;
@@ -88,11 +90,18 @@ public class Set extends Component {
public boolean end(Writer writer, String body) {
ValueStack stack = getStack();
Object o;
if (value == null) {
value = "top";
if (body!=null && !body.equals("")) {
o = body;
} else {
o = findValue("top");
}
} else {
o = findValue(value);
}
Object o = findValue(value);
body="";
String name;
if (altSyntax()) {
@@ -48,19 +48,19 @@ import com.opensymphony.xwork2.util.ValueStack;
* <p/> <b>Examples</b>
* <pre>
* <!-- START SNIPPET: example -->
* &lt;s:submit value="%{'Submit'}" /&gt;
* &lt;s:submit value="%{'Submit the form'}" /&gt;
* <!-- END SNIPPET: example -->
* </pre>
* <pre>
* <!-- START SNIPPET: example2 -->
* Render an image submit:
* &lt;s:submit type="image" value="%{'Submit'}" label="Submit the form" src="submit.gif"/&gt;
* &lt;s:submit type="image" value="%{'Submit the form'}" src="submit.gif"/&gt;
* <!-- END SNIPPET: example2 -->
* </pre>
* <pre>
* <!-- START SNIPPET: example3 -->
* Render an button submit:
* &lt;s:submit type="button" value="%{'Submit'}" label="Submit the form"/&gt;
* &lt;s:submit type="button" value="%{'Submit the form'}"/&gt;
* <!-- END SNIPPET: example3 -->
* </pre>
*
@@ -32,6 +32,11 @@ import com.opensymphony.xwork2.util.ValueStack;
* <!-- START SNIPPET: javadoc -->
* The tabbedpanel widget is primarily an AJAX component, where each tab can either be local content or remote
* content (refreshed each time the user selects that tab).</p>
* If the useSelectedTabCookie attribute is set to true, the id of the selected tab is saved in a cookie on activation.
* When coming back to this view, the cookie is read and the tab will be activated again, unless an actual value for the
* selectedTab attribute is specified.</p>
* If you want to use the cookie feature, please be sure that you provide a unique id for your tabbedpanel component,
* since this will also be the identifying name component of the stored cookie.</p>
* <!-- END SNIPPET: javadoc -->
*
* <p/> <b>Examples</b>
@@ -67,6 +72,7 @@ public class TabbedPanel extends ClosingUIBean {
protected String closeButton;
protected String doLayout ;
protected String templateCssPath;
protected String useSelectedTabCookie;
public TabbedPanel(ValueStack stack, HttpServletRequest request, HttpServletResponse response) {
super(stack, request, response);
@@ -92,6 +98,9 @@ public class TabbedPanel extends ClosingUIBean {
}
if(templateCssPath != null)
addParameter("templateCssPath", findString(templateCssPath));
if(useSelectedTabCookie != null) {
addParameter("useSelectedTabCookie", findString(useSelectedTabCookie));
}
}
public String getDefaultOpenTemplate() {
@@ -132,4 +141,11 @@ public class TabbedPanel extends ClosingUIBean {
public void setTemplateCssPath(String templateCssPath) {
this.templateCssPath = templateCssPath;
}
@StrutsTagAttribute(required = false, defaultValue = "false", description = "If set to true, the id of the last selected " +
"tab will be stored in cookie. If the view is rendered, it will be tried to read this cookie and activate " +
"the corresponding tab on success, unless overridden by the selectedTab attribute. The cookie name is \"Struts2TabbedPanel_selectedTab_\"+id.")
public void setUseSelectedTabCookie( String useSelectedTabCookie ) {
this.useSelectedTabCookie = useSelectedTabCookie;
}
}
@@ -790,6 +790,20 @@ public abstract class UIBean extends Component {
}
}
/**
* Ensures an unescaped attribute value cannot be vulnerable to XSS attacks
*
* @param val The value to check
* @return The escaped value
*/
protected String ensureAttributeSafelyNotEscaped(String val) {
if (val != null) {
return val.replaceAll("\"", "&#34;");
} else {
return "";
}
}
protected void evaluateExtraParams() {
}
@@ -852,7 +866,8 @@ public abstract class UIBean extends Component {
/**
* Create HTML id element for the component and populate this component parmaeter
* map.
* map. Additionally, a parameter named escapedId is populated which contains the found id value filtered by
* {@link #escape(String)}, needed eg. for naming Javascript identifiers based on the id value.
*
* The order is as follows :-
* <ol>
@@ -864,19 +879,22 @@ public abstract class UIBean extends Component {
* @param form
*/
protected void populateComponentHtmlId(Form form) {
String tryId;
if (id != null) {
// this check is needed for backwards compatibility with 2.1.x
if (altSyntax()) {
addParameter("id", findString(id));
tryId = findString(id);
} else {
addParameter("id", id);
tryId = id;
}
} else if (form != null) {
addParameter("id", form.getParameters().get("id") + "_"
+ escape(name != null ? findString(name) : null));
tryId = form.getParameters().get("id") + "_"
+ escape(name != null ? findString(name) : null);
} else {
addParameter("id", escape(name != null ? findString(name) : null));
tryId = escape(name != null ? findString(name) : null);
}
addParameter("id", tryId);
addParameter("escapedId", escape(tryId));
}
@StrutsTagAttribute(description="The template directory.")
@@ -903,7 +921,7 @@ public abstract class UIBean extends Component {
this.cssClass = cssClass;
}
@StrutsTagAttribute(description="The css style definitions for element ro use")
@StrutsTagAttribute(description="The css style definitions for element to use")
public void setCssStyle(String cssStyle) {
this.cssStyle = cssStyle;
}
@@ -53,6 +53,12 @@ import com.opensymphony.xwork2.util.ValueStack;
* additional request parameters.</p>
*
* <b>NOTE:</b>
* <p>By default request parameters will be separated using escaped ampersands (i.e., &amp;amp;).
* This is necessary for XHTML compliance, however, when using the URL generated by this tag
* with the &lt;s:property&gt; tag, the <b>escapeAmp</b> attribute should be used to disable
* ampersand escaping.</p>
*
* <b>NOTE:</b>
* <p>When includeParams is 'all' or 'get', the parameter defined in param tag will take
* precedence and will not be overriden if they exists in the parameter submitted. For
* example, in Example 3 below, if there is a id parameter in the url where the page this
@@ -68,16 +74,21 @@ import com.opensymphony.xwork2.util.ValueStack;
* <ul>
* <li>action (String) - (value or action choose either one, if both exist value takes precedence) action's name (alias) <li>
* <li>value (String) - (value or action choose either one, if both exist value takes precedence) the url itself</li>
* <li>scheme (String) - http scheme (http, https) default to the scheme this request is in</li>
* <li>scheme (String) - http scheme (http, https) defaults to the scheme this request is in</li>
* <li>namespace - action's namespace</li>
* <li>method (String) - action's method, default to execute() </li>
* <li>encode (Boolean) - url encode the generated url. Default is true</li>
* <li>includeParams (String) - The includeParams attribute may have the value 'none', 'get' or 'all'. Default is 'get'.
* <li>method (String) - action's method name, defaults to 'execute'</li>
* <li>encode (Boolean) - url encode the generated url. Defaults to 'true'.</li>
* <li>includeParams (String) - The includeParams attribute may have the value 'none', 'get' or 'all'. Defaults to 'get'.
* none - include no parameters in the URL
* get - include only GET parameters in the URL (default)
* all - include both GET and POST parameters in the URL
* </li>
* <li>includeContext (Boolean) - determine wheather to include the web app context path. Default is true.</li>
* <li>includeContext (Boolean) - Specifies whether to include the web app context path. Defaults to 'true'.</li>
* <li>escapeAmp (Boolean) - Specifies whether to escape ampersand (&amp;) to (&amp;amp;) or not. Defaults to 'true'.</li>
* <li>portletMode (String) - The resulting portlet mode.</li>
* <li>windowState (String) - The resulting portlet window state.</li>
* <li>portletUrlType (String) - Specifies if this should be a portlet render or action URL.</li>
* <li>forceAddSchemeHostAndPort (Boolean) - Specifies whether to force the addition of scheme, host and port or not.</li>
* </ul>
*
* <!-- END SNIPPET: params -->
@@ -98,7 +109,7 @@ import com.opensymphony.xwork2.util.ValueStack;
*
* &lt;-- Example 3--&gt;
* &lt;s:url includeParams="get" &gt;
* &lt:param name="id" value="%{'22'}" /&gt;
* &lt;s:param name="id" value="%{'22'}" /&gt;
* &lt;/s:url&gt;
*
* <!-- END SNIPPET: example -->
@@ -135,10 +146,12 @@ public class URL extends Component {
protected String method;
protected boolean encode = true;
protected boolean includeContext = true;
protected boolean escapeAmp = true;
protected String portletMode;
protected String windowState;
protected String portletUrlType;
protected String anchor;
protected boolean forceAddSchemeHostAndPort;
protected String urlIncludeParams;
protected ExtraParameterProvider extraParameterProvider;
@@ -236,14 +249,14 @@ public class URL extends Component {
String result;
if (value == null && action != null) {
if(Dispatcher.getInstance().isPortletSupportActive() && PortletActionContext.isPortletRequest()) {
result = PortletUrlHelper.buildUrl(action, namespace, parameters, portletUrlType, portletMode, windowState);
if (Dispatcher.getInstance().isPortletSupportActive() && PortletActionContext.isPortletRequest()) {
result = PortletUrlHelper.buildUrl(action, namespace, method, parameters, portletUrlType, portletMode, windowState);
}
else {
result = determineActionURL(action, namespace, method, req, res, parameters, scheme, includeContext, encode);
result = determineActionURL(action, namespace, method, req, res, parameters, scheme, includeContext, encode, forceAddSchemeHostAndPort, escapeAmp);
}
} else {
if(Dispatcher.getInstance().isPortletSupportActive() && PortletActionContext.isPortletRequest()) {
if (Dispatcher.getInstance().isPortletSupportActive() && PortletActionContext.isPortletRequest()) {
result = PortletUrlHelper.buildResourceUrl(value, parameters);
}
else {
@@ -254,7 +267,7 @@ public class URL extends Component {
if (_value != null && _value.indexOf("?") > 0) {
_value = _value.substring(0, _value.indexOf("?"));
}
result = UrlHelper.buildUrl(_value, req, res, parameters, scheme, includeContext, encode);
result = UrlHelper.buildUrl(_value, req, res, parameters, scheme, includeContext, encode, forceAddSchemeHostAndPort, escapeAmp);
}
}
if ( anchor != null && anchor.length() > 0 ) {
@@ -293,7 +306,7 @@ public class URL extends Component {
this.value = value;
}
@StrutsTagAttribute(description="he action generate url for, if not using value")
@StrutsTagAttribute(description="The action to generate the URL for, if not using value")
public void setAction(String action) {
this.action = action;
}
@@ -313,7 +326,7 @@ public class URL extends Component {
this.encode = encode;
}
@StrutsTagAttribute(description="Whether actual context should be included in url", type="Boolean", defaultValue="true")
@StrutsTagAttribute(description="Whether actual context should be included in URL", type="Boolean", defaultValue="true")
public void setIncludeContext(boolean includeContext) {
this.includeContext = includeContext;
}
@@ -328,7 +341,7 @@ public class URL extends Component {
this.windowState = windowState;
}
@StrutsTagAttribute(description="Specifies if this should be a portlet render or action url")
@StrutsTagAttribute(description="Specifies if this should be a portlet render or action URL. Default is \"render\". To create an action URL, use \"action\".")
public void setPortletUrlType(String portletUrlType) {
this.portletUrlType = portletUrlType;
}
@@ -338,6 +351,16 @@ public class URL extends Component {
this.anchor = anchor;
}
@StrutsTagAttribute(description="Specifies whether to escape ampersand (&amp;) to (&amp;amp;) or not", type="Boolean", defaultValue="true")
public void setEscapeAmp(boolean escapeAmp) {
this.escapeAmp = escapeAmp;
}
@StrutsTagAttribute(description="Specifies whether to force the addition of scheme, host and port or not", type="Boolean", defaultValue="false")
public void setForceAddSchemeHostAndPort(boolean forceAddSchemeHostAndPort) {
this.forceAddSchemeHostAndPort = forceAddSchemeHostAndPort;
}
/**
* Merge request parameters into current parameters. If a parameter is
@@ -1 +1,23 @@
<!--
/*
* $Id: pom.xml 560558 2007-07-28 15:47:10Z apetrelli $
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
-->
<body>JSP UI tags for rendering table output in HTML.</body>
@@ -52,7 +52,7 @@ public abstract class BaseTemplateEngine implements TemplateEngine {
if (props == null) {
String propName = template.getDir() + "/" + template.getTheme() + "/"+getThemePropertiesFileName();
// WW-1292
// WW-1292
// let's try getting it from the filesystem
File propFile = new File(propName);
InputStream is = null;
@@ -77,6 +77,12 @@ public abstract class BaseTemplateEngine implements TemplateEngine {
props.load(is);
} catch (IOException e) {
LOG.error("Could not load " + propName, e);
} finally {
try {
is.close();
} catch(IOException io) {
LOG.warn("Unable to close input stream", io);
}
}
}
@@ -22,9 +22,7 @@ package org.apache.struts2.components.template;
import java.io.IOException;
import java.io.Writer;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.*;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
@@ -33,6 +31,7 @@ import javax.servlet.http.HttpServletResponse;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.struts2.ServletActionContext;
import org.apache.struts2.StrutsConstants;
import org.apache.struts2.views.freemarker.FreemarkerManager;
import com.opensymphony.xwork2.inject.Inject;
@@ -41,8 +40,7 @@ import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.util.ValueStack;
import freemarker.template.Configuration;
import freemarker.template.SimpleHash;
import freemarker.template.*;
/**
* Freemarker based template engine.
@@ -51,6 +49,10 @@ public class FreemarkerTemplateEngine extends BaseTemplateEngine {
static Class bodyContent = null;
private FreemarkerManager freemarkerManager;
private final HashMap<String, freemarker.template.Template> templates = new HashMap<String, freemarker.template.Template>();
private final HashSet<String> missingTemplates = new HashSet<String>();
private boolean freemarkerCaching = false;
static {
try {
bodyContent = ClassLoaderUtil.loadClass("javax.servlet.jsp.tagext.BodyContent",
@@ -82,22 +84,40 @@ public class FreemarkerTemplateEngine extends BaseTemplateEngine {
Configuration config = freemarkerManager.getConfiguration(servletContext);
// get the list of templates we can use
List templates = templateContext.getTemplate().getPossibleTemplates(this);
List<Template> templates = templateContext.getTemplate().getPossibleTemplates(this);
// find the right template
freemarker.template.Template template = null;
String templateName = null;
Exception exception = null;
for (Iterator iterator = templates.iterator(); iterator.hasNext();) {
Template t = (Template) iterator.next();
for (Template t : templates) {
templateName = getFinalTemplateName(t);
try {
// try to load, and if it works, stop at the first one
template = config.getTemplate(templateName);
break;
} catch (IOException e) {
if (exception == null) {
exception = e;
if (freemarkerCaching) {
if (!isTemplateMissing(templateName)) {
try {
template = findInCache(templateName); // look in cache first
if (template == null) {
// try to load, and if it works, stop at the first one
template = config.getTemplate(templateName);
addToCache(templateName, template);
}
break;
} catch (IOException e) {
addToMissingTemplateCache(templateName);
if (exception == null) {
exception = e;
}
}
}
} else {
try {
// try to load, and if it works, stop at the first one
template = config.getTemplate(templateName);
break;
} catch (IOException e) {
if (exception == null) {
exception = e;
}
}
}
}
@@ -154,4 +174,40 @@ public class FreemarkerTemplateEngine extends BaseTemplateEngine {
protected String getSuffix() {
return "ftl";
}
protected void addToMissingTemplateCache(String templateName) {
synchronized(missingTemplates) {
missingTemplates.add(templateName);
}
}
protected boolean isTemplateMissing(String templateName) {
synchronized(missingTemplates) {
return missingTemplates.contains(templateName);
}
}
protected void addToCache(String templateName,
freemarker.template.Template template) {
synchronized(templates) {
templates.put(templateName, template);
}
}
protected freemarker.template.Template findInCache(String templateName) {
synchronized(templates) {
return templates.get(templateName);
}
}
/**
* Enables or disables Struts caching of Freemarker templates. By default disabled.
* Set struts.freemarker.templatesCache=true to enable cache
* @param cacheTemplates "true" if the template engine should cache freemarker template
* internally
*/
@Inject(StrutsConstants.STRUTS_FREEMARKER_TEMPLATES_CACHE)
public void setCacheTemplates(String cacheTemplates) {
freemarkerCaching = "true".equals(cacheTemplates);
}
}
@@ -20,19 +20,16 @@
*/
package org.apache.struts2.components.template;
import java.util.Iterator;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.jsp.PageContext;
import com.opensymphony.xwork2.util.ValueStack;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.struts2.ServletActionContext;
import org.apache.struts2.components.Include;
import org.apache.struts2.components.UIBean;
import com.opensymphony.xwork2.util.ValueStack;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.jsp.PageContext;
import java.util.List;
/**
* JSP based template engine.
@@ -50,11 +47,10 @@ public class JspTemplateEngine extends BaseTemplateEngine {
ValueStack stack = templateContext.getStack();
stack.push(tag);
PageContext pageContext = (PageContext) stack.getContext().get(ServletActionContext.PAGE_CONTEXT);
List templates = template.getPossibleTemplates(this);
List<Template> templates = template.getPossibleTemplates(this);
Exception exception = null;
boolean success = false;
for (Iterator iterator = templates.iterator(); iterator.hasNext();) {
Template t = (Template) iterator.next();
for (Template t : templates) {
try {
Include.include(getFinalTemplateName(t), pageContext.getOut(),
pageContext.getRequest(), (HttpServletResponse) pageContext.getResponse());
@@ -59,8 +59,8 @@ public class Template implements Cloneable {
return name;
}
public List getPossibleTemplates(TemplateEngine engine) {
List list = new ArrayList(3);
public List<Template> getPossibleTemplates(TemplateEngine engine) {
List<Template> list = new ArrayList<Template>(3);
Template template = this;
String parentTheme;
list.add(template);
@@ -20,16 +20,7 @@
*/
package org.apache.struts2.components.template;
import java.io.IOException;
import java.io.Writer;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.opensymphony.xwork2.inject.Inject;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.struts2.ServletActionContext;
@@ -37,7 +28,13 @@ import org.apache.struts2.views.velocity.VelocityManager;
import org.apache.velocity.app.VelocityEngine;
import org.apache.velocity.context.Context;
import com.opensymphony.xwork2.inject.Inject;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.Writer;
import java.util.List;
import java.util.Map;
/**
* Velocity based template engine.
@@ -64,14 +61,13 @@ public class VelocityTemplateEngine extends BaseTemplateEngine {
VelocityEngine velocityEngine = velocityManager.getVelocityEngine();
// get the list of templates we can use
List templates = templateContext.getTemplate().getPossibleTemplates(this);
List<Template> templates = templateContext.getTemplate().getPossibleTemplates(this);
// find the right template
org.apache.velocity.Template template = null;
String templateName = null;
Exception exception = null;
for (Iterator iterator = templates.iterator(); iterator.hasNext();) {
Template t = (Template) iterator.next();
for (Template t : templates) {
templateName = getFinalTemplateName(t);
try {
// try to load, and if it works, stop at the first one
@@ -26,7 +26,6 @@ import java.util.StringTokenizer;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.struts2.StrutsConstants;
import org.apache.struts2.StrutsException;
import org.apache.struts2.dispatcher.mapper.ActionMapper;
import org.apache.struts2.dispatcher.multipart.MultiPartRequest;
import org.apache.struts2.views.freemarker.FreemarkerManager;
@@ -34,6 +33,7 @@ import org.apache.struts2.views.velocity.VelocityManager;
import com.opensymphony.xwork2.ActionProxyFactory;
import com.opensymphony.xwork2.ObjectFactory;
import com.opensymphony.xwork2.TextProvider;
import com.opensymphony.xwork2.config.Configuration;
import com.opensymphony.xwork2.config.ConfigurationException;
import com.opensymphony.xwork2.config.ConfigurationProvider;
@@ -41,12 +41,10 @@ import com.opensymphony.xwork2.inject.Container;
import com.opensymphony.xwork2.inject.ContainerBuilder;
import com.opensymphony.xwork2.inject.Context;
import com.opensymphony.xwork2.inject.Factory;
import com.opensymphony.xwork2.inject.Inject;
import com.opensymphony.xwork2.inject.Scope;
import com.opensymphony.xwork2.util.ClassLoaderUtil;
import com.opensymphony.xwork2.util.LocalizedTextUtil;
import com.opensymphony.xwork2.util.ObjectTypeDeterminer;
import com.opensymphony.xwork2.util.ObjectTypeDeterminerFactory;
import com.opensymphony.xwork2.util.XWorkConverter;
import com.opensymphony.xwork2.util.location.LocatableProperties;
@@ -154,6 +152,7 @@ public class BeanSelectionProvider implements ConfigurationProvider {
public void register(ContainerBuilder builder, LocatableProperties props) {
alias(ObjectFactory.class, StrutsConstants.STRUTS_OBJECTFACTORY, builder, props);
alias(XWorkConverter.class, StrutsConstants.STRUTS_XWORKCONVERTER, builder, props);
alias(TextProvider.class, StrutsConstants.STRUTS_XWORKTEXTPROVIDER, builder, props);
alias(ActionProxyFactory.class, StrutsConstants.STRUTS_ACTIONPROXYFACTORY, builder, props);
alias(ObjectTypeDeterminer.class, StrutsConstants.STRUTS_OBJECTTYPEDETERMINER, builder, props);
alias(ActionMapper.class, StrutsConstants.STRUTS_MAPPER_CLASS, builder, props);
@@ -164,6 +163,7 @@ public class BeanSelectionProvider implements ConfigurationProvider {
if ("true".equalsIgnoreCase(props.getProperty(StrutsConstants.STRUTS_DEVMODE))) {
props.setProperty(StrutsConstants.STRUTS_I18N_RELOAD, "true");
props.setProperty(StrutsConstants.STRUTS_CONFIGURATION_XML_RELOAD, "true");
props.setProperty(StrutsConstants.STRUTS_FREEMARKER_TEMPLATES_CACHE, "false");
// Convert struts properties into ones that xwork expects
props.setProperty("devMode", "true");
} else {
@@ -29,6 +29,7 @@ import java.util.Properties;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.struts2.StrutsException;
import org.apache.struts2.util.ClassLoaderUtils;
import com.opensymphony.xwork2.util.location.LocatableProperties;
import com.opensymphony.xwork2.util.location.Location;
@@ -53,7 +54,7 @@ class PropertiesSettings extends Settings {
*/
public PropertiesSettings(String name) {
URL settingsUrl = Thread.currentThread().getContextClassLoader().getResource(name + ".properties");
URL settingsUrl = ClassLoaderUtils.getResource(name + ".properties", getClass());
if (settingsUrl == null) {
LOG.debug(name + ".properties missing");
@@ -1 +1,23 @@
<!--
/*
* $Id: Action.java 502296 2007-02-01 17:33:39Z niallp $
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
-->
<body>Classes for Struts configuration and property handling.</body>
@@ -52,10 +52,7 @@ import org.apache.struts2.util.ObjectFactoryDestroyable;
import org.apache.struts2.views.freemarker.FreemarkerManager;
import com.opensymphony.xwork2.util.FileManager;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionProxy;
import com.opensymphony.xwork2.ActionProxyFactory;
import com.opensymphony.xwork2.ObjectFactory;
import com.opensymphony.xwork2.*;
import com.opensymphony.xwork2.Result;
import com.opensymphony.xwork2.config.Configuration;
import com.opensymphony.xwork2.config.ConfigurationException;
@@ -749,12 +746,15 @@ Caused by: com.opensymphony.xwork2.inject.ContainerImpl$MissingDependencyExcepti
}
} else {
try {
// send a http error response to use the servlet defined error handler
// make the exception availible to the web.xml defined error page
request.setAttribute("javax.servlet.error.exception", e);
// WW-1977: Only put errors in the request when code is a 500 error
if (code == HttpServletResponse.SC_INTERNAL_SERVER_ERROR) {
// send a http error response to use the servlet defined error handler
// make the exception availible to the web.xml defined error page
request.setAttribute("javax.servlet.error.exception", e);
// for compatibility
request.setAttribute("javax.servlet.jsp.jspException", e);
// for compatibility
request.setAttribute("javax.servlet.jsp.jspException", e);
}
// send the error response
response.sendError(code, e.getMessage());
@@ -23,7 +23,9 @@ package org.apache.struts2.dispatcher;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URL;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Enumeration;
@@ -123,7 +125,7 @@ import com.opensymphony.xwork2.ActionContext;
* <li><b>actionPackages</b> - a comma-delimited list of Java packages to scan for Actions.</li>
*
* <li><b>configProviders</b> - a comma-delimited list of Java classes that implement the
* {@link ConfigurationProvider} interface that should be used for building the {@link Configuration}.</li>
* {@link com.opensymphony.xwork2.config.ConfigurationProvider} interface that should be used for building the {@link com.opensymphony.xwork2.config.Configuration}.</li>
*
* <li><b>*</b> - any other parameters are treated as framework constants.</li>
*
@@ -320,20 +322,20 @@ public class FilterDispatcher implements StrutsStatics, Filter {
// prepare the request no matter what - this ensures that the proper character encoding
// is used before invoking the mapper (see WW-9127)
dispatcher.prepare(request, response);
try {
// Wrap request first, just in case it is multipart/form-data
// parameters might not be accessible through before encoding (ww-1278)
request = dispatcher.wrapRequest(request, getServletContext());
} catch (IOException e) {
String message = "Could not wrap servlet request with MultipartRequestWrapper!";
LOG.error(message, e);
throw new ServletException(message, e);
}
}
else {
} else {
dispatcher = du;
}
try {
// Wrap request first, just in case it is multipart/form-data
// parameters might not be accessible through before encoding (ww-1278)
request = dispatcher.wrapRequest(request, getServletContext());
} catch (IOException e) {
String message = "Could not wrap servlet request with MultipartRequestWrapper!";
LOG.error(message, e);
throw new ServletException(message, e);
}
return request;
}
@@ -379,7 +381,7 @@ public class FilterDispatcher implements StrutsStatics, Filter {
*/
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
ServletContext servletContext = getServletContext();
@@ -394,7 +396,6 @@ public class FilterDispatcher implements StrutsStatics, Filter {
} catch (Exception ex) {
LOG.error("error getting ActionMapping", ex);
dispatcher.sendError(request, response, servletContext, HttpServletResponse.SC_INTERNAL_SERVER_ERROR, ex);
ActionContextCleanUp.cleanUp(req);
return;
}
@@ -417,77 +418,46 @@ public class FilterDispatcher implements StrutsStatics, Filter {
return;
}
dispatcher.serviceAction(request, response, servletContext, mapping);
} finally {
try {
dispatcher.serviceAction(request, response, servletContext, mapping);
} finally {
ActionContextCleanUp.cleanUp(req);
} finally {
UtilTimerStack.pop(timerKey);
}
}
finally {
UtilTimerStack.pop(timerKey);
}
}
/**
* Locate a static resource and copy directly to the response,
* setting the appropriate caching headers.
*
* @param name The resource name
* @param path The resource path
* @param request The request
* @param response The response
* @throws IOException If anything goes wrong
*/
protected void findStaticResource(String name, HttpServletRequest request, HttpServletResponse response) throws IOException {
if (!name.endsWith(".class")) {
for (String pathPrefix : pathPrefixes) {
InputStream is = findInputStream(name, pathPrefix);
public void findStaticResource(String path, HttpServletRequest request, HttpServletResponse response)
throws IOException {
String name = cleanupPath(path);
for (String pathPrefix : pathPrefixes) {
URL resourceUrl = findResource(buildPath(name, pathPrefix));
if (resourceUrl != null) {
InputStream is = null;
try {
//check that the resource path is under the pathPrefix path
String pathEnding = buildPath(name, pathPrefix);
if (resourceUrl.getFile().endsWith(pathEnding))
is = resourceUrl.openStream();
} catch (Exception ex) {
// just ignore it
continue;
}
//not inside the try block, as this could throw IOExceptions also
if (is != null) {
Calendar cal = Calendar.getInstance();
// check for if-modified-since, prior to any other headers
long ifModifiedSince = 0;
try {
ifModifiedSince = request.getDateHeader("If-Modified-Since");
} catch (Exception e) {
LOG.warn("Invalid If-Modified-Since header value: '" + request.getHeader("If-Modified-Since") + "', ignoring");
}
long lastModifiedMillis = lastModifiedCal.getTimeInMillis();
long now = cal.getTimeInMillis();
cal.add(Calendar.DAY_OF_MONTH, 1);
long expires = cal.getTimeInMillis();
if (ifModifiedSince > 0 && ifModifiedSince <= lastModifiedMillis) {
// not modified, content is not sent - only basic headers and status SC_NOT_MODIFIED
response.setDateHeader("Expires", expires);
response.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
is.close();
return;
}
// set the content-type header
String contentType = getContentType(name);
if (contentType != null) {
response.setContentType(contentType);
}
if (serveStaticBrowserCache) {
// set heading information for caching static content
response.setDateHeader("Date", now);
response.setDateHeader("Expires", expires);
response.setDateHeader("Retry-After", expires);
response.setHeader("Cache-Control", "public");
response.setDateHeader("Last-Modified", lastModifiedMillis);
} else {
response.setHeader("Cache-Control", "no-cache");
response.setHeader("Pragma", "no-cache");
response.setHeader("Expires", "-1");
}
try {
copy(is, response.getOutputStream());
} finally {
is.close();
}
process(is, path, request, response);
return;
}
}
@@ -496,6 +466,88 @@ public class FilterDispatcher implements StrutsStatics, Filter {
response.sendError(HttpServletResponse.SC_NOT_FOUND);
}
/**
* Look for a static resource in the classpath.
*
* @param path The resource path
* @return The inputstream of the resource
* @throws IOException If there is a problem locating the resource
*/
protected URL findResource(String path) throws IOException {
return ClassLoaderUtil.getResource(path, getClass());
}
/**
* @param name resource name
* @param packagePrefix The package prefix to use to locate the resource
* @return full path
* @throws java.io.UnsupportedEncodingException
* @throws IOException
*/
protected String buildPath(String name, String packagePrefix) throws UnsupportedEncodingException {
String resourcePath;
if (packagePrefix.endsWith("/") && name.startsWith("/")) {
resourcePath = packagePrefix + name.substring(1);
} else {
resourcePath = packagePrefix + name;
}
return URLDecoder.decode(resourcePath, encoding);
}
protected void process(InputStream is, String path, HttpServletRequest request, HttpServletResponse response) throws IOException {
if (is != null) {
Calendar cal = Calendar.getInstance();
// check for if-modified-since, prior to any other headers
long ifModifiedSince = 0;
try {
ifModifiedSince = request.getDateHeader("If-Modified-Since");
} catch (Exception e) {
LOG.warn("Invalid If-Modified-Since header value: '"
+ request.getHeader("If-Modified-Since") + "', ignoring");
}
long lastModifiedMillis = lastModifiedCal.getTimeInMillis();
long now = cal.getTimeInMillis();
cal.add(Calendar.DAY_OF_MONTH, 1);
long expires = cal.getTimeInMillis();
if (ifModifiedSince > 0 && ifModifiedSince <= lastModifiedMillis) {
// not modified, content is not sent - only basic
// headers and status SC_NOT_MODIFIED
response.setDateHeader("Expires", expires);
response.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
is.close();
return;
}
// set the content-type header
String contentType = getContentType(path);
if (contentType != null) {
response.setContentType(contentType);
}
if (serveStaticBrowserCache) {
// set heading information for caching static content
response.setDateHeader("Date", now);
response.setDateHeader("Expires", expires);
response.setDateHeader("Retry-After", expires);
response.setHeader("Cache-Control", "public");
response.setDateHeader("Last-Modified", lastModifiedMillis);
} else {
response.setHeader("Cache-Control", "no-cache");
response.setHeader("Pragma", "no-cache");
response.setHeader("Expires", "-1");
}
try {
copy(is, response.getOutputStream());
} finally {
is.close();
}
}
}
/**
* Determine the content type for the resource name.
*
@@ -537,6 +589,7 @@ public class FilterDispatcher implements StrutsStatics, Filter {
while (-1 != (n = input.read(buffer))) {
output.write(buffer, 0, n);
}
output.flush(); // WW-1526
}
/**
@@ -559,4 +612,13 @@ public class FilterDispatcher implements StrutsStatics, Filter {
return ClassLoaderUtil.getResourceAsStream(resourcePath, getClass());
}
/**
* @param path requested path
* @return path without leading "/struts" or "/static"
*/
protected String cleanupPath(String path) {
//path will start with "/struts" or "/static", remove them
return path.substring(7);
}
}
@@ -23,6 +23,7 @@ package org.apache.struts2.dispatcher;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
@@ -45,19 +46,6 @@ import com.opensymphony.xwork2.inject.Inject;
* standard redirect result.
*
* <p/>
* @TODO - the below sentence is confusing and seems to be contradictory -- FIX ME
* To pass parameters, use the &lt;param&gt; ... &lt;/param&gt; tag. The following parameters will not be
* passed because they are part of the config param for this particular result.
*
* <ul>
* <li>actionName</li>
* <li>namespace</li>
* <li>method</li>
* <li>encode</li>
* <li>parse</li>
* <li>location</li>
* <li>prependServletContext</li>
* </ul>
*
* See examples below for an example of how request parameters could be passed in.
*
@@ -136,7 +124,7 @@ public class ServletActionRedirectResult extends ServletRedirectResult {
protected String namespace;
protected String method;
private Map<String, String> requestParameters = new HashMap<String, String>();
private Map<String, String> requestParameters = new LinkedHashMap<String, String>();
public ServletActionRedirectResult() {
super();
@@ -33,7 +33,7 @@ import com.opensymphony.xwork2.ActionInvocation;
/**
* <!-- START SNIPPET: description -->
*
* A custom Result type for send raw data (via an InputStream) directly to the
* A custom Result type for sending raw data (via an InputStream) directly to the
* HttpServletResponse. Very useful for allowing users to download content.
*
* <!-- END SNIPPET: description -->
@@ -117,7 +117,7 @@ public abstract class StrutsResultSupport implements Result, StrutsStatics {
}
public StrutsResultSupport(String location) {
this(location, false, false);
this(location, true, false);
}
public StrutsResultSupport(String location, boolean parse, boolean encode) {
@@ -485,11 +485,17 @@ public class DefaultActionMapper implements ActionMapper {
return uri.toString();
}
/**
public boolean isSlashesInActionNames() {
return allowSlashesInActionNames;
}
/**
* Defines a parameter action prefix
*/
interface ParameterAction {
void execute(String key, ActionMapping mapping);
}
}
@@ -21,6 +21,7 @@
package org.apache.struts2.dispatcher.mapper;
import com.opensymphony.xwork2.config.ConfigurationManager;
import com.opensymphony.xwork2.inject.Inject;
import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
@@ -29,6 +30,7 @@ import java.net.URLDecoder;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.struts2.StrutsConstants;
/**
* <!-- START SNIPPET: description -->
@@ -56,16 +58,25 @@ import org.apache.commons.logging.LogFactory;
* &lt;/action&gt;
* </pre>
* <p>
* This mapper supports the following parameters:
* </p>
* <ul>
* <li><code>struts.mapper.idParameterName</code> - If set, this value will be the name
* of the parameter under which the id is stored. The id will then be removed
* from the action name. This allows restful actions to not require wildcards.
* </li>
* </ul>
* <p>
* The following URL's will invoke its methods:
* </p>
* <ul>
* <li><code>GET: /movie => method="index"</code></li>
* <li><code>GET: /movie/ => method="index"</code></li>
* <li><code>GET: /movie/Thrillers => method="view", id="Thrillers"</code></li>
* <li><code>GET: /movie/Thrillers!edit => method="edit", id="Thrillers"</code></li>
* <li><code>GET: /movie/new => method="editNew"</code></li>
* <li><code>POST: /movie/Thrillers => method="create"</code></li>
* <li><code>PUT: /movie/ => method="update"</code></li>
* <li><code>DELETE: /movie/Thrillers => method="remove"</code></li>
* <li><code>GET: /movie/new => method="editNew"</code></li>
* <li><code>POST: /movie/ => method="create"</code></li>
* <li><code>PUT: /movie/Thrillers => method="update", id="Thrillers"</code></li>
* <li><code>DELETE: /movie/Thrillers => method="remove", id="Thrillers"</code></li>
* </ul>
* <p>
* To simulate the HTTP methods PUT and DELETE, since they aren't supported by HTML,
@@ -83,7 +94,13 @@ import org.apache.commons.logging.LogFactory;
public class Restful2ActionMapper extends DefaultActionMapper {
protected static final Log LOG = LogFactory.getLog(Restful2ActionMapper.class);
private static final String HTTP_METHOD_PARAM = "__http_method";
public static final String HTTP_METHOD_PARAM = "__http_method";
private String idParameterName = null;
public Restful2ActionMapper() {
setSlashesInActionNames("true");
}
/*
* (non-Javadoc)
@@ -92,6 +109,9 @@ public class Restful2ActionMapper extends DefaultActionMapper {
*/
public ActionMapping getMapping(HttpServletRequest request, ConfigurationManager configManager) {
if (!isSlashesInActionNames()) {
throw new IllegalStateException("This action mapper requires the setting 'slashesInActionNames' to be set to 'true'");
}
ActionMapping mapping = super.getMapping(request, configManager);
if (mapping == null) {
@@ -114,7 +134,7 @@ public class Restful2ActionMapper extends DefaultActionMapper {
mapping.setMethod("index");
// Creating a new entry on POST e.g. foo/
} else if (isPut(request)) {
} else if (isPost(request)) {
mapping.setMethod("create");
}
@@ -129,14 +149,25 @@ public class Restful2ActionMapper extends DefaultActionMapper {
} else if (isGet(request)) {
mapping.setMethod("view");
// Updating an item e.g. foo/1
} else if (isPost(request)) {
mapping.setMethod("update");
// Removing an item e.g. foo/1
} else if (isDelete(request)) {
mapping.setMethod("remove");
// Updating an item e.g. foo/1
} else if (isPut(request)) {
mapping.setMethod("update");
}
if (idParameterName != null) {
if (mapping.getParams() == null) {
mapping.setParams(new HashMap());
}
mapping.getParams().put(idParameterName, id);
}
}
if (idParameterName != null && lastSlashPos > -1) {
actionName = actionName.substring(0, lastSlashPos);
}
}
@@ -205,4 +236,15 @@ public class Restful2ActionMapper extends DefaultActionMapper {
}
}
public String getIdParameterName() {
return idParameterName;
}
@Inject(required=false,value=StrutsConstants.STRUTS_ID_PARAMETER_NAME)
public void setIdParameterName(String idParameterName) {
this.idParameterName = idParameterName;
}
}
@@ -115,6 +115,12 @@ public class JakartaMultiPartRequest implements MultiPartRequest {
} else {
log.debug("Item is a file upload");
// Skip file uploads that don't have a file name - meaning that no file was selected.
if (item.getName() == null || item.getName().trim().length() < 1) {
log.debug("No file has been uploaded for the field: " + item.getFieldName());
continue;
}
List<FileItem> values;
if (files.get(item.getFieldName()) != null) {
values = files.get(item.getFieldName());
@@ -1 +1,23 @@
<!--
/*
* $Id$
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
-->
<body>Classes to help dispatch multipart HTTP requests.</body>
@@ -1 +1,23 @@
<!--
/*
* $Id$
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
-->
<body>Classes for action dispatching in Struts (the Controller part of MVC).</body>
@@ -0,0 +1,277 @@
/*
* $Id: $
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.struts2.interceptor;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Set;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
import com.opensymphony.xwork2.util.ValueStack;
import com.opensymphony.xwork2.util.TextParseUtil;
/**
* <!-- START SNIPPET: description -->
*
* The aim of this interceptor is to set values in the stack/action based on cookie name/value
* of interest. <p/>
*
* If an asterik is present in cookiesName parameter, it will be assume that
* all cookies name are to be injected into struts' action, even though
* cookiesName is comma-separated by other values, eg (cookie1,*,cookie2). <p/>
*
* If cookiesName is left empty it will assume that no cookie will be injected
* into Struts' action. <p/>
*
* If an asterik is present in cookiesValue parameter, it will assume that all
* cookies name irrespective of its value will be injected into Struts' action so
* long as the cookie name matches those specified in cookiesName parameter.<p/>
*
* If cookiesValue is left empty it will assume that all cookie that match the cookieName
* parameter will be injected into Struts' action.<p/>
*
* The action could implements {@link CookiesAware} in order to have a {@link Map}
* of filtered cookies set into it. <p/>
*
* <!-- END SNIPPET: description -->
*
*
* <!-- START SNIPPET: parameters -->
*
* <ul>
* <li>cookiesName (mandatory) - Name of cookies to be injected into the action. If more
* than one cookie name is desired it could be comma-separated.
* If all cookies name is desired, it could simply be *, an asterik.
* When many cookies name are comma-separated either of the cookie
* that match the name in the comma-separated list will be qualified.</li>
* <li>cookiesValue (mandatory) - Value of cookies that if its name matches cookieName attribute
* and its value matched this, will be injected into Struts'
* action. If more than one cookie name is desired it could be
* comma-separated. If left empty, it will assume any value would
* be ok. If more than one value is specified (comma-separated)
* it will assume a match if either value is matched.
* </ul>
*
* <!-- END SNIPPET: parameters -->
*
*
* <!-- START SNIPPET: extending -->
*
* <ul>
* populateCookieValueIntoStack - this method will decide if this cookie value is qualified to be
* populated into the value stack (hence into the action itself)
* injectIntoCookiesAwareAction - this method will inject selected cookies (as a java.util.Map) into
* action that implements {@link CookiesAware}.
* </ul>
*
* <!-- END SNIPPET: extending -->
*
* <pre>
* <!-- START SNIPPET: example -->
*
* &lt;!--
* This example will inject cookies named either 'cookie1' or 'cookie2' whose
* value could be either 'cookie1value' or 'cookie2value' into Struts' action.
* --&gt;
* &lt;action ... &gt;
* &lt;interceptor-ref name="cookie"&gt;
* &lt;param name="cookiesName"&gt;cookie1, cookie2&lt;/param&gt;
* &lt;param name="cookiesValue"&gt;cookie1value, cookie2value&lt;/param&gt;
* &lt;/interceptor-ref&gt;
* ....
* &lt;/action&gt;
*
*
* &lt;!--
* This example will inject cookies named either 'cookie1' or 'cookie2'
* regardless of their value into Struts' action.
* --&gt;
* &lt;action ... &gt;
* &lt;interceptor-ref name="cookie"&gt;
* &lt;param name="cookiesName"&gt;cookie1, cookie2&lt;/param&gt;
* &lt;param name="cookiesValue"&gt;*&lt;/param&gt;
* &lt;interceptor-ref&gt;
* ...
* &lt;/action&gt;
*
*
* &lt;!--
* This example will inject cookies named either 'cookie1' with value
* 'cookie1value' or 'cookie2' with value 'cookie2value' into Struts'
* action.
* --&gt;
* &lt;action ... &gt;
* &lt;interceptor-ref name="cookie"&gt;
* &lt;param name="cookiesName"&gt;cookie1&lt;/param&gt;
* &lt;param name="cookiesValue"&gt;cookie1value&lt;/param&gt;
* &lt;/interceptor-ref&gt;
* &lt;interceptor-ref name="cookie"&gt;
* &lt;param name="cookiesName"&lt;cookie2&lt;/param&gt;
* &lt;param name="cookiesValue"&gt;cookie2value&lt;/param&gt;
* &lt;/interceptor-ref&gt;
* ....
* &lt;/action&gt;
*
* &lt;!--
* This example will inject any cookies regardless of its value into
* Struts' action.
* --&gt;
* &lt;action ... &gt;
* &lt;interceptor-ref name="cookie"&gt;
* &lt;param name="cookiesName"&gt;*&lt;/param&gt;
* &lt;param name="cookiesValue"&gt;*&lt;/param&gt;
* &lt;/interceptor-ref&gt;
* ...
* &lt;/action&gt;
*
* <!-- END SNIPPET: example -->
* </pre>
*
* @see CookiesAware
*/
public class CookieInterceptor extends AbstractInterceptor {
private static final long serialVersionUID = 4153142432948747305L;
private static final Log LOG = LogFactory.getLog(CookieInterceptor.class);
private Set cookiesNameSet = Collections.EMPTY_SET;
private Set cookiesValueSet = Collections.EMPTY_SET;
/**
* Set the <code>cookiesName</code> which if matche will allow the cookie
* to be injected into action, could be comma-separated string.
*
* @param cookiesName
*/
public void setCookiesName(String cookiesName) {
if (cookiesName != null)
this.cookiesNameSet = TextParseUtil.commaDelimitedStringToSet(cookiesName);
}
/**
* Set the <code>cookiesValue</code> which if matched (together with matching
* cookiesName) will caused the cookie to be injected into action, could be
* comma-separated string.
*
* @param cookiesValue
*/
public void setCookiesValue(String cookiesValue) {
if (cookiesValue != null)
this.cookiesValueSet = TextParseUtil.commaDelimitedStringToSet(cookiesValue);
}
public String intercept(ActionInvocation invocation) throws Exception {
if (LOG.isDebugEnabled())
LOG.debug("start interception");
final ValueStack stack = ActionContext.getContext().getValueStack();
HttpServletRequest request = ServletActionContext.getRequest();
// contains selected cookies
Map cookiesMap = new LinkedHashMap();
Cookie cookies[] = request.getCookies();
if (cookies != null) {
for (int a=0; a< cookies.length; a++) {
String name = cookies[a].getName();
String value = cookies[a].getValue();
if (cookiesNameSet.contains("*")) {
if (LOG.isDebugEnabled())
LOG.debug("contains cookie name [*] in configured cookies name set, cookie with name ["+name+"] with value ["+value+"] will be injected");
populateCookieValueIntoStack(name, value, cookiesMap, stack);
}
else if (cookiesNameSet.contains(cookies[a].getName())) {
populateCookieValueIntoStack(name, value, cookiesMap, stack);
}
}
}
injectIntoCookiesAwareAction(invocation.getAction(), cookiesMap);
return invocation.invoke();
}
/**
* Hook that populate cookie value into value stack (hence the action)
* if the criteria is satisfied (if the cookie value matches with those configured).
*
* @param cookieName
* @param cookieValue
* @param cookiesMap
* @param stack
*/
protected void populateCookieValueIntoStack(String cookieName, String cookieValue, Map cookiesMap, ValueStack stack) {
if (cookiesValueSet.isEmpty() || cookiesValueSet.contains("*")) {
// If the interceptor is configured to accept any cookie value
// OR
// no cookiesValue is defined, so as long as the cookie name match
// we'll inject it into Struts' action
if (LOG.isDebugEnabled()) {
if (cookiesValueSet.isEmpty())
LOG.debug("no cookie value is configured, cookie with name ["+cookieName+"] with value ["+cookieValue+"] will be injected");
else if (cookiesValueSet.contains("*"))
LOG.debug("interceptor is configured to accept any value, cookie with name ["+cookieName+"] with value ["+cookieValue+"] will be injected");
}
cookiesMap.put(cookieName, cookieValue);
stack.setValue(cookieName, cookieValue);
}
else {
// if cookiesValues is specified, the cookie's value must match before we
// inject them into Struts' action
if (cookiesValueSet.contains(cookieValue)) {
if (LOG.isDebugEnabled())
LOG.debug("both configured cookie name and value matched, cookie ["+cookieName+"] with value ["+cookieValue+"] will be injected");
cookiesMap.put(cookieName, cookieValue);
stack.setValue(cookieName, cookieValue);
}
}
}
/**
* Hook that set the <code>cookiesMap</code> into action that implements
* {@link CookiesAware}.
*
* @param action
* @param cookiesMap
*/
protected void injectIntoCookiesAwareAction(Object action, Map cookiesMap) {
if (action instanceof CookiesAware) {
if (LOG.isDebugEnabled())
LOG.debug("action ["+action+"] implements CookiesAware, injecting cookies map ["+cookiesMap+"]");
((CookiesAware)action).setCookiesMap(cookiesMap);
}
}
}
@@ -0,0 +1,27 @@
/*
* $Id: $
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.struts2.interceptor;
import java.util.Map;
public interface CookiesAware {
void setCookiesMap(Map cookies);
}
@@ -202,26 +202,30 @@ public class ScopeInterceptor extends AbstractInterceptor implements PreResultLi
super();
}
// Since 2.0.7. Avoid null references on session serialization (WW-1803).
private static class NULLClass implements Serializable {
public String toString() {
return "NULL";
}
public boolean equals(Object obj) {
return obj == null || (obj instanceof NULLClass);
}
}
private static final Object NULL = new Serializable() {
public String toString() {
return "NULL";
}
};
private static final Object NULL = new NULLClass();
private static final Object nullConvert(Object o) {
if (o == null) {
return NULL;
}
if (o == NULL) {
if (o == NULL || NULL.equals(o)) {
return null;
}
return o;
}
private static Map locks = new IdentityHashMap();
static final void lock(Object o, ActionInvocation invocation) throws Exception {

Some files were not shown because too many files have changed in this diff Show More