<?xml version="1.0" encoding="UTF-8"?>
<!--
  Begin Copyright

  Licensed Materials - Property of IBM

  Virtual Member Manager

  (C) Copyright IBM Corp. 2005 All Rights Reserved.

  US Government Users Restricted Rights - Use, duplication or
  disclosure restricted by GSA ADP Schedule Contract with IBM Corp.

  @(#) WIMBASE/ws/code/wim.core/config/wimconfig.xsd, wim.base, VMMX.WIMBASE, 200906292100 1.3.1.1 09/06/29 06:38:32

  End Copyright
-->
<xsd:schema targetNamespace="http://www.ibm.com/websphere/wim/config" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore"	xmlns:config="http://www.ibm.com/websphere/wim/config" ecore:package="com.ibm.ws.wim.configmodel"  version="1.0" elementFormDefault="qualified" attributeFormDefault="unqualified">


  <!-- *************************************** ConfigurationProvider Level ****************************************** -->
  <xsd:element name="configurationProvider">
    <xsd:complexType>
      <xsd:sequence>
        <!-- Dynamic or static model config -->
        <xsd:choice minOccurs="1" maxOccurs="1">
          <xsd:element name="dynamicModel">
            <xsd:complexType>
              <xsd:attribute name="xsdFileName" type="xsd:string" use="optional" default="wimextension.xsd"/>
              <xsd:attribute name="useGlobalSchema" type="xsd:boolean" use="optional" default="false"/>
            </xsd:complexType>
          </xsd:element>
          <xsd:element name="staticModel">
            <xsd:complexType>
              <xsd:sequence>
                <xsd:element name="packageName" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/>
              </xsd:sequence>
              <xsd:attribute name="useGlobalSchema" type="xsd:boolean" use="optional" default="false"/>
            </xsd:complexType>
          </xsd:element>
        </xsd:choice>
        <!-- Supported Entity Types -->
        <xsd:element name="supportedEntityTypes" minOccurs="0" maxOccurs="unbounded">
          <xsd:complexType>
            <xsd:sequence>
              <xsd:element name="rdnProperties" type="xsd:string" minOccurs="1" maxOccurs="unbounded"/>
            </xsd:sequence>
            <xsd:attribute name="name" type="xsd:string" use="required"/>
            <xsd:attribute name="defaultParent" type="xsd:string" use="required"/>
          </xsd:complexType>
        </xsd:element>
                

        <xsd:element name="entryMappingRepository" type="config:EntryMappingRepositoryType" minOccurs="0" maxOccurs="1"/>
        <xsd:element name="propertyExtensionRepository" type="config:PropertyExtensionRepositoryType" minOccurs="0" maxOccurs="1"/>
        <xsd:element name="repositories" type="config:ProfileRepositoryType" minOccurs="1" maxOccurs="unbounded"/>
        <xsd:element name="realmConfiguration" type="config:RealmConfigurationType" minOccurs="0" maxOccurs="1"/>
        <!--  PluginManager Configuration -->
        <xsd:element name="pluginManagerConfiguration" type="config:pluginManagerConfigurationType" minOccurs="0" maxOccurs="1"/>
        <!--  Authorization Configuration -->
        <xsd:element name="authorization" type="config:AuthorizationType" minOccurs="1" maxOccurs="1"/>
      </xsd:sequence>
          
      <!-- Common Attributes -->
      <xsd:attribute name="maxSearchResults" type="xsd:int" use="optional" default="2000"/>
      <xsd:attribute name="maxPagingResults" type="xsd:int" use="optional" default="500"/>
      <xsd:attribute name="maxTotalPagingResults" type="xsd:int" use="optional" default="1000"/>
      <xsd:attribute name="searchTimeOut" type="xsd:string" use="optional" default="600000"/>
      <xsd:attribute name="pagedCacheTimeOut" type="xsd:int" use="optional" default="900"/>
      <xsd:attribute name="pagingEntityObject" type="xsd:boolean" use="optional" default="true"/>
      <xsd:attribute name="pagingCachesDiskOffLoad" type="xsd:boolean" use="optional" default="false"/>
    </xsd:complexType>
  </xsd:element>



  <!-- *************************************** Repositories ****************************************** -->
    
  <!-- Applicable for all repositories (entry mapping, profile, and property extension) -->
  <xsd:complexType name="RepositoryType">
    <xsd:attribute name="id" type="xsd:ID" use="required"/>
    <xsd:attribute name="adapterClassName" type="xsd:string"/>
  </xsd:complexType>
     
  <!-- Profile Repositories -->
  <xsd:complexType name="ProfileRepositoryType">
    <xsd:complexContent>
      <xsd:extension base="config:RepositoryType">
        <xsd:sequence>

          <!-- Used for virtual member manager base entry to Repository base entry mapping -->
          <xsd:element name="baseEntries" minOccurs="1" maxOccurs="unbounded">
            <xsd:complexType>
              <xsd:attribute name="name" type="xsd:token" use="required"/>
              <xsd:attribute name="nameInRepository" type="xsd:token" use="optional"/>
            </xsd:complexType>
          </xsd:element>

          <!--  Entity types which are not allowed for the operations -->
          <xsd:element name="EntityTypesNotAllowCreate" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/>
          <xsd:element name="EntityTypesNotAllowUpdate" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/>
          <xsd:element name="EntityTypesNotAllowRead" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/>
          <xsd:element name="EntityTypesNotAllowDelete" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/>

          <!-- repositories where groups can have members -->
          <xsd:element name="repositoriesForGroups" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/>

          <xsd:element name="loginProperties" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/>
 
          <!-- Used for new cutomer defined properties -->
          <xsd:element name="CustomProperties" minOccurs="0" maxOccurs="unbounded">
            <xsd:complexType>
              <xsd:attribute name="name" type="xsd:string" use="required"/>
              <xsd:attribute name="value" type="xsd:string" use="required"/>
            </xsd:complexType>
          </xsd:element>
        </xsd:sequence>
        <xsd:attribute name="readOnly" type="xsd:boolean" default="false"/>
        <xsd:attribute name="supportPaging" type="xsd:boolean" use="required"/>
        <xsd:attribute name="supportSorting" type="xsd:boolean" use="optional" default="false"/>
        <xsd:attribute name="supportTransactions" type="xsd:boolean" use="optional" default="false"/>
        <xsd:attribute name="isExtIdUnique" type="xsd:boolean" use="optional" default="true"/>
        <xsd:attribute name="supportExternalName" type="xsd:boolean" default="false"/>
        <xsd:attribute name="supportAsyncMode" type="xsd:boolean" default="false"/>
        <xsd:attribute name="supportChangeLog" use="optional" default="none" type="xsd:token"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
 
  <!-- Entry Mapping Respository -->
  <xsd:complexType name="EntryMappingRepositoryType">
    <xsd:complexContent>
      <xsd:extension base="config:RepositoryType">
        <xsd:attribute name="dataSourceName" type="xsd:string" use="required"/>
        <xsd:attribute name="databaseType" type="xsd:string" use="required"/>
        <xsd:attribute name="dbURL" type="xsd:string" use="required"/>
        <xsd:attribute name="dbAdminId" type="xsd:string" use="optional"/>
        <xsd:attribute name="dbAdminPassword" type="xsd:string" use="optional"/>
        <xsd:attribute name="JDBCDriverClass" type="xsd:string" use="optional"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
    
  <!-- Property Extension Respository -->
  <xsd:complexType name="PropertyExtensionRepositoryType">
    <xsd:complexContent>
      <xsd:extension base="config:RepositoryType">
        <xsd:attribute name="dataSourceName" type="xsd:string" use="required"/>
        <xsd:attribute name="databaseType" type="xsd:string" use="required"/>
        <xsd:attribute name="dbURL" type="xsd:string" use="required"/>
        <xsd:attribute name="dbAdminId" type="xsd:string" use="optional"/>
        <xsd:attribute name="dbAdminPassword" type="xsd:string" use="optional"/>
        <xsd:attribute name="JDBCDriverClass" type="xsd:string" use="optional"/>
        <xsd:attribute name="entityRetrievalLimit" type="xsd:int" use="optional" default="50"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
    
  <!-- Database Respository -->
  <xsd:complexType name="DatabaseRepositoryType">
    <xsd:complexContent>
      <xsd:extension base="config:ProfileRepositoryType">
        <xsd:attribute name="dataSourceName" type="xsd:string" use="required"/>
        <xsd:attribute name="databaseType" type="xsd:string" use="required"/>
        <xsd:attribute name="dbURL" type="xsd:string" use="required"/>
        <xsd:attribute name="dbAdminId" type="xsd:string" use="optional"/>
        <xsd:attribute name="dbAdminPassword" type="xsd:string" use="optional"/>
        <xsd:attribute name="JDBCDriverClass" type="xsd:string" use="optional"/>
        <xsd:attribute name="entityRetrievalLimit" type="xsd:int" use="optional" default="50"/>
        <xsd:attribute name="saltLength" type="xsd:int" use="optional" default="12"/>
        <xsd:attribute name="encryptionKey" type="xsd:string" use="optional"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
    
  <!-- File Respository -->
  <xsd:complexType name="FileRepositoryType">
    <xsd:complexContent>
      <xsd:extension base="config:ProfileRepositoryType">
        <xsd:attribute name="baseDirectory" type="xsd:string" use="optional"/>
        <xsd:attribute name="fileName" type="xsd:string" use="optional"/>
        <xsd:attribute name="saltLength" type="xsd:int" use="optional" default="12"/>
        <xsd:attribute name="messageDigestAlgorithm" type="xsd:string" use="optional" default="SHA-1"/>
        <xsd:attribute name="caseSensitive" type="xsd:boolean" default="false"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>

  <!-- Ldap Respository -->
  <xsd:complexType name="LdapRepositoryType">
    <xsd:complexContent>
      <xsd:extension base="config:ProfileRepositoryType">
        <xsd:sequence>

          <xsd:element name="ldapServerConfiguration" minOccurs="1" maxOccurs="1">
            <xsd:complexType>
              <xsd:sequence>
                <xsd:element name="ldapServers" minOccurs="1" maxOccurs="unbounded">
                  <xsd:complexType>
                    <xsd:sequence>
                      <xsd:element name="connections" minOccurs="1" maxOccurs="unbounded">
                        <xsd:complexType>
                          <xsd:attribute name="host" type="xsd:string" use="required"/>
                          <xsd:attribute name="port" type="xsd:int" default="389"/>
                        </xsd:complexType>
                      </xsd:element>
                      <xsd:element name="environmentProperties" minOccurs="0" maxOccurs="unbounded">
                        <xsd:complexType>
                          <xsd:attribute name="name" type="xsd:string" use="required"/>
                          <xsd:attribute name="value" type="xsd:string" use="required"/>
                        </xsd:complexType>
                      </xsd:element>
                    </xsd:sequence>
                    <xsd:attribute name="bindDN" type="config:DNType"/>
                    <xsd:attribute name="bindPassword" type="xsd:string"/>
                    <xsd:attribute name="authentication" type="xsd:string" default="simple"/>
                    <xsd:attribute name="referal" type="xsd:token" default="ignore"/>
                    <xsd:attribute name="derefAliases" type="xsd:token" default="always"/>
                    <xsd:attribute name="sslEnabled" type="xsd:boolean" default="false"/>
                    <xsd:attribute name="connectionPool" type="xsd:boolean" default="false"/>
                    <xsd:attribute name="connectTimeout" type="xsd:int" default="0"/>
                  </xsd:complexType>
                </xsd:element>
              </xsd:sequence>
              <xsd:attribute name="searchTimeLimit" type="xsd:int" default="0"/>
              <xsd:attribute name="searchCountLimit" type="xsd:int" default="0"/>
              <xsd:attribute name="searchPageSize" type="xsd:int" default="0"/>
              <xsd:attribute name="attributeRangeStep" type="xsd:int" default="0"/>
              <xsd:attribute name="sslConfiguration" type="xsd:string"/>
              <xsd:attribute name="sslKeyStore" type="xsd:string"/>
              <xsd:attribute name="sslKeyStoreType" type="xsd:string"/>
              <xsd:attribute name="sslKeyStorePassword" type="xsd:string"/>
              <xsd:attribute name="sslTrustStore" type="xsd:string"/>
              <xsd:attribute name="sslTrustStoreType" type="xsd:string"/>
              <xsd:attribute name="sslTrustStorePassword" type="xsd:string"/>
              <xsd:attribute name="allowWriteToSecondaryServers" type="xsd:boolean" default="false"/>
              <xsd:attribute name="returnToPrimaryServer" type="xsd:boolean" default="true"/>
              <xsd:attribute name="primaryServerQueryTimeInterval" type="xsd:int" default="15"/>
            </xsd:complexType>
          </xsd:element>

          <xsd:element name="ldapEntityTypes" minOccurs="0" maxOccurs="unbounded">
            <xsd:complexType>
              <xsd:sequence>
                <xsd:element name="rdnAttributes" minOccurs="0" maxOccurs="unbounded">
                  <xsd:complexType>
                    <xsd:attribute name="name" type="xsd:string" use="required"/>
                    <xsd:attribute name="objectClass" type="xsd:string"/>
                  </xsd:complexType>
                </xsd:element>
                <xsd:element name="objectClasses" type="xsd:string" minOccurs="1" maxOccurs="unbounded"/>
                <xsd:element name="objectClassesForCreate" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/>
                <xsd:element name="searchBases" type="xsd:token" minOccurs="0" maxOccurs="unbounded"/>
              </xsd:sequence>
              <xsd:attribute name="name" type="xsd:string" use="required"/>
              <xsd:attribute name="searchFilter" type="xsd:string"/>
            </xsd:complexType>
          </xsd:element>

          <xsd:element name="groupConfiguration" minOccurs="0" maxOccurs="1">
            <xsd:complexType>
              <xsd:sequence>
                <xsd:element name="memberAttributes" minOccurs="0" maxOccurs="unbounded">
                  <xsd:complexType>
                    <xsd:attribute name="name" type="xsd:string" use="required"/>
                    <xsd:attribute name="objectClass" type="xsd:string" use="optional"/>
                    <xsd:attribute name="scope" type="xsd:token" default="direct"/>
                    <xsd:attribute name="dummyMember" type="xsd:string"/>
                  </xsd:complexType>
                </xsd:element>
                <xsd:element name="dynamicMemberAttributes" minOccurs="0" maxOccurs="unbounded">
                  <xsd:complexType>
                    <xsd:attribute name="name" type="xsd:string" use="required"/>
                    <xsd:attribute name="objectClass" type="xsd:string" use="required"/>
                  </xsd:complexType>
                </xsd:element>
                <xsd:element name="membershipAttribute" minOccurs="0" maxOccurs="1">
                  <xsd:complexType>
                    <xsd:attribute name="name" type="xsd:string" use="required"/>
                    <xsd:attribute name="scope" type="xsd:token" default="direct"/>
                  </xsd:complexType>
                </xsd:element>
              </xsd:sequence>
              <xsd:attribute name="updateGroupMembership" type="xsd:boolean" default="false"/>
            </xsd:complexType>
          </xsd:element>

          <xsd:element name="attributeConfiguration" minOccurs="0" maxOccurs="1">
            <xsd:complexType>
              <xsd:sequence>
                <xsd:element name="externalIdAttributes" type="config:AttributeType" minOccurs="0" maxOccurs="unbounded"/>
                <xsd:element name="attributes" type="config:AttributeType" minOccurs="0" maxOccurs="unbounded"/>
                <xsd:element name="propertiesNotSupported" minOccurs="0" maxOccurs="unbounded">
                  <xsd:complexType>
                    <xsd:sequence>
                      <xsd:element name="entityTypes" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/>
                    </xsd:sequence>
                    <xsd:attribute name="name" type="xsd:string" use="required"/>
                  </xsd:complexType>
                </xsd:element>
              </xsd:sequence>
            </xsd:complexType>
          </xsd:element>

          <xsd:element name="contextPool" minOccurs="0" maxOccurs="1">
            <xsd:complexType>
              <xsd:attribute name="enabled" type="xsd:boolean" default="true"/>
              <xsd:attribute name="initPoolSize" type="config:initPoolSizeType" default="1"/>
              <xsd:attribute name="maxPoolSize" type="config:maxPoolSizeType" default="0"/>
              <xsd:attribute name="prefPoolSize" type="config:prefPoolSizeType" default="3"/>
              <xsd:attribute name="poolTimeOut" type="config:poolTimeOutType" default="0"/>
              <xsd:attribute name="poolWaitTime" type="config:poolWaitTimeType" default="3000"/>
            </xsd:complexType>
          </xsd:element>

          <xsd:element name="cacheConfiguration" minOccurs="0" maxOccurs="1">
            <xsd:complexType>
              <xsd:sequence>
                <xsd:element name="attributesCache" minOccurs="0" maxOccurs="1">
                  <xsd:complexType>
                    <xsd:attribute name="enabled" type="xsd:boolean" default="true"/>
                    <xsd:attribute name="cacheSize" type="config:cacheSizeType" default="4000"/>
                    <xsd:attribute name="cacheTimeOut" type="config:cacheTimeOutType" default="1200"/>
                    <xsd:attribute name="attributeSizeLimit" type="config:cacheSizeLimitType" default="2000"/>
                    <xsd:attribute name="serverTTLAttribute" type="xsd:string"/>
                    <xsd:attribute name="cacheDistPolicy" type="xsd:token" default="none"/>
                  </xsd:complexType>
                </xsd:element>
                <xsd:element name="searchResultsCache" minOccurs="0" maxOccurs="1">
                  <xsd:complexType>
                    <xsd:attribute name="enabled" type="xsd:boolean" default="true"/>
                    <xsd:attribute name="cacheSize" type="config:cacheSizeType" default="2000"/>
                    <xsd:attribute name="cacheTimeOut" type="config:cacheTimeOutType" default="600"/>
                    <xsd:attribute name="searchResultSizeLimit" type="config:cacheSizeLimitType" default="1000"/>
                    <xsd:attribute name="cacheDistPolicy" type="xsd:token" default="none"/>
                  </xsd:complexType>
                </xsd:element>
              </xsd:sequence>
              <xsd:attribute name="cachesDiskOffLoad" type="xsd:boolean" default="false"/>
            </xsd:complexType>
          </xsd:element>
        </xsd:sequence>
        <xsd:attribute name="ldapServerType" type="xsd:token" use="required"/>
        <xsd:attribute name="certificateMapMode" type="xsd:token" default="exactdn"/>
        <xsd:attribute name="certificateFilter" type="xsd:string"/>
        <xsd:attribute name="translateRDN" type="xsd:boolean" use="optional" default="false"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
    
  <!-- Bridge Adapter Respository -->
  <xsd:complexType name="SPIBridgeRepositoryType">
    <xsd:complexContent>
      <xsd:extension base="config:ProfileRepositoryType">
        <xsd:attribute name="WMMAdapterClassName" type="xsd:string" use="required"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  
  
  <!-- *************************************** Realm Information ****************************************** -->
  <xsd:complexType name="RealmConfigurationType">
    <xsd:sequence>
      <xsd:element name="realms" type="config:RealmType" minOccurs="1" maxOccurs="unbounded"/>
    </xsd:sequence>
    <xsd:attribute name="defaultRealm" type="xsd:string" use="required" />
  </xsd:complexType>

  <xsd:complexType name="RealmDefaultParentType">
    <xsd:attribute name="entityTypeName" type="xsd:string" use="required" />
    <xsd:attribute name="parentUniqueName" type="xsd:string" use="required"/>
  </xsd:complexType>

  <xsd:complexType name="UserRegistryInfoMappingType">
    <xsd:attribute name="propertyForInput" type="xsd:string" use="required" />
    <xsd:attribute name="propertyForOutput" type="xsd:string" use="required"/>
  </xsd:complexType>

  <xsd:complexType name="RealmType">
    <xsd:sequence>
      <xsd:element name="participatingBaseEntries" minOccurs="1" maxOccurs="unbounded">
        <xsd:complexType>
          <xsd:attribute name="name" type="xsd:token" use="required"/>
        </xsd:complexType>
      </xsd:element>
      <xsd:element name="defaultParents" type="config:RealmDefaultParentType" minOccurs="0" maxOccurs="unbounded"/>
      <xsd:element name="uniqueUserIdMapping" type="config:UserRegistryInfoMappingType" minOccurs="1" maxOccurs="1"/>
      <xsd:element name="userSecurityNameMapping" type="config:UserRegistryInfoMappingType" minOccurs="1" maxOccurs="1"/>
      <xsd:element name="userDisplayNameMapping" type="config:UserRegistryInfoMappingType" minOccurs="1" maxOccurs="1"/>
      <xsd:element name="uniqueGroupIdMapping" type="config:UserRegistryInfoMappingType" minOccurs="1" maxOccurs="1"/>
      <xsd:element name="groupSecurityNameMapping" type="config:UserRegistryInfoMappingType" minOccurs="1" maxOccurs="1"/>
      <xsd:element name="groupDisplayNameMapping" type="config:UserRegistryInfoMappingType" minOccurs="1" maxOccurs="1"/>
    </xsd:sequence>
    <xsd:attribute name="name" type="xsd:string" use="required"/>
    <xsd:attribute name="securityUse" type="xsd:string" use="optional" default="active" />
    <xsd:attribute name="delimiter" type="xsd:string" use="optional" default="@" />
    <xsd:attribute name="allowOperationIfReposDown" type="xsd:boolean" use="optional" default="false"/>    
  </xsd:complexType>
	    
  <!-- *************************************** PluginManagerConfig ****************************************** -->
  <xsd:complexType name="TopicSubscriber">
    <xsd:sequence>
      <xsd:element name="className" type="xsd:string"/>
    </xsd:sequence>
    <xsd:attribute name="topicSubscriberName" type="xsd:string"/>
    <xsd:attribute name="topicSubscriberType" type="config:SubscriberType"/>
  </xsd:complexType>
  <xsd:complexType name="NotificationSubscriber">
    <xsd:sequence>
      <xsd:element name="notificationSubscriberReference" type="xsd:string"/>
      <xsd:element name="realmList" default="All">
        <xsd:simpleType>
          <xsd:list itemType="xsd:string"/>
        </xsd:simpleType>
      </xsd:element>
    </xsd:sequence>
  </xsd:complexType>
  <xsd:complexType name="ModificationSubscriber">
    <xsd:sequence>
      <xsd:element name="modificationSubscriberReference" type="xsd:string"/>
      <xsd:element name="realmList" default="All">
        <xsd:simpleType>
          <xsd:list itemType="xsd:string"/>
        </xsd:simpleType>
      </xsd:element>
    </xsd:sequence>
  </xsd:complexType>
  <!-- Define the two types of TopicSubscribers - 'NotificationSubscriber' & 'ModificationSubscriber' -->
  <xsd:simpleType name="SubscriberType">
    <xsd:restriction base="xsd:string">
      <xsd:enumeration value="NotificationSubscriber"/>
      <xsd:enumeration value="ModificationSubscriber"/>
    </xsd:restriction>
  </xsd:simpleType>
  <!-- TopicSubscribers that are implemented -->
  <xsd:complexType name="TopicSubscriberList">
    <xsd:sequence>
      <xsd:element name="topicSubscriber" type="config:TopicSubscriber" minOccurs="0" maxOccurs="unbounded"/>
    </xsd:sequence>
  </xsd:complexType>
  <!--  List of Notification & Modification Type Subscribers -->
  <xsd:complexType name="NotificationSubscriberList">
    <xsd:sequence>
      <xsd:element name="notificationSubscriber" type="config:NotificationSubscriber" minOccurs="0" maxOccurs="unbounded"/>
    </xsd:sequence>
  </xsd:complexType>
  <xsd:complexType name="ModificationSubscriberList">
    <xsd:sequence>
      <xsd:element name="modificationSubscriber" type="config:ModificationSubscriber" minOccurs="0" maxOccurs="unbounded"/>
    </xsd:sequence>
  </xsd:complexType>
  <!-- 
      Topic Registration List
  -->
  <xsd:complexType name="TopicRegistrationList">
    <xsd:sequence>
      <xsd:element name="topicEmitter" type="config:TopicEmitter" minOccurs="0" maxOccurs="unbounded"/>
    </xsd:sequence>
  </xsd:complexType>
	

  <xsd:complexType name="pluginManagerConfigurationType">
    <xsd:sequence>
      <xsd:element name="topicSubscriberList" type="config:TopicSubscriberList"/>
      <xsd:element name="topicRegistrationList" type="config:TopicRegistrationList"/>
    </xsd:sequence>
  </xsd:complexType>

  <!-- Topic Emitter Definition-->
  <xsd:complexType name="TopicEmitter">
    <xsd:sequence>
      <xsd:element name="preExit" type="config:PreExit"/>
      <xsd:element name="inlineExit" type="config:InlineExit" minOccurs="0" maxOccurs="unbounded"/>
      <xsd:element name="postExit" type="config:PostExit"/>
    </xsd:sequence>
    <xsd:attribute name="topicEmitterName" type="xsd:string"/>
  </xsd:complexType>
  <!-- 
      PreExit of a TopicEmitter: NotificationType Subscribers are called before ModificationType subscribers
      are invoked.
  -->
  <xsd:complexType name="PreExit">
    <xsd:sequence>
      <xsd:element name="notificationSubscriberList" type="config:NotificationSubscriberList"/>
      <xsd:element name="modificationSubscriberList" type="config:ModificationSubscriberList"/>
    </xsd:sequence>
  </xsd:complexType>
  <!-- 	
      InlineExit of a TopicEmitter: MoficiationType subscribers are called and the order in which they are
      listed is the order in which they are executed.
  -->
  <xsd:complexType name="InlineExit">
    <xsd:sequence>
      <xsd:element name="modificationSubscriberList" type="config:ModificationSubscriberList"/>
    </xsd:sequence>
    <xsd:attribute name="inlineExitName" type="xsd:string" use="required"/>
  </xsd:complexType>
  <!-- 
      PostExit of a TopicEmitter: ModificationType subscribers are invoked before the execution of 
      NotificationType subscribers. The order of execution of NotificationType subscribers is irrelevant.
  -->
  <xsd:complexType name="PostExit">
    <xsd:sequence>
      <xsd:element name="modificationSubscriberList" type="config:ModificationSubscriberList"/>
      <xsd:element name="notificationSubscriberList" type="config:NotificationSubscriberList"/>
    </xsd:sequence>
  </xsd:complexType>


  <!-- ***************************************  Authorization ****************************************** -->
  <xsd:complexType name="AttributeGroupType">
    <xsd:sequence>
      <xsd:element name="groupName" type="xsd:string" maxOccurs="1" minOccurs="1"/>
      <xsd:element name="attributeNames" type="xsd:string" maxOccurs="unbounded" minOccurs="1"/>
    </xsd:sequence>
  </xsd:complexType>
	

  <xsd:complexType name="AuthorizationType">
    <xsd:sequence>
      <xsd:element name="attributeGroups" type="config:AttributeGroupType" maxOccurs="unbounded" minOccurs="0"/>
    </xsd:sequence>
        

    <xsd:attribute name="isSecurityEnabled" type="xsd:boolean" use="required"/>
    <xsd:attribute name="useSystemJACCProvider" type="xsd:boolean" use="required"/>
    <xsd:attribute name="importPolicyFromFile" type="xsd:boolean" use="required"/>
    <xsd:attribute name="isAttributeGroupingEnabled" type="xsd:boolean" use="required"/>
    <xsd:attribute name="defaultAttributeGroup" type="xsd:string" use="required"/>

    <xsd:attribute name="jaccPolicyClass" type="xsd:string"/>
    <xsd:attribute name="jaccRoleMappingClass" type="xsd:string"/>
    <xsd:attribute name="jaccPolicyConfigFactoryClass" type="xsd:string"/>
    <xsd:attribute name="jaccRoleMappingConfigFactoryClass" type="xsd:string"/>
    <xsd:attribute name="jaccRoleToPermissionPolicyId" type="xsd:string"/>
    <xsd:attribute name="jaccPrincipalToRolePolicyId" type="xsd:string"/>
    <xsd:attribute name="jaccRoleToPermissionPolicyFileName" type="xsd:string"/>
    <xsd:attribute name="jaccPrincipalToRolePolicyFileName" type="xsd:string"/>
  </xsd:complexType>


  <!-- *************************************** Common Types ****************************************** -->
  <!-- Restriction on how a dn can look like -->
  <xsd:simpleType name="DNType">
    <xsd:restriction base="xsd:string">
      <xsd:pattern value="(((.+)(=)(.+))(,(.+)(=)(.+))*)"/>
    </xsd:restriction>
  </xsd:simpleType>

  <!-- xsd:simpleType name="scopeType">
    <xsd:restriction base="xsd:string">
      <xsd:enumeration value="direct"/>
      <xsd:enumeration value="nested"/>
      <xsd:enumeration value="all"/>
    </xsd:restriction>
  </xsd:simpleType>

  <xsd:simpleType name="referalType">
    <xsd:restriction base="xsd:string">
      <xsd:enumeration value="ignore"/>
      <xsd:enumeration value="follow"/>
      <xsd:enumeration value="throw"/>
    </xsd:restriction>
  </xsd:simpleType-->

  <xsd:simpleType name="cacheSizeType">
    <xsd:restriction base="xsd:int">
      <xsd:minInclusive value="100"/>
    </xsd:restriction>
  </xsd:simpleType>

  <xsd:simpleType name="cacheTimeOutType">
    <xsd:restriction base="xsd:int">
      <xsd:minInclusive value="0"/>
    </xsd:restriction>
  </xsd:simpleType>

  <xsd:simpleType name="cacheSizeLimitType">
    <xsd:restriction base="xsd:int">
      <xsd:minInclusive value="0"/>
    </xsd:restriction>
  </xsd:simpleType>

  <xsd:simpleType name="initPoolSizeType">
    <xsd:restriction base="xsd:int">
      <xsd:minInclusive value="1"/>
      <xsd:maxInclusive value="50"/>
    </xsd:restriction>
  </xsd:simpleType>

  <xsd:simpleType name="maxPoolSizeType">
    <xsd:restriction base="xsd:int">
      <xsd:minInclusive value="0"/>
    </xsd:restriction>
  </xsd:simpleType>

  <xsd:simpleType name="prefPoolSizeType">
    <xsd:restriction base="xsd:int">
      <xsd:minInclusive value="0"/>
      <xsd:maxInclusive value="100"/>
    </xsd:restriction>
  </xsd:simpleType>

  <xsd:simpleType name="poolTimeOutType">
    <xsd:restriction base="xsd:int">
      <xsd:minInclusive value="0"/>
    </xsd:restriction>
  </xsd:simpleType>

  <xsd:simpleType name="poolWaitTimeType">
    <xsd:restriction base="xsd:int">
      <xsd:minInclusive value="0"/>
    </xsd:restriction>
  </xsd:simpleType>
	

  <xsd:complexType name="AttributeType">
    <xsd:sequence>
      <xsd:element name="entityTypes" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/>
    </xsd:sequence>
    <xsd:attribute name="name" type="xsd:string" use="required"/>
    <xsd:attribute name="syntax" type="xsd:string"/>
    <xsd:attribute name="defaultValue" type="xsd:string"/>
    <xsd:attribute name="defaultAttribute" type="xsd:string"/>
    <xsd:attribute name="propertyName" type="xsd:string"/>
    <xsd:attribute name="wimGenerate" type="xsd:boolean" default="false"/>
  </xsd:complexType>

</xsd:schema>