[3/4] git commit: Adds usage of new urlRegex field in client side validation
Adds usage of new urlRegex field in client side validation Project: http://git-wip-us.apache.org/repos/asf/struts/repo Commit: http://git-wip-us.apache.org/repos/asf/struts/commit/3f6ce657 Tree: http://git-wip-us.apache.org/repos/asf/struts/tree/3f6ce657 Diff: http://git-wip-us.apache.org/repos/asf/struts/diff/3f6ce657 Branch: refs/heads/feature/WW-4198-update-form-close Commit: 3f6ce657da3ac6c133939bfcebb4e4e5f6bd2bc1 Parents: 3457a65 Author: Lukasz Lenart Authored: Sun Mar 9 21:02:27 2014 +0100 Committer: Lukasz Lenart Committed: Sun Mar 9 21:02:27 2014 +0100 -- core/src/main/resources/template/xhtml/form-close-validate.ftl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) -- http://git-wip-us.apache.org/repos/asf/struts/blob/3f6ce657/core/src/main/resources/template/xhtml/form-close-validate.ftl -- diff --git a/core/src/main/resources/template/xhtml/form-close-validate.ftl b/core/src/main/resources/template/xhtml/form-close-validate.ftl index 81a17e1..f129156 100644 --- a/core/src/main/resources/template/xhtml/form-close-validate.ftl +++ b/core/src/main/resources/template/xhtml/form-close-validate.ftl @@ -120,7 +120,7 @@ END SNIPPET: supported-validators <#if validator.shortCircuit>continueValidation = false; } <#elseif validator.validatorType = "url"> -if (continueValidation && fieldValue != null && fieldValue.length > 0 && fieldValue.match("${validator.regex?js_string}")==null) { +if (continueValidation && fieldValue != null && fieldValue.length > 0 && fieldValue.match("/${validator.urlRegex?js_string}/i")==null) { addError(field, error); errors = true; <#if validator.shortCircuit>continueValidation = false;
[1/4] git commit: Extends validator to allow set predefined regex used to validate URLs
Repository: struts Updated Branches: refs/heads/feature/WW-4198-update-form-close [created] e66a30629 Extends validator to allow set predefined regex used to validate URLs Project: http://git-wip-us.apache.org/repos/asf/struts/repo Commit: http://git-wip-us.apache.org/repos/asf/struts/commit/31be88af Tree: http://git-wip-us.apache.org/repos/asf/struts/tree/31be88af Diff: http://git-wip-us.apache.org/repos/asf/struts/diff/31be88af Branch: refs/heads/feature/WW-4198-update-form-close Commit: 31be88afa28fb9b1e9854d0d7673ab9b979cf9be Parents: bcd61a0 Author: Lukasz Lenart Authored: Sun Mar 9 21:01:15 2014 +0100 Committer: Lukasz Lenart Committed: Sun Mar 9 21:01:15 2014 +0100 -- .../validator/validators/URLValidator.java | 46 ++ .../xwork2/validator/URLValidatorTest.java | 50 2 files changed, 96 insertions(+) -- http://git-wip-us.apache.org/repos/asf/struts/blob/31be88af/xwork-core/src/main/java/com/opensymphony/xwork2/validator/validators/URLValidator.java -- diff --git a/xwork-core/src/main/java/com/opensymphony/xwork2/validator/validators/URLValidator.java b/xwork-core/src/main/java/com/opensymphony/xwork2/validator/validators/URLValidator.java index b4a1287..4f63961 100644 --- a/xwork-core/src/main/java/com/opensymphony/xwork2/validator/validators/URLValidator.java +++ b/xwork-core/src/main/java/com/opensymphony/xwork2/validator/validators/URLValidator.java @@ -17,6 +17,7 @@ package com.opensymphony.xwork2.validator.validators; import com.opensymphony.xwork2.validator.ValidationException; import com.opensymphony.xwork2.util.URLUtil; +import org.apache.commons.lang3.StringUtils; /** * @@ -31,6 +32,8 @@ import com.opensymphony.xwork2.util.URLUtil; * * * fieldName - The field name this validator is validating. Required if using Plain-Validator Syntax otherwise not required + * urlRegexExpression - The regex defined as expression used to validate url. If not defined 'urlRegex' will be used instead + * urlRegex - The regex used to validate url. If not defined default regex will be used * * * @@ -62,6 +65,9 @@ import com.opensymphony.xwork2.util.URLUtil; */ public class URLValidator extends FieldValidatorSupport { +private String urlRegex; +private String urlRegexExpression; + public void validate(Object object) throws ValidationException { String fieldName = getFieldName(); Object value = this.getFieldValue(fieldName, object); @@ -72,8 +78,48 @@ public class URLValidator extends FieldValidatorSupport { return; } +// FIXME deprecated! the same regex below should be used instead +// replace logic with next major release if (!(value.getClass().equals(String.class)) || !URLUtil.verifyUrl((String) value)) { addFieldError(fieldName, object); } } + +/** + * This is used to support client-side validation, it's based on + * http://stackoverflow.com/questions/161738/what-is-the-best-regular-expression-to-check-if-a-string-is-a-valid-url + * + * @return regex to validate URLs + */ +public String getUrlRegex() { +if (StringUtils.isNotEmpty(urlRegexExpression)) { +return (String) parse(urlRegexExpression, String.class); +} else if (StringUtils.isNotEmpty(urlRegex)) { +return urlRegex; +} else { +return "^(https?|ftp):\\/\\/" + +"(([a-z0-9$_\\.\\+!\\*\\'\\(\\),;\\?&=-]|%[0-9a-f]{2})+" + + "(:([a-z0-9$_\\.\\+!\\*\\'\\(\\),;\\?&=-]|%[0-9a-f]{2})+)?" + +"@)?(#?" + +")((([a-z0-9]\\.|[a-z0-9][a-z0-9-]*[a-z0-9]\\.)*" + +"[a-z][a-z0-9-]*[a-z0-9]" + +"|((\\d|[1-9]\\d|1\\d{2}|2[0-4][0-9]|25[0-5])\\.){3}" + +"(\\d|[1-9]\\d|1\\d{2}|2[0-4][0-9]|25[0-5])" + +")(:\\d+)?" + + ")(((\\/+([a-z0-9$_\\.\\+!\\*\\'\\(\\),;:@&=-]|%[0-9a-f]{2})*)*" + + "(\\?([a-z0-9$_\\.\\+!\\*\\'\\(\\),;:@&=-]|%[0-9a-f]{2})*)" + +"?)?)?" + +"(#([a-z0-9$_\\.\\+!\\*\\'\\(\\),;:@&=-]|%[0-9a-f]{2})*)?" + +"$"; +} +} + +public void setUrlRegex(String urlRegex) { +this.urlRegex = urlRegex; +} + +public void setUrlRegexExpression(String urlRegexExpression) { +this.urlRegexExpression = urlRegexExpression; +} + } http://git-wip-us.apache.org/repos/asf/struts/blob/31be88af/xwork-core/src/test/java/com/opensymphony/xwork2/validator/URLValidatorTest.java -- diff --git a/xwork-co
[4/4] git commit: Extends annotation to support new URL regex parameters
Extends annotation to support new URL regex parameters Project: http://git-wip-us.apache.org/repos/asf/struts/repo Commit: http://git-wip-us.apache.org/repos/asf/struts/commit/e66a3062 Tree: http://git-wip-us.apache.org/repos/asf/struts/tree/e66a3062 Diff: http://git-wip-us.apache.org/repos/asf/struts/diff/e66a3062 Branch: refs/heads/feature/WW-4198-update-form-close Commit: e66a3062992fac588cf3f570a224bbe7d9ce5ef5 Parents: 3f6ce65 Author: Lukasz Lenart Authored: Sun Mar 9 21:04:11 2014 +0100 Committer: Lukasz Lenart Committed: Sun Mar 9 21:04:11 2014 +0100 -- ...nnotationValidationConfigurationBuilder.java | 6 ++ .../validator/annotations/UrlValidator.java | 74 +++- 2 files changed, 16 insertions(+), 64 deletions(-) -- http://git-wip-us.apache.org/repos/asf/struts/blob/e66a3062/xwork-core/src/main/java/com/opensymphony/xwork2/validator/AnnotationValidationConfigurationBuilder.java -- diff --git a/xwork-core/src/main/java/com/opensymphony/xwork2/validator/AnnotationValidationConfigurationBuilder.java b/xwork-core/src/main/java/com/opensymphony/xwork2/validator/AnnotationValidationConfigurationBuilder.java index 6ab06a9..dbd8975 100644 --- a/xwork-core/src/main/java/com/opensymphony/xwork2/validator/AnnotationValidationConfigurationBuilder.java +++ b/xwork-core/src/main/java/com/opensymphony/xwork2/validator/AnnotationValidationConfigurationBuilder.java @@ -528,6 +528,12 @@ public class AnnotationValidationConfigurationBuilder { } else if (v.fieldName() != null && v.fieldName().length() > 0) { params.put("fieldName", v.fieldName()); } +if (StringUtils.isNotEmpty(v.urlRegex())) { +params.put("urlRegex", v.urlRegex()); +} +if (StringUtils.isNotEmpty(v.urlRegexExpression())) { +params.put("urlRegexExpression", v.urlRegexExpression()); +} validatorFactory.lookupRegisteredValidatorType(validatorType); return new ValidatorConfig.Builder(validatorType) http://git-wip-us.apache.org/repos/asf/struts/blob/e66a3062/xwork-core/src/main/java/com/opensymphony/xwork2/validator/annotations/UrlValidator.java -- diff --git a/xwork-core/src/main/java/com/opensymphony/xwork2/validator/annotations/UrlValidator.java b/xwork-core/src/main/java/com/opensymphony/xwork2/validator/annotations/UrlValidator.java index fb6fa3c..a06db12 100644 --- a/xwork-core/src/main/java/com/opensymphony/xwork2/validator/annotations/UrlValidator.java +++ b/xwork-core/src/main/java/com/opensymphony/xwork2/validator/annotations/UrlValidator.java @@ -22,75 +22,12 @@ import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** - * * This validator checks that a field is a valid URL. - * - * - * Annotation usage: - * - * - * The annotation must be applied at method level. - * - * - * Annotation parameters: - * - * - * - * - * Parameter - * Required - * Default - * Notes - * - * - * message - * yes - * - * field error message - * - * - * key - * no - * - * i18n key from language specific properties file. - * - * - * messageParams - * no - * - * Additional params to be used to customize message - will be evaluated against the Value Stack - * - * - * fieldName - * no - * - * - * - * - * shortCircuit - * no - * false - * If this validator should be used as shortCircuit. - * - * - * type - * yes - * ValidatorType.FIELD - * Enum value from ValidatorType. Either FIELD or SIMPLE can be used here. - * - * - * - * - * Example code: * * - * * @UrlValidator(message = "Default message", key = "i18n.key", shortCircuit = true) - * * * - * @author Rainer Hermanns - * @version $Id$ */ @Target({ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @@ -121,7 +58,6 @@ public @interface UrlValidator { * If this is activated, the validator will be used as short-circuit. * * Adds the short-circuit="true" attribute value if true. - * */ boolean shortCircuit() default false; @@ -130,4 +66,14 @@ public @interface UrlValidator { */ ValidatorType type() default ValidatorType.FIELD; +/** + * Defines regex to use to validate url + */ +String urlRegex() default ""; + +/** + * Defines regex as an expression which will be evaluated to string and used to validate url + */ +String urlRegexExpression() default ""; + }
[2/4] git commit: Marks method as deprecated
Marks method as deprecated Project: http://git-wip-us.apache.org/repos/asf/struts/repo Commit: http://git-wip-us.apache.org/repos/asf/struts/commit/3457a656 Tree: http://git-wip-us.apache.org/repos/asf/struts/tree/3457a656 Diff: http://git-wip-us.apache.org/repos/asf/struts/diff/3457a656 Branch: refs/heads/feature/WW-4198-update-form-close Commit: 3457a656ba95539145ef3b19d254fe0129b4d187 Parents: 31be88a Author: Lukasz Lenart Authored: Sun Mar 9 21:01:44 2014 +0100 Committer: Lukasz Lenart Committed: Sun Mar 9 21:01:44 2014 +0100 -- xwork-core/src/main/java/com/opensymphony/xwork2/util/URLUtil.java | 1 + 1 file changed, 1 insertion(+) -- http://git-wip-us.apache.org/repos/asf/struts/blob/3457a656/xwork-core/src/main/java/com/opensymphony/xwork2/util/URLUtil.java -- diff --git a/xwork-core/src/main/java/com/opensymphony/xwork2/util/URLUtil.java b/xwork-core/src/main/java/com/opensymphony/xwork2/util/URLUtil.java index b9aaee7..160a5b9 100644 --- a/xwork-core/src/main/java/com/opensymphony/xwork2/util/URLUtil.java +++ b/xwork-core/src/main/java/com/opensymphony/xwork2/util/URLUtil.java @@ -33,6 +33,7 @@ public class URLUtil { * @param url The url string to verify. * @return a boolean indicating whether the URL seems to be incorrect. */ +@Deprecated public static boolean verifyUrl(String url) { if (LOG.isDebugEnabled()) { LOG.debug("Checking if url [#0] is valid", url);
git commit: Moves snippets to wiki
Repository: struts Updated Branches: refs/heads/feature/WW-4198-update-form-close e66a30629 -> e58549065 Moves snippets to wiki Project: http://git-wip-us.apache.org/repos/asf/struts/repo Commit: http://git-wip-us.apache.org/repos/asf/struts/commit/e5854906 Tree: http://git-wip-us.apache.org/repos/asf/struts/tree/e5854906 Diff: http://git-wip-us.apache.org/repos/asf/struts/diff/e5854906 Branch: refs/heads/feature/WW-4198-update-form-close Commit: e585490656225f88dc28300b722ec38dcffbb6ba Parents: e66a306 Author: Lukasz Lenart Authored: Sun Mar 9 21:22:28 2014 +0100 Committer: Lukasz Lenart Committed: Sun Mar 9 21:22:28 2014 +0100 -- .../validator/annotations/UrlValidator.java | 2 -- .../validator/validators/URLValidator.java | 24 2 files changed, 26 deletions(-) -- http://git-wip-us.apache.org/repos/asf/struts/blob/e5854906/xwork-core/src/main/java/com/opensymphony/xwork2/validator/annotations/UrlValidator.java -- diff --git a/xwork-core/src/main/java/com/opensymphony/xwork2/validator/annotations/UrlValidator.java b/xwork-core/src/main/java/com/opensymphony/xwork2/validator/annotations/UrlValidator.java index a06db12..9ad9223 100644 --- a/xwork-core/src/main/java/com/opensymphony/xwork2/validator/annotations/UrlValidator.java +++ b/xwork-core/src/main/java/com/opensymphony/xwork2/validator/annotations/UrlValidator.java @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package com.opensymphony.xwork2.validator.annotations; import java.lang.annotation.ElementType; @@ -27,7 +26,6 @@ import java.lang.annotation.Target; * * @UrlValidator(message = "Default message", key = "i18n.key", shortCircuit = true) * - * */ @Target({ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) http://git-wip-us.apache.org/repos/asf/struts/blob/e5854906/xwork-core/src/main/java/com/opensymphony/xwork2/validator/validators/URLValidator.java -- diff --git a/xwork-core/src/main/java/com/opensymphony/xwork2/validator/validators/URLValidator.java b/xwork-core/src/main/java/com/opensymphony/xwork2/validator/validators/URLValidator.java index 4f63961..767416d 100644 --- a/xwork-core/src/main/java/com/opensymphony/xwork2/validator/validators/URLValidator.java +++ b/xwork-core/src/main/java/com/opensymphony/xwork2/validator/validators/URLValidator.java @@ -20,28 +20,9 @@ import com.opensymphony.xwork2.util.URLUtil; import org.apache.commons.lang3.StringUtils; /** - * - * * URLValidator checks that a given field is a String and a valid URL - * - * - * - * - * - * - * - * - * fieldName - The field name this validator is validating. Required if using Plain-Validator Syntax otherwise not required - * urlRegexExpression - The regex defined as expression used to validate url. If not defined 'urlRegex' will be used instead - * urlRegex - The regex used to validate url. If not defined default regex will be used - * - * - * - * - * * * - * ** * - * * - * - * - * @author $Author$ - * @version $Date$ $Revision$ */ public class URLValidator extends FieldValidatorSupport {@@ -56,12 +37,7 @@ import org.apache.commons.lang3.StringUtils; * * *
[2/2] git commit: Extends logic how protocol part of url is extracted
Extends logic how protocol part of url is extracted Project: http://git-wip-us.apache.org/repos/asf/struts/repo Commit: http://git-wip-us.apache.org/repos/asf/struts/commit/1ca55b8a Tree: http://git-wip-us.apache.org/repos/asf/struts/tree/1ca55b8a Diff: http://git-wip-us.apache.org/repos/asf/struts/diff/1ca55b8a Branch: refs/heads/feature/WW-4187-correctly-identify-protocols Commit: 1ca55b8a79cc118128391bddd3b776024def79f8 Parents: 4b7d2e3 Author: Lukasz Lenart Authored: Sun Mar 9 21:57:58 2014 +0100 Committer: Lukasz Lenart Committed: Sun Mar 9 21:57:58 2014 +0100 -- .../dispatcher/ServletRedirectResult.java | 26 +--- 1 file changed, 22 insertions(+), 4 deletions(-) -- http://git-wip-us.apache.org/repos/asf/struts/blob/1ca55b8a/core/src/main/java/org/apache/struts2/dispatcher/ServletRedirectResult.java -- diff --git a/core/src/main/java/org/apache/struts2/dispatcher/ServletRedirectResult.java b/core/src/main/java/org/apache/struts2/dispatcher/ServletRedirectResult.java index 038d8c3..9820295 100644 --- a/core/src/main/java/org/apache/struts2/dispatcher/ServletRedirectResult.java +++ b/core/src/main/java/org/apache/struts2/dispatcher/ServletRedirectResult.java @@ -37,9 +37,8 @@ import org.apache.struts2.views.util.UrlHelper; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; -import java.net.HttpURLConnection; +import java.net.MalformedURLException; import java.net.URI; -import java.net.URLConnection; import java.util.*; import static javax.servlet.http.HttpServletResponse.SC_FOUND; @@ -273,9 +272,28 @@ public class ServletRedirectResult extends StrutsResultSupport implements Reflec */ protected boolean isPathUrl(String url) { try { -return URI.create(url).getScheme() == null; +URI uri = URI.create(url); +if (uri.isAbsolute()) { +uri.toURL(); +if (LOG.isDebugEnabled()) { +LOG.debug("[#0] is full url, not a path", url); +} +return true; +} else { +if (LOG.isDebugEnabled()) { +LOG.debug("[#0] isn't absolute URI, assuming it's a path", url); +} +return false; +} } catch (IllegalArgumentException e) { -LOG.debug("[#0] isn't a valid URL", e, url); +if (LOG.isDebugEnabled()) { +LOG.debug("[#0] isn't a valid URL, assuming it's a path", e, url); +} +return false; +} catch (MalformedURLException e) { +if (LOG.isDebugEnabled()) { +LOG.debug("[#0] isn't a valid URL, assuming it's a path", e, url); +} return false; } }
[1/2] git commit: Uses URL class to check if location is path or full url
Repository: struts Updated Branches: refs/heads/feature/WW-4187-correctly-identify-protocols [created] 1ca55b8a7 Uses URL class to check if location is path or full url Project: http://git-wip-us.apache.org/repos/asf/struts/repo Commit: http://git-wip-us.apache.org/repos/asf/struts/commit/4b7d2e35 Tree: http://git-wip-us.apache.org/repos/asf/struts/tree/4b7d2e35 Diff: http://git-wip-us.apache.org/repos/asf/struts/diff/4b7d2e35 Branch: refs/heads/feature/WW-4187-correctly-identify-protocols Commit: 4b7d2e35d09225a7c8b3b410588131b692b2730f Parents: bcd61a0 Author: Lukasz Lenart Authored: Sun Mar 9 21:46:33 2014 +0100 Committer: Lukasz Lenart Committed: Sun Mar 9 21:46:33 2014 +0100 -- .../dispatcher/ServletRedirectResult.java | 23 ++-- 1 file changed, 16 insertions(+), 7 deletions(-) -- http://git-wip-us.apache.org/repos/asf/struts/blob/4b7d2e35/core/src/main/java/org/apache/struts2/dispatcher/ServletRedirectResult.java -- diff --git a/core/src/main/java/org/apache/struts2/dispatcher/ServletRedirectResult.java b/core/src/main/java/org/apache/struts2/dispatcher/ServletRedirectResult.java index abc69eb..038d8c3 100644 --- a/core/src/main/java/org/apache/struts2/dispatcher/ServletRedirectResult.java +++ b/core/src/main/java/org/apache/struts2/dispatcher/ServletRedirectResult.java @@ -37,6 +37,9 @@ import org.apache.struts2.views.util.UrlHelper; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; +import java.net.HttpURLConnection; +import java.net.URI; +import java.net.URLConnection; import java.util.*; import static javax.servlet.http.HttpServletResponse.SC_FOUND; @@ -262,13 +265,19 @@ public class ServletRedirectResult extends StrutsResultSupport implements Reflec } -private boolean isPathUrl(String url) { -// filter out "http:", "https:", "mailto:";, "file:", "ftp:" -return !url.startsWith("http:") -&& !url.startsWith("https:") -&& !url.startsWith("mailto:";) -&& !url.startsWith("file:") -&& !url.startsWith("ftp:"); +/** + * Checks if url is simple path or either full url + * + * @param url string + * @return true if it's just a path not a full url + */ +protected boolean isPathUrl(String url) { +try { +return URI.create(url).getScheme() == null; +} catch (IllegalArgumentException e) { +LOG.debug("[#0] isn't a valid URL", e, url); +return false; +} } /**
[CONF] Confluence Changes in the last 24 hours
Confluence Changes in the last 24 hours Apache Ambari Pages Page: Adding a New Service to an Existing Cluster edited by Sumit Mohanty [06:18 PM] (View Changes) Apache Camel Pages Page: Camel 1.6.1 Release edited by Christian Mueller [11:20 PM] (View Changes) Page: Camel 1.6.0 Release edited by Christian Mueller [11:17 PM] (View Changes) Page: Camel 2.0.0 Release edited by Christian Mueller [11:16 PM] (View Changes) Page: Camel 2.1.0 Release edited by Christian Mueller [11:14 PM] (View Changes) Page: Camel 2.2.0 Release edited by Christian Mueller [11:12 PM] (View Changes) Page: Camel 2.3.0 Release edited by Christian Mueller [11:10 PM] (View Changes) Page: Camel 2.4.0 Release edited by Christian Mueller [11:09 PM] (View Changes) Page: Camel 2.5.0 Release edited by Christian Mueller [11:07 PM] (View Changes) Page: Camel 2.6.0 Release edited by Christian Mueller [11:05 PM] (View Changes) Page: Camel 2.7.5 Release edited by Christian Mueller [11:02 PM] (View Changes) Page: Camel 2.7.4 Release edited by Christian Mueller [11:00 PM] (View Changes) Page: Camel 2.7.3 Release edited by Christian Mueller [10:58 PM] (View Changes) Page: Camel 2.7.2 Release edited by Christian Mueller [10:56 PM] (View Changes) Page: Camel 2.7.1 Release edited by Christian Mueller [10:50 PM] (View Changes) Page: Camel 2.7.0 Release edited by Christian Mueller [10:46 PM] (View Changes) Page: Camel 2.8.6 Release edited by Christian Mueller [10:26 PM] (View Changes) Page: Camel 2.8.5 Release edited by Christian Mueller [10:24 PM] (View Changes) Page: Camel 2.8.4 Release edited by Christian Mueller [10:23 PM] (View Changes) Page: Camel 2.8.3 Release edited by Christian Mueller [10:22 PM] (View Changes) Page: Camel 2.8.2 Release edited by Christian Mueller [10:20 PM] (View Changes) Page: Camel 2.8.1 Release edited by Christian Mueller [10:19 PM] (View Changes) Page: Camel 2.8.0 Release edited by Christian Mueller [10:17 PM] (View Changes) Page: Camel 2.9.8 Release edited by Christian Mueller [10:15 PM] (View Changes) Page: Camel 2.9.7 Release edited by Christian Mueller [10:14 PM] (View Changes) Page: Camel 2.9.6 Release edited by Christian Mueller [10:13 PM] (View Changes) Page: Camel 2.9.5 Release edited by Christian Mueller [10:12 PM] (View Changes) Page: Camel 2.9.4 Release edited by Christian Mueller [10:09 PM] (View Changes)