Інтеграційні рішення Lotus Domino і IBM WebSphere: Domino XML, Інтеграція додатків і даних, Бази даних, статті

Зміст





Керуйте вашими даними в Lotus Domino, скориставшись перевагами прекрасно масштабується транзакционной J2EE-платформи IBM WebSphere і застосовуючи одну з таких рішень: Domino XML або бібліотеки JSP-тегів Domino. У першій частині даної серії статей ми розглянемо Domino XML або DXL.


Багато організацій виявили, що наступним логічним кроком для їх web-додатків Domino є інтеграція з програмним забезпеченням IBM WebSphere. І для цього є вагомі причини. Документно-орієнтована архітектура Lotus Domino полегшує створення і спільне використання документів розробниками вмісту (контенту) і редакторами. Його вбудована система захисту і можливості управління версіями ідеальні для адміністрування заснованого на документах вмісту.


WebSphere являє собою високопродуктивний транзакційний сервер додатків корпоративного рівня. У його основі лежить потужний J2EE-механізм, розроблений для високої масштабованості і стійкості. WebSphere є також плавильним казаном останніх Web-технологій. Організації, які бажають розширити свої існуючі Domino-додатки з метою використання цих технологій, вважають впровадження WebSphere в своє середовище логічним вибором.


У той час як переваги очевидні, шляхи досягнення інтеграції можуть такими не бути. Часто розробники, які є фахівцями в одній системі, не дуже добре знайомі з іншого. Отже, інтеграція тягне за собою комбінацію крутий кривий навчання і жорстких часових обмежень для розробників. IBM і Lotus розпізнали це і розробили кілька інструментальних засобів для допомоги в цьому процесі.


У цій серії статей з двох частин ми представляємо вам два різних методи інтеграції: один використовує Domino XML (DXL), а другий – бібліотеки JSP-тегів Domino, що є частиною Lotus Domino Toolkit для WebSphere Studio. Ми розглядаємо за і проти кожного методу і обговорюємо їх переваги та недоліки. Використовуючи порівняльну таблицю, ви можете вирішити, який метод найбільш підходить вам і вашому додатком. Потім ми детально, на прикладах, показуємо вам роботу кожного методу.


У першій статті з цієї серії ми розглядаємо Domino XML. У другій частині – бібліотеки JSP-тегів Domino. В обох статтях передбачається, що ви є розробником додатків, знайомим з технологіями XML і JSP. Перша частина передбачає наявність певного досвіду Java-програмування.


Два методи: XML і бібліотеки JSP-тегів Domino


Lotus протягом довгого часу підтримує XML. Починаючи з версії Lotus Notes / Domino 5, в кожну версію Lotus Notes / Domino додавалася нова функціональність, що підвищує її можливості по обробці XML. Lotus Notes / Domino 6.5 не є винятком. Він поставляється з численними функціональними можливостями, що дозволяють розробникам генерувати і витягувати XML практично з усіх Domino-елементів. Для тих, хто менш знайомий з Domino-термінологією, база даних Domino містить Notes-документи, а також такі елементи дизайну, як форми, подання та агенти. XML дозволяє звертатися до цих елементів дизайну і документів. Представляйте все це як сервер додатків, web-сервер і механізм бази даних, об’єднані в одне ціле.


Ще одним методом доступу є бібліотека JSP-тегів Domino. Ці бібліотеки надаються Lotus для допомоги розробникам у створенні працюють з Domino JSP-сторінок. Бібліотеки тегів приховують Java-код (На якому вони засновані), необхідний для підключення JavaServer Page (JSP) до Lotus Domino. Взаємодія здійснюється з використанням CORBA через IIOP. Це дозволяє програмно звертатися до Java-коді практично до всіх елементів бази даних.


План дій: XML або бібліотеки тегів?


Ці два методи пропонують різні підходи до інтеграції. Наступне порівняння допоможе вам вирішити, який метод найбільш підходить вам, і / або чого ви хочете досягти.


Ваш досвід
Багато Java-розробники з небажанням сприймають ідею вивчення Lotus Domino тільки тому, що ця система трохи не схожа на те, до чого вони вже звикли. Вони шукають рішення в області відкритих стандартів, де такі мови як Java і XML переважають в розробці додатків. Якщо ви один з таких розробників, то знайдете XML-метод більш прийнятним. Він вимагає мінімальних знань Domino, але доброго розуміння технологій XML, XSLT і Java.


З іншого боку, є загартовані Domino-розробники, які мають глибокі пізнання в Lotus Domino, але малознайомі з Java або WebSphere. Для цих авторів бібліотеки тегів є більш привабливими. Цей метод вимагає всебічних знань і досвіду в Domino. Він також вимагає мінімального досвіду адміністрування та доступу до зміни конфігурації.


Природа сайту / програми


Презентаційний
Багато web-сайти є презентаційними. Це означає, що їх головною метою є відображення HTML-вмісту в Web. Цей тип web-сайтів вимагає мало інформації від користувача, або взагалі не вимагає її введення. Вміст, зазвичай, не змінюється після первісної публікації. Прикладами презентаційних сайтів є новинні сайти або сторінки з документацією по продукту.


Іноді бувають ситуації, коли вам необхідно розподілити дані по носіях інформації, відмінним від Web. Наприклад, вам, можливо, буде потрібно випустити оголошення та брошури, або згенерувати поштові бюлетені з даних, що зберігаються в Lotus Domino. Презентаційні сайти / програми отримають найбільші переваги при використанні XML-методу, оскільки XML є розширюваною і може бути перетворений в незліченну безліч форматів.


Транзакційний
Технічно все web-сайти є транзакційними. Але в даному випадку транзакційний сайт є сайтом, який істотно залежить від введеної користувачем інформації. Такі сайти пропонують набір служб, вміст яких персоналізоване і часто є динамічним. Вони, зазвичай, вимагають певного роду авторизації та аутентифікації в реєстрі користувачів. Прикладами транзакційних сайтів є сайти аукціонів та інтерактивні дискусійні форуми. Сайти такого типу отримають більше переваг при використанні рішення з бібліотеками тегів.


Характеристики двох методів
XML є надзвичайно стерпним. Ви можете застосовувати його для розділення даних між практично усіма серверами додатків і базами даних, використовуючи більшість сучасних мов програмування. XML використовує такі промислові стандарти як Java, XSLT і т.д., і є розширюваною, але незалежним від системи або платформи. Він не вимагає серйозних знань Lotus Domino і бази даних для роботи з ним. XML відмінно підходить для презентаційних web-сайтів, що спеціалізуються на доставці вмісту.


Бібліотеки тегів дуже тісно інтегровані з Lotus Domino і J2EE-стандартами. Вони надають низькорівневий доступ до Domino-об’єктів, наприклад, прямі запити до Domino-уявленням. Для використання бібліотек тегів ви повинні добре знати архітектуру Domino і дизайн бази даних. Бібліотеки тегів підтримують двонаправлений обмін даними між Lotus Domino і WebSphere. Вони відмінно підходять для транзакційних та інтерактивних web-сайтів.


XML-метод


У першій частині цієї серії статей ми сконцентруємося на XML-методі. У другій частині ми розглянемо бібліотеки тегів. XML-метод може бути розбитий на три частини: експорт XML з Domino, перетворення XML і відображення результатів в JSP. Ми розглянемо метод саме в такому порядку. Для зміни JSP-файлу ми використовуємо WebSphere Studio Application Developer 5.1, але це програмне забезпечення не обов’язково.


Введення в Domino XML (DXL)


Lotus Domino поставляється з декількома функціональними можливостями для експорту та імпорту Domino-даних і елементів дизайну як XML спеціального типу. Lotus Domino називає їх DXL; це скорочення від Domino XML Language. Нехай ця назва вас не бентежить. DXL – це просто XML, погоджений з Domino DTD, який ви можете знайти в каталозі Notesxmlschemas.


На момент написання даної статті Lotus Domino 6.5.1 поставлявся з вісьмома документами схем, по одному для кожної ітерації Lotus Domino 6.x.


Перш ніж продовжити роботу, давайте налаштуємо середовище, в якому можуть виконуватися приклади. Передбачається використання операційної системи Microsoft Windows і Lotus Notes 6.5:


  1. У Windows Explorer створіть каталог з назвою article в кореневому каталозі або на диску C:.
  2. Завантажте файли приклад для даної статті та розархівуйте їх у щойно створений каталог C: article.
  3. Переконайтеся, що є такі папки:

    • Article
    • Com
    • Dxl
    • Xml
    • Xsl

  4. Скопіюйте включену до завантаження базу даних articleSample.nsf до каталогу Notesdata. Ця база даних зберігає просту інформацію про автомобілі, яку ви можете отримати від місцевого представництва із продажу старих автомобілів.
  5. При закритому Notes Client знайдіть і відкрийте файл notes.ini (зазвичай, у каталозі Notes) і додайте включені XML. Jar-файли в JVM classpath. Це робиться шляхом додавання наступного рядка в якості першого елемента в документ (відразу під “[Notes]”):

    JavaUserClasses=C:articlexercesImpl.jar;C:articlexmlParserAPIs.jar

    Збережіть і закрийте файл ..


  6. Відкрийте базу даних articleSample.nsf в Domino Designer.

    ПРИМІТКА: Ви повинні, принаймні, мати права доступу на рівні Designer в ACL, а також повинен бути дозволений параметр Create Lotuscript / Java agents.


  7. У лівій панелі нижче бази даних articleSample.nsf виберіть Shared Code – Agents. Ви повинні побачити два Java Agents.
  8. База даних поки що порожня, але ви можете заповнити її, запустивши агента GenerateCars, який згенерує інформації про 1000 автомобілів, вибираючи набір значень випадковим чином. Натисніть правою кнопкою миші на агент GenerateCars і виберіть Run для створення документів Car в базі даних. Відкрийте Notes-клієнт і перевірте вміст бази даних.

    Рис. 1. Приклад документа Car в Lotus Notes


  9. Потім, згенеруйте DXL і XML з тільки що згенерованих документів Car. Клацніть правою клавішею мишки на агент GetandTransformDXL і виберіть Run. Агент виконує дві дії: По-перше, він генерує DXL-документи з документів Car і поміщає їх у каталог C: articledxl, і, по-друге, він перетворює щойно згенерували DXL-документи в XML-файли і поміщає їх у каталог C: articlexml.

    Рис. 2. Список перетворених XML-документів


Тепер давайте детально проаналізуємо тільки що виконані нами дії.


DxlExporter


Lotus Domino 6.5 поставляється зі службовим Java-класом, званим DxlExporter. DxlExporter надає розробникам програмний засіб для генерування DXL з Domino-елементів. До Lotus Domino 6.5 DxlExporter був доступний як окремий завантажувальний файл під назвою Lotus XML Toolkit. Ті, хто використовує більш старі версії Lotus Domino, можуть використовувати цю версію DxlExporter.


У нашому прикладі ми використовуємо DxlExporter всередині Java-агента Domino. Java-агент являє собою Java-програму, яка розширює надається Lotus базовий клас (званий AgentBase), що працює в інтегрованій середовищі Domino. Додаткова інформація по Java-агентам наведена в довідковій системі Domino Designer.


DxlExporter дозволяє виконувати експорт чотирьох різних типів Domino-елементів в DXL, використовуючи методи exportDxl. Цими елементами є database, document, documentcollection і notecollection:


public String exportDxl(Database database)
Експортує всі з бази даних Domino в DXL-формат. Сюди входять елементи дизайну і документів даних.


public String exportDxl(Document document)
Експортує документ Domino в один DXL-документ.


public String exportDxl(DocumentCollection documentcollection)
Експортує колекцію Domino-документів в один DXL-документ.


public String exportDxl(NoteCollection notecollection)
Експортує колекцію Domino-елементів. Сюди можуть входити елементи дизайну і документів даних.


У ситуації з нашим прикладом ми використовуємо другу версію цього методу в GetandTransformDXL, яка через цикл For експортує за одним документом. Ми могли б легко використовувати і третю версію методу, яка експортує documentcollection, але вона генерувала б один XML-файл для всіх документів замість одного файлу для кожного.






DxlExporter exporter = session.createDxlExporter();
exporter.setForceNoteFormat(false);
exporter.setOutputDOCTYPE(false);
Stream stream = session.createStream();
if (stream.open(DXL_FILE_PATH+ this.getFilename()+ FILETYPE_SUBFIX)) {
stream.writeText(exporter.exportDxl(doc));
}


Lotus забезпечує DxlExporter кількома методами для налаштування виводу DXL. Давайте розглянемо два з них, які ми використовували у прикладі: ForceNoteFormat і OutputDOCTYPE.


exporter.setForceNoteFormat(false);
exporter.setOutputDOCTYPE(false);

ForceNoteFormat – DxlExporter.setForceNoteFormat(boolean)


Установка параметра в true вказує системі експорту експортувати кожен Domino-елемент як note-елемент. Установка параметра в значення false вказує системі експорту експортувати кожен Domino-елемент як його власний тип. Для ілюстрації розглянемо наступний приклад. Установка властивості ForceNoteFormat в значення true наступним чином:


exporter.setForceNoteFormat(true);

генерує XML, що містить об’єкт верхнього рівня, званий note, зі значенням атрибута class = “document”. Згенерований DXL-документ прикладу car виглядає наступним чином:






<note class=”document” xmlns=”http://www.lotus.com/dxl” version=”6.5″ maintenanceversion=”1.0″
replicaid=”88256F0C0071CEAD”>

<note>


З іншого боку, коли ForceNoteFormat встановлений у значення false, DxlExporter експортує елемент верхнього рівня як тип Domino-елемента. Установка властивості


exporter.setForceNoteFormat(false);

генерує DXL-документ, який виглядає наступним чином:






<document xmlns=”http://www.lotus.com/dxl” version=”6.5″ maintenanceversion=”1.0″
replicaid=”88256F0C0071CEAD” form=”car”>

</document>


ПРИМІТКА: Установка властивості ForceNoteFormat в будь-яке значення, true або false, не змінює формат виводу вкладених елементів.


OutputDOCTYPE – DxlExporter.setOutputDOCTYPE(boolean)


Додає тег DOCTYPE разом з інформацією SYSTEM і DTD. Це може бути корисно тоді, коли згенерований DXL повинен бути переданий іншій програмі (або особі) для перевірки цілісності DXL. Значення SYSTEM може бути встановлено за допомогою DxlExporter.setDoctypeSYSTEM (). Зверніть увагу на те, що посилання на Domino DTD знаходиться в тезі DOCTYPE.


<!DOCTYPE document SYSTEM “xmlschemas/domino_6_5_1.dtd”>

Існує LotusScript-версія DxlExporter, звана NotesDxlExporter. вона забезпечує практично аналогічну функціональність, що і її Java-еквівалент. Вона вперше з’явилася в Lotus Domino 6.


Дослідження DXL


Тепер перейдемо до каталогу C: articledxl і відкриємо щойно створений DXL-файл (розширення все ще XML) у вашому улюбленому текстовому редакторі або браузері. Давайте досліджуємо його структуру і вміст.

Рис. 3. Згенерований DXL, відкритий в браузері


DXL призначений для подання Domino-елементів у вигляді дерева, тобто, ієрархічної структури. Вона підпорядковується Domino DTD, в якому описано кожен елемент в термінах Domino-конструкції. Тому, DXL-документ для ваших даних звичайно семантично не виразний. Розглянемо приклад car. Припустимо, що існує текстове поле VIN, що зберігає алфавітно-цифрове значення в Domino-документі. Експортоване DXL-шоу Ця інформація виглядає так:


<item name=”VIN”><text>9135D30E168BEC6688256F0D00626201</text></item>

Хоча це і коректний XML, він не представляє реального сенсу ідентифікаційного номера автомобіля (vehicle identification number – VIN), унікального ID. Фактично, VIN представляється аналогічно будь-яким іншим текстовим полям в документі. А справа розробника – перетворити DXL-документ в XML-файл, який виглядає семантично правильно. Для максимальної переносимості ми рекомендуємо перетворювати DXL-документ в XML-файл, який може описувати ваші дані більш ефективно.


Перетворення DXL


Здатність перетворювати XML є надзвичайно потужною. Ця функція управляється технологією XSLT (Extensible Stylesheet Language Transformation). Якщо ви не знайомі з XSLT та іншими пов’язаними з нею технологіями, перегляньте сайт www.w3.org/Style/XSL/.


У ситуації з DXL перетворення грає істотну роль у створенні даних, що мають сенс поза Lotus Domino. У наступних розділах ми опишемо специфіку перетворення DXL, а також деякі поради та прийоми.


Перевизначення простору імен dxl


DXL-документи використовують XML-простір імен dxl. Хоча це значення простору імен має сенс для опису DXL-документа, воно не дуже корисно для опису вашого XML-формату. За замовчуванням механізм XSLT додає простір імен вихідного XML в одержуваний XML. Для перевизначення цього додайте атрибут exclude-result-prefixes = “dxl” в тег :


<xsl:stylesheet xmlns:xsl=”http://www.w3.org/1999/XSL/Transform” xmlns:dxl=”http://www.lotus.com/dxl” version=”1.0″ xmlns:xalan=”http://xml.apache.org/xslt” exclude-result-prefixes=”dxl”>

Обробка текстових полів та інших простих типів даних


Існує сім простих типів даних, визначених у Domino 6.5.1 DTD. Цими типами є:


Щоб додати деякої інтелектуальності в ваш XSL ви можете розглянути використання тегів choose / when для виявлення типу даних і для вибору відповідного шаблону для його обробки:






	<xsl:choose>
<xsl:when test=”name(child::*)=”text””>
<xsl:apply-templates select=”dxl:text” />
</xsl:when>
<xsl:when test=”name(child::*)=’number’”>
<xsl:apply-templates select=”dxl:number” />
</xsl:when>
<xsl:when test=”name(child::*)=”datetime””>
<xsl:apply-templates select=”dxl:datetime” />
</xsl:when>
<xsl:when test=”name(child::*)=”textlist””>
<xsl:apply-templates select=”dxl:textlist” />
</xsl:when>
<xsl:when test=”name(child::*)=”numberlist””>
<xsl:apply-templates select=”dxl:numberlist” />
</xsl:when>
<xsl:when test=”name(child::*)=”datetimelist””>
<xsl:apply-templates select=”dxl:datetimelist” />
</xsl:when>
</xsl:choose>


Ми наводимо шаблони для пари простих даних нижче.


Перетворення значень елементів у значення атрибутів


Як загальне XML-угоду, елементи верхнього рівня, зазвичай, містять атрибут ID-типу для ідентифікації своєї унікальності, наприклад:


<car vin=”0C96E710809A900D88256F0D006260E8″>

У DXL-документі номер VIN просто перерахований як елемент . Щоб записати це в атрибут одержуваного XML, ми робимо наступне: по-перше, тестуємо існування документа, використовуючи match = “dxl: document”. Якщо документ існує, створюємо елемент car (оскільки кожен з наших DXL-документів представляє об’єкт car). Потім додаємо в елемент car атрибут vin зі значенням елемента VIN. І останнє: знаходимо елемент VIN, використовуючи xPath наступним чином:






<xsl:value-of select=”./dxl:item[attribute::name=”VIN”]/dxl:text/text()” />
<xsl:template match=”dxl:document”>
<xsl:element name=”car”>
<xsl:attribute name=”vin”>
<xsl:value-of select=”./dxl:item[attribute::name=”VIN”]/dxl:text/text()” />
</xsl:attribute>
<xsl:apply-templates select=”./dxl:item” />
</xsl:element>
</xsl:template>


Обробка багатозначних полів


Lotus Domino підтримує концепцію багатозначного поля. Цей тип поля часто називається списком. Текстовий список (textlist) – найбільш часто використовуваний тип багатозначного поля. У нашому прикладі є багатозначне поле, зване Specifications, що містить різні параметри, які має автомобіль. Нижче наведено багатозначний DXL. Зверніть увагу на набір тегів всередині тега item.






<item name=”Specifications”>
<textlist>
<text>Power locks</text>
<text>AWD</text>
<text>Anti-lock brakes</text>
<text>Automatic windows</text><text>A/C</text>
<text>ABS</text>
</textlist>
</item>


Використання імен полів як імена елементів


Більшість залишилися Domino-полів мають “рідне” DXL-шоу, наприклад:






<item name=”fieldName”>
<fieldType>Acura</fieldType>
</item>


Часто fieldName є ідеальним ім’ям елемента в вихідному XML:


<fieldName>Acura</fieldName>

Отже, використовуючи елемент з нашого прикладу, ми могли б мати щось схоже на:






<item name=”Make”>
<text>Acura</text>
</item>


перетворене в:


<Make>Acura</Make>

XSL-код для виконання цього виглядає так:






<xsl:element name=”{@name}”>
<xsl:apply-templates select=”dxl:text” />
</xsl:element>

<xsl:template match=”dxl:text”>
<xsl:value-of select=”text()” />
</xsl:template>



Ми хочемо перетворити це в наступний формат:






<Specifications>
<listitem>A/C</listitem>
<listitem>Anti-lock brakes</listitem>
<listitem>AWD</listitem>
<listitem>Defrost</listitem>
</Specifications>


В даному випадку ми використовуємо:






<xsl:template match=”dxl:textlist”>
<xsl:for-each select=”./dxl:text”>
<xsl:element name=”listitem”>
<xsl:apply-templates select=”text()” />
</xsl:element>
</xsl:for-each>
</xsl:template>


Відображення даних в JSP


На даному етапі ми готові відобразити Domino-дані з використанням JSP-сторінки. Запустіть WebSphere Studio Application Developer 5.1 і виконайте імпорт ArticleWeb.war як новий Web Project. Знайдіть і відкрийте папку ArticleWeb Project Folder. Виконайте подвійний щиглик на папці WebContent і знайдіть файл dispxmlcar.jsp. Клацніть правою клавішею мишки на dispxmlcar.jsp і виберіть пункт меню Run on Server.

Рис. 4. WebSphere Studio Application Developer Project Navigator


Якщо відобразиться запит вибору версії екземпляра сервера, виберіть WebSphere Application Server 5.1. Сервер і додаток запустяться автоматично.


Після запуску програми ви побачите повідомлення про помилку у вбудованому в WebSphere Studio Application Developer вікні Web-браузера. Проігноруйте її, оскільки JSP очікує параметр vin в рядку запиту (querystring). Для виправлення цієї помилки просто отримаєте vin небудь з XML-файлів, або з бази даних Domino, і додайте в URL рядка запиту наступним чином:


http://localhost:9080/ArticleWeb/dispxmlcar.jsp?vin=[vin number]

Після натискання клавіші Enter ви побачите результат.

Рис. 5. Попередній перегляд отриманого HTML


JSP-сторінки і перетворювач


Dispxmlcar.jsp забезпечує базову HTML-конструкцію. Тут ви могли б встановити заголовок вашої компанії і навігацію. У середині знаходяться для dispxmltable.jsp. Це – JSP-сторінка, відображає середню таблицю, в якій містяться дані про автомобілі.






Dispxmltable.jsp
<%@page import=”java.io.*,java.util.*, java.net.*, com.ibm.alphaworks.utils.xml.*” %>
<%
String vin = request.getParameter(“vin”);
String xml = “c:articlexml” + vin + “.xml”;
String xsl = “c:articlexslTransformHTML.xsl”;

aWTransformer at = new aWTransformer();
at.setXmlin(xml);
at.setXslin(xsl);
at.setWriter(response.getWriter());
at.doTransform();
%>



Вона використовує параметр vin як ключ для виявлення XML-документа в каталозі C: ​​articlexml. Шлях до XSL-документу, TransformHTML.xsl, закодований жорстко.


ПРИМІТКА: Існують більш досконалі способи збереження та вилучення ваших XML або XSL-документів. Один з популярних методів – використовувати реляційну базу даних (наприклад, DB2) для зберігання XML у вигляді полів CLOB (Character Large Object). Для того щоб не дуже ускладнювати цю статтю, ми використовуємо файлову систему.


Реальне перетворення управляється класом, званим aWTransformer. Цей клас заснований на прикладі класу-перетворювача Xalan і здебільшого не повинен зажадати від вас будь-якої подальшої розробки.


У dispxmltable.jsp немає HTML-коду. HTML-таблиця генерується на основі конструкції в таблиці стилів TransformHTML.xsl. Це дозволяє мати велику гнучкість:


Ця програма працює також і на інших серверах J2EE-додатків.


Висновок


Lotus Domino надає розробникам багато програм та інструментальних засобів для інтеграції. У даній статті ми розглянули використання DxlExporter для генерування DXL-документів, способи перетворення їх у мають сенс XML-файли та способи відображення їх як JSP-сторінок в WebSphere. У другій статті докладно розглянемо використання бібліотек тегів Domino для створення динамічних JSP-сторінок.


Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*