barbitoff programmer`s blog

Здесь я публикую заметки из программерской жизни: грабли, на которые мне случилось наступить, проблемы, для которых было найдено элегантное (или не очень) решение, а также все, с чем мне пришлось столкнуться и чем хотелось бы поделиться =)
PS Если хотите меня поблагодарить - на странице есть 3 места, чтобы это сделать =)

пятница, 30 августа 2013 г.

Acegi Security на Weblogic 10: постоянный редирект на страницу логина

Проблема

В приложении используется Acegi Security 1.0.7 (приложение построено с помощью Wavemaker 6.5.3), приложение разворачивается на Weblogic 10.3.5. При попытке залогиниться пользователь постоянно редиректится на страницу входа (но без сообщения о неуспешной авторизации, т.е. ситуация отличается от таковой при неверном логине/пароле).

Причина

В браузере хранится 2 cookie с именем JSESSIONID.

Решение 

Удалить все куки с именем JSESSIONID и снова попробовать зайти.

суббота, 24 августа 2013 г.

WSO2 ESB: особенность использования FORCE_ERROR_ON_SOAP_FAULT=true

Если установить свойство FORCE_ERROR_ON_SOAP_FAULT в true:
<property action="set" name="FORCE_ERROR_ON_SOAP_FAULT"
scope="default" type="STRING" value="true"/>
то полученный от конечного сервиса SOAP Fault приведет к вызову faultSequence. Проблема такого подхода в том, что тело ответа от сервиса в таком случае будет недоступно (по крайней мере при логировании с уровнем full в лог пишется Envelope запроса, а не ответа).

четверг, 22 августа 2013 г.

Oracle + Weblogic connection pool: задание схемы по-умолчанию

Недавно писал про организацию пула соединения с БД в приложении, развертываемом на Weblogic (http://barbitoff.blogspot.ru/2013/07/weblogic-1035-connection-pooling.html). Xml-конфигурация пула позволяет задать все параметры соединения, кроме имени используемой схемы. Хардкодить имя схемы в SQL-запросах не хочется, как и изобретать велосипед с подтягиванием имени схемы из какого-то своего отдельного конфига. Выход - использовать в SQL схему по-умолчанию (т.е. не задавать имя схемы вообще) и воспользоваться таким параметром пула, как "init-sql". В этом параметре нужно указать SQL-запрос, который при инициализации соединения с БД поменяет схему по-умолчанию на необходимую нам. Этот SQL зависит от используемой СУБД, для Oracle он выглядит так:
  <jdbc-connection-pool-params>
    <max-capacity>20</max-capacity>
    <connection-reserve-timeout-seconds>25</connection-reserve-timeout-seconds>
    <test-table-name>SQL SELECT 1 FROM DUAL</test-table-name>
    <init-sql>SQL ALTER SESSION SET CURRENT_SCHEMA = USR</init-sql>  </jdbc-connection-pool-params>

четверг, 15 августа 2013 г.

dojo: преобразование даты в строку

Если нужно преобразовать дату в строку в ISO-формате, можно использовать dojo.date.stamp:
dojo.require("dojo.date.stamp");
var dateIsoStr = dojo.date.stamp.toISOString(new Date());
Вообще же, чтобы отформатировать дату в произвольном формате, нужен dojo/date/locale:
dojo.require("dojo.date.locale");    
var dateStr = dojo.date.locale.format(new Date(), {selector: "date", datePattern: "MM/dd/yyyy hh:mm a"});    

вторник, 13 августа 2013 г.

JScript Folder Object: итерация по файлам в папке

Ниже приведен пример того, как в JScript можно итерироваться по файлам в некоторой папке:
var FSO = WScript.CreateObject("Scripting.FileSystemObject");
var folder = FSO.GetFolder("C:/path/to/folder");
var filesEnumerator = new Enumerator(folder.Files);
for (; !filesEnumerator.atEnd(); filesEnumerator.moveNext()) {
var file = filesEnumerator.item();
// работа с файлом file
}

пятница, 9 августа 2013 г.

Team Foundation Server Command-Line Tools: получение номера последнего changeset'а

tf history "$/path/to/some/foler/to/get/last/changeset" /noprompt /recursive /stopafter:1

Регулярные выражения в Java и неразрывный пробел (00A0)

Класс символов "\s" не включает в себя неразрывный пробел (символ с Unicode-кодом 00A0). Так что в случае, когда необходимо его обрабатывать также, как остальные пробельные символы, приходится указывать его явно, например, такой фрагмент паттерна: 
[\u00A0\s]+
соответствует последовательности из 1 и более пробельных символов ( \t\n\x0B\f\r) или неразрывных пробелов. 
Соответственно, если нужно выбрать последовательность непробельных символов, не содержащих также и неразрывных пробелов, необходимо использовать такую конструкцию:
[\S&&[^\u00A0]]+

среда, 7 августа 2013 г.

XMLBeans: "java.lang.RuntimeException: DOM Level 3 Not implemented" при использовании bean.getDomNode().getTextContent()

Имплементация DOM, используемая в XmlBeans, не поддерживает данный метод, поэтому приходится идти в обход, получая всех потомков узла и извлекая текст из них. Например:
        NodeList childNodes = element.getChildNodes();
        StringBuilder strBldr = new StringBuilder();
        for(int x=0; x<childNodes.getLength(); x++) {
            Node childNode = childNodes.item(x);
            if(childNode.getNodeType() == Node.TEXT_NODE) {
                strBldr.append(childNode.getNodeValue());
            }
        }
Спасибо http://stackoverflow.com/questions/12746038/why-do-i-get-a-dom-level-3-not-implemented-error-at-run-time.

mvn внутри bat-файлов

Если просто использовать mvn внутри bat-файла, выполнение батника завершится сразу после того, как выполнится mvn, все последующие команды будут проигнорированы. Выход - использовать:
call mvn ...