You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@openaz.apache.org by pd...@apache.org on 2015/04/13 17:38:48 UTC

[48/51] [partial] incubator-openaz git commit: Initial seed of merged of AT&T and JP Morgan code

http://git-wip-us.apache.org/repos/asf/incubator-openaz/blob/94fcdd90/openaz-pep/src/main/java/org/openliberty/openaz/pepapi/std/package.html
----------------------------------------------------------------------
diff --git a/openaz-pep/src/main/java/org/openliberty/openaz/pepapi/std/package.html b/openaz-pep/src/main/java/org/openliberty/openaz/pepapi/std/package.html
new file mode 100755
index 0000000..a9013f8
--- /dev/null
+++ b/openaz-pep/src/main/java/org/openliberty/openaz/pepapi/std/package.html
@@ -0,0 +1,1058 @@
+<html>
+<body>
+This package is the 
+<a href="http://openaz.svn.sourceforge.net/viewvc/openaz/test/doc/org/openliberty/openaz/pep/package-summary.html"
+>OpenAz reference "implementation"</a>
+of the OpenAz 
+<a href="http://openaz.svn.sourceforge.net/viewvc/openaz/test/doc/org/openliberty/openaz/azapi/pep/package-summary.html"
+>"PepApi interface package"</a>,
+and therefore generally contains implementation classes
+and only implementation-specific interfaces, also included is a
+<a href="#tutorial">PepApi tutorial</a> that describes the approach
+to building a PepApi implementation for a specific authorization
+provider, as well as a 2nd <a href="#tutorialmappers">Mapper tutorial</a>
+that describes the overall approach to writing mappers.
+<p>
+The goal of this package is twofold:
+<ul>
+<li>The primary goal is to provide a reference implementation of PepApi
+that uses an AzApi-based authorization provider, which in this case is the
+<a href="http://openaz.svn.sourceforge.net/viewvc/openaz/test/doc/org/openliberty/openaz/pdp/provider/SimpleConcreteSunXacmlService.html"
+>SimpleConcreteSunXacmlService</a>, 
+which is the SunXacml PDP wrapped in an
+<a href="http://openaz.svn.sourceforge.net/viewvc/openaz/test/doc/org/openliberty/openaz/pdp/package-summary.html"
+>implementation of the AzApi interface</a>.
+<li>The secondary goal is to provide a reference framework, which other
+providers can use as a model for implementation strategy of both AzApi
+and non-AzApi based authorization providers.
+</ul>
+
+In order to support the 2nd objective, the following is a high level
+"tutorial" about the PepApi and this implementation of it. At present,
+this tutorial is in preliminary form, however, even in the current
+state, the information may prove useful to anyone who is interested in
+developing an implementation of PepApi.
+
+<a name="tutorial"><H2>OpenAz PepApi Implementation Tutorial (v113)</H2></a>
+<H3>Contents</H3>
+<ul>
+<li><a href="#highleveloverview">High Level Overview</a>
+<li><a href="#sixlayerlist">List of Six OpenAz Layers</a>
+<li><a href="#separationapispi">Separation of PepApi to application API 
+and provider SPI</a>
+<li><a href="#highlevelsepapispi">High Level Overview API/SPI Separation</a>
+<li><a href="#detailsepapispi">Detail list of API/SPI separated methods</a>
+<li><a href="#pepapilayer">Appl client PepApi "API LAYER"</a>
+<li><a href="#suggestedspiapproaches">Suggested approaches for XyzApi provider SPI implementation</a>
+<li><a href="#pepapiseqmodel">PepApi Object Sequence Model</a>
+<li><a href="#somediscussion">Some discussion items</a>
+<ul>
+<li><a href="#basicpattern">Basic Processing Pattern</a>
+<li><a href="#highlowinterfacHigh Level and Low Level Interface Layers</a>
+<li><a href="#basicpurpose">Basic Purpose of PepApi</a>
+<li><a href="#standardpdps">Standard PDPs</a>
+<li><a href="#xacmlreps">Representations of XACML</a>
+<li><a href="#openazreleases">OpenAz Release Philosophy</a>
+<li><a href="#thesixlayersdisc">The Six Layers</a>
+<li><a href="#layer5disc">Layer 5: AzApi Impl</a>
+<li><a href="#azapivssunxacml">AzApi vs SunXacml</a>
+<li><a href="#canonicalform">Canonical Form</a>
+</ul>
+<li><a href="#tutorialmappers">Part II: Mappers Tutorial</a>
+</ul>
+
+<a name="highleveloverview">
+<H3>High Level Overview: Appl, PepApi, AzApi, AzProvider</H3></a>
+<p>
+To understand the "top level" picture of what is currently provided
+for implementations in the OpenAz project, we can identify six layers
+of operational modules (including "interfaces" as a layer). Each layer
+description starts with the identifier of a jar file in the OpenAz project
+that contains an implementation of the functionality described in the layer.
+<p>
+In addition, experience with OpenAz has shown, the PepApi is best represented
+as having 2 portions: an application-oriented API, and a provider-oriented SPI,
+which will be noted in the following list and explained further below.
+<p>
+The PepApi provider is primarily concerned with implementing Layer 3 in the
+list below. The other layers are generally provided either from the OpenAz site
+(layers 2,4 for interfaces, layer 1 for test code, layers 5,6 for sample
+AzApi impl and PDP), or from customer application environments (layer 1,
+when customer is ready to implement PepApi client), or from PDP vendors
+(layers 5 and 6). 
+<p>
+<a name="sixlayerlist"><H4>List of the Six OpenAz Module Layers</H4></a>
+<ul>
+<li><b>Layer 1:</b> 
+"<top-of-project>\openaz\test\build\openliberty-openaz-test.jar"
+<br>
+This layer is implemented by a package that contains sample test programs,
+and may be thought of as the "application layer", and generally only
+uses the "API" portion of PepApi. 
+For example, test.TestStyles, demonstrates various usage scenarios
+of PepApi. 
+ 
+<li><b>Layer 2:</b> "<top-of-project>
+"<top-of-project>\openaz\azapi\build\openliberty-openaz-azapi.jar"
+<br>
+This layer is implemented by a package that contains the actual 
+"PepApi interfaces" (API and SPI), and may be considered to be the second layer 
+of "modules", which, while not having any executable code, do control 
+what code can be compiled that is purported to "implement" the interface.
+(Note: Even though the jar file contains "azapi" in the name, 
+it also contains the "pepapi".)
+
+<li><b>Layer 3:</b>  
+"<top-of-project>\openaz\pep\build\openliberty-openaz-pep.jar"
+<br>
+This package contains an example implementation of the PepApi,
+and may be considered to be the "third layer" of OpenAz. 
+It also contains an implementation of an "AzApi client", i.e. a
+module that uses AzApi directly to make authorization decisions.
+As such, this layer may be considered to both implement a PepApi
+provider, as well as, in this case, an AzApi client, or in the more
+general, case a client to any request-response oriented 
+authorization provider.
+<br>
+In addition, this layer generally uses its own implementation of
+the SPI portion of PepApi, which facilitates its implementation 
+of the API portion.
+ 
+<li><b>Layer 4:</b> 
+"<top-of-project>\openaz\azapi\build\openliberty-openaz-azapi.jar"
+<br>
+This package contains the actual "interfaces" that comprise the AzApi, 
+and, in the same sense as the layer 2 PepApi above, may be considered
+to be a layer of modules that control compatibility with other
+modules, esp in layer 5. (Note: this is the same jar file as used
+by layer 2, i.e. it contains both sets of interfaces.)
+ 
+<li><b>Layer 5:</b> 
+"<top-of-project>\openaz\pdp\build\openliberty-openaz-pdp.jar"
+<br>
+This package contains an example implementation of AzApi, and may be 
+considered to be the "fifth layer" of OpenAz. Similarly to Layer 3,
+this package also contains a client implementation, where the client
+in this case is to the SunXacml PDP provider.
+ 
+<li><b>Layer 6:</b> 
+"<top-of-project>/pdp/lib/sunxacml.jar" 
+<br>
+This jar file contains the SunXacml PDP impl, which may be considered 
+as the sixth layer of modules in OpenAz.
+</ul>
+
+
+<a name="separationapispi">
+<H3>Separation of PepApi into API and SPI parts.</H3></a>
+This section first describes the approach at a high level, then
+provides a detailed review of the complete PepApi interface to
+designate the API and SPI parts of each PepApi interface.
+
+<a name="highlevelsepapispi">
+<H4>High level view of API/SPI separation</H4></a>
+The first thing that is probably useful to recognize is that the PepApi
+really consists of an application facing API plus an implementer's SPI
+(Service Provider Interface).
+If there is sufficient demand for a more formal separation, that will be
+considered in the future.
+<p>
+The following is a high level view of the API/SPI separation:
+<pre>
+      Consider the following functionality as being the main
+      part of each portion of the PepApi:
+
+      APPL API LAYER:
+
+	Use newPepRequest methods to build request
+	Use decide() method to make decision
+	Use allowed and next methods to look at results
+	Use getObligations, getObligationId, getStringValues to
+	     look at obligations within each result
+
+      PROVIDER SPI LAYER:
+
+	Take Appl Api Request and 
+	  submit as Authorization Provider Request
+
+	Take Authorization Provider Response objects and 
+	  process and return them as Appl Api Response objects
+
+
+      Summary of architecture:
+
+	Appl Client Impl
+	  PepApi Appl Client API 
+	  PepApi Provider SPI 
+	PepApi Provider Impl
+	  &lt;AzProvider&gt;API  {AzProvider = Az | Xyz}
+	&lt;AzProvider&gt; Impl
+
+
+	Current AzApi strategy:
+
+	        +--------------------+
+	        | Appl client (impl) |          <b><i>Layer 1</i></b>
+	        +--------------------+
+	              |       ^
+	              v       |
+	+-----------------------------------+
+	|   PepApi appl client api (intf)   |   <b><i>Layer 2</i></b>
+	| - - - - - - - - - - - - - - - - - |
+	|  PepApi provider api/spi (impl)   |   <b><i>Layer 3</i></b>
+	|   includes use of PepApi spi      |	
+	|         plus AzApi Client         |
+	+-----------------------------------+
+	           |             ^
+	           v             |
+	+-----------------------------------+
+	|      AzApi client api (intf)      |   <b><i>Layer 4</i></b>
+	| - - - - - - - - - - - - - - - - - |
+	|        AzApi provider (impl)      |   <b><i>Layer 5</i></b>
+	|        plus SunXacml client       |
+	+-----------------------------------+
+	           |             ^
+	           v             |
+	   +----------------------------+
+	   |  SunXacml provider (impl)  |       <b><i>Layer 6</i></b>
+	   +----------------------------+
+
+
+
+	Suggested strategy for an Xyz provider:
+
+	        +--------------------+
+	        | Appl client (impl) |          <b><i>Layer 1</i></b>
+	        +--------------------+
+	              |       ^
+	              v       |
+	+-----------------------------------+
+	|   PepApi appl client api (intf)   |   <b><i>Layer 2</i></b>
+	| - - - - - - - - - - - - - - - - - |
+	|  PepApi provider api/spi (impl)   |   <b><i>Layer 3</i></b>
+	| includes use of custom PepApi spi |	
+	|        plus XyzApi Client         |
+	+-----------------------------------+
+	           |             ^
+	           v             |
+	+-----------------------------------+
+	|     <i>XyzApi client api</i> (intf)      |   <b><i>Layer 4</i></b>
+	| - - - - - - - - - - - - - - - - - |
+	|       XyzApi provider (impl)      |   <b><i>Layers 5,6</i></b>
+	+-----------------------------------+
+
+
+</pre>
+Note: because in the XyzApi provider case, the "standard" api is effectively
+the XyzApi, itself, there is no need for the impl to act as a client to a
+different interface, and so layers 5 and 6 are effectively consolidated to
+a single logical layer.
+
+<a name="detailsepapispi">
+<H4>Detail list of API/SPI separated methods</H4></a>
+The following list of interfaces and methods describe the API/SPI
+separation. 
+<p>Note 
+<ul>
+<li>There are only a few interfaces and methods involved with
+the application-facing API, namely: 
+<ul>
+<li>PepRequestFactory
+<li>PepRequest
+<li>PepResponse
+<li>Obligation
+</ul>
+<li>All the PepApi interfaces are used and/or include methods that appear
+in the SPI portion.
+<li>Methods marked with "**" have AzApi-specific items in the interface
+that need to be addressed by non-AzApi implementations. In most cases,
+simply making the item null will satisfactorily address the situation for
+a non-AzApi implementation, however, it is likely that a corresponding
+element of the implementation will need to be used instead to fulfill
+the functional capability. For example, a non-AzApi impl will have no
+use for an AzRequestContext, however, it will likely have its own
+RequestContext that will need to be considered as an alternative which
+can be included in an extension class that has an additional provider-specific
+method.
+Note: items marked with "**" are followed by comment at end of line
+with number referring to the suggested approaches for these issues
+described at the end of the SPI detail section.
+</ul>
+
+<pre>
+   -------------------------------------------------------------------
+</pre>
+<a name="pepapilayer"><H4>   APPL CLIENT PepApi "API LAYER":</H4></a>
+<pre>
+<a name="apipepreqfact"><H5>Interface PepRequestFactory</H5></a>
+ 	PepRequest newPepRequest(
+		Object subjectObj, Object actionObj, 
+		Object resourceObj, Object environmentObj) 
+ 	PepRequest newPepRequest(
+		Object subjectObj, Object actionResourceObject,
+		Object environmentObj) 
+ 	PepRequest newPepRequest(
+		String subjectName, String actionId, 
+		String resourceId) 
+
+ 	PepRequest newBulkPepRequest(
+		Object subjectObj, List actionObjects, 
+		List resourceObjects, Object environmentObj) 
+ 	PepRequest newBulkPepRequest(
+		Object subjectObj, List actionResourceObjects, 
+		Object environmentObj) 
+
+ 	PepRequest newQueryPepRequest(
+		Object subjectObj, Object environmentObj, 
+		String scope, PepRequestQueryType queryType) 
+
+<a name="apipepreq"><H5>Interface PepRequest</H5></a>
+ 	PepResponse decide() 
+
+<a name="apipeprsp"><H5>Interface PepResponse</H5></a>
+	boolean allowed() 
+	Object getAction()
+	Object getResource()
+	Map&lt;String,Obligation&gt; getObligations() 
+	boolean next()
+
+<a name="apiobligation"><H5>Interface Obligation</H5></a>
+	String getObligationId() 
+	Map&lt;String,String&gt; getStringValues() 
+
+   -------------------------------------------------------------------
+</pre>
+<a name="pepspilayer"><H4>  PROVIDER PepApi "SPI LAYER":</H4></a>
+<pre>
+<a name="spipepreqfact"><H5>Interface PepRequestFactory</H5></a>
+   ** 	AzService getAzService() 	       // (#1) return null for non-AzApi
+
+	String getContainerName() 
+	String getProviderClassName() 
+
+	RequestAttributesFactory&lt;T&gt; getRequestAttributesFactory(T t)
+		&lt;T extends Enum&lt;T&gt; & AzCategoryId&gt;  
+	PepResponseFactory getResponseFactory() 
+ 
+ 	DecisionHandler getDecisionHandler() 
+	List&lt;PostDecisionHandler&gt; getPostDecisionHandlers() 
+	List&lt;PreDecisionHandler&gt; getPreDecisionHandlers() 
+
+<a name="spipepreq"><H5>Interface PepRequest</H5></a>
+   ** 	AzRequestContext getAzRequestContext()	// return null for non-AzApi
+
+	PepRequestFactory getPepRequestFactory() 
+
+	void setAccessSubject(Object subjectObject) 
+	void setResourceAction(Object resource, Object action) 
+	void setEnvironment(Object envObject) 
+	void setBulkResourceActions(List resourceObjects, List actionObjects) 
+
+ 	PepRequestOperation getOperation() 
+   ** 	Object getActionObject(AzResourceActionAssociation azRaa) 	// (#3)
+   **	Object getResourceObject(AzResourceActionAssociation azRaa) // (#3)
+
+ 	void setScope(String scope) 
+	String getScope() 
+
+ 	void setQueryReturnAllowed(boolean queryReturnAllowed) 
+ 	boolean isQueryForAllowedResults() 
+
+<a name="spijavaobjmap"><H5>Interface JavaObjectMapper:</H5></a>
+	Set&lt;Class&gt; getSupportedClasses() 
+
+	boolean canMapObject(Object obj) 
+
+	&lt;T extends Enum&lt;T&gt; & AzCategoryId&gt; 
+	RequestAttributes&lt;T&gt; map(
+		Object javaObject, 
+		RequestAttributes&lt;T&gt; azWrapperObject) 
+
+<a name="spireqattrfact">
+<H5>Interface RequestAttributesFactory&lt;T extends Enum&lt;T&gt; & AzCategoryId&gt;</H5></a>
+	RequestAttributes&lt;T&gt; createObject(PepRequest ctx) 
+ 	void setMappers(List&lt;JavaObjectMapper&gt; mappers) 
+	List&lt;JavaObjectMapper&gt; getMappers() 
+	Set&lt;Class&gt; getSupportedClasses() 
+ 
+<a name="spiattr">
+<H5>Interface Attributes&lt;T extends Enum&lt;T&gt; & AzCategoryId&gt;</H5></a>
+   **	AzEntity&lt;T&gt; getAzEntity()  // (#1) return null for non-AzApi
+
+<a name="spireqattr">
+<H5>Interface RequestAttributes&lt;T extends Enum&lt;T&gt; & AzCategoryId&gt;
+		extends Attributes&lt;T&gt;</H5></a>
+ 	PepRequest getPepRequest() 
+
+ 	void setAttribute(String name, Boolean value) 
+ 	void setAttribute(String name, Date date) 
+ 	void setAttribute(String name, Integer value) 
+ 	void setAttribute(String name, String value) 
+
+<a name="spidechnd"><H5>Interface DecisionHandler</H5></a>
+ 	PepResponse decide(PepRequest request) 
+<a name="spipredechnd"><H5>Interface PreDecisionHandler</H5></a>
+	void preDecide(PepRequest request)
+<a name="spipostdechnd"><H5>Interface PostDecisionHandler</H5></a>
+ 	void postDecide(PepRequest request, PepResponse response) 
+
+<a name="spipepreqrspfact"><H5>Interface PepResponseFactory:</H5></a>
+   **	PepResponse createPepResponse(
+		AzResponseContext responseContext, 	// (#1) pass null for non-AzApi
+		PepRequest pepRequest, 
+		PepRequestOperation operation) 
+
+   **	PepResponse createPepResponse(
+		Set&lt;AzResourceActionAssociation&gt; actionResourceAssociations, // (#3) 
+		PepRequest pepRequest, 
+		boolean queryAllowed) 
+ 
+ 	ObligationFactory   getObligationFactory() 
+
+	PepResponseBehavior getMissingAttributeBehavior() 
+	PepResponseBehavior getNotApplicableBehavior() 
+ 	PepResponseBehavior getProcessingErrorBehavior() 
+ 	PepResponseBehavior getSyntaxErrorBehavior() 
+
+ 	void setMissingAttributeBehavior(
+		PepResponseBehavior missingAttributeBehavior) 
+ 	void setNotApplicableBehavior(   
+		PepResponseBehavior notApplicableBehavior) 
+ 	void setProcessingErrorBehavior( 
+		PepResponseBehavior processingErrorBehavior) 
+ 	void setSyntaxErrorBehavior(     
+		PepResponseBehavior syntaxErrorBehavior)  
+
+<a name="spipeprsp"><H5>Interface PepResponse</H5></a>
+   **	AzResponseContext getAzResponseContext()  // (#1) return null for non-AzApi
+
+<a name="spioblfact"><H5>Interface ObligationFactory</H5></a>
+   **	Obligation createObject(AzEntity&lt;AzCategoryIdObligation&gt; entity) // (#2) pass null for non-AzApi 
+
+<a name="spiobl"><H5>Interface Obligation
+		extends ResponseAttributes&lt;AzCategoryIdObligation&gt;</H5></a>
+
+<a name="spirspattrfact">
+<H5>Interface ResponseAttributesFactory&lt;T extends Enum&lt;T&gt; & AzCategoryId&gt;</H5></a>
+   **	ResponseAttributes&lt;T&gt; createObject(AzEntity&lt;T&gt; entity) // (#2) pass null for non-AzApi
+
+<a name="spirspattr">
+<H5>Interface ResponseAttributes&lt;T extends Enum&lt;T&gt; & AzCategoryId&gt;
+		extends Attributes&lt;T&gt;</H5></a>
+
+   -------------------------------------------------------------------
+</pre>
+<a name="suggestedspiapproaches">
+<H4>Suggested approaches for XyzApi provider SPI implementation</H4></a>
+<pre>
+Note: these suggestions presume the Xyz provider is following the
+code structure in the org.openliberty.openaz.pep impl package
+and that the approach is to substitute Xyz request and response objects,
+and Xyz entity attribute collections for those provided by AzApi.
+The basic idea would be to have a parallel impl, for example: 
+org.openliberty.openaz.xyz, with basically the same set of classes,
+but with some of the following modifications considered.
+
+	1. return null for getAz&lt;object&gt;() in:
+		PepRequestFactory.getAzService()
+		PepRequest.getAzRequestContext()
+		Attributes&lt;T&gt;.getAzEntity()
+		PepResponse.getAzResponseContext()
+
+	2. Pass null for az&lt;object&gt; parameter in:
+		PepResponseFactory.createPepResponse(azResponseContext, ...)
+		ResponseAttributesFactory.createObject(azEntity)
+		ObligationFactory.createObject(azEntity)
+
+	3. Consider extending AzResourceActionAssociation as
+	   XyzResourceActionAssociation and use in the following:
+
+		PepRequest.getActionObject(AzResourceActionAssociation azRaa) 
+		PepRequest.getResourceObject(AzResourceActionAssociation azRaa) 
+
+		PepResponseFactory.createPepResponse(
+			Set&lt;AzResourceActionAssociation&gt; azRaas, 
+			PepRequest pepRequest, 
+			boolean queryAllowed) 
+
+	   AzResourceActionAssociation javadoc is here:
+	     http://openaz.svn.sourceforge.net/viewvc/openaz/test/doc/org/openliberty/openaz/azapi/AzResourceActionAssociation.html
+
+	   Within XyzResourceActionAssociation extension return null for the 
+	   following AzApi-dependent methods:
+
+ 		AzResourceActionAssociation.getAzAction() 
+		AzResourceActionAssociation.getAzResource() 
+		AzResourceActionAssociation.getAzResourceActionAssociationId() 
+ 
+	   Add new XyzResourceActionAssociation method to return
+	   action and resource objects:
+
+		XyzObject getXyzAction()
+		XyzObject getXyzResource()
+
+	   Then the XyzResourceActionAssociation object can be used
+	   for correlation based on the XyzObject references for
+	   action and resource in the XyzPepRequestImpl that
+	   implement PepRequest, i.e.
+
+		PepRequest.getActionObject(XyzResourceActionAssociation xyzRaa) 
+		PepRequest.getResourceObject(XyzResourceActionAssociation xyzRaa) 
+
+	   Similarly for creating a collection of return objects
+	   in response to a query, the XyzPepResponseFactoryImpl
+	   should be able to pass:
+
+		PepResponseFactory.createPepResponse(
+			Set&lt;XyzResourceActionAssociation&gt; xyzRaas, 
+			PepRequest pepRequest, 
+			boolean queryAllowed) 
+
+	   although one needs to check if generics will allow this pass
+	   of a Set of subclasses of the class for which the interface
+	   is defined.
+
+</pre>
+<a name="pepapiseqmodel"><H3>PepApi Object sequence model</H3></a>
+The following section contains a quasi-sequence diagram that shows the
+relations between the components of the PepApi in approximate order of
+their invocation at runtime.
+<pre>
+
+	+------------------------------------------+
+	| PepRequestFactory                        |
+	|  PepReqFactImpl(azSvc) // impl azSvc set |
+	|  pr = newPepRequest                      |
+	|   |   (sObj,aObj,rObj,eObj)              |
+	|   | newPEPRequest(op)                    |
+	|   |   azReqCtx = azSvc.createAzReqCtx()  |
+	|   |   new PepReqImpl(azReqCtx, this, op) |
+	|   | setAccessSubject(sObj)               |
+	+---|--------------------------------------+
+	    |
+	    V 
+	+---------------------------------------------------------------+
+	| PepRequest                                                    |
+	|      PepReqImpl(azReqCtx, this, op) // set values from params |
+	|      setAccessSubject(subjObj)                                |
+	|       createAccessSubject(subjObj) //'Subject' implies &lt;T&gt;    |
+	|         subjFact = getPepReqFact.getReqAttrFact(catId&lt;T&gt;)     |
+	|    +<-- subjInit = subjFact.createObj(this)                   |
+	|    |    subjMapd = mapJavObject(subjObj, subjInit, subjFact)  |
+	|    |  mapJavaObject(subjObj, subjInit, subjFact)              |
+	|  +<---- mapper = subjFact.getMappers().next()                 |
+	|  | |    mapper.map(subjObj, subjInit)                         |
+	|+<--- decide()                                                 |
+	+|-|-|----------------------------------------------------------+
+	 | | |
+	 | | V
+	 | | +-----------------------------------------------------------+
+	 | | | SubjectFactory                                            |
+	 | | |   createObject(pr)                                        |
+	 | | |     azReqCtx = pr.getAzReqCtx()                           |
+	 | | |     azSubjInit = azReqCtx.createAzEntity(catIdSubj)       |
+	 | | |     azReqCtx.addAzEntity(azSubjInit)                      |
+	 | | | +<- return new Subject(azSubjInit, pr, this)              |
+	 | | +-|---------------------------------------------------------+
+	 | |   |
+	 | |   V
+	 | | +-----------------------------------------------------------+
+	 | | | Subject                                                   |
+	 | | |   Subject(azSubjInit, pr, subjFact)                       |
+	 | | | +<- super[RequestAttributes](azSubjInit, pr, subjFact)    |
+	 | | +-|---------------------------------------------------------+
+	 | |   |
+	 | |   V
+	 | | +-----------------------------------------------------------+
+	 | | | RequestAttributes                                         |
+	 | | |   RequestAttributes(azSubjInit, pr, subjFact)             |
+	 | | |     set this.pr, this.subjFact                            |
+	 | | | +<- super[Attributes](azSubjInit)                         |
+	 | | +-|---------------------------------------------------------+
+	 | |   |
+	 | |   V
+	 | | +-----------------------------------------------------------+
+	 | | | Attributes                                                |
+	 | | |   Attributes(azSubjInit)                                  |
+	 | | |     this.azEntity = azSubjInit                            |
+	 | | +-----------------------------------------------------------+
+	 | | 
+	 | V 
+	 | +-----------------------------------------------------------+
+	 | | JavaObjectMapper                                          |
+	 | |   map(subjObj, reqAttrSubjInit)                           |
+	 | |     convertObj(subjObj, reqAttrSubjInit)                  |
+	 | |       attrId = getVocab(subjObj)                          |
+	 | |   +<- reqAttrSubjInit.setAttribute(attrId, subjObj)       |
+	 | +---|-------------------------------------------------------+
+	 |     |
+	 |     V 
+	 | +-----------------------------------------------------------+
+	 | | RequestAttributes                                         |
+	 | |   setAttribute(attrId, subjObj)                           |
+	 | |     azEntity.createAzAttribute(issuer, attrId,            |
+	 | |       azEntity.createAzAttributeValue(azDataTyp, subjObj) |
+	 | +-----------------------------------------------------------+
+	 | 
+	 V 
+	+----------------------------------------------------------+
+	| DecisionHandler                                          |
+	|   decide(pepReq)                                         |
+	|     azRspCtx = azSvc.decide(pepReq.getAzReqCtx()         |
+	| +<- pepRspFact = pepReq.getPepReqFact.getRspFact()       |
+	| |   pepRsp = pepRspFact.createPepRsp(azRspCtx,pepReq,op) |                        |
+	| |   return pepRsp                                        |
+	+-|--------------------------------------------------------+
+	  |
+	  V
+	+----------------------------------------------------------+
+	| PepResponseFactory                                       |
+	|   createPepRsp(azRspCtx,pepReq,op)                       |
+	| +<- pepRsp = new PepRspImpl(azRspCtx, pepReq, this, op)  |
+	| |   return pepRsp                                        |
+	+-|--------------------------------------------------------+
+	  |
+	  V
+	+----------------------------------------------------------+
+	| PepResponse                                              |
+	|   PepRspImpl(azRspCtx,pepReq,pepRspFact,op)              |
+	|    set this.azRspCtx,this.pepReq,this.pepRspFact,this.op |
+	|    this.azResultIterator = azRspCtx.getRslts.iterator()  |
+	|   allowed()                                              |
+	|   next()  // point to next azResult                      |
+	|     curAzResult = azResultIterator.next()                |
+	|   getResource(), getAction()                             |
+	|     azRaa = this.getAzResourceActionAssociation()        |
+	|     resObj = this.getPepReq.getResourceObject(azRaa)     |
+	|     return resObj                                        |
+	|   getObligations()                                       |
+	|     curAzObls = curAzResult.getAzObligations()           |
+	|     curAzObl = curAzObls.next()                          |
+	|     oblFact = this.getRspFact.getOblFact()               |
+	|     Obligation pepObl = oblFact.createObject(curAzObl)   |
+	+-|--------------------------------------------------------+
+	  |
+	  V
+	+----------------------------------------------------------+
+	| ObligationFactory                                        |
+	|   createObject(azObligation)                             |
+	| +<- return new Obligation(azObligation)                  |
+	+----------------------------------------------------------+
+	  |
+	  V
+	+-----------------------------------------------------------+
+	| Obligation                                                |
+	|   Obligation(azObligaion)                                 |
+	| +<- super[ResponseAttributes](azObligation)               |
+	+-|---------------------------------------------------------+
+	  |
+	  V
+	+-----------------------------------------------------------+
+	| ResponseAttributes                                        |
+	|   ResponseAttributes(azObligation)                        |
+	| +<- super[Attributes](azObligation)                       |
+	+-|---------------------------------------------------------+
+	  |
+	  V
+	+-----------------------------------------------------------+
+	| Attributes                                                |
+	|   Attributes(azObligation)                                |
+	|     this.azEntity = azObligation                          |
+	+-----------------------------------------------------------+
+
+
+</pre>
+
+<a name="somediscussion"><h3>Some discussion items</h3></a>
+
+<a name="basicpattern"><h4>Basic Processing Pattern</h4></a>
+The basic pattern is that the "container" of applications provides
+both checking requests before the application receives them, and
+checking requests in the process of application execution, where
+it is necessary to determine if the current user has sufficient
+authorization established to continue the current operation.
+<p>
+
+<a name="highlowinterfaces">
+<h4>High Level and Low Level Interface Layers</h4></a>
+PepApi is a "high level interface" intended to be totally flexible
+in terms of the applications and containers that can use it, and
+to also be "easy to use", comparable to existing platform-specific
+authorization models, such as J2SE checkPermission and WebLogic
+isAccessAllowed.
+<p>
+By contrast, AzApi is a "low level interface" intended to provide
+a Java binding to the more general platform independent XACML
+authorization model, which provides a general interface consisting
+of a collection of collections of "canonical" Attributes that contain
+both Attribute metadata and AttributeValues.
+<p>
+
+<a name="basicpurpose"><h4>Basic Purpose of PepApi</h4></a>
+Therefore, the intended purpose of a PepApi Impl, for example,
+this package ({@link org.openliberty.openaz.pep}), is
+to provide a "mapping" from the simple, application-friendly, PepApi
+that the applications (and containers) use, to the more complex
+AzApi, that the container would then typically use
+to submit requests to standard XACML PDPs.
+<p>
+
+<a name="standardpdps"><h4>Standard PDPs</h4></a>
+"Standard XACML PDPs" are accessed using the XACML 
+Request/Response protocol, which is described in the XACML 
+specifications using XML to represent the details. However, 
+implementations are not required to use XML, but they are
+required to maintain the semantics of XACML, which are normatively
+defined in the specifications using the XML representation.
+<p>
+
+<a name="xacmlreps"><h4>Representations of XACML</h4></a>
+Furthermore, the XACML specifications do not specify what
+representation is required in the PEP-PDP connection, so it is
+possible that one end is expecting to use XML and the other
+end is expecting to use some other serialization format of the
+same information. Therefore, interoperability is somewhat
+dependent on the "bindings" that XACML PEP and XACML PDPs have
+provided for support. In the absence of a match, it would be
+up to the vendors and/or enterprise system developers to either
+provide a translation module or to simply select another 
+product that would be compatible.
+<p>
+It is not a goal of either the XACML Technical Committee nor
+of the OpenAz project to attempt to resolve this issue, except
+on an as-needed basis to serve the purposes of implementations
+that are used within or want to integrate with the OpenAz Project.
+<p>
+So, for example, the initial release of OpenAz has, effectively,
+two "providers" for AzApi, the top level classes of which are:
+<a href="http://openaz.svn.sourceforge.net/viewvc/openaz/test/doc/org/openliberty/openaz/pdp/provider/SimpleConcreteDummyService.html">
+<b>SimpleConcreteDummyService</b></a> and 
+<a href="http://openaz.svn.sourceforge.net/viewvc/openaz/test/doc/org/openliberty/openaz/pdp/provider/SimpleConcreteSunXacmlService.html">
+<b>SimpleConcreteSunXacmlService</b></a>. 
+The former, the "dummy service",
+simply gives canned responses, and should be regarded as no more than
+a test tool, however, its existence as an independent "provider" may
+be useful for some types of demos.
+<p>
+
+<a name="openazreleases"><h4>OpenAz Release Philosophy</h4></a>
+To understand the working example in the "initial release of OpenAz"
+(which is the current release, which should be considered to be
+using the interfaces, i.e. AzApi and PepApi, in their "final form".
+The "final form" is "final" in the sense that until there is a critical
+mass (for example 3 implementations, including the current ref impl),
+fixes to "bugs" found in either API should be considered fair game.
+However, any "functionality" above and beyond what is currently
+represented as the functionality of those interfaces, should be
+considered candidates for a "second" or "next" release.)
+ 
+<a name="thesixlayersdisc"><H4>The Six Layers</H4></a>
+One may think of the 6 layers as kind of a "stepladder" of mapping
+the Objects from the local form within the application (Layer 1) to the 
+canonical form within AzApi (Layer 5).
+<p>
+
+<a name="layer5disc"><H5>Layer 5: AzApi Impl</H5></a>
+Then, from the AzApi impl (layer 5) the canonical form objects may
+be mapped a 2nd time into the local object form required by the 
+XACML PDP.
+
+From the perspective of the six layers, we can examine some of the
+possible "usage scenarios" for OpenAz. It turns out that there
+really are two major pieces of standardization that OpenAz facilitates:
+
+<ul>
+<li> First is the upper level "PepApi" (layer two), which provides
+a standard Java interface to application environments, regardless
+of the specific Objects the applications pass to PepApi. 
+
+<ul>
+<li>Note: It is "standard" in the sense that 
+applications do not have to be aware that
+what is done with the Objects when they are passed to PepApi.
+is that the Objects are "mapped" by the 
+layer 3 PepApi Impl to be used as input to the layer 4 AzApi
+interface.
+</ul>
+
+<li> Second is the lower level "AzApi" (layer four), which provides
+a standard Java interface to XACML PDPs.
+
+<ul>
+<li>Note: Again that the layer 5 AzApi Impl needs to generally
+"map" the AzApi objects to those of the XACML Impl.
+</ul> 
+</ul>
+
+The reason that layer 5 may need to do mapping is the existing
+XACML implementations, in general, will not yet be using AzApi,
+and so the most effective path to use AzApi is to implement a
+mapping to the current objects used by the XACML PDP.
+<ul>
+<li> In fact, this is exactly what is done in the OpenAz layer five, 
+where the AzApi top level impl,
+<a href="http://openaz.svn.sourceforge.net/viewvc/openaz/test/doc/org/openliberty/openaz/pdp/provider/SimpleConcreteSunXacmlService.html">
+<b>SimpleConcreteSunXacmlService</b></a>, 
+wraps the SunXacml PDP, which has its own interface, 
+<ul>
+<li> <a href="http://sunxacml.sourceforge.net/javadoc/com/sun/xacml/PDP.html#evaluate(com.sun.xacml.ctx.RequestCtx)">
+ResponseCtx response = PDP.evaluate(RequestCtx request)</a>
+</ul>
+</ul>
+
+<a name="azapivssunxacml"><H4>AzApi vs SunXacml</H4></a>
+
+<p>
+While the SunXacml interface is "similar" to the AzApi interface, 
+particularly the AzApi "decide()" call 
+<p>
+<a href="http://openaz.svn.sourceforge.net/viewvc/openaz/test/doc/org/openliberty/openaz/azapi/AzService.html#decide(org.openliberty.openaz.azapi.AzRequestContext)">
+<b>AzService.decide</b></a>
+(
+<a href="http://openaz.svn.sourceforge.net/viewvc/openaz/test/doc/org/openliberty/openaz/azapi/AzRequestContext.html">
+<b>AzRequestContext</b></a>
+};
+
+<ul>
+<li> AzResponseContext azRspCtx = AzService.decide(AzRequestContext azReqCtx)
+</ul>
+
+<p>
+there is still a "mapping" required to go from the AzApi implementation
+objects to the SunXacml implementation objects. i.e. one must map the
+AzApi 
+<a href="http://sunxacml.sourceforge.net/javadoc/com/sun/xacml/ctx/RequestCtx.html">
+<b>RequestCtx</b></a>
+to the SunXacml and on the return, map the SunXacml 
+<a href="http://sunxacml.sourceforge.net/javadoc/com/sun/xacml/ctx/ResponseCtx.html">
+<b>ResponseCtx</b></a> to the AzApi 
+<a href="http://openaz.svn.sourceforge.net/viewvc/openaz/test/doc/org/openliberty/openaz/azapi/AzResponseContext.html">
+<b>AzResponseContext</b></a>
+
+
+<a name="canonicalform"><H4>Canonical Form</H4></a>
+Given the above description, one may ask why map to the canonical form
+at all? Why not have layer 3 map directly to the local form of the 
+PDP, and therefore skip layers 4 and 5?
+
+<ul>
+<li>In fact, the architecture is designed so that is a perfectly
+legitimate strategy to take. However, the major drawback to this strategy
+is that if the enterprise has a mix of PDPs from multiple vendors,
+then configuration may begin to become complex, as one must keep track
+of which vendor's PDP is servicing which application, so as to ensure
+that the proper mappers are in place to map from the application
+objects to the specific PDP vendor objects.
+
+<li>From a purely technical engineering for performance perspective,
+it may appear that the benefit of an intermediate canonical form in
+the runtime path, as kind of a standard "clearinghouse" is not 
+compelling enough on its own to justify the effort to achieve it.
+
+<li>However, there are additional considerations. Security Policy
+is an all-encompassing concern for an enterprise that generally 
+applies to every activity conducted by the enterprise, whether
+for concern of privacy, risk-avoidance, compliance, integrity, etc.,
+there needs to be a way to integrate security Policy to any activity.
+
+<li>In order to effectively manage security Policy, there needs to
+be standard representations of the information in those Policies,
+as well as a method to relate that information to the corresponding
+representation of information in the enterprise that is collected
+and assembled to a Request to be evaluated by Policy.
+</ul>
+
+<a name="tutorialmappers"><H2>OpenAz Mappers Writing Tutorial (v114)</H2></a>
+<H3>Contents</H3>
+<ul>
+<li><a href="#highleveloverviewmappers">High Level Overview: Mappers</a>
+<li><a href="#structuremappers">Mapper structure</a>
+<li><a href="#methodimplmappers">Mapper method implementation</a>
+<li><a href="#permissionmappers">Permission Mapper</a>
+
+</ul>
+</ul>
+
+<a name="highleveloverviewmappers">
+<H3>High Level Overview: Mappers</H3></a>
+At the most fundamental level, the philosophy of OpenAz and PepApi/AzApi
+that the process of authorization can be abstracted as Policy defined in
+terms of "entities" represented as collections of "attributes", where the
+entities and attributes can be represented by a common standard such
+as XACML. Therefore, in theory, all that is required at runtime when an
+authorization check is required is to look at the entities involved and
+evaluate the Policy to determine if the attributes of the entities meet
+the Policy criteria for granting access.
+<p>
+The "entities" involved in a typical access check include:
+<ul>
+<li>A User Entity, or "Subject", where the Subject is the entity that
+is requesting access.
+<li>A Resource Entity, where the Resource is the entity to which the
+User Entity is requesting access.
+<li>An Action Entity, where the action specifies the explicit operations
+that the User Entity is requesting to apply to the Resource Entity.
+<li>An optional Environment Entity, where the "environment" is generally
+to be considered system conditions, such as time of day, that may factor
+into the decision making process. All such attributes are generally 
+collected in an Environment Entity collection of Attributes.
+</li>
+</ul>
+In the XACML Specification, all attributes are of a specific XACML
+DataType, which means, as described in XACML Specification Section A.2:
+<pre>
+  A.2. Data-types
+  
+    Although XML instances represent all data-types as strings,
+    an XACML PDP must reason about types of data that, while they
+    have string representations, are not just strings. 
+    
+    Types such as Boolean, integer and double MUST be converted:
+    
+        - from their XML string representations
+        - to values that can be compared with values in their domain
+          of discourse, such as numbers.
+</pre>
+(Note: the XACML Specification uses both the term "data-type" and the
+term "DataType", where the former refers to a generic notion of a
+"data type", but within the XACML context, thus also implicitly
+referring to the latter term, "DataType", which is the name of the
+"XML attribute" used to specify the specific instance of XACML 
+data-type to be used in conjunction with the XACML Attribute element
+that contains both the DataType attribute and AttributeValue element.
+OpenAz will not make such a distinction and simply use the term "DataType"
+or "datatype" interchangeably to in any of these contexts.)
+<p>
+In OpenAz, the "lower level" AzApi contains a separate interface for each
+of the Xacml DataTypes and a specific Java Object Type is also associated
+with each Xacml DataType. The collection of 
+<a href="http://openaz.svn.sourceforge.net/viewvc/openaz/test/doc/org/openliberty/openaz/azapi/AzAttributeValue.html"
+>AzAttributeValue subinterfaces</a>
+along with the associated list of "Known Implementing Classes" that reference
+the reference impl implementations of these interfaces, effectively can
+be considered the specification of the "AzApi Java Language Binding".
+<p>
+As such, in order to make an AzRequest to a XACML PDP, one needs to
+collect the attributes associated with each entity (where the entities
+are distinguished by 
+<a href ="">AzCategoryId</a> and submit the Java objects containing the
+attribute values thru these standard interfaces.
+<p>
+The purpose of the lower level AzApi interface is to provide a
+well-structured framework that has a standard representation of all
+information that may ultimately prove necessary to submit a complete
+authorization request.
+<p>
+However, in general, information in the runtime environment is not
+in any particular standard form, so, in order to enable minimal impact
+on existing runtime development practices, the PepApi was developed to
+enable applications to submit whatever information objects are preferred
+to be used in a particular application environment. 
+<p>
+In order to make this strategy work the PepApi implementation needs to
+"map" the information in the objects supplied by the application from
+that environment-specific form to the AzApi standard form, which will
+then enable seamless submission to a XACML PDP.
+<p>
+However, as described in the first tutorial above, the same strategy 
+will work with almost any PDP. This second tutorial will explain how
+the reference impl mappers are designed, and it is expected that the
+same design strategy can be applied to mapping to other PDP APIs,
+as well, where instead of mapping application objects to azapi objects,
+the mapping would be to the non-Xacml-PDP-specific objects.
+<H3>How to build a Mapper</H3>
+Probably the most straight-forward way to explain how to build a mapper
+is to explain how the existing mappers provided in PepApi work.
+<a name="structuremappers"><h4>Mapper structure</h4></a>
+Looking at the javadoc for 
+<a href="http://openaz.svn.sourceforge.net/viewvc/openaz/test/doc/org/openliberty/openaz/pep/SimpleJavaObjectMapper.html"
+>org.openliberty.openaz.pep.SimpleJavaObjectMapper</a> as a
+typical example, we can make the following observations about its structure:
+<ul>
+<li>It implements the 
+<a href="http://openaz.svn.sourceforge.net/viewvc/openaz/test/doc/org/openliberty/openaz/azapi/pep/JavaObjectMapper.html"
+>org.openliberty.openaz.azapi.pep.JavaObjectMapper</a>
+interface.
+<li>The javadoc says that it supports 3 objects: String, Date, and HashMap,
+and that it maps those objects into RequestAttributes.
+<li>The 3 JavaObjectMapper interface methods: canMapObject(), map(), and
+getSupportedObjects() appear in the Method Summary for the 
+SimpleJavaObjectMapper.
+<li>There are additional methods used within the implementation: 
+convertDate, convertString, convertMap. These methods do the actual
+conversion of the application input object to the AzAttribute structures.
+</ul>
+<a name="methodimplmappers"><h4>Mapper method implementation</h4></a>
+<h5>getSupportedObjects</h5>
+Implementation of getSupportedObjects() in SimpleJavaObjectMapper is
+to simply create a set containing a class object for each class that
+the mapper supports. This is simply a hard-coded set which can be used
+when configuring mappers to preliminarily determine object types supported.
+<p>
+For the SimpleJavaObjectMapper, this consists of a list of 3 class types:
+String, Date, HashMap.
+<h5>canMapObject</h5>
+Implementation of canMapObject(Object obj) should be straight-forward.
+In SimpleJavaObjectMapper there is simply a sequence of "if statements"
+that use "instanceof" to test whether the obj parameter is an "instanceof"
+one of the supported object classes. If there is a match then true
+is returned, otherwise false is returned.
+<h5>map</h5>
+Implementation of the 
+<a href="http://openaz.svn.sourceforge.net/viewvc/openaz/test/doc/org/openliberty/openaz/azapi/pep/JavaObjectMapper.html#map(java.lang.Object,%20org.openliberty.openaz.azapi.pep.RequestAttributes)"
+>map(Object obj, RequestAttributes<T> reqAttrs)</a> method is the
+only place where there might be some non-trivial complexity to work thru.
+<p>
+In SimpleJavaObjectMapper, map(obj,reqAttrs) dispatches to a conversion
+method for one of the supported object types by going thru a similar
+sequence of "if instanceof" test and dispatching when a matching object
+class is found.
+<p>
+Within the conversion methods, the first thing considered is the AzCategoryId
+of the RequestAttributes target object, which for AzApi is an AzEntity
+AzAttribute collection. When the Mapper.map method is invoked, the caller
+needs to determine which AzCategoryId to pass to the method as the 
+generic parameter T of the RequestAttributes<T> object being passed.
+<p>
+Generally, this will be implicitly determined by the entity for which
+the object being converted is intended. In the 
+<a href="http://openaz.svn.sourceforge.net/viewvc/openaz/test/doc/org/openliberty/openaz/azapi/pep/PepRequestFactory.html"
+>PepApi PepRequestFactory.newPepRequest(*) methods</a>,
+the objects passed are in an order that determines whether the object is
+to be considered a Subject, Action, Resource, or Environment as
+described in the signature to the newPepRequest methods. 
+<p>
+One can get a rough idea of how this is implemented by following the 
+<a href="#pepapiseqmodel">PepApi sequence model</a> in the first tutorial
+above. In particular, starting with PepRequestFactoryImpl call to
+setAccessSubject(sObj), one can follow the diagram logic down to
+the RequestAttributes.setAttribute(attrId, subjObj) method where the
+Mapper has been invoked and the convertObject method within the Mapper
+is setting the attribute on the AzEntity.
+<a name="permissionmappers"><H4>Permission Mapper</H4></a>
+A slightly more interesting case is the 
+<a href="http://openaz.svn.sourceforge.net/viewvc/openaz/test/doc/org/openliberty/openaz/pep/SimpleJavaPermissionMapper.html">SimpleJavaPermissionMapper</a>
+<p>
+As described in the javadoc for
+<a href="http://openaz.svn.sourceforge.net/viewvc/openaz/test/doc/org/openliberty/openaz/pep/SimpleJavaPermissionMapper.html#map(java.lang.Object,%20org.openliberty.openaz.azapi.pep.RequestAttributes)"
+>SimpleJavaPermissionMapper.map()</a>
+a Permission or any subclass of Permission can be processed and effectively
+serialized into 3 String parameters, where the Permission subclass is assumed
+to be a "resource-type", the name parameter is assumed to be the "resource-id",
+and the action is assumed to be the "action-id", where resource-id and action-id
+are as defined in Xacml, and resource-type is an OpenAz identifier used to
+name a resource type.
+<p>
+Therefore these 3 parameters can be passed to the Xacml PDP and generally
+policies will contain regular expression conditions on resource name in order
+to create scopes of resources and actions subject to the policy. Some examples
+demonstrating this technique are included in the test program
+<a href="http://openaz.svn.sourceforge.net/viewvc/openaz/test/doc/test/TestStyles.html"
+>TestStyles</a>
+where the code and javadoc of the testStyle* methods describe some of 
+the test cases, and the 
+<a href="http://openaz.svn.sourceforge.net/viewvc/openaz/test/src/test/"
+>code from the project</a>
+ may be examined.
+</body>
+</html>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-openaz/blob/94fcdd90/openaz-pep/src/test/java/org/openliberty/openaz/pepapi/std/test/TestAPI.java
----------------------------------------------------------------------
diff --git a/openaz-pep/src/test/java/org/openliberty/openaz/pepapi/std/test/TestAPI.java b/openaz-pep/src/test/java/org/openliberty/openaz/pepapi/std/test/TestAPI.java
new file mode 100755
index 0000000..f2173a8
--- /dev/null
+++ b/openaz-pep/src/test/java/org/openliberty/openaz/pepapi/std/test/TestAPI.java
@@ -0,0 +1,81 @@
+package org.openliberty.openaz.pepapi.std.test;
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.openliberty.openaz.pepapi.*;
+import org.openliberty.openaz.pepapi.std.StdPepAgentFactory;
+
+import java.util.ArrayList;
+import java.util.List;
+
+
+public class TestAPI {
+
+	private PepAgentFactory pepAgentFactory;
+
+	@Before
+	public void setup() {
+		pepAgentFactory = new StdPepAgentFactory("/properties/testapi.xacml.properties");
+	}
+	
+	
+	/**
+	 * 
+	 */
+	@Test
+	public void testPepAgent() {
+		Assert.assertNotNull(getPepAgent());
+	}
+
+	
+	/**
+	 * 
+	 */
+	@Test
+	public void testPermit(){
+		PepResponse response = getPepAgent().simpleDecide("Julius Hibbert",
+				"read", "http://medico.com/record/patient/BartSimpson");
+		Assert.assertNotNull(response);
+		Assert.assertEquals(true, response.allowed());
+	}
+
+	
+	/**
+	 * 
+	 */
+	@Test
+	public void testNotApplicable(){
+		PepResponse response = getPepAgent().simpleDecide("Julius Hibbert",
+				"read","http://medico.com/record/patient/JohnSmith");
+		Assert.assertNotNull(response);
+		Assert.assertEquals(false, response.allowed());
+	}
+
+	
+	/**
+	 * 
+	 */
+	@Test
+	public void testMultiRequest() {
+		List<Action> actions = new ArrayList<Action>();
+		actions.add(Action.newInstance("read"));
+		actions.add(Action.newInstance("write"));
+		actions.add(Action.newInstance("update"));
+		actions.add(Action.newInstance("delete"));
+
+		List<PepResponse> responses = getPepAgent().bulkDecide(actions,
+				Subject.newInstance("Julius Hibbert"),
+				Resource.newInstance("http://medico.com/record/patient/BartSimpson"));
+		Assert.assertNotNull(responses);
+		Assert.assertEquals(true, responses.get(0).allowed());
+		Assert.assertEquals(true, responses.get(1).allowed());
+		Assert.assertEquals(false, responses.get(2).allowed());
+		Assert.assertEquals(false, responses.get(3).allowed());
+
+	}
+
+	public PepAgent getPepAgent() {
+		return pepAgentFactory.getPepAgent();
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-openaz/blob/94fcdd90/openaz-pep/src/test/java/org/openliberty/openaz/pepapi/std/test/TestAPIWithPIP.java
----------------------------------------------------------------------
diff --git a/openaz-pep/src/test/java/org/openliberty/openaz/pepapi/std/test/TestAPIWithPIP.java b/openaz-pep/src/test/java/org/openliberty/openaz/pepapi/std/test/TestAPIWithPIP.java
new file mode 100755
index 0000000..90cef8e
--- /dev/null
+++ b/openaz-pep/src/test/java/org/openliberty/openaz/pepapi/std/test/TestAPIWithPIP.java
@@ -0,0 +1,98 @@
+package org.openliberty.openaz.pepapi.std.test;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.openliberty.openaz.pepapi.*;
+import org.openliberty.openaz.pepapi.std.StdPepAgentFactory;
+
+import java.util.ArrayList;
+import java.util.List;
+
+
+public class TestAPIWithPIP {
+	
+	private static final Log log = LogFactory.getLog(TestAPIWithPIP.class);
+
+	private PepAgentFactory pepAgentFactory;
+
+	@Before
+	public void setup() {
+		pepAgentFactory = new StdPepAgentFactory("xacml.properties");
+	}
+	
+
+	/**
+	 * 
+	 */
+	@Ignore
+	@Test
+	public void testPepAgent() {
+		Assert.assertNotNull(getPepAgent());
+	}
+
+	
+	/**
+	 * 
+	 */
+	@Ignore
+	@Test
+	public void testPermit() {
+		PepResponse response = getPepAgent()
+				.simpleDecide("John Doe",
+						"read",
+						"http://medico.com/record/patient/BartSimpson");
+		Assert.assertNotNull(response);
+		Assert.assertEquals(true, response.allowed());
+	}
+
+	
+	/**
+	 * 
+	 */
+	@Ignore
+	@Test
+	public void testNotApplicable() {
+		PepResponse response = getPepAgent()
+				.simpleDecide("John Smith",
+						"read",
+						"http://medico.com/record/patient/BartSimpson");
+		Assert.assertNotNull(response);
+		Assert.assertEquals(false, response.allowed());
+	}
+
+	
+	/**
+	 * 
+	 */
+	@Ignore
+	@Test
+	public void testMultiRequest() {
+		List<Action> actions = new ArrayList<Action>();
+		actions.add(Action.newInstance("read"));
+		actions.add(Action.newInstance("update"));
+		actions.add(Action.newInstance("write"));
+		actions.add(Action.newInstance("modify"));
+
+		Resource resource = Resource.newInstance("http://medico.com/record/patient/BartSimpson");
+		Subject subject = Subject.newInstance("John Doe");
+
+		List<PepResponse> responses = getPepAgent().bulkDecide(actions, resource, subject);
+		Assert.assertNotNull(responses);
+		Assert.assertEquals(actions.size(), responses.size());
+		Assert.assertEquals(true, responses.get(0).allowed());
+		Assert.assertEquals(false, responses.get(1).allowed());
+		Assert.assertEquals(true, responses.get(2).allowed());
+		Assert.assertEquals(false, responses.get(3).allowed());
+		for(PepResponse response: responses) {
+			log.debug(response.getAssociation());
+		}
+	}
+	
+	public PepAgent getPepAgent() {
+		return pepAgentFactory.getPepAgent();
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-openaz/blob/94fcdd90/openaz-pep/src/test/java/org/openliberty/openaz/pepapi/std/test/TestAnnotatedHandlerRegistration.java
----------------------------------------------------------------------
diff --git a/openaz-pep/src/test/java/org/openliberty/openaz/pepapi/std/test/TestAnnotatedHandlerRegistration.java b/openaz-pep/src/test/java/org/openliberty/openaz/pepapi/std/test/TestAnnotatedHandlerRegistration.java
new file mode 100755
index 0000000..830d28e
--- /dev/null
+++ b/openaz-pep/src/test/java/org/openliberty/openaz/pepapi/std/test/TestAnnotatedHandlerRegistration.java
@@ -0,0 +1,72 @@
+package org.openliberty.openaz.pepapi.std.test;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.openliberty.openaz.pepapi.*;
+import org.openliberty.openaz.pepapi.std.StdPepAgentFactory;
+import org.openliberty.openaz.pepapi.std.test.obligation.AnnotatedCatchAllObligationHandler;
+import org.openliberty.openaz.pepapi.std.test.obligation.AnnotatedFilteringObligationHandler;
+import org.openliberty.openaz.pepapi.std.test.obligation.AnnotatedRedactionObligationHandler;
+
+
+public class TestAnnotatedHandlerRegistration {
+	
+	@SuppressWarnings("unused")
+	private static Log log = LogFactory.getLog(TestAnnotatedHandlerRegistration.class);
+
+	private PepAgentFactory pepAgentFactory;
+
+	//TODO: Need to wire
+	private AnnotatedFilteringObligationHandler filterHandler;
+
+	//TODO: Need to wire
+	private AnnotatedRedactionObligationHandler redactionHandler;
+
+	//TODO: Need to wire
+	private AnnotatedCatchAllObligationHandler catchAllHandler;
+
+
+	@Before
+	public void setup() {
+		pepAgentFactory = new StdPepAgentFactory("xacml.properties");
+	}
+	
+
+	
+	/**
+	 * 
+	 */
+	@Ignore
+	@Test
+	public void testPepAgent() {
+		Assert.assertNotNull(getPepAgent());
+	}
+	
+	
+	
+	/**
+	 * 
+	 */
+	@Ignore
+	@Test
+	public void testRegistration() {
+		Subject subject = Subject.newInstance("John Smith");
+		subject.addAttribute("urn:oasis:names:tc:xacml:1.0:subject:age", "45");
+		PepResponse response = getPepAgent().decide(subject, Action.newInstance("view"),
+				Resource.newInstance("resource1"));
+		Assert.assertNotNull(response);
+		Assert.assertEquals(true, response.allowed());
+		filterHandler.enforce();
+		redactionHandler.enforce();
+		catchAllHandler.enforce();
+	}
+
+	public PepAgent getPepAgent() {
+		return pepAgentFactory.getPepAgent();
+	}
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-openaz/blob/94fcdd90/openaz-pep/src/test/java/org/openliberty/openaz/pepapi/std/test/TestDataTypes.java
----------------------------------------------------------------------
diff --git a/openaz-pep/src/test/java/org/openliberty/openaz/pepapi/std/test/TestDataTypes.java b/openaz-pep/src/test/java/org/openliberty/openaz/pepapi/std/test/TestDataTypes.java
new file mode 100755
index 0000000..40a39da
--- /dev/null
+++ b/openaz-pep/src/test/java/org/openliberty/openaz/pepapi/std/test/TestDataTypes.java
@@ -0,0 +1,85 @@
+package org.openliberty.openaz.pepapi.std.test;
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.openliberty.openaz.pepapi.*;
+import org.openliberty.openaz.pepapi.std.StdPepAgentFactory;
+
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.List;
+
+
+public class TestDataTypes {
+
+	private PepAgentFactory pepAgentFactory;
+
+	@Before
+	public void setup() {
+		/*System.setProperty("xacml.properties" ,
+				getClass().getClassLoader().getResource("properties/testdatatypes.xacml.properties").getPath());*/
+		pepAgentFactory = new StdPepAgentFactory("/properties/testdatatypes.xacml.properties");
+	}
+	
+	
+	/**
+	 * 
+	 */
+	@Test
+	public void testPepAgent() {
+		Assert.assertNotNull(getPepAgent());
+	}
+
+	
+	/**
+	 * 
+	 */
+	@Test
+	public void testPermitWithURIResource() {
+		Subject subject = Subject.newInstance("John Smith");
+		Action action = Action.newInstance("view");
+		Resource resource = Resource.newInstance(URI.create("file://repository/classified/abc"));
+		PepResponse response = getPepAgent().decide(subject, action, resource);
+		Assert.assertNotNull(response);
+		Assert.assertEquals(true, response.allowed());
+	}
+	
+
+	/**
+	 * 
+	 */
+	@Test
+	public void testPermitWithIntegerResource() {
+		Subject subject = Subject.newInstance("John Smith");
+		Action action = Action.newInstance("view");
+		Resource resource = Resource.newInstance(101L);
+		PepResponse response = getPepAgent().decide(subject, action, resource);
+		Assert.assertNotNull(response);
+		Assert.assertEquals(true, response.allowed());
+	}
+
+	
+	/**
+	 * 
+	 */
+	@Test
+	public void testMultiRequestWithURI() {
+		List<Resource> resources = new ArrayList<Resource>();
+		resources.add(Resource.newInstance(URI.create("file://repository/classified/abc")));
+		resources.add(Resource.newInstance(URI.create("file://repository/classified/xyz")));
+
+		Subject subject = Subject.newInstance("John Smith");
+		Action action = Action.newInstance("view");
+
+		List<PepResponse> responses = getPepAgent().bulkDecide(resources, action, subject);
+		Assert.assertNotNull(responses);
+		for(PepResponse response: responses) {
+			Assert.assertEquals(true, response.allowed());
+		}
+	}
+
+	public PepAgent getPepAgent() {
+		return pepAgentFactory.getPepAgent();
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-openaz/blob/94fcdd90/openaz-pep/src/test/java/org/openliberty/openaz/pepapi/std/test/TestMapper.java
----------------------------------------------------------------------
diff --git a/openaz-pep/src/test/java/org/openliberty/openaz/pepapi/std/test/TestMapper.java b/openaz-pep/src/test/java/org/openliberty/openaz/pepapi/std/test/TestMapper.java
new file mode 100755
index 0000000..0c4c50e
--- /dev/null
+++ b/openaz-pep/src/test/java/org/openliberty/openaz/pepapi/std/test/TestMapper.java
@@ -0,0 +1,123 @@
+package org.openliberty.openaz.pepapi.std.test;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.openliberty.openaz.pepapi.*;
+import org.openliberty.openaz.pepapi.std.StdPepAgentFactory;
+import org.openliberty.openaz.pepapi.std.test.mapper.BusinessRequestContext;
+import org.openliberty.openaz.pepapi.std.test.mapper.Client;
+import org.openliberty.openaz.pepapi.std.test.mapper.Document;
+
+import java.util.ArrayList;
+import java.util.List;
+
+
+public class TestMapper {
+	
+	@SuppressWarnings("unused")
+	private static Log logger = LogFactory.getLog(TestMapper.class);
+
+	private PepAgentFactory pepAgentFactory;
+
+	@Before
+	public void setup() {
+		this.pepAgentFactory = new StdPepAgentFactory("/properties/testmapper.xacml.properties");
+	}
+	
+	/**
+	 * 
+	 */
+	@Test
+	public void testPepAgent() {
+		Assert.assertNotNull(getPepAgent());
+	}
+	
+	/**
+	 * 
+	 */
+	@Test
+	public void testPermit() {
+		Subject subject = Subject.newInstance("John Smith");
+		subject.addAttribute("urn:oasis:names:tc:xacml:1.0:subject:role-id", "ROLE_DOCUMENT_WRITER");
+
+		Action action = Action.newInstance("write");
+
+		Document doc = new Document(1, "OnBoarding Document", "ABC Corporation", "John Smith");
+		PepResponse response = getPepAgent().decide(subject, action, doc);
+		Assert.assertNotNull(response);
+		Assert.assertEquals(true, response.allowed());
+	}
+	
+	/**
+	 * 
+	 */
+	@Test
+	public void testNotApplicable(){
+		Subject subject = Subject.newInstance("John Smith");
+		subject.addAttribute("urn:oasis:names:tc:xacml:1.0:subject:role-id", "ROLE_DOCUMENT_WRITER");
+
+		Action action = Action.newInstance("write");
+		Document doc = new Document(2, "OnBoarding Document", "XYZ Corporation", "Jim Doe");
+		PepResponse response = getPepAgent().decide(subject,  action, doc);
+		Assert.assertNotNull(response);
+		Assert.assertEquals(false, response.allowed());
+	}
+	
+	@Test(expected=PepException.class)
+	public void testMix(){
+		Subject subject = Subject.newInstance("John Smith");
+		subject.addAttribute("urn:oasis:names:tc:xacml:1.0:subject:role-id", "ROLE_DOCUMENT_WRITER");
+
+		Action action = Action.newInstance("write");
+
+		Document doc1 = new Document(1, "OnBoarding Document", "ABC Corporation", "John Smith");
+		Document doc2 = new Document(2, "OnBoarding Document", "XYZ Corporation", "Jim Doe");
+		List<Object> resourceList = new ArrayList<Object>();
+		resourceList.add(doc1);
+		resourceList.add(doc2);
+		
+		PepResponse response = getPepAgent().decide(subject, action, resourceList);
+		Assert.assertNotNull(response);
+		response.allowed();
+	}
+	
+	@Test
+	public void testVarArgsPermit(){
+		Subject subject = Subject.newInstance("John Smith");
+		subject.addAttribute("urn:oasis:names:tc:xacml:1.0:subject:role-id", "ROLE_DOCUMENT_READER");
+		BusinessRequestContext bc = new BusinessRequestContext("USA", "05:00 EST");
+
+		Action action = Action.newInstance("read");
+		List<Object> resources = new ArrayList<Object>();
+		resources.add(new Document(1, "OnBoarding Document", "XYZ Corporation", "Jim Doe"));
+		resources.add(new Client("XYZ Corporation", "USA"));
+		
+		PepResponse response = getPepAgent().decide(subject, action, resources, bc);
+		Assert.assertNotNull(response);
+		Assert.assertEquals(true, response.allowed());
+	}
+	
+	@Test
+	public void testVarArgsDeny(){
+		Subject subject = Subject.newInstance("John Smith");
+		subject.addAttribute("urn:oasis:names:tc:xacml:1.0:subject:role-id", "ROLE_DOCUMENT_READER");
+		BusinessRequestContext bc = new BusinessRequestContext("INDIA", "05:00 IST");
+		
+		List<Object> resources = new ArrayList<Object>();
+		resources.add(new Document(2, "OnBoarding Document", "XYZ Corporation", "Jim Doe"));
+		resources.add(new Client("XYZ Corporation", "USA"));
+
+		Action action = Action.newInstance("write");
+
+		PepResponse response = getPepAgent().decide(subject, action, resources, bc);
+		Assert.assertNotNull(response);
+		Assert.assertEquals(false, response.allowed());
+	}
+
+	public PepAgent getPepAgent() {
+		return pepAgentFactory.getPepAgent();
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-openaz/blob/94fcdd90/openaz-pep/src/test/java/org/openliberty/openaz/pepapi/std/test/mapper/BusinessRequestContext.java
----------------------------------------------------------------------
diff --git a/openaz-pep/src/test/java/org/openliberty/openaz/pepapi/std/test/mapper/BusinessRequestContext.java b/openaz-pep/src/test/java/org/openliberty/openaz/pepapi/std/test/mapper/BusinessRequestContext.java
new file mode 100755
index 0000000..1820428
--- /dev/null
+++ b/openaz-pep/src/test/java/org/openliberty/openaz/pepapi/std/test/mapper/BusinessRequestContext.java
@@ -0,0 +1,21 @@
+package org.openliberty.openaz.pepapi.std.test.mapper;
+
+public class BusinessRequestContext {
+	
+	private final String requestCountry;
+	
+	private final String requestTime;
+
+	public BusinessRequestContext(String country, String time){
+		this.requestCountry = country;
+		this.requestTime = time;
+	}
+	
+	public String getRequestCountry() {
+		return requestCountry;
+	}
+
+	public String getRequestTime() {
+		return requestTime;
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-openaz/blob/94fcdd90/openaz-pep/src/test/java/org/openliberty/openaz/pepapi/std/test/mapper/BusinessRequestContextMapper.java
----------------------------------------------------------------------
diff --git a/openaz-pep/src/test/java/org/openliberty/openaz/pepapi/std/test/mapper/BusinessRequestContextMapper.java b/openaz-pep/src/test/java/org/openliberty/openaz/pepapi/std/test/mapper/BusinessRequestContextMapper.java
new file mode 100755
index 0000000..3b1c93a
--- /dev/null
+++ b/openaz-pep/src/test/java/org/openliberty/openaz/pepapi/std/test/mapper/BusinessRequestContextMapper.java
@@ -0,0 +1,34 @@
+package org.openliberty.openaz.pepapi.std.test.mapper;
+
+import com.att.research.xacml.api.XACML3;
+import org.openliberty.openaz.pepapi.*;
+
+public class BusinessRequestContextMapper implements ObjectMapper {
+
+	private MapperRegistry mapperRegistry;
+
+	private PepConfig pepConfig;
+
+	@Override
+	public Class<?> getMappedClass() {
+		return BusinessRequestContext.class;
+	}
+
+	@Override
+	public void map(Object o, PepRequest pepRequest) {
+		BusinessRequestContext bc = (BusinessRequestContext)o;
+		PepRequestAttributes envAttributes = pepRequest.getPepRequestAttributes(XACML3.ID_ATTRIBUTE_CATEGORY_ENVIRONMENT);
+		envAttributes.addAttribute("jpmc:request-context:country", bc.getRequestCountry());
+		envAttributes.addAttribute("jpmc:request-context:time", bc.getRequestTime());
+	}
+
+	@Override
+	public void setMapperRegistry(MapperRegistry mapperRegistry) {
+		this.mapperRegistry = mapperRegistry;
+	}
+
+	@Override
+	public void setPepConfig(PepConfig pepConfig) {
+		this.pepConfig = pepConfig;
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-openaz/blob/94fcdd90/openaz-pep/src/test/java/org/openliberty/openaz/pepapi/std/test/mapper/Client.java
----------------------------------------------------------------------
diff --git a/openaz-pep/src/test/java/org/openliberty/openaz/pepapi/std/test/mapper/Client.java b/openaz-pep/src/test/java/org/openliberty/openaz/pepapi/std/test/mapper/Client.java
new file mode 100755
index 0000000..9c2ca08
--- /dev/null
+++ b/openaz-pep/src/test/java/org/openliberty/openaz/pepapi/std/test/mapper/Client.java
@@ -0,0 +1,20 @@
+package org.openliberty.openaz.pepapi.std.test.mapper;
+
+public class Client {
+	
+	private final String name;
+	
+	private final String countryOfDomicile;
+	
+	public Client(String name, String countryOfDomicile){
+		this.name = name;
+		this.countryOfDomicile = countryOfDomicile;
+	}
+
+	public String getName() {
+		return name;
+	}
+	public String getCountryOfDomicile() {
+		return countryOfDomicile;
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-openaz/blob/94fcdd90/openaz-pep/src/test/java/org/openliberty/openaz/pepapi/std/test/mapper/ClientMapper.java
----------------------------------------------------------------------
diff --git a/openaz-pep/src/test/java/org/openliberty/openaz/pepapi/std/test/mapper/ClientMapper.java b/openaz-pep/src/test/java/org/openliberty/openaz/pepapi/std/test/mapper/ClientMapper.java
new file mode 100755
index 0000000..b482a44
--- /dev/null
+++ b/openaz-pep/src/test/java/org/openliberty/openaz/pepapi/std/test/mapper/ClientMapper.java
@@ -0,0 +1,34 @@
+package org.openliberty.openaz.pepapi.std.test.mapper;
+
+import com.att.research.xacml.api.XACML3;
+import org.openliberty.openaz.pepapi.*;
+
+public class ClientMapper implements ObjectMapper {
+
+	private MapperRegistry mapperRegistry;
+
+	private PepConfig pepConfig;
+	
+	@Override
+	public Class<?> getMappedClass() {
+		return Client.class;
+	}
+
+	@Override
+	public void map(Object o, PepRequest pepRequest) {
+		Client c = (Client)o;
+		PepRequestAttributes resAttributes = pepRequest.getPepRequestAttributes(XACML3.ID_ATTRIBUTE_CATEGORY_RESOURCE);
+		resAttributes.addAttribute("jpmc:client:name", c.getName());
+		resAttributes.addAttribute("jpmc:client:country-of-domicile", c.getCountryOfDomicile());
+	}
+
+	@Override
+	public void setMapperRegistry(MapperRegistry mapperRegistry) {
+		this.mapperRegistry = mapperRegistry;
+	}
+
+	@Override
+	public void setPepConfig(PepConfig pepConfig) {
+		this.pepConfig = pepConfig;
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-openaz/blob/94fcdd90/openaz-pep/src/test/java/org/openliberty/openaz/pepapi/std/test/mapper/Document.java
----------------------------------------------------------------------
diff --git a/openaz-pep/src/test/java/org/openliberty/openaz/pepapi/std/test/mapper/Document.java b/openaz-pep/src/test/java/org/openliberty/openaz/pepapi/std/test/mapper/Document.java
new file mode 100755
index 0000000..cd36245
--- /dev/null
+++ b/openaz-pep/src/test/java/org/openliberty/openaz/pepapi/std/test/mapper/Document.java
@@ -0,0 +1,32 @@
+package org.openliberty.openaz.pepapi.std.test.mapper;
+
+public class Document {
+	
+	private final Integer documentId;
+	private final String documentName;
+	private final String clientName;
+	private final String documentOwner;
+	
+	public Document(Integer documentId, String documentName, String clientName, String documentOwner){
+		this.documentId = documentId;
+		this.documentName = documentName;
+		this.clientName = clientName;
+		this.documentOwner = documentOwner;
+	}
+	
+	public Integer getDocumentId() {
+		return documentId;
+	}
+	
+	public String getDocumentName() {
+		return documentName;
+	}
+	
+	public String getDocumentOwner() {
+		return documentOwner;
+	}
+
+	public String getClientName() {
+		return clientName;
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-openaz/blob/94fcdd90/openaz-pep/src/test/java/org/openliberty/openaz/pepapi/std/test/mapper/DocumentMapper.java
----------------------------------------------------------------------
diff --git a/openaz-pep/src/test/java/org/openliberty/openaz/pepapi/std/test/mapper/DocumentMapper.java b/openaz-pep/src/test/java/org/openliberty/openaz/pepapi/std/test/mapper/DocumentMapper.java
new file mode 100755
index 0000000..498d3ee
--- /dev/null
+++ b/openaz-pep/src/test/java/org/openliberty/openaz/pepapi/std/test/mapper/DocumentMapper.java
@@ -0,0 +1,37 @@
+package org.openliberty.openaz.pepapi.std.test.mapper;
+
+import com.att.research.xacml.api.XACML3;
+import org.openliberty.openaz.pepapi.*;
+
+public class DocumentMapper implements ObjectMapper {
+
+	private MapperRegistry mapperRegistry;
+
+	private PepConfig pepConfig;
+	
+	@Override
+	public Class<?> getMappedClass() {
+		return Document.class;
+	}
+
+	@Override
+	public void map(Object o, PepRequest pepRequest) {
+		Document d = (Document)o;
+		PepRequestAttributes resourceAttributes = pepRequest.getPepRequestAttributes(XACML3.ID_ATTRIBUTE_CATEGORY_RESOURCE);
+		resourceAttributes.addAttribute("urn:oasis:names:tc:xacml:1.0:resource:resource-id", d.getDocumentId());
+		resourceAttributes.addAttribute("urn:oasis:names:tc:xacml:1.0:resource:resource-type", "Document");
+		resourceAttributes.addAttribute("jpmc:document:document-name", d.getDocumentName());
+		resourceAttributes.addAttribute("jpmc:document:client-name", d.getClientName());
+		resourceAttributes.addAttribute("jpmc:document:document-owner", d.getDocumentOwner());
+	}
+
+	@Override
+	public void setMapperRegistry(MapperRegistry mapperRegistry) {
+		this.mapperRegistry = mapperRegistry;
+	}
+
+	@Override
+	public void setPepConfig(PepConfig pepConfig) {
+		this.pepConfig = pepConfig;
+	}
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-openaz/blob/94fcdd90/openaz-pep/src/test/java/org/openliberty/openaz/pepapi/std/test/mapper/MedicalRecord.java
----------------------------------------------------------------------
diff --git a/openaz-pep/src/test/java/org/openliberty/openaz/pepapi/std/test/mapper/MedicalRecord.java b/openaz-pep/src/test/java/org/openliberty/openaz/pepapi/std/test/mapper/MedicalRecord.java
new file mode 100755
index 0000000..6a7b317
--- /dev/null
+++ b/openaz-pep/src/test/java/org/openliberty/openaz/pepapi/std/test/mapper/MedicalRecord.java
@@ -0,0 +1,37 @@
+package org.openliberty.openaz.pepapi.std.test.mapper;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class MedicalRecord {
+	
+	private String id;
+	
+	private List<String> accessUserGroup;
+	
+	public MedicalRecord(String id){
+		this.id = id;
+		accessUserGroup = new ArrayList<String>();
+	}
+
+	public String getId() {
+		return id;
+	}
+
+	public void setId(String id) {
+		this.id = id;
+	}
+
+	public List<String> getAccessUserGroup() {
+		return accessUserGroup;
+	}
+
+	public void setAccessUserGroup(List<String> accessUserGroup) {
+		this.accessUserGroup = accessUserGroup;
+	}
+	
+	public void addUserToAccessGroup(String user) {
+		this.accessUserGroup.add(user);
+	}
+	
+}

http://git-wip-us.apache.org/repos/asf/incubator-openaz/blob/94fcdd90/openaz-pep/src/test/java/org/openliberty/openaz/pepapi/std/test/mapper/MedicalRecordMapper.java
----------------------------------------------------------------------
diff --git a/openaz-pep/src/test/java/org/openliberty/openaz/pepapi/std/test/mapper/MedicalRecordMapper.java b/openaz-pep/src/test/java/org/openliberty/openaz/pepapi/std/test/mapper/MedicalRecordMapper.java
new file mode 100755
index 0000000..9882d30
--- /dev/null
+++ b/openaz-pep/src/test/java/org/openliberty/openaz/pepapi/std/test/mapper/MedicalRecordMapper.java
@@ -0,0 +1,36 @@
+package org.openliberty.openaz.pepapi.std.test.mapper;
+
+import com.att.research.xacml.api.XACML3;
+import org.openliberty.openaz.pepapi.*;
+
+public class MedicalRecordMapper implements ObjectMapper {
+
+	private MapperRegistry mapperRegistry;
+
+	private PepConfig pepConfig;
+
+	@Override
+	public Class<?> getMappedClass() {
+		return MedicalRecord.class;
+	}
+
+	@Override
+	public void map(Object o, PepRequest pepRequest) {
+		MedicalRecord md = (MedicalRecord) o;
+		PepRequestAttributes resourceAttributes = pepRequest.getPepRequestAttributes(XACML3.ID_ATTRIBUTE_CATEGORY_RESOURCE);
+		resourceAttributes.addAttribute("urn:oasis:names:tc:xacml:1.0:resource:resource-type", "PatientMedicalRecord");
+		resourceAttributes.addAttribute("urn:oasis:names:tc:xacml:1.0:resource:resource-id", md.getId());
+		for(String accessUser: md.getAccessUserGroup()) {
+			resourceAttributes.addAttribute("urn:oasis:names:tc:xacml:1.0:resource:resource-access-group", accessUser);
+		}
+	}
+	@Override
+	public void setMapperRegistry(MapperRegistry mapperRegistry) {
+		this.mapperRegistry = mapperRegistry;
+	}
+
+	@Override
+	public void setPepConfig(PepConfig pepConfig) {
+		this.pepConfig = pepConfig;
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-openaz/blob/94fcdd90/openaz-pep/src/test/java/org/openliberty/openaz/pepapi/std/test/obligation/AccessRestrictionObligationHandler.java
----------------------------------------------------------------------
diff --git a/openaz-pep/src/test/java/org/openliberty/openaz/pepapi/std/test/obligation/AccessRestrictionObligationHandler.java b/openaz-pep/src/test/java/org/openliberty/openaz/pepapi/std/test/obligation/AccessRestrictionObligationHandler.java
new file mode 100755
index 0000000..2fd5b9a
--- /dev/null
+++ b/openaz-pep/src/test/java/org/openliberty/openaz/pepapi/std/test/obligation/AccessRestrictionObligationHandler.java
@@ -0,0 +1,56 @@
+package org.openliberty.openaz.pepapi.std.test.obligation;
+
+import junit.framework.Assert;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.openliberty.openaz.pepapi.Obligation;
+import org.openliberty.openaz.pepapi.ObligationHandler;
+import org.openliberty.openaz.pepapi.ObligationStore;
+
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
+
+
+public class AccessRestrictionObligationHandler implements ObligationHandler {
+	
+	private static Log log = LogFactory.getLog(AccessRestrictionObligationHandler.class);
+	
+	private ObligationStore obligationStore;
+	
+	public void enforce() {
+		Set<Obligation> accessOblgSet = obligationStore.getHandlerObligations(this.getClass());
+		Assert.assertEquals(true, accessOblgSet.size() == 1);
+		for(Obligation oblg: accessOblgSet) {
+			Map<String, Object[]> attributeMap = oblg.getAttributeMap();
+			Assert.assertNotNull(attributeMap);
+			for(Entry<String, Object[]> e: attributeMap.entrySet()){
+				if(e.getKey().equals("urn:oasis:names:tc:xacml:1.0:subject:subject-id")){
+					Assert.assertNotNull(e.getValue());
+				}
+				if(e.getKey().equals("urn:oasis:names:tc:xacml:1.0:resource:resource-access-group")){
+					Object[] values = e.getValue();
+					Assert.assertNotNull(values);
+					Assert.assertEquals(3, values.length);
+				}
+			}
+		}
+		Obligation accessGroupOblg = obligationStore.getHandlerObligationById(
+				this.getClass(),
+				"urn:oasis:names:tc:xacml:2.0:obligation:access-restriction");
+		Assert.assertNotNull(accessGroupOblg);
+		log.info(accessGroupOblg.getId());
+	}
+	
+	@Override
+	public boolean match(Obligation obligation) {
+		return obligation.getId().
+				equals("urn:oasis:names:tc:xacml:2.0:obligation:access-restriction");
+	}
+
+	@Override
+	public void setObligationStore(ObligationStore oStore) {
+		this.obligationStore = oStore;
+	}
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-openaz/blob/94fcdd90/openaz-pep/src/test/java/org/openliberty/openaz/pepapi/std/test/obligation/AgeRestrictionObligationHandler.java
----------------------------------------------------------------------
diff --git a/openaz-pep/src/test/java/org/openliberty/openaz/pepapi/std/test/obligation/AgeRestrictionObligationHandler.java b/openaz-pep/src/test/java/org/openliberty/openaz/pepapi/std/test/obligation/AgeRestrictionObligationHandler.java
new file mode 100755
index 0000000..6239412
--- /dev/null
+++ b/openaz-pep/src/test/java/org/openliberty/openaz/pepapi/std/test/obligation/AgeRestrictionObligationHandler.java
@@ -0,0 +1,52 @@
+package org.openliberty.openaz.pepapi.std.test.obligation;
+
+import junit.framework.Assert;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.openliberty.openaz.pepapi.Obligation;
+import org.openliberty.openaz.pepapi.ObligationHandler;
+import org.openliberty.openaz.pepapi.ObligationStore;
+import org.openliberty.openaz.pepapi.std.test.util.HasResult;
+
+import java.util.Map;
+import java.util.Set;
+
+public class AgeRestrictionObligationHandler implements ObligationHandler, HasResult {
+	
+	private static Log log = LogFactory.getLog(AgeRestrictionObligationHandler.class);
+	
+	private ObligationStore obligationStore;
+	
+	public String enforce() {
+		Set<Obligation> ageOblgSet = obligationStore.getHandlerObligations(this.getClass());
+		Assert.assertEquals(true, ageOblgSet.size() == 1);
+		Obligation ageOblg = obligationStore.getHandlerObligationById(this.getClass(),
+				"urn:oasis:names:tc:xacml:2.0:obligation:age-restriction");
+		Assert.assertNotNull(ageOblg);
+		String value = null;
+		log.info(ageOblg.getId());
+		//Enforcement Logic
+		Map<String, Object[]> attributeMap = ageOblg.getAttributeMap();
+		Object[] values = attributeMap.get("urn:oasis:names:tc:xacml:1.0:subject:age");
+		if(values != null) {
+			value = (String)values[0];
+		}
+		return value;
+	}
+
+	@Override
+	public boolean match(Obligation obligation) {
+		return obligation.getId().
+				equals("urn:oasis:names:tc:xacml:2.0:obligation:age-restriction");
+	}
+
+	@Override
+	public void setObligationStore(ObligationStore obligationStore) {
+		this.obligationStore = obligationStore;
+	}
+
+	@Override
+	public String getResult() {
+		return enforce();
+	}
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-openaz/blob/94fcdd90/openaz-pep/src/test/java/org/openliberty/openaz/pepapi/std/test/obligation/AnnotatedAccessRestrictionObligationHandler.java
----------------------------------------------------------------------
diff --git a/openaz-pep/src/test/java/org/openliberty/openaz/pepapi/std/test/obligation/AnnotatedAccessRestrictionObligationHandler.java b/openaz-pep/src/test/java/org/openliberty/openaz/pepapi/std/test/obligation/AnnotatedAccessRestrictionObligationHandler.java
new file mode 100755
index 0000000..d717acb
--- /dev/null
+++ b/openaz-pep/src/test/java/org/openliberty/openaz/pepapi/std/test/obligation/AnnotatedAccessRestrictionObligationHandler.java
@@ -0,0 +1,44 @@
+package org.openliberty.openaz.pepapi.std.test.obligation;
+
+import junit.framework.Assert;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.openliberty.openaz.pepapi.Obligation;
+import org.openliberty.openaz.pepapi.ObligationStore;
+import org.openliberty.openaz.pepapi.ObligationStoreAware;
+import org.openliberty.openaz.pepapi.MatchAnyObligation;
+
+import java.util.Map.Entry;
+
+@MatchAnyObligation("urn:oasis:names:tc:xacml:2.0:obligation:access-restriction")
+public class AnnotatedAccessRestrictionObligationHandler implements ObligationStoreAware {
+	
+	private static Log log = LogFactory.getLog(AnnotatedAccessRestrictionObligationHandler.class);
+	
+	private ObligationStore obligationStore;
+	
+	public void enforce() {
+		Obligation accessGroupOblg = obligationStore.getHandlerObligationById(
+				this.getClass(),
+				"urn:oasis:names:tc:xacml:2.0:obligation:access-restriction");
+		Assert.assertEquals("urn:oasis:names:tc:xacml:2.0:obligation:access-restriction", 
+				accessGroupOblg.getId());
+		log.info(accessGroupOblg.getId());
+		for(Entry<String, Object[]> e: accessGroupOblg.getAttributeMap().entrySet()){
+			if(e.getKey().equals("urn:oasis:names:tc:xacml:1.0:subject:subject-id")){
+				Assert.assertNotNull(e.getValue());
+			}
+			if(e.getKey().equals("urn:oasis:names:tc:xacml:1.0:resource:resource-access-group")){
+				Object[] values = e.getValue();
+				Assert.assertNotNull(values);
+				Assert.assertEquals(3, values.length);
+			}
+		}
+		//Enforcement Logic
+	}
+
+	@Override
+	public void setObligationStore(ObligationStore obligationStore) {
+		this.obligationStore = obligationStore;
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-openaz/blob/94fcdd90/openaz-pep/src/test/java/org/openliberty/openaz/pepapi/std/test/obligation/AnnotatedAgeRestrictionObligationHandler.java
----------------------------------------------------------------------
diff --git a/openaz-pep/src/test/java/org/openliberty/openaz/pepapi/std/test/obligation/AnnotatedAgeRestrictionObligationHandler.java b/openaz-pep/src/test/java/org/openliberty/openaz/pepapi/std/test/obligation/AnnotatedAgeRestrictionObligationHandler.java
new file mode 100755
index 0000000..9a10cfc
--- /dev/null
+++ b/openaz-pep/src/test/java/org/openliberty/openaz/pepapi/std/test/obligation/AnnotatedAgeRestrictionObligationHandler.java
@@ -0,0 +1,46 @@
+package org.openliberty.openaz.pepapi.std.test.obligation;
+
+import junit.framework.Assert;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.openliberty.openaz.pepapi.Obligation;
+import org.openliberty.openaz.pepapi.ObligationStore;
+import org.openliberty.openaz.pepapi.ObligationStoreAware;
+import org.openliberty.openaz.pepapi.MatchAnyObligation;
+import org.openliberty.openaz.pepapi.std.test.util.HasResult;
+
+import java.util.Map;
+
+@MatchAnyObligation("urn:oasis:names:tc:xacml:2.0:obligation:age-restriction")
+public class AnnotatedAgeRestrictionObligationHandler implements ObligationStoreAware, HasResult {
+	
+	private static Log log = LogFactory.getLog(AnnotatedAgeRestrictionObligationHandler.class);
+	
+	private ObligationStore obligationStore;
+	
+	public String enforce() {
+		Obligation ageOblg = obligationStore.getHandlerObligationById(
+				this.getClass(),
+				"urn:oasis:names:tc:xacml:2.0:obligation:age-restriction");
+		String value = null;
+		Assert.assertEquals("urn:oasis:names:tc:xacml:2.0:obligation:age-restriction", ageOblg.getId());
+		log.info(ageOblg.getId());
+		//Enforcement Logic
+		Map<String, Object[]> attributeMap = ageOblg.getAttributeMap();
+		Object[] values = attributeMap.get("urn:oasis:names:tc:xacml:1.0:subject:age");
+		if(values != null) {
+			value = (String)values[0];
+		}
+		return value;
+	}
+
+	@Override
+	public void setObligationStore(ObligationStore obligationStore) {
+		this.obligationStore = obligationStore;
+	}
+
+	@Override
+	public String getResult() {
+		return enforce();
+	}
+}
\ No newline at end of file