Looks very similar to what I proposed back when we had this stuff in DeltaSpike. +1, I like it.<br><br><div class="gmail_quote">On Mon, Oct 29, 2012 at 2:38 AM, Shane Bryzak <span dir="ltr">&lt;<a href="mailto:sbryzak@redhat.com" target="_blank">sbryzak@redhat.com</a>&gt;</span> wrote:<br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">I&#39;ve started reviewing the IdentityManager interface to see where we can<br>
improve the API.  The first area I&#39;d like to visit is the Query API, of<br>
which I&#39;ve come to the conclusion that we need to do some serious<br>
redesign - the current API is non-intuitive, too verbose and not future<br>
proof.<br>
<br>
What I&#39;d like to do is throw it all out and start again, replacing it<br>
with a new cleaner API that looks something like this:<br>
<br>
public interface IdentityManager {<br>
     // &lt;snip other methods&gt;<br>
<br>
     &lt;T extends IdentityType&gt; IdentityQuery&lt;T&gt; createQuery();<br>
}<br>
<br>
public interface IdentityQuery&lt;T extends IdentityType&gt; {<br>
     public enum Param {id, key, created, expired, enabled, firstName,<br>
lastName, email, name, parent, memberOf};<br>
<br>
     public enum Operator { equals, notEquals, greaterThan, lessThan };<br>
<br>
     IdentityQuery&lt;T&gt; reset();<br>
<br>
     IdentityQuery&lt;T&gt; setParameter(Param param, Object value);<br>
<br>
     IdentityQuery&lt;T&gt; setParameter(Param param, Operator operator,<br>
Object value);<br>
<br>
     IdentityQuery&lt;T&gt; setAttributeParameter(String attributeName, Object<br>
value);<br>
<br>
     IdentityQuery&lt;T&gt; setAttributeParameter(String attributeName,<br>
Operator operator, Object value);<br>
<br>
     IdentityQuery&lt;T&gt; setRange(Range range);<br>
<br>
     List&lt;T&gt; getResultList();<br>
}<br>
<br>
This unified API basically replaces the 4 separate existing interfaces<br>
we currently have; UserQuery, RoleQuery, GroupQuery and<br>
MembershipQuery.  I&#39;ve put together a few usage scenarios to show how it<br>
might work:<br>
<br>
1) Find users with first name &#39;John&#39;:<br>
<br>
List&lt;User&gt; users = identityManager.&lt;User&gt;createQuery()<br>
     .setParameter(Param.firstName, &quot;John&quot;)<br>
     .getResultList();<br>
<br>
2) Find all expired users:<br>
<br>
List&lt;User&gt; users = identityManager.&lt;User&gt;createQuery()<br>
     .setParameter(Param.expired, Operator.lessThan, new Date())<br>
     .getResultList();<br>
<br>
3) Find all users that are a member of the &quot;Superuser&quot; group<br>
<br>
List&lt;User&gt; users = identityManager.&lt;User&gt;createQuery()<br>
     .setParameter(Param.memberOf, identityManager.getGroup(&quot;Superuser&quot;))<br>
     .getResultList();<br>
<br>
4) Find all sub-groups of the &quot;Employees&quot; group:<br>
<br>
List&lt;Group&gt; groups = identityManager.&lt;Group&gt;createQuery()<br>
     .setParameter(Param.memberOf, identityManager.getGroup(&quot;Employees&quot;))<br>
     .getResultList();<br>
<br>
5) Find all disabled roles:<br>
<br>
List&lt;Role&gt; roles = identityManager.&lt;Role&gt;createQuery()<br>
     .setParameter(Param.enabled, false)<br>
     .getResultList();<br>
<br>
6) Find all Users, Groups and Roles that have been granted the &quot;Payroll<br>
Officer&quot; role in the &quot;Human Resources&quot; group:<br>
<br>
List&lt;IdentityType&gt; identities = identityManager.&lt;IdentityType&gt;createQuery()<br>
     .setParameter(Param.memberOf, identityManager.getGroup(&quot;Human<br>
Resources&quot;))<br>
     .setParameter(Param.memberOf, identityManager.getRole(&quot;Payroll<br>
Officer&quot;))<br>
     .getResultList();<br>
<br>
7) Find all Users that have an attribute named &quot;Citizenship&quot; with a<br>
value of &quot;Greenland&quot;:<br>
<br>
List&lt;User&gt; users = identityManager.&lt;User&gt;createQuery()<br>
     .setAttributeParameter(&quot;Citizenship&quot;, &quot;Greenland&quot;)<br>
     .getResultList();<br>
<br>
I&#39;m *pretty* certain that this API is at least as capable as what we<br>
currently have, if not more so, and IMHO provides a far simpler and more<br>
versatile design (being able to select different IdentityTypes in a<br>
single query I think is a big plus).  I&#39;d love to hear any feedback on<br>
whether you like it, hate it or can think of any improvements to the<br>
design to make it better for our developers. Also, please think<br>
especially about additional usage scenarios and whether or not there are<br>
any particular use cases which might be problematic for this API.<br>
<br>
<br>
Thanks!<br>
Shane<br>
_______________________________________________<br>
security-dev mailing list<br>
<a href="mailto:security-dev@lists.jboss.org">security-dev@lists.jboss.org</a><br>
<a href="https://lists.jboss.org/mailman/listinfo/security-dev" target="_blank">https://lists.jboss.org/mailman/listinfo/security-dev</a><br>
</blockquote></div><br><br clear="all"><div><br></div>-- <br>Jason Porter<br><a href="http://lightguard-jp.blogspot.com" target="_blank">http://lightguard-jp.blogspot.com</a><br><a href="http://twitter.com/lightguardjp" target="_blank">http://twitter.com/lightguardjp</a><br>

<br>Software Engineer<br>Open Source Advocate<br><br>PGP key id: 926CCFF5<br>PGP key available at: <a href="http://keyserver.net" target="_blank">keyserver.net</a>, <a href="http://pgp.mit.edu" target="_blank">pgp.mit.edu</a><br>