Calculator Implementation Policies Sample ========================================= This sample builds over simple calculator sample to demonstrate how Implementation Policies can be use in Tuscany SCA Java. The README in the samples directory (the directory above this) provides general instructions about building and running samples. Take a look there first. If you just want to run the sample to see what happens open a command prompt, navigate to this sample directory and do: ant run OR if you don't have ant, on Windows do java -cp ..\..\lib\tuscany-sca-manifest.jar;target\sample-calculator.jar calculator.CalculatorClient and on *nix do java -cp ../../lib/tuscany-sca-manifest.jar:target/sample-calculator.jar calculator.CalculatorClient Sample Overview --------------- The sample provides the calculator service with a default SCA (java) binding. The 'logging' policy which is handled by the Tuscany SCA java policy-logging module is used in this calculator composite to specify the need for 'logging'. The MultiplyService Component specifies for 'jassAuthentication' which is one way of implemention login authentication, using the Java Authentication and Authorization Service. The logging intent and policyset that is to be used by this calculator application must be defined in the definitions.xml file. Here we use the policyset structure already defined in Tuscany for logging under the policy-logging and hence there is no need to specify the policyset processors and policy handler classes as part of this application. Similarly the jaasAuthentication intent and policyset also is defined in the definitions.xml file of this sample. This sample uses the calculator.security.JaasLoginModule class for handling the authentication functions. Right now there is a simply matching of userid and passwords that happens in this class. Applications could implement their own sophisticated authentication mechanisms. For more information on how to do this please look up Java Authentication and Authorization Service documentation. The sample also use the calculator.security.CalculatorCallbackHandler to fetch the userid and password to be use for the login authentication. This handler presently uses hardcoded userids and passwords. Applications could typically use this handler to prompt for userid and passwords. There are two components that provide the calculator service namely 'CalculatorServiceComponent' and 'AnotherCalculatorServiceComponent'. The logging intent is specified for the 'subtract' and 'divide' operations of the 'CalculatorServiceCompnent' implementation, and on the entire implementation (i.e. all operations) for the AddServiceComponent and AnotherCalculatorServiceComponent. The CalculatorClient first exercises the CalculatorServiceComponent calling add, subtract, multiply and divide operations. This results in logging messages appearing on the console for 'add', 'subtract' and 'divide' operations. The CalculatorClient then exercises the AnotherCalculatorServiceComponent calling all the service methods. This will result in logging messages printed on the console for all the operations. For the 'add' operation there will be two sets of messages printed - one that has resulted from specifying the 'logging' intent on the implementation element of the 'AnotherCalculatorServiceComponent' and another from specifying the 'logging' intent on the 'AddServiceComponent' The jaasAuthentication intent is specified for the 'MultiplyServiceComponent'. So everytime this component is invoke an authentication is attempted and only if it succeeds, is the multiply function is invoked. The console prints messages that denote if the authentication has succeeded or failed. Thus this sample demonstrates how intents could be applied to either implementations as a whole or to some selective operations on an implementation. calculator/ src/ main/ java/ calculator/ CalculatorService.java - the first component, calls +-/* as appropriate CalculatorServiceImpl.java AddService.java - adds two numbers AddServiceImpl.java SubtractService.java - subtracts one number from another SubtractServiceImpl.java MultiplyService.java - multiplies two numbers MultiplyServiceImpl.java DivideService.java - divides one number by another DivideServiceImpl.java CalculatorClient.java - starts the SCA Runtime and deploys the Calculator.composite. It then calls the deployed Calculator Components services calculator/security JaasLoginModule.java JaasLoginModule implementation for this sample CalculatorCallbackHandler.java JAAS callbackhandler for fetching userid and password resources/ Calculator.composite - the SCA assembly for this sample definitions.xml - sca definitions file that defines the 'logging' intent and policyset used by this application CalculatorLogMessages.properties - A resource bundle contain the log messages to be used. CalculatorJaas.config - JAAS Login Configuration file test/ java/ calculator/ CalculatorTestCase.java - JUnit test case calculator.png - a pictorial representation of the sample .composite file build.xml - the Ant build file pom.xml - the Maven build file Building And Running The Sample Using Ant ----------------------------------------- With the binary distribution the sample can be built and run using Ant as follows cd calculator-implementation-policies ant compile ant run You should see the following output from the run target. run: [java] Calling CalculatorServiceComponent configured with 'logging' policy for subtract and divide operations... [java] Nov 23, 2007 1:06:10 PM [java] INFO: Invoking operation - add [java] Nov 23, 2007 1:06:10 PM [java] INFO: Returned from operation - add [java] 3 + 2=5.0 [java] 3 - 2=1.0 [java] 3 * 2=6.0 [java] 3 / 2=1.5 [java] Calling CalculatorServiceComponent configured with 'logging' for all operations in the implementation... [java] Nov 23, 2007 1:06:10 PM [java] INFO: Invoking operation - subtract [java] Nov 23, 2007 1:06:10 PM [java] INFO: Returned from operation - subtract [java] Nov 23, 2007 1:06:10 PM [java] INFO: Invoking operation - divide [java] Nov 23, 2007 1:06:10 PM [java] INFO: Returned from operation - divide [java] Nov 23, 2007 1:06:10 PM [java] 3 + 2=5.0 [java] 3 - 2=1.0 [java] 3 * 2=6.0 [java] INFO: Invoking operation - add [java] 3 / 2=1.5 [java] Nov 23, 2007 1:06:10 PM [java] INFO: Invoking operation - add [java] Nov 23, 2007 1:06:10 PM [java] INFO: Returned from operation - add [java] Nov 23, 2007 1:06:10 PM [java] INFO: Returned from operation - add [java] Nov 23, 2007 1:06:10 PM [java] INFO: Invoking operation - subtract [java] Nov 23, 2007 1:06:10 PM [java] INFO: Returned from operation - subtract [java] Nov 23, 2007 1:06:10 PM [java] INFO: Invoking operation - multiply [java] Nov 23, 2007 1:06:10 PM [java] INFO: Returned from operation - multiply [java] Nov 23, 2007 1:06:10 PM [java] INFO: Invoking operation - divide [java] Nov 23, 2007 1:06:10 PM [java] INFO: Returned from operation - divide Building And Running The Sample Using Maven ------------------------------------------- With either the binary or source distributions the sample can be built and run using Maven as follows. cd calculator mvn You should see the following output from the test phase. Notice the log messages. ------------------------------------------------------- T E S T S ------------------------------------------------------- Running calculator.CalculatorTestCase Dec 18, 2007 12:05:06 PM org.apache.tuscany.sca.contribution.processor.ValidatingXMLStreamReader$1 error WARNING: XMLSchema validation problem in: file:/F:/LatestTrunk/sca/samples/calculator-implementation-policies/target/ classes/Calculator.composite, line: 28, column: 4 cvc-complex-type.2.4.a: Invalid content was found starting with element 'operation'. One of '{WC[##other:"http://www. osoa.org/xmlns/sca/1.0"]}' is expected. Dec 18, 2007 12:05:06 PM INFO: Invoking operation - add Dec 18, 2007 12:05:06 PM FINER: Inovoking operation add with arguments 3.0, 2.0, Dec 18, 2007 12:05:06 PM INFO: Returned from operation - add Dec 18, 2007 12:05:06 PM FINER: Returning from operation add with return value 5 Dec 18, 2007 12:05:06 PM INFO: Invoking operation - subtract Dec 18, 2007 12:05:06 PM FINER: Inovoking operation subtract with arguments 3.0, 2.0, Dec 18, 2007 12:05:06 PM INFO: Returned from operation - subtract Dec 18, 2007 12:05:06 PM FINER: Returning from operation subtract with return value 1 Successfully AUTHENTICATED!! Dec 18, 2007 12:05:06 PM INFO: Invoking operation - divide Dec 18, 2007 12:05:06 PM FINER: Inovoking operation divide with arguments 3.0, 2.0, Dec 18, 2007 12:05:06 PM INFO: Returned from operation - divide Dec 18, 2007 12:05:06 PM FINER: Returning from operation divide with return value 1.5 Dec 18, 2007 12:05:06 PM org.apache.tuscany.sca.contribution.processor.ValidatingXMLStreamReader$1 error WARNING: XMLSchema validation problem in: file:/F:/LatestTrunk/sca/samples/calculator-implementation-policies/target/ classes/Calculator.composite, line: 28, column: 4 cvc-complex-type.2.4.a: Invalid content was found starting with element 'operation'. One of '{WC[##other:"http://www. osoa.org/xmlns/sca/1.0"]}' is expected. Dec 18, 2007 12:05:06 PM INFO: Invoking operation - add Dec 18, 2007 12:05:06 PM FINER: Inovoking operation add with arguments 3.0, 2.0, Dec 18, 2007 12:05:06 PM INFO: Invoking operation - add Dec 18, 2007 12:05:06 PM FINER: Inovoking operation add with arguments 3.0, 2.0, Dec 18, 2007 12:05:06 PM INFO: Returned from operation - add Dec 18, 2007 12:05:06 PM FINER: Returning from operation add with return value 5 Dec 18, 2007 12:05:06 PM INFO: Returned from operation - add Dec 18, 2007 12:05:06 PM FINER: Returning from operation add with return value 5 Dec 18, 2007 12:05:06 PM INFO: Invoking operation - subtract Dec 18, 2007 12:05:06 PM FINER: Inovoking operation subtract with arguments 3.0, 2.0, Dec 18, 2007 12:05:06 PM INFO: Returned from operation - subtract Dec 18, 2007 12:05:06 PM FINER: Returning from operation subtract with return value 1 Dec 18, 2007 12:05:06 PM INFO: Invoking operation - multiply Dec 18, 2007 12:05:06 PM FINER: Inovoking operation multiply with arguments 3.0, 2.0, Successfully AUTHENTICATED!! Dec 18, 2007 12:05:06 PM INFO: Returned from operation - multiply Dec 18, 2007 12:05:06 PM FINER: Returning from operation multiply with return value 6 Dec 18, 2007 12:05:06 PM INFO: Invoking operation - divide Dec 18, 2007 12:05:06 PM FINER: Inovoking operation divide with arguments 3.0, 2.0, Dec 18, 2007 12:05:06 PM INFO: Returned from operation - divide Dec 18, 2007 12:05:06 PM FINER: Returning from operation divide with return value 1.5 Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1.823 sec Results : Tests run: 2, Failures: 0, Errors: 0, Skipped: 0 Results : Tests run: 2, Failures: 0, Errors: 0, Skipped: 0 This shows that the Junit test cases have run successfully.