<?xml version="1.0" ?>

<container xmlns="http://symfony.com/schema/dic/services"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">

    <parameters>
        <parameter key="doctrine.orm.configuration.class">Doctrine\ORM\Configuration</parameter>
        <parameter key="doctrine.orm.entity_manager.class">Doctrine\ORM\EntityManager</parameter>
        <parameter key="doctrine.orm.manager_configurator.class">Doctrine\Bundle\DoctrineBundle\ManagerConfigurator</parameter>

        <!-- cache -->
        <parameter key="doctrine.orm.cache.array.class">Doctrine\Common\Cache\ArrayCache</parameter>
        <parameter key="doctrine.orm.cache.apc.class">Doctrine\Common\Cache\ApcCache</parameter>
        <parameter key="doctrine.orm.cache.memcache.class">Doctrine\Common\Cache\MemcacheCache</parameter>
        <parameter key="doctrine.orm.cache.memcache_host">localhost</parameter>
        <parameter key="doctrine.orm.cache.memcache_port">11211</parameter>
        <parameter key="doctrine.orm.cache.memcache_instance.class">Memcache</parameter>
        <parameter key="doctrine.orm.cache.memcached.class">Doctrine\Common\Cache\MemcachedCache</parameter>
        <parameter key="doctrine.orm.cache.memcached_host">localhost</parameter>
        <parameter key="doctrine.orm.cache.memcached_port">11211</parameter>
        <parameter key="doctrine.orm.cache.memcached_instance.class">Memcached</parameter>
        <parameter key="doctrine.orm.cache.redis.class">Doctrine\Common\Cache\RedisCache</parameter>
        <parameter key="doctrine.orm.cache.redis_host">localhost</parameter>
        <parameter key="doctrine.orm.cache.redis_port">6379</parameter>
        <parameter key="doctrine.orm.cache.redis_instance.class">Redis</parameter>
        <parameter key="doctrine.orm.cache.xcache.class">Doctrine\Common\Cache\XcacheCache</parameter>
        <parameter key="doctrine.orm.cache.wincache.class">Doctrine\Common\Cache\WinCacheCache</parameter>
        <parameter key="doctrine.orm.cache.zenddata.class">Doctrine\Common\Cache\ZendDataCache</parameter>

        <!-- metadata -->
        <parameter key="doctrine.orm.metadata.driver_chain.class">Doctrine\Common\Persistence\Mapping\Driver\MappingDriverChain</parameter>
        <parameter key="doctrine.orm.metadata.annotation.class">Doctrine\ORM\Mapping\Driver\AnnotationDriver</parameter>
        <parameter key="doctrine.orm.metadata.xml.class">Doctrine\ORM\Mapping\Driver\SimplifiedXmlDriver</parameter>
        <parameter key="doctrine.orm.metadata.yml.class">Doctrine\ORM\Mapping\Driver\SimplifiedYamlDriver</parameter>
        <parameter key="doctrine.orm.metadata.php.class">Doctrine\ORM\Mapping\Driver\PHPDriver</parameter>
        <parameter key="doctrine.orm.metadata.staticphp.class">Doctrine\ORM\Mapping\Driver\StaticPHPDriver</parameter>

        <!-- cache warmer -->
        <parameter key="doctrine.orm.proxy_cache_warmer.class">Symfony\Bridge\Doctrine\CacheWarmer\ProxyCacheWarmer</parameter>

        <!-- form field factory guesser -->
        <parameter key="form.type_guesser.doctrine.class">Symfony\Bridge\Doctrine\Form\DoctrineOrmTypeGuesser</parameter>

        <!-- validator -->
        <parameter key="doctrine.orm.validator.unique.class">Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntityValidator</parameter>
        <parameter key="doctrine.orm.validator_initializer.class">Symfony\Bridge\Doctrine\Validator\DoctrineInitializer</parameter>

        <!-- security -->
        <parameter key="doctrine.orm.security.user.provider.class">Symfony\Bridge\Doctrine\Security\User\EntityUserProvider</parameter>

        <!-- listeners -->
        <parameter key="doctrine.orm.listeners.resolve_target_entity.class">Doctrine\ORM\Tools\ResolveTargetEntityListener</parameter>
        <parameter key="doctrine.orm.listeners.attach_entity_listeners.class">Doctrine\ORM\Tools\AttachEntityListenersListener</parameter>

        <!-- naming strategy -->
        <parameter key="doctrine.orm.naming_strategy.default.class">Doctrine\ORM\Mapping\DefaultNamingStrategy</parameter>
        <parameter key="doctrine.orm.naming_strategy.underscore.class">Doctrine\ORM\Mapping\UnderscoreNamingStrategy</parameter>

        <!-- entity listener resolver -->
        <parameter key="doctrine.orm.entity_listener_resolver.class">Doctrine\ORM\Mapping\DefaultEntityListenerResolver</parameter>

        <!-- second level cache -->
        <parameter key="doctrine.orm.second_level_cache.default_cache_factory.class">Doctrine\ORM\Cache\DefaultCacheFactory</parameter>
        <parameter key="doctrine.orm.second_level_cache.default_region.class">Doctrine\ORM\Cache\Region\DefaultRegion</parameter>
        <parameter key="doctrine.orm.second_level_cache.filelock_region.class">Doctrine\ORM\Cache\Region\FileLockRegion</parameter>
        <parameter key="doctrine.orm.second_level_cache.logger_chain.class">Doctrine\ORM\Cache\Logging\CacheLoggerChain</parameter>
        <parameter key="doctrine.orm.second_level_cache.logger_statistics.class">Doctrine\ORM\Cache\Logging\StatisticsCacheLogger</parameter>
        <parameter key="doctrine.orm.second_level_cache.cache_configuration.class">Doctrine\ORM\Cache\CacheConfiguration</parameter>
        <parameter key="doctrine.orm.second_level_cache.regions_configuration.class">Doctrine\ORM\Cache\RegionsConfiguration</parameter>
    </parameters>

    <services>
        <!--- Deprecated Annotation Metadata Reader Service alias, use annotation_reader service -->
        <service id="doctrine.orm.metadata.annotation_reader" alias="annotation_reader" public="false" />

        <service id="doctrine.orm.proxy_cache_warmer" class="%doctrine.orm.proxy_cache_warmer.class%" public="false">
            <tag name="kernel.cache_warmer" />
            <argument type="service" id="doctrine" />
        </service>

        <service id="form.type_guesser.doctrine" class="%form.type_guesser.doctrine.class%">
            <tag name="form.type_guesser" />
            <argument type="service" id="doctrine" />
        </service>

        <service id="form.type.entity" class="Symfony\Bridge\Doctrine\Form\Type\EntityType">
            <tag name="form.type" alias="entity" />
            <argument type="service" id="doctrine" />
        </service>

        <service id="doctrine.orm.configuration" class="%doctrine.orm.configuration.class%" abstract="true" public="false" />

        <service id="doctrine.orm.entity_manager.abstract" class="%doctrine.orm.entity_manager.class%" factory-class="%doctrine.orm.entity_manager.class%" factory-method="create" abstract="true" />

        <!-- The configurator cannot be a private service -->
        <service id="doctrine.orm.manager_configurator.abstract" class="%doctrine.orm.manager_configurator.class%" abstract="true">
            <argument type="collection" />
            <argument type="collection" />
        </service>

        <!-- validator -->
        <service id="doctrine.orm.validator.unique" class="%doctrine.orm.validator.unique.class%">
            <tag name="validator.constraint_validator" alias="doctrine.orm.validator.unique" />
            <argument type="service" id="doctrine" />
        </service>

        <service id="doctrine.orm.validator_initializer" class="%doctrine.orm.validator_initializer.class%">
            <tag name="validator.initializer" />
            <argument type="service" id="doctrine" />
        </service>

        <!-- security -->
        <service id="doctrine.orm.security.user.provider" class="%doctrine.orm.security.user.provider.class%" abstract="true" public="false">
            <argument type="service" id="doctrine" />
        </service>

        <!-- listeners -->
        <service id="doctrine.orm.listeners.resolve_target_entity" class="%doctrine.orm.listeners.resolve_target_entity.class%" public="false" />

        <!-- naming strategy -->
        <service id="doctrine.orm.naming_strategy.default" class="%doctrine.orm.naming_strategy.default.class%" public="false" />
        <service id="doctrine.orm.naming_strategy.underscore" class="%doctrine.orm.naming_strategy.underscore.class%" public="false" />
    </services>
</container>
                                                                                                                                                                                                                                                                                                                                                                                                                                             <?xml version="1.0" encoding="UTF-8" ?>

<xsd:schema xmlns="http://symfony.com/schema/dic/doctrine"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    targetNamespace="http://symfony.com/schema/dic/doctrine"
    elementFormDefault="qualified">

    <xsd:element name="config">
        <xsd:complexType>
            <xsd:all>
                <xsd:element name="dbal" type="dbal" minOccurs="0" maxOccurs="1" />
                <xsd:element name="orm" type="orm" minOccurs="0" maxOccurs="1" />
            </xsd:all>
        </xsd:complexType>
    </xsd:element>

    <xsd:complexType name="named_scalar">
        <xsd:simpleContent>
            <xsd:extension base="xsd:string">
                <xsd:attribute name="name" type="xsd:string" use="required" />
            </xsd:extension>
        </xsd:simpleContent>
    </xsd:complexType>

    <!-- DBAL configuration -->

    <xsd:attributeGroup name="connection-config">
        <xsd:attribute name="driver" type="xsd:string" />
        <xsd:attribute name="driver-class" type="xsd:string" />
        <xsd:attribute name="wrapper-class" type="xsd:string" />
        <xsd:attribute name="keep-slave" type="xsd:string" />
        <xsd:attribute name="platform-service" type="xsd:string" />
        <xsd:attribute name="shard-choser" type="xsd:string" />
        <xsd:attribute name="shard-choser-service" type="xsd:string" />
        <xsd:attribute name="auto-commit" type="xsd:string" />
        <xsd:attribute name="schema-filter" type="xsd:string" />
        <xsd:attribute name="logging" type="xsd:string" default="false" />
        <xsd:attribute name="profiling" type="xsd:string" default="false" />
        <xsd:attribute name="server-version" type="xsd:string" />
        <xsd:attributeGroup ref="driver-config" />
    </xsd:attributeGroup>

    <xsd:attributeGroup name="driver-config">
        <xsd:attribute name="dbname" type="xsd:string" />
        <xsd:attribute name="host" type="xsd:string" />
        <xsd:attribute name="port" type="xsd:string" />
        <xsd:attribute name="user" type="xsd:string" />
        <xsd:attribute name="password" type="xsd:string" />
        <xsd:attribute name="path" type="xsd:string" />
        <xsd:attribute name="unix-socket" type="xsd:string" />
        <xsd:attribute name="memory" type="xsd:string" />
        <xsd:attribute name="charset" type="xsd:string" />
        <xsd:attribute name="persistent" type="xsd:string" />
        <xsd:attribute name="protocol" type="xsd:string" />
        <xsd:attribute name="server" type="xsd:string" />
        <xsd:attribute name="service" type="xsd:string" />
        <xsd:attribute name="servicename" type="xsd:string" />
        <xsd:attribute name="session-mode" type="xsd:string" />
        <xsd:attribute name="sslmode" type="xsd:string" />
        <xsd:attribute name="pooled" type="xsd:string" />
        <xsd:attribute name="multiple-active-result-sets" type="xsd:string" />
    </xsd:attributeGroup>

    <xsd:group name="connection-child-config">
        <xsd:choice>
            <xsd:element name="option" type="option" />
            <xsd:element name="mapping-type" type="named_scalar" />
            <xsd:element name="slave" type="slave" />
            <xsd:element name="shard" type="shard" />
        </xsd:choice>
    </xsd:group>

    <xsd:complexType name="dbal">
        <xsd:choice minOccurs="0" maxOccurs="unbounded">
            <xsd:element name="connection" type="connection" />
            <xsd:element name="type" type="named_scalar" />
            <xsd:group ref="connection-child-config" />
        </xsd:choice>

        <xsd:attribute name="default-connection" type="xsd:string" />
        <xsd:attributeGroup ref="connection-config" />
    </xsd:complexType>

    <xsd:complexType name="option">
        <xsd:simpleContent>
            <xsd:extension base="xsd:string">
                <xsd:attribute name="key" type="xsd:string" use="required" />
            </xsd:extension>
        </xsd:simpleContent>
    </xsd:complexType>

    <xsd:complexType name="connection">
        <xsd:group ref="connection-child-config" minOccurs="0" maxOccurs="unbounded" />

        <xsd:attribute name="name" type="xsd:string" use="required" />
        <xsd:attributeGroup ref="connection-config" />
    </xsd:complexType>

    <xsd:complexType name="slave">
        <xsd:attribute name="name" type="xsd:string" use="required" />
        <xsd:attributeGroup ref="driver-config" />
    </xsd:complexType>

    <xsd:complexType name="shard">
        <xsd:attribute name="id" type="xsd:integer" use="required" />
        <xsd:attributeGroup ref="driver-config" />
    </xsd:complexType>

    <!-- ORM configuration -->

    <xsd:complexType name="mapping">
        <xsd:attribute name="name" type="xsd:string" use="required" />
        <xsd:attribute name="type" type="xsd:string" />
        <xsd:attribute name="dir" type="xsd:string" />
        <xsd:attribute name="alias" type="xsd:string" />
        <xsd:attribute name="prefix" type="xsd:string" />
        <xsd:attribute name="is-bundle" type="xsd:string" />
    </xsd:complexType>

    <xsd:complexType name="orm">
        <xsd:choice minOccurs="0" maxOccurs="unbounded">
            <xsd:element name="entity-manager" type="entity_manager" />
            <xsd:element name="resolve-target-entity" type="resolve_target_entity" minOccurs="0" maxOccurs="unbounded" />
            <xsd:group ref="entity-manager-child-config" />
        </xsd:choice>

        <xsd:attribute name="default-entity-manager" type="xsd:string" />
        <xsd:attribute name="proxy-dir" type="xsd:string" />
        <xsd:attribute name="proxy-namespace" type="xsd:string" />
        <xsd:attribute name="auto-generate-proxy-classes" type="xsd:string" default="false" />
        <xsd:attributeGroup ref="entity-manager-config" />
    </xsd:complexType>

    <xsd:complexType name="resolve_target_entity">
        <xsd:simpleContent>
            <xsd:extension base="xsd:string">
                <xsd:attribute name="interface" type="xsd:string" use="required" />
            </xsd:extension>
        </xsd:simpleContent>
    </xsd:complexType>

    <xsd:complexType name="cache_driver">
        <!-- This is not consistent with the Symfony config. These string elements should be attributes.
        TODO: change it for 2.0
        -->
        <xsd:all>
            <xsd:element name="class" type="xsd:string" minOccurs="0" maxOccurs="1" />
            <xsd:element name="host" type="xsd:string" minOccurs="0" maxOccurs="1" />
            <xsd:element name="port" type="xsd:string" minOccurs="0" maxOccurs="1" />
            <xsd:element name="instance-class" type="xsd:string" minOccurs="0" maxOccurs="1" />
        </xsd:all>

        <xsd:attribute name="type" type="xsd:string" />
        <xsd:attribute name="id" type="xsd:string" />
        <xsd:attribute name="namespace" type="xsd:string" />
    </xsd:complexType>

    <xsd:complexType name="entity_listeners">
        <xsd:choice minOccurs="1">
            <xsd:element name="entity" type="entity_listeners_entity" minOccurs="1" maxOccurs="unbounded" />
        </xsd:choice>
    </xsd:complexType>

    <xsd:complexType name="entity_listeners_entity">
        <xsd:choice minOccurs="1">
            <xsd:element name="listener" type="entity_listeners_listener" minOccurs="1" maxOccurs="unbounded" />
        </xsd:choice>
        <xsd:attribute name="class" type="xsd:string" />
    </xsd:complexType>

    <xsd:complexType name="entity_listeners_listener">
        <xsd:choice minOccurs="1">
            <xsd:element name="event" type="entity_listeners_event" minOccurs="1" maxOccurs="unbounded" />
        </xsd:choice>
        <xsd:attribute name="class" type="xsd:string" />
    </xsd:complexType>

    <xsd:complexType name="entity_listeners_event">
        <xsd:attribute name="type" type="xsd:string" />
        <xsd:attribute name="method" type="xsd:string" />
    </xsd:complexType>

    <xsd:complexType name="entity_manager">
        <xsd:group ref="entity-manager-child-config" minOccurs="0" maxOccurs="unbounded" />

        <xsd:attribute name="name" type="xsd:string" use="required" />
        <xsd:attributeGroup ref="entity-manager-config" />
    </xsd:complexType>

    <xsd:group name="entity-manager-child-config">
        <xsd:choice>
            <xsd:element name="mapping" type="mapping" />
            <xsd:element name="metadata-cache-driver" type="cache_driver" minOccurs="0" maxOccurs="1" />
            <xsd:element name="result-cache-driver" type="cache_driver" minOccurs="0" maxOccurs="1" />
            <xsd:element name="query-cache-driver" type="cache_driver" minOccurs="0" maxOccurs="1" />
            <xsd:element name="dql" type="dql" minOccurs="0" maxOccurs="1" />
            <xsd:element name="hydrator" type="named_scalar" minOccurs="0" maxOccurs="unbounded" />
            <xsd:element name="filter" type="filter" minOccurs="0" maxOccurs="unbounded" />
            <xsd:element name="entity-listeners" type="entity_listeners" minOccurs="0" maxOccurs="1" />
            <xsd:element name="second-level-cache" type="second-level-cache" minOccurs="0" maxOccurs="1" />
        </xsd:choice>
    </xsd:group>

    <xsd:attributeGroup name="entity-manager-config">
        <xsd:attribute name="auto-mapping" type="xsd:string" />
        <xsd:attribute name="connection" type="xsd:string" />
        <xsd:attribute name="default-repository-class" type="xsd:string" />
        <xsd:attribute name="class-metadata-factory-name" type="xsd:string" />
        <xsd:attribute name="naming-strategy" type="xsd:string" />
        <xsd:attribute name="entity-listener-resolver" type="xsd:string" />
        <xsd:attribute name="repository-factory" type="xsd:string" />
        <!-- deprecated attributes, use the child element instead -->
        <xsd:attribute name="result-cache-driver" type="xsd:string" />
        <xsd:attribute name="metadata-cache-driver" type="xsd:string" />
        <xsd:attribute name="query-cache-driver" type="xsd:string" />
    </xsd:attributeGroup>

    <xsd:complexType name="filter" mixed="true">
        <xsd:choice minOccurs="0">
            <xsd:element name="parameter" type="named_scalar" minOccurs="0" maxOccurs="unbounded" />
        </xsd:choice>
        <xsd:attribute name="name" type="xsd:string" use="required" />
        <xsd:attribute name="class" type="xsd:string" />
        <xsd:attribute name="enabled" type="xsd:boolean" />
    </xsd:complexType>

    <xsd:complexType name="second-level-cache-region" mixed="true">
        <xsd:choice minOccurs="0" maxOccurs="unbounded">
            <xsd:element name="cache-driver" type="cache_driver" minOccurs="0" maxOccurs="1" />
        </xsd:choice>
        <xsd:attribute name="name" type="xsd:string" />
        <xsd:attribute name="type" type="xsd:string" />
        <xsd:attribute name="service" type="xsd:string" />
        <xsd:attribute name="lifetime" type="xsd:integer" />
        <xsd:attribute name="lock-lifetime" type="xsd:integer" />
        <xsd:attribute name="cache-driver" type="xsd:string" />
    </xsd:complexType>

    <xsd:complexType name="second-level-cache-logger" mixed="true">
        <xsd:attribute name="name" type="xsd:string" />
        <xsd:attribute name="service" type="xsd:string" />
    </xsd:complexType>

    <xsd:complexType name="second-level-cache" mixed="true">
         <xsd:choice minOccurs="0" maxOccurs="unbounded">
            <xsd:element name="logger" type="second-level-cache-logger" minOccurs="0" maxOccurs="unbounded" />
            <xsd:element name="region" type="second-level-cache-region" minOccurs="0" maxOccurs="unbounded" />
            <xsd:element name="region-cache-driver" type="cache_driver" minOccurs="0" maxOccurs="1" />
        </xsd:choice>
        <xsd:attribute name="enabled" type="xsd:boolean" default="true"/>
        <xsd:attribute name="log-enabled" type="xsd:boolean" default="true"/>
        <xsd:attribute name="factory" type="xsd:string" />
        <xsd:attribute name="query-validator" type="xsd:string" />
        <xsd:attribute name="region-lifetime" type="xsd:integer" />
        <xsd:attribute name="region-lock-lifetime" type="xsd:integer" />
    </xsd:complexType>
    
    <xsd:complexType name="dql">
        <xsd:choice minOccurs="0" maxOccurs="unbounded">
            <xsd:element name="string-function" type="named_scalar" />
            <xsd:element name="numeric-function" type="named_scalar" />
            <xsd:element name="datetime-function" type="named_scalar" />
        </xsd:choice>
    </xsd:complexType>
</xsd:schema>
