Четвер, 25 червня 2009 р.
JPA в Google App Engine
Субота, 9 травня 2009 р.
Помилки в логах JBoss
Щоб привести це в порядок, потрібно сворити файл logger.properties приблизно наступного виду
# Default global logging level:
.level= INFO
# Write to a file:
handlers= java.util.logging.FileHandler
# Write log messages in XML format:
java.util.logging.FileHandler.formatter = java.util.logging.XMLFormatter
# Log to the current working directory, with log files named solrxxx.log
java.util.logging.FileHandler.pattern = /solr%u.log
і підправити опці з якими стартує JBoss. JAVA_OPTS=%JAVA_OPTS% -Djava.util.logging.config.file=/logging.properties
Четвер, 5 березня 2009 р.
Розбираємо результат Yahoo geocodes
Результат цей сервіс повертає в XML форматі.
<?xml version="1.0"?>
<ResultSet xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="urn:yahoo:maps"
xsi:schemaLocation="urn:yahoo:maps http://api.local.yahoo.com/MapsService/V1/GeocodeResponse.xsd">
<Result precision="zip">
<Latitude>50.441380</Latitude>
<Longitude>30.522495</Longitude>
<Address></Address>
<City>Kiev</City>
<State>Ukraine</State>
<Zip></Zip>
<Country>UA</Country>
</Result>
</ResultSet>Щоб дістати значення Latitude і Longitude використаємо XPath. Так як в xml вказаний namespace, то потрібно врахувати це при створені документуDocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
domFactory.setNamespaceAware(true); //вмикаємо підтримку namespace
DocumentBuilder builder = domFactory.newDocumentBuilder();
Document doc = builder.parse(inputStream);
а також при написанні xpath запиту - хоч в самому xml документі перфікс дефолтового namespace не вказується для тегів, при написанні xpath запитів їх потрібно вкзувати. В нашому випадку превіксом являється urn:yahoo:maps. Таким чином запит для отримання значення Latitude буде мати вигляд//urn:yahoo:maps:Result/urn:yahoo:maps:LatitudeЧасом в результаті може бути кілька записів, наприклад в різних країнах можуть бути міста з однаковою назвою. В такому випадку до запиту можна добавити фільтр який буде вибирати тільки результати з України//urn:yahoo:maps:Result/urn:yahoo:maps:Latitude[following-sibling::urn:yahoo:maps:State='Ukraine']
Четвер, 22 січня 2009 р.
Налаштування прінтера HP 1018 в MacOSX 10.4
arm2hpdl sihp1018.img > sihp1018.dlТепер тільки залишилося відправити цей файл на прінтер, для цього виконуємо командуlp -oraw sihp1018.dlЄдиний мінус - останню команду потрібно буде виконувати кожен раз коли включаєте прінтер.
Неділя, 16 листопада 2008 р.
Підключаємося до транзакції
public class MyResourceSynchronization implements Synchronization{
public void beforeCompletion() {
myResource.validate();
}
public void afterCompletion(int status) {
if(status==Status.STATUS_ROLLEDBACK)
myResource.rollback();
else
myResource.commit();
}}і чіпляємо його до транзакції наспуним чином TransactionManager manager=(TransactionManager)sessionContext.getUserTransaction();
manager.getTransaction().registerSynchronization(new MyResourceSynchronization());
Середа, 5 листопада 2008 р.
Toplink Essentials в Resin 2 і не тільки
В продовження теми Toplink Essentials on Caucho Resin.
Як відомо Toplink Essentials являється Reference Implementation специфікації JPA і тому підтримує буквально два сервери - це SunAS9 i OC4J_10_1_3. Щоб пересвітчитись достатньо заглянути в клас oracle.toplink.essentials.config.TargetServer. З рештою серверів Toplink працює як в середовищі без підтримки JTA (при коміті ejb транзакції Toplink зміни в базу не синхронізує).
Щоб добавити підтримку JTA для свого сервера потрібно створити два класи - перший це клас, що серверну платформу і повинен реалізовувати інтерфейс oracle.toplink.essentials.platform.server.ServerPlatform, як початковуреалізацію можна взяти клас oracle.toplink.essentials.platform.server.ServerPlatformBase. Головним методом в цьому класі є getExternalTransactionControllerClass, який повертає клас що вміє для конкретного сервера шукати референс на javax.transaction.TransactionManager. В нашому випадку це другий клас який потрібно сворити і наслідує він oracle.toplink.essentials.transaction.JTATransactionController.
Назвемо перший клас ResinServerPlatform, а другий ResinTransactionController. ResinTransactionController повинен переопреділити метод acquireTransactionManager наступним чином
protected TransactionManager acquireTransactionManager() throws Exception {
return (TransactionManager)jndiLookup("java:comp/UserTransaction");
}Тепер залишилося в persistence.xml прописати для властивості toplink.target-server значення ResinServerPlatform.
Я не наводжу повних кодів для класів, так як достатньо в сорцах подивитися на реалізацю oracle.toplink.essentials.platform.server.sunas.SunAS9ServerPlatform та oracle.toplink.essentials.transaction.sunas.SunAS9TransactionController і все стане зрозуміло.