Содержание


Связывание с данными с помощью Castor

Часть 1. Установка и настройка Castor

Настройка и конфигурирование проекта, использующего связывание с данными на основе Castor

Comments

Серия контента:

Этот контент является частью # из серии # статей: Связывание с данными с помощью Castor

Следите за выходом новых статей этой серии.

Этот контент является частью серии:Связывание с данными с помощью Castor

Следите за выходом новых статей этой серии.

Популярность связывания с данными

Одним из наиболее широко обсуждаемых тем в новостных группах XML, списках рассылки и форумах нашего Web-сайта (ссылки можно найти в разделе Ресурсы) является связывание с данными. Разработчики Java и XML во весь голос заявляют о необходимости простого способа преобразования объектов Java в документы XML и обратно.

Лидерство в данной области принадлежит Sun и ее технологии JAXB - архитектуре Java для связывания с XML (Java Architecture for XML Binding). Впрочем, если вы видели другую расшифровку этой аббревиатуры, то не удивляйтесь, Sun меняет их практически ежегодно. К сожалению, JAXB API (или архитектура JAXB, как вам будет угодно) не лишена недостатков, к тому же обновления появляются не слишком часто. Ко всему прочему, она не позволяет отображать объекты на таблицы реляционных баз данных, что является общепризнанной необходимостью.

Появление Castor

В этот момент на сцену выходит Castor - инфраструктура с открытым кодом, которая предоставляет множество возможностей, игнорируемых JAXB. Castor был разработан уже достаточно давно и многое из того, что вошло в JAXB и спецификации Sun по связыванию с данными, изначально появилось в Castor. Позже в Castor были внесены изменения для совместимости с JAXB, чтобы разработчики, недовольные последним, могли перейти на Castor c минимальными сложностями.

Некоторые преимущества Castor

Перед тем как перейти к деталям установки и использования Castor, перечислим несколько причин, по которым имеет смысл попробовать его в деле и подумать о переходе с JAXB.

  • Во-первых, Castor - это полноценная замена JAXB. Другими словами, вы можете полностью перевести ваш проект с JAXB на Castor с минимальными усилиями (хотя нельзя сказать, что функции Castor в точности дублируют JAXB, но они достаточно близки для того чтобы не вызывать проблем даже у новичков).
  • Во-вторых, у Castor шире возможности связывания, позволяющие трансформировать данные из Java в XML и обратно, не используя XML-схему. Его подход к связыванию проще, чем у JAXB. Наконец, поддерживается возможность сохранять и восстанавливать объекты из реляционной базы данных и документов XML.
  • У Castor также есть функции JDO. JDO (Java-объекты данных) - это технология, которая лежит в основе отображения между Java-объектами и реляционными СУБД. JDO уже прошла пик своей популярности, который пришелся на несколько лет назад, но она все еще остается полезной. В конце-концов, JDO - это спецификация Sun, так что вам не придется использовать никакие подозрительные API.

Загрузка Castor

Установка Castor не таит в себе ничего сложного. Для начала зайдите на Web-страницу Castor (ссылка находится в разделе Ресурсы) и нажмите на ссылку Download в меню слева. Далее выберите последний крупный релиз и перейдите вниз к разделу Download sets. Оттуда вы сможете скачать JAR-файлы Castor, DTD, документацию, зависимости и т.д. (все скачивается по отдельности). Проще всего загрузить один из уже сформированных пакетов (рисунок 1).

Рисунок 1. Пакеты для скачивания с Web-сайта Castor
Castor's download sets package their binaries and docs into an easy-to-use single archive
Castor's download sets package their binaries and docs into an easy-to-use single archive

В этой статье мы будем использовать версию 1.1.2.1. Скачайте zip-архив под названием The Castor JARs, docs, DTDs, command line tools, and examples. В него включены файлы JAR, документация и примеры (рисунок 2).

Рисунок 2. Распакованный архив Castor
Castor comes with a number of JAR files, as well as documents and sample programs
Castor comes with a number of JAR files, as well as documents and sample programs

Все должно быть на своем месте

Далее необходимо разместить файлы Castor таким образом, чтобы они были доступы среде Java.

Стандартный вариант размещения Java-библиотек

Очень советую вам определиться с местом на диске, в котором будут храниться все сторонние (third-party) Java-библиотеки. Конечно, они могут быть разбросаны по всей системе, но это будет похоже на страшный сон по ряду причин:

  1. Во-первых, нужную библиотеку будет сложно найти.
  2. Будет трудно понять, какая версия библиотеки используется. Вполне возможно, что разные версии одной библиотеки будут находиться в разных каталогах.
  3. Значение переменной classpath превратится в подлинный кошмар.

В моей системе все библиотеки находятся в /usr/local/java/, причем каждая в собственном под-каталоге, название которого обычно включает версию библиотеки. В общем, сохраните распакованное содержимое архива Castor там, где вы храните библиотеки. В моем случае это будет /usr/local/java/castor-1.1.2.1.

Создайте закладку для ссылки на документацию Castor

При установке любой Java-библиотеки важно найти ссылку на документацию, потому что к ней вам придется обращаться многократно. Большинство библиотек поставляются вместе с локальной копией документации, в том числе JavaDoc, в формате HTML. В случае Castor, ее можно найти в каталоге castor-1.1.2.1/doc/. Поэтому в моей системе можно создать закладку, указывающую на /usr/local/java/castor-1.1.2.1/doc/index.html. Загруженная с локального диска документация для Castor 1.1.2.1 выглядит следующим образом (рисунок 3).

Рисунок 3. Локально загруженная документация Castor
Most of the links in this documentation also refer to local pages
Most of the links in this documentation also refer to local pages

Есть две главные причины, по которым эти моменты заслуживают внимания (причем, как в моей статье, так и в вашей жизни):

  1. К документации теперь есть локальный доступ. Вам приходилось программировать на борту самолета? Или оказываться без доступа к интернету? Например, если WiFi в Starbucks не работает должным образом. В этих ситуациях жизненно важно, чтобы документация была доступна, не говоря уже о том, что доступ к ней будет быстрее.
  2. Есть гарантия, что документация будет соответствовать вашей версии библиотеки. Castor развивается, и не факт, что вы всегда будете использовать последнюю версию. При этом на сайте как правило, выкладывается документация к последней версии, которая не обязательно будет совпадать с вашей в отличие от ранее загруженной локальной копии документации. Поэтому, используя локальную копию, вы избежите путаницы и разочарования от некорректного использования той или иной возможности, которая, ко всему прочему, может вообще не поддерживаться вашей версией библиотеки.

Загрузка зависимостей Castor

Castor зависит от множества библиотек:

  • Apache Ant
  • Jakarta Commons
  • JDBC 2.0 Standard Extensions
  • Log4J утилиты для логгирования
  • Apache Xerces XML-парсер

В этот список вошли только библиотеки, необходимые для основных операций. Если же вы хотите скомпилировать Castor, запустить примеры и тесты или внести какие-то изменения, то вам понадобится гораздо больше. Все эти библиотеки должны находиться в classpath при работе с Castor.

Трудный путь

Прямолинейным решением будет зайти на страницу загрузки Castor и записать версии всех необходимых библиотек. Затем эти версии можно загрузить с сайтов соответствующих библиотек и добавить в classpath. Это займет немало времени, хотя те, кто предпочитает полный контроль над всеми деталями, наверное, предпочтут этот путь. Впрочем, это может быть подходящим решением, если у вас уже установлено и используется большинство из этих библиотек.

Легкий путь

К счастью, есть способ лучше. Вернитесь на страницу загрузки Castor, найдите стабильный релиз и выберите другой пакет для скачивания: Full SVN snapshot: All sources, docs, and 3rd party libraries (big). Он помечен как "big" (большой), но в нем всего 10 МБ (сущий пустяк в мире DSL и кабельного интернета). Скачайте и распакуйте этот архив, его содержимое должно выглядеть как на рисунке 4.

Рисунок 4. Полное содержимое последней версии Castor в SVN
This biggest download set has     everything that Castor offers -- including dependencies!
This biggest download set has everything that Castor offers -- including dependencies!

Если вы откроете папку lib/, то увидите множество JAR-файлов. Это и есть библиотеки, необходимые для работы Castor.

Место для новых библиотек

Создайте новую папку либо там, куда вы скачали дистрибутив Castor, либо где-то рядом, и переместите туда все JAR-файлы зависимостей. Например:

[bmclaugh:~] cd /usr/local/java
[bmclaugh:/usr/local/java] ls
castor-1.1.2.1  xalan-j_2_7_0
[bmclaugh:/usr/local/java] cd castor-1.1.2.1/
[bmclaugh:/usr/local/java/castor-1.1.2.1] ls
CHANGELOG                       castor-1.1.2.1.jar
castor-1.1.2.1-anttasks.jar     doc
castor-1.1.2.1-codegen.jar      jdbc-se2.0.jar
castor-1.1.2.1-ddlgen.jar       jta1.0.1.jar
castor-1.1.2.1-jdo.jar          schema
castor-1.1.2.1-xml.jar
[bmclaugh:/usr/local/java/castor-1.1.2.1] mkdir lib
[bmclaugh:/usr/local/java/castor-1.1.2.1] cd lib
[bmclaugh:/usr/local/java/castor-1.1.2.1/lib] cp ~/downloads/castor-1.1.2.1/lib/*.jar .
[bmclaugh:/usr/local/java/castor-1.1.2.1/lib]

Как видите, я создал папку lib/ внутри каталога Castor и переместил туда все файлы JAR. Теперь Castor готов к использованию.

Настройка пути к файлам классов

Далее необходимо настроить путь к файлам классов (classpath). Для этого я использую файл .profile в своей системе Mac OS X. Вы можете поступить аналогично, или, если вы работаете в Windows, использовать системную переменную окружения. В любом случае в classpath необходимо добавить следующие JAR-файлы:

  • castor-1.1.2.1.jar (в главном каталоге Castor)
  • castor-1.1.2.1-xml.jar (в главном каталоге Castor)
  • xerces-J-1.4.0.jar (в каталоге, в котором вы разместили зависимости Castor)
  • commons-logging-1.1.jar (в каталоге, в котором вы разместили зависимости Castor)

В качестве примера ниже приведено содержимое моего файла .profile:

export JAVA_BASE=/usr/local/java
export JAVA_HOME=/Library/Java/Home
export XERCES_HOME=$JAVA_BASE/xerces-2_6_2
export XALAN_HOME=$JAVA_BASE/xalan-j_2_7_0
export CASTOR_HOME=$JAVA_BASE/castor-1.1.2.1
export EDITOR=vi

export CASTOR_CLASSES=$CASTOR_HOME/castor-1.1.2.1.jar:
                      $CASTOR_HOME/castor-1.1.2.1-xml.jar:
                      $CASTOR_HOME/lib/xerces-J_1.4.0.jar:
                      $CASTOR_HOME/lib/commons-logging-1.1.jar



export CVS_RSH=ssh

export PS1="[`whoami`:\w] "



export CLASSPATH=$XALAN_HOME/xalan.jar:$XALAN_HOME/xml-apis.jar:
                 $XALAN_HOME/xercesImpl.jar:

                 ~/lib/mclaughlin-xml.jar:$CASTOR_CLASSES:.

Убедитесь, что все файлы находятся именно там, где указано в classpath, и затем можно будет приступать к первому пробному запуску.

Поверка корректности установки

Для начала создадим очень простой класс и напишем утилиту, конвертирующую его в XML и обратно в Java. Это отнюдь не демонстрация всех возможностей Castor, а просто элементарный тест. Мы будем использовать класс CD, показанный в листинге 1. Можете создать файл с этим содержимым, сохранив его под именем CD.java, или загрузить по ссылке в разделе Ресурсы.

Листинг 1. Класс CD для проверки установки Castor
package ibm.xml.castor;

import java.util.ArrayList;
import java.util.List;

/** Класс, описывающий CD */
public class CD implements java.io.Serializable {

  /** Название CD */
  private String name = null;

  /** Исполнитель CD */
  private String artist = null;

  /** Список произведений */
  private List tracks = null;

  /** Обязательный конструктор без параметров */
  public CD() {
    super();
  }

  /** Создание нового CD */
  public CD(String name, String artist) {
    super();
    this.name = name;
    this.artist = artist;
  }

  public void setName(String name) {
    this.name = name;
  }

  public String getName() {
    return name;
  }

  public void setArtist(String artist) {
    this.artist = artist;
  }

  public String getArtist() {
    return artist;
  }

  public void setTracks(List tracks) {
    this.tracks = tracks;
  }

  public List getTracks() {
    return tracks;
  }

  public void addTrack(String trackName) {
    if (tracks == null) {
      tracks = new ArrayList();
    }
    tracks.add(trackName);
  }
}

Далее нам понадобится класс для маршаллинга (записи объектов в XML). Код приведен в листинге 2.

Листинг 2. Класс для тестирования маршаллинга
package ibm.xml.castor;

import java.io.FileWriter;

import org.exolab.castor.xml.Marshaller;

public class MarshalTester {

  public static void main(String[] args) {
    try {
      CD sessions = new CD("Sessions for Robert J", "Eric Clapton");
      sessions.addTrack("Little Queen of Spades");
      sessions.addTrack("Terraplane Blues");

      FileWriter writer = new FileWriter("cds.xml");
      Marshaller.marshal(sessions, writer);
    } catch (Exception e) {
      System.err.println(e.getMessage());
      e.printStackTrace(System.err);
    }
  }
}

И, наконец, в листинге 3 приведен класс для демаршаллинга (восстановления объектов из XML).

Листинг 3. Класс для тестирования демаршаллинга
package ibm.xml.castor;

import java.io.FileReader;
import java.util.Iterator;
import java.util.List;

import org.exolab.castor.xml.Unmarshaller;

public class UnmarshalTester {

  public static void main(String[] args) {
    try {
      FileReader reader = new FileReader("cds.xml");
      CD cd = (CD)Unmarshaller.unmarshal(CD.class, reader);
      System.out.println("CD title: " + cd.getName());
      System.out.println("CD artist: " + cd.getArtist());
      List tracks = cd.getTracks();
      if (tracks == null) {
        System.out.println("No tracks.");
      } else {
        for (Iterator i = tracks.iterator(); i.hasNext(); ) {
          System.out.println("Track: " + i.next());
        }
      }
    } catch (Exception e) {
      System.err.println(e.getMessage());
      e.printStackTrace(System.err);
    }
  }
}

Скомпилируйте эти классы следующим образом:

[bmclaugh:~/Documents/developerworks/castor] javac -d . *.java
Note: CD.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.

Это предупреждение выдается компилятором Java 5 и выше, сигнализируя о том, что вы не используете параметризованные типы в CD.java. Не волнуйтесь, это не страшно. Теперь можно запустить наш класс, тестирующий работу маршаллера:

[bmclaugh:~/Documents/developerworks/castor] java ibm.xml.castor.MarshalTester

Далее, если вы найдете и посмотрите внутрь файла cds.xml, то увидите следующее:

<?xml version="1.0" encoding="UTF-8"?>
<CD>
  <artist>Eric Clapton</artist>
  <name>Sessions for Robert J</name>
  <tracks xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:type="java:java.lang.String">Little Queen of Spades</tracks>
  <tracks xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:type="java:java.lang.String">Terraplane Blues</tracks>
</CD>

Формат файла не очень удобочитаемый, но, как видите, все данные объектов, созданные в MarshalTester, присутствуют в XML.

Осталось проверить, что этот документ XML можно преобразовать обратно в Java-объекты. Запустите проверку демаршаллинга:

[bmclaugh:~/Documents/developerworks/castor] java ibm.xml.castor.UnmarshalTester 
CD title: Sessions for Robert J
CD artist: Eric Clapton
Track: Little Queen of Spades
Track: Terraplane Blues

Вывод говорит сам за себя. Если Castor выводит эту информацию, это означает, что он успешно нашел и прочитал XML-файл и преобразовал его в Java-классы.

Если у вас все получилось, а именно: такой же файл cds.xml и вывод UnmarshalTester, то можно считать, что Castor установлен корректно. Несмотря на то, что мы не сделали ничего особенно сложного, этого достаточно, чтобы убедиться, что все JAR-файлы находятся на своих местах и Castor готов к работе.

Что дальше?

Итак, у нас есть рабочая среда Castor. Более того, из листингов 1, 2 и 3 вы уже должны были получить базовое представление о том, как работает Castor. Попробуйте поэкспериментировать с сохранением и восстановлением объектов самостоятельно. В следующей статье мы подробнее поговорим о возможностях Castor и о том, как использовать файлы отображения. А пока просто получайте удовольствие.


Ресурсы для скачивания


Похожие темы

  • Посетите Web-сайт Castor, в котором собраны все необходимые материалы. (EN)
  • Если вы только начинаете изучать XML, то посетите сайт xml.com, содержащий множество материалов по XML для начинающих. (EN)
  • Скачайте ознакомительные версии программного обеспечения IBM: используйте в вашем следующем проекте ознакомительные версии ПО, которые можно скачать прямо с сайта IBM developerWorks. (EN)

Комментарии

Войдите или зарегистрируйтесь для того чтобы оставлять комментарии или подписаться на них.

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=XML, Технология Java
ArticleID=345981
ArticleTitle=Связывание с данными с помощью Castor: Часть 1. Установка и настройка Castor
publish-date=10172008