From 53f4f6459675ed41ebb5bfbf3cca53deb6818e1e Mon Sep 17 00:00:00 2001 From: Jocelyn Fiat Date: Fri, 21 Oct 2016 19:39:42 +0200 Subject: [PATCH] Added feature to manipulate easily the chain of filters. --- library/server/wsf/router/filter/wsf_filter.e | 35 +++++++++++++++++-- .../server/wsf/router/filter/wsf_filtered.e | 18 ++++------ 2 files changed, 40 insertions(+), 13 deletions(-) diff --git a/library/server/wsf/router/filter/wsf_filter.e b/library/server/wsf/router/filter/wsf_filter.e index 9e4ea502..66922784 100644 --- a/library/server/wsf/router/filter/wsf_filter.e +++ b/library/server/wsf/router/filter/wsf_filter.e @@ -1,6 +1,5 @@ note description: "Objects than can pre-process incoming data and post-process outgoing data." - author: "Olivier Ligot" date: "$Date$" revision: "$Revision$" @@ -9,9 +8,23 @@ deferred class feature -- Access - next: detachable WSF_FILTER + next: detachable WSF_FILTER assign set_next -- Next filter + last: WSF_FILTER + -- Last filter in the chain following `next'. + do + from + Result := Current + until + not attached Result.next as l_next + loop + Result := l_next + end + ensure + is_closing: Result /= Void and then Result.next = Void + end + feature -- Element change set_next (a_next: like next) @@ -22,6 +35,24 @@ feature -- Element change next_set: next = a_next end + append (a_filter: attached like next) + -- Append `a_filter' to the `last' filter. + do + last.set_next (a_filter) + end + + insert_after (a_filter: attached like next) + -- Append `a_filter' to the `last' filter. + local + f: like next + do + f := next + set_next (a_filter) + if f /= Void then + a_filter.append (f) + end + end + feature -- Basic operations execute (req: WSF_REQUEST; res: WSF_RESPONSE) diff --git a/library/server/wsf/router/filter/wsf_filtered.e b/library/server/wsf/router/filter/wsf_filtered.e index 0ac3c60d..6d41a412 100644 --- a/library/server/wsf/router/filter/wsf_filtered.e +++ b/library/server/wsf/router/filter/wsf_filtered.e @@ -29,22 +29,19 @@ feature {NONE} -- Initialization deferred end + append_filter (a_filter: WSF_FILTER) + -- Append `a_filter' to the end of the `filter' chain. + do + filter.append (a_filter) + end + append_filters (a_filters: ITERABLE [WSF_FILTER]) -- Append collection `a_filters' of filters to the end of the `filter' chain. local f: like filter l_next_filter: detachable like filter do - from - f := filter - l_next_filter := f.next - until - l_next_filter = Void - loop - f := l_next_filter - l_next_filter := f.next - end - check f_attached_without_next: f /= Void and then f.next = Void end + f := filter.last across a_filters as ic loop @@ -59,5 +56,4 @@ feature -- Access filter: WSF_FILTER -- Filter - end