barbitoff programmer`s blog

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

понедельник, 28 октября 2013 г.

Java 7: Comparison method violates its general contract

После перехода с Java 6 на 7 одна из используемых приложением библиотек стала валиться с:
java.lang.IllegalArgumentException: Comparison method violates its general contract!
Причина кроется в том, что в семерке переработана имплементация алгоритма сортировки, используемая в java.util.Arrays.sort и java.util.Collections.sort, и в случае некорректной реализации интерфейса Comparable она может генерировать данное исключение. Под некорректной понимается реализация, неконсистентная с реализацией equals() (например, если для некоторых эквивалентных объектов она возвращает значение, отличное от 0). Найти эту информацию можно в заметках о совместимости Java 7
Выход - переписать реализацию Comparable (в моем случае - не вариант, т.к. библиотека сторонняя и закрытая) либо воспользоваться системным свойством "java.util.Arrays.useLegacyMergeSort", позволяющим переключиться на старую имплементацию сортировки (сказать по правде, не пробовал, т.к. просто вернулся на JDK 6).
ЗЫ Спасибо http://www.yossale.com/?p=355.

вторник, 15 октября 2013 г.

Windows: ошибка "Windows cannot access \\server\share"

Проблема

При попытке открыть сетевую папку на некотором сервере возникает ошибка:



Причем даже не происходит запроса логина / пароля, а сразу отображается ошибка об отсутствии прав.

Причина

Логин / пароль для доступа к данное сетевой папке сохранены, но они либо неверны, либо у соответствующего пользователя действительно нет прав на эту папку. 

Решение

Идем в Control Panel --> Credential Manager, удаляем сохраненные логин / пароль. Стучимся в шару еще раз, вводим верные логин / пароль от пользователя, имеющего права на шару. 

ЗЫ

Практически одновременно с этой проблемой наткнулся на еще одну. Пытаюсь примонтировать сетевой диск, используя некоторый логин / пароль. Винда выдает ошибку, что якобы данный диск уже смонтирован с системе, но с "different credentials". При это в "Моем компьютере" я этого диска не вижу (иначе я конечно не стал бы монтировать его еще раз). Однако, этот диск видно через команду "net use", поэтому нужно его предварительно отмонтировать (а также отмонтировать все шары на данном сервере, т.к. они вероятнее всего также смонтированы с теми же "different credentials", и без их отмонтирования получим ту же ошибку):
net use \\server\share1 /DELETE
net use \\server\share2 /DELETE
net use \\server\share3 /DELETE
После чего уже можно произвести монтирование нужного нам сетевого диска, хоть через UI, хоть через "net use".

воскресенье, 6 октября 2013 г.

WSO2 ESB: вызов sequence с игнорированием ошибок

Задача

Вызвать один sequence из другого так, чтобы ошибка внутри вложенного sequence (например, сетевая ошибка при выполнении callout-медиатора) не приводила к ошибке наружного.

Решение

Т.к. средствами sequence-медиатора такое поведение нереализуемо, пришлось вызывать sequence из groovy-кода. Данная операция требует некоторых манипуляций с axis-контекстом, передаваемым вызываемой sqeucence. Немного длинно, но работает:
  <script language="groovy"><![CDATA[ import org.apache.commons.logging.LogFactory; import org.apache.synapse.core.axis2.Axis2MessageContext; try { /* create Axis2MessageContext, as ScriptMessageContext often can't be used to call this sequence - for example callout mediator in it will fail */ def mc2 = new Axis2MessageContext(new org.apache.axis2.context.MessageContext(),mc.getConfiguration(), mc.getEnvironment()); // copy existing envelope def newEnvelope = org.apache.axiom.om.util.CopyUtils.copy(mc.getEnvelope()); mc2.setEnvelope(newEnvelope); // propagate some properties to child context mc2.setProperty("prop1", mc.getProperty("prop1")); // force child sequence to use proxy-service logger mc2.setServiceLog(LogFactory.getLog("SERVICE_LOGGER.ProxyServiceName")); // execute child sequence mc.getSequence("ChildSequenceName").mediate(mc2); // restore envelope mc.setEnvelope(mc2.getEnvelope()); // restore some properties mc.setProperty("prop2", mc2.getProperty("prop2")); } catch(Exception ex) { LogFactory.getLog("SERVICE_LOGGER.ProxyServiceName").warn("Child sequence failed, continuing",ex); } ]]></script>