Files
EWF/library/server/wsf/src/support/wsf_value_utilities.e

164 lines
5.2 KiB
Plaintext

note
description: "[
Utility routines to handle parameters and convert them as string, list or table values.
]"
date: "$Date$"
revision: "$Revision$"
class
WSF_VALUE_UTILITIES
inherit
ANY
SHARED_WSF_PERCENT_ENCODER
rename
percent_encoder as url_encoder
export
{NONE} all
end
feature -- Smart parameter identification
add_utf_8_string_value_to_table (a_utf_8_name: READABLE_STRING_8; a_utf_8_value: READABLE_STRING_8; a_table: HASH_TABLE [WSF_VALUE, READABLE_STRING_GENERAL])
-- Add a utf-8 string value `a_utf_8_value' associated with name `a_utf_8_name' to `a_table'.
local
utf: UTF_CONVERTER
n,v: READABLE_STRING_32
do
n := utf.utf_8_string_8_to_string_32 (a_utf_8_name)
v := utf.utf_8_string_8_to_string_32 (a_utf_8_value)
add_value_to_table (n, new_string_value (n, v), a_table)
end
add_percent_encoded_string_value_to_table (a_encoded_name: READABLE_STRING_8; a_encoded_value: READABLE_STRING_8; a_table: HASH_TABLE [WSF_VALUE, READABLE_STRING_GENERAL])
-- Add a percent-encoded string value `a_encoded_value' associated with name `a_encoded_name' to `a_table'.
local
v: WSF_STRING
do
v := new_string_value_with_percent_encoded_values (a_encoded_name, a_encoded_value)
add_value_to_table (v.name, v, a_table)
end
add_value_to_table (a_name: READABLE_STRING_GENERAL; a_value: WSF_VALUE; a_table: HASH_TABLE [WSF_VALUE, READABLE_STRING_GENERAL])
-- Add value `a_value' associated with unicode name `a_name' to `a_table'.
local
l_decoded_name: STRING_32
l_encoded_name: READABLE_STRING_8
v: detachable WSF_VALUE
n,k,r,vn: STRING_32
p,q: INTEGER
tb,ptb: detachable WSF_TABLE
do
--| Check if this is a list format such as choice[] or choice[a] or even choice[a][] or choice[a][b][c]...
l_decoded_name := a_name.as_string_32
l_encoded_name := a_value.url_encoded_name
p := l_decoded_name.index_of ({CHARACTER_32}'[', 1)
n := l_decoded_name
if p > 0 then
q := l_decoded_name.index_of ({CHARACTER_32}']', p + 1)
if q > p then
n := l_decoded_name.substring (1, p - 1)
r := l_decoded_name.substring (q + 1, l_decoded_name.count)
r.left_adjust; r.right_adjust
create tb.make (n)
if attached {WSF_TABLE} a_table.item (tb.name) as l_existing_table then
tb := l_existing_table
end
k := l_decoded_name.substring (p + 1, q - 1)
k.left_adjust; k.right_adjust
if k.is_empty then
k.append_integer (tb.count + 1)
end
v := tb
create vn.make_from_string (n)
vn.append_character ({CHARACTER_32}'[')
vn.append (k)
vn.append_character ({CHARACTER_32}']')
from
until
r.is_empty
loop
ptb := tb
p := r.index_of ({CHARACTER_32} '[', 1)
if p > 0 then
q := r.index_of ({CHARACTER_32} ']', p + 1)
if q > p then
if attached {WSF_TABLE} ptb.value (k) as l_tb_value then
tb := l_tb_value
else
create tb.make (n)
ptb.add_value (tb, k)
end
k := r.substring (p + 1, q - 1)
r := r.substring (q + 1, r.count)
r.left_adjust; r.right_adjust
if k.is_empty then
k.append_integer (tb.count + 1)
end
vn.append_character ('[')
vn.append (k)
vn.append_character (']')
end
else
r.wipe_out
--| Ignore bad value
end
end
a_value.change_name (vn)
tb.add_value (a_value, k)
else
--| Missing end bracket
end
end
if v = Void then
a_value.change_name (l_decoded_name)
v := a_value
end
if attached a_table.item (n) as l_existing_value then
if tb /= Void then
--| Already done in previous part
elseif attached {WSF_MULTIPLE_STRING} l_existing_value as l_multi then
l_multi.add_value (v)
elseif attached {WSF_TABLE} l_existing_value as l_table then
-- Keep previous values (most likely we have table[1]=foo, table[2]=bar ..and table=/foo/bar
-- Anyway for this case, we keep the previous version, and ignore this "conflict"
else
a_table.force (create {WSF_MULTIPLE_STRING}.make_with_array (<<l_existing_value, v>>), v.name)
check replaced: a_table.found and then a_table.found_item ~ l_existing_value end
end
else
a_table.force (v, n)
end
end
feature -- Factory
new_string_value (a_name: READABLE_STRING_GENERAL; a_value: READABLE_STRING_GENERAL): WSF_STRING
-- New WSF_STRING value built from unicode `a_name' and `a_value'.
do
create Result.make (a_name, a_value)
end
new_string_value_with_percent_encoded_values (a_encoded_name: READABLE_STRING_8; a_encoded_value: READABLE_STRING_8): WSF_STRING
-- New WSF_STRING value built from utf8+percent encoded `a_encoded_name' and `a_encoded_value'.
do
create Result.make_with_percent_encoded_values (a_encoded_name, a_encoded_value)
end
note
copyright: "2011-2015, Jocelyn Fiat, Javier Velilla, Olivier Ligot, Colin Adams, Eiffel Software and others"
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
source: "[
Eiffel Software
5949 Hollister Ave., Goleta, CA 93117 USA
Telephone 805-685-1006, Fax 805-685-6869
Website http://www.eiffel.com
Customer support http://support.eiffel.com
]"
end