Меню
Главная
Авторизация/Регистрация
 
Главная arrow Прочее arrow Проектирование сервисов для сервис-ориентированной архитектуры: сервисы online обработки заказа товаров с учетом кредитоспособности покупателя

Класс XindiceHelper

Вспомогательный класс net.sf.dmitrygusev.webseller.data.XindiceHelper предоставляет уровень абстракции для работы с сервисами БД, такими как org.xmldb.api.modules.XPathQueryService, org.xmldb.api.modules.XUpdateQueryService и интерфейсом org.xmldb.api.base.Collection как с основными команд управления данными языка SQL - select/insert/update/delete, предоставляя одноименные методы. В качестве языка выборки здесь используется XPath, в качестве языка изменения данных - XUpdate.

Класс WebSellerDBHandler

Этот класс является SOAP Handler'ом для web-службы WebSellerDB, который перехватывает вызовы службы, перенаправляя запросы БД классу XindiceHelper, он изменяет фактические SOAP-сообщения, заполняя их данными.

Приведем пример добавления документа заказа в БД и опишем последовательность действий.

Вызов web-службы осуществляется в обычном порядке (либо используя клиентские заглушки в случае JAX-RPC клиента, либо активностью invoke языка BPEL);

public static Order createOrder()

{

Customer customer = new Customer("testCustomerID", "testPersonalID",

"Test Customer Name");

CartItem[] cartItems = {

new CartItem(

new Product("testProductID1",

new BigDecimal(10), "testDescription1"), 1),

new CartItem(

new Product("testProductID2",

new BigDecimal(29), "testDescription2"), 2)

};

Cart cart = new Cart("Test Shop Name", cartItems);

Order order = new Order("fakedOrderID",

OrderState.fromString(OrderState._PENDING), customer, cart);

return order;

}

...

//Вызов web-службы

String orderID = getWebSellerDB().addOrder(new SingleOrderBox(createOrder()));

Здесь необходимо обратить внимание на то, что фактический идентификатор заказа не известен на момент вызова и должен быть возвращен в качестве результата методом addOrder().

Этот вызов будет перехвачен SOAP Handler'ом WebSellerDBHandler. Для операции addOrder() будет выполнен этот код:

if (!isJustDebug() && "addOrder".equals(operationName))

{

Node singleOrderBoxNode = requestMessage.getSOAPBody().getFirstChild();

Node orderNode = singleOrderBoxNode.getFirstChild();

String orderXml = orderNode.toString();

String resourceID = addOrder(orderXml);

В этом коде из SOAP-сообщения мы получаем строковое представление XML-документа заказа, сформированного на клиенте, и вызываем метод WebSellerDBHandler.addOrder() - добавления заказа в БД:

private String addOrder(String orderXml) throws XMLDBException

{

//Add this order to the database

String resourceID = XindiceHelper.getInstance().insert(orderXml);

updateOrderState(resourceID, OrderState.PENDING);

return resourceID;

}

Используя класс XindiceHelper, документ сохраняется в БД и возвращается идентификатор этого документа. Далее этот идентификатор необходимо поместить в оригинальный SOAP-запрос, чтобы получить доступ к этому значению в методе web-службы WebSellerDBSoapBindingImpl.addOrder():

orderXml = replaceWithRealOrderID(orderXml, resourceID);

replaceSoapBody(requestMessage, boxOrderXml("singleOrderBox", orderXml));

Далее этот запрос отправиться далее по цепочке SOAP Handler'ов и дойдет до фактического метода web-службы:

public String addOrder(SingleOrderBox orderBox)

throws RemoteException, StorageFault

{

//The order is already stored in the database with WebSellerDBHandler.

//OrderBox.getOrder().getOrderID() is the order database real ID now.

return orderBox.getOrder().getOrderID();

}

В итоге клиенту вернется фактический идентификатор этого документа в БД.

Обратите внимание на вызов метода updateOrderState() в методе addOrder():

private String addOrder(String orderXml) throws XMLDBException

{

//Add this order to the database

String resourceID = XindiceHelper.getInstance().insert(orderXml);

updateOrderState(resourceID, OrderState.PENDING);

return resourceID;

}

Метод updateOrderState() выполняет изменение статуса документа заказа, выполняя XUpdate запрос к БД:

public static void updateOrderState(String orderID, OrderState newOrderState)

throws XMLDBException

{

String xupdate =

"<xu:modifications version="1.0"" +

" xmlns:xu="http://www.xmldb.org/xupdate"" +

">" +

"<xu:update select="//order/state">" +

newOrderState.getValue() +

"</xu:update>" +

"</xu:modifications>";

XindiceHelper.getInstance().update(orderID, xupdate);

}

Механизм выборки данных из БД и подмена фактического ответа SOAP-сообщения, по сути, не отличаются от выше изложенного:

private String getOrdersByCustomerID(String customerID)

throws XMLDBException, Exception

{

StringBuffer orderSequence = new StringBuffer();

QName[] namespaces = null;

String xpath = "//order[customer/customerID='" + customerID + "']";

ResourceIterator results = XindiceHelper.getInstance().select(xpath, namespaces);

while (results.hasMoreResources()) {

Resource res = results.nextResource();

String orderXml = getCleanOrderXml((String) res.getContent());

orderSequence.append(orderXml);

}

return boxOrderXml("multipleOrderBox", orderSequence.toString());

}

Для запроса к базе используется XPath. Здесь метод getCleanOrderXml() убирает метаинформацию из результата запроса и формирует строковое XML-представление документа заказа, которое можно будет помещать SOAP-ответ.

 
< Предыдущая   СОДЕРЖАНИЕ   Следующая >
 
Предметы
Агропромышленность
Банковское дело
БЖД
Бухучет и аудит
География
Документоведение
Естествознание
Журналистика
Инвестирование
Информатика
История
Культурология
Литература
Логика
Логистика
Маркетинг
Математика, химия, физика
Медицина
Менеджмент
Недвижимость
Педагогика
Политология
Политэкономия
Право
Психология
Региональная экономика
Религиоведение
Риторика
Социология
Статистика
Страховое дело
Техника
Товароведение
Туризм
Философия
Финансы
Экология
Экономика
Этика и эстетика
Прочее