Release 2.0 Sample XML file

<?xml version="1.0" encoding="ISO-8859-1"?>
<OpenPTK xmlns='http://xml.netbeans.org/schema/openptk'
	xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
	xsi:schemaLocation='http://xml.netbeans.org/schema/openptk openptk.xsd'>
	<!--
		Notes: 1. To reference a Property value use the "%{property_name}"
		syntax. The Property value is evaluated when the XML file is parsed
		and processed. 2. To reference an Attribute value use the
		"${attribute_name}" syntax. The Attribute value is evaluated at
		run-time when the Property is used.
	-->
	<!--
		Defaults: These Properties are made available for reference by other
		Properties using the "%{property_name}" syntax. These Properties are
		NOT automatically copied into any of the other Properties defined in
		this file.
	-->
	<!--
		Idm urls: http://localhost:8080/idm/servlet/rpcrouter2
		http://localhost:28080/idm8/servlet/rpcrouter2
		http://www.openptk.org/idm/servlet/rpcrouter2
		http://www.openptk.org/idm/servlet/openspml2
	-->
   <Defaults>
      <Properties>
         <Property name="spml1.url"                     value="http://www.openptk.org/idm/servlet/rpcrouter2" />
         <Property name="spml1.user.name"               value="SPML-Proxy" />
         <Property name="spml1.user.password.encrypted" value="EnespBAb/hMwNylyxlh0jw==" />
         <Property name="spml2.url"                     value="http://www.openptk.org/idm/servlet/openspml2" />
         <Property name="spml2.user.name"               value="SPML-Proxy" />
         <Property name="spml2.user.password.encrypted" value="EnespBAb/hMwNylyxlh0jw==" />
         <Property name="jndi.url"                      value="ldap://localhost:1389" />
			<!--Property name="jndi.user.name"                value="uid=ldapadmin,ou=People,dc=openptk,dc=org" />
			<Property name="jndi.user.password.encrypted"  value="fJUAFjIMLNh/WiRBCBz3hw==" / -->
         <Property name="jndi.user.name"                value="cn=Directory Manager" />
         <Property name="jndi.user.password.encrypted"  value="EnespBAb/hMwNylyxlh0jw==" />
         <Property name="jndi.basedn.employees"         value="ou=people,ou=employees,dc=openptk,dc=org" />
         <Property name="jndi.basedn.locations"         value="ou=locations,ou=employees,dc=openptk,dc=org" />
         <Property name="jndi.basedn.customers"         value="ou=people,ou=customers,dc=openptk,dc=org" />
         <Property name="jdbc.url"                      value="jdbc:mysql://localhost:3306/openptk" />
         <Property name="jdbc.user.name"                value="test" />
         <Property name="jdbc.user.password.encrypted"  value="EnespBAb/hMwNylyxlh0jw==" />
         <Property name="jdbc.driver"                   value="com.mysql.jdbc.Driver" />
         <Property name="timeout.read"                  value="10000" />
         <Property name="timeout.write"                 value="10000" />
         <Property name="debug.level"                   value="4" />
      </Properties>
   </Defaults>
  	<!--
		Global: These Properties are for global configuration of the OpenPTK Server.
	-->
   <Global>
      <Properties>
         <Property name="auth.token.name.clientid"     value="clientid" />
         <Property name="auth.token.name.clientcred"   value="clientcred" />
         <Property name="auth.token.name.password"     value="password" />
         <Property name="auth.token.name.user"         value="user" />
         <Property name="auth.token.name.httpheader"   value="openptkid" />
         <Property name="http.session.cookie.uniqueid" value="OPENPTKSESSIONID" />
         <Property name="http.session.cookie.httponly" value="true" />
         <Property name="engine.session.ttl"           value="1800000" />
         <Property name="engine.session.cache.ttl"     value="120000" />
         <Property name="search.results.quantity"      value="10" />
         <Property name="search.contains.minchar"      value="3" />
         <Property name="search.attribute.default"     value="firstname" />
         <Property name="server.config.userid"         value="openptkconfig" />
         <Property name="server.config.password"       value="password" />
         <Property name="server.cookiepath"            value="/" />
         <Property name="server.defaultclient"         value="anon" />
      </Properties>
   </Global>
	<!--
		Contexts: The Contexts section contains Properties (that will be
		applied to each Context) One or more Context. A given Context contains
		the following elements: - Properties that are unique to the Context
		All of the "Contexts" level Properties will be copied into each
		Context then the Context specific Properties will be added/overlayed.
		- Query that will be applied to all of the Operations - Operations
		that will be supported by a given Context. Each Operation will inherit
		the Properties and Query (if exist) from the Context level. Operation
		level Properties will be added/overlayed. The Query will be replaced.
		Each Operation is required to have the following Properties: -
		classname - AttrGroup
	-->
	<!--
		Default Context: Person-SunIdm-SPML1 Person-SunIdm-JDBC
		Person-OpenDS-JNDI Person-SunIdm-SPE Person-SunIdm-SPML2
	-->
   <Contexts>
      <Properties>
         <Property name="context.default"           value="Employees-MySQL-JDBC" />
         <Property name="context.classname"         value="org.openptk.config.BasicContext" />
         <Property name="security.encryption.id"    value="PBEWithMD5AndDES" />
         <Property name="logger"                    value="UnixLogFile" />
         <Property name="audit"                     value="false" />
         <Property name="timestamp"                 value="true" />
      </Properties>

      <Context id="Person-SunIdm-SPML1" enabled="false" definition="Person" connection="SunSPML1" association="SPML1">
         <Properties>
            <Property name="context.description"       value="Person to Sun Identity Manager using SPML1" />
            <Property name="operation.classname"       value="org.openptk.spi.operations.SpmlSunOperations" />
            <Property name="key"                       value="uniqueid" />
            <Property name="objectclass"               value="user" />
            <Property name="timeout"                   value="%{timeout.write}" />
            <Property name="search.default.order"      value="lastname,firstname" />
            <Property name="search.operators"          value="AND,EQ" />
         </Properties>
         <Query type="AND">
            <Query type="EQ" name="MemberObjectGroups" value="All People" />
            <Query type="EQ" name="objectclass" value="user" />
         </Query>
         <Operations>
            <Operation id="create" attrgroup="person-create" />
            <Operation id="read" attrgroup="person-read">
               <Properties>
                  <Property name="timeout" value="%{timeout.read}" />
               </Properties>
            </Operation>
            <Operation id="update" attrgroup="person-update" />
            <Operation id="delete" attrgroup="person-delete" />
            <Operation id="search" attrgroup="person-search">
               <Properties>
                  <Property name="timeout"              value="%{timeout.read}" />
                  <Property name="sort"                 value="lastname,firstname" />
               </Properties>
            </Operation>
            <Operation id="pwdchange" attrgroup="person-pwd">
               <Properties>
                  <Property name="timeout" value="%{timeout.write}" />
                  <Property name="extreq.oper.changepwd" value="changeUserPassword" />
                  <Property name="extreq.oper.resetpwd" value="resetUserPassword" />
                  <Property name="extreq.attr.uid.name" value="accountId" />
                  <Property name="extreq.attr.pwd.name" value="password" />
                  <Property name="extreq.attr.pwd.subject.attr" value="password" />
                  <Property name="extreq.attr.resources.key" value="accounts" />
                  <Property name="extreq.attr.resources.value" value="Lighthouse" />
               </Properties>
            </Operation>
            <Operation id="pwdreset" attrgroup="person-pwd">
               <Properties>
                  <Property name="timeout" value="%{timeout.write}" />
                  <Property name="extreq.oper.changepwd" value="changeUserPassword" />
                  <Property name="extreq.oper.resetpwd" value="resetUserPassword" />
                  <Property name="extreq.attr.uid.name" value="accountId" />
                  <Property name="extreq.attr.pwd.name" value="password" />
                  <Property name="extreq.attr.pwd.subject.attr" value="password" />
                  <Property name="extreq.attr.resources.key" value="accounts" />
                  <Property name="extreq.attr.resources.value" value="Lighthouse" />
               </Properties>
            </Operation>
         </Operations>
      </Context>

      <Context id="Person-SunIdm-SPML2" enabled="true" definition="Person" connection="SunSPML2" association="SPML2">
         <Properties>
            <Property name="context.description" value="Person to Sun Identity Manager using SPML2" />
            <Property name="operation.classname" value="org.openptk.spi.operations.Spml2SunOperations" />
            <Property name="key"                 value="uniqueid" />
            <Property name="objectclass"         value="spml2Person" />
            <Property name="timeout"             value="%{timeout.write}" />
         </Properties>
			<!--Query type="AND"-->
				<!--Query type="EQ" name="organization" value="All People" /-->
				<!--Query type="EQ" name="objectclass" value="spml2Person" /-->
			<!--/Query-->
         <Query type="NULL" />
         <Operations>
            <Operation id="create" attrgroup="person-create" />
            <Operation id="read" attrgroup="person-read">
               <Properties>
                  <Property name="timeout" value="%{timeout.read}" />
               </Properties>
            </Operation>
            <Operation id="search" attrgroup="person-search">
               <Properties>
                  <Property name="timeout" value="%{timeout.read}" />
                  <Property name="sort" value="lastname,firstname" />
               </Properties>
            </Operation>
            <Operation id="update" attrgroup="person-update" />
            <Operation id="delete" attrgroup="person-delete" />
            <Operation id="pwdchange" attrgroup="person-pwd">
               <Properties>
                  <Property name="timeout"                      value="%{timeout.write}" />
                  <Property name="extreq.oper.changepwd"        value="changeUserPassword" />
                  <Property name="extreq.oper.resetpwd"         value="resetUserPassword" />
                  <Property name="extreq.attr.uid.name"         value="accountId" />
                  <Property name="extreq.attr.pwd.name"         value="password" />
                  <Property name="extreq.attr.pwd.subject.attr" value="password" />
                  <Property name="extreq.attr.resources.key"    value="accounts" />
                  <Property name="extreq.attr.resources.value"  value="Lighthouse" />
               </Properties>
            </Operation>
            <Operation id="pwdreset" attrgroup="person-pwd">
               <Properties>
                  <Property name="timeout"                      value="%{timeout.write}" />
                  <Property name="extreq.oper.changepwd"        value="changeUserPassword" />
                  <Property name="extreq.oper.resetpwd"         value="resetUserPassword" />
                  <Property name="extreq.attr.uid.name"         value="accountId" />
                  <Property name="extreq.attr.pwd.name"         value="password" />
                  <Property name="extreq.attr.pwd.subject.attr" value="password" />
                  <Property name="extreq.attr.resources.key"    value="accounts" />
                  <Property name="extreq.attr.resources.value"  value="Lighthouse" />
               </Properties>
            </Operation>
         </Operations>
      </Context>

      <Context id="Authen-SunIdm-SPML" enabled="false" definition="Person" connection="SunSPML1" association="SPML1">
         <Properties>
            <Property name="context.description" value="Authentication: Forgotten Password" />
            <Property name="operation.classname" value="org.openptk.spi.operations.SpmlSunOperations" />
            <Property name="key"                 value="uniqueid" />
            <Property name="objectclass"         value="user" />
            <Property name="timeout"             value="%{timeout.read}" />
         </Properties>
         <Query type="AND">
            <Query type="EQ" name="MemberObjectGroups" value="All People" />
            <Query type="EQ" name="objectclass"        value="user" />
         </Query>
         <Operations>
            <Operation id="read" attrgroup="person-pwd" />
         </Operations>
      </Context>

      <Context id="Person-SunIdm-SPE" enabled="false" definition="Person" connection="SunSPML1" association="SPE">
         <Properties>
            <Property name="context.description" value="Person to Sun Identity Manager using SPE" />
            <Property name="operation.classname" value="org.openptk.spi.operations.SpeSpmlSunOperations" />
            <Property name="key"                 value="uniqueid" />
            <Property name="objectclass"         value="speperson" />
            <Property name="timeout"             value="%{timeout.write}" />
            <Property name="search.default.order" value="lastname,firstname" />
            <Property name="search.operators"     value="AND,EQ" />
         </Properties>
         <Query type="EQ" name="objectclass" value="speperson" />
         <Operations>
            <Operation id="create" attrgroup="person-create" />
            <Operation id="read"   attrgroup="person-read">
               <Properties>
                  <Property name="timeout" value="%{timeout.read}" />
               </Properties>
            </Operation>
            <Operation id="update" attrgroup="person-update" />
            <Operation id="delete" attrgroup="person-delete" />
            <Operation id="search" attrgroup="person-search">
               <Properties>
                  <Property name="AttrGroup"            value="person-search" />
                  <Property name="timeout"              value="%{timeout.read}" />
                  <Property name="sort"                 value="lastname,firstname" />
               </Properties>
            </Operation>
            <Operation id="pwdchange" attrgroup="person-pwd">
               <Properties>
                  <Property name="timeout" value="%{timeout.write}" />
               </Properties>
            </Operation>
            <Operation id="pwdreset" attrgroup="person-pwd">
               <Properties>
                  <Property name="timeout"               value="%{timeout.write}" />
                  <Property name="reset.password.length" value="8" />
               </Properties>
            </Operation>
         </Operations>
      </Context>

      <Context id="Employees-OpenDS-JNDI" enabled="true" definition="Person" connection="OpenDS" association="JNDI">
         <Properties>
            <Property name="context.description"  value="Employees to OpenDS using JNDI" />
            <Property name="operation.classname"  value="org.openptk.spi.operations.JndiOperations" />
            <Property name="key"                  value="uniqueid" />
            <Property name="rdn"                  value="uid=${uniqueid}" />
            <Property name="basedn"               value="%{jndi.basedn.employees}" />
            <Property name="objectclass"          value="inetOrgPerson" />
            <Property name="timeout"              value="%{timeout.write}" />
            <Property name="search.default.order" value="lastname,firstname,uniqueid" />
            <Property name="search.operators"     value="AND,OR,CONTAINS,EQ" />
         </Properties>
         <Model id="Employee">
            <Relationships>
               <Relationship id="location" context="Locations-OpenDS-JNDI"/>
               <Relationship id="photo" context="Media-MySQL-JDBC"/>
            </Relationships>
         </Model>
         <Query type="EQ" name="objectClass" value="inetOrgPerson" />
         <Operations>
            <Operation id="create" attrgroup="person-create" />
            <Operation id="read"   attrgroup="person-read">
               <Properties>
                  <Property name="timeout" value="%{timeout.read}" />
               </Properties>
            </Operation>
            <Operation id="update" attrgroup="person-update" />
            <Operation id="delete" attrgroup="person-delete" />
            <Operation id="search" attrgroup="person-search">
               <Properties>
                  <Property name="timeout"              value="%{timeout.read}" />
                  <Property name="sort"                 value="lastname,firstname" />
               </Properties>
            </Operation>
            <Operation id="pwdchange" attrgroup="person-pwd">
               <Properties>
                  <Property name="timeout" value="%{timeout.write}" />
               </Properties>
            </Operation>
            <Operation id="pwdreset" attrgroup="person-pwd">
               <Properties>
                  <Property name="timeout"               value="%{timeout.write}" />
                  <Property name="reset.password.length" value="8" />
               </Properties>
            </Operation>
            <Operation id="authenticate" attrgroup="person-pwd" />
         </Operations>
      </Context>

      <Context id="Locations-OpenDS-JNDI" enabled="true" definition="Location" connection="OpenDS" association="JNDI-LOCATION">
         <Properties>
            <Property name="context.description"  value="Locations to OpenDS using JNDI" />
            <Property name="operation.classname"  value="org.openptk.spi.operations.JndiOperations" />
            <Property name="key"                  value="uniqueid" />
            <Property name="rdn"                  value="ou=${uniqueid}" />
            <Property name="basedn"               value="%{jndi.basedn.locations}" />
            <Property name="objectclass"          value="organizationalunit" />
            <Property name="timeout"              value="%{timeout.write}" />
            <Property name="search.default.order" value="uniqueid,city,state" />
            <Property name="search.operators"     value="AND,OR,CONTAINS,EQ" />
         </Properties>
         <Query type="EQ" name="objectClass" value="organizationalunit" />
         <Operations>
            <Operation id="create" attrgroup="location-create" />
            <Operation id="read"   attrgroup="location-read">
               <Properties>
                  <Property name="timeout" value="%{timeout.read}" />
               </Properties>
            </Operation>
            <Operation id="update" attrgroup="location-update" />
            <Operation id="delete" attrgroup="location-delete" />
            <Operation id="search" attrgroup="location-search">
               <Properties>
                  <Property name="timeout"              value="%{timeout.read}" />
                  <Property name="sort"                 value="state,city" />
               </Properties>
            </Operation>
         </Operations>
      </Context>

      <Context id="Customers-OpenDS-JNDI" enabled="true" definition="Customer" connection="OpenDS" association="JNDI-CUSTOMER">
         <Properties>
            <Property name="context.description"  value="Customers to OpenDS using JNDI" />
            <Property name="operation.classname"  value="org.openptk.spi.operations.JndiOperations" />
            <Property name="key"                  value="uniqueid" />
            <Property name="rdn"                  value="uid=${uniqueid}" />
            <Property name="basedn"               value="%{jndi.basedn.customers}" />
            <Property name="objectclass"          value="inetOrgPerson" />
            <Property name="timeout"              value="%{timeout.write}" />
            <Property name="search.default.order" value="lastname,firstname,uniqueid" />
            <Property name="search.operators"     value="AND,OR,CONTAINS,EQ" />
         </Properties>
         <Query type="EQ" name="objectClass" value="inetOrgPerson" />
         <Operations>
            <Operation id="create" attrgroup="customer-create" />
            <Operation id="read"   attrgroup="customer-read">
               <Properties>
                  <Property name="timeout" value="%{timeout.read}" />
               </Properties>
            </Operation>
            <Operation id="update" attrgroup="customer-update" />
            <Operation id="delete" attrgroup="person-delete" />
            <Operation id="search" attrgroup="person-search">
               <Properties>
                  <Property name="timeout"              value="%{timeout.read}" />
                  <Property name="sort"                 value="lastname,firstname" />
               </Properties>
            </Operation>
            <Operation id="pwdchange" attrgroup="person-pwd">
               <Properties>
                  <Property name="timeout" value="%{timeout.write}" />
               </Properties>
            </Operation>
            <Operation id="pwdreset" attrgroup="person-pwd">
               <Properties>
                  <Property name="timeout"               value="%{timeout.write}" />
                  <Property name="reset.password.length" value="8" />
               </Properties>
            </Operation>
            <Operation id="authenticate" attrgroup="person-pwd" />
         </Operations>
      </Context>

      <Context id="Employees-MySQL-JDBC" enabled="true" definition="Person" connection="MySQL" association="JDBC">
         <Properties>
            <Property name="context.description"  value="Employees to MySQL using JDBC" />
            <Property name="operation.classname"  value="org.openptk.spi.operations.JdbcOperations" />
            <Property name="connection.table"     value="employees" />
            <Property name="key"                  value="uniqueid" />
            <Property name="timeout"              value="%{timeout.write}" />
            <Property name="search.default.order" value="lastname,firstname,uniqueid" />
            <Property name="search.operators"     value="AND,OR,CONTAINS,EQ" />
         </Properties>
         <Model id="Employee">
            <Relationships>
               <Relationship id="location" context="Locations-MySQL-JDBC"/>
               <Relationship id="photo" context="Media-MySQL-JDBC"/>
            </Relationships>
         </Model>
         <Query type="NULL" />
         <Operations>
            <Operation id="create" attrgroup="person-create" />
            <Operation id="read"   attrgroup="person-read">
               <Properties>
                  <Property name="timeout" value="%{timeout.read}" />
               </Properties>
            </Operation>
            <Operation id="update" attrgroup="person-update" />
            <Operation id="delete" attrgroup="person-delete" />
            <Operation id="search" attrgroup="person-search">
               <Properties>
                  <Property name="timeout"              value="%{timeout.read}" />
                  <Property name="sort"                 value="lastname" />
               </Properties>
            </Operation>
            <Operation id="pwdchange" attrgroup="person-pwd">
               <Properties>
                  <Property name="timeout" value="%{timeout.write}" />
               </Properties>
            </Operation>
            <Operation id="pwdreset" attrgroup="person-pwd">
               <Properties>
                  <Property name="timeout"               value="%{timeout.write}" />
                  <Property name="reset.password.length" value="8" />
               </Properties>
            </Operation>
            <Operation id="authenticate" attrgroup="person-pwd" />
         </Operations>
      </Context>

      <Context id="Locations-MySQL-JDBC" enabled="true" definition="Location" connection="MySQL" association="JDBC-LOCATION">
         <Properties>
            <Property name="context.description"  value="Locations to MySQL using JDBC" />
            <Property name="operation.classname"  value="org.openptk.spi.operations.JdbcOperations" />
            <Property name="connection.table"     value="locations" />
            <Property name="key"                  value="uniqueid" />
            <Property name="timeout"              value="%{timeout.write}" />
            <Property name="search.default.order" value="description,uniqueid" />
            <Property name="search.operators"     value="AND,OR,CONTAINS,EQ" />
         </Properties>
         <Query type="NULL" />
         <Operations>
            <Operation id="create" attrgroup="location-create" />
            <Operation id="read"   attrgroup="location-read">
               <Properties>
                  <Property name="timeout" value="%{timeout.read}" />
               </Properties>
            </Operation>
            <Operation id="update" attrgroup="location-update" />
            <Operation id="delete" attrgroup="location-delete" />
            <Operation id="search" attrgroup="location-search">
               <Properties>
                  <Property name="timeout"        value="%{timeout.read}" />
                  <Property name="sort"           value="state,city" />
               </Properties>
            </Operation>
         </Operations>
      </Context>

      <Context id="Media-MySQL-JDBC" enabled="true" definition="Media" connection="MySQL" association="JDBC-MEDIA">
         <Properties>
            <Property name="context.description"  value="Media to MySQL using JDBC" />
            <Property name="operation.classname"  value="org.openptk.spi.operations.JdbcOperations" />
            <Property name="connection.table"     value="media" />
            <Property name="key"                  value="uniqueid" />
            <Property name="timeout"              value="%{timeout.write}" />
            <Property name="search.default.order" value="name,subject" />
            <Property name="search.operators"     value="AND,OR,CONTAINS,EQ" />
         </Properties>
         <Query type="NULL" />
         <Operations>
            <Operation id="create" attrgroup="media-create" />
            <Operation id="read"   attrgroup="media-read" />
            <Operation id="update" attrgroup="media-update" />
            <Operation id="delete" attrgroup="media-delete" />
            <Operation id="search" attrgroup="media-search">
               <Properties>
                  <Property name="timeout"        value="%{timeout.read}" />
                  <Property name="sort"           value="name" />
               </Properties>
            </Operation>
         </Operations>
      </Context>

      <Context id="Employees-Hybrid" enabled="false" definition="Person">
         <Properties>
            <Property name="context.description"  value="Person to SPML (create,update,delete) and JNDI (read,search)" />
            <Property name="timeout"              value="%{timeout.write}" />
            <Property name="search.default.order" value="lastname,firstname" />
            <Property name="search.operators"     value="AND,OR,EQ,CONTAINS" />
         </Properties>
         <Query type="NULL" />
         <Operations>
            <Operation id="create" attrgroup="person-create" connection="SunSPML1" association="SPML1">
               <Properties>
                  <Property name="operation.classname" value="org.openptk.spi.operations.SpmlSunOperations" />
                  <Property name="key"                 value="uniqueid" />
                  <Property name="objectclass"         value="user" />
               </Properties>
               <Query type="AND">
                  <Query type="EQ" name="MemberObjectGroups" value="All People" />
                  <Query type="EQ" name="objectclass"        value="user" />
               </Query>
            </Operation>
            <Operation id="read" attrgroup="person-read" connection="OpenDS" association="JNDI">
               <Properties>
                  <Property name="operation.classname" value="org.openptk.spi.operations.JndiOperations" />
                  <Property name="key"                 value="uniqueid" />
                  <Property name="rdn"                 value="uid=${uniqueid}" />
                  <Property name="basedn"              value="%{jndi.basedn.employees}" />
                  <Property name="objectclass"         value="inetOrgPerson" />
                  <Property name="timeout"             value="%{timeout.read}" />
               </Properties>
               <Query type="EQ" name="objectClass" value="inetOrgPerson" />
            </Operation>
            <Operation id="update" attrgroup="person-update" connection="SunSPML1" association="SPML1">
               <Properties>
                  <Property name="operation.classname" value="org.openptk.spi.operations.SpmlSunOperations" />
                  <Property name="key"                 value="uniqueid" />
                  <Property name="objectclass"         value="user" />
               </Properties>
               <Query type="AND">
                  <Query type="EQ" name="MemberObjectGroups" value="All People" />
                  <Query type="EQ" name="objectclass"        value="user" />
               </Query>
            </Operation>
            <Operation id="delete" attrgroup="person-delete" connection="SunSPML1" association="SPML1">
               <Properties>
                  <Property name="operation.classname" value="org.openptk.spi.operations.SpmlSunOperations" />
                  <Property name="key"                 value="uniqueid" />
                  <Property name="objectclass"         value="user" />
               </Properties>
               <Query type="AND">
                  <Query type="EQ" name="MemberObjectGroups" value="All People" />
                  <Query type="EQ" name="objectclass"        value="user" />
               </Query>
            </Operation>
            <Operation id="search" attrgroup="person-search" connection="OpenDS" association="JNDI">
               <Properties>
                  <Property name="operation.classname" value="org.openptk.spi.operations.JndiOperations" />
                  <Property name="key"                 value="uniqueid" />
                  <Property name="rdn"                 value="uid=${uniqueid}" />
                  <Property name="basedn"              value="%{jndi.basedn.employees}" />
                  <Property name="objectclass"         value="inetOrgPerson" />
                  <Property name="timeout"             value="%{timeout.read}" />
                  <Property name="sort"                value="lastname,firstname" />
               </Properties>
               <Query type="EQ" name="objectClass" value="inetOrgPerson" />
            </Operation>
         </Operations>
      </Context>

      <Context id="Role-SunIdm-SPML1" enabled="false" definition="Role" connection="SunSPML1" association="SPML1-ROLE">
         <Properties>
            <Property name="context.description" value="Role to Sun Identity Manager using SPML" />
            <Property name="operation.classname" value="org.openptk.spi.operations.SpmlSunOperations" />
            <Property name="key"                 value="rolename" />
            <Property name="objectclass"         value="role" />
            <Property name="timeout"             value="%{timeout.write}" />
         </Properties>
         <Query type="EQ" name="objectclass" value="role" />
         <Operations>
            <Operation id="create" attrgroup="role-create" />
            <Operation id="read"   attrgroup="role-read">
               <Properties>
                  <Property name="timeout" value="%{timeout.read}" />
               </Properties>
            </Operation>
            <Operation id="update" attrgroup="role-update" />
            <Operation id="delete" attrgroup="role-delete">
               <Properties>
                  <Property name="timeout" value="%{timeout.write}" />
               </Properties>
            </Operation>
            <Operation id="search" attrgroup="role-search">
               <Properties>
                  <Property name="timeout" value="%{timeout.read}" />
               </Properties>
            </Operation>
         </Operations>
      </Context>
   </Contexts>
	<!--
		Attribute Groups define what attributes to use for a given Operation
		Attributes must have been declared in the related Association
	-->
   <AttrGroups>
      <AttrGroup id="person-create">
         <Attributes>
            <Attribute id="firstname" />
            <Attribute id="lastname" />
            <Attribute id="email" />
            <Attribute id="fullname" />
            <Attribute id="roles" />
            <Attribute id="manager" />
            <Attribute id="title" />
            <Attribute id="telephone" />
            <Attribute id="organization" />
            <Attribute id="password" />
         </Attributes>
      </AttrGroup>
      <AttrGroup id="person-read">
         <Attributes>
            <Attribute id="firstname" />
            <Attribute id="lastname" />
            <Attribute id="email" />
            <Attribute id="fullname" />
            <Attribute id="roles" />
            <Attribute id="manager" />
            <Attribute id="title" />
            <Attribute id="telephone" />
            <Attribute id="organization" />
            <Attribute id="forgottenPasswordQuestions" />
            <Attribute id="forgottenPasswordAnswers" />
            <Attribute id="location" />
         </Attributes>
      </AttrGroup>
      <AttrGroup id="person-update">
         <Attributes>
            <Attribute id="firstname" />
            <Attribute id="lastname" />
            <Attribute id="email" />
            <Attribute id="fullname" />
            <Attribute id="roles" />
            <Attribute id="manager" />
            <Attribute id="title" />
            <Attribute id="telephone" />
            <Attribute id="organization" />
            <Attribute id="forgottenPasswordQuestions" />
            <Attribute id="forgottenPasswordAnswers" />
            <Attribute id="location" />
         </Attributes>
      </AttrGroup>
      <AttrGroup id="person-delete" />
      <AttrGroup id="person-search">
         <Attributes>
            <Attribute id="firstname" />
            <Attribute id="lastname" />
            <Attribute id="email" />
            <Attribute id="fullname" />
            <Attribute id="title" />
            <Attribute id="lastcommafirst" />
            <Attribute id="manager" />
         </Attributes>
      </AttrGroup>
      <AttrGroup id="person-pwd">
         <Attributes>
            <Attribute id="password" />
         </Attributes>
      </AttrGroup>

      <AttrGroup id="customer-create">
         <Attributes>
            <Attribute id="firstname" />
            <Attribute id="lastname" />
            <Attribute id="email" />
            <Attribute id="fullname" />
            <Attribute id="roles" />
            <Attribute id="manager" />
            <Attribute id="title" />
            <Attribute id="telephone" />
            <Attribute id="organization" />
            <Attribute id="password" />
            <Attribute id="street" />
            <Attribute id="city" />
            <Attribute id="state" />
            <Attribute id="postalCode" />
         </Attributes>
      </AttrGroup>
      <AttrGroup id="customer-read">
         <Attributes>
            <Attribute id="firstname" />
            <Attribute id="lastname" />
            <Attribute id="email" />
            <Attribute id="fullname" />
            <Attribute id="roles" />
            <Attribute id="manager" />
            <Attribute id="title" />
            <Attribute id="telephone" />
            <Attribute id="organization" />
            <Attribute id="forgottenPasswordQuestions" />
            <Attribute id="forgottenPasswordAnswers" />
            <Attribute id="street" />
            <Attribute id="city" />
            <Attribute id="state" />
            <Attribute id="postalCode" />
         </Attributes>
      </AttrGroup>
      <AttrGroup id="customer-update">
         <Attributes>
            <Attribute id="firstname" />
            <Attribute id="lastname" />
            <Attribute id="email" />
            <Attribute id="fullname" />
            <Attribute id="roles" />
            <Attribute id="manager" />
            <Attribute id="title" />
            <Attribute id="telephone" />
            <Attribute id="organization" />
            <Attribute id="forgottenPasswordQuestions" />
            <Attribute id="forgottenPasswordAnswers" />
            <Attribute id="street" />
            <Attribute id="city" />
            <Attribute id="state" />
            <Attribute id="postalCode" />
         </Attributes>
      </AttrGroup>
      <!--
			<AttrGroup id="authen-forgot"> <Attributes> <Attribute
			id="firstname"/> <Attribute id="lastname"/> <Attribute
			id="forgottenPasswordQuestions"/> <Attribute
			id="forgottenPasswordAnswers"/> <Attribute
			id="forgottenPasswordData"/> </Attributes> </AttrGroup>
		-->

      <AttrGroup id="location-create">
         <Attributes>
            <Attribute id="description" />
            <Attribute id="street" />
            <Attribute id="city" />
            <Attribute id="state" />
            <Attribute id="postalCode" />
         </Attributes>
      </AttrGroup>
      <AttrGroup id="location-read">
         <Attributes>
            <Attribute id="description" />
            <Attribute id="street" />
            <Attribute id="city" />
            <Attribute id="state" />
            <Attribute id="postalCode" />
         </Attributes>
      </AttrGroup>
      <AttrGroup id="location-update">
         <Attributes>
            <Attribute id="description" />
            <Attribute id="street" />
            <Attribute id="city" />
            <Attribute id="state" />
            <Attribute id="postalCode" />
         </Attributes>
      </AttrGroup>
      <AttrGroup id="location-delete" />
      <AttrGroup id="location-search">
         <Attributes>
            <Attribute id="description" />
            <Attribute id="city" />
            <Attribute id="state" />
         </Attributes>
      </AttrGroup>
      <AttrGroup id="media-create">
         <Attributes>
            <Attribute id="name" />
            <Attribute id="type" />
            <Attribute id="length" />
            <Attribute id="modified" />
            <Attribute id="contextid" />
            <Attribute id="subjectid" />
            <Attribute id="relationshipid" />
            <Attribute id="digest" />
            <Attribute id="data" />
         </Attributes>
      </AttrGroup>
      <AttrGroup id="media-read">
         <Attributes>
            <Attribute id="name" />
            <Attribute id="type" />
            <Attribute id="length" />
            <Attribute id="modified" />
            <Attribute id="contextid" />
            <Attribute id="subjectid" />
            <Attribute id="relationshipid" />
            <Attribute id="digest" />
            <Attribute id="data" />
         </Attributes>
      </AttrGroup>
      <AttrGroup id="media-update">
         <Attributes>
            <Attribute id="name" />
            <Attribute id="type" />
            <Attribute id="length" />
            <Attribute id="modified" />
            <Attribute id="contextid" />
            <Attribute id="subjectid" />
            <Attribute id="relationshipid" />
            <Attribute id="digest" />
            <Attribute id="data" />
         </Attributes>
      </AttrGroup>
      <AttrGroup id="media-delete"/>
      <AttrGroup id="media-search">
         <Attributes>
            <Attribute id="name" />
            <Attribute id="contextid" />
            <Attribute id="subjectid" />
            <Attribute id="relationshipid" />
         </Attributes>
      </AttrGroup>
      <AttrGroup id="role-create">
         <Attributes>
            <Attribute id="resources" />
            <Attribute id="description" />
            <Attribute id="owner" />
         </Attributes>
      </AttrGroup>
      <AttrGroup id="role-read">
         <Attributes>
            <Attribute id="resources" />
            <Attribute id="description" />
            <Attribute id="owner" />
         </Attributes>
      </AttrGroup>
      <AttrGroup id="role-update">
         <Attributes>
            <Attribute id="resources" />
            <Attribute id="description" />
            <Attribute id="owner" />
         </Attributes>
      </AttrGroup>
      <AttrGroup id="role-delete" />
      <AttrGroup id="role-search">
         <Attributes>
            <Attribute id="description" />
         </Attributes>
      </AttrGroup>
   </AttrGroups>
	<!--
		Maps OpenPTK Framework Attribute names to Service Attribute names
		Framework Attributes NOT listed in a given Association will be treated
		as "pass through", their Framework Attribute name will be used for
		their Service Attribute name. Declares the Atributes that are
		available in a given "Service" All of the Attributes must be defined
		in the "associated" Definition Association Attributes can
		override/compliment "settings" from their Definition
	-->
   <Associations>
      <Association id="SPML1">
         <Attributes>
            <Attribute id="uniqueid"  servicename="uid" />
            <Attribute id="firstname" servicename="gn" />
            <Attribute id="lastname"  servicename="sn" />
            <Attribute id="fullname"  servicename="cn" />
            <Attribute id="lastcommafirst" />
            <Attribute id="password"  servicename="password" required="true" />
            <Attribute id="email" />
            <Attribute id="roles" />
            <Attribute id="manager" />
            <Attribute id="title" />
            <Attribute id="telephone" />
            <Attribute id="organization" />
            <Attribute id="forgottenPasswordQuestions" />
            <Attribute id="forgottenPasswordAnswers" />
            <Attribute id="forgottenPasswordData" />
         </Attributes>
      </Association>
      <Association id="SPML2">
         <Attributes>
            <Attribute id="uniqueid"  servicename="accountId" />
            <Attribute id="firstname" servicename="firstname" />
            <Attribute id="lastname"  servicename="lastname" />
            <Attribute id="fullname"  servicename="fullname" />
            <Attribute id="lastcommafirst" />
            <Attribute id="password"  servicename="credentials" required="true" />
            <Attribute id="email"     servicename="emailAddress" />
            <Attribute id="roles" />
            <Attribute id="manager" />
            <Attribute id="title" />
            <Attribute id="telephone" />
            <Attribute id="organization" />
            <Attribute id="forgottenPasswordQuestions" />
            <Attribute id="forgottenPasswordAnswers" />
            <Attribute id="forgottenPasswordData" />
         </Attributes>
      </Association>
      <Association id="SPE">
         <Attributes>
            <Attribute id="uniqueid" servicename="uid" />
            <Attribute id="firstname" />
            <Attribute id="lastname" />
            <Attribute id="fullname" required="true" />
            <Attribute id="email" />
            <Attribute id="title" />
            <Attribute id="telephone" />
            <Attribute id="organization" />
            <Attribute id="password" />
            <Attribute id="lastcommafirst" />
            <Attribute id="manager" />
            <Attribute id="roles" />
            <Attribute id="forgottenPasswordQuestions" />
            <Attribute id="forgottenPasswordAnswers" />
            <Attribute id="forgottenPasswordData" />
         </Attributes>
      </Association>
      <Association id="JNDI">
         <Attributes>
            <Attribute id="uniqueid"     servicename="uid" />
            <Attribute id="firstname"    servicename="givenName" />
            <Attribute id="lastname"     servicename="sn" />
            <Attribute id="fullname"     servicename="cn" required="true" />
            <Attribute id="email"        servicename="mail" />
            <Attribute id="title" />
            <Attribute id="telephone"    servicename="telephoneNumber" />
            <Attribute id="organization" servicename="departmentNumber" />
            <Attribute id="password"     servicename="userPassword" />
            <Attribute id="manager">
               <Functions>
                  <Function id="getUid" classname="org.openptk.definition.functions.SubString">
                     <Arguments>
                        <Argument name="after"  type="literal" value="uid=" />
                        <Argument name="before" type="literal" value="," />
                     </Arguments>
                     <Operations>
                        <Operation type="read" />
                        <Operation type="search" />
                     </Operations>
                  </Function>
                  <Function id="buildDN" classname="org.openptk.definition.functions.ConcatStrings">
                     <Arguments>
                        <Argument name="prefix" type="literal"   value="uid=" />
                        <Argument name="uid"    type="attribute" value="manager" />
                        <Argument name="basedn" type="literal"   value=",%{jndi.basedn.employees}" />
                     </Arguments>
                     <Operations>
                        <Operation type="create" />
                        <Operation type="update" />
                        <Operation type="search" mode="TOSERVICE" />
                     </Operations>
                  </Function>
               </Functions>
            </Attribute>
            <Attribute id="roles" servicename="businessCategory" />
            <Attribute id="lastcommafirst" />
            <Attribute id="forgottenPasswordQuestions">
               <Functions>
                  <Function id="readPwdQuestions" classname="org.openptk.definition.functions.ForgottenPassword">
                     <Arguments>
                        <Argument name="data"           type="attribute" value="forgottenPasswordData" />
                        <Argument name="questions"      type="attribute" value="forgottenPasswordQuestions" />
                        <Argument name="answers"        type="attribute" value="forgottenPasswordAnswers" />
                        <Argument name="innerdelimiter" type="literal"   value="=" />
                        <Argument name="outerdelimiter" type="literal"   value="+" />
                        <Argument name="default"        type="literal"   value="Mothers Maiden Name,City you were born,Last 4 digits of Frequent Flyer" />
                     </Arguments>
                     <Operations>
                        <Operation type="read" />
                     </Operations>
                  </Function>
               </Functions>
            </Attribute>
            <Attribute id="forgottenPasswordAnswers">
               <Functions>
                  <Function id="updatePwdAnswers" classname="org.openptk.definition.functions.ForgottenPassword">
                     <Arguments>
                        <Argument name="data"           type="attribute" value="forgottenPasswordData" />
                        <Argument name="questions"      type="attribute" value="forgottenPasswordQuestions" />
                        <Argument name="answers"        type="attribute" value="forgottenPasswordAnswers" />
                        <Argument name="innerdelimiter" type="literal"   value="=" />
                        <Argument name="outerdelimiter" type="literal"   value="+" />
                        <Argument name="minlength"      type="literal"   value="3" />
                     </Arguments>
                     <Operations>
                        <Operation type="read" />
                        <Operation type="update" />
                     </Operations>
                  </Function>
               </Functions>
            </Attribute>
            <Attribute id="forgottenPasswordData" servicename="destinationIndicator" />
            <Attribute id="location" servicename="physicalDeliveryOfficeName" />
         </Attributes>
      </Association>
      <Association id="JNDI-CUSTOMER">
         <Attributes>
            <Attribute id="uniqueid"     servicename="uid" />
            <Attribute id="firstname"    servicename="givenName" />
            <Attribute id="lastname"     servicename="sn" />
            <Attribute id="fullname"     servicename="cn" required="true" />
            <Attribute id="email"        servicename="mail" />
            <Attribute id="title" />
            <Attribute id="telephone"    servicename="telephoneNumber" />
            <Attribute id="organization" servicename="departmentNumber" />
            <Attribute id="password"     servicename="userPassword" />
            <Attribute id="manager">
               <Functions>
                  <Function id="getUid" classname="org.openptk.definition.functions.SubString">
                     <Arguments>
                        <Argument name="after"  type="literal" value="uid=" />
                        <Argument name="before" type="literal" value="," />
                     </Arguments>
                     <Operations>
                        <Operation type="read" />
                        <Operation type="search" />
                     </Operations>
                  </Function>
                  <Function id="buildDN" classname="org.openptk.definition.functions.ConcatStrings">
                     <Arguments>
                        <Argument name="prefix" type="literal"   value="uid=" />
                        <Argument name="uid"    type="attribute" value="manager" />
                        <Argument name="basedn" type="literal"   value=",%{jndi.basedn.employees}" />
                     </Arguments>
                     <Operations>
                        <Operation type="create" />
                        <Operation type="update" />
                        <Operation type="search" mode="TOSERVICE" />
                     </Operations>
                  </Function>
               </Functions>
            </Attribute>
            <Attribute id="roles" servicename="businessCategory" />
            <Attribute id="lastcommafirst" />
            <Attribute id="forgottenPasswordQuestions">
               <Functions>
                  <Function id="readPwdQuestions" classname="org.openptk.definition.functions.ForgottenPassword">
                     <Arguments>
                        <Argument name="data"           type="attribute" value="forgottenPasswordData" />
                        <Argument name="questions"      type="attribute" value="forgottenPasswordQuestions" />
                        <Argument name="answers"        type="attribute" value="forgottenPasswordAnswers" />
                        <Argument name="innerdelimiter" type="literal"   value="=" />
                        <Argument name="outerdelimiter" type="literal"   value="+" />
                        <Argument name="default"        type="literal"   value="Mothers Maiden Name,City you were born,Last 4 digits of Frequent Flyer" />
                     </Arguments>
                     <Operations>
                        <Operation type="read" />
                     </Operations>
                  </Function>
               </Functions>
            </Attribute>
            <Attribute id="forgottenPasswordAnswers">
               <Functions>
                  <Function id="updatePwdAnswers" classname="org.openptk.definition.functions.ForgottenPassword">
                     <Arguments>
                        <Argument name="data"           type="attribute" value="forgottenPasswordData" />
                        <Argument name="questions"      type="attribute" value="forgottenPasswordQuestions" />
                        <Argument name="answers"        type="attribute" value="forgottenPasswordAnswers" />
                        <Argument name="innerdelimiter" type="literal"   value="=" />
                        <Argument name="outerdelimiter" type="literal"   value="+" />
                        <Argument name="minlength"      type="literal"   value="3" />
                     </Arguments>
                     <Operations>
                        <Operation type="read" />
                        <Operation type="update" />
                     </Operations>
                  </Function>
               </Functions>
            </Attribute>
            <Attribute id="forgottenPasswordData" servicename="destinationIndicator" />
            <Attribute id="street" />
            <Attribute id="city" servicename="l" />
            <Attribute id="state" servicename="st" />
            <Attribute id="postalCode" />
         </Attributes>
      </Association>
      <Association id="JNDI-LOCATION">
         <Attributes>
            <Attribute id="uniqueid"     servicename="ou" />
            <Attribute id="description"     servicename="description" />
            <Attribute id="street" />
            <Attribute id="city" servicename="postalAddress" />
            <Attribute id="state" servicename="st" />
            <Attribute id="postalCode" />
         </Attributes>
      </Association>
      <Association id="JDBC">
         <Attributes>
            <Attribute id="uniqueid"  servicename="id" />
            <Attribute id="firstname" servicename="fname" />
            <Attribute id="lastname"  servicename="lname" />
            <Attribute id="fullname"  servicename="fullname" required="true" />
            <Attribute id="password" />
            <Attribute id="email" />
            <Attribute id="title" />
            <Attribute id="telephone" />
            <Attribute id="manager" />
            <Attribute id="roles" />
            <Attribute id="organization" servicename="org" />
            <Attribute id="location" />
            <Attribute id="lastcommafirst" />
            <Attribute id="forgottenPasswordQuestions" />
            <Attribute id="forgottenPasswordAnswers" />
            <Attribute id="forgottenPasswordData" servicename="forgotdata" />
         </Attributes>
      </Association>
      <Association id="JDBC-LOCATION">
         <Attributes>
            <Attribute id="uniqueid"     servicename="id" />
            <Attribute id="description" />
            <Attribute id="street" />
            <Attribute id="city" />
            <Attribute id="state" />
            <Attribute id="postalCode" />
         </Attributes>
      </Association>
      <Association id="JDBC-MEDIA">
         <Attributes>
            <Attribute id="uniqueid" servicename="uuid" />
            <Attribute id="name" />
            <Attribute id="type" />
            <Attribute id="length"   servicename="size"/>
            <Attribute id="modified" />
            <Attribute id="contextid" servicename="context"/>
            <Attribute id="subjectid" servicename="subject"/>
            <Attribute id="relationshipid" servicename="relationship"/>
            <Attribute id="digest" />
            <Attribute id="data" />
         </Attributes>
      </Association>
      <Association id="SPML1-ROLE">
         <Attributes>
            <Attribute id="rolename" />
            <Attribute id="description" />
            <Attribute id="owner" />
         </Attributes>
      </Association>
   </Associations>
	<!--
		These are related to the OpenPTK Subject Interface and it's API A
		Definition contains Properties and Atttributes Each Attribute (within
		a Definition) supports a number of "well known" Properties. Here are
		the defaults: type = String multivalued = false required = false
		encrypted = false access = public
	-->
   <Definitions>
      <Definition id="Person">
         <Properties>
            <Property name="definition.classname"   value="org.openptk.definition.BasicSubject" />
            <Property name="definition.description" value="A generic employee,partner,consultant" />
            <Property name="definition.password"    value="password" />
            <Property name="definition.role"        value="Roles" />
         </Properties>
         <Attributes>
            <Attribute id="uniqueid" required="true">
               <Functions>
                  <Function id="FirstInitialLastName" useexisting="true" classname="org.openptk.definition.functions.FirstInitialLastname">
                     <Arguments>
                        <Argument name="first"     type="attribute" value="firstname" />
                        <Argument name="last"      type="attribute" value="lastname" />
                        <Argument name="maxlength" type="literal"   value="8" />
                     </Arguments>
                     <Operations>
                        <Operation type="create" />
                     </Operations>
                  </Function>
               </Functions>
            </Attribute>
            <Attribute id="firstname" required="true" >
               <Properties>
                  <Property name="widget.displayname" value="First Name" />
                  <Property name="widget.type" value="textfield" />
                  <Property name="widget.width" value="32" />
                  <Property name="value.min" value="2" />
                  <Property name="value.max" value="30" />
               </Properties>
            </Attribute>
            <Attribute id="lastname"  required="true" />
            <Attribute id="title" />
            <Attribute id="password" encrypted="true">
               <Functions>
                  <Function id="Concat" useexisting="true" classname="org.openptk.definition.functions.ConcatStrings">
                     <Arguments>
                        <Argument name="initialPassword" type="literal" value="Passw0rd" />
                     </Arguments>
                     <Operations>
                        <Operation type="create" />
                     </Operations>
                  </Function>
               </Functions>
            </Attribute>
            <Attribute id="email" required="false">
               <Functions>
                  <Function id="Concat" useexisting="true" classname="org.openptk.definition.functions.ConcatStrings">
                     <Arguments>
                        <Argument name="first"      type="attribute" value="firstname" />
                        <Argument name="dot"        type="literal"   value="." />
                        <Argument name="last"       type="attribute" value="lastname" />
                        <Argument name="at"         type="literal"   value="@" />
                        <Argument name="domainname" type="literal"   value="openptk.org" />
                     </Arguments>
                     <Operations>
                        <Operation type="create" />
                     </Operations>
                  </Function>
               </Functions>
            </Attribute>
            <Attribute id="lastcommafirst" virtual="true">
               <Functions>
                  <Function id="OutputLastFirst" classname="org.openptk.definition.functions.ConcatStrings">
                     <Arguments>
                        <Argument name="arg1" type="attribute" value="lastname" />
                        <Argument name="arg2" type="literal"   value=", " />
                        <Argument name="arg3" type="attribute" value="firstname" />
                     </Arguments>
                     <Operations>
                        <Operation type="read" />
                        <Operation type="search" />
                     </Operations>
                  </Function>
               </Functions>
            </Attribute>
            <Attribute id="fullname" required="false">
               <Functions>
                  <Function id="Concat" useexisting="true" classname="org.openptk.definition.functions.ConcatStrings">
                     <Arguments>
                        <Argument name="arg1" type="attribute" value="firstname" />
                        <Argument name="arg2" type="literal"   value=" " />
                        <Argument name="arg3" type="attribute" value="lastname" />
                     </Arguments>
                     <Operations>
                        <Operation type="create" />
                        <Operation type="update" />
                        <Operation type="read" />
                        <Operation type="search" />
                     </Operations>
                  </Function>
               </Functions>
            </Attribute>
            <Attribute id="forgottenPasswordQuestions" multivalued="true" virtual="true">
               <Functions>
                  <Function id="readPwdQuestions" classname="org.openptk.definition.functions.ForgottenPassword">
                     <Arguments>
                        <Argument name="data"           type="attribute" value="forgottenPasswordData" />
                        <Argument name="questions"      type="attribute" value="forgottenPasswordQuestions" />
                        <Argument name="answers"        type="attribute" value="forgottenPasswordAnswers" />
                        <Argument name="innerdelimiter" type="literal"   value="|" />
                        <Argument name="outerdelimiter" type="literal"   value="^" />
                        <Argument name="default"        type="literal"   value="Mothers Maiden Name,City you were born,Last 4 digits of Frequent Flyer" />
                     </Arguments>
                     <Operations>
                        <Operation type="read" />
                     </Operations>
                  </Function>
               </Functions>
            </Attribute>
            <Attribute id="forgottenPasswordAnswers" multivalued="true" virtual="true" access="private">
               <Functions>
                  <Function id="updatePwdAnswers" classname="org.openptk.definition.functions.ForgottenPassword">
                     <Arguments>
                        <Argument name="data"           type="attribute" value="forgottenPasswordData" />
                        <Argument name="questions"      type="attribute" value="forgottenPasswordQuestions" />
                        <Argument name="answers"        type="attribute" value="forgottenPasswordAnswers" />
                        <Argument name="innerdelimiter" type="literal"   value="|" />
                        <Argument name="outerdelimiter" type="literal"   value="^" />
                        <Argument name="minlength"      type="literal"   value="3" />
                     </Arguments>
                     <Operations>
                        <Operation type="read" />
                        <Operation type="update" />
                     </Operations>
                  </Function>
               </Functions>
            </Attribute>
            <Attribute id="forgottenPasswordData" access="private" />
            <Attribute id="roles" multivalued="true" />
            <Attribute id="manager" />
            <Attribute id="telephone" />
            <Attribute id="organization" />
            <Attribute id="objectclass" />
            <Attribute id="location" />
         </Attributes>
      </Definition>

      <Definition id="Customer">
         <Properties>
            <Property name="definition.classname"   value="org.openptk.definition.BasicSubject" />
            <Property name="definition.description" value="A generic customer" />
            <Property name="definition.password"    value="password" />
            <Property name="definition.role"        value="Roles" />
         </Properties>
         <Attributes>
            <Attribute id="uniqueid" required="true">
               <Functions>
                  <Function id="FirstInitialLastName" useexisting="true" classname="org.openptk.definition.functions.FirstInitialLastname">
                     <Arguments>
                        <Argument name="first"     type="attribute" value="firstname" />
                        <Argument name="last"      type="attribute" value="lastname" />
                        <Argument name="maxlength" type="literal"   value="8" />
                     </Arguments>
                     <Operations>
                        <Operation type="create" />
                     </Operations>
                  </Function>
               </Functions>
            </Attribute>
            <Attribute id="firstname" required="true" >
               <Properties>
                  <Property name="widget.displayname" value="First Name" />
                  <Property name="widget.type" value="textfield" />
                  <Property name="widget.width" value="32" />
                  <Property name="value.min" value="2" />
                  <Property name="value.max" value="30" />
               </Properties>
            </Attribute>
            <Attribute id="lastname"  required="true" />
            <Attribute id="title" />
            <Attribute id="password" encrypted="true">
               <Functions>
                  <Function id="Concat" useexisting="true" classname="org.openptk.definition.functions.ConcatStrings">
                     <Arguments>
                        <Argument name="initialPassword" type="literal" value="Passw0rd" />
                     </Arguments>
                     <Operations>
                        <Operation type="create" />
                     </Operations>
                  </Function>
               </Functions>
            </Attribute>
            <Attribute id="email" required="false">
               <Functions>
                  <Function id="Concat" useexisting="true" classname="org.openptk.definition.functions.ConcatStrings">
                     <Arguments>
                        <Argument name="first"      type="attribute" value="firstname" />
                        <Argument name="dot"        type="literal"   value="." />
                        <Argument name="last"       type="attribute" value="lastname" />
                        <Argument name="at"         type="literal"   value="@" />
                        <Argument name="domainname" type="literal"   value="openptk.org" />
                     </Arguments>
                     <Operations>
                        <Operation type="create" />
                     </Operations>
                  </Function>
               </Functions>
            </Attribute>
            <Attribute id="lastcommafirst" virtual="true">
               <Functions>
                  <Function id="OutputLastFirst" classname="org.openptk.definition.functions.ConcatStrings">
                     <Arguments>
                        <Argument name="arg1" type="attribute" value="lastname" />
                        <Argument name="arg2" type="literal"   value=", " />
                        <Argument name="arg3" type="attribute" value="firstname" />
                     </Arguments>
                     <Operations>
                        <Operation type="read" />
                        <Operation type="search" />
                     </Operations>
                  </Function>
               </Functions>
            </Attribute>
            <Attribute id="fullname" required="false">
               <Functions>
                  <Function id="Concat" useexisting="true" classname="org.openptk.definition.functions.ConcatStrings">
                     <Arguments>
                        <Argument name="arg1" type="attribute" value="firstname" />
                        <Argument name="arg2" type="literal"   value=" " />
                        <Argument name="arg3" type="attribute" value="lastname" />
                     </Arguments>
                     <Operations>
                        <Operation type="create" />
                        <Operation type="update" />
                        <Operation type="read" />
                        <Operation type="search" />
                     </Operations>
                  </Function>
               </Functions>
            </Attribute>
            <Attribute id="forgottenPasswordQuestions" multivalued="true" virtual="true">
               <Functions>
                  <Function id="readPwdQuestions" classname="org.openptk.definition.functions.ForgottenPassword">
                     <Arguments>
                        <Argument name="data"           type="attribute" value="forgottenPasswordData" />
                        <Argument name="questions"      type="attribute" value="forgottenPasswordQuestions" />
                        <Argument name="answers"        type="attribute" value="forgottenPasswordAnswers" />
                        <Argument name="innerdelimiter" type="literal"   value="|" />
                        <Argument name="outerdelimiter" type="literal"   value="^" />
                        <Argument name="default"        type="literal"   value="Mothers Maiden Name,City you were born,Last 4 digits of Frequent Flyer" />
                     </Arguments>
                     <Operations>
                        <Operation type="read" />
                     </Operations>
                  </Function>
               </Functions>
            </Attribute>
            <Attribute id="forgottenPasswordAnswers" multivalued="true" virtual="true" access="private">
               <Functions>
                  <Function id="updatePwdAnswers" classname="org.openptk.definition.functions.ForgottenPassword">
                     <Arguments>
                        <Argument name="data"           type="attribute" value="forgottenPasswordData" />
                        <Argument name="questions"      type="attribute" value="forgottenPasswordQuestions" />
                        <Argument name="answers"        type="attribute" value="forgottenPasswordAnswers" />
                        <Argument name="innerdelimiter" type="literal"   value="|" />
                        <Argument name="outerdelimiter" type="literal"   value="^" />
                        <Argument name="minlength"      type="literal"   value="3" />
                     </Arguments>
                     <Operations>
                        <Operation type="read" />
                        <Operation type="update" />
                     </Operations>
                  </Function>
               </Functions>
            </Attribute>
            <Attribute id="forgottenPasswordData" access="private" />
            <Attribute id="roles" multivalued="true" />
            <Attribute id="manager" />
            <Attribute id="telephone" />
            <Attribute id="organization" />
            <Attribute id="objectclass" />
            <Attribute id="street" />
            <Attribute id="city" />
            <Attribute id="state" />
            <Attribute id="postalCode" />
         </Attributes>
      </Definition>

      <Definition id="Location">
         <Properties>
            <Property name="definition.classname"   value="org.openptk.definition.BasicSubject" />
            <Property name="definition.description" value="A location" />
         </Properties>
         <Attributes>
            <Attribute id="uniqueid" required="true"/>
            <Attribute id="description" />
            <Attribute id="objectclass" />
            <Attribute id="street" />
            <Attribute id="city" />
            <Attribute id="state" />
            <Attribute id="postalCode" />
         </Attributes>
      </Definition>

      <Definition id="Media">
         <Properties>
            <Property name="definition.classname"   value="org.openptk.definition.BasicSubject" />
            <Property name="definition.description" value="Media Repository" />
         </Properties>
         <Attributes>
            <Attribute id="uniqueid" required="true">
               <Functions>
                  <Function id="CtxSubRel" classname="org.openptk.definition.functions.ConcatStrings">
                     <Arguments>
                        <Argument name="arg1" type="attribute" value="contextid" />
                        <Argument name="arg2" type="literal"   value="-" />
                        <Argument name="arg3" type="attribute" value="subjectid" />
                        <Argument name="arg4" type="literal"   value="-" />
                        <Argument name="arg5" type="attribute" value="relationshipid" />
                     </Arguments>
                     <Operations>
                        <Operation type="create" />
                     </Operations>
                  </Function>
               </Functions>
            </Attribute>
            <Attribute id="name" />
            <Attribute id="type" />
            <Attribute id="length" required="true" type="integer"/>
            <Attribute id="modified" required="true">
               <Functions>
                  <Function id="DateTime" classname="org.openptk.definition.functions.DateTimeStamp">
                     <Operations>
                        <Operation type="create"/>
                        <Operation type="update"/>
                     </Operations>
                  </Function>
               </Functions>
            </Attribute>
            <Attribute id="contextid" />
            <Attribute id="subjectid" />
            <Attribute id="relationshipid" />
            <Attribute id="digest" required="true" >
               <Functions>
                  <Function id="Digest" classname="org.openptk.definition.functions.CalculateDigest">
                     <Arguments>
                        <Argument name="data" type="attribute" value="data" />
                     </Arguments>
                     <Operations>
                        <Operation type="create"/>
                        <Operation type="update"/>
                     </Operations>
                  </Function>
               </Functions>
            </Attribute>
            <Attribute id="data" type="object" required="true" />
         </Attributes>
      </Definition>
      
      <Definition id="Role">
         <Properties>
            <Property name="definition.classname"   value="org.openptk.definition.BasicSubject" />
            <Property name="definition.description" value="A business level role" />
         </Properties>
         <Attributes>
            <Attribute id="rolename" required="true" />
            <Attribute id="resources" />
            <Attribute id="description" />
            <Attribute id="owner" />
         </Attributes>
      </Definition>
   </Definitions>
	<!--
		========== Connections === Connection Properties for a given Service
	-->
   <Connections>
      <Properties>
         <Property name="service.classname" value="org.openptk.spi.BasicService" />
      </Properties>
      <Connection id="SunSPML1">
         <Properties>
            <Property name="connection.description"  value="Sun Identity Manager Lighthouse client (SPML1)" />
            <Property name="url"                     value="%{spml1.url}" />
            <Property name="user.name"               value="%{spml1.user.name}" />
            <Property name="user.password.encrypted" value="%{spml1.user.password.encrypted}" />
            <Property name="spmlTrace"               value="false" />
         </Properties>
      </Connection>
      <Connection id="SunSPML2">
         <Properties>
            <Property name="connection.description"  value="Sun Identity Manager Session Aware client (SPML2)" />
            <Property name="url"                     value="%{spml2.url}" />
            <Property name="user.name"               value="%{spml2.user.name}" />
            <Property name="user.password.encrypted" value="%{spml2.user.password.encrypted}" />
            <Property name="spmlTrace"               value="false" />
         </Properties>
      </Connection>
      <Connection id="OpenDS">
         <Properties>
            <Property name="connection.description"  value="OpenDS 1.0" />
            <Property name="url"                     value="%{jndi.url}" />
            <Property name="user.name"               value="%{jndi.user.name}" />
            <Property name="user.password.encrypted" value="%{jndi.user.password.encrypted}" />
         </Properties>
      </Connection>
      <Connection id="MySQL">
         <Properties>
            <Property name="connection.description"  value="MySQL 5.0.x" />
            <Property name="url"                     value="%{jdbc.url}" />
            <Property name="user.name"               value="%{jdbc.user.name}" />
            <Property name="user.password.encrypted" value="%{jdbc.user.password.encrypted}" />
            <Property name="driver"                  value="%{jdbc.driver}" />
         </Properties>
      </Connection>
   </Connections>

   <!--
   The Loggers for recording audit and debug information
   -->
   <Loggers>
      <Logger id="UnixLogFile">
         <Properties>
            <Property name="logger.classname" value="org.openptk.logging.AtomicLogger" />
            <Property name="file"             value="/var/tmp/openptk.log" />
         </Properties>
      </Logger>
   </Loggers>

   <!--
   Security related information
   -->
   <Security>
      <Encryptions>
         <Encryption id="PBEWithMD5AndDES">
            <Properties>
               <Property name="crypto.classname" value="org.openptk.crypto.DESCrypto" />
            </Properties>
         </Encryption>
      </Encryptions>
      
      <!--
      Authentication mechanisms
      -->
      <Authenticators>
         <Authenticator id="Anonymous" level="ANON">
            <Properties>
               <Property name="authenticator.classname"   value="org.openptk.authen.AnonAuthenticator"/>
               <Property name="authenticator.description" value="Anonymous User"/>
            </Properties>
         </Authenticator>
         <Authenticator id="Employees-IdPass-JDBC" level="USER">
            <Properties>
               <Property name="authenticator.classname"   value="org.openptk.authen.IdPassServiceAuthenticator"/>
               <Property name="authenticator.context"       value="Employees-MySQL-JDBC"/>
               <Property name="authenticator.description" value="Employees with User ID and Password verified against JDBC"/>
            </Properties>
         </Authenticator>
         <Authenticator id="Employees-IdPass-LDAP" level="USER">
            <Properties>
               <Property name="authenticator.classname"   value="org.openptk.authen.IdPassServiceAuthenticator"/>
               <Property name="authenticator.context"       value="Employees-OpenDS-JNDI"/>
               <Property name="authenticator.description" value="Employees with User ID and Password verified against LDAP"/>
            </Properties>
         </Authenticator>
         <Authenticator id="Employees-Token-LDAP" level="USER">
            <Properties>
               <Property name="authenticator.classname"   value="org.openptk.authen.TokenAuthenticator"/>
               <Property name="authenticator.context"       value="Employees-OpenDS-JNDI"/>
               <Property name="authenticator.description" value="Employees with HTTP Header token verified against LDAP"/>
            </Properties>
         </Authenticator>
         <Authenticator id="OpenPTK-config" level="SYSTEM">
            <Properties>
               <Property name="authenticator.classname"   value="org.openptk.authen.IdPassSystemAuthenticator"/>
               <Property name="authenticator.description" value="OpenPTK config against internal admin credentials"/>
            </Properties>
         </Authenticator>
      </Authenticators>
   </Security>

   <!--
   Client information
   -->
   
   <Clients>
      <Client id="anon">
         <Authenticators>
            <Authenticator id="Anonymous"/>
         </Authenticators>
         <Contexts default="Employees-MySQL-JDBC">
            <Context id="Employees-MySQL-JDBC" />
            <Context id="Employees-OpenDS-JNDI" />
         </Contexts>
      </Client>
      <Client id="server">
         <Authenticators>
            <Authenticator id="Employees-IdPass-LDAP"/>
            <Authenticator id="Employees-IdPass-JDBC"/>
            <Authenticator id="OpenPTK-config"/>
         </Authenticators>
         <Contexts default="Employees-MySQL-JDBC">
            <Context id="Employees-MySQL-JDBC"  />
            <Context id="Employees-OpenDS-JNDI" />
         </Contexts>
      </Client>
      <Client id="portal" secret="gKZo9rUyLeY56vSsFpR4J9GJ">
         <Authenticators>
            <Authenticator id="Anonymous"/>
            <Authenticator id="Employees-Token-LDAP"/>
         </Authenticators>
         <Contexts default="Employees-MySQL-JDBC">
            <Context id="Employees-MySQL-JDBC" />
            <Context id="Employees-OpenDS-JNDI" />
         </Contexts>
      </Client>
      <Client id="uml" secret="WeacAymEnZqP34gDQuNfDsHE">
         <Authenticators>
            <Authenticator id="Anonymous"/>
            <Authenticator id="Employees-IdPass-LDAP"/>
            <Authenticator id="Employees-IdPass-JDBC"/>
         </Authenticators>
         <Contexts default="Employees-MySQL-JDBC">
            <Context id="Employees-MySQL-JDBC"  />
            <Context id="Employees-OpenDS-JNDI" />
         </Contexts>
      </Client>
      <Client id="console" secret="tLlGZ1rkok865iEmvomJEl4Z">
         <Authenticators>
            <Authenticator id="Anonymous"/>
            <Authenticator id="Employees-IdPass-JDBC"/>
         </Authenticators>
         <Contexts default="Employees-MySQL-JDBC">
            <Context id="Employees-MySQL-JDBC" />
            <Context id="Employees-OpenDS-JNDI" />
         </Contexts>
      </Client>
      <Client id="apitest" secret="McP7NoBoPTPHrJZLfXsnDEod">
         <Authenticators>
            <Authenticator id="Anonymous"/>
            <Authenticator id="Employees-Token-LDAP"/>
            <Authenticator id="Employees-IdPass-LDAP"/>
         </Authenticators>
         <Contexts default="Employees-MySQL-JDBC">
            <Context id="Employees-MySQL-JDBC" />
            <Context id="Employees-OpenDS-JNDI" />
         </Contexts>
      </Client>
      <Client id="taglibtest" secret="N343EhOmFig6XL1liUuRIvmf">
         <Authenticators>
            <Authenticator id="Anonymous"/>
            <Authenticator id="Employees-IdPass-LDAP"/>
         </Authenticators>
         <Contexts default="Employees-MySQL-JDBC">
            <Context id="Employees-MySQL-JDBC" />
            <Context id="Employees-OpenDS-JNDI" />
         </Contexts>
      </Client>
   </Clients>
   
   <!--
   Models
   -->
   <Models>
      <Properties>
         <Property name="model.classname" value="org.openptk.model.BasicModel"/>
      </Properties>
      <Model id="Employee">
         <Properties>
            <Property name="model.description" value="Person that has Organization and Location information"/>
         </Properties>
         <Relationships>
            <Relationship id="directReports">
               <Properties>
                  <Property name="relationship.classname"   value="org.openptk.model.ChildrenRelationship"/>
                  <Property name="relationship.description" value="List of children for a Subject"/>
               </Properties>
               <Query type="EQ" name="manager" value="${uniqueid}"/>
            </Relationship>
            <Relationship id="reportsTo">
               <Properties>
                  <Property name="relationship.classname"   value="org.openptk.model.AncestorsRelationship"/>
                  <Property name="relationship.description" value="List (ordered) of ancestors for a Subject"/>
               </Properties>
               <Query type="EQ" name="uniqueid" value="${manager}"/>
            </Relationship>
            <Relationship id="organization">
               <Properties>
                  <Property name="relationship.classname"   value="org.openptk.model.OrganizationRelationship"/>
                  <Property name="relationship.description" value="List (ordered) of the Subject organization"/>
               </Properties>
               <Query type="EQ" name="uniqueid" value="${manager}"/>
            </Relationship>
            <Relationship id="peers">
               <Properties>
                  <Property name="relationship.classname"   value="org.openptk.model.SiblingsRelationship"/>
                  <Property name="relationship.description" value="List of siblings for a Subject"/>
               </Properties>
               <Query type="EQ" name="manager" value="${manager}"/>
            </Relationship>
            <Relationship id="location">
               <Properties>
                  <Property name="relationship.classname"          value="org.openptk.model.SubjectRelationship" />
                  <Property name="relationship.description"        value="Location related Subject" />
                  <Property name="relationship.uniqueid.attribute" value="location" />
               </Properties>
            </Relationship>
            <Relationship id="photo">
               <Properties>
                  <Property name="relationship.classname"          value="org.openptk.model.MediaRelationship" />
                  <Property name="relationship.description"        value="Employee photo" />
               </Properties>
            </Relationship>
         </Relationships>
         <Views>
            <View id="extended">
               <Relationships>
                  <Relationship id="location"/>
                  <Relationship id="organization"/>
                  <Relationship id="peers"/>
                  <Relationship id="directReports"/>
               </Relationships>
            </View>
            <View id="address">
               <Relationships>
                  <Relationship id="location"/>
               </Relationships>
            </View>
         </Views>
      </Model>
   </Models>

   <!--
   Converter Rules for the Structures
   -->

   <Converters>
      <Converter type="json" classname="org.openptk.structure.JsonConverter">
         <Structures>
            <Structure id="results">
               <Properties>
                  <Property name="children" value="list"/>
               </Properties>
            </Structure>
         </Structures>
      </Converter>
      <Converter type="xml" classname="org.openptk.structure.XmlConverter"/>
      <Converter type="html" classname="org.openptk.structure.HtmlConverter"/>
      <Converter type="plain" classname="org.openptk.structure.PlainConverter"/>
   </Converters>

</OpenPTK>
Enter labels to add to this page:
Please wait 
Looking for a label? Just start typing.

Sign up or Log in to add a comment or watch this page.


The individuals who post here are part of the extended Sun Microsystems community and they might not be employed or in any way formally affiliated with Sun Microsystems. The opinions expressed here are their own, are not necessarily reviewed in advance by anyone but the individual authors, and neither Sun nor any other party necessarily agrees with them.

Copyright 1994-2009 Sun Microsystems, Inc.
Powered by Atlassian Confluence
Sun Guidelines on Public Discourse Privacy Policy Terms of Use Trademarks Site Map Employment Investor Relations Contact