Cachespec.xml

We used the following cachespec.xml file for all our testing.

<?xml version="1.0"?>
<!DOCTYPE cache SYSTEM "cachespec.dtd">

<!--
     DynaCache specification for WebSphere performance application.
     Trade provides a sample application for DynaCache usage and configuration.
    -->
<cache>
	<cache-entry>
      	<class>servlet</class>
      	<name>/app</name>   

<!-- Cacheid and dependency-id for the Portfolio page. This page is invalidated 
     when a stock buy/sell order has been
		completed. -->
	 	<cache-id>
			<component id="action" type="parameter">
				<value>portfolio</value>			
				<required>true</required>
			</component>			
			<component id="JSESSIONID" type="cookie">
				<required>true</required>
			</component>			
			<property name="EdgeCacheable">true</property>
		</cache-id>
		<!-- Special case for TradeScenarioServlet to invoke Portfolio and DynaCache not 
           to return an ESI include
		     but actually invoke the portfolio operation
		-->
	 	<cache-id>
			<component id="action" type="parameter">
				<value>portfolioNoEdge</value>			
				<required>true</required>
			</component>			
			<component id="JSESSIONID" type="cookie">
				<required>true</required>
			</component>			
			<property name="EdgeCacheable">false</property>
		</cache-id>

	<!-- Dependency-id for the portfolio page -->			  	
		<dependency-id>Holdings_UserID
                  <component id="action" type="parameter" ignore-value="true">
				<value>portfolio</value>
				<required>true</required>
			</component>
			<component id="uidBean" type="session">
				<required>true</required>
			</component>
		</dependency-id>		
				
	<!-- This dependency id is to invalidate the portfolio page when the user is 
        logged out.	The account and home pages are invalidated when the user is 
        logged out based on the dependency id Account_UserID -->

		 <dependency-id>Holdings_UserID1
                  <component id="action" type="parameter" ignore-value="true">
				<value>portfolio</value>
				<required>true</required>
			</component>
			<component id="uidBean" type="session">
				<required>true</required>
			</component>
		</dependency-id>	
		
        <dependency-id>Holdings_UserID
			<component id="action" type="parameter" ignore-value="true">
				<value>portfolioNoEdge</value>			
				<required>true</required>
			</component>			
			<component id="uidBean" type="session">
				<required>true</required>
			</component>	
		</dependency-id>									

<!-- Cacheid and dependency id for the Account page. This page is invalidated 
     when the account profile has been updated or a stock buy/sell order has 
     been completed. -->
		<cache-id>
			<component id="action" type="parameter">
				<value>account</value>
				<required>true</required>
			</component>			
			<component id="JSESSIONID" type="cookie">
				<required>true</required>
			</component>						
			<property name="EdgeCacheable">true</property>
		</cache-id>

		 <!-- Dependency-id for the account page -->			  	
		<dependency-id>Account_UserID
                  <component id="action" type="parameter" ignore-value="true">
				<value>account</value>
				<required>true</required>
			</component>
			<component id="uidBean" type="session">
				<required>true</required>
			</component>
		</dependency-id>

		<dependency-id>AccountProfile_UserID
                  <component id="action" type="parameter" ignore-value="true">
				<value>account</value>
				<required>true</required>
			</component>
			<component id="uidBean" type="session">
				<required>true</required>
			</component>
		</dependency-id>
     
		
<!-- Cache id for the Trade Home page. This page is invalidated when ever there is a 
     change in the account information or the holdings information -->
		<cache-id>
			<component id="action" type="parameter">
				<value>home</value>
				<required>true</required>
			</component>			
			<component id="JSESSIONID" type="cookie">
				<required>true</required>
			</component>	
			<property name="EdgeCacheable">true</property>				
		</cache-id>	
		<dependency-id>Account_UserID
                  <component id="action" type="parameter" ignore-value="true">
				<value>home</value>
				<required>true</required>
			</component>
			<component id="uidBean" type="session">
				<required>true</required>
			</component>
		</dependency-id>
		<dependency-id>Holdings_UserID
                  <component id="action" type="parameter" ignore-value="true">
				<value>home</value>
				<required>true</required>
			</component>
			<component id="uidBean" type="session">
				<required>true</required>
			</component>
		</dependency-id>	

<!-- Cache entry for the quotes page. This page will be invalidated whenever a 
     quote of a symbol is invalidated -->
    		<cache-id>
			<component id="action" type="parameter">
				<value>quotes</value>
				<required>true</required>
			</component>			
			<component id="symbols" type="parameter">
				<required>true</required>
			</component>
			<property name="EdgeCacheable">true</property>
		</cache-id>	

            <dependency-id>AllQuotes
			<component id="action" type="parameter" ignore-value="true">
				<value>quotes</value>
				<required>true</required>
			</component>			
		</dependency-id>	

    		<dependency-id>Quote_Symbol
			<component id="action" type="parameter" ignore-value="true">
				<value>quotes</value>
				<required>true</required>
               </component>
                <component id="symbol" type="parameter">
                     <required>true</required>
              </component>			
		</dependency-id>	
    </cache-entry>

 
	
  

<!-- Cache entry for register.jsp which is included in the the Welcome.jsp -->
    <cache-entry>
		<class>servlet</class>
		<name>/register.jsp</name>
		<property name="EdgeCacheable">true</property>		
		<cache-id>
			<timeout>180</timeout>
		</cache-id>
     </cache-entry>

<!-- Cache entry for marketSummary.jsp. This jsp gets invalidated on a 
     timeout as well as when Trade database is reset -->
   	<cache-entry>
		<class>servlet</class>
		<name>/marketSummary.jsp</name>
		<property name="EdgeCacheable">true</property>
		<cache-id>
			<priority>3</priority>
			<timeout>180</timeout>
		</cache-id>
		<dependency-id>MarketSummary
		</dependency-id>
	</cache-entry>

<!-- Cache entry for displayQuote.jsp. This page is invalidated for each 
     individual symbol when that symbol is updated with the 
     updateQuotePriceCommand -->
	
	<cache-entry>
		<class>servlet</class>		            
		<name>/displayQuote.jsp</name>
		<property name="EdgeCacheable">true</property>
		<cache-id>
			<component id="symbol" type="parameter">
				<required>true</required>
			</component>
			<priority>3</priority>
		</cache-id>

		<!-- This dependency id is setup to identify stocks by their symbol
		  -->		
		<dependency-id>Quote_Symbol
			<component id="symbol" type="parameter">
				<required>true</required>
			</component>
		</dependency-id>
		
		<!-- This dependency id is setup to identify all Quotes
		     for commands which invalidate all Quote entries
		  -->			
		<dependency-id>AllQuotes
		</dependency-id>		
	</cache-entry>

<!-- 
	 The MarketSummaryCommand is cached and invalidated on a timeout.
	 Time based invalidation is a simple, yet common usage for caching.
	-->
	<cache-entry>
		<class>command</class>
		<sharing-policy>not-shared</sharing-policy>
		<name>com.ibm.websphere.samples.trade.command.MarketSummaryCommand</name>		
		<cache-id>
			<priority>3</priority>
			<timeout>10</timeout>
		</cache-id>
		<dependency-id>MarketSummary
		</dependency-id>			
	</cache-entry>


<!--
	The QuoteCommand is used to cache Quote symbols and prices.
	QuoteCommands are invalidated for each individual symbol when that
	symbol is updated with the UpdateQuotePriceCommand
	-->

	<cache-entry>
		<class>command</class>
		<sharing-policy>not-shared</sharing-policy>
		<name>com.ibm.websphere.samples.trade.command.QuoteCommand</name>
		<cache-id>
			<component type="method" id="getSymbol">
				<required>true</required>
			</component>
			<priority>3</priority>
		</cache-id>

		<!-- This dependency id is setup to identify stocks by their symbol
		  -->		
		<dependency-id>Quote_Symbol
			<component id="getSymbol" type="method">
				<required>true</required>
			</component>
		</dependency-id>
		
		<!-- This dependency id is setup to identify all Quotes
		     for commands which invalidate all Quote entries
		  -->			
		<dependency-id>AllQuotes
		</dependency-id>		
	</cache-entry>

<!-- 
	The UpdateQuotePriceCommand is used to update the current price for 
	a stock symbol. This invalidates the QuoteCommand cache-entry above
	for the individual stock, identified by getSymbol. The getSymbol method
	ties this entry to the dependency id for the QuoteCommand cache-entry above
	-->		
	<cache-entry>	
		<class>command</class>
		<sharing-policy>not-shared</sharing-policy>
		<name>com.ibm.websphere.samples.trade.command.UpdateQuotePriceCommand</name>
	
		<invalidation>Quote_Symbol
			<component id="getSymbol" type="method">
				<required>true</required>
			</component>
		</invalidation>
	</cache-entry>
	
<!--
	The AccountCommand is used to cache a users Account information.
	AccountCommands are invalidated for each individual user when that
	users account information, such as their account balance, 
	is updated by a trading operation
	-->

	<cache-entry>
		<class>command</class>
		<sharing-policy>not-shared</sharing-policy>
		<name>com.ibm.websphere.samples.trade.command.AccountCommand</name>
		<cache-id>
			<component type="method" id="getUserID">
				<required>true</required>
			</component>
			<priority>3</priority>
		</cache-id>

		<!-- This dependency id is setup to identify user Accounts by the userID
		  -->		
		<dependency-id>Account_UserID
			<component id="getUserID" type="method">
				<required>true</required>
			</component>
		</dependency-id>

		<!-- This dependency id is setup to identify all user Accounts
		     for commands which invalidate all Account cache entries
		  -->			
		<dependency-id>AllUsers
		</dependency-id>		
	</cache-entry>

<!--
	The AccountProfileCommand is used to cache a users Account profile information.
	AccountProfileCommands are invalidated for each individual user when that
	users account profile information is updated by the UpdateAccountProfileCommand
	-->

	<cache-entry>
		<class>command</class>
		<sharing-policy>not-shared</sharing-policy>
		<name>com.ibm.websphere.samples.trade.command.AccountProfileCommand</name>
		<cache-id>
			<component type="method" id="getUserID">
				<required>true</required>
			</component>
			<priority>3</priority>
		</cache-id>

		<!-- This dependency id is setup to identify user Account Profiles by the userID
		  -->		
		<dependency-id>AccountProfile_UserID
			<component id="getUserID" type="method">
				<required>true</required>
			</component>
		</dependency-id>
		
		<!-- This dependency id is setup to identify all user Account
		     for commands which invalidate all Account Profile cache entries
		  -->			
		<dependency-id>AllUsers
		</dependency-id>				
		
	</cache-entry>

<!--
	The HoldingsCommand is used to cache a users Stock holdings information.
	HoldingCommands are invalidated for each individual user when that
	users holdings change due to an OrderCompletedCommand
	-->
	<cache-entry>
		<class>command</class>
		<sharing-policy>not-shared</sharing-policy>
		<name>com.ibm.websphere.samples.trade.command.HoldingsCommand</name>
		<cache-id>
			<component type="method" id="getUserID">
				<required>true</required>
			</component>
			<priority>3</priority>
		</cache-id>

		<!-- This dependency id is setup to identify user Accounts by the userID
		  -->		
		<dependency-id>Holdings_UserID
			<component id="getUserID" type="method">
				<required>true</required>
			</component>
		</dependency-id>
		
		<!-- This dependency id is setup to identify all user Accounts
		     for commands which invalidate all Account Holdings cache entries
		  -->			
		<dependency-id>AllUsers
		</dependency-id>				
		
	</cache-entry>

<!--
	The OrdersCommand is used to cache a users Orders information.
	OrdersCommands are invalidated for each individual user when that
	users enters a new order with a BuyCommand or SellCommand.
	The OrdersCommand is also invalidated when an order status is changed
	by the OrderCompletedCommand
	-->
	<cache-entry>
		<class>command</class>
		<sharing-policy>not-shared</sharing-policy>
		<name>com.ibm.websphere.samples.trade.command.OrdersCommand</name>
		<cache-id>
			<component type="method" id="getUserID">
				<required>true</required>
			</component>
			<priority>3</priority>
		</cache-id>

		<!-- The dependency id is setup to identify user Accounts by the userID
		  -->		
		<dependency-id>Orders_UserID
			<component id="getUserID" type="method">
				<required>true</required>
			</component>
		</dependency-id>

		<!-- This dependency id is setup to identify all user Accounts
		     for commands which invalidate all Account Orders cache entries
		  -->			
		<dependency-id>AllUsers
		</dependency-id>				
		
	</cache-entry>


<!-- 
	The LoginCommand and LogoutCommands update a users account information.
	The cache-entries below invalidate the AccountCommand for an 
	individual userID on login and logout
	-->		
	<cache-entry>	
		<class>command</class>
		<sharing-policy>not-shared</sharing-policy>
		<name>com.ibm.websphere.samples.trade.command.LoginCommand</name>
	
		<invalidation>Account_UserID
			<component id="getUserID" type="method">
				<required>true</required>
			</component>
		</invalidation>
	</cache-entry>
	<cache-entry>	
		<class>command</class>
		<sharing-policy>not-shared</sharing-policy>
		<name>com.ibm.websphere.samples.trade.command.LogoutCommand</name>
	
		<invalidation>Account_UserID
			<component id="getUserID" type="method">
				<required>true</required>
			</component>
		</invalidation>
		<invalidation>Holdings_UserID1
			<component id="getUserID" type="method">
				<required>true</required>
			</component>
		</invalidation>

	</cache-entry>	
	
<!-- 
	The OrderCompletedCommand signifies that a buy or sell
	order has completed for an individual user.
    When an order completes, a users holdings and account balance
    have been modified. 
    
    This invalidates the AccountCommand, HoldingsCommand and OrdersCommand
    for that user. 
    
    Also, it signifies that an order is completed, therefore, 
    on the next request, the ClosedOrderCommand should run to alert the user
    of any completed orders. 

	The cache-entries below perform these invalidations for an individual user
	on order completion.
	-->		
	<cache-entry>	
		<class>command</class>
		<sharing-policy>not-shared</sharing-policy>
		<name>com.ibm.websphere.samples.trade.command.OrderCompletedCommand</name>
	
		<invalidation>Account_UserID
			<component id="getUserID" type="method">
				<required>true</required>
			</component>
		</invalidation>
		<invalidation>Holdings_UserID
			<component id="getUserID" type="method">
				<required>true</required>
			</component>
		</invalidation>		
		<invalidation>Orders_UserID
			<component id="getUserID" type="method">
				<required>true</required>
			</component>
		</invalidation>		
		<invalidation>ClosedOrders_UserID
			<component id="getUserID" type="method">
				<required>true</required>
			</component>
		</invalidation>			
	</cache-entry>	

<!-- 
	The Buy and Sell commands initiate a new order.
	This creates a new order in the database and therefore 
	invalidates the OrdersCommand.
	
	Note that because order-processing in Trade is asynchronous,
	a buy does not invalidate the users portfolio or
	account balance. These are invalidated when order completes.
	(See OrderCompleteCommand entry in this file.)
	
	A sell invalidates the users portfolio
	(to denote that a holding is being sold)
	  
    Buys and sells invalidate the OrdersCommand for the user
    which entered the order. 
    
	-->		
	<cache-entry>	
		<class>command</class>
		<sharing-policy>not-shared</sharing-policy>
		<name>com.ibm.websphere.samples.trade.command.BuyCommand</name>
	
		<invalidation>Orders_UserID
			<component id="getUserID" type="method">
				<required>true</required>
			</component>
		</invalidation>		
	</cache-entry>

	<cache-entry>	
		<class>command</class>
		<sharing-policy>not-shared</sharing-policy>
		<name>com.ibm.websphere.samples.trade.command.SellCommand</name>
	
		<invalidation>Orders_UserID
			<component id="getUserID" type="method">
				<required>true</required>
			</component>
		</invalidation>		
		<invalidation>Holdings_UserID
			<component id="getUserID" type="method">
				<required>true</required>
			</component>
		</invalidation>				
	</cache-entry>
	
<!-- 
	The UpdateAccountProfileCommand is used to update an individual users
	account profile information. This invalidates the AccountProfileCommand 
	cache-entry above for the individual user, identified by getUserID. 
	The getUserID method ties this entry to the dependency id for the 
	AccountProfileCommand cache-entry above
	-->		
	<cache-entry>	
		<class>command</class>
		<sharing-policy>not-shared</sharing-policy>
		<name>com.ibm.websphere.samples.trade.command.UpdateAccountProfileCommand</name>
	
		<invalidation>AccountProfile_UserID
			<component id="getUserID" type="method">
				<required>true</required>
			</component>
		</invalidation>
	</cache-entry>

<!--
	The ClosedOrdersCommand provides the Order completed alert mechanism in 
	Trade. ClosedOrdersCommand is used to check to see if a user
	has any orders which have been closed, but the user has not been
	alerted to the Orders status.
	
	The ClosedOrdersCommand is cached for each individual user and 
	invalidated when an Order is completed by the OrderCompletedCommand 
	in this file.
	-->

	<cache-entry>
		<class>command</class>
		<sharing-policy>not-shared</sharing-policy>
		<name>com.ibm.websphere.samples.trade.command.ClosedOrdersCommand</name>
		<cache-id>
			<component type="method" id="getUserID">
				<required>true</required>
			</component>
			<priority>3</priority>
		</cache-id>

		<!-- The dependency id is setup to identify stocks by their symbol
		  -->		
		<dependency-id>ClosedOrders_UserID
			<component id="getUserID" type="method">
				<required>true</required>
			</component>
		</dependency-id>

		<!-- This dependency id is setup to identify all user Accounts
		     for commands which invalidate all Account ClosedOrders cache entries
		  -->			
		<dependency-id>AllUsers
		</dependency-id>				
		
		
	</cache-entry>	

	<!--
    <cache-entry>
		<class>command</class>
		<sharing-policy>not-shared</sharing-policy>
		<name>com.ibm.websphere.samples.trade.command.ClosedOrdersCommand</name>

		<invalidation>ClosedOrders_UserID
			<component id="getClosedOrdersCount" type="method">
				<not-value>0</not-value>
				<required>true</required>
			</component>
		</invalidation>
	</cache-entry>	
    -->

<!-- 
	The ResetTradeCommand is used to reset the Trade database.
	This action invalidates all cache entries for users and quotes and
	the current MarketSummary
	-->		
	<cache-entry>	
		<class>command</class>
		<sharing-policy>not-shared</sharing-policy>
		<name>com.ibm.websphere.samples.trade.command.ResetTradeCommand</name>
	
		<invalidation>AllQuotes
		</invalidation>	
		
		<invalidation>AllUsers
		</invalidation>
		
		<invalidation>MarketSummary
		</invalidation>		
	</cache-entry>	


</cache>