Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > spring + hibernate + tests


Автор: Samotnik 18.6.2013, 18:15
Привет.
Есть веб приложение. Теперь появилось желание написать тесты на dao методы. Написал используя applicationContext.xml из всего приложения - все работает ОК, но проблема в том, что я не хочу чтобы тесты работали с реальной БД, хочу для этого использовать встроенную h2 например. 
Сделал все по мануалу, но не работает:
http://screencast.com/t/xLDswoE7

Цитата

java.lang.IllegalStateException: Failed to load ApplicationContext
        at org.apache.xerces.util.ErrorHandlerWrapper.createSAXParseException(Unknown Source)
        at org.apache.xerces.util.ErrorHandlerWrapper.error(Unknown Source)
        at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
        at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
        at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
        at org.apache.xerces.impl.xs.XMLSchemaValidator$XSIErrorReporter.reportError(Unknown Source)
        at org.apache.xerces.impl.xs.XMLSchemaValidator.reportSchemaError(Unknown Source)
        at org.apache.xerces.impl.xs.XMLSchemaValidator.handleStartElement(Unknown Source)
        at org.apache.xerces.impl.xs.XMLSchemaValidator.emptyElement(Unknown Source)
        at org.apache.xerces.impl.XMLNSDocumentScannerImpl.scanStartElement(Unknown Source)
        at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown Source)
        at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
        at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
        at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
        at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
        at org.apache.xerces.parsers.DOMParser.parse(Unknown Source)
        at org.apache.xerces.jaxp.DocumentBuilderImpl.parse(Unknown Source)
        at org.springframework.beans.factory.xml.DefaultDocumentLoader.loadDocument(DefaultDocumentLoader.java:75)
        at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:388)
        at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:334)
        at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:302)
        at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:174)
        at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:209)
        at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:180)
        at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:243)
        at org.springframework.test.context.web.GenericXmlWebContextLoader.loadBeanDefinitions(GenericXmlWebContextLoader.java:38)
        at org.springframework.test.context.web.AbstractGenericWebContextLoader.loadContext(AbstractGenericWebContextLoader.java:125)
        at org.springframework.test.context.web.AbstractGenericWebContextLoader.loadContext(AbstractGenericWebContextLoader.java:60)
        at org.springframework.test.context.support.AbstractDelegatingSmartContextLoader.delegateLoading(AbstractDelegatingSmartContextLoader.java:100)
        at org.springframework.test.context.support.AbstractDelegatingSmartContextLoader.loadContext(AbstractDelegatingSmartContextLoader.java:248)
        at org.springframework.test.context.CacheAwareContextLoaderDelegate.loadContextInternal(CacheAwareContextLoaderDelegate.java:64)
        at org.springframework.test.context.CacheAwareContextLoaderDelegate.loadContext(CacheAwareContextLoaderDelegate.java:91)
        at org.springframework.test.context.TestContext.getApplicationContext(TestContext.java:122)
        at org.springframework.test.context.web.ServletTestExecutionListener.setUpRequestContextIfNecessary(ServletTestExecutionListener.java:105)
        at org.springframework.test.context.web.ServletTestExecutionListener.prepareTestInstance(ServletTestExecutionListener.java:74)
        at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:312)
        at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:211)
        at org.springframework.test.context.junit4.SpringJUnit4ClassRunner$1.runReflectiveCall(SpringJUnit4ClassRunner.java:288)
        at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
        at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock(SpringJUnit4ClassRunner.java:284)
        at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:231)
        at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:88)
        at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
        at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
        at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
        at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
        at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
        at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
        at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:71)
        at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
        at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:174)
        at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:264)
        at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:153)
        at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:124)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:601)
        at org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray2(ReflectionUtils.java:208)
        at org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:159)
        at org.apache.maven.surefire.booter.ProviderFactory.invokeProvider(ProviderFactory.java:87)
        at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:153)
        at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:95)


 smile 

Автор: Killer_13 18.6.2013, 18:28
Вылетало с такой же ошибкой, как правило "синтаксическая ошибка" при написании реальных таблиц из Entity.

Добавлено через 1 минуту и 4 секунды
Один раз особенно долго мудохался, забыл точку с запятой в конце таблички. )))))

Добавлено через 3 минуты и 15 секунд
Таблички вречную с Entity писали или генерировали?

Автор: Samotnik 19.6.2013, 23:33
Цитата(Killer_13 @  18.6.2013,  18:28 Найти цитируемый пост)
"синтаксическая ошибка" при написании реальных таблиц из Entity

не совсем понял, что это значит?
Цитата(Killer_13 @  18.6.2013,  18:28 Найти цитируемый пост)
Таблички вречную с Entity писали или генерировали? 

сделал экспорт существующей бд из мускула и закинул в файл

Автор: Killer_13 20.6.2013, 08:54
Цитата(Samotnik @  19.6.2013,  23:33 Найти цитируемый пост)
не совсем понял, что это значит?
 - Ну если есть Хибер, есть и Сущность, я в ручную писал таблички.

Цитата(Samotnik @  19.6.2013,  23:33 Найти цитируемый пост)
сделал экспорт существующей бд из мускула и закинул в файл
 - а синтаксис h2 и mysql случайно в некоторых случаях не отличается?

Я например потом для проверки точности генерил таблички на основании своих ентити с помощью вот этого кусочка кода. )

Код



import org.hibernate.cfg.Configuration;
import org.hibernate.cfg.Environment;
import org.hibernate.tool.hbm2ddl.SchemaExport;

import com.tk.model.Company;

public class HibernateScratchpad {

    enum DB {
        ORACLE, HSQLDB, H2
    }

    public static void main(String args[]) {
        schemaCreate(DB.H2);
    }

    /**
     * Create SQL for an entity.
     */
    private static void schemaCreate(DB db) {
        Configuration configuration = new Configuration();
        configuration.addAnnotatedClass(Company.class);

        configuration.setProperty(org.hibernate.cfg.Environment.FORMAT_SQL, "true");
        configuration.setProperty(org.hibernate.cfg.Environment.HBM2DDL_AUTO, "update");

        switch (db) {
        case ORACLE:
            addOracleConfiguration(configuration);
            break;
        case HSQLDB:
            addHSQLDBConfiguration(configuration);
            break;
        case H2:
            addH2Configuration(configuration);
            break;
        }
//        System.out.println("############## Schema UPDATE to current idev state ##############");
        
//        SchemaUpdate schemaUpdate = new SchemaUpdate(configuration);
//        schemaUpdate.execute(true, false);
//        System.out.println("###################################################################");
        
        System.out.println("\n\n############## Schema CREATE ##############");
        SchemaExport schema = new SchemaExport(configuration);
        schema.create(true, false);
        System.out.println("###########################################");
    }

    private static void addOracleConfiguration(Configuration configuration) {
        configuration.setProperty(Environment.USER, "JC").setProperty(Environment.PASS, "ma")
                .setProperty(Environment.URL, "jdbc:oracle:........:1521:orcl")
                .setProperty(Environment.DRIVER, "oracle.jdbc.OracleDriver")
                .setProperty(Environment.DIALECT, "org.hibernate.dialect.Oracle10gDialect");
    }

    private static void addHSQLDBConfiguration(Configuration configuration) {
        configuration.setProperty(Environment.USER, "sa").setProperty(Environment.PASS, "")
                .setProperty(Environment.URL, "jdbc:hsqldb:mem:test")
                .setProperty(Environment.DRIVER, "org.hsqldb.jdbcDriver")
                .setProperty(Environment.DIALECT, "org.hibernate.dialect.HSQLDialect");
    }

    private static void addH2Configuration(Configuration configuration) {
        configuration.setProperty(Environment.URL, "jdbc:h2:mem:test").setProperty(Environment.DRIVER, "org.h2.Driver")
                .setProperty(Environment.DIALECT, "org.hibernate.dialect.H2Dialect");
    }
}



Автор: Temdegon 21.6.2013, 19:01
Samotnik, 
Можешь глянуть, как это сделано в проекте JTalks, там для тестов dao как раз h2 используется
https://github.com/jtalks-org/jcommune/tree/master/jcommune-model

Нужно вынести все настройки hibernate, относящиеся к БД, в проперти-файл (datasource.properties),
и заюзать эти данные в appliactionContext через PropertyPlaceholder.
Дальше все просто:
в src/main/resources кладёшь datasource.properties с настройками реальной базы, а в src/test/resources - настройки для h2.

Автор: Samotnik 23.6.2013, 22:29
Temdegon, спасибо, все в принципе так уже и сделано, только не работает вот )
Все это время тестами пока не занимался, поэтому вопрос висит smile Если у кого есть примеры САБЖа, буду рад.

Автор: Samotnik 25.6.2013, 17:16
Killer_13, спасибо, класс забавный, сгенерил весь sql smile  smile 
только ошибка та же 
Цитата

java.lang.IllegalStateException: Failed to load ApplicationContext
        at org.springframework.web.context.support.ServletContextResource.getInputStream(ServletContextResource.java:140)
        at org.springframework.core.io.support.EncodedResource.getReader(EncodedResource.java:132)
        at org.springframework.jdbc.datasource.init.ResourceDatabasePopulator.readScript(ResourceDatabasePopulator.java:227)
        at org.springframework.jdbc.datasource.init.ResourceDatabasePopulator.executeSqlScript(ResourceDatabasePopulator.java:167)
        at org.springframework.jdbc.datasource.init.ResourceDatabasePopulator.populate(ResourceDatabasePopulator.java:134)
        at org.springframework.jdbc.datasource.init.CompositeDatabasePopulator.populate(CompositeDatabasePopulator.java:55)
        at org.springframework.jdbc.datasource.init.DatabasePopulatorUtils.execute(DatabasePopulatorUtils.java:47)
        at org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseFactory.initDatabase(EmbeddedDatabaseFactory.java:136)
        at org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseFactoryBean.afterPropertiesSet(EmbeddedDatabaseFactoryBean.java:58)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1541)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1479)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:521)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:458)
        at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:295)
        at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223)
        at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:292)
        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)
        at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:323)
        at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:107)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1387)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1128)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:458)
        at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:295)
        at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223)
        at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:292)
        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)
        at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1117)
        at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:922)
        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:479)
        at org.springframework.test.context.web.AbstractGenericWebContextLoader.loadContext(AbstractGenericWebContextLoader.java:128)
        at org.springframework.test.context.web.AbstractGenericWebContextLoader.loadContext(AbstractGenericWebContextLoader.java:60)
        at org.springframework.test.context.support.AbstractDelegatingSmartContextLoader.delegateLoading(AbstractDelegatingSmartContextLoader.java:100)
        at org.springframework.test.context.support.AbstractDelegatingSmartContextLoader.loadContext(AbstractDelegatingSmartContextLoader.java:248)
        at org.springframework.test.context.CacheAwareContextLoaderDelegate.loadContextInternal(CacheAwareContextLoaderDelegate.java:64)
        at org.springframework.test.context.CacheAwareContextLoaderDelegate.loadContext(CacheAwareContextLoaderDelegate.java:91)
        at org.springframework.test.context.TestContext.getApplicationContext(TestContext.java:122)
        at org.springframework.test.context.web.ServletTestExecutionListener.setUpRequestContextIfNecessary(ServletTestExecutionListener.java:105)
        at org.springframework.test.context.web.ServletTestExecutionListener.prepareTestInstance(ServletTestExecutionListener.java:74)
        at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:312)
        at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:211)
        at org.springframework.test.context.junit4.SpringJUnit4ClassRunner$1.runReflectiveCall(SpringJUnit4ClassRunner.java:288)
        at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
        at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock(SpringJUnit4ClassRunner.java:284)
        at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:231)
        at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:88)
        at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
        at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
        at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
        at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
        at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
        at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
        at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:71)
        at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
        at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:174)
        at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:264)
        at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:153)
        at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:124)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:601)
        at org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray2(ReflectionUtils.java:208)
        at org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:159)
        at org.apache.maven.surefire.booter.ProviderFactory.invokeProvider(ProviderFactory.java:87)
        at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:153)
        at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:95)

Автор: Killer_13 25.6.2013, 22:39
@Samotnik - может вопрос и глупый, правда не вижу конфига, а сами бины(entity) как в xml дефинировали?
Что-то ваш код очень сложный. )))) Если хотите я могу свой пример закинуть.

Автор: Samotnik 2.7.2013, 11:57
PhotoTest.java
Код

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"/applicationContextTest.xml"})
public class PhotoTest {

    @Autowired
    private PhotoService photoService;

    @Test
    public void testPhoto() {
        Assert.assertNotNull(photoService);
    }
}


applicationContextTest.xml
Код

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
    http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">

    <context:spring-configured/>
    <context:component-scan base-package="com.itt.sb"/>

    <bean class="org.springframework.orm.jpa.JpaTransactionManager"
          id="transactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory"/>
    </bean>

    <bean id="photoService" class="com.itt.sb.service.impl.PhotoServiceImpl"/>

    <tx:annotation-driven mode="aspectj" transaction-manager="transactionManager"/>

    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean">
        <property name="persistenceUnitName" value="testingSetup"/>
    </bean>

</beans>


persistence.xml
Код

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0"
             xmlns="http://java.sun.com/xml/ns/persistence">

    <persistence-unit name="sb">

        <provider>org.hibernate.ejb.HibernatePersistence</provider>

        <class>com.itt.sb.db.entity.Realty</class>
        <class>com.itt.sb.db.entity.Address</class>
        <class>com.itt.sb.db.entity.Country</class>
        <class>com.itt.sb.db.entity.Description</class>
        <class>com.itt.sb.db.entity.Payment</class>
        <class>com.itt.sb.db.entity.PaymentSystemData</class>
        <class>com.itt.sb.db.entity.Photo</class>
        <class>com.itt.sb.db.entity.Statistics</class>
        <class>com.itt.sb.db.entity.BaseEntity</class>
        <class>com.itt.sb.db.entity.Moderation</class>

        <properties>
            <property name="hibernate.archive.autodetection" value="class, hbm"/>
            <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/>
            <property name="hibernate.show_sql" value="true"/>
            <property name="hibernate.connection.driver_class" value="org.hsqldb.jdbcDriver"/>
            <property name="hibernate.connection.username" value="sa"/>
            <property name="hibernate.connection.password" value=""/>
            <property name="hibernate.connection.url" value="jdbc:hsqldb:mem:realtytest"/>
            <property name="hibernate.hbm2ddl.auto" value="create"/>
        </properties>

    </persistence-unit>

</persistence>



структура
user posted image

Автор: Killer_13 3.7.2013, 01:22
Ну вы б еще пол года с ответом пождали. ))) Не смогу сейчас помочь, на работе все, а я там был сегодня, и буду снова через 2 недели. 
Будем надеяться, что кто-то подскажет.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)