Domain Reference Material

Domain Design in XML Format

The CZS-sales-Domain.xml file defines a Domain that returns data from the sales_fact_2006 table stored in a MySQL database. It includes the three fields that CZS is interested in displaying, as well as the data that corresponds to the profile attributes described in the security file.

<schema xmlns="http://www.jaspersoft.com/2007/SL/XMLSchema" version="1.0">
  <itemGroups>
    <itemGroup description="Product family and department" descriptionId=""
      id="Products" label="Products" labelId="" resourceId="JoinTree_1">
      <items>
        <item description="Family" descriptionId="" id="Family" label="Family"
          labelId="" resourceId="JoinTree_1.product_class.product_family" />
        <item description="Department" descriptionId="" id="Department"
          label="Department" labelId=""
          resourceId="JoinTree_1.product_class.product_department" />
      </items>
    </itemGroup>
    <itemGroup description="Geography" descriptionId="" id="Geography"
      label="Geography" labelId="" resourceId="JoinTree_1">
      <items>
        <item description="City" descriptionId="" id="City" label="City" labelId=""
          resourceId="JoinTree_1.store.store_city" />
        <item description="Country" descriptionId="" id="Country" label="Country"
          labelId="" resourceId="JoinTree_1.store.store_country" />
        <item description="State" descriptionId="" id="State" label="State"
          labelId="" resourceId="JoinTree_1.store.store_state" />
      </items>
    </itemGroup>
    <itemGroup description="Sales Data" descriptionId="" id="SalesData" label="Sales
      Data" labelId="" resourceId="JoinTree_1">
      <items>
        <item description="Store Cost" descriptionId="" id="StoreCost" label="Store
          Cost" labelId="" resourceId="JoinTree_1.sales_fact_2006.store_cost" />
        <item description="Store Sales" descriptionId="" id="StoreSales" label="Store
          Sales" labelId="" resourceId="JoinTree_1.sales_fact_2006.store_sales" />
        <item description="Unit Sales" descriptionId="" id="UnitSales" label="Unit
          Sales" labelId="" resourceId="JoinTree_1.sales_fact_2006.unit_sales" />
      </items>
    </itemGroup>
  </itemGroups>
<resources>
  <jdbcTable datasourceId="czsdata" id="product" tableName="product">
    <fieldList>
      <field id="brand_name" type="java.lang.String" />
      <field id="gross_weight" type="java.lang.Double" />
      <field id="net_weight" type="java.lang.Double" />
      <field id="product_class_id" type="java.lang.Integer" />
      <field id="product_id" type="java.lang.Integer" />
      <field id="product_name" type="java.lang.String" />
      <field id="recyclable_package" type="java.lang.Boolean" />
      <field id="shelf_depth" type="java.lang.Double" />
      <field id="shelf_height" type="java.lang.Double" />
      <field id="shelf_width" type="java.lang.Double" />
      <field id="SKU" type="java.lang.Long" />
      <field id="SRP" type="java.math.BigDecimal" />
      <field id="units_per_case" type="java.lang.Short" />
    </fieldList>
  </jdbcTable>
  <jdbcTable datasourceId="czsdata" id="product_class" tableName="product_class">
    <fieldList>
      <field id="product_category" type="java.lang.String" />
      <field id="product_class_id" type="java.lang.Integer" />
      <field id="product_department" type="java.lang.String" />
      <field id="product_family" type="java.lang.String" />
      <field id="product_subcategory" type="java.lang.String" />
    </fieldList>
  </jdbcTable>
  <jdbcTable datasourceId="czsdata" id="product" tableName="product">
    <fieldList>
      <field id="brand_name" type="java.lang.String" />
      <field id="gross_weight" type="java.lang.Double" />
      <field id="net_weight" type="java.lang.Double" />
      <field id="product_class_id" type="java.lang.Integer" />
      <field id="product_id" type="java.lang.Integer" />
      <field id="product_name" type="java.lang.String" />
      <field id="recyclable_package" type="java.lang.Boolean" />
      <field id="shelf_depth" type="java.lang.Double" />
      <field id="shelf_height" type="java.lang.Double" />
      <field id="shelf_width" type="java.lang.Double" />
      <field id="SKU" type="java.lang.Long" />
      <field id="SRP" type="java.math.BigDecimal" />
      <field id="units_per_case" type="java.lang.Short" />
    </fieldList>
  </jdbcTable>
  <jdbcTable datasourceId="czsdata" id="sales_fact_2006" 
    tableName="sales_fact_2006">
    <fieldList>
      <field id="customer_id" type="java.lang.Integer" />
      <field id="product_id" type="java.lang.Integer" />
      <field id="promotion_id" type="java.lang.Integer" />
      <field id="store_cost" type="java.math.BigDecimal" />
      <field id="store_id" type="java.lang.Integer" />
      <field id="store_sales" type="java.math.BigDecimal" />
      <field id="time_id" type="java.lang.Integer" />
      <field id="unit_sales" type="java.math.BigDecimal" />
    </fieldList>
  </jdbcTable>
  <jdbcTable datasourceId="czsdata" id="store" tableName="store">
    <fieldList>
      <field id="coffee_bar" type="java.lang.Boolean" />
      <field id="first_opened_date" type="java.sql.Timestamp" />
      <field id="last_remodel_date" type="java.sql.Timestamp" />
      <field id="region_id" type="java.lang.Integer" />
      <field id="store_city" type="java.lang.String" />
      <field id="store_country" type="java.lang.String" />
      <field id="store_fax" type="java.lang.String" />
      <field id="store_id" type="java.lang.Integer" />
      <field id="store_manager" type="java.lang.String" />
      <field id="store_name" type="java.lang.String" />
      <field id="store_number" type="java.lang.Integer" />
      <field id="store_phone" type="java.lang.String" />
      <field id="store_postal_code" type="java.lang.String" />
      <field id="store_sqft" type="java.lang.Integer" />
      <field id="store_state" type="java.lang.String" />
      <field id="store_street_address" type="java.lang.String" />
      <field id="store_type" type="java.lang.String" />
      <field id="video_store" type="java.lang.Boolean" />
    </fieldList>
  </jdbcTable>
  <jdbcTable datasourceId="czsdata" id="JoinTree_1" tableName="product">
    <fieldList>
      <field id="product_class.product_category" type="java.lang.String" />
      <field id="product_class.product_class_id" type="java.lang.Integer" />
      <field id="product_class.product_department" type="java.lang.String" />
      <field id="product_class.product_family" type="java.lang.String" />
      <field id="product_class.product_subcategory" type="java.lang.String" />
      <field id="sales_fact_2006.customer_id" type="java.lang.Integer" />
      <field id="sales_fact_2006.product_id" type="java.lang.Integer" />
      <field id="sales_fact_2006.promotion_id" type="java.lang.Integer" />
      <field id="sales_fact_2006.store_cost" type="java.math.BigDecimal" />
      <field id="sales_fact_2006.promotion_id" type="java.lang.Integer" />
      <field id="sales_fact_2006.store_cost" type="java.math.BigDecimal" />
      <field id="sales_fact_2006.store_id" type="java.lang.Integer" />
      <field id="sales_fact_2006.store_sales" type="java.math.BigDecimal" />
      <field id="sales_fact_2006.time_id" type="java.lang.Integer" />
      <field id="sales_fact_2006.unit_sales" type="java.math.BigDecimal" />
      <field id="product.brand_name" type="java.lang.String" />
      <field id="product.gross_weight" type="java.lang.Double" />
      <field id="product.net_weight" type="java.lang.Double" />
      <field id="product.product_class_id" type="java.lang.Integer" />
      <field id="product.product_id" type="java.lang.Integer" />
      <field id="product.product_name" type="java.lang.String" />
      <field id="product.recyclable_package" type="java.lang.Boolean" />
      <field id="product.shelf_depth" type="java.lang.Double" />
      <field id="product.shelf_height" type="java.lang.Double" />
      <field id="product.shelf_width" type="java.lang.Double" />
      <field id="product.SKU" type="java.lang.Long" />
      <field id="product.SRP" type="java.math.BigDecimal" />
      <field id="product.units_per_case" type="java.lang.Short" />
      <field id="store.coffee_bar" type="java.lang.Boolean" />
      <field id="store.first_opened_date" type="java.sql.Timestamp" />
      <field id="store.grocery_sqft" type="java.lang.Integer" />
      <field id="store.last_remodel_date" type="java.sql.Timestamp" />
      <field id="store.meat_sqft" type="java.lang.Integer" />
      <field id="store.region_id" type="java.lang.Integer" />
      <field id="store.store_city" type="java.lang.String" />
      <field id="store.store_country" type="java.lang.String" />
      <field id="store.store_fax" type="java.lang.String" />
      <field id="store.store_id" type="java.lang.Integer" />
      <field id="store.store_manager" type="java.lang.String" />
      <field id="store.store_name" type="java.lang.String" />
      <field id="store.store_number" type="java.lang.Integer" />
      <field id="store.store_phone" type="java.lang.String" />
      <field id="store.store_postal_code" type="java.lang.String" />
      <field id="store.store_sqft" type="java.lang.Integer" />
      <field id="store.store_state" type="java.lang.String" />
      <field id="store.store_street_address" type="java.lang.String" />
      <field id="store.store_type" type="java.lang.String" />
      <field id="store.video_store" type="java.lang.Boolean" />
    </fieldList>
    <joinInfo alias="product" referenceId="product" />
      <joinedDataSetList>
        <joinedDataSetRef>
          <joinString>join product_class product_class on (product.product_class_id
            == product_class.product_class_id) />
        </joinedDataSetRef>
        <joinedDataSetRef>
          <joinString>join sales_fact_2006 sales_fact_2006 on (product.product_id ==
            sales_fact_2006.product_id) />
        </joinedDataSetRef>
        <joinedDataSetRef>
          <joinString>join store store on (sales_fact_2006.store_id ==
            store.store_id) />
        </joinedDataSetRef>
      </joinedDataSetList>
    </jdbcTable>
  </resources>
</schema>

Domain Security File

The CZS-sales-security.xml file is based on the CZS-sales-domain.xml Domain design file, and defines access for users with Cities and ProductDepartment profile attributes.

<securityDefinition xmlns="http://www.jaspersoft.com/2007/SL/XMLSchema" version="1.0" itemGroupDefaultAccess="granted">
<resourceAccessGrants>
  <!-- Row level security -->  
  <!-- What access do roles/users have to the rows in the resource? -->
  <resourceAccessGrantList id="JoinTree_1_List" label="ListLabel"
    resourceId="JoinTree_1">
    <resourceAccessGrants>    
      <!-- Row level for Cities -->
      <resourceAccessGrant id="Jointree_1_row_access_grant_20">
        <principalExpression><![CDATA[authentication.principal.attributes.any 
          {it.attrName in ['Cities'] }]]></principalExpression>
        <filterExpression>testProfileAttribute(store.store_city,'Cities')
        </filterExpression>
      </resourceAccessGrant>
      <!-- Row level for Product Dept -->
      <resourceAccessGrant id="Jointree_1_row_access_grant_30"> 
        <principalExpression><![CDATA[authentication.getPrincipal().getAttributes().any
          {it.getAttrName() in ['ProductDepartment'] }]]></principalExpression>
        <filterExpression>testProfileAttribute(product_class.product_department,
          'ProductDepartment')</filterExpression>
      </resourceAccessGrant> 
    </resourceAccessGrants>    
  </resourceAccessGrantList>
</resourceAccessGrants>
  <!-- Column level security -->
  <!-- What access do roles/users have to the fields in an item group? -->
  <itemGroupAccessGrants>
    <itemGroupAccessGrantList id="restrict_Jointree_1_item_group_Sales" label="aLabel"
      itemGroupId="SalesData" defaultAccess="denied">
      <itemGroupAccessGrants>
        <!-- Column level for managers and admin -->
        <itemGroupAccessGrant id="Jointree1_item_group_access_grant_1" access="granted">
          <principalExpression>authentication.getPrincipal().getRoles().any
            { it.getRoleName() in ['ROLE_ADMINISTRATOR','ROLE_SALES_MANAGER'] }
            </principalExpression>
        </itemGroupAccessGrant>
        <!-- Column level for sales reps -->
        <itemGroupAccessGrant id="Jointree_1_item_group_access_grant_2" 
          access="granted">
            <principalExpression>authentication.getPrincipal().getRoles().any
              { it.getRoleName() in ['ROLE_SALES_REP'] }</principalExpression>
          <itemAccessGrantList id="Jointree_1_grant2_item_group_items"
            defaultAccess="denied">
            <itemAccessGrants>
              <itemAccessGrant id="Jointree_1_grant2_items_grant1" itemId="StoreSales" 
                access="granted" />
              <itemAccessGrant id="Jointree_1_grant2_items_grant2" itemId="UnitSales" 
                access="granted" />
            </itemAccessGrants>
          </itemAccessGrantList>
        </itemGroupAccessGrant>
      </itemGroupAccessGrants>
    </itemGroupAccessGrantList>
   </itemGroupAccessGrants>
</securityDefinition>

Feedback
randomness