<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>World Wide Woogie &#187; Geek</title>
	<atom:link href="http://woogie.net/category/geek/feed/" rel="self" type="application/rss+xml" />
	<link>http://woogie.net</link>
	<description>You know the best thing about the Internet? Neither do I but I&#039;m pretty sure it&#039;s not this.</description>
	<lastBuildDate>Wed, 07 Jul 2010 17:18:34 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Invoking a Task via XPRESS in Sun&#8217;s Identity Manager 7.1</title>
		<link>http://woogie.net/2008/07/08/invoking-a-task-via-xpress-in-suns-identity-manager-7-1/</link>
		<comments>http://woogie.net/2008/07/08/invoking-a-task-via-xpress-in-suns-identity-manager-7-1/#comments</comments>
		<pubDate>Tue, 08 Jul 2008 09:17:09 +0000</pubDate>
		<dc:creator>woogie</dc:creator>
				<category><![CDATA[Geek]]></category>

		<guid isPermaLink="false">http://woogie.net/wordpress/?p=58</guid>
		<description><![CDATA[Occasionally, I&#8217;ve wanted to invoke an Identity Manager Task from within a rule in XPRESS. Here is a rule that will do that: &#60;Rule&#160;name="runTask"&#62; &#160;&#160;&#160;&#160;&#60;RuleArgument&#160;name='taskName'/&#62; &#160;&#160;&#160;&#160;&#60;RuleArgument&#160;name='taskVariables'/&#62; &#160;&#160;&#160;&#160;&#60;RuleArgument&#160;name='execMode'/&#62; &#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#60;block&#62; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#60;defvar&#160;name='processView'&#62; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#60;new&#160;class='com.waveset.object.GenericObject'&#62; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#60;ref&#62;taskVariables&#60;/ref&#62; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#60;/new&#62; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#60;/defvar&#62; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#60;invoke&#160;name='setId'&#62; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#60;ref&#62;processView&#60;/ref&#62; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#60;s&#62;Process&#60;/s&#62; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#60;/invoke&#62; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#60;invoke&#160;name='put'&#62; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#60;ref&#62;processView&#60;/ref&#62; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#60;s&#62;task.process&#60;/s&#62; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#60;ref&#62;taskName&#60;/ref&#62; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#60;/invoke&#62; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#60;invoke&#160;name='put'&#62; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#60;ref&#62;processView&#60;/ref&#62; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#60;s&#62;task.taskName&#60;/s&#62; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#60;ref&#62;taskName&#60;/ref&#62; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#60;/invoke&#62; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#60;cond&#62; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#60;ref&#62;execMode&#60;/ref&#62; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#60;invoke&#160;name='put'&#62; [...]]]></description>
			<content:encoded><![CDATA[<p>Occasionally, I&#8217;ve wanted to invoke an Identity Manager Task from within a rule in XPRESS.  Here is a rule that will do that:</p>
<p><code>&lt;Rule&nbsp;name="runTask"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;RuleArgument&nbsp;name='taskName'/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;RuleArgument&nbsp;name='taskVariables'/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;RuleArgument&nbsp;name='execMode'/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;block&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;defvar&nbsp;name='processView'&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;new&nbsp;class='com.waveset.object.GenericObject'&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;ref&gt;taskVariables&lt;/ref&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/new&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/defvar&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;invoke&nbsp;name='setId'&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;ref&gt;processView&lt;/ref&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;s&gt;Process&lt;/s&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/invoke&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;invoke&nbsp;name='put'&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;ref&gt;processView&lt;/ref&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;s&gt;task.process&lt;/s&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;ref&gt;taskName&lt;/ref&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/invoke&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;invoke&nbsp;name='put'&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;ref&gt;processView&lt;/ref&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;s&gt;task.taskName&lt;/s&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;ref&gt;taskName&lt;/ref&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/invoke&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;cond&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;ref&gt;execMode&lt;/ref&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;invoke&nbsp;name='put'&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;ref&gt;processView&lt;/ref&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;s&gt;task.execMode&lt;/s&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;ref&gt;execMode&lt;/ref&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/invoke&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/cond&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;invoke&nbsp;name='checkinView'&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;rule&nbsp;name='getCallerSession'/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;ref&gt;processView&lt;/ref&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;null/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/invoke&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/block&gt;<br />
&lt;/Rule&gt;</code></p>
<p>And here is a sample invocation:</p>
<p><code>&lt;rule&nbsp;name='runTask'&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;argument&nbsp;name='taskName'&nbsp;value='myTask'/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;argument&nbsp;name='taskVariables'&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;map&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;s&gt;taskArgument1&lt;/s&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;ref&gt;myVariable&lt;/ref&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;s&gt;taskArgument2&lt;/s&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;s&gt;String&nbsp;Data&lt;/s&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/map&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/argument&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;argument&nbsp;name='execMode'&nbsp;value='async'/&gt;<br />
&lt;/rule&gt;</code></p>
<p>The value of execMode should be one of the following:</p>
<dl>
<dt><cite>sync</cite></dt>
<dd>Specifies synchronous or foreground execution</dd>
<dt><cite>async</cite></dt>
<dd>Specifies asynchronous or background execution</dd>
<dt><cite>asyncImmediate</cite></dt>
<dd>Specifies asynchronous with immediate thread launch</dd>
</dl>
]]></content:encoded>
			<wfw:commentRss>http://woogie.net/2008/07/08/invoking-a-task-via-xpress-in-suns-identity-manager-7-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>HTTP File Uploads with Sun&#8217;s Identity Manager 7.1</title>
		<link>http://woogie.net/2008/05/17/http-file-uploads-with-suns-identity-manager-7-1/</link>
		<comments>http://woogie.net/2008/05/17/http-file-uploads-with-suns-identity-manager-7-1/#comments</comments>
		<pubDate>Sat, 17 May 2008 08:20:42 +0000</pubDate>
		<dc:creator>woogie</dc:creator>
				<category><![CDATA[Geek]]></category>

		<guid isPermaLink="false">http://woogie.net/wordpress/?p=54</guid>
		<description><![CDATA[Identity Manager has a display class called FileUpload which you can use to do HTTP File Uploads. In a form, it would look something like this: &#60;Field&#160;name='fileUpload'&#62; &#160;&#160;&#160;&#160;&#60;Display class='FileUpload'&#62; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#60;Property&#160;name='Title'&#160;value='File&#160;to&#160;upload'/&#62; &#160;&#160;&#160;&#160;&#60;/Display&#62; &#60;/Field&#62; In the above example, the field fileUpload would be set to an object of type DataSource. I want to use the contents of [...]]]></description>
			<content:encoded><![CDATA[<p>Identity Manager has a display class called <cite>FileUpload</cite> which you can use to do HTTP File Uploads.  In a form, it would look something like this:</p>
<p><code>&lt;Field&nbsp;name='fileUpload'&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;Display class='FileUpload'&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;Property&nbsp;name='Title'&nbsp;value='File&nbsp;to&nbsp;upload'/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/Display&gt;<br />
&lt;/Field&gt;</code></p>
<p>In the above example, the field <cite>fileUpload</cite> would be set to an object of type <cite>DataSource</cite>.  I want to use the contents of the file as a string in my XPRESS rules, but how do I do that?</p>
<p>The most obvious thing to try would be to invoke the appropriate java directly from XPRESS.  Here is a rule that does that:</p>
<p><code>&lt;Rule&nbsp;name="getStringFromFileUpload"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;RuleArgument&nbsp;name='fileUpload'/&gt;<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;block&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;defvar&nbsp;name='bufferedReader'&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;new&nbsp;class='java.io.BufferedReader'&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;new&nbsp;class="java.io.InputStreamReader"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;invoke&nbsp;name='getInputStream'&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;ref&gt;fileUpload&lt;/ref&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/invoke&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/new&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/new&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/defvar&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;defvar&nbsp;name='fileContentAsString'/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;defvar&nbsp;name='nextLine'&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;invoke&nbsp;name='readLine'&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;ref&gt;bufferedReader&lt;/ref&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/invoke&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/defvar&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;while&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;notnull&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;ref&gt;nextLine&lt;/ref&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/notnull&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;block&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;setvar&nbsp;name='fileContentAsString'&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;concat&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;ref&gt;fileContentAsString&lt;/ref&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;ref&gt;nextLine&lt;/ref&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/concat&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/setvar&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;setvar&nbsp;name='nextLine'&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;invoke&nbsp;name='readLine'&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;ref&gt;bufferedReader&lt;/ref&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/invoke&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/setvar&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/block&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/while&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;ref&gt;fileContentAsString&lt;/ref&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/block&gt;<br />
&lt;/Rule&gt;</code></p>
<p>Unfortunately, when I attempt that, I get this:</p>
<blockquote><p>XPRESS  exception ==&gt; com.waveset.util.WavesetException: XPRESS  exception ==&gt; com.waveset.util.WavesetException: XPRESS  exception ==&gt; com.waveset.util.WavesetException: Couldn&#8217;t find method getInputStream() in class com.waveset.ui.util.BufferedRequest$AttachmentDataSource</p></blockquote>
<p>That&#8217;s odd, because there really is a method called <cite>getInputStream</cite> on <cite>AttachmentDataSource</cite>.  Ah well, so I seem to have hit a bug in XPRESS.  No bother, I&#8217;ll just try invoking the appropriate Java in Javascript.  Here is a rule that does that:</p>
<p><code>&lt;Rule&nbsp;name="getStringFromFileUpload"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;RuleArgument&nbsp;name='fileUpload'/&gt;<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;script&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;importPackage(Packages.javax.activation);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;importPackage(Packages.com.waveset.ui.util);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;importPackage(Packages.java.io);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;importPackage(Packages.java.lang);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;attachment&nbsp;=&nbsp;env.get('fileUpload');<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;fileContentsAsString&nbsp;=&nbsp;'';<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;bufferedReader&nbsp;=&nbsp;new&nbsp;BufferedReader(new&nbsp;InputStreamReader(attachment.getInputStream()));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;line&nbsp;=&nbsp;'';<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;((line&nbsp;=&nbsp;bufferedReader.readLine())&nbsp;!=&nbsp;null)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fileContentsAsString&nbsp;+=&nbsp;line&nbsp;+&nbsp;"\n";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;catch(err)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result&nbsp;=&nbsp;err.getMessage();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fileContentsAsString;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/script&gt;<br />
&lt;/Rule&gt;</code></p>
<p>Hmm, no dice that way, either:</p>
<blockquote><p>org.mozilla.javascript.EvaluatorException: Class org.mozilla.javascript.NativeJavaMethod can not access a member of class com.waveset.ui.util.BufferedRequest$AttachmentDataSource with modifiers &#8220;public&#8221;</p></blockquote>
<p>OK, so it seems that it&#8217;s not just XPRESS, but Javascript also has a problem invoking the method.  The only solution I could find is to write a custom bit of Java to do the actual work like this:</p>
<p><code>package&nbsp;net.woogie.idm.util;<br />
&nbsp;<br />
import&nbsp;java.io.*;<br />
import&nbsp;javax.activation.*;<br />
import&nbsp;com.waveset.ui.util.*;<br />
&nbsp;<br />
public&nbsp;class&nbsp;Attachment&nbsp;{<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;Attachment()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;String&nbsp;toString(DataSource&nbsp;attachment)&nbsp;throws&nbsp;IOException&nbsp;{<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;fileContentsAsString&nbsp;=&nbsp;"";<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InputStream&nbsp;inputStream&nbsp;=&nbsp;attachment.getInputStream();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InputStreamReader&nbsp;inputStreamReader&nbsp;=&nbsp;new&nbsp;InputStreamReader(inputStream);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BufferedReader&nbsp;bufferedReader&nbsp;=&nbsp;new&nbsp;BufferedReader(inputStreamReader);<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;line;<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;((line&nbsp;=&nbsp;bufferedReader.readLine())&nbsp;!=&nbsp;null)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fileContentsAsString&nbsp;+=&nbsp;line&nbsp;+&nbsp;"\n";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(IOException&nbsp;ex)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ex.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;fileContentsAsString;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</code></p>
<p>And to invoke it via XPRESS like this:</p>
<p><code>&lt;Rule&nbsp;name="getStringFromFileUpload"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;RuleArgument&nbsp;name='fileUpload'/&gt;<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;invoke&nbsp;name='toString'&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;new&nbsp;class='net.woogie.idm.util.Attachment'/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;ref&gt;fileUpload&lt;/ref&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/invoke&gt;<br />
&lt;/Rule&gt;</code></p>
<p>This works, but it sort of bums me out because it would be nice to have an XML only solution to this.</p>
]]></content:encoded>
			<wfw:commentRss>http://woogie.net/2008/05/17/http-file-uploads-with-suns-identity-manager-7-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Parsing XML in XPRESS Rules Within Sun&#8217;s Identity Manager</title>
		<link>http://woogie.net/2008/05/04/parsing-xml-in-xpress-rules-within-suns-identity-manager/</link>
		<comments>http://woogie.net/2008/05/04/parsing-xml-in-xpress-rules-within-suns-identity-manager/#comments</comments>
		<pubDate>Sun, 04 May 2008 14:39:35 +0000</pubDate>
		<dc:creator>woogie</dc:creator>
				<category><![CDATA[Geek]]></category>

		<guid isPermaLink="false">http://woogie.net/wordpress/?p=47</guid>
		<description><![CDATA[I&#8217;ve been doing a lot of work with Sun&#8217;s Identity Manager lately, and have some things that might be of interest to other&#8217;s so I&#8217;ll try to post them here as time permits. I think the coolest thing I&#8217;ve done so far is to build a library for parsing XML within XPRESS. It&#8217;s actually fairly [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been doing a lot of work with <a href="http://www.sun.com/software/products/identity_mgr/index.jsp">Sun&#8217;s Identity Manager</a> lately, and have some things that might be of interest to other&#8217;s so I&#8217;ll try to post them here as time permits.</p>
<p>I think the coolest thing I&#8217;ve done so far is to build a library for parsing XML within XPRESS.  It&#8217;s actually fairly straightforward, but it took me long enough to get right that it seems like a good thing to share.  I have 2 XPRESS rules:</p>
<dl>
<dt>transformXML</dt>
<dd>Takes 2 strings, xml and xsl, as input, and returns the transformed data.</dd>
<dt>validateXML</dt>
<dd>Takes 2 strings, xml and xsd, as input, and returns 1 true if the XML validates against the XSD, and returns false otherwise.</dd>
</dl>
<p>Both rules invoke Java to do the actual work, but for reasons I&#8217;ll explain later, validateXML is a bit more complex than transformXML.  The XML transformation is simply a matter of figuring out the proper incantation to invoke:</p>
<p><code>&lt;Rule name='transformXML'&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;RuleArgument name='xml'/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;RuleArgument name='xsl'/&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&lt;block&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;defvar name="StringWriter"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;new class="java.io.StringWriter"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/defvar&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;invoke name="transform"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;invoke name="newTransformer"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;invoke name="newInstance" class="javax.xml.transform.TransformerFactory"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;new class="javax.xml.transform.stream.StreamSource"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;new class="java.io.StringReader"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;ref&gt;xsl&lt;/ref&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/new&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/new&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/invoke&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;new class="javax.xml.transform.stream.StreamSource"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;new class="java.io.StringReader"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;ref&gt;xml&lt;/ref&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/new&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/new&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;new class="javax.xml.transform.stream.StreamResult"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;ref&gt;StringWriter&lt;/ref&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/new&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/invoke&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;invoke name="toString"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;ref&gt;StringWriter&lt;/ref&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/invoke&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/block&gt;<br />
&lt;/Rule&gt;</code></p>
<p>That looks fairly complicated, but it is pretty much a straight translation from the Java to XPRESS invocations.  Unfortunately, XML validation isn&#8217;t quite as straightforward.  If there is a way to do it without exception handling, which is not available in XPRESS, I don&#8217;t know what that way is.  So, the direct invocations similar to the code above will not work.</p>
<p>It would be possible to write a bit of simple Java code to wrap the exception handling in a nice set of return codes, deploy that code with the IDM deployment and then invoke that from XPRESS, but I was really hoping to avoid custom Java if possible.  In this case, JavaScript comes to the rescue (man, I never thought I would say that):</p>
<p><code>&lt;Rule name='validateXML'&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;RuleArgument name='xsd'/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;RuleArgument name='xml'/&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&lt;cond&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;and&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;notnull&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;ref&gt;xsd&lt;/ref&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/notnull&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;notnull&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;ref&gt;xml&lt;/ref&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/notnull&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/and&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;script&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;importPackage(Packages.javax.xml.validation);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;importPackage(Packages.java.io);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;importPackage(Packages.javax.xml.transform.stream);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var xsd = env.get('xsd');<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var xml = env.get('xml');</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var schemaFactory = SchemaFactory.newInstance('http://www.w3.org/2001/XMLSchema');<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var schema = schemaFactory.newSchema(new StreamSource(new StringReader(xsd)));</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var validator = schema.newValidator();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var result = 'true';</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;validator.validate(new StreamSource(new StringReader(xml)));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;catch(err) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result = 'false';<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/script&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;s&gt;false&lt;/s&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/cond&gt;<br />
&lt;/Rule&gt;</code></p>
<p>I&#8217;ve attached a rule library containing both these rules that you should be able to import and use in your project.</p>
<p>Have Fun.</p>
<p><a href='http://woogie.net/wordpress/wp-content/uploads/2008/05/Configuration-xmlRuleLibrary.xml_.zip'>Configuration-xmlRuleLibrary.xml</a></p>
]]></content:encoded>
			<wfw:commentRss>http://woogie.net/2008/05/04/parsing-xml-in-xpress-rules-within-suns-identity-manager/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>linksysmon Is Dead, Long Live linksysmon</title>
		<link>http://woogie.net/2006/07/12/linksysmon-is-dead-long-live-linksysmon/</link>
		<comments>http://woogie.net/2006/07/12/linksysmon-is-dead-long-live-linksysmon/#comments</comments>
		<pubDate>Wed, 12 Jul 2006 06:14:59 +0000</pubDate>
		<dc:creator>woogie</dc:creator>
				<category><![CDATA[Geek]]></category>

		<guid isPermaLink="false">http://woogie.net/wordpress/?p=60</guid>
		<description><![CDATA[Well, it looks like there might still be some interest in linksysmon, so I&#8217;ve put a link to the final tar file here. linksysmon-1.1.4.tar.gz]]></description>
			<content:encoded><![CDATA[<p>Well, it looks like there might still be some interest in linksysmon, so I&#8217;ve put a link to the final tar file here.</p>
<p><a href='http://woogie.net/wordpress/wp-content/uploads/2010/01/linksysmon-1.1.4.tar.gz'>linksysmon-1.1.4.tar.gz</a></p>
]]></content:encoded>
			<wfw:commentRss>http://woogie.net/2006/07/12/linksysmon-is-dead-long-live-linksysmon/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>linksysmon Is Dead, Long Live openwrt</title>
		<link>http://woogie.net/2006/07/02/linksysmon-is-dead-long-live-openwrt/</link>
		<comments>http://woogie.net/2006/07/02/linksysmon-is-dead-long-live-openwrt/#comments</comments>
		<pubDate>Sun, 02 Jul 2006 13:58:14 +0000</pubDate>
		<dc:creator>woogie</dc:creator>
				<category><![CDATA[Geek]]></category>

		<guid isPermaLink="false">http://woogie.net/wordpress/?p=63</guid>
		<description><![CDATA[With the update of the new site, I&#8217;m dropping support for linksysmon all together. A cursory glance at the logs finds no downloads from anything but the search engines, and I&#8217;ve upgraded my router hardware to a Linksys WRT54GL, so I don&#8217;t even use it anymore. Instead, I use openwrt.]]></description>
			<content:encoded><![CDATA[<p>With the update of the new site, I&#8217;m dropping support for linksysmon all together. A cursory glance at the logs finds no downloads from anything but the search engines, and I&#8217;ve upgraded my router hardware to a Linksys WRT54GL, so I don&#8217;t even use it anymore. Instead, I use <a href="http://openwrt.org/">openwrt</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://woogie.net/2006/07/02/linksysmon-is-dead-long-live-openwrt/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
