diff --git a/.classpath b/.classpath new file mode 100644 index 0000000..20d4084 --- /dev/null +++ b/.classpath @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/.project b/.project new file mode 100644 index 0000000..0cb5f3a --- /dev/null +++ b/.project @@ -0,0 +1,17 @@ + + + dxqueue + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/demo/JDBC.xml b/demo/JDBC.xml new file mode 100755 index 0000000..d2e3e94 --- /dev/null +++ b/demo/JDBC.xml @@ -0,0 +1,503 @@ + + + + + + + + + + + + + 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 + + + + + + + + + + + + + + + + + + + + + Enter the class name of your third-party JDBC driver. Verify that the jar/zip file containing this class is version compatible with the target database. + org.postgresql.Driver + + + + + Show parameters that control how much of the database is visible to this driver? + show + hide + show + + + + + On start-up, the driver caches database metadata on a limited number of tables/views to facilitate data synchronization. You can cache no table/view metadata (exclude all tables/views), cache metadata on all tables/views owned by a single database user (include by schema membership) or cache metadata on an explicit list of table/view names (include by table/view name). If no table/view metadata is cached, the driver acts as a pass-through agent for embedded SQL. In this state, standard XDS events (e.g., add, modify, delete) are ignored. + empty + schema + list + list + + + + Enter the name of the database schema that contains the tables/views to synchronize. Schema is usually synonymous with ownership. For example, if database user 'idm' owns table 'table1', 'table1' is said to be part of the 'idm' schema. + + + + + Do you want to use regular expressions to include or exclude tables/views? These parameters are useful when synchronizing with a large schema and you need to reduce the number of tables/view definitions cached by this driver. Schema filtering can reduce start-up time as well as reduce runtime memory utilization. + 1 + 0 + 0 + + + + Specify a Java regular expression filter for including tables/views. + + + + Specify a Java regular expression filter for excluding tables/views. + + + + + + + + Enter the names of the tables/views to synchronize. You may need to schema-qualify these names (e.g., owner.table). Multiple values should be semicolon, comma, or space-delimited. This parameter is useful if you need to reduce the number of table/view definitions cached by this driver, which can shorten driver start-up time as well as reduce runtime memory utilization. It is also useful when synchronizing tables/views that reside in different database schemas (that is, are owned by multiple database users). + direct.view_usr; direct.view_grp + + + + + + + Return time-related data types as integers, canonical strings, or Java strings? The advantage of returning time values as integers is that integer values easily map to eDirectory's native time data types. The disadvantage is the limited range. An integer value that represents the number of seconds since 1970 can cover a date range from about 1910 to 2030 if interpreted as a signed value. By default, however, Identity Manager interprets time-related integer data types as unsigned values. String timestamps, on the other hand, can cover a much broader range, like database timestamps, and are more precise, but must be mapped to string data types in Identity Manager. Canonical string timestamps, dates, and times are published in the following formats: CCYYMMDDHHMMSSNNNNNNNNN, CCYYMMDD and HHMMSS, respectively (where C = century, Y = year, M = month or minute, D = day, H = hour, S = second, N = nano). These fixed-length formats have the virtue of collating in chronological order on any platform in any locale. Java string timestamps, dates, and times are published in the following formats: yyyy-mm-dd hh:mm:ss.fffffffff, yyyy-mm-dd and hh:mm:ss, respectively (where y = year, m = month or minute, d = day, h = hour, s = second, f = nano). + _ + 2 + 3 + _ + + + What's the path of the folder where you want this driver to store state information? Changing this value when using triggerless publication can force a resync of all objects. + . + + + + Show connectivity-related parameters? + show + hide + hide + + + + Should the Subscriber and Publisher share a database connection? Normally, this driver uses three database connections when both channels are enabled (one subscription connection and two publication connections). This parameter reduces the number of required connections to two (one dedicated publication connection and one shared subscription/publication connection). + _ + 1 + 0 + _ + + + What SQL statements, if any, should be executed immediately after connecting to the database? Multiple values should be semicolon-delimited. This parameter is useful for changing database contexts or setting session properties. + + + + List connection properties as key value pairs. For example: key=value. Multiple values should be delimited by a semi-colon. For example: key1=value1; key2=value2. + + + + + + + Show parameters that can adjust adjust driver behavior to enhance compatibility with various third-party JDBC implementations and databases? + show + hide + hide + + + + + Do you want to use custom XML descriptor files that describe the unique properties of your third-party JDBC implementation or database to this driver? + 1 + 0 + 0 + + + + Specify the name of the descriptor file for your third-party JDBC driver. The filename must have the extension .xml and be located in a jar file whose name begins with "jdbc" (case-insensitive) and in the runtime classpath. + + + + Specify the name of the descriptor file for the target database. The filename must have the extension .xml and be located in a jar file whose name begins with "jdbc" (case-insensitive) and in the runtime classpath. + + + + + + + Show parameters that ensure backward compatibility? + show + hide + hide + + + + Should table columns constrained with foreign key constraints be interpreted as referential attributes? Referrential attributes allow relationships, such as containment, to exist between tables. For 1.0 backwards compatibility, referential attribute support should be disabled. + _ + 0 + _ + + + Should view column name prefixes (e.g., "pk_", "fk_", "sv_", "mv_") be interpreted as metadata? When enabled, said prefixes are not considered part of view column names. Meta-identifiers allow one to define referrential relationships between views and mark view columns as multi or single-valued. For 1.5 backwards compatibility, meta-identifier support should be disabled. + _ + 0 + _ + + + + + + Show transaction-related parameters? + show + hide + hide + + + + Should this driver use transactions? Are transactions supported by the target database or table implementation you are using? + _ + 1 + 0 + _ + + + Use this parameter to set advanced transaction properties. For additional information on what these values mean, please refer to the JDBC tutorial at http://java.sun.com/docs/books/tutorial/jdbc/basics/transactions.html and the documentation of your third-party JDBC driver or database. + _ + unsupported + none + read uncommitted + read committed + repeatable read + serializable + read committed + + + + + + Show statement-related parameters? + show + hide + hide + + + + Should this driver reuse java.sql.Statement objects or close and reallocate them with each use? + _ + 1 + 0 + _ + + + How many result sets can be returned from an SQL statement? + _ + none + single + multiple + _ + + + + Should this driver explicitly lock database resources before executing each statement? + 0 + 1 + 0 + + + + + Do you want to use a custom class to generate locking statements? + 1 + 0 + 0 + + + + Specify the name of the class used to generate locking statements. + + + + + + + + + + What case should the authentication username be in? + _ + upper + mixed + lower + _ + + + Choose a left outer-join operator. + _ + *= + (+) + LEFT OUTER JOIN + _ + + + Should this driver run using the least amount of database metadata possible? This parameter is useful when a given third-party JDBC driver does not implement one of the optional metadata method normally utilized by this driver. When set to no, referential data and child parent relationships are no longer available to this driver. + _ + 1 + 0 + _ + + + How are results returned from database functions? + _ + result set + return value + _ + + + Can schema names be used to retrieve database metadata? + _ + 1 + 0 + _ + + + For legacy databases that don't support the notion of column position (DB2/AS400, for instance), a backup ordering algorithm must be employed. Sorting columns names by hexadecimal value ensures that if the this driver is relocated to a different server, it will continue to function without modification. Sorting column names by platform or locale string collation order is more intuitive, but may require configuration changes if a driver instance is relocated to a different server. In particular, event log table column order and compound column name order may change. In the case of the latter, the schema-mapping rule and object association values may need to be updated. In the case of the former, event log table columns may have to be renamed. + _ + com.novell.nds.dirxml.driver.jdbc.util.config.comp.StringByteComparator + com.novell.nds.dirxml.driver.jdbc.util.config.comp.StringComparator + _ + + + + + + + + + + + + Do you want to ignore events flowing from Identity Manager to the database? + _ + 1 + _ + + + + + Show parameters that control how and when primary key values are generated? + show + hide + hide + + + + How are primary key values being generated or retrieved? This setting is global for all tables/views. + _ + driver + auto + _ + + + When should primary key values be retrieved? Before or after row insertion? This setting is global for all tables/views. + _ + after + after + + + Specify how and when primary key values are generated/retrieved on a per table/view basis. This parameter overrides global method and timing settings. Multiple values should be semicolon, comma, or space-delimited. + + view_usr("?=indirect.proc_idu()", before); view_grp("?=indirect.proc_idg()") + + + + + Disable statement locking? Should explicit locking or database resources be disabled on this channel? + 1 + 0 + 0 + + + Should the Subscriber add default values to insert operations on views? This parameter is desirable for satisfying instead-of-trigger constraints that require non-null values be provided for non-nullable columns before instead-of-triggers fire. This parameter has no effect on tables. + _ + 1 + 0 + _ + + + + + + + + + + + + + Do you want to ignore events flowing from the database to Identity Manager? + _ + 1 + 1 + + + + + Do you want to use triggered or triggerless publication? Triggered publication uses database triggers to capture events and log them in a table. Triggerless publication, in contrast, derives events by inspecting database tables/views. Triggered publication is more efficient, but requires substantial database-side configuration. Triggerless publication is less efficient, but requires minimal database-side configuration. + _ + 2 + _ + + + + What's the name of the table where publication events are stored? + direct.direct_process + + + Should processed rows be deleted from the event log table? There is a significant performance hit when processed rows are left in the event log table. The performance cost can be mitigated by moving processed rows from the event log table into an event history table using the "Post polling statements:" parameter. + _ + 0 + _ + + + Should the Publisher optimize update events before sending them to the engine? When set to yes, all update events are optimized. When set to no, select update events are not. For a more complete explanation of this parameter, please consult the driver implementation guide. + _ + 1 + _ + + + Allow events initiated by the Subscriber channel to loopback on the Publisher channel? + _ + 1 + _ + + + Disable statement locking? Should explicit locking or database resources be disabled on this channel? + 1 + 0 + 0 + + + + + Determine the Publisher's behavior on start-up. + _ + 2 + 1 + _ + + + + + + Process events in the event log table based upon their effective date as opposed to order of insertion (triggered publication) or publish database local time with each event (triggerless publication)? + _ + 1 + _ + + + + + Do you want to specify a custom SQL statement that supplies the current time/date on the database server? By default, a statement is dynamically derived. + 1 + 0 + 0 + + + + What SQL statement should be used to determine the current time and date on the database server?" + + + + + + + + + Show parameters that control polling behavior? + show + hide + hide + + + + + What's the minimum number of seconds of inactivity that should elapse between polling cycles? In practice, more than the number of specified seconds may elapse (i.e., this is a lower bound only). The default is 10 seconds. + 10 + + + When should the Publisher check for new database events each day? Time values may be entered in multiple formats. The preferred format is hh:mm:ss, where h = hour, m = minute, s = second. + + + + What statements, if any, should be executed after an active polling cycle? This parameter is useful, for instance, for calling a stored procedure/function that moves processed rows from the event log table into a history table and rebuilds indexes on the event log table. Multiple values should be semicolon-delimited. + SELECT direct.proc_directlog(); DELETE FROM indirect.indirect_process + + + What is the desired number of database events that the Publisher group together in a single publication document? The number of events per document may be less but will not be greater. The upper bound of 128 was chosen to minimize the likelihood of overflowing the Java heap and to mitigate delaying termination of the Publisher thread on driver shutdown. + _ + 2 + 4 + 8 + 16 + 32 + 64 + 128 + _ + + + + + + + How many minutes of Publisher inactivity should elapse before the Publisher sends a heartbeat document? In practice, more than the number of minutes specified may elapse. That is, this parameter defines a lower bound. + 0 + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/demo/SendQueue.trace b/demo/SendQueue.trace new file mode 100755 index 0000000..5abf005 --- /dev/null +++ b/demo/SendQueue.trace @@ -0,0 +1,227 @@ +[06/17/10 19:14:24.881]:SendQueueEvent ST:Start transaction. +[06/17/10 19:14:24.889]:SendQueueEvent ST:Processing events for transaction. +[06/17/10 19:14:24.893]:SendQueueEvent ST: + + + DirXML + Novell, Inc. + + + + + USER + + + Last + + + First + + + + +[06/17/10 19:14:24.903]:SendQueueEvent ST:Applying event transformation policies. +[06/17/10 19:14:24.904]:SendQueueEvent ST:Applying policy: %+C%14CSend Queue Event%-C. +[06/17/10 19:14:24.907]:SendQueueEvent ST: Applying to add #1. +[06/17/10 19:14:24.909]:SendQueueEvent ST: Evaluating selection criteria for rule 'Capture Event'. +[06/17/10 19:14:24.910]:SendQueueEvent ST: Rule selected. +[06/17/10 19:14:24.912]:SendQueueEvent ST: Applying rule 'Capture Event'. +[06/17/10 19:14:24.913]:SendQueueEvent ST: Action: do-set-local-variable("OPERATION",scope="policy",token-replace-all(">",">",token-replace-all("<","<",token-xml-serialize(token-xpath("."))))). +[06/17/10 19:14:24.916]:SendQueueEvent ST: arg-string(token-replace-all(">",">",token-replace-all("<","<",token-xml-serialize(token-xpath("."))))) +[06/17/10 19:14:24.918]:SendQueueEvent ST: token-replace-all(">",">",token-replace-all("<","<",token-xml-serialize(token-xpath(".")))) +[06/17/10 19:14:24.920]:SendQueueEvent ST: token-replace-all(">",">",token-replace-all("<","<",token-xml-serialize(token-xpath(".")))) +[06/17/10 19:14:24.922]:SendQueueEvent ST: token-replace-all("<","<",token-xml-serialize(token-xpath("."))) +[06/17/10 19:14:24.924]:SendQueueEvent ST: token-replace-all("<","<",token-xml-serialize(token-xpath("."))) +[06/17/10 19:14:24.926]:SendQueueEvent ST: token-xml-serialize(token-xpath(".")) +[06/17/10 19:14:24.927]:SendQueueEvent ST: token-xml-serialize(token-xpath(".")) +[06/17/10 19:14:24.928]:SendQueueEvent ST: token-xpath(".") +[06/17/10 19:14:24.930]:SendQueueEvent ST: Token Value: { @cached-time = "20100617071424.789Z" @class-name = "User" @event-id = "linux#20100617071424#1#1" @qualified-src-dn = "O=Identities\CN=USER" @src-dn = "\EDIR\Identities\USER" @src-entry-id = "34904" @timestamp = "1276758864#23"}. +[06/17/10 19:14:24.936]:SendQueueEvent ST: Arg Value: { @cached-time = "20100617071424.789Z" @class-name = "User" @event-id = "linux#20100617071424#1#1" @qualified-src-dn = "O=Identities\CN=USER" @src-dn = "\EDIR\Identities\USER" @src-entry-id = "34904" @timestamp = "1276758864#23"}. +[06/17/10 19:14:24.941]:SendQueueEvent ST: Token Value: " + + USER + + + Last + + + First + +". +[06/17/10 19:14:24.951]:SendQueueEvent ST: Arg Value: " + + USER + + + Last + + + First + +". +[06/17/10 19:14:24.960]:SendQueueEvent ST: Token Value: "<add cached-time="20100617071424.789Z" class-name="User" event-id="linux#20100617071424#1#1" qualified-src-dn="O=Identities\CN=USER" src-dn="\EDIR\Identities\USER" src-entry-id="34904" timestamp="1276758864#23"> + <add-attr attr-name="CN"> + <value timestamp="1276758864#23" type="string">USER</value> + </add-attr> + <add-attr attr-name="Surname"> + <value timestamp="1276758864#3" type="string">Last</value> + </add-attr> + <add-attr attr-name="Given Name"> + <value timestamp="1276758864#4" type="string">First</value> + </add-attr> +</add>". +[06/17/10 19:14:24.968]:SendQueueEvent ST: Arg Value: "<add cached-time="20100617071424.789Z" class-name="User" event-id="linux#20100617071424#1#1" qualified-src-dn="O=Identities\CN=USER" src-dn="\EDIR\Identities\USER" src-entry-id="34904" timestamp="1276758864#23"> + <add-attr attr-name="CN"> + <value timestamp="1276758864#23" type="string">USER</value> + </add-attr> + <add-attr attr-name="Surname"> + <value timestamp="1276758864#3" type="string">Last</value> + </add-attr> + <add-attr attr-name="Given Name"> + <value timestamp="1276758864#4" type="string">First</value> + </add-attr> +</add>". +[06/17/10 19:14:24.976]:SendQueueEvent ST: Token Value: "<add cached-time="20100617071424.789Z" class-name="User" event-id="linux#20100617071424#1#1" qualified-src-dn="O=Identities\CN=USER" src-dn="\EDIR\Identities\USER" src-entry-id="34904" timestamp="1276758864#23"> + <add-attr attr-name="CN"> + <value timestamp="1276758864#23" type="string">USER</value> + </add-attr> + <add-attr attr-name="Surname"> + <value timestamp="1276758864#3" type="string">Last</value> + </add-attr> + <add-attr attr-name="Given Name"> + <value timestamp="1276758864#4" type="string">First</value> + </add-attr> +</add>". +[06/17/10 19:14:24.986]:SendQueueEvent ST: Arg Value: "<add cached-time="20100617071424.789Z" class-name="User" event-id="linux#20100617071424#1#1" qualified-src-dn="O=Identities\CN=USER" src-dn="\EDIR\Identities\USER" src-entry-id="34904" timestamp="1276758864#23"> + <add-attr attr-name="CN"> + <value timestamp="1276758864#23" type="string">USER</value> + </add-attr> + <add-attr attr-name="Surname"> + <value timestamp="1276758864#3" type="string">Last</value> + </add-attr> + <add-attr attr-name="Given Name"> + <value timestamp="1276758864#4" type="string">First</value> + </add-attr> +</add>". +[06/17/10 19:14:25.012]:SendQueueEvent ST: Action: do-set-local-variable("XDS",scope="policy",arg-node-set(token-xml-parse(""+"INSERT INTO AUDIT(CN,EVENTID,XDS) VALUES ('"+token-attr("CN")+"','"+token-xpath("@event-id")+"','"+token-local-variable("OPERATION")+"')"))). +[06/17/10 19:14:25.016]:SendQueueEvent ST: arg-node-set(token-xml-parse(""+"INSERT INTO AUDIT(CN,EVENTID,XDS) VALUES ('"+token-attr("CN")+"','"+token-xpath("@event-id")+"','"+token-local-variable("OPERATION")+"')")) +[06/17/10 19:14:25.019]:SendQueueEvent ST: token-xml-parse(""+"INSERT INTO AUDIT(CN,EVENTID,XDS) VALUES ('"+token-attr("CN")+"','"+token-xpath("@event-id")+"','"+token-local-variable("OPERATION")+"')") +[06/17/10 19:14:25.023]:SendQueueEvent ST: token-xml-parse(""+"INSERT INTO AUDIT(CN,EVENTID,XDS) VALUES ('"+token-attr("CN")+"','"+token-xpath("@event-id")+"','"+token-local-variable("OPERATION")+"')") +[06/17/10 19:14:25.026]:SendQueueEvent ST: token-text("") +[06/17/10 19:14:25.028]:SendQueueEvent ST: token-text("INSERT INTO AUDIT(CN,EVENTID,XDS) VALUES ('") +[06/17/10 19:14:25.029]:SendQueueEvent ST: token-attr("CN") +[06/17/10 19:14:25.030]:SendQueueEvent ST: Token Value: "USER". +[06/17/10 19:14:25.031]:SendQueueEvent ST: token-text("','") +[06/17/10 19:14:25.032]:SendQueueEvent ST: token-xpath("@event-id") +[06/17/10 19:14:25.033]:SendQueueEvent ST: Token Value: "linux#20100617071424#1#1". +[06/17/10 19:14:25.035]:SendQueueEvent ST: token-text("','") +[06/17/10 19:14:25.036]:SendQueueEvent ST: token-local-variable("OPERATION") +[06/17/10 19:14:25.037]:SendQueueEvent ST: Token Value: "<add cached-time="20100617071424.789Z" class-name="User" event-id="linux#20100617071424#1#1" qualified-src-dn="O=Identities\CN=USER" src-dn="\EDIR\Identities\USER" src-entry-id="34904" timestamp="1276758864#23"> + <add-attr attr-name="CN"> + <value timestamp="1276758864#23" type="string">USER</value> + </add-attr> + <add-attr attr-name="Surname"> + <value timestamp="1276758864#3" type="string">Last</value> + </add-attr> + <add-attr attr-name="Given Name"> + <value timestamp="1276758864#4" type="string">First</value> + </add-attr> +</add>". +[06/17/10 19:14:25.044]:SendQueueEvent ST: token-text("')") +[06/17/10 19:14:25.045]:SendQueueEvent ST: Arg Value: "INSERT INTO AUDIT(CN,EVENTID,XDS) VALUES ('USER','linux#20100617071424#1#1','<add cached-time="20100617071424.789Z" class-name="User" event-id="linux#20100617071424#1#1" qualified-src-dn="O=Identities\CN=USER" src-dn="\EDIR\Identities\USER" src-entry-id="34904" timestamp="1276758864#23"> + <add-attr attr-name="CN"> + <value timestamp="1276758864#23" type="string">USER</value> + </add-attr> + <add-attr attr-name="Surname"> + <value timestamp="1276758864#3" type="string">Last</value> + </add-attr> + <add-attr attr-name="Given Name"> + <value timestamp="1276758864#4" type="string">First</value> + </add-attr> +</add>')". +[06/17/10 19:14:25.056]:SendQueueEvent ST: Token Value: {/}. +[06/17/10 19:14:25.057]:SendQueueEvent ST: Arg Value: {/}. +[06/17/10 19:14:25.058]:SendQueueEvent ST: Action: do-set-local-variable("DriverDN",scope="policy","\EDIR\ADMIN\IDM\DriverSet\JDBC"). +[06/17/10 19:14:25.059]:SendQueueEvent ST: arg-string("\EDIR\ADMIN\IDM\DriverSet\JDBC") +[06/17/10 19:14:25.061]:SendQueueEvent ST: token-text("\EDIR\ADMIN\IDM\DriverSet\JDBC") +[06/17/10 19:14:25.062]:SendQueueEvent ST: Arg Value: "\EDIR\ADMIN\IDM\DriverSet\JDBC". +[06/17/10 19:14:25.063]:SendQueueEvent ST: Action: do-set-local-variable("CmdResult",scope="policy",arg-node-set(token-xpath("dxqueue:sendQueueEvent($DriverDN, $XDS/nds)"))). +[06/17/10 19:14:25.065]:SendQueueEvent ST: arg-node-set(token-xpath("dxqueue:sendQueueEvent($DriverDN, $XDS/nds)")) +[06/17/10 19:14:25.067]:SendQueueEvent ST: token-xpath("dxqueue:sendQueueEvent($DriverDN, $XDS/nds)") +[06/17/10 19:14:25.144]:SendQueueEvent ST: Token Value: {}. +[06/17/10 19:14:25.145]:SendQueueEvent ST: Arg Value: {}. +[06/17/10 19:14:25.147]:SendQueueEvent ST:Policy returned: +[06/17/10 19:14:25.148]:SendQueueEvent ST: + + + DirXML + Novell, Inc. + + + + + USER + + + Last + + + First + + + + +[06/17/10 19:14:25.157]:SendQueueEvent ST:Subscriber processing add for \EDIR\Identities\USER. +[06/17/10 19:14:25.158]:SendQueueEvent ST:No object matching policies. +[06/17/10 19:14:25.160]:SendQueueEvent ST:No object creation policies. +[06/17/10 19:14:25.161]:SendQueueEvent ST:No object placement policies. +[06/17/10 19:14:25.162]:SendQueueEvent ST:Submitting add to subscriber shim. +[06/17/10 19:14:25.163]:SendQueueEvent ST:No command transformation policies. +[06/17/10 19:14:25.164]:SendQueueEvent ST:Filtering out notification-only attributes. +[06/17/10 19:14:25.165]:SendQueueEvent ST:Fixing up association references. +[06/17/10 19:14:25.166]:SendQueueEvent ST:No schema mapping policies. +[06/17/10 19:14:25.167]:SendQueueEvent ST:No output transformation policies. +[06/17/10 19:14:25.168]:SendQueueEvent ST:Submitting document to subscriber shim: +[06/17/10 19:14:25.170]:SendQueueEvent ST: + + + DirXML + Novell, Inc. + + + + + USER + + + Last + + + First + + + + +[06/17/10 19:14:25.178]:SendQueueEvent ST:SubscriptionShim.execute() returned: +[06/17/10 19:14:25.179]:SendQueueEvent ST: + + + DirXML Null Driver + Novell, Inc. + + + + + +[06/17/10 19:14:25.182]:SendQueueEvent ST:No input transformation policies. +[06/17/10 19:14:25.183]:SendQueueEvent ST:No schema mapping policies. +[06/17/10 19:14:25.184]:SendQueueEvent ST:Resolving association references. +[06/17/10 19:14:25.186]:SendQueueEvent ST:Processing returned document. +[06/17/10 19:14:25.187]:SendQueueEvent ST:Processing operation for . +[06/17/10 19:14:25.189]:SendQueueEvent ST: +DirXML Log Event ------------------- + Driver: \EDIR\ADMIN\IDM\DriverSet\SendQueueEvent + Channel: Subscriber + Object: \EDIR\Identities\USER + Status: Success +[06/17/10 19:14:25.192]:SendQueueEvent ST:End transaction. diff --git a/demo/SendQueueEvent.xml b/demo/SendQueueEvent.xml new file mode 100755 index 0000000..0986b13 --- /dev/null +++ b/demo/SendQueueEvent.xml @@ -0,0 +1,111 @@ + + + + + + + + + + + + + + + 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 + + + + + + + + + + + + + + + + + + + + + Configures the driver shim to send a periodic status message on the publisher channel when there has been no publisher traffic for the given number of seconds. + 0 + + + + + + + + + + + + + + + + + + + + + + + + + Capture Event + This policy will capture the incoming event, and generate a XDS Message to put onto the other driver. This example will create a JDBC Message and log it to the database using the other driver. +There are a few tricks, one is to serialize the incoming XDS, and do a Search and Replace of all the < and > into &gt; and &lt;. Plus the DriverDN must include the full TreeName. Lastly the sendQueueEvent will return a Nodeset so you must set the variable type to be a nodeset + + + + + + + + + + + + + + + + + + + <nds><input xmlns:jdbc="urn:dirxml:jdbc"><jdbc:statement jdbc:type="update"><jdbc:sql> + INSERT INTO AUDIT(CN,EVENTID,XDS) VALUES (' + + ',' + + ',' + + ')</jdbc:sql></jdbc:statement></input></nds> + + + + + + \EDIR\ADMIN\IDM\DriverSet\JDBC + + + + + + + + + + + + + + + \ No newline at end of file