<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>https://lib.custis.ru/index.php?action=history&amp;feed=atom&amp;title=%D0%A1%D1%82%D0%B0%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8_%D0%BF%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D1%8F%D0%B5%D0%BC%D1%8B%D0%B5_%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D0%B8_%D0%BD%D0%B0_%D1%81%D0%B2%D0%BE%D0%B9%D1%81%D1%82%D0%B2%D0%B0_Java-%D0%B1%D0%B8%D0%BD%D0%BE%D0%B2</id>
		<title>Статически проверяемые ссылки на свойства Java-бинов - История изменений</title>
		<link rel="self" type="application/atom+xml" href="https://lib.custis.ru/index.php?action=history&amp;feed=atom&amp;title=%D0%A1%D1%82%D0%B0%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8_%D0%BF%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D1%8F%D0%B5%D0%BC%D1%8B%D0%B5_%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D0%B8_%D0%BD%D0%B0_%D1%81%D0%B2%D0%BE%D0%B9%D1%81%D1%82%D0%B2%D0%B0_Java-%D0%B1%D0%B8%D0%BD%D0%BE%D0%B2"/>
		<link rel="alternate" type="text/html" href="https://lib.custis.ru/index.php?title=%D0%A1%D1%82%D0%B0%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8_%D0%BF%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D1%8F%D0%B5%D0%BC%D1%8B%D0%B5_%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D0%B8_%D0%BD%D0%B0_%D1%81%D0%B2%D0%BE%D0%B9%D1%81%D1%82%D0%B2%D0%B0_Java-%D0%B1%D0%B8%D0%BD%D0%BE%D0%B2&amp;action=history"/>
		<updated>2026-04-14T08:39:35Z</updated>
		<subtitle>История изменений этой страницы в вики</subtitle>
		<generator>MediaWiki 1.26.4</generator>

	<entry>
		<id>https://lib.custis.ru/index.php?title=%D0%A1%D1%82%D0%B0%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8_%D0%BF%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D1%8F%D0%B5%D0%BC%D1%8B%D0%B5_%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D0%B8_%D0%BD%D0%B0_%D1%81%D0%B2%D0%BE%D0%B9%D1%81%D1%82%D0%B2%D0%B0_Java-%D0%B1%D0%B8%D0%BD%D0%BE%D0%B2&amp;diff=43496&amp;oldid=prev</id>
		<title>KseniyaKirillova в 09:37, 24 апреля 2015</title>
		<link rel="alternate" type="text/html" href="https://lib.custis.ru/index.php?title=%D0%A1%D1%82%D0%B0%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8_%D0%BF%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D1%8F%D0%B5%D0%BC%D1%8B%D0%B5_%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D0%B8_%D0%BD%D0%B0_%D1%81%D0%B2%D0%BE%D0%B9%D1%81%D1%82%D0%B2%D0%B0_Java-%D0%B1%D0%B8%D0%BD%D0%BE%D0%B2&amp;diff=43496&amp;oldid=prev"/>
				<updated>2015-04-24T09:37:13Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;a href=&quot;https://lib.custis.ru/index.php?title=%D0%A1%D1%82%D0%B0%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8_%D0%BF%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D1%8F%D0%B5%D0%BC%D1%8B%D0%B5_%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D0%B8_%D0%BD%D0%B0_%D1%81%D0%B2%D0%BE%D0%B9%D1%81%D1%82%D0%B2%D0%B0_Java-%D0%B1%D0%B8%D0%BD%D0%BE%D0%B2&amp;amp;diff=43496&amp;amp;oldid=43394&quot;&gt;Внесённые изменения&lt;/a&gt;</summary>
		<author><name>KseniyaKirillova</name></author>	</entry>

	<entry>
		<id>https://lib.custis.ru/index.php?title=%D0%A1%D1%82%D0%B0%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8_%D0%BF%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D1%8F%D0%B5%D0%BC%D1%8B%D0%B5_%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D0%B8_%D0%BD%D0%B0_%D1%81%D0%B2%D0%BE%D0%B9%D1%81%D1%82%D0%B2%D0%B0_Java-%D0%B1%D0%B8%D0%BD%D0%BE%D0%B2&amp;diff=43394&amp;oldid=prev</id>
		<title>KseniyaKirillova: Новая страница: «&lt;blockquote&gt;''&lt;span style=&quot;color:#0645AD&quot;&gt;Сергей Кошель&lt;/span&gt;, ведущий разработчик, опубликовал в нашем корпо…»</title>
		<link rel="alternate" type="text/html" href="https://lib.custis.ru/index.php?title=%D0%A1%D1%82%D0%B0%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8_%D0%BF%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D1%8F%D0%B5%D0%BC%D1%8B%D0%B5_%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D0%B8_%D0%BD%D0%B0_%D1%81%D0%B2%D0%BE%D0%B9%D1%81%D1%82%D0%B2%D0%B0_Java-%D0%B1%D0%B8%D0%BD%D0%BE%D0%B2&amp;diff=43394&amp;oldid=prev"/>
				<updated>2015-04-20T13:34:55Z</updated>
		
		<summary type="html">&lt;p&gt;Новая страница: «&amp;lt;blockquote&amp;gt;&amp;#039;&amp;#039;&amp;lt;span style=&amp;quot;color:#0645AD&amp;quot;&amp;gt;Сергей Кошель&amp;lt;/span&amp;gt;, ведущий разработчик, опубликовал в нашем корпо…»&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;blockquote&amp;gt;''&amp;lt;span style=&amp;quot;color:#0645AD&amp;quot;&amp;gt;Сергей Кошель&amp;lt;/span&amp;gt;, ведущий разработчик, опубликовал в нашем корпоративном блоге на [http://habrahabr.ru/ «Хабрахабре»] статью [http://habrahabr.ru/company/custis/blog/243803/ «Статически проверяемые ссылки на свойства Java-бинов»]. В ней он рассказал о недостатках синтаксиса Java, связанных с невозможностью сослаться на свойство бина, о конкретных рабочих задачах, при работе над которыми необходимо было устранить данные недостатки, а также представил разработанное в компании решение и аспекты его использования.''&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Когда долго и серьезно используешь какой-либо инструмент, неминуемо возникают претензии к нему&amp;amp;nbsp;—&amp;amp;nbsp;неудобства, с которыми сперва миришься, но в какой-то момент понимаешь, что проще один раз исправить, чем все время страдать. Хорош тот инструмент, который позволяет допилить сам себя.&lt;br /&gt;
&lt;br /&gt;
Java&amp;amp;nbsp;—&amp;amp;nbsp;хороший инструмент, поэтому об одном таком неудобстве и&amp;amp;nbsp;о&amp;amp;nbsp;том, как мы его исправляли, и&amp;amp;nbsp;пойдет речь.&lt;br /&gt;
&lt;br /&gt;
== Итак, неудобство ==&lt;br /&gt;
&lt;br /&gt;
В Java нет синтаксиса, позволяющего сослаться на свойство бина. Проще пояснить на&amp;amp;nbsp;примере.&lt;br /&gt;
&lt;br /&gt;
Допустим, есть &amp;lt;code&amp;gt;Account&amp;lt;/code&amp;gt;, у&amp;amp;nbsp;которого есть свойство &amp;lt;code&amp;gt;customer&amp;lt;/code&amp;gt; типа &amp;lt;code&amp;gt;Customer&amp;lt;/code&amp;gt;, у&amp;amp;nbsp;которого есть свойство &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt;. Иными словами:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code-java&amp;gt;&lt;br /&gt;
public class Account {&lt;br /&gt;
   public Customer getCustomer() { ... }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class Customer {&lt;br /&gt;
   public String getName() { ... }&lt;br /&gt;
}&amp;lt;/code-java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
И есть &amp;lt;code&amp;gt;TableBuilder&amp;lt;/code&amp;gt;, который умеет создавать таблички на&amp;amp;nbsp;интерфейсе для показа списка бинов, нужно лишь сообщить ему, какие их&amp;amp;nbsp;свойства (возможно, вложенные) мы хотим вывести, а он&amp;amp;nbsp;уже сделает всю рутинную работу.&lt;br /&gt;
&lt;br /&gt;
Как сказать, что мы хотим показать &amp;lt;code&amp;gt;name customer&amp;lt;/code&amp;gt;’а &amp;lt;code&amp;gt;Account&amp;lt;/code&amp;gt;’а? Обычно используют строковые литералы:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code-java&amp;gt;TableBuilder&amp;lt;Account&amp;gt; tableBuilder = TableBuilder.of(Account.class);&lt;br /&gt;
&lt;br /&gt;
…&lt;br /&gt;
&lt;br /&gt;
tableBuilder.addColumn(«customer.name»);&amp;lt;/code-java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Недостаток этого способа в&amp;amp;nbsp;том, что компилятор не знает, что это не&amp;amp;nbsp;просто строка и&amp;amp;nbsp;не&amp;amp;nbsp;может проверить ее&amp;amp;nbsp;корректность, а,&amp;amp;nbsp;значит, все опечатки обернутся ошибками только во&amp;amp;nbsp;время исполнения. По&amp;amp;nbsp;той&amp;amp;nbsp;же причине среда разработки не&amp;amp;nbsp;сможет подсказать нам, какие свойства есть у &amp;lt;code&amp;gt;Customer&amp;lt;/code&amp;gt;’а. И&amp;amp;nbsp;даже если мы все проверим и&amp;amp;nbsp;отладим, первый же рефакторинг разрушит наши старания.&lt;br /&gt;
&lt;br /&gt;
Есть здесь еще одно, менее очевидное, неудобство: типизация &amp;lt;code&amp;gt;addColumn(String)&amp;lt;/code&amp;gt; никак не&amp;amp;nbsp;подсказывает нам, что этот метод ожидает не&amp;amp;nbsp;абы&amp;amp;nbsp;какую строку, а&amp;amp;nbsp;цепочку свойств.&lt;br /&gt;
&lt;br /&gt;
Хочется, чтобы компилятор всё проверил, среда подсказала, а&amp;amp;nbsp;рефакторинг не&amp;amp;nbsp;сломал. Не так уж это и&amp;amp;nbsp;много, учитывая, что вся необходимая для этого информация уже&amp;amp;nbsp;есть.&lt;br /&gt;
&lt;br /&gt;
Казалось бы, задача&amp;amp;nbsp;—&amp;amp;nbsp;нерешаемая: в&amp;amp;nbsp;Java действительно нет&amp;amp;nbsp;синтаксической конструкции, позволяющей сослаться на&amp;amp;nbsp;член класса без обращения к&amp;amp;nbsp;нему. Однако, это уже давно не&amp;amp;nbsp;мешает mock-фрэймворкам изящно и&amp;amp;nbsp;строго выражать «когда будет вызван метод…», как например умеет [http://docs.mockito.googlecode.com/hg/org/mockito/Mockito.html Mockito]:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code-java&amp;gt;Account account = mock(Account.class);&lt;br /&gt;
&lt;br /&gt;
when(account.getCustomer()).thenReturn(…);&amp;lt;/code-java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Метод &amp;lt;code&amp;gt;mock()&amp;lt;/code&amp;gt; создает и&amp;amp;nbsp;возвращает прокси, который выглядит как &amp;lt;code&amp;gt;Account&amp;lt;/code&amp;gt;, но&amp;amp;nbsp;ведет себя совсем по-другому: запоминает информацию о&amp;amp;nbsp;вызванном методе в &amp;lt;code&amp;gt;ThreadLocal&amp;lt;/code&amp;gt;-переменной, которую потом извлекает и&amp;amp;nbsp;использует &amp;lt;code&amp;gt;when()&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Можно использовать такой&amp;amp;nbsp;же трюк для решения нашей задачи:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code-java&amp;gt;Account account = root(Account.class);&lt;br /&gt;
&lt;br /&gt;
tableBuilder.addColumn($(account.gertCustomer().getName()));&amp;lt;/code-java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;root()&amp;lt;/code&amp;gt; возвращает прокси, который запоминает вызванные методы в&amp;amp;nbsp;&amp;lt;code&amp;gt;ThreadLocal&amp;lt;/code&amp;gt;-переменную и&amp;amp;nbsp;возвращает следующий прокси, позволяя писать цепочки вызовов, которые превратятся в&amp;amp;nbsp;цепочку свойств.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$() &amp;lt;/code&amp;gt;возвращает не строку, а объект типа &amp;lt;code&amp;gt;BeanPath&amp;lt;/code&amp;gt;, который представляет цепочку свойств в&amp;amp;nbsp;объектно-ориентированном виде. Можно перемещаться по&amp;amp;nbsp;отдельным элементам этой цепочки (для&amp;amp;nbsp;каждого элемента сохраняется имя и&amp;amp;nbsp;тип) или преобразовать в&amp;amp;nbsp;уже знакомую нам строку:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code-java&amp;gt;$(account.gertCustomer().getName()).toDotDelimitedString()&lt;br /&gt;
&lt;br /&gt;
     =&amp;gt; «customer.name»&amp;lt;/code-java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$()&amp;lt;/code&amp;gt;, помимо основной своей функции, захватывает тип&amp;amp;nbsp;цепочки (последнего свойства в&amp;amp;nbsp;цепочке), а, значит, позволяет добавить еще капельку типизации в&amp;amp;nbsp;&amp;lt;code&amp;gt;TableBuilder&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code-java&amp;gt;public &amp;lt;T&amp;gt; ColumnBuilder&amp;lt;T&amp;gt; addColumn(BaenPath&amp;lt;T&amp;gt; path) {…}&amp;lt;/code-java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вот такой небольшой фрэймворк мы написали в CUSTIS, немного попользовались им сами, а&amp;amp;nbsp;теперь выложили на&amp;amp;nbsp;GitHub.&lt;br /&gt;
&lt;br /&gt;
== Аспекты использования ==&lt;br /&gt;
&lt;br /&gt;
Реализация через динамическое проксирование налагает следующие ограничения.&lt;br /&gt;
&lt;br /&gt;
Во-первых, «корень» и незамыкающие свойства в цепочке не могут быть &amp;lt;code&amp;gt;final&amp;lt;/code&amp;gt;-классами (в том числе enum’ом, строкой, j.l.Integer&amp;amp;nbsp;и&amp;amp;nbsp;т.&amp;amp;nbsp;д.). Фрэймворк не&amp;amp;nbsp;может проксировать их и&amp;amp;nbsp;возвращает &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code-java&amp;gt;$(account.getCustomer().getName().length()) // =&amp;gt; NPX!&amp;lt;/code-java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тем не менее, замыкать цепочку может свойство любого типа: и&amp;amp;nbsp;&amp;lt;code&amp;gt;final&amp;lt;/code&amp;gt;-класс, и&amp;amp;nbsp;примитив (который в&amp;amp;nbsp;середине цепочки бессмысленен и&amp;amp;nbsp;невозможен).&lt;br /&gt;
&lt;br /&gt;
Во-вторых, геттеры должны быть видимы для фрэймворка, то есть не&amp;amp;nbsp;должны быть &amp;lt;code&amp;gt;private&amp;lt;/code&amp;gt; или&amp;amp;nbsp;&amp;lt;code&amp;gt;package-local&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
А вот конструктора по умолчанию и&amp;amp;nbsp;вообще публичного конструктора может и&amp;amp;nbsp;не быть&amp;amp;nbsp;—&amp;amp;nbsp;прокси инстанцируется в&amp;amp;nbsp;обход конструктора. Поскольку, законным способом это сделать нельзя, используется проприетарный для&amp;amp;nbsp;HotSpot JVM&amp;amp;nbsp;интринзик &amp;lt;code&amp;gt;sun.misc.Unsafe.allocateObject()&amp;lt;/code&amp;gt;, что делает фрэймворк непереносимым на&amp;amp;nbsp;другие&amp;amp;nbsp;JVM.&lt;br /&gt;
&lt;br /&gt;
«Руты» можно и&amp;amp;nbsp;нужно переиспользовать, они не&amp;amp;nbsp;содержат состояния:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code-java&amp;gt;Account account = root(Account.class);&lt;br /&gt;
&lt;br /&gt;
tableBuilder.addColumn($(account.getCustomer().getName()));&lt;br /&gt;
&lt;br /&gt;
tableBuilder.addColumn($(account.getNumber()));&lt;br /&gt;
&lt;br /&gt;
tableBuilder.addColumn($(account.getOpenDate()));&amp;lt;/code-java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Методы &amp;lt;code&amp;gt;root()&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;$()&amp;lt;/code&amp;gt; можно алиасить, так как это просто статические методы:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code-java&amp;gt;public class BeanPathMagicAlias {&lt;br /&gt;
&lt;br /&gt;
   public static &amp;lt;T&amp;gt; BeanPath&amp;lt;T&amp;gt; path(T callChain) {&lt;br /&gt;
&lt;br /&gt;
       return BeanPathMagic.$(callChain);&lt;br /&gt;
&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
}&amp;lt;/code-java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Можно это использовать для переименования методов в&amp;amp;nbsp;угоду вкусу или чтобы создать полезный шорткат. В частности, один такой уже объявлен в&amp;amp;nbsp;&amp;lt;code&amp;gt;beanpath&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code-java&amp;gt;public static String $$(Object callChain)&lt;br /&gt;
&lt;br /&gt;
{ return $(callChain).toDotDelimitedString(); }&amp;lt;/code-java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пригодится для использования &amp;lt;code&amp;gt;beanpath&amp;lt;/code&amp;gt; в&amp;amp;nbsp;коде, который ожидает строковые литералы.&lt;br /&gt;
&lt;br /&gt;
Инстанс &amp;lt;code&amp;gt;BeanPath&amp;lt;/code&amp;gt; можно сконструировать и&amp;amp;nbsp;вручную&amp;amp;nbsp;—&amp;amp;nbsp;его поведение полностью определяется состоянием, которое задается при конструировании. Так:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code-java&amp;gt;BeanPath&amp;lt;String&amp;gt; bp1 = $(account.getCustomer().getName());&lt;br /&gt;
&lt;br /&gt;
BeanPath&amp;lt;String&amp;gt; bp2 = BaenPath.root(Account.class)&lt;br /&gt;
&lt;br /&gt;
 .append(&amp;quot;customer&amp;quot;, Customer.class)&lt;br /&gt;
&lt;br /&gt;
 .append(&amp;quot;name&amp;quot;, String.class);&lt;br /&gt;
&lt;br /&gt;
bp1.equals(bp2) // =&amp;gt; true&amp;lt;/code-java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Это может пригодиться, чтобы обойти упомянутые выше ограничения (если в цепочке оказался &amp;lt;code&amp;gt;final&amp;lt;/code&amp;gt;-класс или&amp;amp;nbsp;нет&amp;amp;nbsp;публичных геттеров). При этом корректность цепочки остается на&amp;amp;nbsp;совести разработчика.&lt;br /&gt;
&lt;br /&gt;
=== Планы на будущее ===&lt;br /&gt;
&lt;br /&gt;
Сейчас &amp;lt;code&amp;gt;beanpath&amp;lt;/code&amp;gt; доступен только в&amp;amp;nbsp;исходных кодах. Поэтому прежде всего хочется наладить его полноценную сборку и&amp;amp;nbsp;деплой в&amp;amp;nbsp;Maven Central.&lt;br /&gt;
&lt;br /&gt;
Потом заменить использование &amp;lt;code&amp;gt;sun.misc.Unsafe&amp;lt;/code&amp;gt; на&amp;amp;nbsp;&amp;lt;code&amp;gt;Objnesis&amp;lt;/code&amp;gt;, чтобы сделать &amp;lt;code&amp;gt;beanpath&amp;lt;/code&amp;gt; переносимым.&lt;br /&gt;
&lt;br /&gt;
Ну и совсем на перспективу, подойти к&amp;amp;nbsp;решению задачи с другого края: использовать статическую кодогенерацию, а-ля&amp;amp;nbsp;&amp;lt;code&amp;gt;JPA static metamodel&amp;lt;/code&amp;gt;. Такой вариант имеет ряд плюсов:&lt;br /&gt;
&lt;br /&gt;
* нулевые накладные расходы в&amp;amp;nbsp;рантайме;&lt;br /&gt;
&lt;br /&gt;
* возможность захватить типизацию «корня» цепочки;&lt;br /&gt;
&lt;br /&gt;
* в API сгенеренных классов можно отфильтровать лишние методы (которые не относятся к&amp;amp;nbsp;свойствам).&lt;br /&gt;
&lt;br /&gt;
[[Категория:Хабрахабр (Публикации)]]&lt;br /&gt;
[[Категория:2014 год (Статьи)]]&lt;br /&gt;
&lt;br /&gt;
[[Category:CustisWikiToLib]]&lt;/div&gt;</summary>
		<author><name>KseniyaKirillova</name></author>	</entry>

	</feed>