Thursday, August 4, 2011

Добавляем кастомные функции в BeanShell

Исходя из предыдущего поста, возинкла необходимость написания простейшей функции, которая бы приписывала нолик к входному значению, в случае, если это значение меньше 10.
Два дня копала форумы, ничего не нашла.
А всего-то надо было почитать про BeanShell!!!!

Решение оказалось банальным до безобразия.

add( a, b )
{
return a + b;
}

foo = add(1, 2); // 3
foo = add("Oh", " baby"); // "Oh baby"

Итак, результирующий код выглядит следующим образом:

Calendar cal=Calendar.getInstance(TimeZone.getTimeZone("America/Los_Angeles"));

Conv(val)
{
String m = "";

if (val<10)

{
m = "0" + String.valueOf(val);
}

else
{
m =String.valueOf(val);
}

return m;
}

String newTime = Conv(cal.get(Calendar.YEAR)) + "-" + Conv(cal.get(Calendar.MONTH)+1) + "-" + Conv(cal.get(Calendar.DAY_OF_MONTH)) + "T" + Conv(cal.get(Calendar.HOUR_OF_DAY)) + "%3A" + Conv(cal.get(Calendar.MINUTE)) + "%3A" + Conv(cal.get(Calendar.SECOND)) + "Z";

vars.put("myTime", newTime);


Примечание! Если использовать Calendar cal=Calendar.getInstance() то у вас будет использоваться ваше _ЛОКАЛЬНОЕ_ время.
Мне это не подходило, т.к. объекты на сервере должны были создаваться по серверному времени.
Проблему решил перевод в формат UTC. Я использовала метод TimeZone.getTimeZone("America/Los_Angeles")) (список временных зон можно посмотреть вот здесь )
Однако, многим не нравится использование метода getTimeZone(), потому есть альтернативное решение.

Да, и ещё! Не забывайте о правильном использовании галочки "Encode?" в параметрах.
Если используются URL escape characters, то эту галочку ставить не нужно!