регистрация / вход

Технология развертывания приложений Java Web Start

Преимущество использования программ, написанных на Java, требования к ним и настройки на клиентском ПК. Развертывание и последующее "автоматическое" обновление версий GUI клиента с помощью использования технологии Java Web Start в среде Windows.

Федеральное агентство по образованию РФ

Ярославский государственный университет им. П.Г.Демидова

Кафедра теоретической информатики

Реферат

на тему

Технология развертывания приложений Java Web Start

Выполнила:

Студентка группы ИТ – 32БО

Дмитриева А.В.

Проверил:

Головченко А.А.

Ярославль, 2011г.

Введение

Как лично вы относитесь к использованию Java-приложений? Например, к программам для ведения дневника, почтовым программам, чатам, веб-браузерам, текстовым редакторам, графическим редакторам, просмотрщикам видео, изображений, программам-конверторам и многому-многому другому? Преимущество использования программ, написанных на Java, очевидно. Вы можете использовать эти программы где вам угодно, на любой платформе. Java Web Start – это технология, которая позволит вам запускать интересующие вас приложения прямо с веб-сайта. При этом все необходимые части Java-приложения, и прочие ресурсы будут также загружены агентом Java Web Start.

Основные преимущества Java-приложений - это: богатый и дружественный интерфейс приложений. Приложения могут быть запущены не только посредством веб-браузера. Они могут быть выполнены из стартового меню или с рабочего стола. Также скорость работы не зависит от скорости соединения с Интернет. Помимо этого,приложения работают в off-line режиме. Работать с такой программой можно где угодно, пусть даже в самолете во время полета. Однако для обычных Java-приложений, помимо основной проблемы, упомянутой ранее, накладываются также трудности при установке и обновлении программы. Java Web Start позволяет разворачивать площадку для старта приложений непосредственно на веб-сайте. Нижеследующая схема показывает принцип работы Java Web Start технологии:

java start приложение

Пользователь кликает по ссылке HTML-страницы в веб-браузере, появляется splash-окно Java Web Start, после чего запускается приложение, которое готово к работе.

На самом деле все обстоит несколько сложнее. Когда пользователь нажал на ссылку, он загружает страницу, содержащую описание программы. Mime-тип возвращенного результата связан с Java Web start, поэтому браузер передает полученные данные (ответ) Java Web Start и передает ей управление. Происходят всевозможные проверки на возможность запуска приложения и, если все прошло успешно, запускается загруженное приложение. Если нет, то Java Web Start ищет необходимые ресурсы и также загружает их на компьютер пользователя. Все это происходит на должном уровне безопасности. В защитные средства входит подпись архивов с приложением. Такой метод защиты архивов позволяет отличать архивы с приложениями от непосредственно производителя от возможных подделок. Средства подписи архивов входят в стандартный набор средств разработки приложений на языке Java, и таким образом каждый разработчик может создать и использовать свою индивидуальную подпись. Этот метод очень широко распространен на просторах Интернет и весьма успешно себя зарекомендовал.

В своем реферате я расскажу о развертывании и последующем "автоматическом" обновлении версий GUI клиента с помощью использования технологии Java Web Start в среде Windows.

Требования к Java-приложениям и настройки на клиентском ПК

Так как работа Java Web Start основана на использовании JNLP-протокола, то выполнить настройки необходимо как на стороне СЕРВЕРА, так и на стороне КЛИЕНТА.

Для установки Java-приложений на локальном ПК необходим установленный Java Web Start (Application Manager) и веб-браузер. Браузер требуется только для первоначального запуска Java-приложения и после запуска может быть закрыт, в то время как приложение будет продолжать работать. В качестве браузера лучше сначала использовать IE, т.к. он работает корректно сразу. Также можно воспользоваться и другими браузерами (Mozilla, Opera 7.x), но для этого необходимо выполнить в них небольшие настройки. Как настроить Opera 7.x для правильной работы с JNLP файлами, будет описано позже, аналогичным образом должны настраиваться и другие браузеры.

Если Java-приложение запускается часто, то в среде Windows можно с помощью Java Web Start, создать стандартный "ярлык приложения" на рабочем столе и запускать Java-приложение не используя браузер, а пользуясь только ярлыком. Также можно запускать Java-приложение из командной строки.

Как уже было сказано, Java Web Start, всегда доступен как при установке JRE 1.4.x, так и при установке JDK 1.4.x, поэтому нам ничего не остается сделать как воспользоваться его возможностями. К сожалению, для версии JDK/JRE 1.3 его нужно устанавливать отдельно. Многие советуют этого делать, т.к. считают что, он сыроват и лучше всего перевести код вашего приложения на версию JDK 1.4, тем более что GUI клиент прекрасно взаимодействует с сервером под JDK 1.3. Проблем с передачей сериализированных объектов между версиями JDK 1.3 <-> 1.4 замечено не было.

Кроме этого Java Web Start предъявляет определенные требования к написанному клиентскому Java-приложению. Приложение должно поставляться как набор JAR-файлов, все ресурсы приложения, такие как изображения, конфигурационные файлы, Native библиоткуи (DLL, SO), необходимо включать в JAR-файлы. Ресурсы в коде должны получаться с помощью ClassLoader getResource или подобных методов. Если вам необходим неограниченный доступ к локальным файлам - потребуются дополнительные настройки и подписывание библиотек кода с помощью сертификата. Также для хранения локальных клиентских настроек в JWS имеется специальное PersistenceService API, которое чем-то похоже на "cookies" и позволяет безопасным способом хранить локальные настройки на ПК. Кромеэтого, естьещедругие API - BasicService, ClipboardService, DownloadService, FileOpenService, FileSaveService, PrintService.

Приложение Java Web Startнайти также можно найти в каталоге, где установлен JDK (или JRE). Для установленной JDK 1.4 это будет например файл: ...\j2sdk1.4.2\jre\javaws\javaws.exe , который находиться в каталоге Java Web Start (..\javaws). В этом же каталоге находяться и другие DLL файлы, необходимые для его корректной работы. В случае установки только JRE данный запускаемый файл можно найти в каталоге - ...\Program Files\Java\j2re1.4.xx\javaws\javaws.exe

Если ярлык не удается найти, необходимо найти указанный исполняемый файл и запустить его. После запуска должно появиться окно Java Web Start Application Manager.

Запуск на локальном ПК клиента Java Web Start можно считать достаточным для того, чтобы устанавливать клиентские Java-приложения. Но я все-таки хочу обратить ваше внимание на дополнительные параметры настройки JWS. Откройтевприложении JWS Application Manager: File -> Preferences, закладка General.

На ней можно указать прокси-сервер. Эта настройка зависит от настроек вашей сети, которые необходимо уточнить у системного администратора. Чаще всего их нужно "выключить", поставив значение - None, а иначе загрузка клиентского приложения либо не происходит, либо выполняется очень долго через прокси-сервер. Надо сказать, что в локальной 100 МБитной сети первоначальная загрузка и кэширование библиотек выполняется довольно быстро (от нескольких секунд до нескольких минут) и зависит от объема всех библиотек, входящих в ваше приложение.

Прежде чем мы продолжим дальнейшую настройку Java Web Start, я хочу сказать, что для более подробного изучения возможностей JWS, необходимо обратится к документации разработчика на сайте Sun - http://java.sun.com/products/javawebstart/ .

Подробности можно найти также в PDF спецификации - JAVA™ NETWORK LAUNCHING PROTOCOL & API SPECIFICATION (JSR-56) VERSION 1.0.1 более новая версия протокола уже 1.2

Кроме этого, необходимо взять на сайте Sun небольшой архив, предназначенный для разработчика. Это файл размером около 160 Кб - javaws-1_2-dev.zip. Он содержит необходимую информацию о настройке JNLP, а также JAR архивы классов сервлетов (jardiff.jar, jnlp-servlet.jar, jnlp.jar), которые будут необходимы на сервере.

Создание JNLP файла, описывающего ваше клиентское приложение, его библиотеки и другие параметры

Для того, чтобы Java Web Start мог знать какие именно файлы необходимы для запуска и работы вашего клиентского приложения, необходимо создать специальный JNLP файл, имеющий XML формат. Данный файл будет помещен на сервере JBoss в Web-приложение, предназначенное для выполнения деплоймента GUI.

Далее приведен краткий и простейший пример JNLP файла, использованного для деплоймента с небольшими пояснения о тегах файла и их значениях. Для более детального описания всех параметров и всех возможностей данной технологии, рекомендую вам обратиться к документации разработчика на сайте Sun Microsystems.

<?xml version="1.0" encoding="Windows-1251"?>

...............<jnlp spec="1.0+" <!-- Номер JNLP спецификации -->

codebase="http://localhost:8080/application"

<!--URL по которому находиться JNLP файл, можно написать в виде

codebase="$$codebase" -->

href="application.jnlp" >

<!--название JNLP файла-дескриптора нашего приложения

можно написать в виде href="$$name" -->

<information>

<title>Corporate GUI client</title> <vendor>Company ZZZ</vendor> <description>Company's corporate client</description> </information> <resources> <j2se version="1.3+"/> <!--Указаниенеобходимойверсии JDK приложения-->

<jar href="main_gui.jar" main="true"/><!--Файлынашегоклиентскогоприложения--> <jar href="main_gui_lib.jar" />

<jar href="jboss-client.jar"/>

<jar href="jboss-common-client.jar"/> <!--Перечислениевсехфайловсторонних--> <jar href="jboss-j2ee.jar"/> <!--библиотек, необходимыхдлязапуска--> <jar href="jbossmq.jar"/> <!--нашегоприложения -->

<jar href="jbosssx-client.jar"/> <jar href="jnp-client.jar"/> <jar href="xercesImpl.jar"/>

<jar href="xmlParserAPIs.jar"/>

<property name="java.naming.provider.url" value="localhost:1099"/>

<!-- Указание свойства, которое используется нашим приложением --> </resources>

<application-desc main-class="com.my_company_name.client.Application" />

<-- Название класса с main() точкой запуска --></jnlp>

codebase="http://localhost:8080/application" - указывает на параметр "базы кода" по которому мы будем хранить все необходимые библиотеки, как JAR файлы нашего приложения, так и JAR файлы "сторонних библиотек". Данный параметр можно заменить "специальной переменной", фактическое значение которой jnlp-сервлет поставит самостоятельно при обработке запроса. codebase="$$codebase"

href="application.jnlp" - название JNLP файла-дескриптора, который описывает наше приложение. Данный параметр также можно заменить "специальной переменой", фактическое значение которой jnlp-сервлет поставит при обработке запроса. href="$$name"

В разделе ресурсов, есть указание использования JRE версии 1.3 и более новых - <j2se version="1.3+"/>. Элемент <resources> может содержать 6 различных подэлементов, таких как: jar, nativelib, j2se, property, package и extension. Подробности и правила можно найти в документации.

<jar href="main_gui.jar" main="true"/> - Указание библиотеки, в которой находятся классы нашего приложения, при этом параметр main="true", указывает, что данный JAR архив содержит запускаемый класс GUI приложения.

<jar href="jboss-client.jar"/> - далее перечислены все необходимые библиотеки, которые будут получены с сервера и кэшированы на клиенте

<property name="java.naming.provider.url" value="localhost:1099"/> - так мы можем перечислить все, передаваемые в качестве параметров запуска приложению свойства, которые получаются вызовом System.getProperty(....)

<application-desc main-class="com.my_company_name.client.Application" /> - указаниеполногозапускаемогокласса. JWS также поддерживает запуск Applet-ов. В этом случае вместо тэга <application-desc> используется тэг <applet-desc>. Принцип написания и параметры - смотрите в документации.

Что касается элемента <information> JNLP файла. В данном тэге значения подэлементов <title> и другие, наверное, пока что лучше указывать на английском языке. В последней версии Java Web Start (1.2) из версии JDK 1.4.2_04-b05 название на русском языке в JNLP файле, вызвали ошибку при конвертировании русских букв. Ошибканаблюдаласьвлоге JBoss (server.log):

ERROR [org.jboss.web.localhost.Engine] Internal error:sun.io.MalformedInputException

at sun.io.ByteToCharUTF8.convert(ByteToCharUTF8.java:90)

at java.io.InputStreamReader.convertInto(InputStreamReader.java:137)

at java.io.InputStreamReader.fill(InputStreamReader.java:186)

.................

at com.sun.javaws.servlet.JnlpDownloadServlet.doGet(JnlpDownloadServlet.java:79)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:740)

...................................

JNLP файл имеет также дополнительные параметры и позволяет указывать разные ресурсы приложения в зависимости от: версии самого приложения, версии операционной системы, платформы, "локали" - т.е. поддерживает "версионность" приложений по разным критериям. В качестве ресурсов можно также указывать "native" библиотеки (например, DLL, SO), используемые вашим приложением. Если вашему приложению требуется доступ к локальным файлам или другие права на локальном ПК, то для этого существует раздел <security>, который необходимо также описать. При необходимости доступа к локальным ресурсам на ПК, например файлов, все библиотеки вашего приложения должны быть подписаны сертификатом, который можно сгенерировать самостоятельно. Все подробности и правила описания можно найти в документации.

Для создания JNLP деплоймент файлов можно использовать свободно распространяемый "DeployDirector" от Sitraka Software, подробности можно узнать на сайте производителя.

Настройка поддержки JNLP (Java Network Launching Protocol) на сервере JBoss 3.x.x с установленным Web-контейнером Apache TomCat

Настроить JNLP на сервере JBoss, который использует в качестве Web-контейнера Mortbay Jetty вполне возможно аналогичным способом. Нужно только внимательно посмотреть и найти файлы настроек в JAR архивах данного Web-контейнера, в которые понадобиться внести аналогичные добавления.

Итак, какие изменения вносят на сервере...

1 Добавление поддержки новых MIME типов в Apache TomCat

Мы выполним данную настройку "глобально" для всего TomCat, чтобы этот MIME тип был описан для всех Web-приложений контейнера, но такого же эффекта можно добиться, если добавить дополнительные MIME типы только в web.xml отдельного web-приложения, которое будет вами сделано на сервере для деплоймента клиенского ПО. Для добавления новых MIME типов, мы находим в каталоге JBoss, подкаталог в котором установлен TomCat. В случае JBoss 3.x - это скорее всего каталог: ...\jboss\catalina\

Находим конфигурационный файл - ...\jboss\catalina\conf\web.xml.

В последних версиях JBoss 3.2.x данный файл необходимо искать в каталоге: ...\jboss-3.2.3\server\default\deploy\jbossweb-tomcat41.sar\web.xml

В данном файле находим раздел, где описаны MIME типы, проверяем есть ли они уже в списке описанных. jnlp, jar - обычно уже есть, а вот jardiff - скорее всего необходимо добавить. При их полном отсутствии добавляем, например в начало списка, еще три дополнительных типа:

web.xml

.......

<!-- ===================== Default MIME Type Mappings =================== -->

<mime-mapping> <extension>jnlp</extension> <mime-type>application/x-java-jnlp-file</mime-type>

</mime-mapping> <mime-mapping> <extension>jar</extension> <mime-type>application/x-java-archive</mime-type> </mime-mapping>

<mime-mapping> <extension>jardiff</extension>

<mime-type>application/x-java-archive-diff</mime-type>

</mime-mapping>.............................

Если дать "грубое пояснение", то этими действиями мы указали Web-контейнеру выполнять "специальную интерпретацию" файлов с расширениями - jnlp, jar, jardiff. После HTTP запроса (request) клиентом у контейнера файла-ресурса с одним из указанных расширений, контейнер должен поставить в заголовке HTTP ответа (response) соответствующий "Content-Type", равный - application/x-java-jnlp-file, application/x-java-archive, application/x-java-archive-diff. При этом указанное "Content-Type" значение в HTTP ответе, позволит Java Web Start на стороне клиента, обработать данный поток данных "специальным образом".

Замечание: Будьте внимательны с тем, что можно легко перепутать расширение файлов *.jnlp, ошибочно назвав *.jnpl, как в настройках Web-контейнера, так и в названиях файлов.

2 Создание архива Web-приложения (WAR), предназначенного для деплоймента Java-приложения на локальные ПК

В каталоге JBoss, предназначенного для деплоймоента J2EE приложений, создадим новое Web-приложение. Его можно создать любым удобным способом, например: пусть это будет "default" конфигурация. Внутри деплоймент-каталога, создаем каталог web-приложения с названием, указанным в JNLP файле, это будет - ..\application.war

...\jboss-3.2.1\server\default\deploy\application.war\

В данном случае содержимое WAR приложения выглядит так:

\application.war\

index.html <-- Файл содержащий URL-ссылку на JNLP файл

клиентского Java-приложения

application.jnlp <- специально написанный XML файл с раширением jnlp,

описывающий состав и параметры клиентского приложения

main_gui.jar <- главные архивы классов клиентского приложения

main_gui_lib.jar

jboss-client.jar <- библиотеки необходимые для выполнения

jboss-common-client.jar приложения на ПК пользователя

jboss-j2ee.jar

jbossmq.jar

jbosssx-client.jar

jnp-client.jar

xercesImpl.jar

xmlParserAPIs.jar

\application.war\WEB-INF\

jboss-web.xml

web.xml <- файлдескриптор Web-приложения

\application.war\WEB-INF\lib\

jardiff.jar <- библиотеки, содержащие классы,

jnlp-servlet.jar необходимые для поддержки JNLP сервером, которые

jnlp.jar доступны из "JNLP пакета разработчика"

3 Добавление необходимых параметров в web.xml файл WAR-приложения

Кроме этого необходимо, описать необходимые настроечные параметры у нашего Web-приложения в файле ...\jboss-3.2.1\server\default\deploy\application.war\WEB-INF\web.xml. Согласно документации в него нужно дописать следующие настройки:

<?xml version="1.0"?><!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>

<servlet>

<servlet-name>JnlpDownloadServlet</servlet-name>

<servlet-class>com.sun.javaws.servlet.JnlpDownloadServlet</servlet-class>

</servlet> <servlet-mapping> <servlet-name>JnlpDownloadServlet</servlet-name> <url-pattern>*.jnlp</url-pattern>

</servlet-mapping>

<welcome-file-list> <welcome-file>index.html</welcome-file> </welcome-file-list>

<web-app>

Еще одно из требований для корректной работы JNLP сервлета, описанного в примере настройки - это наличие XML парсера. Для этого необходимо, чтобы либо сам Web-контейнер был запущен с помощью JRE 1.4 , в которой парсер интегрирован, или чтобы парсер был доступен серверу как библиотека. В нашем случае, т.к. JBoss имеет в поставке XML парсер (Xerces), никаких дополнительных действий делать не надо. В случае если ваша ситуация отличается, то добавьте парсер в Web-приложение - каталог где хранятся библиотеки приложения ...\application.war\WEB-INF\lib\

Теперь опишем как выглядит индексная страница, с которой осуществляется установка и запуск наших клиентских приложений на локальных ПК пользователей. Простейший вид страницы index.html :

index.html

<html><head><title>Клиентские приложения</title>

<meta http-equiv="content-type" content="text/html; charset=Windows-1251"></head>

<body><h3><center>

Внутренние корпоративные клиентские приложения.

</center></h3><ul><li>Клиентское приложение 1.0.x :

<a href="application.jnlp">Клиент 1.0</a></ul>

</body>

</html>

Страница имеет ссылку, указывающую на JNLP файл нашего приложения. По нажанию ссылки в браузере, будет происходит загрузка и запуск Java-приложения на клиентском ПК.

Запуск

Все готово к первому запуску Java-приложения. Запускаем JBoss, сначала WAR-приложение должно успешно задеплоиться. В логах вы должны увидеть приблизительно следующее:

server.log

INFO[org.jboss.deployment.MainDeployer] Startingdeploymentofpackage:

file:/....../jboss/server/default/deploy/application.war/INFO [org.jboss.web.catalina.EmbeddedCatalinaServiceSX] deploy, ctxPath=/application,

warUrl=file:/...../jboss/server/default/deploy/application.war/

............................................

............................................

INFO [org.jboss.deployment.MainDeployer] Successfully completed deployment of package:

file:/......./jboss/server/default/deploy/application.war/

Если этого не произошло, нужно перепроверить все настройки и параметры Web-приложения.

Заходим с помощью IE на страницу нашего Web-приложения по адресу, например, http://localhost:8080/application/

На странице мы должны увидеть нашу ссылку на JNLP файл в виде - http://localhost:8080/application/application.jnlp

Щелкнув на ней мы должны увидеть Splash-скрин запуска Java Web Start.

После этого на сервере в логе должны появиться записи об обращении к JNLP-сервлету примерно такого вида:

server.log

INFO [org.jboss.web.localhost.Engine] JnlpDownloadServlet: initINFO [org.jboss.web.localhost.Engine] InitializingINFO [org.jboss.web.localhost.Engine] Request: /application/application.jnlpINFO [org.jboss.web.localhost.Engine] User-Agent: Mozilla/4.0 (compatible;

MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322)

INFO [org.jboss.web.localhost.Engine] DownloadRequest[path=/application.jnlp

isPlatformRequest=false]

INFO [org.jboss.web.localhost.Engine] Basic Protocol lookupINFO [org.jboss.web.localhost.Engine] JnlpResource: JnlpResource[WAR Path:

/application.jnlp

lastModified=........ EET 2004]]INFO [org.jboss.web.localhost.Engine] Resource returned: /application.jnlpINFO [org.jboss.web.localhost.Engine] lastModified: ....... EET 2004

Если нет никаких ошибок, то после этого вы увидите как на ваш ПК в локальный кэш загружаются JAR библиотеки приложения, после чего приложение будет запущено. Если все получилось, то вы увидите окно, показывающее загрузку библиотек. После чего будет предложено выполнить интеграцию вашего Java-приложения с Windows, создав "ярлык запуска" приложения на рабочем столе. После этого должен произойти запуск вашего GUI приложения. Если этого не происходит, то это означает, что клиентское приложение выполнилось с какой-то ошибкой. Способ обнаружения, отображения и записи ошибок в клиентском Java-приложении полностью зависит от вашей реализации. Если вы захотите логировать ошибки и/или сообщения в локальный файл, то будет необходимо выполнить дополнительне действия по настройке и подписыванию библиотек сертификатом.Также после успешной установки Java-приложения на клиентский ПК в JWS Application Manager появиться ссылка на ваше приложение, с указанием источника. Там же с помощью иконок в правом нижнем углу JWS сообщает об доступности новых версий библиотек данного приложения.

Для обновления Java-приложения на локальных ПК пользователей, мы должны всего лишь скопировать новые версии библиотек в каталог сервера ...\jboss-3.2.1\server\default\deploy\application.war\ , чаще всего, это файлы: main_gui.jar, main_gui_lib.jar (или например библиотеки - xercesImpl.jar, xmlParserAPIs.jar). При последующем запуске GUI приложения на клиентском ПК с помощью Java Web Start данные JAR файлы будут скачены на ПК, после чего приложение будет запущено с новыми версиями библиотек.

О том, как настроить браузер Opera 7.x для корректной работы с JNLP файлами

Если вы попробуете запустить Java-приложение в браузере Opera кликнув на ссылке http://localhost:8080/application/application.jnlp , скорее всего увидите окно, в котором Opera предлагает сохранить или открыть файл. Можно открыть файл, нажав кнопку "Open". А можно нажать кнопку "Change..." и установить обработку данного MIME-типа и расширения файлов "по умолчанию". Отметьте пунк "Open with default application" и Opera будет всегда открывать JNLP файлы с помощью Java Web Start

Заключение

Java Web Start может быть использован в операционных системах: Windows(95, 98, ME, NT, W2K, XP), Linux, Unix (Solaris) и не так давно в Macintosh OS X. Для развертывания приложений используется HTTP протокол, поэтому можно воспользоваться любым HTTP сервером. Но для того, чтобы использовать все возможности, предоставляемые технологией Java Web Start, такие как "версионность" Java-приложений и "наращивающихся обновлений" (incremental update), необходимо использовать Web-сервер, поддерживающий сервлеты (Servlets) или CGI-скрипты.

Думаю, многие найдут Java Web Start полезной для себя технологией. Пользователи, которые смогут использовать всевозможные программные продукты, всегда самые новые и всегда доступные, так производители, которые без проблем смогут выкладывать новые версии своих продуктов на веб-сервере, с минимально приложенными усилиями.

Список литературы

1) http://ru.wikipedia.org Википедия. Свободная энциклопедия. Статья «JavaWebStart»

2) http://www.jboss.ru

3) http://lib.juga.ru Cтатья «Архитектура JavaWebStart»

ОТКРЫТЬ САМ ДОКУМЕНТ В НОВОМ ОКНЕ

ДОБАВИТЬ КОММЕНТАРИЙ [можно без регистрации]

Ваше имя:

Комментарий