barbitoff programmer`s blog

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

среда, 19 июня 2013 г.

Развертывание war-ника из Wavemaker на Weblogic 10.3.5

Развертывание WAR-ников, созданных Wavemaker'ом, на Weblogic имеет некоторые особенности, которые, впрочем, связаны не с самим Wavemaker'ом, а с используемыми в создаваемых приложениях библиотеками.
Первая ошибка, возникающая при работе Grid-виджета, связана с библиотекой Apache Commons Lang:
java.lang.NoSuchMethodError: org.apache.commons.lang.StringUtils.join(Ljava/util/Collection;C)Ljava/lang/String;
Проблема знакомая (Commons Lang цепляется не из приложения, а из weblogic'а), лечится добавлением в war-ник в папку WEB-INF дескриптора weblogic.xml со следующим содержимым:
<!DOCTYPE weblogic-web-app PUBLIC "-//BEA Systems, Inc.//DTD Web Application 8.1//EN" "http://www.bea.com/servers/wls810/dtd/weblogic810-web-jar.dtd">
<weblogic-web-app>
  <description>Weblogic Webapp</description>
      <container-descriptor>
        <prefer-application-packages>      
            <package-name>org.apache.commons.*</package-name>
        </prefer-application-packages>
    </container-descriptor>
</weblogic-web-app>
Однако после этого вылезает другая проблема, на этот раз уже из-за Hibernate:
ClassNotFoundException: org.hibernate.hql.ast.HqlToken
Тут уже пришлось немного погуглить, и, спасибо http://blog.inflinx.com/2007/09/05/classnotfoundexception-orghibernatehqlasthqltoken-in-weblogic/, решение отыскалось, на этот раз не совсем очевидное. Заключается оно также в модификации weblogic.xml, который в итоге принял вид:
<!DOCTYPE weblogic-web-app PUBLIC "-//BEA Systems, Inc.//DTD Web Application 8.1//EN" "http://www.bea.com/servers/wls810/dtd/weblogic810-web-jar.dtd">
<weblogic-web-app>
  <description>Weblogic Webapp</description>
      <container-descriptor>
        <prefer-application-packages>      
            <package-name>org.apache.commons.*</package-name>
            <package-name>antlr.*</package-name>
        </prefer-application-packages>
    </container-descriptor>
</weblogic-web-app>
Чтобы каждый раз не добавлять weblogic.xml в war-ник руками перед развертыванием, можно его вшить в проект Wavemaker с помощью вкладки "Source" -> "Resources", добавив его в папку webapproot/WEB-INF:


Java: генерация UUID

 java.util.UUID.randomUUID().toString()

Wavemaker: отображение CLOB-колонок из Oracle в Grid-виджете

Если просто импортировать таблицу в Wavemaker и создать из неё Grid, то в CLOB колонках будут показываться пустые значения (как и в соотв. полях при редактировании записей). Чтобы CLOB начал отображаться, нужно зайти в настройки БД, кликнув дважды по имени БД на вкладке "Services", и сменить для CLOB-колонки тип с "clob" на "text":


воскресенье, 16 июня 2013 г.

Развертывание war-ников на Weblogic 10.3.5 из Netbeans 7.3

Проблема

Netbeans 7.3 при развертывании war-ника на Weblogic 10.3.5 висит по пять минут на "Waiting for server to start the module...". При этом, приложение уже реально стартануло (видно через console, отвечает на запросы). 

Причина

Соотв. баг заведен в багтрекере NB (https://netbeans.org/bugzilla/show_bug.cgi?id=228419) и будет исправлен в 7.4. Проявляется он только при отсутствии в war-нике index.jsp в корне. Отсюда и workaround для проблемы - добавить index.jsp с любым содержимым в корень приложения.

Oracle: аналог AUTO_INCREMENT в MySQL

В Oracle автогенерация целочисленных идентификаторов, реализуемая в MySQL посредством модификатора AUTO_INCREMENT, выполняется по схеме sequence + trigger, т.е.:
  1. Создаем таблицу с целочисленным первичным ключом, например:
    CREATE TABLE my_table(
         my_id NUMBER(16),
         CONSTRAINT my_id_pk PRIMARY KEY (my_id)
    )
  2. Создаем последовательность:
    CREATE SEQUENCE my_id_seq;
  3. Создаем триггер:
    DELIMITER /
    CREATE OR REPLACE TRIGGER my_id_trg
         BEFORE INSERT ON my_table FOR EACH ROW
    BEGIN
         IF :NEW.my_id IS NULL THEN
              SELECT my_id_seq.NEXTVAL INTO :NEW.my_id FROM DUAL;
         END IF;
    END;
    /

JNDI-браузер

Если нужно посмотреть, что лежит в JNDI, можно воспользоваться утилитой "JNDI Warrior" (распространяется по Apache License 2.0): http://sourceforge.net/projects/jndi-warrior/?source=dlp.


вторник, 11 июня 2013 г.

Кодирование не-ASCII символов в теме email

Кодирование не-ASCII символов в теме email-сообщения выполняется в соответствии с RFC 2047. Заголовок представляется в виде одной или нескольких последовательностей следующего формата:
=?<charset>?<encoding>?<data>?<possibly repeated>?=
Здесь charset - кодировка, а encoding - способ представления закодированного текста (последовательности байт): B означает base64, Q - quoted printable.
Например:
=?UTF8?B?0J3QsNC/0YDQsNCy0LvQtdC9INC00L7QutGD0LzQtdC90YI6IA==?=
- это результат кодирования строки "Направлен документ: " с помощью кодировки utf8 и последующего представления последовательности байт в виде base64.