summaryrefslogtreecommitdiffstats
path: root/sca-java-2.x/branches/2.0-Beta3/samples
diff options
context:
space:
mode:
Diffstat (limited to 'sca-java-2.x/branches/2.0-Beta3/samples')
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/README4
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/applications/store/README28
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/applications/store/build.xml82
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/applications/store/pom.xml115
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/applications/store/src/main/java/launch/Launch.java39
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/applications/store/src/main/java/services/Cart.java28
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/applications/store/src/main/java/services/Catalog.java27
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/applications/store/src/main/java/services/CurrencyConverter.java29
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/applications/store/src/main/java/services/CurrencyConverterImpl.java38
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/applications/store/src/main/java/services/FruitsCatalogImpl.java52
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/applications/store/src/main/java/services/Item.java54
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/applications/store/src/main/java/services/ShoppingCartImpl.java112
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/applications/store/src/main/java/services/Total.java29
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/applications/store/src/main/resources/store.composite58
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/applications/store/src/main/resources/uiservices/store.html162
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/applications/store/src/test/java/client/Shopper.java29
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/applications/store/src/test/java/client/ShopperImpl.java64
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/applications/store/src/test/java/store/StoreTestCase.java121
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/applications/store/src/test/resources/store-client.composite38
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/applications/store/store.pngbin0 -> 15670 bytes
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/applications/store/store.svg304
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/getting-started/getting-started.odtbin0 -> 11166 bytes
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/getting-started/getting-started.pdfbin0 -> 28006 bytes
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-jaxrs/README22
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-jaxrs/pom.xml120
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-jaxrs/src/main/java/sample/Helloworld.java28
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-jaxrs/src/main/java/sample/HelloworldImpl.java27
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-jaxrs/src/main/java/sample/JaxrsHelloworld.java36
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-jaxrs/src/main/resources/META-INF/sca-contribution.xml25
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-jaxrs/src/main/resources/helloworld.composite33
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-jaxrs/src/test/java/sample/HelloworldTestCase.java71
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-jsonp/README23
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-jsonp/pom.xml113
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-jsonp/src/main/java/sample/Helloworld.java28
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-jsonp/src/main/java/sample/HelloworldImpl.java27
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-jsonp/src/main/resources/META-INF/sca-contribution.xml25
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-jsonp/src/main/resources/helloworld.composite32
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-jsonp/src/test/java/sample/HelloworldTestCase.java74
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-jsonrpc/README27
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-jsonrpc/pom.xml113
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-jsonrpc/src/main/java/sample/Helloworld.java28
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-jsonrpc/src/main/java/sample/HelloworldImpl.java27
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-jsonrpc/src/main/resources/META-INF/sca-contribution.xml25
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-jsonrpc/src/main/resources/helloworld.composite32
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-jsonrpc/src/test/java/sample/HelloworldTestCase.java75
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-scaclient/README25
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-scaclient/pom.xml121
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-scaclient/src/main/java/sample/Helloworld.java28
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-scaclient/src/main/java/sample/HelloworldSCAClient.java45
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-scaclient/src/test/java/sample/HelloworldTestCase.java56
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-spring/README18
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-spring/pom.xml106
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-spring/src/main/java/sample/Helloworld.java28
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-spring/src/main/java/sample/HelloworldImpl.java27
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-spring/src/main/resources/META-INF/sca-contribution.xml25
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-spring/src/main/resources/helloworld-context.xml27
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-spring/src/main/resources/helloworld.composite29
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-spring/src/test/java/sample/HelloworldTestCase.java48
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-webapp/README32
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-webapp/pom.xml181
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-webapp/src/main/java/sample/Helloworld.java28
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-webapp/src/main/webapp/WEB-INF/web.composite30
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-webapp/src/main/webapp/WEB-INF/web.xml41
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-webapp/src/main/webapp/hello.jsp37
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-webapp/src/test/java/itest/HelloworldTestCase.java53
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-webapp/src/test/resources/test-web.xml30
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-webservice/README18
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-webservice/pom.xml113
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-webservice/src/main/java/sample/Helloworld.java28
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-webservice/src/main/java/sample/HelloworldImpl.java27
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-webservice/src/main/resources/META-INF/sca-contribution.xml25
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-webservice/src/main/resources/helloworld.composite32
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-webservice/src/test/java/sample/HelloworldTestCase.java76
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-withdeps/README35
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-withdeps/pom.xml120
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-withdeps/src/main/assembly/resources/META-INF/helloworld.composite29
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-withdeps/src/main/assembly/resources/META-INF/sca-contribution.xml25
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-withdeps/src/main/assembly/zip.xml41
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-withdeps/src/main/java/sample/Helloworld.java28
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-withdeps/src/main/java/sample/HelloworldImpl.java29
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-withdeps/src/test/java/sample/HelloworldTestCase.java49
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld/README43
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld/pom.xml92
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld/src/main/java/sample/Helloworld.java28
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld/src/main/java/sample/HelloworldImpl.java27
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld/src/main/resources/META-INF/sca-contribution.xml25
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld/src/main/resources/helloworld.composite29
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld/src/test/java/sample/HelloworldTestCase.java48
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/getting-started/pom.xml45
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/autocomplete-webapp/README79
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/autocomplete-webapp/pom.xml82
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/autocomplete-webapp/src/main/java/org/apache/tuscany/sca/sample/comet/Country.java40
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/autocomplete-webapp/src/main/java/org/apache/tuscany/sca/sample/comet/CountryRepository.java30
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/autocomplete-webapp/src/main/java/org/apache/tuscany/sca/sample/comet/CountryRepositoryImpl.java80
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/autocomplete-webapp/src/main/java/org/apache/tuscany/sca/sample/comet/CountryService.java30
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/autocomplete-webapp/src/main/java/org/apache/tuscany/sca/sample/comet/CountryServiceImpl.java36
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/autocomplete-webapp/src/main/resources/countries.txt211
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/autocomplete-webapp/src/main/webapp/META-INF/MANIFEST.MF2
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/autocomplete-webapp/src/main/webapp/WEB-INF/web.composite41
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/autocomplete-webapp/src/main/webapp/WEB-INF/web.xml34
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/autocomplete-webapp/src/main/webapp/index.html69
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/chat-webapp/README99
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/chat-webapp/pom.xml81
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/chat-webapp/src/main/java/org/apache/tuscany/sca/sample/comet/ChatService.java36
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/chat-webapp/src/main/java/org/apache/tuscany/sca/sample/comet/ChatServiceImpl.java56
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/chat-webapp/src/main/webapp/META-INF/MANIFEST.MF2
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/chat-webapp/src/main/webapp/WEB-INF/web.composite37
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/chat-webapp/src/main/webapp/WEB-INF/web.xml34
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/chat-webapp/src/main/webapp/index.html109
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/pom.xml47
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/pubsub-webapp/README102
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/pubsub-webapp/pom.xml81
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/pubsub-webapp/src/main/java/org/apache/tuscany/sca/sample/comet/Event.java51
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/pubsub-webapp/src/main/java/org/apache/tuscany/sca/sample/comet/EventProcessor.java107
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/pubsub-webapp/src/main/java/org/apache/tuscany/sca/sample/comet/EventProcessorConsumerService.java37
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/pubsub-webapp/src/main/java/org/apache/tuscany/sca/sample/comet/EventProcessorProducerService.java28
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/pubsub-webapp/src/main/java/org/apache/tuscany/sca/sample/comet/Producer.java76
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/pubsub-webapp/src/main/webapp/META-INF/MANIFEST.MF2
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/pubsub-webapp/src/main/webapp/WEB-INF/web.composite63
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/pubsub-webapp/src/main/webapp/WEB-INF/web.xml34
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/pubsub-webapp/src/main/webapp/index.html107
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/weather-webapp/README100
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/weather-webapp/pom.xml74
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/weather-webapp/src/main/java/org/apache/tuscany/sca/sample/comet/Helper.java34
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/weather-webapp/src/main/java/org/apache/tuscany/sca/sample/comet/HumidityService.java35
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/weather-webapp/src/main/java/org/apache/tuscany/sca/sample/comet/PrecipitationService.java35
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/weather-webapp/src/main/java/org/apache/tuscany/sca/sample/comet/PrecipitationServiceImpl.java56
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/weather-webapp/src/main/java/org/apache/tuscany/sca/sample/comet/TemperatureHumidityServiceImpl.java76
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/weather-webapp/src/main/java/org/apache/tuscany/sca/sample/comet/TemperatureService.java38
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/weather-webapp/src/main/java/org/apache/tuscany/sca/sample/comet/model/Location.java43
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/weather-webapp/src/main/java/org/apache/tuscany/sca/sample/comet/model/Response.java45
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/weather-webapp/src/main/webapp/META-INF/MANIFEST.MF2
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/weather-webapp/src/main/webapp/WEB-INF/web.composite58
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/weather-webapp/src/main/webapp/WEB-INF/web.xml34
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/weather-webapp/src/main/webapp/index.html159
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/autocomplete-webapp/README67
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/autocomplete-webapp/pom.xml61
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/autocomplete-webapp/src/main/java/sample/Country.java40
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/autocomplete-webapp/src/main/java/sample/CountryRepository.java30
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/autocomplete-webapp/src/main/java/sample/CountryRepositoryImpl.java80
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/autocomplete-webapp/src/main/java/sample/CountryService.java30
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/autocomplete-webapp/src/main/java/sample/CountryServiceImpl.java36
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/autocomplete-webapp/src/main/resources/countries.txt211
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/autocomplete-webapp/src/main/webapp/META-INF/MANIFEST.MF2
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/autocomplete-webapp/src/main/webapp/WEB-INF/web.composite40
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/autocomplete-webapp/src/main/webapp/WEB-INF/web.xml34
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/autocomplete-webapp/src/main/webapp/index.html64
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/chat-webapp/README88
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/chat-webapp/pom.xml67
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/chat-webapp/src/main/java/sample/ChatService.java36
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/chat-webapp/src/main/java/sample/ChatServiceImpl.java58
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/chat-webapp/src/main/webapp/META-INF/MANIFEST.MF2
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/chat-webapp/src/main/webapp/WEB-INF/web.composite37
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/chat-webapp/src/main/webapp/WEB-INF/web.xml34
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/chat-webapp/src/main/webapp/index.html99
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/pom.xml47
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/pubsub-webapp/README93
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/pubsub-webapp/pom.xml67
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/pubsub-webapp/src/main/java/sample/Event.java51
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/pubsub-webapp/src/main/java/sample/EventProcessor.java104
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/pubsub-webapp/src/main/java/sample/EventProcessorConsumerService.java37
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/pubsub-webapp/src/main/java/sample/EventProcessorProducerService.java28
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/pubsub-webapp/src/main/java/sample/Producer.java75
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/pubsub-webapp/src/main/webapp/META-INF/MANIFEST.MF2
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/pubsub-webapp/src/main/webapp/WEB-INF/web.composite60
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/pubsub-webapp/src/main/webapp/WEB-INF/web.xml34
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/pubsub-webapp/src/main/webapp/index.html96
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/weather-webapp/README89
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/weather-webapp/pom.xml60
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/weather-webapp/src/main/java/sample/Helper.java34
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/weather-webapp/src/main/java/sample/HumidityService.java36
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/weather-webapp/src/main/java/sample/PrecipitationService.java36
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/weather-webapp/src/main/java/sample/PrecipitationServiceImpl.java57
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/weather-webapp/src/main/java/sample/TemperatureHumidityServiceImpl.java77
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/weather-webapp/src/main/java/sample/TemperatureService.java36
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/weather-webapp/src/main/java/sample/model/Location.java43
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/weather-webapp/src/main/java/sample/model/Response.java45
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/weather-webapp/src/main/webapp/META-INF/MANIFEST.MF2
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/weather-webapp/src/main/webapp/WEB-INF/web.composite57
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/weather-webapp/src/main/webapp/WEB-INF/web.xml34
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/weather-webapp/src/main/webapp/index.html114
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/learning-more/pom.xml46
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/pom.xml40
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/running-tuscany/calculator-contribution.jarbin0 -> 11442 bytes
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/running-tuscany/command-line/README.html41
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/running-tuscany/command-line/README.odtbin0 -> 15949 bytes
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/running-tuscany/eclipse/README.html38
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/running-tuscany/eclipse/README.odtbin0 -> 13875 bytes
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/running-tuscany/junit/README.html39
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/running-tuscany/junit/README.odtbin0 -> 12924 bytes
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/running-tuscany/junit/pom.xml50
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/running-tuscany/junit/src/main/java/calculator/CalculatorService.java38
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/running-tuscany/junit/src/test/java/launcher/LaunchCalculatorContributionTestCase.java51
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/running-tuscany/pom.xml45
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/running-tuscany/running-tuscany.html50
-rw-r--r--sca-java-2.x/branches/2.0-Beta3/samples/running-tuscany/running-tuscany.odtbin0 -> 45492 bytes
196 files changed, 10131 insertions, 0 deletions
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/README b/sca-java-2.x/branches/2.0-Beta3/samples/README
new file mode 100644
index 0000000000..49e0b2893f
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/README
@@ -0,0 +1,4 @@
+Apache Tuscany Samples
+======================
+
+
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/applications/store/README b/sca-java-2.x/branches/2.0-Beta3/samples/applications/store/README
new file mode 100644
index 0000000000..d31e4c59b7
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/applications/store/README
@@ -0,0 +1,28 @@
+Store Sample
+======================================
+
+This is a sample store scenario that is used as a getting started guide
+for Tuscany SCA. For detailed information, please see:
+
+http://tuscany.apache.org/getting-started-with-tuscany.html
+
+or
+
+http://tuscany.apache.org/getting-started-with-tuscany-using-tuscany-eclipse-plugin.html
+
+
+Building And Running The Sample Using Ant
+-----------------------------------------
+With the binary distribution the sample can be built using Ant as follows:
+
+cd store
+ant compile
+
+and then, to run:
+
+ant run
+
+Once the store application is running use your browser to visit the following
+URL:
+
+http://localhost:8080/store
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/applications/store/build.xml b/sca-java-2.x/branches/2.0-Beta3/samples/applications/store/build.xml
new file mode 100644
index 0000000000..e28e7c87be
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/applications/store/build.xml
@@ -0,0 +1,82 @@
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<project name="store" default="compile">
+ <property name="tuscany.home" value="../../.."/>
+ <property name="test.class" value="launch.Launch" />
+ <property name="test.jar" value="sample-store.jar" />
+
+ <import file="${tuscany.home}/features/tuscany-base-runtime-pom/build-path.xml"/>
+
+ <target name="init">
+ <mkdir dir="target/classes"/>
+ </target>
+
+ <target name="compile" depends="init">
+ <javac srcdir="src/main/java"
+ destdir="target/classes"
+ debug="on"
+ source="1.5"
+ target="1.5">
+ <classpath>
+ <fileset dir="${tuscany.home}/lib">
+ <include name="tuscany-base-*.jar"/>
+ </fileset>
+ </classpath>
+ </javac>
+ <copy todir="target/classes">
+ <fileset dir="src/main/resources"/>
+ </copy>
+ <jar destfile="target/${test.jar}" basedir="target/classes">
+ <manifest>
+ <attribute name="Main-Class" value="${test.class}" />
+ </manifest>
+ </jar>
+ </target>
+
+ <target name="run-classes">
+ <java classname="${test.class}"
+ fork="true">
+ <classpath>
+ <pathelement path="target/classes"/>
+ <fileset dir="${tuscany.home}/features">
+ <include name="tuscany-sca-manifest.jar"/>
+ </fileset>
+ </classpath>
+ </java>
+ </target>
+
+ <target name="run">
+ <java classname="${test.class}"
+ fork="true">
+ <classpath>
+ <pathelement path="target/${test.jar}"/>
+ <fileset dir="${tuscany.home}/features">
+ <include name="tuscany-sca-manifest.jar"/>
+ </fileset>
+ </classpath>
+ </java>
+ </target>
+
+ <target name="clean">
+ <delete quiet="true" includeemptydirs="true">
+ <fileset dir="target"/>
+ </delete>
+ </target>
+
+</project>
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/applications/store/pom.xml b/sca-java-2.x/branches/2.0-Beta3/samples/applications/store/pom.xml
new file mode 100644
index 0000000000..fd268b7b60
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/applications/store/pom.xml
@@ -0,0 +1,115 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<project>
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>org.apache.tuscany.sca.samples</groupId>
+ <artifactId>tuscany-samples</artifactId>
+ <version>2.0-Beta3-SNAPSHOT</version>
+ <relativePath>../../pom.xml</relativePath>
+ </parent>
+ <artifactId>sample-store</artifactId>
+ <name>Apache Tuscany SCA Sample Getting Started Online Store</name>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.tuscany.sca</groupId>
+ <artifactId>tuscany-base-runtime-pom</artifactId>
+ <version>2.0-Beta3-SNAPSHOT</version>
+ <type>pom</type>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.tuscany.sca</groupId>
+ <artifactId>tuscany-data-api</artifactId>
+ <version>2.0-Beta3-SNAPSHOT</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.tuscany.sca</groupId>
+ <artifactId>tuscany-binding-atom-runtime</artifactId>
+ <version>2.0-Beta3-SNAPSHOT</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.tuscany.sca</groupId>
+ <artifactId>tuscany-binding-http-runtime</artifactId>
+ <version>2.0-Beta3-SNAPSHOT</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.tuscany.sca</groupId>
+ <artifactId>tuscany-binding-jsonrpc-runtime</artifactId>
+ <version>2.0-Beta3-SNAPSHOT</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.tuscany.sca</groupId>
+ <artifactId>tuscany-implementation-widget-runtime</artifactId>
+ <version>2.0-Beta3-SNAPSHOT</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.tuscany.sca</groupId>
+ <artifactId>tuscany-implementation-widget-runtime-dojo</artifactId>
+ <version>2.0-Beta3-SNAPSHOT</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.tuscany.sca</groupId>
+ <artifactId>tuscany-web-javascript-dojo</artifactId>
+ <version>2.0-Beta3-SNAPSHOT</version>
+ </dependency>
+ <dependency>
+ <groupId>org.mortbay.jetty</groupId>
+ <artifactId>jetty</artifactId>
+ <version>6.1.19</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>net.sourceforge.htmlunit</groupId>
+ <artifactId>htmlunit</artifactId>
+ <version>2.6</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <version>4.8.1</version>
+ <scope>test</scope>
+ </dependency>
+ </dependencies>
+
+ <build>
+ <finalName>${project.artifactId}</finalName>
+ <plugins>
+ <plugin>
+ <groupId>org.codehaus.mojo</groupId>
+ <artifactId>exec-maven-plugin</artifactId>
+ <version>1.1.1</version>
+ <executions>
+ <execution>
+ <goals>
+ <goal>java</goal>
+ </goals>
+ </execution>
+ </executions>
+ <configuration>
+ <classpathScope>test</classpathScope>
+ <mainClass>store.StoreTestCase</mainClass>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+
+</project>
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/applications/store/src/main/java/launch/Launch.java b/sca-java-2.x/branches/2.0-Beta3/samples/applications/store/src/main/java/launch/Launch.java
new file mode 100644
index 0000000000..8e4b5839e4
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/applications/store/src/main/java/launch/Launch.java
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package launch;
+
+import org.apache.tuscany.sca.node.Contribution;
+import org.apache.tuscany.sca.node.ContributionLocationHelper;
+import org.apache.tuscany.sca.node.Node;
+import org.apache.tuscany.sca.node.NodeFactory;
+
+public class Launch {
+ public static void main(String[] args) throws Exception {
+ System.out.println("Starting ...");
+ String contribution = ContributionLocationHelper.getContributionLocation(Launch.class);
+ Node node = NodeFactory.newInstance().createNode("store.composite", new Contribution("test", contribution));
+ node.start();
+ System.out.println("store.composite ready for big business !!!");
+ System.in.read();
+ System.out.println("Stopping ...");
+ node.stop();
+ System.out.println();
+ }
+}
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/applications/store/src/main/java/services/Cart.java b/sca-java-2.x/branches/2.0-Beta3/samples/applications/store/src/main/java/services/Cart.java
new file mode 100644
index 0000000000..3fb5439bc3
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/applications/store/src/main/java/services/Cart.java
@@ -0,0 +1,28 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package services;
+
+import org.apache.tuscany.sca.data.collection.Collection;
+import org.oasisopen.sca.annotation.Remotable;
+
+@Remotable
+public interface Cart extends Collection<String, Item> {
+
+}
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/applications/store/src/main/java/services/Catalog.java b/sca-java-2.x/branches/2.0-Beta3/samples/applications/store/src/main/java/services/Catalog.java
new file mode 100644
index 0000000000..b5e504fe11
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/applications/store/src/main/java/services/Catalog.java
@@ -0,0 +1,27 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package services;
+
+import org.oasisopen.sca.annotation.Remotable;
+
+@Remotable
+public interface Catalog {
+ Item[] get();
+}
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/applications/store/src/main/java/services/CurrencyConverter.java b/sca-java-2.x/branches/2.0-Beta3/samples/applications/store/src/main/java/services/CurrencyConverter.java
new file mode 100644
index 0000000000..a064f3dd69
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/applications/store/src/main/java/services/CurrencyConverter.java
@@ -0,0 +1,29 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package services;
+
+import org.oasisopen.sca.annotation.Remotable;
+
+@Remotable
+public interface CurrencyConverter {
+ public double getConversion(String fromCurrenycCode, String toCurrencyCode, double amount);
+
+ public String getCurrencySymbol(String currencyCode);
+}
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/applications/store/src/main/java/services/CurrencyConverterImpl.java b/sca-java-2.x/branches/2.0-Beta3/samples/applications/store/src/main/java/services/CurrencyConverterImpl.java
new file mode 100644
index 0000000000..c354aed447
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/applications/store/src/main/java/services/CurrencyConverterImpl.java
@@ -0,0 +1,38 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package services;
+
+public class CurrencyConverterImpl implements CurrencyConverter {
+ public double getConversion(String fromCurrencyCode, String toCurrencyCode, double amount) {
+ if (toCurrencyCode.equals("USD"))
+ return amount;
+ else if (toCurrencyCode.equals("EUR"))
+ return ((double)Math.round(amount * 0.7256 * 100)) /100;
+ return 0;
+ }
+
+ public String getCurrencySymbol(String currencyCode) {
+ if (currencyCode.equals("USD"))
+ return "$";
+ else if (currencyCode.equals("EUR"))
+ return "E"; //"€";
+ return "?";
+ }
+}
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/applications/store/src/main/java/services/FruitsCatalogImpl.java b/sca-java-2.x/branches/2.0-Beta3/samples/applications/store/src/main/java/services/FruitsCatalogImpl.java
new file mode 100644
index 0000000000..d132a24b00
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/applications/store/src/main/java/services/FruitsCatalogImpl.java
@@ -0,0 +1,52 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package services;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.oasisopen.sca.annotation.Init;
+import org.oasisopen.sca.annotation.Property;
+import org.oasisopen.sca.annotation.Reference;
+
+public class FruitsCatalogImpl implements Catalog {
+
+ @Property
+ public String currencyCode = "USD";
+
+ @Reference
+ public CurrencyConverter currencyConverter;
+
+ private List<Item> catalog = new ArrayList<Item>();
+
+ @Init
+ public void init() {
+ String currencySymbol = currencyConverter.getCurrencySymbol(currencyCode);
+ catalog.add(new Item("Apple", currencySymbol + currencyConverter.getConversion("USD", currencyCode, 2.99)));
+ catalog.add(new Item("Orange", currencySymbol + currencyConverter.getConversion("USD", currencyCode, 3.55)));
+ catalog.add(new Item("Pear", currencySymbol + currencyConverter.getConversion("USD", currencyCode, 1.55)));
+ }
+
+ public Item[] get() {
+ Item[] catalogArray = new Item[catalog.size()];
+ catalog.toArray(catalogArray);
+ return catalogArray;
+ }
+}
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/applications/store/src/main/java/services/Item.java b/sca-java-2.x/branches/2.0-Beta3/samples/applications/store/src/main/java/services/Item.java
new file mode 100644
index 0000000000..0a9dcb2ffc
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/applications/store/src/main/java/services/Item.java
@@ -0,0 +1,54 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package services;
+
+public class Item {
+ private String name;
+ private String price;
+
+ public Item() {
+ }
+
+ public Item(String name, String price) {
+ this.name = name;
+ this.price = price;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getPrice() {
+ return price;
+ }
+
+ public void setPrice(String price) {
+ this.price = price;
+ }
+
+ public String toString() {
+ return "Item name: " + name + ", price: " + price;
+ }
+
+}
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/applications/store/src/main/java/services/ShoppingCartImpl.java b/sca-java-2.x/branches/2.0-Beta3/samples/applications/store/src/main/java/services/ShoppingCartImpl.java
new file mode 100644
index 0000000000..698614212d
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/applications/store/src/main/java/services/ShoppingCartImpl.java
@@ -0,0 +1,112 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package services;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+
+import org.apache.tuscany.sca.data.collection.Entry;
+import org.apache.tuscany.sca.data.collection.NotFoundException;
+import org.oasisopen.sca.annotation.Init;
+import org.oasisopen.sca.annotation.Scope;
+
+@Scope("COMPOSITE")
+public class ShoppingCartImpl implements Cart, Total {
+
+ private Map<String, Item> cart;
+
+ @Init
+ public void init() {
+ cart = new HashMap<String, Item>();
+ }
+
+ public Entry<String, Item>[] getAll() {
+ Entry<String, Item>[] entries = new Entry[cart.size()];
+ int i = 0;
+ for (Map.Entry<String, Item> e: cart.entrySet()) {
+ entries[i++] = new Entry<String, Item>(e.getKey(), e.getValue());
+ }
+ return entries;
+ }
+
+ public Item get(String key) throws NotFoundException {
+ Item item = cart.get(key);
+ if (item == null) {
+ throw new NotFoundException(key);
+ } else {
+ return item;
+ }
+ }
+
+ public String post(String key, Item item) {
+ if (key == null) {
+ key ="cart-" + UUID.randomUUID().toString();
+ }
+ cart.put(key, item);
+ return key;
+ }
+
+ public void put(String key, Item item) throws NotFoundException {
+ if (!cart.containsKey(key)) {
+ throw new NotFoundException(key);
+ }
+ cart.put(key, item);
+ }
+
+ public void delete(String key) throws NotFoundException {
+ if (key == null || key.equals("")) {
+ cart.clear();
+ } else {
+ Item item = cart.remove(key);
+ if (item == null)
+ throw new NotFoundException(key);
+ }
+ }
+
+ public Entry<String, Item>[] query(String queryString) {
+ List<Entry<String, Item>> entries = new ArrayList<Entry<String,Item>>();
+ if (queryString.startsWith("name=")) {
+ String name = queryString.substring(5);
+ for (Map.Entry<String, Item> e: cart.entrySet()) {
+ Item item = e.getValue();
+ if (item.getName().equals(name)) {
+ entries.add(new Entry<String, Item>(e.getKey(), e.getValue()));
+ }
+ }
+ }
+ return entries.toArray(new Entry[entries.size()]);
+ }
+
+ public String getTotal() {
+ double total = 0;
+ String currencySymbol = "";
+ if (!cart.isEmpty()) {
+ Item item = cart.values().iterator().next();
+ currencySymbol = item.getPrice().substring(0, 1);
+ }
+ for (Item item : cart.values()) {
+ total += Double.valueOf(item.getPrice().substring(1));
+ }
+ return currencySymbol + String.valueOf(total);
+ }
+}
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/applications/store/src/main/java/services/Total.java b/sca-java-2.x/branches/2.0-Beta3/samples/applications/store/src/main/java/services/Total.java
new file mode 100644
index 0000000000..b77cc1c7ac
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/applications/store/src/main/java/services/Total.java
@@ -0,0 +1,29 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package services;
+
+import org.oasisopen.sca.annotation.Remotable;
+
+@Remotable
+public interface Total {
+
+ String getTotal();
+
+}
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/applications/store/src/main/resources/store.composite b/sca-java-2.x/branches/2.0-Beta3/samples/applications/store/src/main/resources/store.composite
new file mode 100644
index 0000000000..9c3b79c508
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/applications/store/src/main/resources/store.composite
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<composite xmlns="http://docs.oasis-open.org/ns/opencsa/sca/200912"
+ xmlns:tuscany="http://tuscany.apache.org/xmlns/sca/1.1"
+ targetNamespace="http://store"
+ name="store">
+
+ <component name="Store">
+ <tuscany:implementation.widget location="uiservices/store.html"/>
+ <service name="Widget">
+ <tuscany:binding.http uri="/store"/>
+ </service>
+ <reference name="catalog" target="Catalog"/>
+ <reference name="shoppingCart" target="ShoppingCart/Cart"/>
+ <reference name="shoppingTotal" target="ShoppingCart/Total"/>
+ </component>
+
+ <component name="Catalog">
+ <implementation.java class="services.FruitsCatalogImpl"/>
+ <property name="currencyCode">USD</property>
+ <service name="Catalog">
+ <tuscany:binding.jsonrpc uri="/Catalog"/>
+ </service>
+ <reference name="currencyConverter" target="CurrencyConverter"/>
+ </component>
+
+ <component name="ShoppingCart">
+ <implementation.java class="services.ShoppingCartImpl"/>
+ <service name="Cart">
+ <tuscany:binding.atom uri="/ShoppingCart/Cart"/>
+ </service>
+ <service name="Total">
+ <tuscany:binding.jsonrpc uri="/ShoppingCart/Total"/>
+ </service>
+ </component>
+
+ <component name="CurrencyConverter">
+ <implementation.java class="services.CurrencyConverterImpl"/>
+ </component>
+
+</composite>
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/applications/store/src/main/resources/uiservices/store.html b/sca-java-2.x/branches/2.0-Beta3/samples/applications/store/src/main/resources/uiservices/store.html
new file mode 100644
index 0000000000..be3efea327
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/applications/store/src/main/resources/uiservices/store.html
@@ -0,0 +1,162 @@
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<html>
+<head>
+<title>Store</title>
+
+<script type="text/javascript" src="../dojo/dojo.js"></script>
+<script type="text/javascript" src="store.js"></script>
+
+<script language="JavaScript">
+
+ //@Reference
+ var catalog = new tuscany.sca.Reference("catalog");
+
+ //@Reference
+ var shoppingCart = new tuscany.sca.Reference("shoppingCart");
+
+ //@Reference
+ var shoppingTotal = new tuscany.sca.Reference("shoppingTotal");
+
+ var catalogItems;
+
+ function catalog_getResponse(items,exception) {
+ if(exception){
+ alert(exception.message);
+ return;
+ }
+ var catalog = "";
+
+ for (var i=0; i<items.length; i++) {
+ var item = items[i].name + ' - ' + items[i].price;
+ catalog += '<input name="items" type="checkbox" value="' +
+ item + '">' + item + ' <br>';
+ }
+ document.getElementById('catalog').innerHTML=catalog;
+ catalogItems = items;
+ }
+
+ function shoppingCart_getResponse(feed) {
+ if (feed != null) {
+ var entries = feed.getElementsByTagName("entry");
+ var list = "";
+ for (var i=0; i<entries.length; i++) {
+ var content = entries[i].getElementsByTagName("content")[0];
+ var name = content.getElementsByTagName("name")[0].firstChild.nodeValue;
+ var price = content.getElementsByTagName("price")[0].firstChild.nodeValue;
+ list += name + ' - ' + price + ' <br>';
+ }
+ document.getElementById("shoppingCart").innerHTML = list;
+
+ if (entries.length != 0) {
+ try {
+ shoppingTotal.getTotal().addCallback(shoppingTotal_getTotalResponse);
+ }
+ catch(e){
+ alert(e);
+ }
+ }
+ }
+ }
+
+ function shoppingTotal_getTotalResponse(total,exception) {
+ if(exception) {
+ alert(exception.message);
+ return;
+ }
+ document.getElementById('total').innerHTML = total;
+ }
+
+ function shoppingCart_postResponse(entry) {
+ shoppingCart.get("").addCallback(shoppingCart_getResponse);
+ }
+
+ function addToCart() {
+ var items = document.catalogForm.items;
+ var j = 0;
+ for (var i=0; i<items.length; i++) {
+ if (items[i].checked) {
+ var entry = '<entry xmlns="http://www.w3.org/2005/Atom"><title>item</title><content type="text/xml">' +
+ '<Item xmlns="http://services/">' +
+ '<name xmlns="">' + catalogItems[i].name + '</name>' + '<price xmlns="">' + catalogItems[i].price + '</price>' +
+ '</Item>' + '</content></entry>';
+ shoppingCart.post(entry).addCallback(shoppingCart_postResponse);
+ items[i].checked = false;
+ }
+ }
+ }
+ function checkoutCart() {
+ document.getElementById('store').innerHTML='<h2>' +
+ 'Thanks for Shopping With Us!</h2>'+
+ '<h2>Your Order</h2>'+
+ '<form name="orderForm">'+
+ document.getElementById('shoppingCart').innerHTML+
+ '<br>'+
+ document.getElementById('total').innerHTML+
+ '<br>'+
+ '<br>'+
+ '<input type="submit" value="Continue Shopping">'+
+ '</form>';
+ shoppingCart.del("");
+ }
+ function deleteCart() {
+ shoppingCart.del("");
+ document.getElementById('shoppingCart').innerHTML = "";
+ document.getElementById('total').innerHTML = "";
+ }
+
+ function init() {
+ try {
+ catalog.get().addCallback(catalog_getResponse);
+ shoppingCart.get("").addCallback(shoppingCart_getResponse);
+ }
+ catch(e){
+ alert(e);
+ }
+ }
+
+</script>
+
+</head>
+
+<body onload="init()">
+<h1>Store</h1>
+ <div id="store">
+ <h2>Catalog</h2>
+ <form name="catalogForm">
+ <div id="catalog" ></div>
+ <br>
+ <input type="button" onClick="addToCart()" value="Add to Cart">
+ </form>
+
+ <br>
+
+ <h2>Your Shopping Cart</h2>
+ <form name="shoppingCartForm">
+ <div id="shoppingCart"></div>
+ <br>
+ <div id="total"></div>
+ <br>
+ <input type="button" onClick="checkoutCart()" value="Checkout">
+ <input type="button" onClick="deleteCart()" value="Empty">
+ <a href="../ShoppingCart/Cart/">(feed)</a>
+ </form>
+ </div>
+</body>
+</html>
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/applications/store/src/test/java/client/Shopper.java b/sca-java-2.x/branches/2.0-Beta3/samples/applications/store/src/test/java/client/Shopper.java
new file mode 100644
index 0000000000..4e2fa63493
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/applications/store/src/test/java/client/Shopper.java
@@ -0,0 +1,29 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package client;
+
+import org.oasisopen.sca.annotation.Remotable;
+
+@Remotable
+public interface Shopper {
+
+ String shop(String itemName, int quantity);
+
+}
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/applications/store/src/test/java/client/ShopperImpl.java b/sca-java-2.x/branches/2.0-Beta3/samples/applications/store/src/test/java/client/ShopperImpl.java
new file mode 100644
index 0000000000..05b1800d4f
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/applications/store/src/test/java/client/ShopperImpl.java
@@ -0,0 +1,64 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package client;
+
+import org.apache.tuscany.sca.data.collection.NotFoundException;
+import org.oasisopen.sca.annotation.Reference;
+
+import services.Cart;
+import services.Catalog;
+import services.Item;
+import services.Total;
+
+public class ShopperImpl implements Shopper {
+
+ @Reference
+ public Catalog catalog;
+
+ @Reference
+ public Cart shoppingCart;
+
+ @Reference
+ public Total shoppingTotal;
+
+ public String shop(String itemName, int quantity) {
+
+ Item[] items = catalog.get();
+ for (Item item: items) {
+ if (item.getName().startsWith(itemName)) {
+
+ try {
+ shoppingCart.delete("");
+ } catch (NotFoundException e) {
+ // ignore
+ }
+
+ for (int i = 0; i < quantity; i++) {
+ shoppingCart.post("item" + i, item);
+ }
+
+ return shoppingTotal.getTotal();
+ }
+ }
+
+ return "";
+ }
+
+}
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/applications/store/src/test/java/store/StoreTestCase.java b/sca-java-2.x/branches/2.0-Beta3/samples/applications/store/src/test/java/store/StoreTestCase.java
new file mode 100644
index 0000000000..7fa866d1c6
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/applications/store/src/test/java/store/StoreTestCase.java
@@ -0,0 +1,121 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package store;
+
+import java.io.IOException;
+import java.net.MalformedURLException;
+
+import junit.framework.Assert;
+
+import org.apache.tuscany.sca.node.Contribution;
+import org.apache.tuscany.sca.node.ContributionLocationHelper;
+import org.apache.tuscany.sca.node.Node;
+import org.apache.tuscany.sca.node.NodeFactory;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Ignore;
+import org.junit.Test;
+
+import client.Shopper;
+
+import com.gargoylesoftware.htmlunit.BrowserVersion;
+import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException;
+import com.gargoylesoftware.htmlunit.NicelyResynchronizingAjaxController;
+import com.gargoylesoftware.htmlunit.WebClient;
+import com.gargoylesoftware.htmlunit.html.HtmlCheckBoxInput;
+import com.gargoylesoftware.htmlunit.html.HtmlForm;
+import com.gargoylesoftware.htmlunit.html.HtmlPage;
+
+
+/**
+ * Test the store-merger.
+ *
+ * @version $Rev$ $Date$
+ */
+public class StoreTestCase {
+ private static Node nodeStore;
+
+ public static void main(String[] args) throws Exception {
+ setUp();
+ testWaitForInput();
+ tearDown();
+ }
+
+ @BeforeClass
+ public static void setUp() throws Exception {
+ String storeLocation = ContributionLocationHelper.getContributionLocation("store.composite");
+ String storeClientLocation = ContributionLocationHelper.getContributionLocation("store-client.composite");
+
+ nodeStore = NodeFactory.newInstance().createNode(new Contribution("store", storeLocation), new Contribution("storeClient", storeClientLocation));
+ nodeStore.start();
+ }
+
+ @AfterClass
+ public static void tearDown() throws Exception {
+ nodeStore.stop();
+ }
+
+ public static void testWaitForInput() {
+ try {
+ System.out.println("press enter to continue)");
+ System.in.read();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ @Test
+ public void testShop() {
+ Shopper shopper = nodeStore.getService(Shopper.class, "StoreClient");
+
+ String total = shopper.shop("Orange", 5);
+ System.out.println("Total: " + total);
+
+ Assert.assertEquals("$17.75", total);
+
+ }
+
+ @Test
+ public void testStoreWidget() throws FailingHttpStatusCodeException, MalformedURLException, IOException {
+ WebClient webClient = new WebClient(BrowserVersion.FIREFOX_3);
+ webClient.setRedirectEnabled(true);
+ webClient.setThrowExceptionOnScriptError(false);
+ //webClient.waitForBackgroundJavaScript(100000);
+ //webClient.waitForBackgroundJavaScriptStartingBefore(100000);
+ webClient.setAjaxController(new NicelyResynchronizingAjaxController());
+
+ HtmlPage page = (HtmlPage) webClient.getPage("http://localhost:8080/store/store.html");
+
+ HtmlForm form = (HtmlForm) page.getFormByName("catalogForm");
+
+ try {
+ Thread.sleep(1000);
+ } catch (InterruptedException e) {
+ }
+
+ HtmlCheckBoxInput catalogItems = (HtmlCheckBoxInput) form.getInputByName("items");
+
+ System.out.println(">>>" + catalogItems.getAttribute("value"));
+ Assert.assertEquals("Apple - $2.99", catalogItems.getAttribute("value"));
+
+ webClient.closeAllWindows();
+ }
+
+}
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/applications/store/src/test/resources/store-client.composite b/sca-java-2.x/branches/2.0-Beta3/samples/applications/store/src/test/resources/store-client.composite
new file mode 100644
index 0000000000..c9abe8e996
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/applications/store/src/test/resources/store-client.composite
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<composite xmlns="http://docs.oasis-open.org/ns/opencsa/sca/200912"
+ xmlns:tuscany="http://tuscany.apache.org/xmlns/sca/1.1"
+ targetNamespace="http://store"
+ name="store-client">
+
+ <component name="StoreClient">
+ <implementation.java class="client.ShopperImpl"/>
+ <reference name="catalog">
+ <tuscany:binding.jsonrpc uri="http://localhost:8080/Catalog"/>
+ </reference>
+ <reference name="shoppingCart">
+ <tuscany:binding.atom uri="http://localhost:8080/ShoppingCart/Cart"/>
+ </reference>
+ <reference name="shoppingTotal">
+ <tuscany:binding.jsonrpc uri="http://localhost:8080/ShoppingCart/Total"/>
+ </reference>
+ </component>
+
+</composite>
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/applications/store/store.png b/sca-java-2.x/branches/2.0-Beta3/samples/applications/store/store.png
new file mode 100644
index 0000000000..da413edeee
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/applications/store/store.png
Binary files differ
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/applications/store/store.svg b/sca-java-2.x/branches/2.0-Beta3/samples/applications/store/store.svg
new file mode 100644
index 0000000000..74f8ecd36d
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/applications/store/store.svg
@@ -0,0 +1,304 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://web.resource.org/cc/"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="1052.3622"
+ height="744.09448"
+ id="svg2"
+ sodipodi:version="0.32"
+ inkscape:version="0.45.1"
+ sodipodi:docbase="C:\simon\tuscany\java-head\sca\samples\store"
+ sodipodi:docname="store.svg"
+ version="1.0"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape"
+ inkscape:export-filename="C:\simon\tuscany\java-head\sca\samples\store\store.png"
+ inkscape:export-xdpi="52.84"
+ inkscape:export-ydpi="52.84">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ gridtolerance="10000"
+ guidetolerance="10"
+ objecttolerance="10"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1.4"
+ inkscape:cx="538.06165"
+ inkscape:cy="341.69129"
+ inkscape:document-units="px"
+ inkscape:current-layer="g2997"
+ inkscape:window-width="1466"
+ inkscape:window-height="831"
+ inkscape:window-x="117"
+ inkscape:window-y="80" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1">
+ <g
+ id="g2997">
+ <rect
+ rx="14.335117"
+ ry="17.743465"
+ y="197.1973"
+ x="447.35422"
+ height="419.39099"
+ width="464.23727"
+ id="rect2067"
+ style="opacity:1;fill:#90baf4;fill-opacity:1;stroke:#060000;stroke-width:2.28840661;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <flowRoot
+ id="flowRoot2954"
+ xml:space="preserve"
+ transform="translate(189.90868,1.0101522)"><flowRegion
+ id="flowRegion2956"><rect
+ y="212.66591"
+ x="281.42856"
+ height="61.42857"
+ width="170"
+ id="rect2958" /></flowRegion><flowPara
+ id="flowPara2171">store</flowPara></flowRoot> <rect
+ style="fill:#317fed;fill-opacity:1;stroke:#060000;stroke-width:2.30182266;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect2175"
+ width="118.21779"
+ height="111.27543"
+ x="491.60019"
+ y="247.75989"
+ rx="7.1507306"
+ ry="9.2311935" />
+ <flowRoot
+ xml:space="preserve"
+ id="flowRoot2177"
+ transform="translate(223.8585,41.670449)"><flowRegion
+ id="flowRegion2179"><rect
+ id="rect2181"
+ width="170"
+ height="61.42857"
+ x="281.42856"
+ y="212.66591" /></flowRegion><flowPara
+ id="flowPara2183">ufs</flowPara></flowRoot> <path
+ style="fill:#5b9d05;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="M 474.29877,279.45598 L 507.63381,279.45598 L 513.69472,292.58796 L 506.62366,304.7098 L 474.29877,304.7098 L 481.87492,292.58796 L 474.29877,279.45598 z "
+ id="path2187" />
+ <rect
+ style="fill:#317fed;fill-opacity:1;stroke:#060000;stroke-width:2;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect2191"
+ width="115.66247"
+ height="85.862968"
+ x="493.07068"
+ y="503.27759"
+ rx="6.9961648"
+ ry="7.1230249" />
+ <flowRoot
+ xml:space="preserve"
+ id="flowRoot2193"
+ transform="translate(225.47992,297.33908)"><flowRegion
+ id="flowRegion2195"><rect
+ id="rect2197"
+ width="170"
+ height="61.42857"
+ x="281.42856"
+ y="212.66591" /></flowRegion><flowPara
+ id="flowPara2199">ShoppingCart</flowPara></flowRoot> <path
+ style="fill:#5b9d05;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="M 475.92019,535.12461 L 509.25523,535.12461 L 515.31614,548.25659 L 508.24508,560.37843 L 475.92019,560.37843 L 483.49634,548.25659 L 475.92019,535.12461 z "
+ id="path2203" />
+ <rect
+ style="fill:#317fed;fill-opacity:1;stroke:#060000;stroke-width:2;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect2207"
+ width="115.66247"
+ height="85.862968"
+ x="761.44415"
+ y="391.31604"
+ rx="6.9961648"
+ ry="7.1230249" />
+ <flowRoot
+ xml:space="preserve"
+ id="flowRoot2209"
+ transform="translate(487.8534,185.37751)"><flowRegion
+ id="flowRegion2211"><rect
+ id="rect2213"
+ width="170"
+ height="61.42857"
+ x="281.42856"
+ y="212.66591" /></flowRegion><flowPara
+ id="flowPara2215">CurrencyConverter</flowPara></flowRoot> <path
+ style="fill:#5b9d05;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="M 744.29367,423.16304 L 777.62871,423.16304 L 783.68962,436.29502 L 776.61856,448.41686 L 744.29367,448.41686 L 751.86982,436.29502 L 744.29367,423.16304 z "
+ id="path2219" />
+ <rect
+ style="opacity:1;fill:#0064ff;fill-opacity:1;stroke:#000000;stroke-width:0.9612025;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect2223"
+ width="104.08451"
+ height="113.17588"
+ x="138.37151"
+ y="350.1156"
+ rx="0"
+ ry="0.048917599" />
+ <path
+ style="fill:#1a73fe;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:1"
+ d="M 138.21429,462.66591 L 115.35714,479.80877 L 267.85714,479.80877 L 241.78571,463.02305 L 138.21429,462.66591 z "
+ id="path3197" />
+ <rect
+ style="opacity:1;fill:#f1f4f8;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect3199"
+ width="92.5"
+ height="97.14286"
+ x="143.57143"
+ y="358.38019"
+ ry="3.6203461"
+ rx="3.9285715" />
+ <image
+ y="366.6889"
+ x="156.24066"
+ id="image3323"
+ height="78.571434"
+ width="58.57143"
+ sodipodi:absref="C:\simon\tuscany\evangelism\whitepapers\shoppingcart.png"
+ xlink:href="C:\simon\tuscany\evangelism\whitepapers\shoppingcart.png" />
+ <image
+ y="270.52304"
+ x="526.42859"
+ id="image3342"
+ height="78.571434"
+ width="58.57143"
+ sodipodi:absref="C:\simon\tuscany\evangelism\whitepapers\shoppingcart.png"
+ xlink:href="C:\simon\tuscany\evangelism\whitepapers\shoppingcart.png" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="M 242.85714,374.80877 C 245.71429,374.80877 345.71429,374.80877 345.71429,374.80877 L 345.71429,291.95162 L 481.42858,291.95162"
+ id="path3348"
+ sodipodi:nodetypes="cccc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="M 210.71429,406.95163 L 345,406.95163 L 345,437.66591 L 481.42857,437.66591"
+ id="path3350"
+ sodipodi:nodetypes="cccc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="M 210.71429,439.09448 L 325.71429,439.09448 L 325.71429,548.3802 L 482.85714,548.3802"
+ id="path3352"
+ sodipodi:nodetypes="cccc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="M 626.42857,436.23734 C 750,437.66591 752.14286,436.23734 752.14286,436.23734"
+ id="path3354"
+ sodipodi:nodetypes="cc" />
+ <flowRoot
+ xml:space="preserve"
+ id="flowRoot3356"
+ transform="translate(-94.285714,25)"><flowRegion
+ id="flowRegion3358"><rect
+ id="rect3360"
+ width="142.14285"
+ height="21.428572"
+ x="655"
+ y="349.80878" /></flowRegion><flowPara
+ id="flowPara3362">CurrenyCode</flowPara></flowRoot> <flowRoot
+ xml:space="preserve"
+ id="flowRoot3364"
+ transform="translate(-250.76562,-76.210859)"><flowRegion
+ id="flowRegion3366"><rect
+ id="rect3368"
+ width="142.14285"
+ height="21.428572"
+ x="655"
+ y="349.80878" /></flowRegion><flowPara
+ id="flowPara3370">HTTP</flowPara></flowRoot> <flowRoot
+ xml:space="preserve"
+ id="flowRoot3372"
+ transform="translate(-273.62277,70.931998)"><flowRegion
+ id="flowRegion3374"><rect
+ id="rect3376"
+ width="142.14285"
+ height="21.428572"
+ x="655"
+ y="349.80878" /></flowRegion><flowPara
+ id="flowPara3378">JSONRPC</flowPara></flowRoot> <flowRoot
+ xml:space="preserve"
+ id="flowRoot3380"
+ transform="translate(-243.62277,183.07485)"><flowRegion
+ id="flowRegion3382"><rect
+ id="rect3384"
+ width="142.14285"
+ height="21.428572"
+ x="655"
+ y="349.80878" /></flowRegion><flowPara
+ id="flowPara3386">Atom</flowPara></flowRoot> </g>
+ <rect
+ style="fill:#317fed;fill-opacity:1;stroke:#060000;stroke-width:2;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect2988"
+ width="115.66247"
+ height="85.862968"
+ x="491.56897"
+ y="392.70135"
+ rx="6.9961648"
+ ry="7.1230249" />
+ <flowRoot
+ xml:space="preserve"
+ id="flowRoot2966"
+ transform="translate(223.97819,186.76283)"><flowRegion
+ id="flowRegion2968"><rect
+ id="rect2970"
+ width="170"
+ height="61.42857"
+ x="281.42856"
+ y="212.66591" /></flowRegion><flowPara
+ id="flowPara2972">Catalog</flowPara></flowRoot> <rect
+ style="opacity:1;fill:#fff62c;fill-opacity:1;stroke:#060000;stroke-width:1;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect3006"
+ width="21.718224"
+ height="20.708065"
+ x="537.53094"
+ y="377.04398"
+ rx="10.859112"
+ ry="0" />
+ <path
+ style="fill:#5b9d05;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="M 474.41846,424.54836 L 507.7535,424.54836 L 513.81441,437.68034 L 506.74335,449.80218 L 474.41846,449.80218 L 481.99461,437.68034 L 474.41846,424.54836 z "
+ id="path3017" />
+ <path
+ style="fill:#ae62bf;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="M 587.6709,422.71008 L 621.00594,422.71008 L 627.06685,435.84206 L 619.99579,447.9639 L 587.6709,447.9639 L 595.24705,435.84206 L 587.6709,422.71008 z "
+ id="path3019" />
+ </g>
+</svg>
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/getting-started.odt b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/getting-started.odt
new file mode 100644
index 0000000000..078cce7478
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/getting-started.odt
Binary files differ
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/getting-started.pdf b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/getting-started.pdf
new file mode 100644
index 0000000000..23f272d0c2
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/getting-started.pdf
Binary files differ
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-jaxrs/README b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-jaxrs/README
new file mode 100644
index 0000000000..ae2a0101e0
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-jaxrs/README
@@ -0,0 +1,22 @@
+Tuscany - Getting Started - Helloworld JAX-RS Sample
+----------------------------------------------------
+
+This sample extends the helloworld sample to make the helloworld service available as an HTTP endpoint by using JAX-RS and the Tuscany REST binding.
+
+The changes to the helloworld sample are:
+- update the pom.xml with the additional dependencies
+- add a new Java interface which uses JAX-RS annotations
+- update the composite to use the new interface and binding
+
+As with all the getting-started samples you can run this sample with:
+
+ mvn tuscany:run
+
+Then at a web browser enter the following URL:
+
+http://localhost:8080/HelloworldComponent/Helloworld/sayHello?name=world
+
+which should return a page saying:
+
+Hello world
+
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-jaxrs/pom.xml b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-jaxrs/pom.xml
new file mode 100644
index 0000000000..ff38e2cdce
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-jaxrs/pom.xml
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.apache.tuscany.sca.samples</groupId>
+ <artifactId>tuscany-samples</artifactId>
+ <version>2.0-Beta3-SNAPSHOT</version>
+ <relativePath />
+ </parent>
+ <artifactId>helloworld-jaxrs</artifactId>
+ <version>2.0-Beta3-SNAPSHOT</version>
+
+ <name>Apache Tuscany SCA Samples Helloworld JAX-RS</name>
+
+ <properties>
+ <tuscany.version>${project.version}</tuscany.version>
+ </properties>
+
+ <!-- ASF repositories so sample can be built from SVN without building trunk-->
+ <repositories><repository>
+ <id>apache.snapshots</id>
+ <name>Apache Snapshot Repository</name>
+ <url>http://repository.apache.org/snapshots</url>
+ <releases><enabled>false</enabled></releases>
+ </repository></repositories>
+ <pluginRepositories><pluginRepository>
+ <id>apache.snapshots</id>
+ <name>Apache Snapshot Repository</name>
+ <url>http://repository.apache.org/snapshots</url>
+ <releases><enabled>false</enabled></releases>
+ </pluginRepository></pluginRepositories>
+
+ <dependencies>
+
+ <dependency>
+ <groupId>org.apache.tuscany.sca</groupId>
+ <artifactId>tuscany-sca-api</artifactId>
+ <version>${tuscany.version}</version>
+ <scope>provided</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>javax.ws.rs</groupId>
+ <artifactId>jsr311-api</artifactId>
+ <version>1.1.1</version>
+ <scope>provided</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <version>4.8.1</version>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.tuscany.sca</groupId>
+ <artifactId>tuscany-base-runtime</artifactId>
+ <version>${tuscany.version}</version>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.tuscany.sca</groupId>
+ <artifactId>tuscany-binding-rest-runtime</artifactId>
+ <version>${tuscany.version}</version>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.mortbay.jetty</groupId>
+ <artifactId>jetty</artifactId>
+ <version>6.1.26</version>
+ <scope>test</scope>
+ </dependency>
+
+ </dependencies>
+
+ <build>
+
+ <plugins>
+
+ <!-- to support running the composite with mvn tuscany:run -->
+ <plugin>
+ <groupId>org.apache.tuscany.sca</groupId>
+ <artifactId>tuscany-maven-plugin</artifactId>
+ <version>${tuscany.version}</version>
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.tuscany.sca</groupId>
+ <artifactId>tuscany-binding-rest-runtime</artifactId>
+ <version>${tuscany.version}</version>
+ </dependency>
+ </dependencies>
+ </plugin>
+ </plugins>
+
+ </build>
+
+</project>
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-jaxrs/src/main/java/sample/Helloworld.java b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-jaxrs/src/main/java/sample/Helloworld.java
new file mode 100644
index 0000000000..f4e8c50448
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-jaxrs/src/main/java/sample/Helloworld.java
@@ -0,0 +1,28 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package sample;
+
+import org.oasisopen.sca.annotation.Remotable;
+
+@Remotable
+public interface Helloworld {
+
+ String sayHello(String name);
+
+}
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-jaxrs/src/main/java/sample/HelloworldImpl.java b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-jaxrs/src/main/java/sample/HelloworldImpl.java
new file mode 100644
index 0000000000..089b1a4290
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-jaxrs/src/main/java/sample/HelloworldImpl.java
@@ -0,0 +1,27 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package sample;
+
+public class HelloworldImpl implements Helloworld {
+
+ public String sayHello(String name) {
+ return "Hello " + name;
+ }
+
+}
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-jaxrs/src/main/java/sample/JaxrsHelloworld.java b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-jaxrs/src/main/java/sample/JaxrsHelloworld.java
new file mode 100644
index 0000000000..a944736144
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-jaxrs/src/main/java/sample/JaxrsHelloworld.java
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package sample;
+
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.QueryParam;
+import javax.ws.rs.core.MediaType;
+
+import org.oasisopen.sca.annotation.Remotable;
+
+@Remotable
+public interface JaxrsHelloworld {
+
+ @GET
+ @Path("sayHello")
+ @Produces(MediaType.TEXT_PLAIN)
+ String sayHello(@QueryParam("name") String name);
+}
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-jaxrs/src/main/resources/META-INF/sca-contribution.xml b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-jaxrs/src/main/resources/META-INF/sca-contribution.xml
new file mode 100644
index 0000000000..95c32fb5bf
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-jaxrs/src/main/resources/META-INF/sca-contribution.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<contribution xmlns="http://docs.oasis-open.org/ns/opencsa/sca/200912"
+ xmlns:sample="http://sample">
+
+ <deployable composite="sample:helloworld-contribution" />
+
+</contribution>
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-jaxrs/src/main/resources/helloworld.composite b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-jaxrs/src/main/resources/helloworld.composite
new file mode 100644
index 0000000000..88df3636c3
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-jaxrs/src/main/resources/helloworld.composite
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<composite xmlns="http://docs.oasis-open.org/ns/opencsa/sca/200912"
+ xmlns:tuscany="http://tuscany.apache.org/xmlns/sca/1.1"
+ targetNamespace="http://sample"
+ name="helloworld-contribution">
+
+ <component name="HelloworldComponent">
+ <implementation.java class="sample.HelloworldImpl"/>
+ <service name="Helloworld">
+ <interface.java interface="sample.JaxrsHelloworld"/>
+ <tuscany:binding.rest/>
+ </service>
+ </component>
+
+</composite>
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-jaxrs/src/test/java/sample/HelloworldTestCase.java b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-jaxrs/src/test/java/sample/HelloworldTestCase.java
new file mode 100644
index 0000000000..93a9a0e719
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-jaxrs/src/test/java/sample/HelloworldTestCase.java
@@ -0,0 +1,71 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package sample;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.net.URL;
+
+import org.apache.tuscany.sca.Node;
+import org.apache.tuscany.sca.TuscanyRuntime;
+import org.apache.tuscany.sca.contribution.processor.ContributionReadException;
+import org.apache.tuscany.sca.monitor.ValidationException;
+import org.apache.tuscany.sca.runtime.ActivationException;
+import org.junit.Assert;
+import org.junit.Test;
+import org.oasisopen.sca.NoSuchServiceException;
+
+public class HelloworldTestCase {
+
+ @Test
+ public void testSayHello() throws NoSuchServiceException, IOException, ContributionReadException, ActivationException, ValidationException {
+
+ // Run the SCA composite in a Tuscany runtime
+ Node node = TuscanyRuntime.runComposite("helloworld.composite", "target/classes");
+ try {
+
+ // test that has exposed an HTTP endpoint that works as expected
+ URL url = new URL("http://localhost:8080/HelloworldComponent/Helloworld/sayHello?name=Amelia");
+ Assert.assertEquals("Hello Amelia", read(url.openStream()));
+
+ } finally {
+ // Stop the Tuscany runtime Node
+ node.stop();
+ }
+ }
+
+ private static String read(InputStream is) throws IOException {
+ BufferedReader reader = null;
+ try {
+ reader = new BufferedReader(new InputStreamReader(is));
+ StringBuffer sb = new StringBuffer();
+ String str;
+ while ((str = reader.readLine()) != null) {
+ sb.append(str);
+ }
+ return sb.toString();
+ } finally {
+ if (reader != null) {
+ reader.close();
+ }
+ }
+ }
+}
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-jsonp/README b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-jsonp/README
new file mode 100644
index 0000000000..5a99f91036
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-jsonp/README
@@ -0,0 +1,23 @@
+Tuscany - Getting Started - Helloworld JSONP Sample
+---------------------------------------------------
+
+This sample extends the helloworld sample to make the helloworld service available as an HTTP endpoint using JSONP.
+JSONP is a protocol supported by many Web clients that enables client requests to a server in a different domain.
+
+The changes to the helloworld sample are:
+- update the pom.xml with the additional dependencies
+- update the composite to use the JSONP binding
+
+As with all the getting-started samples you can run this sample with:
+
+ mvn tuscany:run
+
+Then at a web browser enter the following URL:
+
+http://localhost:8080/HelloworldComponent/Helloworld/sayHello?name=world&callback=respFunc
+
+which should return a page saying:
+
+respFunc("Hello world");
+
+
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-jsonp/pom.xml b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-jsonp/pom.xml
new file mode 100644
index 0000000000..78eac50efd
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-jsonp/pom.xml
@@ -0,0 +1,113 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.apache.tuscany.sca.samples</groupId>
+ <artifactId>tuscany-samples</artifactId>
+ <version>2.0-Beta3-SNAPSHOT</version>
+ <relativePath />
+ </parent>
+
+ <artifactId>helloworld-jsonp</artifactId>
+ <version>2.0-Beta3-SNAPSHOT</version>
+
+ <name>Apache Tuscany SCA Samples Helloworld JSONP</name>
+
+ <properties>
+ <tuscany.version>${project.version}</tuscany.version>
+ </properties>
+
+ <!-- ASF repositories so sample can be built from SVN without building trunk-->
+ <repositories><repository>
+ <id>apache.snapshots</id>
+ <name>Apache Snapshot Repository</name>
+ <url>http://repository.apache.org/snapshots</url>
+ <releases><enabled>false</enabled></releases>
+ </repository></repositories>
+ <pluginRepositories><pluginRepository>
+ <id>apache.snapshots</id>
+ <name>Apache Snapshot Repository</name>
+ <url>http://repository.apache.org/snapshots</url>
+ <releases><enabled>false</enabled></releases>
+ </pluginRepository></pluginRepositories>
+
+ <dependencies>
+
+ <dependency>
+ <groupId>org.apache.tuscany.sca</groupId>
+ <artifactId>tuscany-sca-api</artifactId>
+ <version>${tuscany.version}</version>
+ <scope>provided</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <version>4.8.1</version>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.tuscany.sca</groupId>
+ <artifactId>tuscany-base-runtime</artifactId>
+ <version>${tuscany.version}</version>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.tuscany.sca</groupId>
+ <artifactId>tuscany-binding-jsonp-runtime</artifactId>
+ <version>${tuscany.version}</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.mortbay.jetty</groupId>
+ <artifactId>jetty</artifactId>
+ <version>6.1.26</version>
+ <scope>test</scope>
+ </dependency>
+
+ </dependencies>
+
+ <build>
+
+ <plugins>
+
+ <!-- to support running the composite with mvn tuscany:run -->
+ <plugin>
+ <groupId>org.apache.tuscany.sca</groupId>
+ <artifactId>tuscany-maven-plugin</artifactId>
+ <version>${tuscany.version}</version>
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.tuscany.sca</groupId>
+ <artifactId>tuscany-binding-jsonp-runtime</artifactId>
+ <version>${tuscany.version}</version>
+ </dependency>
+ </dependencies>
+ </plugin>
+ </plugins>
+
+ </build>
+
+</project>
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-jsonp/src/main/java/sample/Helloworld.java b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-jsonp/src/main/java/sample/Helloworld.java
new file mode 100644
index 0000000000..f4e8c50448
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-jsonp/src/main/java/sample/Helloworld.java
@@ -0,0 +1,28 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package sample;
+
+import org.oasisopen.sca.annotation.Remotable;
+
+@Remotable
+public interface Helloworld {
+
+ String sayHello(String name);
+
+}
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-jsonp/src/main/java/sample/HelloworldImpl.java b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-jsonp/src/main/java/sample/HelloworldImpl.java
new file mode 100644
index 0000000000..089b1a4290
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-jsonp/src/main/java/sample/HelloworldImpl.java
@@ -0,0 +1,27 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package sample;
+
+public class HelloworldImpl implements Helloworld {
+
+ public String sayHello(String name) {
+ return "Hello " + name;
+ }
+
+}
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-jsonp/src/main/resources/META-INF/sca-contribution.xml b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-jsonp/src/main/resources/META-INF/sca-contribution.xml
new file mode 100644
index 0000000000..95c32fb5bf
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-jsonp/src/main/resources/META-INF/sca-contribution.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<contribution xmlns="http://docs.oasis-open.org/ns/opencsa/sca/200912"
+ xmlns:sample="http://sample">
+
+ <deployable composite="sample:helloworld-contribution" />
+
+</contribution>
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-jsonp/src/main/resources/helloworld.composite b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-jsonp/src/main/resources/helloworld.composite
new file mode 100644
index 0000000000..4c33fd2b70
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-jsonp/src/main/resources/helloworld.composite
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<composite xmlns="http://docs.oasis-open.org/ns/opencsa/sca/200912"
+ xmlns:tuscany="http://tuscany.apache.org/xmlns/sca/1.1"
+ targetNamespace="http://sample"
+ name="helloworld-contribution">
+
+ <component name="HelloworldComponent">
+ <implementation.java class="sample.HelloworldImpl"/>
+ <service name="Helloworld">
+ <tuscany:binding.jsonp/>
+ </service>
+ </component>
+
+</composite>
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-jsonp/src/test/java/sample/HelloworldTestCase.java b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-jsonp/src/test/java/sample/HelloworldTestCase.java
new file mode 100644
index 0000000000..7951e4d6e8
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-jsonp/src/test/java/sample/HelloworldTestCase.java
@@ -0,0 +1,74 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package sample;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.net.URL;
+
+import org.apache.tuscany.sca.Node;
+import org.apache.tuscany.sca.TuscanyRuntime;
+import org.junit.Assert;
+import org.junit.Test;
+import org.oasisopen.sca.NoSuchServiceException;
+
+public class HelloworldTestCase {
+
+ @Test
+ public void testSayHello() throws NoSuchServiceException, IOException {
+
+ // Run the SCA composite in a Tuscany runtime
+ Node node = TuscanyRuntime.runComposite("helloworld.composite", "target/classes");
+ try {
+
+ // Get the Helloworld service proxy
+ Helloworld helloworld = node.getService(Helloworld.class, "HelloworldComponent");
+
+ // test that it works as expected
+ Assert.assertEquals("Hello Amelia", helloworld.sayHello("Amelia"));
+
+ // test that has exposed an HTTP endpoint that works as expected
+ URL url = new URL("http://localhost:8080/HelloworldComponent/Helloworld/sayHello?name=Amelia&callback=someFunc");
+ Assert.assertEquals("someFunc(\"Hello Amelia\");", read(url.openStream()));
+
+ } finally {
+ // Stop the Tuscany runtime Node
+ node.stop();
+ }
+ }
+
+ private static String read(InputStream is) throws IOException {
+ BufferedReader reader = null;
+ try {
+ reader = new BufferedReader(new InputStreamReader(is));
+ StringBuffer sb = new StringBuffer();
+ String str;
+ while ((str = reader.readLine()) != null) {
+ sb.append(str);
+ }
+ return sb.toString();
+ } finally {
+ if (reader != null) {
+ reader.close();
+ }
+ }
+ }
+}
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-jsonrpc/README b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-jsonrpc/README
new file mode 100644
index 0000000000..c197ddcd95
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-jsonrpc/README
@@ -0,0 +1,27 @@
+Tuscany - Getting Started - Helloworld JSONRPC Sample
+-----------------------------------------------------
+
+This sample extends the helloworld sample to make the helloworld service available as a JSON-RPC endpoint.
+JSON-RPC is a protocol for doing remote procedure calls encoded in JSON.
+
+The changes to the helloworld sample are:
+- update the pom.xml with the additional dependencies
+- update the composite to use the JSON-RPC binding
+
+As with all the getting-started samples you can run this sample with:
+
+ mvn tuscany:run
+
+Then at a web browser enter the following URL:
+(JSON-RPC aruguments are base64 encoded, so in this URL "WyJXb3JsZCJd" unecoded is "["World"]")
+
+ http://localhost:8080/HelloworldComponent/Helloworld?method=sayHello&params=WyJXb3JsZCJd&id=1
+
+which should return a page saying:
+
+ {"id":1,"result":"Hello World"}
+
+
+
+
+
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-jsonrpc/pom.xml b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-jsonrpc/pom.xml
new file mode 100644
index 0000000000..639e0c61a3
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-jsonrpc/pom.xml
@@ -0,0 +1,113 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.apache.tuscany.sca.samples</groupId>
+ <artifactId>tuscany-samples</artifactId>
+ <version>2.0-Beta3-SNAPSHOT</version>
+ <relativePath />
+ </parent>
+
+ <artifactId>helloworld-jsonrpc</artifactId>
+ <version>2.0-Beta3-SNAPSHOT</version>
+
+ <name>Apache Tuscany SCA Samples Helloworld JSON-RPC</name>
+
+ <properties>
+ <tuscany.version>${project.version}</tuscany.version>
+ </properties>
+
+ <!-- ASF repositories so sample can be built from SVN without building trunk-->
+ <repositories><repository>
+ <id>apache.snapshots</id>
+ <name>Apache Snapshot Repository</name>
+ <url>http://repository.apache.org/snapshots</url>
+ <releases><enabled>false</enabled></releases>
+ </repository></repositories>
+ <pluginRepositories><pluginRepository>
+ <id>apache.snapshots</id>
+ <name>Apache Snapshot Repository</name>
+ <url>http://repository.apache.org/snapshots</url>
+ <releases><enabled>false</enabled></releases>
+ </pluginRepository></pluginRepositories>
+
+ <dependencies>
+
+ <dependency>
+ <groupId>org.apache.tuscany.sca</groupId>
+ <artifactId>tuscany-sca-api</artifactId>
+ <version>${tuscany.version}</version>
+ <scope>provided</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <version>4.8.1</version>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.tuscany.sca</groupId>
+ <artifactId>tuscany-base-runtime</artifactId>
+ <version>${tuscany.version}</version>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.tuscany.sca</groupId>
+ <artifactId>tuscany-binding-jsonrpc-runtime</artifactId>
+ <version>${tuscany.version}</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.mortbay.jetty</groupId>
+ <artifactId>jetty</artifactId>
+ <version>6.1.26</version>
+ <scope>test</scope>
+ </dependency>
+
+ </dependencies>
+
+ <build>
+
+ <plugins>
+
+ <!-- to support running the composite with mvn tuscany:run -->
+ <plugin>
+ <groupId>org.apache.tuscany.sca</groupId>
+ <artifactId>tuscany-maven-plugin</artifactId>
+ <version>${tuscany.version}</version>
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.tuscany.sca</groupId>
+ <artifactId>tuscany-binding-jsonrpc-runtime</artifactId>
+ <version>${tuscany.version}</version>
+ </dependency>
+ </dependencies>
+ </plugin>
+ </plugins>
+
+ </build>
+
+</project>
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-jsonrpc/src/main/java/sample/Helloworld.java b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-jsonrpc/src/main/java/sample/Helloworld.java
new file mode 100644
index 0000000000..f4e8c50448
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-jsonrpc/src/main/java/sample/Helloworld.java
@@ -0,0 +1,28 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package sample;
+
+import org.oasisopen.sca.annotation.Remotable;
+
+@Remotable
+public interface Helloworld {
+
+ String sayHello(String name);
+
+}
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-jsonrpc/src/main/java/sample/HelloworldImpl.java b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-jsonrpc/src/main/java/sample/HelloworldImpl.java
new file mode 100644
index 0000000000..089b1a4290
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-jsonrpc/src/main/java/sample/HelloworldImpl.java
@@ -0,0 +1,27 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package sample;
+
+public class HelloworldImpl implements Helloworld {
+
+ public String sayHello(String name) {
+ return "Hello " + name;
+ }
+
+}
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-jsonrpc/src/main/resources/META-INF/sca-contribution.xml b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-jsonrpc/src/main/resources/META-INF/sca-contribution.xml
new file mode 100644
index 0000000000..95c32fb5bf
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-jsonrpc/src/main/resources/META-INF/sca-contribution.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<contribution xmlns="http://docs.oasis-open.org/ns/opencsa/sca/200912"
+ xmlns:sample="http://sample">
+
+ <deployable composite="sample:helloworld-contribution" />
+
+</contribution>
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-jsonrpc/src/main/resources/helloworld.composite b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-jsonrpc/src/main/resources/helloworld.composite
new file mode 100644
index 0000000000..5b37e6f3db
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-jsonrpc/src/main/resources/helloworld.composite
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<composite xmlns="http://docs.oasis-open.org/ns/opencsa/sca/200912"
+ xmlns:tuscany="http://tuscany.apache.org/xmlns/sca/1.1"
+ targetNamespace="http://sample"
+ name="helloworld-contribution">
+
+ <component name="HelloworldComponent">
+ <implementation.java class="sample.HelloworldImpl"/>
+ <service name="Helloworld">
+ <tuscany:binding.jsonrpc/>
+ </service>
+ </component>
+
+</composite>
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-jsonrpc/src/test/java/sample/HelloworldTestCase.java b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-jsonrpc/src/test/java/sample/HelloworldTestCase.java
new file mode 100644
index 0000000000..61e53a6939
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-jsonrpc/src/test/java/sample/HelloworldTestCase.java
@@ -0,0 +1,75 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package sample;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.net.URL;
+
+import org.apache.tuscany.sca.Node;
+import org.apache.tuscany.sca.TuscanyRuntime;
+import org.junit.Assert;
+import org.junit.Test;
+import org.oasisopen.sca.NoSuchServiceException;
+
+public class HelloworldTestCase {
+
+ @Test
+ public void testSayHello() throws NoSuchServiceException, IOException {
+
+ // Run the SCA composite in a Tuscany runtime
+ Node node = TuscanyRuntime.runComposite("helloworld.composite", "target/classes");
+ try {
+
+ // Get the Helloworld service proxy
+ Helloworld helloworld = node.getService(Helloworld.class, "HelloworldComponent");
+
+ // test that it works as expected
+ Assert.assertEquals("Hello Amelia", helloworld.sayHello("Amelia"));
+
+ // test that has exposed an HTTP endpoint that works as expected
+ // JSONRPC args are base64 encoded, ["World"] = WyJXb3JsZCJd
+ URL url = new URL("http://localhost:8080/HelloworldComponent/Helloworld?method=sayHello&params=WyJXb3JsZCJd&id=1");
+ Assert.assertEquals("{\"id\":1,\"result\":\"Hello World\"}", read(url.openStream()));
+
+ } finally {
+ // Stop the Tuscany runtime Node
+ node.stop();
+ }
+ }
+
+ private static String read(InputStream is) throws IOException {
+ BufferedReader reader = null;
+ try {
+ reader = new BufferedReader(new InputStreamReader(is));
+ StringBuffer sb = new StringBuffer();
+ String str;
+ while ((str = reader.readLine()) != null) {
+ sb.append(str);
+ }
+ return sb.toString();
+ } finally {
+ if (reader != null) {
+ reader.close();
+ }
+ }
+ }
+}
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-scaclient/README b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-scaclient/README
new file mode 100644
index 0000000000..5672944c8f
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-scaclient/README
@@ -0,0 +1,25 @@
+Tuscany - Getting Started - Helloworld SCAClient Sample
+-------------------------------------------------------
+
+This sample demonstrates using the OASIS SCAClient API to invoke a service in a remote SCA domain.
+
+See the README in the top-level samples folder for general information on the Tuscany samples.
+
+This project has a plain Java SE class with a main method which uses the OASIS SCAClient API to invoke a Helloworld service in a remote SCA domain.
+
+Before running this sample you must have a helloworld service running in a SCA domain somewhere, for example, you can do that by using a separate command prompt to run one of the Tuscany "Getting Started" samples which provide a helloworld service, for examaple, helloworld, or helloworld-spring.
+
+You can then run this SCAClient sample with the Maven command:
+
+ mvn tuscany:run
+
+As this sample uses a standard Java SE main class you can also run it with the maven exec java plugin:
+
+ mvn exec:java
+
+You should see the following output:
+
+ HelloworldSCAClient, using domainURI uri:default
+ Calling HelloworldComponent.sayHello("world")
+ Hello world
+
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-scaclient/pom.xml b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-scaclient/pom.xml
new file mode 100644
index 0000000000..e2d5182a8f
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-scaclient/pom.xml
@@ -0,0 +1,121 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.apache.tuscany.sca.samples</groupId>
+ <artifactId>tuscany-samples</artifactId>
+ <version>2.0-Beta3-SNAPSHOT</version>
+ <relativePath />
+ </parent>
+
+ <artifactId>helloworld-scaclient</artifactId>
+ <version>2.0-Beta3-SNAPSHOT</version>
+
+ <name>Apache Tuscany SCA Samples Helloworld SCAClient</name>
+
+ <properties>
+ <tuscany.version>${project.version}</tuscany.version>
+ </properties>
+
+ <!-- ASF repositories so sample can be built from SVN without building trunk-->
+ <repositories><repository>
+ <id>apache.snapshots</id>
+ <name>Apache Snapshot Repository</name>
+ <url>http://repository.apache.org/snapshots</url>
+ <releases><enabled>false</enabled></releases>
+ </repository></repositories>
+ <pluginRepositories><pluginRepository>
+ <id>apache.snapshots</id>
+ <name>Apache Snapshot Repository</name>
+ <url>http://repository.apache.org/snapshots</url>
+ <releases><enabled>false</enabled></releases>
+ </pluginRepository></pluginRepositories>
+
+ <dependencies>
+
+ <dependency>
+ <groupId>org.apache.tuscany.sca</groupId>
+ <artifactId>tuscany-sca-api</artifactId>
+ <version>${tuscany.version}</version>
+ <scope>provided</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <version>4.8.1</version>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.tuscany.sca</groupId>
+ <artifactId>tuscany-base-runtime</artifactId>
+ <version>${tuscany.version}</version>
+ <scope>test</scope>
+ </dependency>
+
+ <!-- this is for the Tuscany distributed domain support -->
+ <dependency>
+ <groupId>org.apache.tuscany.sca</groupId>
+ <artifactId>tuscany-domain-hazelcast</artifactId>
+ <version>${tuscany.version}</version>
+ <scope>test</scope>
+ </dependency>
+
+ </dependencies>
+
+ <build>
+
+ <plugins>
+
+ <!-- to support running the application with mvn tuscany:run -->
+ <plugin>
+ <groupId>org.apache.tuscany.sca</groupId>
+ <artifactId>tuscany-maven-plugin</artifactId>
+ <version>${tuscany.version}</version>
+ <configuration>
+ <mainClass>sample.HelloworldSCAClient</mainClass>
+ </configuration>
+ </plugin>
+
+ <!-- to support running the application with mvn exec:java -->
+ <plugin>
+ <groupId>org.codehaus.mojo</groupId>
+ <artifactId>exec-maven-plugin</artifactId>
+ <version>1.1.1</version>
+ <executions>
+ <execution>
+ <goals>
+ <goal>java</goal>
+ </goals>
+ </execution>
+ </executions>
+ <configuration>
+ <mainClass>sample.HelloworldSCAClient</mainClass>
+ <classpathScope>test</classpathScope>
+ </configuration>
+ </plugin>
+
+ </plugins>
+ </build>
+</project>
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-scaclient/src/main/java/sample/Helloworld.java b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-scaclient/src/main/java/sample/Helloworld.java
new file mode 100644
index 0000000000..1eeb8be9fd
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-scaclient/src/main/java/sample/Helloworld.java
@@ -0,0 +1,28 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package sample;
+
+import org.oasisopen.sca.annotation.Remotable;
+
+@Remotable
+public interface Helloworld {
+
+ String sayHello(String name);
+
+}
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-scaclient/src/main/java/sample/HelloworldSCAClient.java b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-scaclient/src/main/java/sample/HelloworldSCAClient.java
new file mode 100644
index 0000000000..0a91fdb70f
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-scaclient/src/main/java/sample/HelloworldSCAClient.java
@@ -0,0 +1,45 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package sample;
+
+import java.net.URI;
+
+import org.oasisopen.sca.NoSuchDomainException;
+import org.oasisopen.sca.NoSuchServiceException;
+import org.oasisopen.sca.client.SCAClientFactory;
+
+public class HelloworldSCAClient {
+
+ public static void main(String[] args) throws NoSuchDomainException, NoSuchServiceException {
+
+ String domainURI = System.getProperties().getProperty("domainURI");
+ if (domainURI == null || domainURI.length() < 1) {
+ domainURI = "uri:default";
+ }
+
+ System.out.println("HelloworldSCAClient, using domainURI " + domainURI);
+ SCAClientFactory factory = SCAClientFactory.newInstance(URI.create(domainURI));
+
+ String name = args.length < 1 ? "world" : args[0];
+ System.out.println("Calling HelloworldComponent.sayHello(\"" + name + "\"):");
+ Helloworld service = factory.getService(Helloworld.class, "HelloworldComponent");
+ System.out.println(service.sayHello(name));
+ }
+
+}
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-scaclient/src/test/java/sample/HelloworldTestCase.java b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-scaclient/src/test/java/sample/HelloworldTestCase.java
new file mode 100644
index 0000000000..d983c25b61
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-scaclient/src/test/java/sample/HelloworldTestCase.java
@@ -0,0 +1,56 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package sample;
+
+import org.apache.tuscany.sca.Node;
+import org.apache.tuscany.sca.TuscanyRuntime;
+import org.apache.tuscany.sca.contribution.processor.ContributionReadException;
+import org.apache.tuscany.sca.monitor.ValidationException;
+import org.apache.tuscany.sca.runtime.ActivationException;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.oasisopen.sca.NoSuchDomainException;
+import org.oasisopen.sca.NoSuchServiceException;
+
+public class HelloworldTestCase {
+
+ static Node node;
+
+ @Test
+ public void testSayHello() throws NoSuchDomainException, NoSuchServiceException {
+ System.setProperty("domainURI", "uri:default?wka=127.0.0.1:7654");
+ HelloworldSCAClient.main(new String[0]);
+ }
+
+ @BeforeClass
+ public static void start() throws ContributionReadException, ActivationException, ValidationException {
+ node = TuscanyRuntime.newInstance().createNode("uri:default?bind=127.0.0.1:7654");
+ String curi = node.installContribution(null, "../helloworld/target/classes", null, null);
+ node.startDeployables(curi);
+ }
+
+ @AfterClass
+ public static void stop() {
+ if (node != null) {
+ node.stop();
+ }
+ }
+
+}
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-spring/README b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-spring/README
new file mode 100644
index 0000000000..5fb675b502
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-spring/README
@@ -0,0 +1,18 @@
+Tuscany - Getting Started - Helloworld Spring Sample
+----------------------------------------------------
+
+This sample is an alternative version of the helloworld sample which uses the Spring Framework instead of an SCA Java component.
+
+The changes to the helloworld sample are:
+- update the pom.xml with the additional Spring dependencies
+- add a Spring context xml file to define the Spring application
+- update the composite to use <implementation.spring>
+
+As with all the getting-started samples you can run this sample with:
+
+ mvn tuscany:run
+
+And then as with the original helloworld sample you may test the service by using the Shell "invoke" command:
+
+ invoke HelloworldComponent sayHello yourName
+
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-spring/pom.xml b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-spring/pom.xml
new file mode 100644
index 0000000000..f085fe31b4
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-spring/pom.xml
@@ -0,0 +1,106 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.apache.tuscany.sca.samples</groupId>
+ <artifactId>tuscany-samples</artifactId>
+ <version>2.0-Beta3-SNAPSHOT</version>
+ <relativePath />
+ </parent>
+ <artifactId>helloworld-spring</artifactId>
+ <version>2.0-Beta3-SNAPSHOT</version>
+
+ <name>Apache Tuscany SCA Samples Helloworld Spring</name>
+
+ <properties>
+ <tuscany.version>${project.version}</tuscany.version>
+ </properties>
+
+ <!-- ASF repositories so sample can be built from SVN without building trunk-->
+ <repositories><repository>
+ <id>apache.snapshots</id>
+ <name>Apache Snapshot Repository</name>
+ <url>http://repository.apache.org/snapshots</url>
+ <releases><enabled>false</enabled></releases>
+ </repository></repositories>
+ <pluginRepositories><pluginRepository>
+ <id>apache.snapshots</id>
+ <name>Apache Snapshot Repository</name>
+ <url>http://repository.apache.org/snapshots</url>
+ <releases><enabled>false</enabled></releases>
+ </pluginRepository></pluginRepositories>
+
+ <dependencies>
+
+ <dependency>
+ <groupId>org.apache.tuscany.sca</groupId>
+ <artifactId>tuscany-sca-api</artifactId>
+ <version>${tuscany.version}</version>
+ <scope>provided</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <version>4.8.1</version>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.tuscany.sca</groupId>
+ <artifactId>tuscany-base-runtime</artifactId>
+ <version>${tuscany.version}</version>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.tuscany.sca</groupId>
+ <artifactId>tuscany-implementation-spring-runtime</artifactId>
+ <version>${tuscany.version}</version>
+ <scope>test</scope>
+ </dependency>
+
+ </dependencies>
+
+ <build>
+
+ <plugins>
+
+ <!-- to support running the composite with mvn tuscany:run -->
+ <plugin>
+ <groupId>org.apache.tuscany.sca</groupId>
+ <artifactId>tuscany-maven-plugin</artifactId>
+ <version>${tuscany.version}</version>
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.tuscany.sca</groupId>
+ <artifactId>tuscany-implementation-spring-runtime</artifactId>
+ <version>${tuscany.version}</version>
+ </dependency>
+ </dependencies>
+ </plugin>
+ </plugins>
+
+ </build>
+
+</project>
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-spring/src/main/java/sample/Helloworld.java b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-spring/src/main/java/sample/Helloworld.java
new file mode 100644
index 0000000000..f4e8c50448
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-spring/src/main/java/sample/Helloworld.java
@@ -0,0 +1,28 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package sample;
+
+import org.oasisopen.sca.annotation.Remotable;
+
+@Remotable
+public interface Helloworld {
+
+ String sayHello(String name);
+
+}
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-spring/src/main/java/sample/HelloworldImpl.java b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-spring/src/main/java/sample/HelloworldImpl.java
new file mode 100644
index 0000000000..089b1a4290
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-spring/src/main/java/sample/HelloworldImpl.java
@@ -0,0 +1,27 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package sample;
+
+public class HelloworldImpl implements Helloworld {
+
+ public String sayHello(String name) {
+ return "Hello " + name;
+ }
+
+}
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-spring/src/main/resources/META-INF/sca-contribution.xml b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-spring/src/main/resources/META-INF/sca-contribution.xml
new file mode 100644
index 0000000000..95c32fb5bf
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-spring/src/main/resources/META-INF/sca-contribution.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<contribution xmlns="http://docs.oasis-open.org/ns/opencsa/sca/200912"
+ xmlns:sample="http://sample">
+
+ <deployable composite="sample:helloworld-contribution" />
+
+</contribution>
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-spring/src/main/resources/helloworld-context.xml b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-spring/src/main/resources/helloworld-context.xml
new file mode 100644
index 0000000000..a6b11d2399
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-spring/src/main/resources/helloworld-context.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:sca="http://docs.oasis-open.org/ns/opencsa/sca-j/spring/200810" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/sca http://www.osoa.org/xmlns/sca/1.0/spring-sca.xsd">
+
+ <sca:service name="HelloworldService" target="HelloworldBean"/>
+
+ <bean id="HelloworldBean" class="sample.HelloworldImpl">
+ </bean>
+
+</beans> \ No newline at end of file
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-spring/src/main/resources/helloworld.composite b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-spring/src/main/resources/helloworld.composite
new file mode 100644
index 0000000000..4ed0fb51dc
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-spring/src/main/resources/helloworld.composite
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<composite xmlns="http://docs.oasis-open.org/ns/opencsa/sca/200912"
+ xmlns:tuscany="http://tuscany.apache.org/xmlns/sca/1.1"
+ targetNamespace="http://sample"
+ name="helloworld-contribution">
+
+ <component name="HelloworldComponent">
+ <implementation.spring location="helloworld-context.xml"/>
+ </component>
+
+</composite>
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-spring/src/test/java/sample/HelloworldTestCase.java b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-spring/src/test/java/sample/HelloworldTestCase.java
new file mode 100644
index 0000000000..be27aa68ef
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-spring/src/test/java/sample/HelloworldTestCase.java
@@ -0,0 +1,48 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package sample;
+
+import org.junit.Assert;
+
+import org.apache.tuscany.sca.Node;
+import org.apache.tuscany.sca.TuscanyRuntime;
+import org.junit.Test;
+import org.oasisopen.sca.NoSuchServiceException;
+
+public class HelloworldTestCase {
+
+ @Test
+ public void testSayHello() throws NoSuchServiceException {
+
+ // Run the SCA composite in a Tuscany runtime
+ Node node = TuscanyRuntime.runComposite("helloworld.composite", "target/classes");
+ try {
+
+ // Get the Helloworld service proxy
+ Helloworld helloworld = node.getService(Helloworld.class, "HelloworldComponent");
+
+ // test that it works as expected
+ Assert.assertEquals("Hello Amelia", helloworld.sayHello("Amelia"));
+
+ } finally {
+ // Stop the Tuscany runtime Node
+ node.stop();
+ }
+ }
+}
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-webapp/README b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-webapp/README
new file mode 100644
index 0000000000..bcf11d9886
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-webapp/README
@@ -0,0 +1,32 @@
+Tuscany - Getting Started - Helloworld WebApp Sample
+----------------------------------------------------
+
+This sample demonstrates how to use SCA contributions with Web Applications
+
+See the README in the top-level samples folder for general information on the Tuscany samples.
+
+This sample project creates a .war web application which includes Tuscany. The SCA contribution
+from the helloworld sample is included within the war and its SCA composite started by the webapp,
+and there is a JSP page which shows how to invoke SCA services by using the SCA taglib.
+
+As this sample creates a web application .war archive there is a manual step to deploy the WAR file
+to your web application server. The archive is the helloworld-webapp-<version>.war in the target folder.
+Alternatively, you can run it by using the Maven Tomcat plugin by using the following command:
+
+ mvn tomcat:run
+
+or if you prefer Jetty then:
+
+ mvn jetty:run
+
+Once the web app is running use your browser to visit the following URL;
+
+http://localhost:8080/helloworld-webapp
+
+(The port and hostname will of course vary depending on your local installation)
+
+You should then see the web page return the following:
+
+ Calling HelloworldService sayHello("world") returns:
+
+ Hello world \ No newline at end of file
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-webapp/pom.xml b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-webapp/pom.xml
new file mode 100644
index 0000000000..c6522341d1
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-webapp/pom.xml
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.apache.tuscany.sca.samples</groupId>
+ <artifactId>tuscany-samples</artifactId>
+ <version>2.0-Beta3-SNAPSHOT</version>
+ <relativePath />
+ </parent>
+
+ <artifactId>helloworld-webapp</artifactId>
+ <version>2.0-Beta3-SNAPSHOT</version>
+
+ <name>Apache Tuscany SCA Samples Helloworld WebApp</name>
+ <packaging>war</packaging>
+
+ <properties>
+ <tuscany.version>${project.version}</tuscany.version>
+ </properties>
+
+ <!-- ASF repositories so sample can be built from SVN without building trunk-->
+ <repositories><repository>
+ <id>apache.snapshots</id>
+ <name>Apache Snapshot Repository</name>
+ <url>http://repository.apache.org/snapshots</url>
+ <releases><enabled>false</enabled></releases>
+ </repository></repositories>
+ <pluginRepositories><pluginRepository>
+ <id>apache.snapshots</id>
+ <name>Apache Snapshot Repository</name>
+ <url>http://repository.apache.org/snapshots</url>
+ <releases><enabled>false</enabled></releases>
+ </pluginRepository></pluginRepositories>
+
+ <dependencies>
+
+ <dependency>
+ <groupId>org.apache.tuscany.sca</groupId>
+ <artifactId>tuscany-base-runtime</artifactId>
+ <version>${tuscany.version}</version>
+ </dependency>
+
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <version>4.8.1</version>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>net.sourceforge.htmlunit</groupId>
+ <artifactId>htmlunit</artifactId>
+ <version>2.6</version>
+ <scope>test</scope>
+ <exclusions>
+ <exclusion>
+ <groupId>xalan</groupId>
+ <artifactId>xalan</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
+
+ <!-- replace HTMLUnit dependency with verstion that Tuscany is using -->
+ <dependency>
+ <groupId>xalan</groupId>
+ <artifactId>xalan</artifactId>
+ <version>2.7.0</version>
+ <scope>test</scope>
+ <exclusions>
+ <exclusion>
+ <groupId>xml-apis</groupId>
+ <artifactId>xml-apis</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
+
+ </dependencies>
+
+ <build>
+ <plugins>
+
+ <!-- this copies the SCA contribution from the helloworld sample into this webapp -->
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-dependency-plugin</artifactId>
+ <executions>
+ <execution>
+ <id>copy</id>
+ <phase>compile</phase>
+ <goals>
+ <goal>copy</goal>
+ </goals>
+ <configuration>
+ <artifactItems>
+ <artifactItem>
+ <groupId>org.apache.tuscany.sca.samples</groupId>
+ <artifactId>helloworld</artifactId>
+ <version>${project.version}</version>
+ <!-- should really go in the target folder but i can't get jetty:run or tomcat:run to work using that -->
+ <outputDirectory>src/main/webapp/WEB-INF/sca-contributions</outputDirectory>
+ </artifactItem>
+ </artifactItems>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+
+ <!-- to support running thw webapp with mvn tuscany:run -->
+ <plugin>
+ <groupId>org.apache.tuscany.sca</groupId>
+ <artifactId>tuscany-maven-plugin</artifactId>
+ <version>${tuscany.version}</version>
+ </plugin>
+
+ <!-- to support using mvn jetty:run and also to run the webapp for the integration test -->
+ <plugin>
+ <groupId>org.mortbay.jetty</groupId>
+ <artifactId>maven-jetty-plugin</artifactId>
+ <version>6.1.26</version>
+ <configuration>
+ <contextPath>helloworld-webapp</contextPath>
+ <stopKey>foo</stopKey>
+ <stopPort>9999</stopPort>
+ </configuration>
+ <executions>
+ <execution>
+ <id>start-jetty</id>
+ <phase>process-test-classes</phase>
+ <goals>
+ <goal>run</goal>
+ </goals>
+ <configuration>
+ <scanIntervalSeconds>0</scanIntervalSeconds>
+ <daemon>true</daemon>
+ <connectors>
+ <connector implementation="org.mortbay.jetty.nio.SelectChannelConnector">
+ <port>8085</port>
+ </connector>
+ </connectors>
+ </configuration>
+ </execution>
+ <execution>
+ <id>stop-jetty</id>
+ <phase>prepare-package</phase>
+ <goals>
+ <goal>stop</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+
+ <!-- to support using mvn tomcat:run -->
+ <plugin>
+ <groupId>org.codehaus.mojo</groupId>
+ <artifactId>tomcat-maven-plugin</artifactId>
+ <version>1.1</version>
+ </plugin>
+
+ </plugins>
+ </build>
+</project>
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-webapp/src/main/java/sample/Helloworld.java b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-webapp/src/main/java/sample/Helloworld.java
new file mode 100644
index 0000000000..1eeb8be9fd
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-webapp/src/main/java/sample/Helloworld.java
@@ -0,0 +1,28 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package sample;
+
+import org.oasisopen.sca.annotation.Remotable;
+
+@Remotable
+public interface Helloworld {
+
+ String sayHello(String name);
+
+}
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-webapp/src/main/webapp/WEB-INF/web.composite b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-webapp/src/main/webapp/WEB-INF/web.composite
new file mode 100644
index 0000000000..0c03826f99
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-webapp/src/main/webapp/WEB-INF/web.composite
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<composite xmlns="http://docs.oasis-open.org/ns/opencsa/sca/200912"
+ xmlns:tuscany="http://tuscany.apache.org/xmlns/sca/1.1"
+ targetNamespace="http://samples"
+ name="Helloworld">
+
+ <component name="foo">
+ <implementation.web web-uri=""/>
+ <reference name="service" target="HelloworldComponent"/>
+ </component>
+
+</composite>
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-webapp/src/main/webapp/WEB-INF/web.xml b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-webapp/src/main/webapp/WEB-INF/web.xml
new file mode 100644
index 0000000000..b83a9c3417
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-webapp/src/main/webapp/WEB-INF/web.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<web-app version="2.4"
+ xmlns="http://java.sun.com/xml/ns/j2ee"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" >
+
+ <display-name>Apache Tuscany Helloworld Sample</display-name>
+
+ <filter>
+ <filter-name>tuscany</filter-name>
+ <filter-class>org.apache.tuscany.sca.host.webapp.TuscanyServletFilter</filter-class>
+ </filter>
+
+ <filter-mapping>
+ <filter-name>tuscany</filter-name>
+ <url-pattern>/*</url-pattern>
+ </filter-mapping>
+
+ <welcome-file-list id="WelcomeFileList">
+ <welcome-file>hello.jsp</welcome-file>
+ </welcome-file-list>
+
+</web-app>
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-webapp/src/main/webapp/hello.jsp b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-webapp/src/main/webapp/hello.jsp
new file mode 100644
index 0000000000..57abb08ca2
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-webapp/src/main/webapp/hello.jsp
@@ -0,0 +1,37 @@
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+
+<%@ page contentType="text/html;charset=UTF-8" language="java" %>
+<%@ taglib uri="http://www.osoa.org/sca/sca_jsp.tld" prefix="sca" %>
+
+<sca:reference name="service" type="sample.Helloworld" />
+
+<html>
+ <body >
+
+ <h2>Apache Tuscany Helloworld JSP Sample</h2>
+
+ Calling HelloworldService sayHello("world") returns:
+
+ <p>
+
+ <%= service.sayHello("world") %>
+
+ </body>
+</html>
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-webapp/src/test/java/itest/HelloworldTestCase.java b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-webapp/src/test/java/itest/HelloworldTestCase.java
new file mode 100644
index 0000000000..40da70b98d
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-webapp/src/test/java/itest/HelloworldTestCase.java
@@ -0,0 +1,53 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package itest;
+
+import static org.junit.Assert.assertEquals;
+
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.util.Iterator;
+
+import org.junit.Test;
+
+import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException;
+import com.gargoylesoftware.htmlunit.WebClient;
+import com.gargoylesoftware.htmlunit.html.HtmlElement;
+import com.gargoylesoftware.htmlunit.html.HtmlPage;
+import com.gargoylesoftware.htmlunit.html.HtmlParagraph;
+
+/**
+ */
+public class HelloworldTestCase {
+
+ @Test
+ public void testA() throws FailingHttpStatusCodeException, MalformedURLException, IOException {
+ HtmlPage page = (HtmlPage)new WebClient().getPage("http://localhost:8085/helloworld-webapp");
+ Iterator<?> ss = page.getAllHtmlChildElements().iterator();
+ while(ss.hasNext()) {
+ HtmlElement htmlElement = (HtmlElement) ss.next();
+ if( htmlElement instanceof HtmlParagraph) {
+ assertEquals("Hello world", htmlElement.asText());
+ break;
+ }
+ }
+ }
+
+}
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-webapp/src/test/resources/test-web.xml b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-webapp/src/test/resources/test-web.xml
new file mode 100644
index 0000000000..4ca1c962a0
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-webapp/src/test/resources/test-web.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<web-app version="2.4"
+ xmlns="http://java.sun.com/xml/ns/j2ee"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" >
+
+ <context-param>
+ <param-name>org.apache.tuscany.sca.config</param-name>
+ <param-value>uri:default?bind=127.0.0.1:54321</param-value>
+ </context-param>
+
+</web-app>
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-webservice/README b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-webservice/README
new file mode 100644
index 0000000000..b61a694fa9
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-webservice/README
@@ -0,0 +1,18 @@
+Tuscany - Getting Started - Helloworld Web Service Sample
+---------------------------------------------------------
+
+This sample extends the helloworld sample to make the helloworld service available as a SOAP based Web Service endpoint.
+
+The changes to the helloworld sample are:
+- update the pom.xml with the additional dependencies
+- update the composite to use the Web Service binding
+
+As with all the getting-started samples you can run this sample with:
+
+ mvn tuscany:run
+
+You really need a Web Service client to invoke the service but you can get the WSDL description for the service by using a web browser with the following URL:
+
+ http://localhost:8080/HelloworldComponent/Helloworld?wsdl
+
+which should return the WSDL document for the service.
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-webservice/pom.xml b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-webservice/pom.xml
new file mode 100644
index 0000000000..4a29969b5f
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-webservice/pom.xml
@@ -0,0 +1,113 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.apache.tuscany.sca.samples</groupId>
+ <artifactId>tuscany-samples</artifactId>
+ <version>2.0-Beta3-SNAPSHOT</version>
+ <relativePath />
+ </parent>
+
+ <artifactId>helloworld-webservice</artifactId>
+ <version>2.0-Beta3-SNAPSHOT</version>
+
+ <name>Apache Tuscany SCA Samples Helloworld Web Service</name>
+
+ <properties>
+ <tuscany.version>${project.version}</tuscany.version>
+ </properties>
+
+ <!-- ASF repositories so sample can be built from SVN without building trunk-->
+ <repositories><repository>
+ <id>apache.snapshots</id>
+ <name>Apache Snapshot Repository</name>
+ <url>http://repository.apache.org/snapshots</url>
+ <releases><enabled>false</enabled></releases>
+ </repository></repositories>
+ <pluginRepositories><pluginRepository>
+ <id>apache.snapshots</id>
+ <name>Apache Snapshot Repository</name>
+ <url>http://repository.apache.org/snapshots</url>
+ <releases><enabled>false</enabled></releases>
+ </pluginRepository></pluginRepositories>
+
+ <dependencies>
+
+ <dependency>
+ <groupId>org.apache.tuscany.sca</groupId>
+ <artifactId>tuscany-sca-api</artifactId>
+ <version>${tuscany.version}</version>
+ <scope>provided</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <version>4.8.1</version>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.tuscany.sca</groupId>
+ <artifactId>tuscany-base-runtime</artifactId>
+ <version>${tuscany.version}</version>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.tuscany.sca</groupId>
+ <artifactId>tuscany-binding-ws-runtime-axis2</artifactId>
+ <version>${tuscany.version}</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.mortbay.jetty</groupId>
+ <artifactId>jetty</artifactId>
+ <version>6.1.26</version>
+ <scope>test</scope>
+ </dependency>
+
+ </dependencies>
+
+ <build>
+
+ <plugins>
+
+ <!-- to support running the composite with mvn tuscany:run -->
+ <plugin>
+ <groupId>org.apache.tuscany.sca</groupId>
+ <artifactId>tuscany-maven-plugin</artifactId>
+ <version>${tuscany.version}</version>
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.tuscany.sca</groupId>
+ <artifactId>tuscany-binding-ws-runtime-axis2</artifactId>
+ <version>${tuscany.version}</version>
+ </dependency>
+ </dependencies>
+ </plugin>
+ </plugins>
+
+ </build>
+
+</project>
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-webservice/src/main/java/sample/Helloworld.java b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-webservice/src/main/java/sample/Helloworld.java
new file mode 100644
index 0000000000..f4e8c50448
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-webservice/src/main/java/sample/Helloworld.java
@@ -0,0 +1,28 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package sample;
+
+import org.oasisopen.sca.annotation.Remotable;
+
+@Remotable
+public interface Helloworld {
+
+ String sayHello(String name);
+
+}
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-webservice/src/main/java/sample/HelloworldImpl.java b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-webservice/src/main/java/sample/HelloworldImpl.java
new file mode 100644
index 0000000000..089b1a4290
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-webservice/src/main/java/sample/HelloworldImpl.java
@@ -0,0 +1,27 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package sample;
+
+public class HelloworldImpl implements Helloworld {
+
+ public String sayHello(String name) {
+ return "Hello " + name;
+ }
+
+}
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-webservice/src/main/resources/META-INF/sca-contribution.xml b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-webservice/src/main/resources/META-INF/sca-contribution.xml
new file mode 100644
index 0000000000..95c32fb5bf
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-webservice/src/main/resources/META-INF/sca-contribution.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<contribution xmlns="http://docs.oasis-open.org/ns/opencsa/sca/200912"
+ xmlns:sample="http://sample">
+
+ <deployable composite="sample:helloworld-contribution" />
+
+</contribution>
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-webservice/src/main/resources/helloworld.composite b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-webservice/src/main/resources/helloworld.composite
new file mode 100644
index 0000000000..5f001c05a9
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-webservice/src/main/resources/helloworld.composite
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<composite xmlns="http://docs.oasis-open.org/ns/opencsa/sca/200912"
+ xmlns:tuscany="http://tuscany.apache.org/xmlns/sca/1.1"
+ targetNamespace="http://sample"
+ name="helloworld-contribution">
+
+ <component name="HelloworldComponent">
+ <implementation.java class="sample.HelloworldImpl"/>
+ <service name="Helloworld">
+ <binding.ws/>
+ </service>
+ </component>
+
+</composite>
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-webservice/src/test/java/sample/HelloworldTestCase.java b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-webservice/src/test/java/sample/HelloworldTestCase.java
new file mode 100644
index 0000000000..0680e8cd01
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-webservice/src/test/java/sample/HelloworldTestCase.java
@@ -0,0 +1,76 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package sample;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.net.MalformedURLException;
+import java.net.URL;
+
+import org.apache.tuscany.sca.Node;
+import org.apache.tuscany.sca.TuscanyRuntime;
+import org.junit.Assert;
+import org.junit.Test;
+import org.oasisopen.sca.NoSuchServiceException;
+
+public class HelloworldTestCase {
+
+ @Test
+ public void testSayHello() throws NoSuchServiceException, IOException {
+
+ // Run the SCA composite in a Tuscany runtime
+ Node node = TuscanyRuntime.runComposite("helloworld.composite", "target/classes");
+ try {
+
+ // Get the Helloworld service proxy
+ Helloworld helloworld = node.getService(Helloworld.class, "HelloworldComponent");
+
+ // test that it works as expected
+ Assert.assertEquals("Hello Amelia", helloworld.sayHello("Amelia"));
+
+ // test that has exposed an HTTP endpoint that works as expected
+ // to keep this test simple just do ?wsdl on the endpoint
+ URL url = new URL("http://localhost:8080/HelloworldComponent/Helloworld?wsdl");
+ Assert.assertTrue(read(url.openStream()).contains("address location="));
+
+ } finally {
+ // Stop the Tuscany runtime Node
+ node.stop();
+ }
+ }
+
+ private static String read(InputStream is) throws IOException {
+ BufferedReader reader = null;
+ try {
+ reader = new BufferedReader(new InputStreamReader(is));
+ StringBuffer sb = new StringBuffer();
+ String str;
+ while ((str = reader.readLine()) != null) {
+ sb.append(str);
+ }
+ return sb.toString();
+ } finally {
+ if (reader != null) {
+ reader.close();
+ }
+ }
+ }
+}
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-withdeps/README b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-withdeps/README
new file mode 100644
index 0000000000..e2fd876b52
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-withdeps/README
@@ -0,0 +1,35 @@
+Tuscany - Getting Started - Helloworld With Dependencies Sample
+---------------------------------------------------------------
+
+This sample extends the helloworld sample to show how to use ZIP format contributions which include dependencys jar which are made available on the contribution classpath. To demonstrate this the Helloworld service is updated to use a Apache Commons Lang 3.0 utility to capatalize the first letter of the name.
+
+The changes to the helloworld sample are:
+- update sample.HelloworldImpl class is updated to use the Apache Commons Lang 3.0 WordUtils utility
+- the Maven build is updated to use the Assembly plugin to create a ZIP archive of the contrubution which includes the dependency jars
+
+Presently the Tuscany Shell does not work "as is" to run this sample with "mvn tuscany:run". Instead you need to do the following in the helloworld-withdeps directory:
+
+- build the ZIP contribution
+
+ mvn clean install
+
+- start the Tuscany Shell
+
+ mvn tuscany:shell
+
+- install the sample contribution
+
+ install target\helloworld-withdeps-2.0-Beta3-SNAPSHOT.zip
+
+- start the SCA composite
+
+ start helloworld-withdeps META-INF/helloworld.composite
+
+And then as with the original helloworld sample you may test the service by using the Shell "invoke" command:
+
+ invoke HelloworldComponent sayHello yourName
+
+which should return a hello text with the name capatilized:
+
+ Hello YourName
+
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-withdeps/pom.xml b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-withdeps/pom.xml
new file mode 100644
index 0000000000..7a955b1900
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-withdeps/pom.xml
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.apache.tuscany.sca.samples</groupId>
+ <artifactId>tuscany-samples</artifactId>
+ <version>2.0-Beta3-SNAPSHOT</version>
+ <relativePath />
+ </parent>
+ <artifactId>helloworld-withdeps</artifactId>
+ <version>2.0-Beta3-SNAPSHOT</version>
+
+ <name>Apache Tuscany SCA Samples Helloworld With Dependencies</name>
+
+ <properties>
+ <tuscany.version>${project.version}</tuscany.version>
+ </properties>
+
+ <!-- ASF repositories so sample can be built from SVN without building trunk-->
+ <repositories><repository>
+ <id>apache.snapshots</id>
+ <name>Apache Snapshot Repository</name>
+ <url>http://repository.apache.org/snapshots</url>
+ <releases><enabled>false</enabled></releases>
+ </repository></repositories>
+ <pluginRepositories><pluginRepository>
+ <id>apache.snapshots</id>
+ <name>Apache Snapshot Repository</name>
+ <url>http://repository.apache.org/snapshots</url>
+ <releases><enabled>false</enabled></releases>
+ </pluginRepository></pluginRepositories>
+
+ <dependencies>
+
+ <dependency>
+ <groupId>org.apache.tuscany.sca</groupId>
+ <artifactId>tuscany-sca-api</artifactId>
+ <version>${tuscany.version}</version>
+ <scope>provided</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.commons</groupId>
+ <artifactId>commons-lang3</artifactId>
+ <version>3.0</version>
+ </dependency>
+
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <version>4.8.1</version>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.tuscany.sca</groupId>
+ <artifactId>tuscany-base-runtime</artifactId>
+ <version>${tuscany.version}</version>
+ <scope>test</scope>
+ </dependency>
+
+ </dependencies>
+
+ <build>
+
+ <plugins>
+
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-assembly-plugin</artifactId>
+ <version>2.2.1</version>
+ <executions>
+ <execution>
+ <id>zip</id>
+ <phase>package</phase>
+ <goals>
+ <goal>single</goal>
+ </goals>
+ <configuration>
+ <appendAssemblyId>false</appendAssemblyId>
+ <descriptors>
+ <descriptor>src/main/assembly/zip.xml</descriptor>
+ </descriptors>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+
+ <!-- to support running the composite with mvn tuscany:run -->
+ <plugin>
+ <groupId>org.apache.tuscany.sca</groupId>
+ <artifactId>tuscany-maven-plugin</artifactId>
+ <version>${tuscany.version}</version>
+ </plugin>
+
+ </plugins>
+
+ </build>
+
+</project>
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-withdeps/src/main/assembly/resources/META-INF/helloworld.composite b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-withdeps/src/main/assembly/resources/META-INF/helloworld.composite
new file mode 100644
index 0000000000..8e23a93895
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-withdeps/src/main/assembly/resources/META-INF/helloworld.composite
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<composite xmlns="http://docs.oasis-open.org/ns/opencsa/sca/200912"
+ xmlns:tuscany="http://tuscany.apache.org/xmlns/sca/1.1"
+ targetNamespace="http://sample"
+ name="helloworld-withdeps">
+
+ <component name="HelloworldComponent">
+ <implementation.java class="sample.HelloworldImpl"/>
+ </component>
+
+</composite>
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-withdeps/src/main/assembly/resources/META-INF/sca-contribution.xml b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-withdeps/src/main/assembly/resources/META-INF/sca-contribution.xml
new file mode 100644
index 0000000000..9112e02cbe
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-withdeps/src/main/assembly/resources/META-INF/sca-contribution.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<contribution xmlns="http://docs.oasis-open.org/ns/opencsa/sca/200912"
+ xmlns:sample="http://sample">
+
+ <deployable composite="sample:helloworld-withdeps" />
+
+</contribution>
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-withdeps/src/main/assembly/zip.xml b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-withdeps/src/main/assembly/zip.xml
new file mode 100644
index 0000000000..1d71d28a6f
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-withdeps/src/main/assembly/zip.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<assembly>
+ <id>zip</id>
+ <includeBaseDirectory>false</includeBaseDirectory>
+
+ <formats>
+ <format>zip</format>
+ </formats>
+
+ <fileSets>
+ <fileSet>
+ <directory>src/main/assembly/resources</directory>
+ <outputDirectory>.</outputDirectory>
+ </fileSet>
+ </fileSets>
+
+ <dependencySets>
+ <dependencySet>
+ <outputDirectory>lib</outputDirectory>
+ </dependencySet>
+ </dependencySets>
+
+</assembly>
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-withdeps/src/main/java/sample/Helloworld.java b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-withdeps/src/main/java/sample/Helloworld.java
new file mode 100644
index 0000000000..f4e8c50448
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-withdeps/src/main/java/sample/Helloworld.java
@@ -0,0 +1,28 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package sample;
+
+import org.oasisopen.sca.annotation.Remotable;
+
+@Remotable
+public interface Helloworld {
+
+ String sayHello(String name);
+
+}
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-withdeps/src/main/java/sample/HelloworldImpl.java b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-withdeps/src/main/java/sample/HelloworldImpl.java
new file mode 100644
index 0000000000..1852632429
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-withdeps/src/main/java/sample/HelloworldImpl.java
@@ -0,0 +1,29 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package sample;
+
+import org.apache.commons.lang3.text.WordUtils;
+
+public class HelloworldImpl implements Helloworld {
+
+ public String sayHello(String name) {
+ return "Hello " + WordUtils.capitalize(name);
+ }
+
+}
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-withdeps/src/test/java/sample/HelloworldTestCase.java b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-withdeps/src/test/java/sample/HelloworldTestCase.java
new file mode 100644
index 0000000000..6770d288fd
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-withdeps/src/test/java/sample/HelloworldTestCase.java
@@ -0,0 +1,49 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package sample;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.oasisopen.sca.NoSuchServiceException;
+
+public class HelloworldTestCase {
+
+ @Test
+ public void testSayHello() throws NoSuchServiceException {
+
+// // Run the SCA composite in a Tuscany runtime
+// Node node = TuscanyRuntime.runComposite(null, "target/helloworld-withdeps-2.0-SNAPSHOT.zip");
+// try {
+//
+// // Get the Helloworld service proxy
+// Helloworld helloworld = node.getService(Helloworld.class, "HelloworldComponent");
+//
+// // test that it works as expected
+// Assert.assertEquals("Hello Amelia", helloworld.sayHello("amelia"));
+//
+// } finally {
+// // Stop the Tuscany runtime Node
+// node.stop();
+// }
+ Helloworld helloworld = new HelloworldImpl();
+
+ // Test that a lower case name does get capitalized
+ Assert.assertEquals("Hello Amelia", helloworld.sayHello("amelia"));
+ }
+}
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld/README b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld/README
new file mode 100644
index 0000000000..f6e9a086d4
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld/README
@@ -0,0 +1,43 @@
+Tuscany - Getting Started - Helloworld Sample
+---------------------------------------------
+
+This sample demonstrates a simple helloworld style SCA application and how to run that with Tuscany.
+
+See the README in the top-level samples folder for general information on the Tuscany samples.
+
+This project creates an SCA contribution with a deployable composite named helloworld.composite.
+The composite defines an SCA component, HelloworldComponent, which provides a Helloworld service,
+the component is implemented by a Java class.
+
+You can use the contribution by starting the composite in the Tuscany Shell. To do that run the
+following command in the helloworld folder:
+
+ mvn tuscany:run
+
+Alternatively, the Tuscany Shell can be started with the scripts in the Tuscany binary distribution
+bin folder. To do that run the following command at the root of a Tuscany binary distribution:
+
+ bin\tuscany.bat samples\getting-started\helloworld
+
+Once the Shell has been started with one of those methods you can use Shell commands to explore
+the SCA domain, for example, use the "installed" command to get the status of installed contributions,
+"services" to see the available component services, and you may test calling the helloworld service by
+using the "invoke" command:
+
+ invoke HelloworldComponent sayHello yourName
+
+---
+
+This sample was created by the Tuscany contribution-jar Maven archetype. You can use that archetype to
+create your own SCA contribution projects by running the following Maven command:
+
+ mvn archetype:generate -DarchetypeCatalog=http://tuscany.apache.org
+
+then at the prompt select 1 to choose the contribution-jar archetype and then answer the questions.
+This project used the following answers:
+
+ Define value for property 'groupId': : org.apache.tuscany.sca.samples
+ Define value for property 'artifactId': : helloworld-contribution
+ Define value for property 'version': 1.0-SNAPSHOT: 2.0-Beta3-SNAPSHOT
+ Define value for property 'package': org.apache.tuscany.sca.samples: sample
+
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld/pom.xml b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld/pom.xml
new file mode 100644
index 0000000000..7923917727
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld/pom.xml
@@ -0,0 +1,92 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.apache.tuscany.sca.samples</groupId>
+ <artifactId>tuscany-samples</artifactId>
+ <version>2.0-Beta3-SNAPSHOT</version>
+ <relativePath />
+ </parent>
+ <artifactId>helloworld</artifactId>
+ <version>2.0-Beta3-SNAPSHOT</version>
+
+ <name>Apache Tuscany SCA Samples Helloworld</name>
+
+ <properties>
+ <tuscany.version>${project.version}</tuscany.version>
+ </properties>
+
+ <!-- ASF repositories so sample can be built from SVN without building trunk-->
+ <repositories><repository>
+ <id>apache.snapshots</id>
+ <name>Apache Snapshot Repository</name>
+ <url>http://repository.apache.org/snapshots</url>
+ <releases><enabled>false</enabled></releases>
+ </repository></repositories>
+ <pluginRepositories><pluginRepository>
+ <id>apache.snapshots</id>
+ <name>Apache Snapshot Repository</name>
+ <url>http://repository.apache.org/snapshots</url>
+ <releases><enabled>false</enabled></releases>
+ </pluginRepository></pluginRepositories>
+
+ <dependencies>
+
+ <dependency>
+ <groupId>org.apache.tuscany.sca</groupId>
+ <artifactId>tuscany-sca-api</artifactId>
+ <version>${tuscany.version}</version>
+ <scope>provided</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <version>4.8.1</version>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.tuscany.sca</groupId>
+ <artifactId>tuscany-base-runtime</artifactId>
+ <version>${tuscany.version}</version>
+ <scope>test</scope>
+ </dependency>
+
+ </dependencies>
+
+ <build>
+
+ <plugins>
+
+ <!-- to support running the composite with mvn tuscany:run -->
+ <plugin>
+ <groupId>org.apache.tuscany.sca</groupId>
+ <artifactId>tuscany-maven-plugin</artifactId>
+ <version>${tuscany.version}</version>
+ </plugin>
+ </plugins>
+
+ </build>
+
+</project>
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld/src/main/java/sample/Helloworld.java b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld/src/main/java/sample/Helloworld.java
new file mode 100644
index 0000000000..f4e8c50448
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld/src/main/java/sample/Helloworld.java
@@ -0,0 +1,28 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package sample;
+
+import org.oasisopen.sca.annotation.Remotable;
+
+@Remotable
+public interface Helloworld {
+
+ String sayHello(String name);
+
+}
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld/src/main/java/sample/HelloworldImpl.java b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld/src/main/java/sample/HelloworldImpl.java
new file mode 100644
index 0000000000..089b1a4290
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld/src/main/java/sample/HelloworldImpl.java
@@ -0,0 +1,27 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package sample;
+
+public class HelloworldImpl implements Helloworld {
+
+ public String sayHello(String name) {
+ return "Hello " + name;
+ }
+
+}
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld/src/main/resources/META-INF/sca-contribution.xml b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld/src/main/resources/META-INF/sca-contribution.xml
new file mode 100644
index 0000000000..95c32fb5bf
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld/src/main/resources/META-INF/sca-contribution.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<contribution xmlns="http://docs.oasis-open.org/ns/opencsa/sca/200912"
+ xmlns:sample="http://sample">
+
+ <deployable composite="sample:helloworld-contribution" />
+
+</contribution>
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld/src/main/resources/helloworld.composite b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld/src/main/resources/helloworld.composite
new file mode 100644
index 0000000000..e0206cd6e8
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld/src/main/resources/helloworld.composite
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<composite xmlns="http://docs.oasis-open.org/ns/opencsa/sca/200912"
+ xmlns:tuscany="http://tuscany.apache.org/xmlns/sca/1.1"
+ targetNamespace="http://sample"
+ name="helloworld-contribution">
+
+ <component name="HelloworldComponent">
+ <implementation.java class="sample.HelloworldImpl"/>
+ </component>
+
+</composite>
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld/src/test/java/sample/HelloworldTestCase.java b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld/src/test/java/sample/HelloworldTestCase.java
new file mode 100644
index 0000000000..be27aa68ef
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld/src/test/java/sample/HelloworldTestCase.java
@@ -0,0 +1,48 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package sample;
+
+import org.junit.Assert;
+
+import org.apache.tuscany.sca.Node;
+import org.apache.tuscany.sca.TuscanyRuntime;
+import org.junit.Test;
+import org.oasisopen.sca.NoSuchServiceException;
+
+public class HelloworldTestCase {
+
+ @Test
+ public void testSayHello() throws NoSuchServiceException {
+
+ // Run the SCA composite in a Tuscany runtime
+ Node node = TuscanyRuntime.runComposite("helloworld.composite", "target/classes");
+ try {
+
+ // Get the Helloworld service proxy
+ Helloworld helloworld = node.getService(Helloworld.class, "HelloworldComponent");
+
+ // test that it works as expected
+ Assert.assertEquals("Hello Amelia", helloworld.sayHello("Amelia"));
+
+ } finally {
+ // Stop the Tuscany runtime Node
+ node.stop();
+ }
+ }
+}
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/pom.xml b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/pom.xml
new file mode 100644
index 0000000000..7fba246648
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/pom.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<project>
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>org.apache.tuscany.sca.samples</groupId>
+ <artifactId>tuscany-samples</artifactId>
+ <version>2.0-Beta3-SNAPSHOT</version>
+ </parent>
+
+ <artifactId>tuscany-samples-getting-started</artifactId>
+ <version>2.0-Beta3-SNAPSHOT</version>
+ <packaging>pom</packaging>
+ <name>Apache Tuscany SCA Samples Getting Started</name>
+
+ <modules>
+ <module>helloworld</module>
+ <module>helloworld-jaxrs</module>
+ <module>helloworld-jsonp</module>
+ <module>helloworld-jsonrpc</module>
+ <module>helloworld-scaclient</module>
+ <module>helloworld-spring</module>
+ <module>helloworld-webapp</module>
+ <module>helloworld-webservice</module>
+ <module>helloworld-withdeps</module>
+ </modules>
+
+</project>
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/autocomplete-webapp/README b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/autocomplete-webapp/README
new file mode 100644
index 0000000000..57702664d7
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/autocomplete-webapp/README
@@ -0,0 +1,79 @@
+Tuscany - Learning More - Binding Comet - Autocomplete Webapp
+-----------------------------------------------------------------
+
+This sample demonstrates how Tuscany can expose services via Comet techniques
+as well as how to interact with them using Tuscany's javascript API.
+
+This project contains a service (CountryService) that handles requests asking
+for country names starting with a certain prefix. The service implementation
+uses a country repository to fetch the necessary data.
+
+By adding <tuscany:binding.comet/> to a service definition, the Tuscany runtime
+will handle the communication between the browser client and the service
+implementation using Comet techniques. This enables bidirectional communication
+over HTTP, therefore enabling server push. For more information, check
+http://en.wikipedia.org/wiki/Comet_(programming).
+
+The comet binding is using the Atmosphere Framework under the hood to acomodate
+as many deployment envorinments as possible. Basically, it checks if the
+application server supports Servlet 3.0 falling back to a number of native
+comet solutions provided by vendors (Jetty, Tomcat, WebLogic, GlassFish and
+others). If none is available, Atmosphere will fallback to blocking IO.
+
+Invoking comet services can be done using Tuscany's javascript API which simulates
+SCA in the browser. It uses the Atmosphere jQuery plugin under the hood. In order
+to use it, the following script has to be included in the client page:
+ <script type="text/javascript"
+ src="tuscany-comet-js/org.apache.tuscany.sca.CometComponentContext.js">
+ </script>
+
+The javascript toolkit permits choosing between two comet techniques: HTTP streaming
+and long polling. More detailed information about them can be found on the previously
+mentioned wikipedia page.
+
+First, a connect operation has to be issued in order to initiate communication
+with the server side using the technique of your choice. This is done using the
+connection method as follows:
+ SCA.TuscanyComet.connect('streaming'); // for HTTP streaming
+ SCA.TuscanyComet.connect('long-polling'); // for long polling
+ SCA.TuscanyComet.connect(); // starts with HTTP streaming and falls back to long polling if necessary
+
+The Tuscany Comet toolkit will inject proxies for all services defined in the composite
+that are using binding.comet. All invocation and connection management is handled
+under the hood so in order to invoke a comet service, the following should be called:
+ SCA.CometComponentContext.<service name>.<operation name>(<parameters>, callback);
+
+The callback parameter is the function that will handle responses received for a
+certain service operation. It has a single argument which is the response:
+ function callback(response) {
+ // handle response
+ };
+
+Note that the data exchange is automatically handled by the binding, so the
+parameters should have the same structure as the data types defined in the method
+definition. Also, the response will have the same data type as the return type of
+the service method. Objects are passed over the wire in JSON format.
+
+Another detail worth mentioning is that the binding will use a single HTTP
+connection to handle communication between a browser client and all services
+defined using binding.comet in the same composite. Requests and responses will get
+multiplexed via the same channel and get routed to the appropriate service
+implementation, respectively javascript function. This is done in order to avoid
+the 2 HTTP connection limit imposed by browsers. For more info, check
+http://www.openajax.org/runtime/wiki/The_Two_HTTP_Connection_Limit_Issue.
+
+In order to run the sample, you can execute "mvn clean install t7:run" which will
+start a Tomcat 7 instance automatically or use "mvn package" and deploy the resulting
+war to the application server of your choice.
+
+Next, point your browser at
+ http://localhost:8080/sample-binding-comet-autocomplete-webapp/
+
+You can see how suggestions are being received in real time when characters are
+entered in the text field. You can see the persistent HTTP streaming connection
+or long polling subsequent connections using the developer tools provided by
+your browser.
+
+The comet binding is an experimental binding so community feedback is much
+appreciated. Feel free to send comments or suggestions on the Apache Tuscany
+dev mailing list (dev@tuscany.apache.org). \ No newline at end of file
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/autocomplete-webapp/pom.xml b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/autocomplete-webapp/pom.xml
new file mode 100644
index 0000000000..343234f642
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/autocomplete-webapp/pom.xml
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>org.apache.tuscany.sca.samples</groupId>
+ <artifactId>tuscany-samples-binding-comet</artifactId>
+ <version>2.0-Beta3-SNAPSHOT</version>
+ <relativePath>../pom.xml</relativePath>
+ </parent>
+
+ <artifactId>sample-binding-comet-autocomplete-webapp</artifactId>
+ <packaging>war</packaging>
+ <version>2.0-Beta3-SNAPSHOT</version>
+ <name>Apache Tuscany SCA Sample binding.comet Real-Time Suggestions Webapp</name>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.tuscany.sca</groupId>
+ <artifactId>tuscany-binding-comet-runtime</artifactId>
+ <version>2.0-Beta3-SNAPSHOT</version>
+ </dependency>
+ <dependency>
+ <groupId>javax</groupId>
+ <artifactId>javaee-web-api</artifactId>
+ <version>6.0</version>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.tuscany.sca</groupId>
+ <artifactId>tuscany-base-runtime-pom</artifactId>
+ <version>2.0-Beta3-SNAPSHOT</version>
+ <type>pom</type>
+ <scope>compile</scope>
+ </dependency>
+ <dependency>
+ <groupId>com.google.guava</groupId>
+ <artifactId>guava</artifactId>
+ <version>r09</version>
+ <type>jar</type>
+ <scope>compile</scope>
+ </dependency>
+ </dependencies>
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>com.googlecode.t7mp</groupId>
+ <artifactId>maven-t7-plugin</artifactId>
+ <version>0.9.6</version>
+ <configuration>
+ <webapps>
+ <webappArtifact>
+ <groupId>org.apache.tuscany.sca.samples</groupId>
+ <artifactId>sample-binding-comet-autocomplete-webapp</artifactId>
+ <version>2.0-Beta3-SNAPSHOT</version>
+ </webappArtifact>
+ </webapps>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+
+</project>
+
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/autocomplete-webapp/src/main/java/org/apache/tuscany/sca/sample/comet/Country.java b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/autocomplete-webapp/src/main/java/org/apache/tuscany/sca/sample/comet/Country.java
new file mode 100644
index 0000000000..eedacf01d0
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/autocomplete-webapp/src/main/java/org/apache/tuscany/sca/sample/comet/Country.java
@@ -0,0 +1,40 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.tuscany.sca.sample.comet;
+
+import java.io.Serializable;
+
+public class Country implements Serializable {
+
+ private String name;
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ @Override
+ public String toString() {
+ return name;
+ }
+
+}
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/autocomplete-webapp/src/main/java/org/apache/tuscany/sca/sample/comet/CountryRepository.java b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/autocomplete-webapp/src/main/java/org/apache/tuscany/sca/sample/comet/CountryRepository.java
new file mode 100644
index 0000000000..12cdfb4235
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/autocomplete-webapp/src/main/java/org/apache/tuscany/sca/sample/comet/CountryRepository.java
@@ -0,0 +1,30 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.tuscany.sca.sample.comet;
+
+import java.util.List;
+
+import org.oasisopen.sca.annotation.Remotable;
+
+@Remotable
+public interface CountryRepository {
+
+ List<Country> findStartingWith(String text);
+
+}
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/autocomplete-webapp/src/main/java/org/apache/tuscany/sca/sample/comet/CountryRepositoryImpl.java b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/autocomplete-webapp/src/main/java/org/apache/tuscany/sca/sample/comet/CountryRepositoryImpl.java
new file mode 100644
index 0000000000..57e2d3e214
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/autocomplete-webapp/src/main/java/org/apache/tuscany/sca/sample/comet/CountryRepositoryImpl.java
@@ -0,0 +1,80 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.tuscany.sca.sample.comet;
+
+import java.io.BufferedReader;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.oasisopen.sca.annotation.Constructor;
+import org.oasisopen.sca.annotation.EagerInit;
+import org.oasisopen.sca.annotation.Init;
+import org.oasisopen.sca.annotation.Property;
+import org.oasisopen.sca.annotation.Scope;
+import org.oasisopen.sca.annotation.Service;
+
+@EagerInit
+@Scope("COMPOSITE")
+@Service(CountryRepository.class)
+public class CountryRepositoryImpl implements CountryRepository {
+
+ private String fileName;
+ private List<Country> countries;
+
+ @Constructor
+ public CountryRepositoryImpl(@Property(name = "fileName") String fileName) {
+ this.fileName = fileName;
+ countries = new ArrayList<Country>();
+ }
+
+ @Init
+ public void start() {
+ try {
+ BufferedReader reader = new BufferedReader(new InputStreamReader(getClass().getClassLoader()
+ .getResourceAsStream(fileName)));
+ String line;
+ while ((line = reader.readLine()) != null) {
+ if (!line.startsWith("#")) {
+ Country c = new Country();
+ c.setName(line);
+ countries.add(c);
+ }
+ }
+ } catch (FileNotFoundException e) {
+ e.printStackTrace();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ @Override
+ public List<Country> findStartingWith(String text) {
+ List<Country> result = new ArrayList<Country>();
+ for (Country c : countries) {
+ if (c.getName().toLowerCase().startsWith(text.toLowerCase())) {
+ result.add(c);
+ }
+ }
+ return result;
+ }
+
+}
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/autocomplete-webapp/src/main/java/org/apache/tuscany/sca/sample/comet/CountryService.java b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/autocomplete-webapp/src/main/java/org/apache/tuscany/sca/sample/comet/CountryService.java
new file mode 100644
index 0000000000..e916ecb98b
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/autocomplete-webapp/src/main/java/org/apache/tuscany/sca/sample/comet/CountryService.java
@@ -0,0 +1,30 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.tuscany.sca.sample.comet;
+
+import java.util.List;
+
+import org.oasisopen.sca.annotation.Remotable;
+
+@Remotable
+public interface CountryService {
+
+ List<Country> getCountriesStartingWith(String text);
+
+}
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/autocomplete-webapp/src/main/java/org/apache/tuscany/sca/sample/comet/CountryServiceImpl.java b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/autocomplete-webapp/src/main/java/org/apache/tuscany/sca/sample/comet/CountryServiceImpl.java
new file mode 100644
index 0000000000..ad0786be59
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/autocomplete-webapp/src/main/java/org/apache/tuscany/sca/sample/comet/CountryServiceImpl.java
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.tuscany.sca.sample.comet;
+
+import java.util.List;
+
+import org.oasisopen.sca.annotation.Reference;
+import org.oasisopen.sca.annotation.Service;
+
+@Service(CountryService.class)
+public class CountryServiceImpl implements CountryService {
+
+ @Reference
+ protected CountryRepository repository;
+
+ @Override
+ public List<Country> getCountriesStartingWith(String text) {
+ return repository.findStartingWith(text);
+ }
+}
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/autocomplete-webapp/src/main/resources/countries.txt b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/autocomplete-webapp/src/main/resources/countries.txt
new file mode 100644
index 0000000000..0ce76f8167
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/autocomplete-webapp/src/main/resources/countries.txt
@@ -0,0 +1,211 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+Afghanistan
+Albania
+Algeria
+Andorra
+Angola
+Antigua & Barbuda
+Argentina
+Armenia
+Australia
+Austria
+Azerbaijan
+Bahamas
+Bahrain
+Bangladesh
+Barbados
+Belarus
+Belgium
+Belize
+Benin
+Bhutan
+Bolivia
+Bosnia & Herzegovina
+Botswana
+Brazil
+Brunei
+Bulgaria
+Burkina Faso
+Burundi
+Cambodia
+Cameroon
+Canada
+Cape Verde
+Central African Republic
+Chad
+Chile
+China
+Colombia
+Comoros
+Congo
+Congo Democratic Republic of
+Costa Rica
+Cote d'Ivoire
+Croatia
+Cuba
+Cyprus
+Czech Republic
+Denmark
+Djibouti
+Dominica
+Dominican Republic
+Ecuador
+East Timor
+Egypt
+El Salvador
+Equatorial Guinea
+Eritrea
+Estonia
+Ethiopia
+Fiji
+Finland
+France
+Gabon
+Gambia
+Georgia
+Germany
+Ghana
+Greece
+Grenada
+Guatemala
+Guinea
+Guinea-Bissau
+Guyana
+Haiti
+Honduras
+Hungary
+Iceland
+India
+Indonesia
+Iran
+Iraq
+Ireland
+Israel
+Italy
+Jamaica
+Japan
+Jordan
+Kazakhstan
+Kenya
+Kiribati
+Korea North
+Korea South
+Kosovo
+Kuwait
+Kyrgyzstan
+Laos
+Latvia
+Lebanon
+Lesotho
+Liberia
+Libya
+Liechtenstein
+Lithuania
+Luxembourg
+Macedonia
+Madagascar
+Malawi
+Malaysia
+Maldives
+Mali
+Malta
+Marshall Islands
+Mauritania
+Mauritius
+Mexico
+Micronesia
+Moldova
+Monaco
+Mongolia
+Montenegro
+Morocco
+Mozambique
+Myanmar (Burma)
+Namibia
+Nauru
+Nepal
+The Netherlands
+New Zealand
+Nicaragua
+Niger
+Nigeria
+Norway
+Oman
+Pakistan
+Palau
+Palestinian State*
+Panama
+Papua New Guinea
+Paraguay
+Peru
+The Philippines
+Poland
+Portugal
+Qatar
+Romania
+Russia
+Rwanda
+St. Kitts & Nevis
+St. Lucia
+St. Vincent & The Grenadines
+Samoa
+San Marino
+Sao Tome & Principe
+Saudi Arabia
+Senegal
+Serbia
+Seychelles
+Sierra Leone
+Singapore
+Slovakia
+Slovenia
+Solomon Islands
+Somalia
+South Africa
+Spain
+Sri Lanka
+Sudan
+Suriname
+Swaziland
+Sweden
+Switzerland
+Syria
+Taiwan
+Tajikistan
+Tanzania
+Thailand
+Togo
+Tonga
+Trinidad & Tobago
+Tunisia
+Turkey
+Turkmenistan
+Tuvalu
+Uganda
+Ukraine
+United Arab Emirates
+United Kingdom
+United States of America
+Uruguay
+Uzbekistan
+Vanuatu
+Vatican City (Holy See)
+Venezuela
+Yemen
+Zambia
+Zimbabwe
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/autocomplete-webapp/src/main/webapp/META-INF/MANIFEST.MF b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/autocomplete-webapp/src/main/webapp/META-INF/MANIFEST.MF
new file mode 100644
index 0000000000..58630c02ef
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/autocomplete-webapp/src/main/webapp/META-INF/MANIFEST.MF
@@ -0,0 +1,2 @@
+Manifest-Version: 1.0
+
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/autocomplete-webapp/src/main/webapp/WEB-INF/web.composite b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/autocomplete-webapp/src/main/webapp/WEB-INF/web.composite
new file mode 100644
index 0000000000..f7cee35452
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/autocomplete-webapp/src/main/webapp/WEB-INF/web.composite
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<composite xmlns="http://docs.oasis-open.org/ns/opencsa/sca/200912"
+ xmlns:tuscany="http://tuscany.apache.org/xmlns/sca/1.1"
+ xmlns:sca="http://docs.oasis-open.org/ns/opencsa/sca/200912"
+ targetNamespace="http://samples" name="Chat">
+
+ <component name="CountryServiceComponent">
+ <implementation.java
+ class="org.apache.tuscany.sca.sample.comet.CountryServiceImpl" />
+ <service name="CountryService">
+ <interface.java interface="org.apache.tuscany.sca.sample.comet.CountryService" />
+ <tuscany:binding.comet />
+ </service>
+ <reference name="repository" target="CountryRepositoryComponent" />
+ </component>
+
+ <component name="CountryRepositoryComponent">
+ <implementation.java
+ class="org.apache.tuscany.sca.sample.comet.CountryRepositoryImpl" />
+ <property name="fileName">countries.txt</property>
+ </component>
+
+</composite> \ No newline at end of file
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/autocomplete-webapp/src/main/webapp/WEB-INF/web.xml b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/autocomplete-webapp/src/main/webapp/WEB-INF/web.xml
new file mode 100644
index 0000000000..25b06c457a
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/autocomplete-webapp/src/main/webapp/WEB-INF/web.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:j2ee="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_3.0.xsd" version="3.0">
+ <display-name>Apache Tuscany Stock Comet Sample</display-name>
+ <filter>
+ <filter-name>tuscany</filter-name>
+ <filter-class>org.apache.tuscany.sca.host.webapp.TuscanyServletFilter</filter-class>
+ <async-supported>true</async-supported>
+ </filter>
+ <filter-mapping>
+ <filter-name>tuscany</filter-name>
+ <url-pattern>/*</url-pattern>
+ </filter-mapping>
+ <welcome-file-list>
+ <welcome-file>index.html</welcome-file>
+ </welcome-file-list>
+</web-app> \ No newline at end of file
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/autocomplete-webapp/src/main/webapp/index.html b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/autocomplete-webapp/src/main/webapp/index.html
new file mode 100644
index 0000000000..115ca7bbdb
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/autocomplete-webapp/src/main/webapp/index.html
@@ -0,0 +1,69 @@
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<html>
+ <head>
+ <title>Apache Tuscany Comet Sample</title>
+ <!-- Tuscany Comet Javascript Toolkit is dependent on jQuery -->
+ <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js" type="text/javascript"></script>
+ <script type="text/javascript" src="tuscany-comet-js/org.apache.tuscany.sca.CometComponentContext.js"></script>
+ <script type="text/javascript">
+ var user = "";
+
+ $(document).ready(function()
+ {
+ // Tuscany Comet specific API
+ SCA.TuscanyComet.connect();
+
+ $("#country").keyup(function() {
+ var text = $("#country").val();
+ if (text != "") {
+ SCA.CometComponentContext.CountryService.getCountriesStartingWith(text, callback);
+ } else {
+ $("#suggestions").html("");
+ }
+ });
+
+ $("#country").focus();
+ });
+
+ function callback(response) {
+ var html = '<ul>';
+ $.each(response, function(index, country) {
+ html += '<li>' + country.name + "</li>"
+ });
+ html += '</ul>'
+ $("#suggestions").html(html);
+ }
+
+ </script>
+ </head>
+ <body>
+ <h2>Apache Tuscany Comet Sample</h2>
+ <h3>Real-time suggestions</h3>
+ <table>
+ <tr>
+ <td>Enter a country name</td>
+ <td><input type="text" id='country'/></td>
+ </tr>
+ </table>
+ </div>
+ <div id="suggestions">
+ </div>
+ </body>
+</html>
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/chat-webapp/README b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/chat-webapp/README
new file mode 100644
index 0000000000..303c63146a
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/chat-webapp/README
@@ -0,0 +1,99 @@
+Tuscany - Learning More - Binding Comet - Chat Webapp
+-----------------------------------------------------------------
+
+This sample demonstrates how Tuscany can expose services via Comet techniques
+as well as how to interact with them using Tuscany's javascript toolkit. It
+also demonstrates how to push multiple responses for a single request using
+SCA callbacks via comet techniques.
+
+This project contains a service (ChatService) that handles chat operations like
+register and postMessage. Once a client is registered it will receive messages
+that are sent to the chat room.
+
+By adding <tuscany:binding.comet/> to a service definition, the Tuscany runtime
+will handle the communication between the browser client and the service
+implementation using Comet techniques. This enables bidirectional communication
+over HTTP, therefore enabling server push. For more information, check
+http://en.wikipedia.org/wiki/Comet_(programming).
+
+The comet binding is using the Atmosphere Framework under the hood to acomodate
+as many deployment envorinments as possible. Basically, it checks if the
+application server supports Servlet 3.0 falling back to a number of native
+comet solutions provided by vendors (Jetty, Tomcat, WebLogic, GlassFish and
+others). If none is available, Atmosphere will fallback to blocking IO.
+
+In order to enable callbacks to push multiple responses, you need to declare the
+CometCallback in the service definition as follows:
+ <interface.java interface="org.apache.tuscany.sca.sample.comet.ChatService"
+ callbackInterface="org.apache.tuscany.sca.binding.comet.runtime.callback.CometCallback" />
+ <tuscany:binding.comet />
+ <callback>
+ <tuscany:binding.comet />
+ </callback>
+
+The callback object has methods that facilitate sending messages back to the
+calling client. It can be injected in the service implementation using the @Callback
+annotation. However, the service implementation for this sample has the COMPOSITE
+scope so the callback reference has to be obtained from the ComponentContext.
+
+One requirement that service methods have to meet to enable multiple response
+support is that they have to be annotated with @OneWay to enable non-blocking
+support. Without it, methods are treated synchronously sending a single response
+which is the object returned by the method call.
+
+Invoking comet services can be done using Tuscany's javascript API which simulates
+SCA in the browser. It uses the Atmosphere jQuery plugin under the hood. In order
+to use it, the following script has to be included in the client page:
+ <script type="text/javascript"
+ src="tuscany-comet-js/org.apache.tuscany.sca.CometComponentContext.js">
+ </script>
+
+The javascript toolkit permits choosing between two comet techniques: HTTP streaming
+and long polling. More detailed information about them can be found on the previously
+mentioned wikipedia page.
+
+First, a connect operation has to be issued in order to initiate communication
+with the server side using the technique of your choice. This is done using the
+connection method as follows:
+ SCA.TuscanyComet.connect('streaming'); // for HTTP streaming
+ SCA.TuscanyComet.connect('long-polling'); // for long polling
+ SCA.TuscanyComet.connect(); // starts with HTTP streaming and falls back to long polling if necessary
+
+The Tuscany Comet toolkit will inject proxies for all services defined in the composite
+that are using binding.comet. All invocation and connection management is handled
+under the hood so in order to invoke a comet service, the following should be called:
+ SCA.CometComponentContext.<service name>.<operation name>(<parameters>, callback);
+
+The callback parameter is the function that will handle responses received for a
+certain service operation. It has a single argument which is the response:
+ function callback(response) {
+ // handle response
+ };
+
+Note that the data exchange is automatically handled by the binding, so parameters
+will be mapped to the data types defined in the method definition. Also, the response
+will have the same data type as the server side object used to wrap the response.
+Objects are passed over the wire in JSON format.
+
+Another detail worth mentioning is that the binding will use a single HTTP
+connection to handle communication between a browser client and all services
+defined using binding.comet in the same composite. Requests and responses will get
+multiplexed via the same channel and get routed to the appropriate service
+implementation, respectively javascript function. This is done in order to avoid
+the 2 HTTP connection limit imposed by browsers. For more info, check
+http://www.openajax.org/runtime/wiki/The_Two_HTTP_Connection_Limit_Issue.
+
+In order to run the sample, you can execute "mvn clean install t7:run" which will
+start a Tomcat 7 instance automatically or use "mvn package" and deploy the resulting
+war to the application server of your choice.
+
+Next, point your browser at
+ http://localhost:8080/sample-binding-comet-chat-webapp/
+
+You can now chat using multiple tabs or browsers. You can see the persistent HTTP
+streaming connection or long polling subsequent connections using the developer tools
+provided by your browser.
+
+The comet binding is an experimental binding so community feedback is much
+appreciated. Feel free to send comments or suggestions on the Apache Tuscany
+dev mailing list (dev@tuscany.apache.org). \ No newline at end of file
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/chat-webapp/pom.xml b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/chat-webapp/pom.xml
new file mode 100644
index 0000000000..179a9598aa
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/chat-webapp/pom.xml
@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>org.apache.tuscany.sca.samples</groupId>
+ <artifactId>tuscany-samples-binding-comet</artifactId>
+ <version>2.0-Beta3-SNAPSHOT</version>
+ <relativePath>../pom.xml</relativePath>
+ </parent>
+
+ <artifactId>sample-binding-comet-chat-webapp</artifactId>
+ <packaging>war</packaging>
+ <version>2.0-Beta3-SNAPSHOT</version>
+ <name>Apache Tuscany SCA Sample binding.comet Chat Webapp</name>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.tuscany.sca</groupId>
+ <artifactId>tuscany-binding-comet-runtime</artifactId>
+ <version>2.0-Beta3-SNAPSHOT</version>
+ </dependency>
+ <dependency>
+ <groupId>javax</groupId>
+ <artifactId>javaee-web-api</artifactId>
+ <version>6.0</version>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.tuscany.sca</groupId>
+ <artifactId>tuscany-base-runtime-pom</artifactId>
+ <version>2.0-Beta3-SNAPSHOT</version>
+ <type>pom</type>
+ <scope>compile</scope>
+ </dependency>
+ <dependency>
+ <groupId>com.google.guava</groupId>
+ <artifactId>guava</artifactId>
+ <version>r09</version>
+ <type>jar</type>
+ <scope>compile</scope>
+ </dependency>
+ </dependencies>
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>com.googlecode.t7mp</groupId>
+ <artifactId>maven-t7-plugin</artifactId>
+ <version>0.9.6</version>
+ <configuration>
+ <webapps>
+ <webappArtifact>
+ <groupId>org.apache.tuscany.sca.samples</groupId>
+ <artifactId>sample-binding-comet-chat-webapp</artifactId>
+ <version>2.0-Beta3-SNAPSHOT</version>
+ </webappArtifact>
+ </webapps>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+</project>
+
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/chat-webapp/src/main/java/org/apache/tuscany/sca/sample/comet/ChatService.java b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/chat-webapp/src/main/java/org/apache/tuscany/sca/sample/comet/ChatService.java
new file mode 100644
index 0000000000..acb224715a
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/chat-webapp/src/main/java/org/apache/tuscany/sca/sample/comet/ChatService.java
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.tuscany.sca.sample.comet;
+
+import org.apache.tuscany.sca.binding.comet.runtime.callback.CometCallback;
+import org.oasisopen.sca.annotation.Callback;
+import org.oasisopen.sca.annotation.OneWay;
+import org.oasisopen.sca.annotation.Remotable;
+
+@Callback(CometCallback.class)
+@Remotable
+public interface ChatService {
+
+ @OneWay
+ void register();
+
+ @OneWay
+ void postMessage(String user, String message);
+
+}
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/chat-webapp/src/main/java/org/apache/tuscany/sca/sample/comet/ChatServiceImpl.java b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/chat-webapp/src/main/java/org/apache/tuscany/sca/sample/comet/ChatServiceImpl.java
new file mode 100644
index 0000000000..c4f3241c5b
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/chat-webapp/src/main/java/org/apache/tuscany/sca/sample/comet/ChatServiceImpl.java
@@ -0,0 +1,56 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.tuscany.sca.sample.comet;
+
+import java.util.ArrayList;
+import java.util.concurrent.CopyOnWriteArrayList;
+
+import org.apache.tuscany.sca.binding.comet.runtime.callback.CometCallback;
+import org.apache.tuscany.sca.binding.comet.runtime.callback.Status;
+import org.oasisopen.sca.ComponentContext;
+import org.oasisopen.sca.annotation.Context;
+import org.oasisopen.sca.annotation.Scope;
+import org.oasisopen.sca.annotation.Service;
+
+@Service(ChatService.class)
+@Scope("COMPOSITE")
+public class ChatServiceImpl implements ChatService {
+
+ @Context
+ protected ComponentContext context;
+
+ private CopyOnWriteArrayList<CometCallback> clients = new CopyOnWriteArrayList<CometCallback>();
+
+ @Override
+ public void postMessage(String user, String message) {
+ for (CometCallback callback : new ArrayList<CometCallback>(clients)) {
+ Status status = callback.sendMessage(user + ": " + message);
+ if (status == Status.CLIENT_DISCONNECTED) {
+ clients.remove(callback);
+ }
+ }
+ }
+
+ @Override
+ public void register() {
+ // saving the callback object during register() method so it will push data back to the client
+ // using the callback method defined for the register operation in the js when used
+ clients.add(context.getRequestContext().<CometCallback> getCallback());
+ }
+}
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/chat-webapp/src/main/webapp/META-INF/MANIFEST.MF b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/chat-webapp/src/main/webapp/META-INF/MANIFEST.MF
new file mode 100644
index 0000000000..58630c02ef
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/chat-webapp/src/main/webapp/META-INF/MANIFEST.MF
@@ -0,0 +1,2 @@
+Manifest-Version: 1.0
+
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/chat-webapp/src/main/webapp/WEB-INF/web.composite b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/chat-webapp/src/main/webapp/WEB-INF/web.composite
new file mode 100644
index 0000000000..c535a38116
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/chat-webapp/src/main/webapp/WEB-INF/web.composite
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<composite xmlns="http://docs.oasis-open.org/ns/opencsa/sca/200912"
+ xmlns:tuscany="http://tuscany.apache.org/xmlns/sca/1.1"
+ targetNamespace="http://samples" name="Chat">
+
+ <component name="ChatComponent">
+ <implementation.java
+ class="org.apache.tuscany.sca.sample.comet.ChatServiceImpl" />
+ <service name="ChatService">
+ <interface.java interface="org.apache.tuscany.sca.sample.comet.ChatService"
+ callbackInterface="org.apache.tuscany.sca.binding.comet.runtime.callback.CometCallback" />
+ <tuscany:binding.comet />
+ <callback>
+ <tuscany:binding.comet />
+ </callback>
+ </service>
+ </component>
+
+</composite> \ No newline at end of file
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/chat-webapp/src/main/webapp/WEB-INF/web.xml b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/chat-webapp/src/main/webapp/WEB-INF/web.xml
new file mode 100644
index 0000000000..25b06c457a
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/chat-webapp/src/main/webapp/WEB-INF/web.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:j2ee="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_3.0.xsd" version="3.0">
+ <display-name>Apache Tuscany Stock Comet Sample</display-name>
+ <filter>
+ <filter-name>tuscany</filter-name>
+ <filter-class>org.apache.tuscany.sca.host.webapp.TuscanyServletFilter</filter-class>
+ <async-supported>true</async-supported>
+ </filter>
+ <filter-mapping>
+ <filter-name>tuscany</filter-name>
+ <url-pattern>/*</url-pattern>
+ </filter-mapping>
+ <welcome-file-list>
+ <welcome-file>index.html</welcome-file>
+ </welcome-file-list>
+</web-app> \ No newline at end of file
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/chat-webapp/src/main/webapp/index.html b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/chat-webapp/src/main/webapp/index.html
new file mode 100644
index 0000000000..1aa79ed0b6
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/chat-webapp/src/main/webapp/index.html
@@ -0,0 +1,109 @@
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<html>
+ <head>
+ <title>Apache Tuscany Comet Sample</title>
+ <!-- Tuscany Comet Javascript Toolkit is dependent on jQuery -->
+ <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js" type="text/javascript"></script>
+ <script type="text/javascript" src="tuscany-comet-js/org.apache.tuscany.sca.CometComponentContext.js"></script>
+ <script type="text/javascript">
+ var user = "";
+
+ $(document).ready(function()
+ {
+ $("#chat").hide();
+ $("#username").focus();
+
+ // Tuscany Comet specific API
+ SCA.TuscanyComet.connect();
+
+ $("#register").click(function() {
+ register(messageCallback);
+ });
+
+ $("#username").keyup(function(e) {
+ if(e.keyCode == 13) {
+ register(messageCallback);
+ }
+ });
+
+ function register(callback) {
+ SCA.CometComponentContext.ChatService.register(callback);
+ user = $("#username").val();
+ $("#login").hide();
+ $("#chat").show();
+ $("#message").focus();
+ }
+
+ $("#send").click(function() {
+ postMessage(user, $("#message").val(), postCallback);
+ });
+
+ $("#message").keyup(function(e) {
+ if(e.keyCode == 13) {
+ postMessage(user, $("#message").val(), postCallback);
+ }
+ });
+
+ function postMessage(user, message, callback) {
+ SCA.CometComponentContext.ChatService.postMessage(user, message, callback);
+ $("#message").val("");
+ $("#message").focus();
+ }
+
+ });
+
+ // this method is invoked on new messages because the CometCallback object is saved
+ // during the register call so uses it's callback to push data back
+ function messageCallback(response) {
+ var textarea = document.getElementById('textarea');
+ textarea.value += response + "\n";
+ textarea.scrollTop = textarea.scrollHeight;
+ }
+
+ function postCallback(response) {
+ }
+
+ </script>
+ </head>
+ <body>
+ <h2>Apache Tuscany Comet Sample</h2>
+ <h3>Chat</h3>
+ <p/>
+ <div id="login">
+ <table>
+ <tr>
+ <td>Nickname</td>
+ <td><input type="text" id='username'/></td>
+ <td><input type="button" id='register' value='Login'/></td>
+ </tr>
+ </table>
+ </div>
+ <div id="chat">
+ <h3>Server notifications</h3>
+ <textarea id="textarea" rows="15" cols="30" readonly></textarea>
+ <table>
+ <tr>
+ <td><input type="text" id='message'/></td>
+ <td><input type="button" id='send' value='Send'/></td>
+ </tr>
+ </table>
+ </div>
+ </body>
+</html>
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/pom.xml b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/pom.xml
new file mode 100644
index 0000000000..64faa99af1
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/pom.xml
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<project>
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>org.apache.tuscany.sca.samples</groupId>
+ <artifactId>tuscany-samples-learning-more</artifactId>
+ <version>2.0-Beta3-SNAPSHOT</version>
+ <relativePath>../pom.xml</relativePath>
+ </parent>
+
+ <artifactId>tuscany-samples-binding-comet</artifactId>
+ <packaging>pom</packaging>
+ <name>Apache Tuscany SCA Sample binding.comet</name>
+
+ <profiles>
+ <profile>
+ <id>default</id>
+ <activation>
+ <activeByDefault>true</activeByDefault>
+ </activation>
+ <modules>
+ <module>autocomplete-webapp</module>
+ <module>weather-webapp</module>
+ <module>pubsub-webapp</module>
+ <module>chat-webapp</module>
+ </modules>
+ </profile>
+ </profiles>
+</project>
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/pubsub-webapp/README b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/pubsub-webapp/README
new file mode 100644
index 0000000000..845ff70e58
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/pubsub-webapp/README
@@ -0,0 +1,102 @@
+Tuscany - Learning More - Binding Comet - PubSub Webapp
+-----------------------------------------------------------------
+
+This sample demonstrates how Tuscany can expose services via Comet techniques
+as well as how to interact with them using Tuscany's javascript toolkit. It
+also demonstrates how to push multiple responses for a single request using
+SCA callbacks via comet techniques.
+
+This project contains a component that registers browser clients' interest in a
+certain event type. When an event of that type comes in, it notifies all registered
+clients. The event processor exposes a service via the websocket binding which
+enables server push to clients. Note that Tuscany 2.x doesn't have any conversational
+support so this has to be handled at application level by passing ids back and forth
+between the client and the server.
+
+By adding <tuscany:binding.comet/> to a service definition, the Tuscany runtime
+will handle the communication between the browser client and the service
+implementation using Comet techniques. This enables bidirectional communication
+over HTTP, therefore enabling server push. For more information, check
+http://en.wikipedia.org/wiki/Comet_(programming).
+
+The comet binding is using the Atmosphere Framework under the hood to acomodate
+as many deployment envorinments as possible. Basically, it checks if the
+application server supports Servlet 3.0 falling back to a number of native
+comet solutions provided by vendors (Jetty, Tomcat, WebLogic, GlassFish and
+others). If none is available, Atmosphere will fallback to blocking IO.
+
+In order to enable callbacks to push multiple responses, you need to declare the
+CometCallback in the service definition as follows:
+ <interface.java interface="org.apache.tuscany.sca.sample.comet.ChatService"
+ callbackInterface="org.apache.tuscany.sca.binding.comet.runtime.callback.CometCallback" />
+ <tuscany:binding.comet />
+ <callback>
+ <tuscany:binding.comet />
+ </callback>
+
+The callback object has methods that facilitate sending messages back to the
+calling client. It can be injected in the service implementation using the @Callback
+annotation.
+
+One requirement that service methods have to meet to enable multiple response
+support is that they have to be annotated with @OneWay to enable non-blocking
+support. Without it, methods are treated synchronously sending a single response
+which is the object returned by the method call.
+
+Invoking comet services can be done using Tuscany's javascript API which simulates
+SCA in the browser. It uses the Atmosphere jQuery plugin under the hood. In order
+to use it, the following script has to be included in the client page:
+ <script type="text/javascript"
+ src="tuscany-comet-js/org.apache.tuscany.sca.CometComponentContext.js">
+ </script>
+
+The javascript toolkit permits choosing between two comet techniques: HTTP streaming
+and long polling. More detailed information about them can be found on the previously
+mentioned wikipedia page.
+
+First, a connect operation has to be issued in order to initiate communication
+with the server side using the technique of your choice. This is done using the
+connection method as follows:
+ SCA.TuscanyComet.connect('streaming'); // for HTTP streaming
+ SCA.TuscanyComet.connect('long-polling'); // for long polling
+ SCA.TuscanyComet.connect(); // starts with HTTP streaming and falls back to long polling if necessary
+
+The Tuscany Comet toolkit will inject proxies for all services defined in the composite
+that are using binding.comet. All invocation and connection management is handled
+under the hood so in order to invoke a comet service, the following should be called:
+ SCA.CometComponentContext.<service name>.<operation name>(<parameters>, callback);
+
+The callback parameter is the function that will handle responses received for a
+certain service operation. It has a single argument which is the response:
+ function callback(response) {
+ // handle response
+ };
+
+Note that the data exchange is automatically handled by the binding, so parameters
+will be mapped to the data types defined in the method definition. Also, the response
+will have the same data type as the server side object used to wrap the response.
+Objects are passed over the wire in JSON format.
+
+Another detail worth mentioning is that the binding will use a single HTTP
+connection to handle communication between a browser client and all services
+defined using binding.comet in the same composite. Requests and responses will get
+multiplexed via the same channel and get routed to the appropriate service
+implementation, respectively javascript function. This is done in order to avoid
+the 2 HTTP connection limit imposed by browsers. For more info, check
+http://www.openajax.org/runtime/wiki/The_Two_HTTP_Connection_Limit_Issue.
+
+In order to run the sample, you can execute "mvn clean install t7:run" which will
+start a Tomcat 7 instance automatically or use "mvn package" and deploy the resulting
+war to the application server of your choice.
+
+Next, point your browser at
+ http://localhost:8080/sample-binding-comet-chat-webapp/
+
+You can now register or unregister for any of a number of events. When an event is fired
+on the server side, the browser client will receive a notification which will be displayed
+in the page. You can see the persistent HTTP streaming connection or long polling subsequent
+connections using the developer tools provided by your browser.
+
+The comet binding is an experimental binding so community feedback is much
+appreciated. Feel free to send comments or suggestions on the Apache Tuscany
+dev mailing list (dev@tuscany.apache.org). \ No newline at end of file
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/pubsub-webapp/pom.xml b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/pubsub-webapp/pom.xml
new file mode 100644
index 0000000000..4e43584288
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/pubsub-webapp/pom.xml
@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>org.apache.tuscany.sca.samples</groupId>
+ <artifactId>tuscany-samples-binding-comet</artifactId>
+ <version>2.0-Beta3-SNAPSHOT</version>
+ <relativePath>../pom.xml</relativePath>
+ </parent>
+
+ <artifactId>sample-binding-comet-pubsub-webapp</artifactId>
+ <packaging>war</packaging>
+ <version>2.0-Beta3-SNAPSHOT</version>
+ <name>Apache Tuscany SCA Sample binding.comet PubSub Webapp</name>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.tuscany.sca</groupId>
+ <artifactId>tuscany-binding-comet-runtime</artifactId>
+ <version>2.0-Beta3-SNAPSHOT</version>
+ </dependency>
+ <dependency>
+ <groupId>javax</groupId>
+ <artifactId>javaee-web-api</artifactId>
+ <version>6.0</version>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.tuscany.sca</groupId>
+ <artifactId>tuscany-base-runtime-pom</artifactId>
+ <version>2.0-Beta3-SNAPSHOT</version>
+ <type>pom</type>
+ <scope>compile</scope>
+ </dependency>
+ <dependency>
+ <groupId>com.google.guava</groupId>
+ <artifactId>guava</artifactId>
+ <version>r09</version>
+ <type>jar</type>
+ <scope>compile</scope>
+ </dependency>
+ </dependencies>
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>com.googlecode.t7mp</groupId>
+ <artifactId>maven-t7-plugin</artifactId>
+ <version>0.9.6</version>
+ <configuration>
+ <webapps>
+ <webappArtifact>
+ <groupId>org.apache.tuscany.sca.samples</groupId>
+ <artifactId>sample-binding-comet-pubsub-webapp</artifactId>
+ <version>2.0-Beta3-SNAPSHOT</version>
+ </webappArtifact>
+ </webapps>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+</project>
+
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/pubsub-webapp/src/main/java/org/apache/tuscany/sca/sample/comet/Event.java b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/pubsub-webapp/src/main/java/org/apache/tuscany/sca/sample/comet/Event.java
new file mode 100644
index 0000000000..bcc6bea7af
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/pubsub-webapp/src/main/java/org/apache/tuscany/sca/sample/comet/Event.java
@@ -0,0 +1,51 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.tuscany.sca.sample.comet;
+
+public class Event {
+
+ private String id;
+ private String name;
+ private String data;
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getData() {
+ return data;
+ }
+
+ public void setData(String data) {
+ this.data = data;
+ }
+
+}
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/pubsub-webapp/src/main/java/org/apache/tuscany/sca/sample/comet/EventProcessor.java b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/pubsub-webapp/src/main/java/org/apache/tuscany/sca/sample/comet/EventProcessor.java
new file mode 100644
index 0000000000..838d2f317c
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/pubsub-webapp/src/main/java/org/apache/tuscany/sca/sample/comet/EventProcessor.java
@@ -0,0 +1,107 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.tuscany.sca.sample.comet;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.UUID;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+
+import org.apache.tuscany.sca.binding.comet.runtime.callback.CometCallback;
+import org.apache.tuscany.sca.binding.comet.runtime.callback.Status;
+import org.oasisopen.sca.ComponentContext;
+import org.oasisopen.sca.annotation.Context;
+import org.oasisopen.sca.annotation.Destroy;
+import org.oasisopen.sca.annotation.Scope;
+import org.oasisopen.sca.annotation.Service;
+
+import com.google.common.collect.HashMultimap;
+import com.google.common.collect.Multimap;
+import com.google.common.collect.Multimaps;
+
+@Service({ EventProcessorConsumerService.class, EventProcessorProducerService.class })
+@Scope("COMPOSITE")
+public class EventProcessor implements EventProcessorConsumerService, EventProcessorProducerService {
+
+ @Context
+ protected ComponentContext componentContext;
+
+ private ConcurrentMap<String, CometCallback> clients = new ConcurrentHashMap<String, CometCallback>();
+ private Multimap<String, String> eventListeners = Multimaps.synchronizedMultimap(HashMultimap
+ .<String, String> create());
+
+ @Override
+ public void onEvent(String eventName, String eventData) {
+ // System.out.println("EventProcessor: Received event " + eventName +
+ // "...");
+ List<String> destinations = new ArrayList<String>();
+ synchronized (eventListeners) {
+ destinations.addAll(eventListeners.get(eventName));
+ }
+ Event event = new Event();
+ event.setName(eventName);
+ event.setData(eventData);
+ for (String registrationId : destinations) {
+ CometCallback client = clients.get(registrationId);
+ if (client == null) {
+ // client has unregistered from this event
+ synchronized (eventListeners) {
+ eventListeners.remove(eventName, registrationId);
+ }
+ } else {
+ Status status = client.sendMessage(event);
+ if (status == Status.CLIENT_DISCONNECTED) {
+ unregister(registrationId);
+ }
+ }
+ }
+ }
+
+ @Override
+ public void register(String eventName) {
+ String registrationId = UUID.randomUUID().toString();
+ CometCallback callback = componentContext.getRequestContext().getCallback();
+ clients.put(registrationId, callback);
+ synchronized (eventListeners) {
+ eventListeners.put(eventName, registrationId);
+ }
+ Event event = new Event();
+ event.setId(registrationId);
+ event.setName(eventName);
+ event.setData(new Date().toString());
+ callback.sendMessage(event);
+ }
+
+ @Override
+ public void unregister(String registrationId) {
+ clients.remove(registrationId);
+ // unregistration from eventListeners done during onEvent
+ }
+
+ @Destroy
+ public void shutdown() {
+ clients.clear();
+ eventListeners.clear();
+ clients = null;
+ eventListeners = null;
+ }
+}
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/pubsub-webapp/src/main/java/org/apache/tuscany/sca/sample/comet/EventProcessorConsumerService.java b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/pubsub-webapp/src/main/java/org/apache/tuscany/sca/sample/comet/EventProcessorConsumerService.java
new file mode 100644
index 0000000000..c8208e862c
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/pubsub-webapp/src/main/java/org/apache/tuscany/sca/sample/comet/EventProcessorConsumerService.java
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.tuscany.sca.sample.comet;
+
+import org.apache.tuscany.sca.binding.comet.runtime.callback.CometCallback;
+import org.oasisopen.sca.annotation.Callback;
+import org.oasisopen.sca.annotation.OneWay;
+import org.oasisopen.sca.annotation.Remotable;
+
+@Callback(CometCallback.class)
+@Remotable
+public interface EventProcessorConsumerService {
+
+ @OneWay
+ void register(String eventName);
+
+ @OneWay
+ void unregister(String registrationId);
+
+}
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/pubsub-webapp/src/main/java/org/apache/tuscany/sca/sample/comet/EventProcessorProducerService.java b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/pubsub-webapp/src/main/java/org/apache/tuscany/sca/sample/comet/EventProcessorProducerService.java
new file mode 100644
index 0000000000..49d760d171
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/pubsub-webapp/src/main/java/org/apache/tuscany/sca/sample/comet/EventProcessorProducerService.java
@@ -0,0 +1,28 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.tuscany.sca.sample.comet;
+
+import org.oasisopen.sca.annotation.Remotable;
+
+@Remotable
+public interface EventProcessorProducerService {
+
+ void onEvent(String eventName, String eventData);
+
+}
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/pubsub-webapp/src/main/java/org/apache/tuscany/sca/sample/comet/Producer.java b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/pubsub-webapp/src/main/java/org/apache/tuscany/sca/sample/comet/Producer.java
new file mode 100644
index 0000000000..59307824ce
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/pubsub-webapp/src/main/java/org/apache/tuscany/sca/sample/comet/Producer.java
@@ -0,0 +1,76 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.tuscany.sca.sample.comet;
+
+import java.util.Date;
+import java.util.Timer;
+import java.util.TimerTask;
+
+import org.oasisopen.sca.annotation.Constructor;
+import org.oasisopen.sca.annotation.Destroy;
+import org.oasisopen.sca.annotation.EagerInit;
+import org.oasisopen.sca.annotation.Init;
+import org.oasisopen.sca.annotation.Property;
+import org.oasisopen.sca.annotation.Reference;
+import org.oasisopen.sca.annotation.Scope;
+
+@EagerInit
+@Scope("COMPOSITE")
+public class Producer {
+
+ @Reference
+ protected EventProcessorProducerService eventProcessor;
+
+ private String eventName;
+ private long frequency;
+
+ private Timer timer = new Timer();
+ private Object lock = new Object();
+
+ @Constructor
+ public Producer(@Property(name = "eventName") String eventName, @Property(name = "frequency") long frequency) {
+ System.out.println("Producer: In Constructor with eventName=" + eventName + " and frequency=" + frequency);
+ this.eventName = eventName;
+ this.frequency = frequency;
+ }
+
+ @Init
+ public void start() {
+ System.out.println("Producer: In Init...");
+ timer.schedule(new TimerTask() {
+
+ @Override
+ public void run() {
+// System.out.println("Producer: Producing " + eventName + " event...");
+ synchronized (lock) {
+ eventProcessor.onEvent(Producer.this.eventName, "Event @ " + new Date());
+ }
+ }
+ }, 0L, this.frequency);
+ }
+
+ @Destroy
+ public void stop() {
+ synchronized (lock) {
+ timer.cancel();
+ }
+ timer = null;
+ }
+
+}
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/pubsub-webapp/src/main/webapp/META-INF/MANIFEST.MF b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/pubsub-webapp/src/main/webapp/META-INF/MANIFEST.MF
new file mode 100644
index 0000000000..58630c02ef
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/pubsub-webapp/src/main/webapp/META-INF/MANIFEST.MF
@@ -0,0 +1,2 @@
+Manifest-Version: 1.0
+
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/pubsub-webapp/src/main/webapp/WEB-INF/web.composite b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/pubsub-webapp/src/main/webapp/WEB-INF/web.composite
new file mode 100644
index 0000000000..6479e10e99
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/pubsub-webapp/src/main/webapp/WEB-INF/web.composite
@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<composite xmlns="http://docs.oasis-open.org/ns/opencsa/sca/200912"
+ xmlns:tuscany="http://tuscany.apache.org/xmlns/sca/1.1"
+ targetNamespace="http://samples" name="Event">
+
+ <component name="EventProcessorComponent">
+ <implementation.java
+ class="org.apache.tuscany.sca.sample.comet.EventProcessor" />
+ <service name="EventProcessorConsumerService">
+ <interface.java
+ interface="org.apache.tuscany.sca.sample.comet.EventProcessorConsumerService"
+ callbackInterface="org.apache.tuscany.sca.binding.comet.runtime.callback.CometCallback" />
+ <tuscany:binding.comet />
+ <callback>
+ <tuscany:binding.comet />
+ </callback>
+ </service>
+ <service name="EventProcessorProducerService">
+ <interface.java
+ interface="org.apache.tuscany.sca.sample.comet.EventProcessorProducerService" />
+ </service>
+ </component>
+
+ <component name="SLOWProducerComponent">
+ <implementation.java class="org.apache.tuscany.sca.sample.comet.Producer" />
+ <reference name="eventProcessor" target="EventProcessorComponent" />
+ <property name="eventName">SLOW</property>
+ <property name="frequency">6000</property>
+ </component>
+
+ <component name="MODERATEProducerComponent">
+ <implementation.java class="org.apache.tuscany.sca.sample.comet.Producer" />
+ <reference name="eventProcessor" target="EventProcessorComponent" />
+ <property name="eventName">MODERATE</property>
+ <property name="frequency">3000</property>
+ </component>
+
+ <component name="FASTProducerComponent">
+ <implementation.java class="org.apache.tuscany.sca.sample.comet.Producer" />
+ <reference name="eventProcessor" target="EventProcessorComponent" />
+ <property name="eventName">FAST</property>
+ <property name="frequency">1000</property>
+ </component>
+
+</composite> \ No newline at end of file
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/pubsub-webapp/src/main/webapp/WEB-INF/web.xml b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/pubsub-webapp/src/main/webapp/WEB-INF/web.xml
new file mode 100644
index 0000000000..25b06c457a
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/pubsub-webapp/src/main/webapp/WEB-INF/web.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:j2ee="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_3.0.xsd" version="3.0">
+ <display-name>Apache Tuscany Stock Comet Sample</display-name>
+ <filter>
+ <filter-name>tuscany</filter-name>
+ <filter-class>org.apache.tuscany.sca.host.webapp.TuscanyServletFilter</filter-class>
+ <async-supported>true</async-supported>
+ </filter>
+ <filter-mapping>
+ <filter-name>tuscany</filter-name>
+ <url-pattern>/*</url-pattern>
+ </filter-mapping>
+ <welcome-file-list>
+ <welcome-file>index.html</welcome-file>
+ </welcome-file-list>
+</web-app> \ No newline at end of file
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/pubsub-webapp/src/main/webapp/index.html b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/pubsub-webapp/src/main/webapp/index.html
new file mode 100644
index 0000000000..0488c4cb10
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/pubsub-webapp/src/main/webapp/index.html
@@ -0,0 +1,107 @@
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<html>
+<head>
+ <title>Apache Tuscany Comet Sample</title>
+ <!-- Tuscany Comet Javascript Toolkit is dependent on jQuery -->
+ <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js" type="text/javascript"></script>
+ <script type="text/javascript" src="tuscany-comet-js/org.apache.tuscany.sca.CometComponentContext.js"></script>
+ <script type="text/javascript">
+ $(document).ready(function()
+ {
+ // Tuscany Comet specific API
+ $('#connect').click(function(event) {
+ /* transport can be : long-polling or streaming */
+ SCA.TuscanyComet.connect($('#transport').val());
+ $('#connect').val('Switch');
+ });
+
+
+ $('#registerEventButton').click(function(event) {
+ var eventName = $('#registerEventName').val();
+ if (registrationIds[eventName] != null) {
+ alert("Already registered for " + eventName + " events");
+ } else {
+ SCA.CometComponentContext.EventProcessorConsumerService.register(eventName, responseReceived);
+ }
+ });
+
+ $('#unregisterEventButton').click(function(event) {
+ var eventName = $('#unregisterEventName').val();
+ if (registrationIds[eventName] != null) {
+ SCA.CometComponentContext.EventProcessorConsumerService.unregister(registrationIds[eventName], responseReceived);
+ registrationIds[eventName] = null;
+ } else {
+ alert("Not registered for " + eventName + " events");
+ }
+ });
+
+ });
+
+ var registrationIds = {};
+
+ function responseReceived(event) {
+ var text = '';
+ if (event.id != null) {
+ // registration notification
+ registrationIds[event.name] = event.id;
+ text = "Registered to " + event.name + " with id " + event.id + " at " + event.data;
+ } else {
+ // event notification
+ text = event.name + ": " + event.data;
+ }
+ var textarea = $('#textarea');
+ $(textarea).val($(textarea).val() + text + "\n");
+ $(textarea).scrollTop($(textarea)[0].scrollHeight);
+ }
+
+ </script>
+</head>
+<body>
+ <div id='sidebar'>
+ <h2>Apache Tuscany Comet Sample</h2>
+ <label>Select transport</label> <select id="transport">
+ <option id="streaming" value="streaming">http streaming</option>
+ <option id="long-polling" value="long-polling">long-polling</option>
+ </select> <input id='connect' type='submit' value='Connect' />
+ <h3>PubSub for FAST, MODERATE and SLOW events</h3>
+ <p />
+ <table>
+ <tr>
+ <td>Event name</td>
+ <td><input type="text" id='registerEventName' value='FAST' />
+ </td>
+ <td><input type="button" id='registerEventButton'
+ value='Register' />
+ </td>
+ </tr>
+ <tr>
+ <td>Event name</td>
+ <td><input type="text" id='unregisterEventName' value='FAST' />
+ </td>
+ <td><input type="button" id='unregisterEventButton'
+ value='Unregister' />
+ </td>
+ </tr>
+ </table>
+ <h3>Server notifications</h3>
+ <textarea id="textarea" rows="15" cols="80" readonly></textarea>
+ </div>
+</body>
+</html>
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/weather-webapp/README b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/weather-webapp/README
new file mode 100644
index 0000000000..dc69bcf6fc
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/weather-webapp/README
@@ -0,0 +1,100 @@
+Tuscany - Learning More - Binding Comet - Weather Monitor Webapp
+-----------------------------------------------------------------
+
+This sample demonstrates how Tuscany can expose services via Comet techniques
+as well as how to interact with them using Tuscany's javascript toolkit. It
+also demonstrates how to push multiple responses for a single request using
+SCA callbacks via comet techniques.
+
+This project contains multiple services that once called will push notifications
+to the client regarding certain weather parameters according to the location of
+the user. Of course, the service implementation is a mock that generates random
+numbers at a fixed interval of time as weather parameters.
+
+By adding <tuscany:binding.comet/> to a service definition, the Tuscany runtime
+will handle the communication between the browser client and the service
+implementation using Comet techniques. This enables bidirectional communication
+over HTTP, therefore enabling server push. For more information, check
+http://en.wikipedia.org/wiki/Comet_(programming).
+
+The comet binding is using the Atmosphere Framework under the hood to acomodate
+as many deployment envorinments as possible. Basically, it checks if the
+application server supports Servlet 3.0 falling back to a number of native
+comet solutions provided by vendors (Jetty, Tomcat, WebLogic, GlassFish and
+others). If none is available, Atmosphere will fallback to blocking IO.
+
+In order to enable callbacks to push multiple responses, you need to declare the
+CometCallback in the service definition as follows:
+ <interface.java interface="org.apache.tuscany.sca.sample.comet.ChatService"
+ callbackInterface="org.apache.tuscany.sca.binding.comet.runtime.callback.CometCallback" />
+ <tuscany:binding.comet />
+ <callback>
+ <tuscany:binding.comet />
+ </callback>
+
+The callback object has methods that facilitate sending messages back to the
+calling client. It can be injected in the service implementation using the @Callback
+annotation.
+
+One requirement that service methods have to meet to enable multiple response
+support is that they have to be annotated with @OneWay to enable non-blocking
+support. Without it, methods are treated synchronously sending a single response
+which is the object returned by the method call.
+
+Invoking comet services can be done using Tuscany's javascript API which simulates
+SCA in the browser. It uses the Atmosphere jQuery plugin under the hood. In order
+to use it, the following script has to be included in the client page:
+ <script type="text/javascript"
+ src="tuscany-comet-js/org.apache.tuscany.sca.CometComponentContext.js">
+ </script>
+
+The javascript toolkit permits choosing between two comet techniques: HTTP streaming
+and long polling. More detailed information about them can be found on the previously
+mentioned wikipedia page.
+
+First, a connect operation has to be issued in order to initiate communication
+with the server side using the technique of your choice. This is done using the
+connection method as follows:
+ SCA.TuscanyComet.connect('streaming'); // for HTTP streaming
+ SCA.TuscanyComet.connect('long-polling'); // for long polling
+ SCA.TuscanyComet.connect(); // starts with HTTP streaming and falls back to long polling if necessary
+
+The Tuscany Comet toolkit will inject proxies for all services defined in the composite
+that are using binding.comet. All invocation and connection management is handled
+under the hood so in order to invoke a comet service, the following should be called:
+ SCA.CometComponentContext.<service name>.<operation name>(<parameters>, callback);
+
+The callback parameter is the function that will handle responses received for a
+certain service operation. It has a single argument which is the response:
+ function callback(response) {
+ // handle response
+ };
+
+Note that the data exchange is automatically handled by the binding, so parameters
+will be mapped to the data types defined in the method definition. Also, the response
+will have the same data type as the server side object used to wrap the response.
+Objects are passed over the wire in JSON format.
+
+Another detail worth mentioning is that the binding will use a single HTTP
+connection to handle communication between a browser client and all services
+defined using binding.comet in the same composite. Requests and responses will get
+multiplexed via the same channel and get routed to the appropriate service
+implementation, respectively javascript function. This is done in order to avoid
+the 2 HTTP connection limit imposed by browsers. For more info, check
+http://www.openajax.org/runtime/wiki/The_Two_HTTP_Connection_Limit_Issue.
+
+In order to run the sample, you can execute "mvn clean install t7:run" which will
+start a Tomcat 7 instance automatically or use "mvn package" and deploy the resulting
+war to the application server of your choice.
+
+Next, point your browser at
+ http://localhost:8080/sample-binding-comet-weather-webapp/
+
+You can now set a location and register for various weather parameters. Notifications
+will be pushed to the browser when weather parameters change. You can see the persistent
+HTTP streaming connection or long polling subsequent connections using the developer
+tools provided by your browser.
+
+The comet binding is an experimental binding so community feedback is much
+appreciated. Feel free to send comments or suggestions on the Apache Tuscany
+dev mailing list (dev@tuscany.apache.org). \ No newline at end of file
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/weather-webapp/pom.xml b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/weather-webapp/pom.xml
new file mode 100644
index 0000000000..9151802660
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/weather-webapp/pom.xml
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>org.apache.tuscany.sca.samples</groupId>
+ <artifactId>tuscany-samples-binding-comet</artifactId>
+ <version>2.0-Beta3-SNAPSHOT</version>
+ <relativePath>../pom.xml</relativePath>
+ </parent>
+
+ <artifactId>sample-binding-comet-weather-webapp</artifactId>
+ <packaging>war</packaging>
+ <version>2.0-Beta3-SNAPSHOT</version>
+ <name>Apache Tuscany SCA Sample binding.comet Weather Monitor Webapp</name>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.tuscany.sca</groupId>
+ <artifactId>tuscany-binding-comet-runtime</artifactId>
+ <version>2.0-Beta3-SNAPSHOT</version>
+ </dependency>
+ <dependency>
+ <groupId>javax</groupId>
+ <artifactId>javaee-web-api</artifactId>
+ <version>6.0</version>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.tuscany.sca</groupId>
+ <artifactId>tuscany-base-runtime-pom</artifactId>
+ <version>2.0-Beta3-SNAPSHOT</version>
+ <type>pom</type>
+ <scope>compile</scope>
+ </dependency>
+ </dependencies>
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>com.googlecode.t7mp</groupId>
+ <artifactId>maven-t7-plugin</artifactId>
+ <version>0.9.6</version>
+ <configuration>
+ <webapps>
+ <webappArtifact>
+ <groupId>org.apache.tuscany.sca.samples</groupId>
+ <artifactId>sample-binding-comet-weather-webapp</artifactId>
+ <version>2.0-Beta3-SNAPSHOT</version>
+ </webappArtifact>
+ </webapps>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+</project>
+
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/weather-webapp/src/main/java/org/apache/tuscany/sca/sample/comet/Helper.java b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/weather-webapp/src/main/java/org/apache/tuscany/sca/sample/comet/Helper.java
new file mode 100644
index 0000000000..eecc6044ea
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/weather-webapp/src/main/java/org/apache/tuscany/sca/sample/comet/Helper.java
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.tuscany.sca.sample.comet;
+
+import java.util.Date;
+import java.util.Random;
+
+public final class Helper {
+
+ public static int randomInt(final int max) {
+ return (new Random(new Date().getTime()).nextInt(100));
+ }
+
+ private Helper() {
+ }
+
+}
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/weather-webapp/src/main/java/org/apache/tuscany/sca/sample/comet/HumidityService.java b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/weather-webapp/src/main/java/org/apache/tuscany/sca/sample/comet/HumidityService.java
new file mode 100644
index 0000000000..7145e30e03
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/weather-webapp/src/main/java/org/apache/tuscany/sca/sample/comet/HumidityService.java
@@ -0,0 +1,35 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.tuscany.sca.sample.comet;
+
+import org.apache.tuscany.sca.binding.comet.runtime.callback.CometCallback;
+import org.apache.tuscany.sca.sample.comet.model.Location;
+import org.oasisopen.sca.annotation.Callback;
+import org.oasisopen.sca.annotation.OneWay;
+import org.oasisopen.sca.annotation.Remotable;
+
+@Remotable
+@Callback(CometCallback.class)
+public interface HumidityService {
+
+ @OneWay
+ void getHumidity(Location location);
+
+} \ No newline at end of file
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/weather-webapp/src/main/java/org/apache/tuscany/sca/sample/comet/PrecipitationService.java b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/weather-webapp/src/main/java/org/apache/tuscany/sca/sample/comet/PrecipitationService.java
new file mode 100644
index 0000000000..a53fac5ed1
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/weather-webapp/src/main/java/org/apache/tuscany/sca/sample/comet/PrecipitationService.java
@@ -0,0 +1,35 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.tuscany.sca.sample.comet;
+
+import org.apache.tuscany.sca.binding.comet.runtime.callback.CometCallback;
+import org.apache.tuscany.sca.sample.comet.model.Location;
+import org.oasisopen.sca.annotation.Callback;
+import org.oasisopen.sca.annotation.OneWay;
+import org.oasisopen.sca.annotation.Remotable;
+
+@Remotable
+@Callback(CometCallback.class)
+public interface PrecipitationService {
+
+ @OneWay
+ void getPrecipitation(Location location);
+
+}
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/weather-webapp/src/main/java/org/apache/tuscany/sca/sample/comet/PrecipitationServiceImpl.java b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/weather-webapp/src/main/java/org/apache/tuscany/sca/sample/comet/PrecipitationServiceImpl.java
new file mode 100644
index 0000000000..2c064a3ae6
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/weather-webapp/src/main/java/org/apache/tuscany/sca/sample/comet/PrecipitationServiceImpl.java
@@ -0,0 +1,56 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.tuscany.sca.sample.comet;
+
+import java.util.Date;
+import java.util.Timer;
+import java.util.TimerTask;
+
+import org.apache.tuscany.sca.binding.comet.runtime.callback.CometCallback;
+import org.apache.tuscany.sca.binding.comet.runtime.callback.Status;
+import org.apache.tuscany.sca.sample.comet.model.Location;
+import org.apache.tuscany.sca.sample.comet.model.Response;
+import org.oasisopen.sca.annotation.Callback;
+import org.oasisopen.sca.annotation.Service;
+
+@Service(PrecipitationService.class)
+public class PrecipitationServiceImpl implements PrecipitationService {
+
+ @Callback
+ protected CometCallback client;
+
+ @Override
+ public void getPrecipitation(final Location location) {
+ new Timer().scheduleAtFixedRate(new TimerTask() {
+
+ @Override
+ public void run() {
+ Response response = new Response();
+ response.setDate(new Date());
+ response.setData(Helper.randomInt(100) + "%");
+ Status status = client.sendMessage(response);
+ if (status == Status.CLIENT_DISCONNECTED) {
+ System.out.println("Client disconnected from PrecipitationService.");
+ this.cancel();
+ }
+ }
+ }, 0L, 1000L);
+ }
+}
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/weather-webapp/src/main/java/org/apache/tuscany/sca/sample/comet/TemperatureHumidityServiceImpl.java b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/weather-webapp/src/main/java/org/apache/tuscany/sca/sample/comet/TemperatureHumidityServiceImpl.java
new file mode 100644
index 0000000000..4227667e7f
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/weather-webapp/src/main/java/org/apache/tuscany/sca/sample/comet/TemperatureHumidityServiceImpl.java
@@ -0,0 +1,76 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.tuscany.sca.sample.comet;
+
+import java.util.Date;
+import java.util.Timer;
+import java.util.TimerTask;
+
+import org.apache.tuscany.sca.binding.comet.runtime.callback.CometCallback;
+import org.apache.tuscany.sca.binding.comet.runtime.callback.Status;
+import org.apache.tuscany.sca.sample.comet.model.Location;
+import org.apache.tuscany.sca.sample.comet.model.Response;
+import org.oasisopen.sca.annotation.Callback;
+import org.oasisopen.sca.annotation.Service;
+
+@Service({ TemperatureService.class, HumidityService.class })
+public class TemperatureHumidityServiceImpl implements TemperatureService, HumidityService {
+
+ @Callback
+ protected CometCallback callback;
+
+ @Override
+ public void getHumidity(final Location location) {
+ new Timer().scheduleAtFixedRate(new TimerTask() {
+
+ @Override
+ public void run() {
+ final Response response = new Response();
+ response.setDate(new Date());
+ response.setData(Helper.randomInt(90) + "%");
+ Status status = callback.sendMessage(response);
+ if (status == Status.CLIENT_DISCONNECTED) {
+ System.out.println("Client disconnected from HumidityService.");
+ this.cancel();
+ }
+ }
+ }, 0L, 5000L);
+ }
+
+ @Override
+ public void getTemperature(final Location location, final int scale) {
+ new Timer().scheduleAtFixedRate(new TimerTask() {
+
+ @Override
+ public void run() {
+ final Response response = new Response();
+ response.setDate(new Date());
+ final String data = "" + Helper.randomInt(scale == TemperatureService.CELSIUS ? 40 : 150);
+ response.setData(data);
+ Status status = callback.sendMessage(response);
+ if (status == Status.CLIENT_DISCONNECTED) {
+ System.out.println("Client disconnected from TemperatureService.");
+ this.cancel();
+ }
+ }
+ }, 0L, 3000L);
+ }
+
+} \ No newline at end of file
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/weather-webapp/src/main/java/org/apache/tuscany/sca/sample/comet/TemperatureService.java b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/weather-webapp/src/main/java/org/apache/tuscany/sca/sample/comet/TemperatureService.java
new file mode 100644
index 0000000000..83afae696f
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/weather-webapp/src/main/java/org/apache/tuscany/sca/sample/comet/TemperatureService.java
@@ -0,0 +1,38 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.tuscany.sca.sample.comet;
+
+import org.apache.tuscany.sca.binding.comet.runtime.callback.CometCallback;
+import org.apache.tuscany.sca.sample.comet.model.Location;
+import org.oasisopen.sca.annotation.Callback;
+import org.oasisopen.sca.annotation.OneWay;
+import org.oasisopen.sca.annotation.Remotable;
+
+@Remotable
+@Callback(CometCallback.class)
+public interface TemperatureService {
+
+ public static final int CELSIUS = 1;
+ public static final int FAHRENHEIT = 2;
+
+ @OneWay
+ void getTemperature(Location location, int scale);
+
+} \ No newline at end of file
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/weather-webapp/src/main/java/org/apache/tuscany/sca/sample/comet/model/Location.java b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/weather-webapp/src/main/java/org/apache/tuscany/sca/sample/comet/model/Location.java
new file mode 100644
index 0000000000..ff2da3a360
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/weather-webapp/src/main/java/org/apache/tuscany/sca/sample/comet/model/Location.java
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.tuscany.sca.sample.comet.model;
+
+public class Location {
+
+ private String city;
+ private String country;
+
+ public String getCity() {
+ return this.city;
+ }
+
+ public void setCity(final String city) {
+ this.city = city;
+ }
+
+ public String getCountry() {
+ return this.country;
+ }
+
+ public void setCountry(final String country) {
+ this.country = country;
+ }
+
+}
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/weather-webapp/src/main/java/org/apache/tuscany/sca/sample/comet/model/Response.java b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/weather-webapp/src/main/java/org/apache/tuscany/sca/sample/comet/model/Response.java
new file mode 100644
index 0000000000..aaa23f0b8a
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/weather-webapp/src/main/java/org/apache/tuscany/sca/sample/comet/model/Response.java
@@ -0,0 +1,45 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.tuscany.sca.sample.comet.model;
+
+import java.util.Date;
+
+public class Response {
+
+ private Date date;
+ private String data;
+
+ public Date getDate() {
+ return this.date;
+ }
+
+ public void setDate(final Date date) {
+ this.date = date;
+ }
+
+ public String getData() {
+ return this.data;
+ }
+
+ public void setData(final String data) {
+ this.data = data;
+ }
+
+}
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/weather-webapp/src/main/webapp/META-INF/MANIFEST.MF b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/weather-webapp/src/main/webapp/META-INF/MANIFEST.MF
new file mode 100644
index 0000000000..58630c02ef
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/weather-webapp/src/main/webapp/META-INF/MANIFEST.MF
@@ -0,0 +1,2 @@
+Manifest-Version: 1.0
+
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/weather-webapp/src/main/webapp/WEB-INF/web.composite b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/weather-webapp/src/main/webapp/WEB-INF/web.composite
new file mode 100644
index 0000000000..20d25fe527
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/weather-webapp/src/main/webapp/WEB-INF/web.composite
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<composite xmlns="http://docs.oasis-open.org/ns/opencsa/sca/200912"
+ xmlns:tuscany="http://tuscany.apache.org/xmlns/sca/1.1"
+ targetNamespace="http://samples"
+ name="Weather">
+
+ <component name="c1">
+ <implementation.java class="org.apache.tuscany.sca.sample.comet.TemperatureHumidityServiceImpl"/>
+ <service name="TemperatureService">
+ <interface.java interface="org.apache.tuscany.sca.sample.comet.TemperatureService"
+ callbackInterface="org.apache.tuscany.sca.binding.comet.runtime.callback.CometCallback"/>
+ <tuscany:binding.comet/>
+ <callback>
+ <tuscany:binding.comet/>
+ </callback>
+ </service>
+ <service name="HumidityService">
+ <interface.java interface="org.apache.tuscany.sca.sample.comet.HumidityService"
+ callbackInterface="org.apache.tuscany.sca.binding.comet.runtime.callback.CometCallback"/>
+ <tuscany:binding.comet/>
+ <callback>
+ <tuscany:binding.comet/>
+ </callback>
+ </service>
+ </component>
+
+
+ <component name="c2">
+ <implementation.java class="org.apache.tuscany.sca.sample.comet.PrecipitationServiceImpl"/>
+ <service name="PrecipitationService">
+ <interface.java interface="org.apache.tuscany.sca.sample.comet.PrecipitationService"
+ callbackInterface="org.apache.tuscany.sca.binding.comet.runtime.callback.CometCallback"/>
+ <tuscany:binding.comet/>
+ <callback>
+ <tuscany:binding.comet/>
+ </callback>
+ </service>
+ </component>
+
+</composite> \ No newline at end of file
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/weather-webapp/src/main/webapp/WEB-INF/web.xml b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/weather-webapp/src/main/webapp/WEB-INF/web.xml
new file mode 100644
index 0000000000..25b06c457a
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/weather-webapp/src/main/webapp/WEB-INF/web.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:j2ee="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_3.0.xsd" version="3.0">
+ <display-name>Apache Tuscany Stock Comet Sample</display-name>
+ <filter>
+ <filter-name>tuscany</filter-name>
+ <filter-class>org.apache.tuscany.sca.host.webapp.TuscanyServletFilter</filter-class>
+ <async-supported>true</async-supported>
+ </filter>
+ <filter-mapping>
+ <filter-name>tuscany</filter-name>
+ <url-pattern>/*</url-pattern>
+ </filter-mapping>
+ <welcome-file-list>
+ <welcome-file>index.html</welcome-file>
+ </welcome-file-list>
+</web-app> \ No newline at end of file
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/weather-webapp/src/main/webapp/index.html b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/weather-webapp/src/main/webapp/index.html
new file mode 100644
index 0000000000..6c3cf7ab5c
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/weather-webapp/src/main/webapp/index.html
@@ -0,0 +1,159 @@
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<html>
+ <head>
+ <title>Apache Tuscany Comet Sample</title>
+ <!-- Tuscany Comet Javascript Toolkit is dependent on jQuery -->
+ <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js" type="text/javascript"></script>
+ <script type="text/javascript" src="tuscany-comet-js/org.apache.tuscany.sca.CometComponentContext.js"></script>
+ <script type="text/javascript">
+ $(document).ready(function()
+ {
+ // Initialization
+ var location = new Object();
+ location.city = null;
+ location.country = null;
+
+ $('#locationButton').attr('disabled', 'disabled');
+ $('#tempCButton').attr('disabled', 'disabled');
+ $('#tempFButton').attr('disabled', 'disabled');
+ $('#humButton').attr('disabled', 'disabled');
+ $('#precipButton').attr('disabled', 'disabled');
+
+ $('#locationButton').click(function(event) {
+ location.city = $('#city').val();
+ location.country = $('#country').val();
+ $('#locationButton').val('Switch location');
+ $('#tempCButton').removeAttr('disabled');
+ $('#tempFButton').removeAttr('disabled');
+ $('#humButton').removeAttr('disabled');
+ $('#precipButton').removeAttr('disabled');
+ $('#tempCText').text('N/A');
+ $('#tempCDate').text('');
+ $('#tempFText').text('N/A');
+ $('#tempFDate').text('');
+ $('#humText').text('N/A');
+ $('#humDate').text('');
+ $('#precipText').text('N/A');
+ $('#precipDate').textContent('');
+ });
+
+ // Tuscany Comet specific API
+ $('#connect').click(function(event) {
+ /* transport can be : long-polling or streaming */
+ SCA.TuscanyComet.connect($('#transport').val());
+ $('#connect').val('Switch');
+ $('#locationButton').removeAttr('disabled');
+ });
+
+
+ $('#tempCButton').click(function(event) {
+ SCA.CometComponentContext.TemperatureService.getTemperature(location, 1, updateTempC);
+ $('#tempCButton').removeAttr('disabled');
+ });
+
+ $('#tempFButton').click(function(event) {
+ SCA.CometComponentContext.TemperatureService.getTemperature(location, 2, updateTempF);
+ $('#tempFButton').removeAttr('disabled');
+ });
+
+ $('#humButton').click(function(event) {
+ SCA.CometComponentContext.HumidityService.getHumidity(location, updateHum);
+ $('#humButton').removeAttr('disabled');
+ });
+
+ $('#precipButton').click(function(event) {
+ SCA.CometComponentContext.PrecipitationService.getPrecipitation(location, updatePrecip);
+ $('#precipButton').removeAttr('disabled');
+ });
+ });
+
+ function updateTempC(response) {
+ $('#tempCText').text(response.data);
+ $('#tempCDate').text(response.date);
+ }
+
+ function updateTempF(response) {
+ $('#tempFText').text(response.data);
+ $('#tempFDate').text(response.date);
+ }
+
+ function updateHum(response) {
+ $('#humText').text(response.data);
+ $('#humDate').text(response.date);
+ }
+
+ function updatePrecip(response) {
+ $('#precipText').text(response.data);
+ $('#precipDate').text(response.date);
+ }
+ </script>
+ </head>
+ <body>
+ <div id='sidebar'>
+ <h2>Apache Tuscany Comet Sample</h2>
+ <label>Select transport</label>
+ <select id="transport">
+ <option id="streaming" value="streaming">http streaming</option>
+ <option id="long-polling" value="long-polling">long-polling</option>
+ </select>
+ <input id='connect' type='submit' value='Connect'/>
+ <h3>Weather Monitor</h3>
+ <p/>
+ <table>
+ <tr>
+ <td>City</td>
+ <td><input type="text" id='city' value='Brasov'/></td>
+ </tr>
+ <tr>
+ <td>Country</td>
+ <td><input type="text" id ='country' value='Romania'/></td>
+ </tr>
+ </table>
+ <input type="button" id='locationButton' value='Set location'/>
+ <p/>
+ <table>
+ <tr>
+ <th align="left">Temperature (Celsius):</th>
+ <td><span id='tempCText'>N/A</span></td>
+ <td><input type='button' id='tempCButton' value="Update"/></td>
+ <td><span id='tempCDate'></span>
+ </tr>
+ <tr>
+ <th align="left">Temperature (Fahrenheit):</th>
+ <td><span id='tempFText'>N/A</span></td>
+ <td><input type='button' id='tempFButton' value="Update"/></td>
+ <td><span id='tempFDate'></span>
+ </tr>
+ <tr>
+ <th align="left">Humidity:</th>
+ <td><span id='humText'>N/A</span></td>
+ <td><input type='button' id='humButton' value="Update"/></td>
+ <td><span id='humDate'></span>
+ </tr>
+ <tr>
+ <th align="left">Precipitation probability:</th>
+ <td><span id='precipText'>N/A</span></td>
+ <td><input type='button' id='precipButton' value="Update"/></td>
+ <td><span id='precipDate'></span>
+ </tr>
+ </table>
+ </div>
+ </body>
+</html>
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/autocomplete-webapp/README b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/autocomplete-webapp/README
new file mode 100644
index 0000000000..a0b90cdf2f
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/autocomplete-webapp/README
@@ -0,0 +1,67 @@
+Tuscany - Learning More - Binding Websocket - Autocomplete Webapp
+-----------------------------------------------------------------
+
+This sample demonstrates how Tuscany can expose services via websockets as well
+as how to interact with them using Tuscany's javascript API.
+
+This project contains a service (CountryService) that handles requests asking
+for country names starting with a certain prefix. The service implementation
+uses a country repository to fetch the necessary data.
+
+By adding <tuscany:binding.websocket port="8090"/> to a service definition, the
+Tuscany runtime will start a websocket server listening for requests coming
+in for the exposed service at the specified port. If no port is specified, the
+runtime will use port 9000 as a default.
+
+The websocket binding uses embedded Jetty instances as websocket servers. At the
+moment, Jetty 8.0.0-M3 is used which has support for the 00, 01, 06 and 07
+versions of the websocket protocol drafts.
+
+IN ORDER TO RUN THIS SAMPLE SUCCESSFULLY PLEASE CHECK IF YOUR BROWSER SUPPORTS
+THE ABOVE WEBSOCKET PROTOCOL VERSIONS AND THAT THE WEBSOCKET SUPPORT IS ENABLED.
+
+The websocket binding also features a javascript API to simulate SCA in the
+browser. In order to use it, the following script has to be included in the
+client page:
+ <script type="text/javascript"
+ src="org.apache.tuscany.sca.WebsocketComponentContext.js">
+ </script>
+
+This will inject proxies for all services defined in the composite that are
+using binding.websocket. All invocation and connection management is handled
+under the hood so in order to invoke a websocket service, the following should
+be called:
+ Tuscany.WebsocketComponentContext.<component name>.<service name>.<operation name>(<parameters>);
+
+Given the asynchornous nature of websockets, a function should be defined in
+order to handle responses received for a certain service operation. This should
+be done as follows:
+ Tuscany.WebsocketComponentContext.<component name>.<service name>.<operation name>.responseHandler = function(response) {
+ // handle response
+ };
+
+Note that the data exchange is automatically handled by the binding, so the
+parameters should have the same structure as the data types defined in the method
+definition. Also, the response will have the same data type as the return type of
+the service method. Objects are passed over the wire in JSON format.
+
+Another detail worth mentioning is that the binding will use a single websocket
+connection to handle communication between a browser client and all services
+defined using binding.websocket on the same port. Requests and responses will get
+multiplexed via the same channel and get routed to the appropriate service
+implementation, respectively javascript function.
+
+In order to run the sample, you can execute "mvn jetty:run" which will start a Jetty
+instance automatically or use "mvn package" and deploy the resulting war to the
+application server of your choice.
+
+Next, point your browser at
+ http://localhost:8080/sample-binding-websocket-autocomplete-webapp/
+
+You can see how suggestions are being received in real time when characters are
+entered in the text field. You can see the persistent websocket connection using
+the developer tools provided by your browser.
+
+The websocket binding is an experimental binding so community feedback is much
+appreciated. Feel free to send comments or suggestions on the Apache Tuscany
+dev mailing list (dev@tuscany.apache.org). \ No newline at end of file
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/autocomplete-webapp/pom.xml b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/autocomplete-webapp/pom.xml
new file mode 100644
index 0000000000..42356da09d
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/autocomplete-webapp/pom.xml
@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>org.apache.tuscany.sca.samples</groupId>
+ <artifactId>tuscany-samples-binding-websocket</artifactId>
+ <version>2.0-Beta3-SNAPSHOT</version>
+ <relativePath>../pom.xml</relativePath>
+ </parent>
+
+ <artifactId>sample-binding-websocket-autocomplete-webapp</artifactId>
+ <packaging>war</packaging>
+ <version>2.0-Beta3-SNAPSHOT</version>
+ <name>Apache Tuscany SCA Sample binding.websocket Autocomplete Webapp</name>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.tuscany.sca</groupId>
+ <artifactId>tuscany-binding-websocket</artifactId>
+ <version>2.0-Beta3-SNAPSHOT</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.tuscany.sca</groupId>
+ <artifactId>tuscany-base-runtime-pom</artifactId>
+ <version>2.0-Beta3-SNAPSHOT</version>
+ <type>pom</type>
+ <scope>compile</scope>
+ </dependency>
+ </dependencies>
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.mortbay.jetty</groupId>
+ <artifactId>maven-jetty-plugin</artifactId>
+ <version>6.1.26</version>
+ </plugin>
+ </plugins>
+ </build>
+
+</project>
+
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/autocomplete-webapp/src/main/java/sample/Country.java b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/autocomplete-webapp/src/main/java/sample/Country.java
new file mode 100644
index 0000000000..931e205dd7
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/autocomplete-webapp/src/main/java/sample/Country.java
@@ -0,0 +1,40 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package sample;
+
+import java.io.Serializable;
+
+public class Country implements Serializable {
+
+ private String name;
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ @Override
+ public String toString() {
+ return name;
+ }
+
+}
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/autocomplete-webapp/src/main/java/sample/CountryRepository.java b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/autocomplete-webapp/src/main/java/sample/CountryRepository.java
new file mode 100644
index 0000000000..eb30e6f36a
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/autocomplete-webapp/src/main/java/sample/CountryRepository.java
@@ -0,0 +1,30 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package sample;
+
+import java.util.List;
+
+import org.oasisopen.sca.annotation.Remotable;
+
+@Remotable
+public interface CountryRepository {
+
+ List<Country> findStartingWith(String text);
+
+}
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/autocomplete-webapp/src/main/java/sample/CountryRepositoryImpl.java b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/autocomplete-webapp/src/main/java/sample/CountryRepositoryImpl.java
new file mode 100644
index 0000000000..17ce39a10e
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/autocomplete-webapp/src/main/java/sample/CountryRepositoryImpl.java
@@ -0,0 +1,80 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package sample;
+
+import java.io.BufferedReader;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.oasisopen.sca.annotation.Constructor;
+import org.oasisopen.sca.annotation.EagerInit;
+import org.oasisopen.sca.annotation.Init;
+import org.oasisopen.sca.annotation.Property;
+import org.oasisopen.sca.annotation.Scope;
+import org.oasisopen.sca.annotation.Service;
+
+@EagerInit
+@Scope("COMPOSITE")
+@Service(CountryRepository.class)
+public class CountryRepositoryImpl implements CountryRepository {
+
+ private String fileName;
+ private List<Country> countries;
+
+ @Constructor
+ public CountryRepositoryImpl(@Property(name = "fileName") String fileName) {
+ this.fileName = fileName;
+ countries = new ArrayList<Country>();
+ }
+
+ @Init
+ public void start() {
+ try {
+ BufferedReader reader = new BufferedReader(new InputStreamReader(getClass().getClassLoader()
+ .getResourceAsStream(fileName)));
+ String line;
+ while ((line = reader.readLine()) != null) {
+ if (!line.startsWith("#")) {
+ Country c = new Country();
+ c.setName(line);
+ countries.add(c);
+ }
+ }
+ } catch (FileNotFoundException e) {
+ e.printStackTrace();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ @Override
+ public List<Country> findStartingWith(String text) {
+ List<Country> result = new ArrayList<Country>();
+ for (Country c : countries) {
+ if (c.getName().toLowerCase().startsWith(text.toLowerCase())) {
+ result.add(c);
+ }
+ }
+ return result;
+ }
+
+}
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/autocomplete-webapp/src/main/java/sample/CountryService.java b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/autocomplete-webapp/src/main/java/sample/CountryService.java
new file mode 100644
index 0000000000..40212d5ba5
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/autocomplete-webapp/src/main/java/sample/CountryService.java
@@ -0,0 +1,30 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package sample;
+
+import java.util.List;
+
+import org.oasisopen.sca.annotation.Remotable;
+
+@Remotable
+public interface CountryService {
+
+ List<Country> getCountriesStartingWith(String text);
+
+}
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/autocomplete-webapp/src/main/java/sample/CountryServiceImpl.java b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/autocomplete-webapp/src/main/java/sample/CountryServiceImpl.java
new file mode 100644
index 0000000000..20ceacd5f0
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/autocomplete-webapp/src/main/java/sample/CountryServiceImpl.java
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package sample;
+
+import java.util.List;
+
+import org.oasisopen.sca.annotation.Reference;
+import org.oasisopen.sca.annotation.Service;
+
+@Service(CountryService.class)
+public class CountryServiceImpl implements CountryService {
+
+ @Reference
+ protected CountryRepository repository;
+
+ @Override
+ public List<Country> getCountriesStartingWith(String text) {
+ return repository.findStartingWith(text);
+ }
+}
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/autocomplete-webapp/src/main/resources/countries.txt b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/autocomplete-webapp/src/main/resources/countries.txt
new file mode 100644
index 0000000000..0ce76f8167
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/autocomplete-webapp/src/main/resources/countries.txt
@@ -0,0 +1,211 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+Afghanistan
+Albania
+Algeria
+Andorra
+Angola
+Antigua & Barbuda
+Argentina
+Armenia
+Australia
+Austria
+Azerbaijan
+Bahamas
+Bahrain
+Bangladesh
+Barbados
+Belarus
+Belgium
+Belize
+Benin
+Bhutan
+Bolivia
+Bosnia & Herzegovina
+Botswana
+Brazil
+Brunei
+Bulgaria
+Burkina Faso
+Burundi
+Cambodia
+Cameroon
+Canada
+Cape Verde
+Central African Republic
+Chad
+Chile
+China
+Colombia
+Comoros
+Congo
+Congo Democratic Republic of
+Costa Rica
+Cote d'Ivoire
+Croatia
+Cuba
+Cyprus
+Czech Republic
+Denmark
+Djibouti
+Dominica
+Dominican Republic
+Ecuador
+East Timor
+Egypt
+El Salvador
+Equatorial Guinea
+Eritrea
+Estonia
+Ethiopia
+Fiji
+Finland
+France
+Gabon
+Gambia
+Georgia
+Germany
+Ghana
+Greece
+Grenada
+Guatemala
+Guinea
+Guinea-Bissau
+Guyana
+Haiti
+Honduras
+Hungary
+Iceland
+India
+Indonesia
+Iran
+Iraq
+Ireland
+Israel
+Italy
+Jamaica
+Japan
+Jordan
+Kazakhstan
+Kenya
+Kiribati
+Korea North
+Korea South
+Kosovo
+Kuwait
+Kyrgyzstan
+Laos
+Latvia
+Lebanon
+Lesotho
+Liberia
+Libya
+Liechtenstein
+Lithuania
+Luxembourg
+Macedonia
+Madagascar
+Malawi
+Malaysia
+Maldives
+Mali
+Malta
+Marshall Islands
+Mauritania
+Mauritius
+Mexico
+Micronesia
+Moldova
+Monaco
+Mongolia
+Montenegro
+Morocco
+Mozambique
+Myanmar (Burma)
+Namibia
+Nauru
+Nepal
+The Netherlands
+New Zealand
+Nicaragua
+Niger
+Nigeria
+Norway
+Oman
+Pakistan
+Palau
+Palestinian State*
+Panama
+Papua New Guinea
+Paraguay
+Peru
+The Philippines
+Poland
+Portugal
+Qatar
+Romania
+Russia
+Rwanda
+St. Kitts & Nevis
+St. Lucia
+St. Vincent & The Grenadines
+Samoa
+San Marino
+Sao Tome & Principe
+Saudi Arabia
+Senegal
+Serbia
+Seychelles
+Sierra Leone
+Singapore
+Slovakia
+Slovenia
+Solomon Islands
+Somalia
+South Africa
+Spain
+Sri Lanka
+Sudan
+Suriname
+Swaziland
+Sweden
+Switzerland
+Syria
+Taiwan
+Tajikistan
+Tanzania
+Thailand
+Togo
+Tonga
+Trinidad & Tobago
+Tunisia
+Turkey
+Turkmenistan
+Tuvalu
+Uganda
+Ukraine
+United Arab Emirates
+United Kingdom
+United States of America
+Uruguay
+Uzbekistan
+Vanuatu
+Vatican City (Holy See)
+Venezuela
+Yemen
+Zambia
+Zimbabwe
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/autocomplete-webapp/src/main/webapp/META-INF/MANIFEST.MF b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/autocomplete-webapp/src/main/webapp/META-INF/MANIFEST.MF
new file mode 100644
index 0000000000..58630c02ef
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/autocomplete-webapp/src/main/webapp/META-INF/MANIFEST.MF
@@ -0,0 +1,2 @@
+Manifest-Version: 1.0
+
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/autocomplete-webapp/src/main/webapp/WEB-INF/web.composite b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/autocomplete-webapp/src/main/webapp/WEB-INF/web.composite
new file mode 100644
index 0000000000..fc1c177e9b
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/autocomplete-webapp/src/main/webapp/WEB-INF/web.composite
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<composite xmlns="http://docs.oasis-open.org/ns/opencsa/sca/200912"
+ xmlns:tuscany="http://tuscany.apache.org/xmlns/sca/1.1"
+ xmlns:sca="http://docs.oasis-open.org/ns/opencsa/sca/200912"
+ targetNamespace="http://samples" name="Chat">
+
+ <component name="CountryServiceComponent">
+ <implementation.java
+ class="sample.CountryServiceImpl" />
+ <service name="CountryService">
+ <interface.java interface="sample.CountryService" />
+ <tuscany:binding.websocket port="8090" />
+ </service>
+ <reference name="repository" target="CountryRepositoryComponent" />
+ </component>
+
+ <component name="CountryRepositoryComponent">
+ <implementation.java class="sample.CountryRepositoryImpl" />
+ <property name="fileName">countries.txt</property>
+ </component>
+
+</composite> \ No newline at end of file
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/autocomplete-webapp/src/main/webapp/WEB-INF/web.xml b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/autocomplete-webapp/src/main/webapp/WEB-INF/web.xml
new file mode 100644
index 0000000000..25b06c457a
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/autocomplete-webapp/src/main/webapp/WEB-INF/web.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:j2ee="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_3.0.xsd" version="3.0">
+ <display-name>Apache Tuscany Stock Comet Sample</display-name>
+ <filter>
+ <filter-name>tuscany</filter-name>
+ <filter-class>org.apache.tuscany.sca.host.webapp.TuscanyServletFilter</filter-class>
+ <async-supported>true</async-supported>
+ </filter>
+ <filter-mapping>
+ <filter-name>tuscany</filter-name>
+ <url-pattern>/*</url-pattern>
+ </filter-mapping>
+ <welcome-file-list>
+ <welcome-file>index.html</welcome-file>
+ </welcome-file-list>
+</web-app> \ No newline at end of file
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/autocomplete-webapp/src/main/webapp/index.html b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/autocomplete-webapp/src/main/webapp/index.html
new file mode 100644
index 0000000000..618c772eb6
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/autocomplete-webapp/src/main/webapp/index.html
@@ -0,0 +1,64 @@
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<html>
+ <head>
+ <title>Apache Tuscany Websocket Sample</title>
+ <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js" type="text/javascript"></script>
+ <script type="text/javascript" src="org.apache.tuscany.sca.WebsocketComponentContext.js"></script>
+ <script type="text/javascript">
+ var user = "";
+
+ Tuscany.WebsocketComponentContext.CountryServiceComponent.CountryService.getCountriesStartingWith.responseHandler = function(response) {
+ var html = '<ul>';
+ $.each(response, function(index, country) {
+ html += '<li>' + country.name + "</li>"
+ });
+ html += '</ul>'
+ $("#suggestions").html(html);
+ }
+
+ $(document).ready(function()
+ {
+ $("#country").keyup(function() {
+ var text = $("#country").val();
+ if (text != "") {
+ Tuscany.WebsocketComponentContext.CountryServiceComponent.CountryService.getCountriesStartingWith(text);
+ } else {
+ $("#suggestions").html("");
+ }
+ });
+ $("#country").focus();
+ });
+
+ </script>
+ </head>
+ <body>
+ <h2>Apache Tuscany Websocket Sample</h2>
+ <h3>Real-time suggestions</h3>
+ <table>
+ <tr>
+ <td>Enter a country name</td>
+ <td><input type="text" id='country'/></td>
+ </tr>
+ </table>
+ </div>
+ <div id="suggestions">
+ </div>
+ </body>
+</html>
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/chat-webapp/README b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/chat-webapp/README
new file mode 100644
index 0000000000..5a9381f980
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/chat-webapp/README
@@ -0,0 +1,88 @@
+Tuscany - Learning More - Binding Websocket - Chat Webapp
+-----------------------------------------------------------------
+
+This sample demonstrates how Tuscany can expose services via websockets as well
+as how to interact with them using Tuscany's javascript API. It also demonstrates
+how to push multiple responses from the server to the client for a single request
+using SCA callbacks.
+
+This project contains a service (ChatService) that handles chat operations like
+register and postMessage. Once a client is registered it will receive messages
+that are sent to the chat room.
+
+By adding <tuscany:binding.websocket port="8090"/> to a service definition, the
+Tuscany runtime will start a websocket server listening for requests coming
+in for the exposed service at the specified port. If no port is specified, the
+runtime will use port 9000 as a default.
+
+The websocket binding uses embedded Jetty instances as websocket servers. At the
+moment, Jetty 8.0.0-M3 is used which has support for the 00, 01, 06 and 07
+versions of the websocket protocol drafts.
+
+IN ORDER TO RUN THIS SAMPLE SUCCESSFULLY PLEASE CHECK IF YOUR BROWSER SUPPORTS
+THE ABOVE WEBSOCKET PROTOCOL VERSIONS AND THAT THE WEBSOCKET SUPPORT IS ENABLED.
+
+In order to enable callbacks to push multiple responses, you need to declare the
+WebsocketBindingCallback in the service definition as follows:
+
+ <interface.java interface="sample.ChatService"
+ callbackInterface="org.apache.tuscany.sca.binding.websocket.runtime.WebsocketBindingCallback" />
+ <tuscany:binding.websocket />
+ <callback>
+ <tuscany:binding.websocket />
+ </callback>
+
+The callback object has methods that facilitate sending messages back to the
+calling client. It can be injected in the service implementation using the @Callback
+annotation. However, the service implementation for this sample has the COMPOSITE
+scope so the callback reference has to be obtained from the ComponentContext.
+
+One requirement that service methods have to meet to enable multiple response
+support is that they have to be annotated with @OneWay to enable non-blocking
+support. Without it, methods are treated synchronously sending a single response
+which is the object returned by the method call.
+
+The websocket binding also features a javascript API to simulate SCA in the
+browser. In order to use it, the following script has to be included in the
+client page:
+ <script type="text/javascript"
+ src="org.apache.tuscany.sca.WebsocketComponentContext.js">
+ </script>
+
+This will inject proxies for all services defined in the composite that are
+using binding.websocket. All invocation and connection management is handled
+under the hood so in order to invoke a websocket service, the following should
+be called:
+ Tuscany.WebsocketComponentContext.<component name>.<service name>.<operation name>(<parameters>);
+
+Given the asynchornous nature of websockets, a function should be defined in
+order to handle responses received for a certain service operation. This should
+be done as follows:
+ Tuscany.WebsocketComponentContext.<component name>.<service name>.<operation name>.responseHandler = function(response) {
+ // handle response
+ };
+
+Note that the data exchange is automatically handled by the binding, so parameters
+will be mapped to the data types defined in the method definition. Also, the response
+will have the same data type as the server side object used to wrap the response.
+Objects are passed over the wire in JSON format.
+
+Another detail worth mentioning is that the binding will use a single persistent
+websocket connection to handle communication between a browser client and all services
+defined using binding.websocket on the same port. Requests and responses will get
+multiplexed via the same channel and get routed to the appropriate service
+implementation, respectively javascript function.
+
+In order to run the sample, you can execute "mvn jetty:run" which will start a Jetty
+instance automatically or use "mvn package" and deploy the resulting war to the
+application server of your choice.
+
+Next, point your browser at
+ http://localhost:8080/sample-binding-websocket-chat-webapp/
+
+You can now chat using multiple tabs or browsers. You can see the persistent websocket
+connection using the developer tools provided by your browser.
+
+The websocket binding is an experimental binding so community feedback is much
+appreciated. Feel free to send comments or suggestions on the Apache Tuscany
+dev mailing list (dev@tuscany.apache.org). \ No newline at end of file
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/chat-webapp/pom.xml b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/chat-webapp/pom.xml
new file mode 100644
index 0000000000..04dee5ac19
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/chat-webapp/pom.xml
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>org.apache.tuscany.sca.samples</groupId>
+ <artifactId>tuscany-samples-binding-websocket</artifactId>
+ <version>2.0-Beta3-SNAPSHOT</version>
+ <relativePath>../pom.xml</relativePath>
+ </parent>
+
+ <artifactId>sample-binding-websocket-chat-webapp</artifactId>
+ <packaging>war</packaging>
+ <version>2.0-Beta3-SNAPSHOT</version>
+ <name>Apache Tuscany SCA Sample binding.websocket Chat Webapp</name>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.tuscany.sca</groupId>
+ <artifactId>tuscany-binding-websocket</artifactId>
+ <version>2.0-Beta3-SNAPSHOT</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.tuscany.sca</groupId>
+ <artifactId>tuscany-base-runtime-pom</artifactId>
+ <version>2.0-Beta3-SNAPSHOT</version>
+ <type>pom</type>
+ <scope>compile</scope>
+ </dependency>
+ <dependency>
+ <groupId>com.google.guava</groupId>
+ <artifactId>guava</artifactId>
+ <version>r09</version>
+ <type>jar</type>
+ <scope>compile</scope>
+ </dependency>
+ </dependencies>
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.mortbay.jetty</groupId>
+ <artifactId>maven-jetty-plugin</artifactId>
+ <version>6.1.26</version>
+ </plugin>
+ </plugins>
+ </build>
+
+</project>
+
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/chat-webapp/src/main/java/sample/ChatService.java b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/chat-webapp/src/main/java/sample/ChatService.java
new file mode 100644
index 0000000000..7ec6a547a9
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/chat-webapp/src/main/java/sample/ChatService.java
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package sample;
+
+import org.apache.tuscany.sca.binding.websocket.runtime.WebsocketBindingCallback;
+import org.oasisopen.sca.annotation.Callback;
+import org.oasisopen.sca.annotation.OneWay;
+import org.oasisopen.sca.annotation.Remotable;
+
+@Callback(WebsocketBindingCallback.class)
+@Remotable
+public interface ChatService {
+
+ @OneWay
+ void register();
+
+ @OneWay
+ void postMessage(String user, String message);
+
+}
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/chat-webapp/src/main/java/sample/ChatServiceImpl.java b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/chat-webapp/src/main/java/sample/ChatServiceImpl.java
new file mode 100644
index 0000000000..6fd4455ba9
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/chat-webapp/src/main/java/sample/ChatServiceImpl.java
@@ -0,0 +1,58 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package sample;
+
+import java.util.ArrayList;
+import java.util.concurrent.CopyOnWriteArrayList;
+
+import org.apache.tuscany.sca.binding.websocket.runtime.WebsocketBindingCallback;
+import org.apache.tuscany.sca.binding.websocket.runtime.WebsocketStatus;
+import org.oasisopen.sca.ComponentContext;
+import org.oasisopen.sca.annotation.Context;
+import org.oasisopen.sca.annotation.Scope;
+import org.oasisopen.sca.annotation.Service;
+
+@Service(ChatService.class)
+@Scope("COMPOSITE")
+public class ChatServiceImpl implements ChatService {
+
+ @Context
+ protected ComponentContext context;
+
+ private CopyOnWriteArrayList<WebsocketBindingCallback> clients = new CopyOnWriteArrayList<WebsocketBindingCallback>();
+
+ @Override
+ public void postMessage(String user, String message) {
+ for (WebsocketBindingCallback callback : new ArrayList<WebsocketBindingCallback>(clients)) {
+ WebsocketStatus status = callback.sendMessage(user + ": " + message);
+ if (status == WebsocketStatus.CLOSED) {
+ clients.remove(callback);
+ }
+ }
+ }
+
+ @Override
+ public void register() {
+ // saving the callback object during register() method so it will push
+ // data back to the client
+ // using the callback method defined for the register operation in the
+ // js when used
+ clients.add(context.getRequestContext().<WebsocketBindingCallback> getCallback());
+ }
+}
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/chat-webapp/src/main/webapp/META-INF/MANIFEST.MF b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/chat-webapp/src/main/webapp/META-INF/MANIFEST.MF
new file mode 100644
index 0000000000..58630c02ef
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/chat-webapp/src/main/webapp/META-INF/MANIFEST.MF
@@ -0,0 +1,2 @@
+Manifest-Version: 1.0
+
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/chat-webapp/src/main/webapp/WEB-INF/web.composite b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/chat-webapp/src/main/webapp/WEB-INF/web.composite
new file mode 100644
index 0000000000..4e83fee9e8
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/chat-webapp/src/main/webapp/WEB-INF/web.composite
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<composite xmlns="http://docs.oasis-open.org/ns/opencsa/sca/200912"
+ xmlns:tuscany="http://tuscany.apache.org/xmlns/sca/1.1"
+ targetNamespace="http://samples" name="Chat">
+
+ <component name="ChatComponent">
+ <implementation.java
+ class="sample.ChatServiceImpl" />
+ <service name="ChatService">
+ <interface.java interface="sample.ChatService"
+ callbackInterface="org.apache.tuscany.sca.binding.websocket.runtime.WebsocketBindingCallback" />
+ <tuscany:binding.websocket />
+ <callback>
+ <tuscany:binding.websocket />
+ </callback>
+ </service>
+ </component>
+
+</composite> \ No newline at end of file
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/chat-webapp/src/main/webapp/WEB-INF/web.xml b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/chat-webapp/src/main/webapp/WEB-INF/web.xml
new file mode 100644
index 0000000000..25b06c457a
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/chat-webapp/src/main/webapp/WEB-INF/web.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:j2ee="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_3.0.xsd" version="3.0">
+ <display-name>Apache Tuscany Stock Comet Sample</display-name>
+ <filter>
+ <filter-name>tuscany</filter-name>
+ <filter-class>org.apache.tuscany.sca.host.webapp.TuscanyServletFilter</filter-class>
+ <async-supported>true</async-supported>
+ </filter>
+ <filter-mapping>
+ <filter-name>tuscany</filter-name>
+ <url-pattern>/*</url-pattern>
+ </filter-mapping>
+ <welcome-file-list>
+ <welcome-file>index.html</welcome-file>
+ </welcome-file-list>
+</web-app> \ No newline at end of file
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/chat-webapp/src/main/webapp/index.html b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/chat-webapp/src/main/webapp/index.html
new file mode 100644
index 0000000000..2309be8533
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/chat-webapp/src/main/webapp/index.html
@@ -0,0 +1,99 @@
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<html>
+ <head>
+ <title>Apache Tuscany Websocket Sample</title>
+ <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js" type="text/javascript"></script>
+ <script type="text/javascript" src="org.apache.tuscany.sca.WebsocketComponentContext.js"></script>
+ <script type="text/javascript">
+ var user = "";
+
+ $(document).ready(function()
+ {
+ $("#chat").hide();
+ $("#username").focus();
+
+ $("#register").click(function() {
+ register();
+ });
+
+ $("#username").keyup(function(e) {
+ if(e.keyCode == 13) {
+ register();
+ }
+ });
+
+ Tuscany.WebsocketComponentContext.ChatComponent.ChatService.register.responseHandler = function(response) {
+ var textarea = document.getElementById('textarea');
+ textarea.value += response + "\n";
+ textarea.scrollTop = textarea.scrollHeight;
+ }
+
+ function register() {
+ Tuscany.WebsocketComponentContext.ChatComponent.ChatService.register();
+ user = $("#username").val();
+ $("#login").hide();
+ $("#chat").show();
+ $("#message").focus();
+ }
+
+ $("#send").click(function() {
+ postMessage(user, $("#message").val());
+ });
+
+ $("#message").keyup(function(e) {
+ if(e.keyCode == 13) {
+ postMessage(user, $("#message").val());
+ }
+ });
+
+ function postMessage(user, message) {
+ Tuscany.WebsocketComponentContext.ChatComponent.ChatService.postMessage(user, message);
+ $("#message").val("");
+ $("#message").focus();
+ }
+
+ });
+ </script>
+ </head>
+ <body>
+ <h2>Apache Tuscany Comet Sample</h2>
+ <h3>Chat</h3>
+ <p/>
+ <div id="login">
+ <table>
+ <tr>
+ <td>Nickname</td>
+ <td><input type="text" id='username'/></td>
+ <td><input type="button" id='register' value='Login'/></td>
+ </tr>
+ </table>
+ </div>
+ <div id="chat">
+ <h3>Server notifications</h3>
+ <textarea id="textarea" rows="15" cols="30" readonly></textarea>
+ <table>
+ <tr>
+ <td><input type="text" id='message'/></td>
+ <td><input type="button" id='send' value='Send'/></td>
+ </tr>
+ </table>
+ </div>
+ </body>
+</html>
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/pom.xml b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/pom.xml
new file mode 100644
index 0000000000..28f05a4fb9
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/pom.xml
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<project>
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>org.apache.tuscany.sca.samples</groupId>
+ <artifactId>tuscany-samples-learning-more</artifactId>
+ <version>2.0-Beta3-SNAPSHOT</version>
+ <relativePath>../pom.xml</relativePath>
+ </parent>
+
+ <artifactId>tuscany-samples-binding-websocket</artifactId>
+ <packaging>pom</packaging>
+ <name>Apache Tuscany SCA Sample binding.websocket</name>
+
+ <profiles>
+ <profile>
+ <id>default</id>
+ <activation>
+ <activeByDefault>true</activeByDefault>
+ </activation>
+ <modules>
+ <module>autocomplete-webapp</module>
+ <module>weather-webapp</module>
+ <module>chat-webapp</module>
+ <module>pubsub-webapp</module>
+ </modules>
+ </profile>
+ </profiles>
+</project>
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/pubsub-webapp/README b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/pubsub-webapp/README
new file mode 100644
index 0000000000..1ec7d6b807
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/pubsub-webapp/README
@@ -0,0 +1,93 @@
+Tuscany - Learning More - Binding Websocket - PubSub Webapp
+-----------------------------------------------------------------
+
+This sample demonstrates how Tuscany can expose services via websockets as well
+as how to interact with them using Tuscany's javascript API. It also demonstrates
+how to push multiple responses from the server to the client for a single request
+using SCA callbacks.
+
+This project contains a component that registers browser clients' interest in a
+certain event type. When an event of that type comes in, it notifies all registered
+clients. The event processor exposes a service via the websocket binding which
+enables server push to clients. Note that Tuscany 2.x doesn't have any conversational
+support so this has to be handled at application level by passing ids back and forth
+between the client and the server.
+
+By adding <tuscany:binding.websocket port="8090"/> to a service definition, the
+Tuscany runtime will start a websocket server listening for requests coming
+in for the exposed service at the specified port. If no port is specified, the
+runtime will use port 9000 as a default.
+
+The websocket binding uses embedded Jetty instances as websocket servers. At the
+moment, Jetty 8.0.0-M3 is used which has support for the 00, 01, 06 and 07
+versions of the websocket protocol drafts.
+
+IN ORDER TO RUN THIS SAMPLE SUCCESSFULLY PLEASE CHECK IF YOUR BROWSER SUPPORTS
+THE ABOVE WEBSOCKET PROTOCOL VERSIONS AND THAT THE WEBSOCKET SUPPORT IS ENABLED.
+
+In order to enable callbacks to push multiple responses, you need to declare the
+WebsocketBindingCallback in the service definition as follows:
+
+ <interface.java interface="sample.ChatService"
+ callbackInterface="org.apache.tuscany.sca.binding.websocket.runtime.WebsocketBindingCallback" />
+ <tuscany:binding.websocket />
+ <callback>
+ <tuscany:binding.websocket />
+ </callback>
+
+The callback object has methods that facilitate sending messages back to the
+calling client. It can be injected in the service implementation using the @Callback
+annotation. However, the service implementation for this sample has the COMPOSITE
+scope so the callback reference has to be obtained from the ComponentContext.
+
+One requirement that service methods have to meet to enable multiple response
+support is that they have to be annotated with @OneWay to enable non-blocking
+support. Without it, methods are treated synchronously sending a single response
+which is the object returned by the method call.
+
+The websocket binding also features a javascript API to simulate SCA in the
+browser. In order to use it, the following script has to be included in the
+client page:
+ <script type="text/javascript"
+ src="org.apache.tuscany.sca.WebsocketComponentContext.js">
+ </script>
+
+This will inject proxies for all services defined in the composite that are
+using binding.websocket. All invocation and connection management is handled
+under the hood so in order to invoke a websocket service, the following should
+be called:
+ Tuscany.WebsocketComponentContext.<component name>.<service name>.<operation name>(<parameters>);
+
+Given the asynchornous nature of websockets, a function should be defined in
+order to handle responses received for a certain service operation. This should
+be done as follows:
+ Tuscany.WebsocketComponentContext.<component name>.<service name>.<operation name>.responseHandler = function(response) {
+ // handle response
+ };
+
+Note that the data exchange is automatically handled by the binding, so parameters
+will be mapped to the data types defined in the method definition. Also, the response
+will have the same data type as the server side object used to wrap the response.
+Objects are passed over the wire in JSON format.
+
+Another detail worth mentioning is that the binding will use a single persistent
+websocket connection to handle communication between a browser client and all services
+defined using binding.websocket on the same port. Requests and responses will get
+multiplexed via the same channel and get routed to the appropriate service
+implementation, respectively javascript function.
+
+In order to run the sample, you can execute "mvn jetty:run" which will start a Jetty
+instance automatically or use "mvn package" and deploy the resulting war to the
+application server of your choice.
+
+Next, point your browser at
+ http://localhost:8080/sample-binding-websocket-chat-webapp/
+
+You can now register or unregister for any of a number of events. When an event is fired
+on the server side, the browser client will receive a notification which will be displayed
+in the page. You can see the persistent websocket connection using the developer tools
+provided by your browser.
+
+The websocket binding is an experimental binding so community feedback is much
+appreciated. Feel free to send comments or suggestions on the Apache Tuscany
+dev mailing list (dev@tuscany.apache.org). \ No newline at end of file
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/pubsub-webapp/pom.xml b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/pubsub-webapp/pom.xml
new file mode 100644
index 0000000000..3c6c7e0ebd
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/pubsub-webapp/pom.xml
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>org.apache.tuscany.sca.samples</groupId>
+ <artifactId>tuscany-samples-binding-websocket</artifactId>
+ <version>2.0-Beta3-SNAPSHOT</version>
+ <relativePath>../pom.xml</relativePath>
+ </parent>
+
+ <artifactId>sample-binding-websocket-pubsub-webapp</artifactId>
+ <packaging>war</packaging>
+ <version>2.0-Beta3-SNAPSHOT</version>
+ <name>Apache Tuscany SCA Sample binding.websocket PubSub Webapp</name>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.tuscany.sca</groupId>
+ <artifactId>tuscany-binding-websocket</artifactId>
+ <version>2.0-Beta3-SNAPSHOT</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.tuscany.sca</groupId>
+ <artifactId>tuscany-base-runtime-pom</artifactId>
+ <version>2.0-Beta3-SNAPSHOT</version>
+ <type>pom</type>
+ <scope>compile</scope>
+ </dependency>
+ <dependency>
+ <groupId>com.google.guava</groupId>
+ <artifactId>guava</artifactId>
+ <version>r09</version>
+ <type>jar</type>
+ <scope>compile</scope>
+ </dependency>
+ </dependencies>
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.mortbay.jetty</groupId>
+ <artifactId>maven-jetty-plugin</artifactId>
+ <version>6.1.26</version>
+ </plugin>
+ </plugins>
+ </build>
+
+</project>
+
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/pubsub-webapp/src/main/java/sample/Event.java b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/pubsub-webapp/src/main/java/sample/Event.java
new file mode 100644
index 0000000000..c9d9eb54c4
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/pubsub-webapp/src/main/java/sample/Event.java
@@ -0,0 +1,51 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package sample;
+
+public class Event {
+
+ private String id;
+ private String name;
+ private String data;
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getData() {
+ return data;
+ }
+
+ public void setData(String data) {
+ this.data = data;
+ }
+
+}
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/pubsub-webapp/src/main/java/sample/EventProcessor.java b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/pubsub-webapp/src/main/java/sample/EventProcessor.java
new file mode 100644
index 0000000000..d289b361cf
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/pubsub-webapp/src/main/java/sample/EventProcessor.java
@@ -0,0 +1,104 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package sample;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.UUID;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+
+import org.apache.tuscany.sca.binding.websocket.runtime.WebsocketBindingCallback;
+import org.apache.tuscany.sca.binding.websocket.runtime.WebsocketStatus;
+import org.oasisopen.sca.ComponentContext;
+import org.oasisopen.sca.annotation.Context;
+import org.oasisopen.sca.annotation.Destroy;
+import org.oasisopen.sca.annotation.Scope;
+import org.oasisopen.sca.annotation.Service;
+
+import com.google.common.collect.HashMultimap;
+import com.google.common.collect.Multimap;
+import com.google.common.collect.Multimaps;
+
+@Service({ EventProcessorConsumerService.class, EventProcessorProducerService.class })
+@Scope("COMPOSITE")
+public class EventProcessor implements EventProcessorConsumerService, EventProcessorProducerService {
+
+ @Context
+ protected ComponentContext componentContext;
+
+ private ConcurrentMap<String, WebsocketBindingCallback> clients = new ConcurrentHashMap<String, WebsocketBindingCallback>();
+ private Multimap<String, String> eventListeners = Multimaps.synchronizedMultimap(HashMultimap.<String, String> create());
+
+ @Override
+ public void onEvent(String eventName, String eventData) {
+ List<String> destinations = new ArrayList<String>();
+ synchronized (eventListeners) {
+ destinations.addAll(eventListeners.get(eventName));
+ }
+ Event event = new Event();
+ event.setName(eventName);
+ event.setData(eventData);
+ for (String registrationId : destinations) {
+ WebsocketBindingCallback client = clients.get(registrationId);
+ if (client == null) {
+ // client has unregistered from this event
+ synchronized (eventListeners) {
+ eventListeners.remove(eventName, registrationId);
+ }
+ } else {
+ WebsocketStatus status = client.sendMessage(event);
+ if (status == WebsocketStatus.CLOSED) {
+ unregister(registrationId);
+ }
+ }
+ }
+ }
+
+ @Override
+ public void register(String eventName) {
+ String registrationId = UUID.randomUUID().toString();
+ WebsocketBindingCallback callback = componentContext.getRequestContext().getCallback();
+ clients.put(registrationId, callback);
+ synchronized (eventListeners) {
+ eventListeners.put(eventName, registrationId);
+ }
+ Event event = new Event();
+ event.setId(registrationId);
+ event.setName(eventName);
+ event.setData(new Date().toString());
+ callback.sendMessage(event);
+ }
+
+ @Override
+ public void unregister(String registrationId) {
+ clients.remove(registrationId);
+ // unregistration from eventListeners done during onEvent
+ }
+
+ @Destroy
+ public void shutdown() {
+ clients.clear();
+ eventListeners.clear();
+ clients = null;
+ eventListeners = null;
+ }
+}
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/pubsub-webapp/src/main/java/sample/EventProcessorConsumerService.java b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/pubsub-webapp/src/main/java/sample/EventProcessorConsumerService.java
new file mode 100644
index 0000000000..aa9156b088
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/pubsub-webapp/src/main/java/sample/EventProcessorConsumerService.java
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package sample;
+
+import org.apache.tuscany.sca.binding.websocket.runtime.WebsocketBindingCallback;
+import org.oasisopen.sca.annotation.Callback;
+import org.oasisopen.sca.annotation.OneWay;
+import org.oasisopen.sca.annotation.Remotable;
+
+@Callback(WebsocketBindingCallback.class)
+@Remotable
+public interface EventProcessorConsumerService {
+
+ @OneWay
+ void register(String eventName);
+
+ @OneWay
+ void unregister(String registrationId);
+
+}
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/pubsub-webapp/src/main/java/sample/EventProcessorProducerService.java b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/pubsub-webapp/src/main/java/sample/EventProcessorProducerService.java
new file mode 100644
index 0000000000..a9c80cc697
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/pubsub-webapp/src/main/java/sample/EventProcessorProducerService.java
@@ -0,0 +1,28 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package sample;
+
+import org.oasisopen.sca.annotation.Remotable;
+
+@Remotable
+public interface EventProcessorProducerService {
+
+ void onEvent(String eventName, String eventData);
+
+}
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/pubsub-webapp/src/main/java/sample/Producer.java b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/pubsub-webapp/src/main/java/sample/Producer.java
new file mode 100644
index 0000000000..88a214d843
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/pubsub-webapp/src/main/java/sample/Producer.java
@@ -0,0 +1,75 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package sample;
+
+import java.util.Date;
+import java.util.Timer;
+import java.util.TimerTask;
+
+import org.oasisopen.sca.annotation.Constructor;
+import org.oasisopen.sca.annotation.Destroy;
+import org.oasisopen.sca.annotation.EagerInit;
+import org.oasisopen.sca.annotation.Init;
+import org.oasisopen.sca.annotation.Property;
+import org.oasisopen.sca.annotation.Reference;
+import org.oasisopen.sca.annotation.Scope;
+
+@EagerInit
+@Scope("COMPOSITE")
+public class Producer {
+
+ @Reference
+ protected EventProcessorProducerService eventProcessor;
+
+ private String eventName;
+ private long frequency;
+
+ private Timer timer = new Timer();
+ private Object lock = new Object();
+
+ @Constructor
+ public Producer(@Property(name = "eventName") String eventName, @Property(name = "frequency") long frequency) {
+ System.out.println("Producer: In Constructor with eventName=" + eventName + " and frequency=" + frequency);
+ this.eventName = eventName;
+ this.frequency = frequency;
+ }
+
+ @Init
+ public void start() {
+ System.out.println("Producer: In Init...");
+ timer.schedule(new TimerTask() {
+
+ @Override
+ public void run() {
+ synchronized (lock) {
+ eventProcessor.onEvent(Producer.this.eventName, "Event @ " + new Date());
+ }
+ }
+ }, 0L, this.frequency);
+ }
+
+ @Destroy
+ public void stop() {
+ synchronized (lock) {
+ timer.cancel();
+ }
+ timer = null;
+ }
+
+}
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/pubsub-webapp/src/main/webapp/META-INF/MANIFEST.MF b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/pubsub-webapp/src/main/webapp/META-INF/MANIFEST.MF
new file mode 100644
index 0000000000..58630c02ef
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/pubsub-webapp/src/main/webapp/META-INF/MANIFEST.MF
@@ -0,0 +1,2 @@
+Manifest-Version: 1.0
+
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/pubsub-webapp/src/main/webapp/WEB-INF/web.composite b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/pubsub-webapp/src/main/webapp/WEB-INF/web.composite
new file mode 100644
index 0000000000..743e2b418e
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/pubsub-webapp/src/main/webapp/WEB-INF/web.composite
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<composite xmlns="http://docs.oasis-open.org/ns/opencsa/sca/200912"
+ xmlns:tuscany="http://tuscany.apache.org/xmlns/sca/1.1"
+ targetNamespace="http://samples" name="Event">
+
+ <component name="EventProcessorComponent">
+ <implementation.java class="sample.EventProcessor" />
+ <service name="EventProcessorConsumerService">
+ <interface.java interface="sample.EventProcessorConsumerService"
+ callbackInterface="org.apache.tuscany.sca.binding.websocket.runtime.WebsocketBindingCallback" />
+ <tuscany:binding.websocket />
+ <callback>
+ <tuscany:binding.websocket />
+ </callback>
+ </service>
+ <service name="EventProcessorProducerService">
+ <interface.java interface="sample.EventProcessorProducerService" />
+ </service>
+ </component>
+
+ <component name="SLOWProducerComponent">
+ <implementation.java class="sample.Producer" />
+ <reference name="eventProcessor" target="EventProcessorComponent" />
+ <property name="eventName">SLOW</property>
+ <property name="frequency">6000</property>
+ </component>
+
+ <component name="MODERATEProducerComponent">
+ <implementation.java class="sample.Producer" />
+ <reference name="eventProcessor" target="EventProcessorComponent" />
+ <property name="eventName">MODERATE</property>
+ <property name="frequency">3000</property>
+ </component>
+
+ <component name="FASTProducerComponent">
+ <implementation.java class="sample.Producer" />
+ <reference name="eventProcessor" target="EventProcessorComponent" />
+ <property name="eventName">FAST</property>
+ <property name="frequency">1000</property>
+ </component>
+
+</composite> \ No newline at end of file
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/pubsub-webapp/src/main/webapp/WEB-INF/web.xml b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/pubsub-webapp/src/main/webapp/WEB-INF/web.xml
new file mode 100644
index 0000000000..25b06c457a
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/pubsub-webapp/src/main/webapp/WEB-INF/web.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:j2ee="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_3.0.xsd" version="3.0">
+ <display-name>Apache Tuscany Stock Comet Sample</display-name>
+ <filter>
+ <filter-name>tuscany</filter-name>
+ <filter-class>org.apache.tuscany.sca.host.webapp.TuscanyServletFilter</filter-class>
+ <async-supported>true</async-supported>
+ </filter>
+ <filter-mapping>
+ <filter-name>tuscany</filter-name>
+ <url-pattern>/*</url-pattern>
+ </filter-mapping>
+ <welcome-file-list>
+ <welcome-file>index.html</welcome-file>
+ </welcome-file-list>
+</web-app> \ No newline at end of file
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/pubsub-webapp/src/main/webapp/index.html b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/pubsub-webapp/src/main/webapp/index.html
new file mode 100644
index 0000000000..bfacf28236
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/pubsub-webapp/src/main/webapp/index.html
@@ -0,0 +1,96 @@
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<html>
+<head>
+ <title>Apache Tuscany Websocket Sample</title>
+ <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js" type="text/javascript"></script>
+ <script type="text/javascript" src="org.apache.tuscany.sca.WebsocketComponentContext.js"></script>
+ <script type="text/javascript">
+ var registrationIds = {};
+
+ Tuscany.WebsocketComponentContext.EventProcessorComponent.EventProcessorConsumerService.register.responseHandler = function(event) {
+ var text = '';
+ if (event.id != null) {
+ // registration notification
+ registrationIds[event.name] = event.id;
+ text = "Registered to " + event.name + " with id " + event.id + " at " + event.data;
+ } else {
+ // event notification
+ text = event.name + ": " + event.data;
+ }
+ var textarea = $('#textarea');
+ $(textarea).val($(textarea).val() + text + "\n");
+ $(textarea).scrollTop($(textarea)[0].scrollHeight);
+ }
+
+ $(document).ready(function()
+ {
+ $('#registerEventButton').click(function(event) {
+ var eventName = $('#registerEventName').val();
+ if (registrationIds[eventName] != null) {
+ alert("Already registered for " + eventName + " events");
+ } else {
+ Tuscany.WebsocketComponentContext.EventProcessorComponent.EventProcessorConsumerService.register(eventName);
+ }
+ });
+
+ $('#unregisterEventButton').click(function(event) {
+ var eventName = $('#unregisterEventName').val();
+ if (registrationIds[eventName] != null) {
+ Tuscany.WebsocketComponentContext.EventProcessorComponent.EventProcessorConsumerService.unregister(registrationIds[eventName]);
+ registrationIds[eventName] = null;
+ } else {
+ alert("Not registered for " + eventName + " events");
+ }
+ });
+ });
+ </script>
+</head>
+<body>
+ <h2>Apache Tuscany Websocket Sample</h2>
+ <h3>PubSub for FAST, MODERATE and SLOW events</h3>
+ <p/>
+ <table>
+ <tr>
+ <td>Event name</td>
+ <td>
+ <select id="registerEventName">
+ <option value="FAST">FAST</option>
+ <option value="MODERATE">MODERATE</option>
+ <option value="SLOW">SLOW</option>
+ </select>
+ </td>
+ <td><input type="button" id='registerEventButton' value='Register' /></td>
+ </tr>
+ <tr>
+ <td>Event name</td>
+ <td>
+ <select id="unregisterEventName">
+ <option value="FAST">FAST</option>
+ <option value="MODERATE">MODERATE</option>
+ <option value="SLOW">SLOW</option>
+ </select>
+ </td>
+ <td><input type="button" id='unregisterEventButton' value='Unregister' /></td>
+ </tr>
+ </table>
+ <h3>Server notifications</h3>
+ <textarea id="textarea" rows="15" cols="80" readonly></textarea>
+</body>
+</html>
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/weather-webapp/README b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/weather-webapp/README
new file mode 100644
index 0000000000..eb195bc4dc
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/weather-webapp/README
@@ -0,0 +1,89 @@
+Tuscany - Learning More - Binding Websocket - Weather Monitor Webapp
+-----------------------------------------------------------------
+
+This sample demonstrates how Tuscany can expose services via websockets as well
+as how to interact with them using Tuscany's javascript API. It also demonstrates
+how to push multiple responses for a single request using SCA callbacks.
+
+This project contains multiple services that once called will push notifications
+to the client regarding certain weather parameters according to the location of
+the user. Of course, the service implementation is a mock that generates random
+numbers at a fixed interval of time as weather parameters.
+
+By adding <tuscany:binding.websocket port="8090"/> to a service definition, the
+Tuscany runtime will start a websocket server listening for requests coming
+in for the exposed service at the specified port. If no port is specified, the
+runtime will use port 9000 as a default.
+
+The websocket binding uses embedded Jetty instances as websocket servers. At the
+moment, Jetty 8.0.0-M3 is used which has support for the 00, 01, 06 and 07
+versions of the websocket protocol drafts.
+
+IN ORDER TO RUN THIS SAMPLE SUCCESSFULLY PLEASE CHECK IF YOUR BROWSER SUPPORTS
+THE ABOVE WEBSOCKET PROTOCOL VERSIONS AND THAT THE WEBSOCKET SUPPORT IS ENABLED.
+
+In order to enable callbacks to push multiple responses, you need to declare the
+WebsocketBindingCallback in the service definition as follows:
+
+ <interface.java interface="sample.ChatService"
+ callbackInterface="org.apache.tuscany.sca.binding.websocket.runtime.WebsocketBindingCallback" />
+ <tuscany:binding.websocket />
+ <callback>
+ <tuscany:binding.websocket />
+ </callback>
+
+The callback object has methods that facilitate sending messages back to the
+calling client. It can be injected in the service implementation using the @Callback
+annotation.
+
+One requirement that service methods have to meet to enable multiple response
+support is that they have to be annotated with @OneWay to enable non-blocking
+support. Without it, methods are treated synchronously sending a single response
+which is the object returned by the method call.
+
+The websocket binding also features a javascript API to simulate SCA in the
+browser. In order to use it, the following script has to be included in the
+client page:
+ <script type="text/javascript"
+ src="org.apache.tuscany.sca.WebsocketComponentContext.js">
+ </script>
+
+This will inject proxies for all services defined in the composite that are
+using binding.websocket. All invocation and connection management is handled
+under the hood so in order to invoke a websocket service, the following should
+be called:
+ Tuscany.WebsocketComponentContext.<component name>.<service name>.<operation name>(<parameters>);
+
+Given the asynchornous nature of websockets, a function should be defined in
+order to handle responses received for a certain service operation. This should
+be done as follows:
+ Tuscany.WebsocketComponentContext.<component name>.<service name>.<operation name>.responseHandler = function(response) {
+ // handle response
+ };
+
+Note that the data exchange is automatically handled by the binding, so parameters
+will be mapped to the data types defined in the method definition. Also, the response
+will have the same data type as the server side object used to wrap the response.
+Objects are passed over the wire in JSON format.
+
+Another detail worth mentioning is that the binding will use a single persistent
+websocket connection to handle communication between a browser client and all services
+defined using binding.websocket on the same port. Requests and responses will get
+multiplexed via the same channel and get routed to the appropriate service
+implementation, respectively javascript function.
+
+In order to run the sample, you can execute "mvn jetty:run" which will start a Jetty
+instance automatically or use "mvn package" and deploy the resulting war to the
+application server of your choice.
+
+Next, point your browser at
+ http://localhost:8080/sample-binding-websocket-weather-webapp/
+
+You can now set a location and register for various weather parameters. Notifications
+will be pushed to the browser when weather parameters change. You can see the persistent
+websocket connection handling all the communication using the developer tools provided
+by your browser.
+
+The websocket binding is an experimental binding so community feedback is much
+appreciated. Feel free to send comments or suggestions on the Apache Tuscany
+dev mailing list (dev@tuscany.apache.org). \ No newline at end of file
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/weather-webapp/pom.xml b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/weather-webapp/pom.xml
new file mode 100644
index 0000000000..a130750acb
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/weather-webapp/pom.xml
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>org.apache.tuscany.sca.samples</groupId>
+ <artifactId>tuscany-samples-binding-websocket</artifactId>
+ <version>2.0-Beta3-SNAPSHOT</version>
+ <relativePath>../pom.xml</relativePath>
+ </parent>
+
+ <artifactId>sample-binding-websocket-weather-webapp</artifactId>
+ <packaging>war</packaging>
+ <version>2.0-Beta3-SNAPSHOT</version>
+ <name>Apache Tuscany SCA Sample binding.websocket Weather Monitor Webapp</name>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.tuscany.sca</groupId>
+ <artifactId>tuscany-binding-websocket</artifactId>
+ <version>2.0-Beta3-SNAPSHOT</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.tuscany.sca</groupId>
+ <artifactId>tuscany-base-runtime-pom</artifactId>
+ <version>2.0-Beta3-SNAPSHOT</version>
+ <type>pom</type>
+ <scope>compile</scope>
+ </dependency>
+ </dependencies>
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.mortbay.jetty</groupId>
+ <artifactId>maven-jetty-plugin</artifactId>
+ <version>6.1.26</version>
+ </plugin>
+ </plugins>
+ </build>
+
+</project>
+
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/weather-webapp/src/main/java/sample/Helper.java b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/weather-webapp/src/main/java/sample/Helper.java
new file mode 100644
index 0000000000..10b46cc55f
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/weather-webapp/src/main/java/sample/Helper.java
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package sample;
+
+import java.util.Date;
+import java.util.Random;
+
+public final class Helper {
+
+ public static int randomInt(final int max) {
+ return (new Random(new Date().getTime()).nextInt(100));
+ }
+
+ private Helper() {
+ }
+
+}
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/weather-webapp/src/main/java/sample/HumidityService.java b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/weather-webapp/src/main/java/sample/HumidityService.java
new file mode 100644
index 0000000000..7b38a098ac
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/weather-webapp/src/main/java/sample/HumidityService.java
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package sample;
+
+import org.apache.tuscany.sca.binding.websocket.runtime.WebsocketBindingCallback;
+import org.oasisopen.sca.annotation.Callback;
+import org.oasisopen.sca.annotation.OneWay;
+import org.oasisopen.sca.annotation.Remotable;
+
+import sample.model.Location;
+
+@Remotable
+@Callback(WebsocketBindingCallback.class)
+public interface HumidityService {
+
+ @OneWay
+ void getHumidity(Location location);
+
+} \ No newline at end of file
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/weather-webapp/src/main/java/sample/PrecipitationService.java b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/weather-webapp/src/main/java/sample/PrecipitationService.java
new file mode 100644
index 0000000000..14fcdfd8b3
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/weather-webapp/src/main/java/sample/PrecipitationService.java
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package sample;
+
+import org.apache.tuscany.sca.binding.websocket.runtime.WebsocketBindingCallback;
+import org.oasisopen.sca.annotation.Callback;
+import org.oasisopen.sca.annotation.OneWay;
+import org.oasisopen.sca.annotation.Remotable;
+
+import sample.model.Location;
+
+@Remotable
+@Callback(WebsocketBindingCallback.class)
+public interface PrecipitationService {
+
+ @OneWay
+ void getPrecipitation(Location location);
+
+}
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/weather-webapp/src/main/java/sample/PrecipitationServiceImpl.java b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/weather-webapp/src/main/java/sample/PrecipitationServiceImpl.java
new file mode 100644
index 0000000000..5d9575686b
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/weather-webapp/src/main/java/sample/PrecipitationServiceImpl.java
@@ -0,0 +1,57 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package sample;
+
+import java.util.Date;
+import java.util.Timer;
+import java.util.TimerTask;
+
+import org.apache.tuscany.sca.binding.websocket.runtime.WebsocketBindingCallback;
+import org.apache.tuscany.sca.binding.websocket.runtime.WebsocketStatus;
+import org.oasisopen.sca.annotation.Callback;
+import org.oasisopen.sca.annotation.Service;
+
+import sample.model.Location;
+import sample.model.Response;
+
+@Service(PrecipitationService.class)
+public class PrecipitationServiceImpl implements PrecipitationService {
+
+ @Callback
+ protected WebsocketBindingCallback client;
+
+ @Override
+ public void getPrecipitation(final Location location) {
+ new Timer().scheduleAtFixedRate(new TimerTask() {
+
+ @Override
+ public void run() {
+ Response response = new Response();
+ response.setDate(new Date());
+ response.setData(Helper.randomInt(100) + "%");
+ WebsocketStatus status = client.sendMessage(response);
+ if (status == WebsocketStatus.CLOSED) {
+ System.out.println("Client disconnected from PrecipitationService.");
+ this.cancel();
+ }
+ }
+ }, 0L, 1000L);
+ }
+}
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/weather-webapp/src/main/java/sample/TemperatureHumidityServiceImpl.java b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/weather-webapp/src/main/java/sample/TemperatureHumidityServiceImpl.java
new file mode 100644
index 0000000000..e505167b3c
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/weather-webapp/src/main/java/sample/TemperatureHumidityServiceImpl.java
@@ -0,0 +1,77 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package sample;
+
+import java.util.Date;
+import java.util.Timer;
+import java.util.TimerTask;
+
+import org.apache.tuscany.sca.binding.websocket.runtime.WebsocketBindingCallback;
+import org.apache.tuscany.sca.binding.websocket.runtime.WebsocketStatus;
+import org.oasisopen.sca.annotation.Callback;
+import org.oasisopen.sca.annotation.Service;
+
+import sample.model.Location;
+import sample.model.Response;
+
+@Service({ TemperatureService.class, HumidityService.class })
+public class TemperatureHumidityServiceImpl implements TemperatureService, HumidityService {
+
+ @Callback
+ protected WebsocketBindingCallback callback;
+
+ @Override
+ public void getHumidity(final Location location) {
+ new Timer().scheduleAtFixedRate(new TimerTask() {
+
+ @Override
+ public void run() {
+ final Response response = new Response();
+ response.setDate(new Date());
+ response.setData(Helper.randomInt(90) + "%");
+ WebsocketStatus status = callback.sendMessage(response);
+ if (status == WebsocketStatus.CLOSED) {
+ System.out.println("Client disconnected from HumidityService.");
+ this.cancel();
+ }
+ }
+ }, 0L, 5000L);
+ }
+
+ @Override
+ public void getTemperature(final Location location) {
+ new Timer().scheduleAtFixedRate(new TimerTask() {
+
+ @Override
+ public void run() {
+ final Response response = new Response();
+ response.setDate(new Date());
+ final String data = "" + Helper.randomInt(40);
+ response.setData(data);
+ WebsocketStatus status = callback.sendMessage(response);
+ if (status == WebsocketStatus.CLOSED) {
+ System.out.println("Client disconnected from TemperatureService.");
+ this.cancel();
+ }
+ }
+ }, 0L, 3000L);
+ }
+
+} \ No newline at end of file
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/weather-webapp/src/main/java/sample/TemperatureService.java b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/weather-webapp/src/main/java/sample/TemperatureService.java
new file mode 100644
index 0000000000..67318c67c7
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/weather-webapp/src/main/java/sample/TemperatureService.java
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package sample;
+
+import org.apache.tuscany.sca.binding.websocket.runtime.WebsocketBindingCallback;
+import org.oasisopen.sca.annotation.Callback;
+import org.oasisopen.sca.annotation.OneWay;
+import org.oasisopen.sca.annotation.Remotable;
+
+import sample.model.Location;
+
+@Remotable
+@Callback(WebsocketBindingCallback.class)
+public interface TemperatureService {
+
+ @OneWay
+ void getTemperature(Location location);
+
+} \ No newline at end of file
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/weather-webapp/src/main/java/sample/model/Location.java b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/weather-webapp/src/main/java/sample/model/Location.java
new file mode 100644
index 0000000000..67edc140f9
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/weather-webapp/src/main/java/sample/model/Location.java
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package sample.model;
+
+public class Location {
+
+ private String city;
+ private String country;
+
+ public String getCity() {
+ return this.city;
+ }
+
+ public void setCity(final String city) {
+ this.city = city;
+ }
+
+ public String getCountry() {
+ return this.country;
+ }
+
+ public void setCountry(final String country) {
+ this.country = country;
+ }
+
+}
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/weather-webapp/src/main/java/sample/model/Response.java b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/weather-webapp/src/main/java/sample/model/Response.java
new file mode 100644
index 0000000000..462af6d8ab
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/weather-webapp/src/main/java/sample/model/Response.java
@@ -0,0 +1,45 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package sample.model;
+
+import java.util.Date;
+
+public class Response {
+
+ private Date date;
+ private String data;
+
+ public Date getDate() {
+ return this.date;
+ }
+
+ public void setDate(final Date date) {
+ this.date = date;
+ }
+
+ public String getData() {
+ return this.data;
+ }
+
+ public void setData(final String data) {
+ this.data = data;
+ }
+
+}
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/weather-webapp/src/main/webapp/META-INF/MANIFEST.MF b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/weather-webapp/src/main/webapp/META-INF/MANIFEST.MF
new file mode 100644
index 0000000000..58630c02ef
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/weather-webapp/src/main/webapp/META-INF/MANIFEST.MF
@@ -0,0 +1,2 @@
+Manifest-Version: 1.0
+
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/weather-webapp/src/main/webapp/WEB-INF/web.composite b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/weather-webapp/src/main/webapp/WEB-INF/web.composite
new file mode 100644
index 0000000000..edf53fa76c
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/weather-webapp/src/main/webapp/WEB-INF/web.composite
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<composite xmlns="http://docs.oasis-open.org/ns/opencsa/sca/200912"
+ xmlns:tuscany="http://tuscany.apache.org/xmlns/sca/1.1"
+ targetNamespace="http://samples"
+ name="Weather">
+
+ <component name="c1">
+ <implementation.java class="sample.TemperatureHumidityServiceImpl"/>
+ <service name="TemperatureService">
+ <interface.java interface="sample.TemperatureService"
+ callbackInterface="org.apache.tuscany.sca.binding.websocket.runtime.WebsocketBindingCallback"/>
+ <tuscany:binding.websocket/>
+ <callback>
+ <tuscany:binding.websocket/>
+ </callback>
+ </service>
+ <service name="HumidityService">
+ <interface.java interface="sample.HumidityService"
+ callbackInterface="org.apache.tuscany.sca.binding.websocket.runtime.WebsocketBindingCallback"/>
+ <tuscany:binding.websocket/>
+ <callback>
+ <tuscany:binding.websocket/>
+ </callback>
+ </service>
+ </component>
+
+ <component name="c2">
+ <implementation.java class="sample.PrecipitationServiceImpl"/>
+ <service name="PrecipitationService">
+ <interface.java interface="sample.PrecipitationService"
+ callbackInterface="org.apache.tuscany.sca.binding.websocket.runtime.WebsocketBindingCallback"/>
+ <tuscany:binding.websocket/>
+ <callback>
+ <tuscany:binding.websocket/>
+ </callback>
+ </service>
+ </component>
+
+</composite>
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/weather-webapp/src/main/webapp/WEB-INF/web.xml b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/weather-webapp/src/main/webapp/WEB-INF/web.xml
new file mode 100644
index 0000000000..25b06c457a
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/weather-webapp/src/main/webapp/WEB-INF/web.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:j2ee="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_3.0.xsd" version="3.0">
+ <display-name>Apache Tuscany Stock Comet Sample</display-name>
+ <filter>
+ <filter-name>tuscany</filter-name>
+ <filter-class>org.apache.tuscany.sca.host.webapp.TuscanyServletFilter</filter-class>
+ <async-supported>true</async-supported>
+ </filter>
+ <filter-mapping>
+ <filter-name>tuscany</filter-name>
+ <url-pattern>/*</url-pattern>
+ </filter-mapping>
+ <welcome-file-list>
+ <welcome-file>index.html</welcome-file>
+ </welcome-file-list>
+</web-app> \ No newline at end of file
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/weather-webapp/src/main/webapp/index.html b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/weather-webapp/src/main/webapp/index.html
new file mode 100644
index 0000000000..5d5ae2c1ca
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/weather-webapp/src/main/webapp/index.html
@@ -0,0 +1,114 @@
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<html>
+ <head>
+ <title>Apache Tuscany Websocket Sample</title>
+ <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js" type="text/javascript"></script>
+ <script type="text/javascript" src="org.apache.tuscany.sca.WebsocketComponentContext.js"></script>
+ <script type="text/javascript">
+ $(document).ready(function(){
+ var location = {};
+ location.city = null;
+ location.country = null;
+
+ $('#tempButton').attr('disabled', 'disabled');
+ $('#humButton').attr('disabled', 'disabled');
+ $('#precipButton').attr('disabled', 'disabled');
+
+ $('#locationButton').click(function(event) {
+ location.city = $('#city').val();
+ location.country = $('#country').val();
+ $('#locationButton').attr('disabled', 'disabled');
+ $('#tempButton').removeAttr('disabled');
+ $('#humButton').removeAttr('disabled');
+ $('#precipButton').removeAttr('disabled');
+ });
+
+ $('#tempButton').click(function(event) {
+ Tuscany.WebsocketComponentContext.c1.TemperatureService.getTemperature(location);
+ $('#tempButton').attr('disabled', 'disabled');
+ });
+
+ Tuscany.WebsocketComponentContext.c1.TemperatureService.getTemperature.responseHandler = function(response) {
+ $('#tempText').text(response.data);
+ $('#tempDate').text(response.date);
+ }
+
+ $('#humButton').click(function(event) {
+ Tuscany.WebsocketComponentContext.c1.HumidityService.getHumidity(location);
+ $('#humButton').attr('disabled', 'disabled');
+ });
+
+ Tuscany.WebsocketComponentContext.c1.HumidityService.getHumidity.responseHandler = function(response) {
+ $('#humText').text(response.data);
+ $('#humDate').text(response.date);
+ }
+
+ $('#precipButton').click(function(event) {
+ Tuscany.WebsocketComponentContext.c2.PrecipitationService.getPrecipitation(location);
+ $('#precipButton').attr('disabled', 'disabled');
+ });
+
+ Tuscany.WebsocketComponentContext.c2.PrecipitationService.getPrecipitation.responseHandler = function(response) {
+ $('#precipText').text(response.data);
+ $('#precipDate').text(response.date);
+ }
+ });
+ </script>
+ </head>
+ <body>
+ <div id='sidebar'>
+ <h2>Apache Tuscany Weather Sample</h2>
+ <h3>Weather Monitor</h3>
+ <p/>
+ <table>
+ <tr>
+ <td>City</td>
+ <td><input type="text" id='city' value='Brasov'/></td>
+ </tr>
+ <tr>
+ <td>Country</td>
+ <td><input type="text" id ='country' value='Romania'/></td>
+ </tr>
+ </table>
+ <input type="button" id='locationButton' value='Set location'/>
+ <p/>
+ <table>
+ <tr>
+ <th align="left">Temperature:</th>
+ <td><span id='tempText'>N/A</span></td>
+ <td><input type='button' id='tempButton' value="Update"/></td>
+ <td><span id='tempDate'></span>
+ </tr>
+ <tr>
+ <th align="left">Humidity:</th>
+ <td><span id='humText'>N/A</span></td>
+ <td><input type='button' id='humButton' value="Update"/></td>
+ <td><span id='humDate'></span>
+ </tr>
+ <tr>
+ <th align="left">Precipitation probability:</th>
+ <td><span id='precipText'>N/A</span></td>
+ <td><input type='button' id='precipButton' value="Update"/></td>
+ <td><span id='precipDate'></span>
+ </tr>
+ </table>
+ </div>
+ </body>
+</html>
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/pom.xml b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/pom.xml
new file mode 100644
index 0000000000..676c181166
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/learning-more/pom.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<project>
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>org.apache.tuscany.sca.samples</groupId>
+ <artifactId>tuscany-samples</artifactId>
+ <version>2.0-Beta3-SNAPSHOT</version>
+ <relativePath>../pom.xml</relativePath>
+ </parent>
+
+ <artifactId>tuscany-samples-learning-more</artifactId>
+ <version>2.0-Beta3-SNAPSHOT</version>
+ <packaging>pom</packaging>
+ <name>Apache Tuscany SCA Learning More</name>
+
+ <profiles>
+ <profile>
+ <id>default</id>
+ <activation>
+ <activeByDefault>true</activeByDefault>
+ </activation>
+ <modules>
+ <module>binding-comet</module>
+ <module>binding-websocket</module>
+ </modules>
+ </profile>
+ </profiles>
+</project>
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/pom.xml b/sca-java-2.x/branches/2.0-Beta3/samples/pom.xml
new file mode 100644
index 0000000000..3cd4ffb757
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/pom.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<project>
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>org.apache.tuscany.sca</groupId>
+ <artifactId>tuscany-sca</artifactId>
+ <version>2.0-Beta3-SNAPSHOT</version>
+ </parent>
+
+ <groupId>org.apache.tuscany.sca.samples</groupId>
+ <artifactId>tuscany-samples</artifactId>
+ <version>2.0-Beta3-SNAPSHOT</version>
+ <packaging>pom</packaging>
+ <name>Apache Tuscany SCA Samples</name>
+
+ <modules>
+ <module>getting-started</module>
+ <module>running-tuscany</module>
+ <module>learning-more</module>
+ </modules>
+
+</project>
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/running-tuscany/calculator-contribution.jar b/sca-java-2.x/branches/2.0-Beta3/samples/running-tuscany/calculator-contribution.jar
new file mode 100644
index 0000000000..32b0ee5f6c
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/running-tuscany/calculator-contribution.jar
Binary files differ
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/running-tuscany/command-line/README.html b/sca-java-2.x/branches/2.0-Beta3/samples/running-tuscany/command-line/README.html
new file mode 100644
index 0000000000..6343cf5f85
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/running-tuscany/command-line/README.html
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8"?><!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+
+<!DOCTYPE html
+ PUBLIC "-//W3C//DTD XHTML 1.1 plus MathML 2.0//EN" "http://www.w3.org/TR/MathML2/dtd/xhtml-math11-f.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml"><!--This file was converted to xhtml by OpenOffice.org - see http://xml.openoffice.org/odf2xhtml for more info.--><head profile="http://dublincore.org/documents/dcmi-terms/"><meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8"/><title xml:lang="en-US">- no title specified</title><meta name="DCTERMS.title" content="" xml:lang="en-US"/><meta name="DCTERMS.language" content="en-US" scheme="DCTERMS.RFC4646"/><meta name="DCTERMS.source" content="http://xml.openoffice.org/odf2xhtml"/><meta name="DCTERMS.creator" content="ant "/><meta name="DCTERMS.issued" content="2011-03-15T09:48:55.71" scheme="DCTERMS.W3CDTF"/><meta name="DCTERMS.modified" content="2011-04-14T11:47:12.75" scheme="DCTERMS.W3CDTF"/><meta name="DCTERMS.provenance" content="" xml:lang="en-US"/><meta name="DCTERMS.subject" content="," xml:lang="en-US"/><link rel="schema.DC" href="http://purl.org/dc/elements/1.1/" hreflang="en"/><link rel="schema.DCTERMS" href="http://purl.org/dc/terms/" hreflang="en"/><link rel="schema.DCTYPE" href="http://purl.org/dc/dcmitype/" hreflang="en"/><link rel="schema.DCAM" href="http://purl.org/dc/dcam/" hreflang="en"/><base href="."/><style type="text/css">
+ @page { }
+ table { border-collapse:collapse; border-spacing:0; empty-cells:show }
+ td, th { vertical-align:top; font-size:12pt;}
+ h1, h2, h3, h4, h5, h6 { clear:both }
+ ol, ul { margin:0; padding:0;}
+ li { list-style: none; margin:0; padding:0;}
+ <!-- "li span.odfLiEnd" - IE 7 issue-->
+ li span. { clear: both; line-height:0; width:0; height:0; margin:0; padding:0; }
+ span.footnodeNumber { padding-right:1em; }
+ span.annotation_style_by_filter { font-size:95%; font-family:Arial; background-color:#fff000; margin:0; border:0; padding:0; }
+ * { margin:0;}
+ .Heading_20_1 { font-size:115%; margin-bottom:0.212cm; margin-top:0.423cm; font-family:Arial; writing-mode:page; font-weight:bold; }
+ .P1 { font-size:10pt; font-family:Times New Roman; writing-mode:page; }
+ .Standard { font-size:12pt; font-family:Times New Roman; writing-mode:page; }
+ .T1 { font-family:Courier New; }
+ .T2 { font-family:Courier New; font-style:italic; }
+ <!-- ODF styles with no properties representable as CSS -->
+ { }
+ </style></head><body dir="ltr" style="max-width:21.001cm;margin-top:2cm; margin-bottom:2cm; margin-left:2cm; margin-right:2cm; "><h1 class="Heading_20_1"><a id="a__Running_contributions_using_the_Tuscany_Shell"><span/></a>Running contributions using the Tuscany Shell</h1><p class="Standard"> </p><p class="Standard">To execute a sample contribution from the command line without needing to write any runtime launcher code you can use the Tuscany shell. The Shell provides a simple tool for loading and running SCA contributions. </p><p class="Standard"> </p><p class="Standard">The shell can be started using the tuscany.bat (windows) or tuscany.sh (linux) scripts provided in the /bin directory of the binary distribution. You can provide the name of a contribution as an argument in the following way </p><p class="Standard"> </p><p class="P1">  <span class="T1">bin/tuscany.bat </span><span class="T2">location_of_contribution</span></p><p class="Standard"> </p><p class="Standard">The getting-started\helloworld contribution is a good contribution to start with if you want to give this a go. First change directory to the root of the Tuscany binary distribution. Then;</p><p class="Standard"> </p><p class="Standard">on Windows:</p><p class="Standard"> </p><p class="P1">  <span class="T1">bin\tuscany.bat samples\getting-started\helloworld</span></p><p class="Standard"> </p><p class="Standard">on Linux:</p><p class="Standard"> </p><p class="P1">  <span class="T1">bin/tuscany.sh samples/getting-started/helloworld</span></p><p class="Standard"> </p><p class="Standard">Once the Shell has started with one of those methods you can use Shell commands to explore</p><p class="Standard">the SCA domain, for example, use the "installed" command to get the status of installed contributions, "services" to see the available component services, and you may test calling the helloworld service by using the "invoke" command:</p><p class="Standard"> </p><p class="P1">   <span class="T1">invoke HelloworldComponent sayHello yourName</span></p><p class="Standard"> </p><p class="Standard">TODO – add more instructions on how to use the shell</p></body></html> \ No newline at end of file
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/running-tuscany/command-line/README.odt b/sca-java-2.x/branches/2.0-Beta3/samples/running-tuscany/command-line/README.odt
new file mode 100644
index 0000000000..08fa3c1204
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/running-tuscany/command-line/README.odt
Binary files differ
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/running-tuscany/eclipse/README.html b/sca-java-2.x/branches/2.0-Beta3/samples/running-tuscany/eclipse/README.html
new file mode 100644
index 0000000000..b31333b7e8
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/running-tuscany/eclipse/README.html
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<!DOCTYPE html
+ PUBLIC "-//W3C//DTD XHTML 1.1 plus MathML 2.0//EN" "http://www.w3.org/TR/MathML2/dtd/xhtml-math11-f.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml"><!--This file was converted to xhtml by OpenOffice.org - see http://xml.openoffice.org/odf2xhtml for more info.--><head profile="http://dublincore.org/documents/dcmi-terms/"><meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8"/><title xml:lang="en-US">- no title specified</title><meta name="DCTERMS.title" content="" xml:lang="en-US"/><meta name="DCTERMS.language" content="en-US" scheme="DCTERMS.RFC4646"/><meta name="DCTERMS.source" content="http://xml.openoffice.org/odf2xhtml"/><meta name="DCTERMS.creator" content="ant "/><meta name="DCTERMS.issued" content="2011-03-15T09:48:55.71" scheme="DCTERMS.W3CDTF"/><meta name="DCTERMS.modified" content="2011-04-14T11:46:35.96" scheme="DCTERMS.W3CDTF"/><meta name="DCTERMS.provenance" content="" xml:lang="en-US"/><meta name="DCTERMS.subject" content="," xml:lang="en-US"/><link rel="schema.DC" href="http://purl.org/dc/elements/1.1/" hreflang="en"/><link rel="schema.DCTERMS" href="http://purl.org/dc/terms/" hreflang="en"/><link rel="schema.DCTYPE" href="http://purl.org/dc/dcmitype/" hreflang="en"/><link rel="schema.DCAM" href="http://purl.org/dc/dcam/" hreflang="en"/><base href="."/><style type="text/css">
+ @page { }
+ table { border-collapse:collapse; border-spacing:0; empty-cells:show }
+ td, th { vertical-align:top; font-size:12pt;}
+ h1, h2, h3, h4, h5, h6 { clear:both }
+ ol, ul { margin:0; padding:0;}
+ li { list-style: none; margin:0; padding:0;}
+ <!-- "li span.odfLiEnd" - IE 7 issue-->
+ li span. { clear: both; line-height:0; width:0; height:0; margin:0; padding:0; }
+ span.footnodeNumber { padding-right:1em; }
+ span.annotation_style_by_filter { font-size:95%; font-family:Arial; background-color:#fff000; margin:0; border:0; padding:0; }
+ * { margin:0;}
+ .Heading_20_1 { font-size:115%; margin-bottom:0.212cm; margin-top:0.423cm; font-family:Arial; writing-mode:page; font-weight:bold; }
+ .Standard { font-size:12pt; font-family:Times New Roman; writing-mode:page; }
+ <!-- ODF styles with no properties representable as CSS -->
+ { }
+ </style></head><body dir="ltr" style="max-width:21.001cm;margin-top:2cm; margin-bottom:2cm; margin-left:2cm; margin-right:2cm; "><h1 class="Heading_20_1"><a id="a__Running_contributions_inside_Eclipse"><span/></a>Running contributions inside Eclipse</h1><p class="Standard"> </p><p class="Standard">To import sample contributions into Eclipse you first need to import the Tuscany runtime. You then need to import the sample contribution into Eclipse as a project. Instructions for doing both of these things can be found here </p><p class="Standard"> </p><p class="Standard"><a href="http://tuscany.apache.org/import-existing-tuscany-sca-projects-into-eclipse.html">http://tuscany.apache.org/import-existing-tuscany-sca-projects-into-eclipse.html</a></p><p class="Standard"> </p><p class="Standard">Note. these instructions refer to our 1.x code base but it holds true for our 2.x code base. </p><p class="Standard"> </p><p class="Standard">Once you have a contribution imported into Eclipse and cleanly compiling against the Tuscany runtime jars you probably want to be able to run and  debug it. The easiest way to do this is with a simple Java launcher. If you import the running-tuscany/embedded-jse project into Eclipse you'll see a simple launcher program which you can copy and adjust to launch the contribution(s) of your choice. </p></body></html> \ No newline at end of file
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/running-tuscany/eclipse/README.odt b/sca-java-2.x/branches/2.0-Beta3/samples/running-tuscany/eclipse/README.odt
new file mode 100644
index 0000000000..785754163f
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/running-tuscany/eclipse/README.odt
Binary files differ
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/running-tuscany/junit/README.html b/sca-java-2.x/branches/2.0-Beta3/samples/running-tuscany/junit/README.html
new file mode 100644
index 0000000000..00d6592cb8
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/running-tuscany/junit/README.html
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<!DOCTYPE html
+ PUBLIC "-//W3C//DTD XHTML 1.1 plus MathML 2.0//EN" "http://www.w3.org/TR/MathML2/dtd/xhtml-math11-f.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml"><!--This file was converted to xhtml by OpenOffice.org - see http://xml.openoffice.org/odf2xhtml for more info.--><head profile="http://dublincore.org/documents/dcmi-terms/"><meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8"/><title xml:lang="en-US">- no title specified</title><meta name="DCTERMS.title" content="" xml:lang="en-US"/><meta name="DCTERMS.language" content="en-US" scheme="DCTERMS.RFC4646"/><meta name="DCTERMS.source" content="http://xml.openoffice.org/odf2xhtml"/><meta name="DCTERMS.creator" content="ant "/><meta name="DCTERMS.issued" content="2011-03-15T09:48:55.71" scheme="DCTERMS.W3CDTF"/><meta name="DCTERMS.modified" content="2011-04-14T11:20:02.98" scheme="DCTERMS.W3CDTF"/><meta name="DCTERMS.provenance" content="" xml:lang="en-US"/><meta name="DCTERMS.subject" content="," xml:lang="en-US"/><link rel="schema.DC" href="http://purl.org/dc/elements/1.1/" hreflang="en"/><link rel="schema.DCTERMS" href="http://purl.org/dc/terms/" hreflang="en"/><link rel="schema.DCTYPE" href="http://purl.org/dc/dcmitype/" hreflang="en"/><link rel="schema.DCAM" href="http://purl.org/dc/dcam/" hreflang="en"/><base href="."/><style type="text/css">
+ @page { }
+ table { border-collapse:collapse; border-spacing:0; empty-cells:show }
+ td, th { vertical-align:top; font-size:12pt;}
+ h1, h2, h3, h4, h5, h6 { clear:both }
+ ol, ul { margin:0; padding:0;}
+ li { list-style: none; margin:0; padding:0;}
+ <!-- "li span.odfLiEnd" - IE 7 issue-->
+ li span. { clear: both; line-height:0; width:0; height:0; margin:0; padding:0; }
+ span.footnodeNumber { padding-right:1em; }
+ span.annotation_style_by_filter { font-size:95%; font-family:Arial; background-color:#fff000; margin:0; border:0; padding:0; }
+ * { margin:0;}
+ .Heading_20_1 { font-size:115%; margin-bottom:0.212cm; margin-top:0.423cm; font-family:Arial; writing-mode:page; font-weight:bold; }
+ .P1 { font-size:10pt; font-family:Courier New; writing-mode:page; }
+ .Standard { font-size:12pt; font-family:Times New Roman; writing-mode:page; }
+ <!-- ODF styles with no properties representable as CSS -->
+ { }
+ </style></head><body dir="ltr" style="max-width:21.001cm;margin-top:2cm; margin-bottom:2cm; margin-left:2cm; margin-right:2cm; "><h1 class="Heading_20_1"><a id="a__Running_the_Tuscany_runtime_from_JUnit"><span/></a>Running the Tuscany runtime from JUnit</h1><p class="Standard"> </p><p class="Standard">The same Node API used to start the Tuscany runtime from Java can of course also be used from within a JUnit test case. This allows you to automatically test you SCA contributions. This sample uses the same sart-up code from the jse sample but this time inside:</p><p class="Standard"> </p><p class="P1">   launcher.LaunchCalculatorContributionTestCase.java</p><p class="Standard"> </p><p class="Standard">This JUnit test case can be run using you usually use to run JUnit tests. By default Maven will run JUnit tests for a module so this sample can be run by doing the following:</p><p class="Standard"> </p><p class="P1">cd junit</p><p class="P1">mvn</p><p class="Standard"> </p><p class="Standard">TODO – should we provide run-sample scripts. If so we need to ship JUnit or provide instructions on how to install it?</p></body></html> \ No newline at end of file
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/running-tuscany/junit/README.odt b/sca-java-2.x/branches/2.0-Beta3/samples/running-tuscany/junit/README.odt
new file mode 100644
index 0000000000..6a8240d72e
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/running-tuscany/junit/README.odt
Binary files differ
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/running-tuscany/junit/pom.xml b/sca-java-2.x/branches/2.0-Beta3/samples/running-tuscany/junit/pom.xml
new file mode 100644
index 0000000000..5b683a22c9
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/running-tuscany/junit/pom.xml
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<project>
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>org.apache.tuscany.sca.samples</groupId>
+ <artifactId>tuscany-samples-running-tuscany</artifactId>
+ <version>2.0-Beta3-SNAPSHOT</version>
+ <relativePath>../pom.xml</relativePath>
+ </parent>
+ <artifactId>junit</artifactId>
+ <name>Apache Tuscany SCA Samples JUnit</name>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.tuscany.sca</groupId>
+ <artifactId>tuscany-base-runtime</artifactId>
+ <version>2.0-Beta3-SNAPSHOT</version>
+ </dependency>
+
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <version>4.8.1</version>
+ <scope>test</scope>
+ </dependency>
+
+ </dependencies>
+
+ <build>
+ <finalName>${project.artifactId}</finalName>
+ </build>
+</project>
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/running-tuscany/junit/src/main/java/calculator/CalculatorService.java b/sca-java-2.x/branches/2.0-Beta3/samples/running-tuscany/junit/src/main/java/calculator/CalculatorService.java
new file mode 100644
index 0000000000..12d80ffd1c
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/running-tuscany/junit/src/main/java/calculator/CalculatorService.java
@@ -0,0 +1,38 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package calculator;
+
+import org.oasisopen.sca.annotation.Remotable;
+
+
+/**
+ * The Calculator service interface.
+ */
+@Remotable
+public interface CalculatorService {
+
+ double add(double n1, double n2);
+
+ double subtract(double n1, double n2);
+
+ double multiply(double n1, double n2);
+
+ double divide(double n1, double n2);
+
+}
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/running-tuscany/junit/src/test/java/launcher/LaunchCalculatorContributionTestCase.java b/sca-java-2.x/branches/2.0-Beta3/samples/running-tuscany/junit/src/test/java/launcher/LaunchCalculatorContributionTestCase.java
new file mode 100644
index 0000000000..229a3fe223
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/running-tuscany/junit/src/test/java/launcher/LaunchCalculatorContributionTestCase.java
@@ -0,0 +1,51 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package launcher;
+
+import junit.framework.Assert;
+
+import org.apache.tuscany.sca.node.Contribution;
+import org.apache.tuscany.sca.node.Node;
+import org.apache.tuscany.sca.node.NodeFactory;
+import org.junit.Test;
+
+import calculator.CalculatorService;
+
+/**
+ * Test sample contribution.
+ */
+public class LaunchCalculatorContributionTestCase {
+
+
+ @Test
+ public void testCalculatorContribution() throws Exception {
+ Node node = NodeFactory.newInstance().createNode(new Contribution("c1", "../calculator-contribution.jar"));
+ node.start();
+
+ CalculatorService calculator = node.getService(CalculatorService.class, "CalculatorServiceComponent");
+
+ double result = calculator.add(3, 2);
+
+ System.out.println("3 + 2 = " + result);
+
+ Assert.assertEquals(5.0, result);
+
+ node.stop();
+ }
+}
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/running-tuscany/pom.xml b/sca-java-2.x/branches/2.0-Beta3/samples/running-tuscany/pom.xml
new file mode 100644
index 0000000000..f44f8e1c62
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/running-tuscany/pom.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<project>
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>org.apache.tuscany.sca.samples</groupId>
+ <artifactId>tuscany-samples</artifactId>
+ <version>2.0-Beta3-SNAPSHOT</version>
+
+ </parent>
+
+ <artifactId>tuscany-samples-running-tuscany</artifactId>
+ <version>2.0-Beta3-SNAPSHOT</version>
+ <packaging>pom</packaging>
+ <name>Apache Tuscany SCA Samples Running Tuscany</name>
+
+ <profiles>
+ <profile>
+ <id>default</id>
+ <activation>
+ <activeByDefault>true</activeByDefault>
+ </activation>
+ <modules>
+ <module>junit</module>
+ </modules>
+ </profile>
+ </profiles>
+</project>
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/running-tuscany/running-tuscany.html b/sca-java-2.x/branches/2.0-Beta3/samples/running-tuscany/running-tuscany.html
new file mode 100644
index 0000000000..133948e057
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/running-tuscany/running-tuscany.html
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<!DO
+<!DOCTYPE html
+ PUBLIC "-//W3C//DTD XHTML 1.1 plus MathML 2.0//EN" "http://www.w3.org/TR/MathML2/dtd/xhtml-math11-f.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml"><!--This file was converted to xhtml by OpenOffice.org - see http://xml.openoffice.org/odf2xhtml for more info.--><head profile="http://dublincore.org/documents/dcmi-terms/"><meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8"/><title xml:lang="en-US">- no title specified</title><meta name="DCTERMS.title" content="" xml:lang="en-US"/><meta name="DCTERMS.language" content="en-US" scheme="DCTERMS.RFC4646"/><meta name="DCTERMS.source" content="http://xml.openoffice.org/odf2xhtml"/><meta name="DCTERMS.creator" content="ant "/><meta name="DCTERMS.issued" content="2011-03-15T09:48:55.71" scheme="DCTERMS.W3CDTF"/><meta name="DCTERMS.modified" content="2011-04-18T12:39:54.44" scheme="DCTERMS.W3CDTF"/><meta name="DCTERMS.provenance" content="" xml:lang="en-US"/><meta name="DCTERMS.subject" content="," xml:lang="en-US"/><link rel="schema.DC" href="http://purl.org/dc/elements/1.1/" hreflang="en"/><link rel="schema.DCTERMS" href="http://purl.org/dc/terms/" hreflang="en"/><link rel="schema.DCTYPE" href="http://purl.org/dc/dcmitype/" hreflang="en"/><link rel="schema.DCAM" href="http://purl.org/dc/dcam/" hreflang="en"/><base href="."/><style type="text/css">
+ @page { }
+ table { border-collapse:collapse; border-spacing:0; empty-cells:show }
+ td, th { vertical-align:top; font-size:12pt;}
+ h1, h2, h3, h4, h5, h6 { clear:both }
+ ol, ul { margin:0; padding:0;}
+ li { list-style: none; margin:0; padding:0;}
+ <!-- "li span.odfLiEnd" - IE 7 issue-->
+ li span. { clear: both; line-height:0; width:0; height:0; margin:0; padding:0; }
+ span.footnodeNumber { padding-right:1em; }
+ span.annotation_style_by_filter { font-size:95%; font-family:Arial; background-color:#fff000; margin:0; border:0; padding:0; }
+ * { margin:0;}
+ .fr1 { font-size:12pt; vertical-align:top; writing-mode:lr-tb; }
+ .Heading_20_1 { font-size:115%; margin-bottom:0.212cm; margin-top:0.423cm; font-family:Arial; writing-mode:page; font-weight:bold; }
+ .P1 { font-size:12pt; font-family:Times New Roman; writing-mode:page; font-weight:bold; }
+ .Standard { font-size:12pt; font-family:Times New Roman; writing-mode:page; }
+ .Table_20_Contents { font-size:12pt; font-family:Times New Roman; writing-mode:page; }
+ .Table1 { width:17.013cm; margin-left:0cm; margin-right:-0.012cm; float:none; }
+ .Table1_A1 { padding:0.097cm; border-left-width:0.0133cm; border-left-style:solid; border-left-color:#000000; border-right-style:none; border-top-width:0.0133cm; border-top-style:solid; border-top-color:#000000; border-bottom-width:0.0133cm; border-bottom-style:solid; border-bottom-color:#000000; }
+ .Table1_A2 { padding:0.097cm; border-left-width:0.0133cm; border-left-style:solid; border-left-color:#000000; border-right-style:none; border-top-style:none; border-bottom-width:0.0133cm; border-bottom-style:solid; border-bottom-color:#000000; }
+ .Table1_B1 { padding:0.097cm; border-width:0.0133cm; border-style:solid; border-color:#000000; }
+ .Table1_B2 { padding:0.097cm; border-left-width:0.0133cm; border-left-style:solid; border-left-color:#000000; border-right-width:0.0133cm; border-right-style:solid; border-right-color:#000000; border-top-style:none; border-bottom-width:0.0133cm; border-bottom-style:solid; border-bottom-color:#000000; }
+ .Table1_A { width:3.995cm; }
+ .Table1_B { width:13.018cm; }
+ .T1 { font-weight:normal; }
+ <!-- ODF styles with no properties representable as CSS -->
+ { }
+ </style></head><body dir="ltr" style="max-width:21.001cm;margin-top:2cm; margin-bottom:2cm; margin-left:2cm; margin-right:2cm; "><h1 class="Heading_20_1"><a id="a__iVBORw0KGgoAAAANSUhEUgAAAL8AAABbCAIAAACtXcPFAABGD0lEQVR4nO19B5RlRbV2nXzv7dw9PT2RAWaYGZJkyUEQERAQQUmDgAKyQDICz_eSJSjvRwwgogQJT54oSpQgCIiCpEVGwgyT8_T0dL7p5P_btc_pOd3TaZD161t_l9hz77nn1KlT9dXe3w5Vx4zjWIyXf2HJdr8WDX1cpMc1DFcQa5EmLE1oQhjyRB1jqGmZ82LBo0oHfWHgLI3qC6PANPGvJ_j3QBO6EHoYxoaeF5Ee_pFhm0IP5MUWVROJKKJKdFmDEAE3K6YvpuD_j5d__6JLYNBfTTM1OYYRxjjGVyPWYh5bdR4d0IEpOqJZEgzAmhaYug8IeUF_uVxqrG_E9RqgZegiKgnNNHI2YQ0VaABNJGJd1yTyJNY0bYhmjaPn36nE_rA_afJX_Kcl3xIRQDghMQShpMkRjqMQ_9eFgW9RHGhaiP_k2AgqXn_52FOpFMPIrVRsx3GaGyf4frB2zXpdN1uaW4G1fKEOqNCpIRYEkoj5BkOXcfT8GxcWMvxX6HwE2ND5I2MljqMIyCCgmCQoIlMPldrTCTeVMCpXq5VKtb_vr7tY6sNBO2f19VUbGxsMwy0Wi52d62PIsKjXcgqu35gvNDlWHQFOs6NI12NDJKjWU92YfB9Hz7_6DDevGTnaRvxIsCTQ4Z_BS2ISKtA1oUkqJhD8VWo2qCHXK1Wq3f19XQBNGEIrxSSK4ijwXctEhW7nhpXlcrlQsExbD8Ku2Ku6XjmMqkZtYAJAWqybFkEUd0huPEA6jqPn37TE2b_axr_aPBQRu4lAZlOuHEnchCKqhn7F9SBqSuVyEVDw_L4w8liv6XR1CMKkRbEXgAbplUrF86tObZ0mwsAPwIHC0CsWga5qTaG5rm6i0HJCOL7v205h00aOo_ffqAxn_SpLjCY_pBGpqlAnzRXK_6px6EHMuJWi65bwq_tWIWwAIMgbICyXc2zLCsMIsiiIIkPDpXq14sWBa5iGpee9ih9VfMvQPa0iNAPQ8vFztRL5QUPTZIg7y9BS2j4ue_63lcyIkT7SdBjbUj3FHnBS7Osqlfui0C2X_6PQt21Tg7kVVGw9Nu2cMGDPx27F9zzP1EzHLsDex_f6QnO5UrR0q1DIBb4HzBi6Xir223lTN40oDPpdF4Qacqqxcapm5hNss_mWfInG0fOvL8oezlCgKAxDQ7JgfAlCmE6aQV4XcBcXf71qsat7Q09XR7VaBoOxbcv3ytBKOduwLA2jDkDgQtNwSuUqwQ8ERtjQdYFL3iJY4r4bFpw609QDD4RbBEEEzZizc0FQjmLdMms0U6uU_9dUV2rCaZgwjXg5nWKhrWTPo7X6uOz59yjAipYUVl_RdLR4IBxgq6ZhSg3lV4rd1Upnf19nf7EXphY0Un2t5fkQOj25XA62ehTGHuRGEIiQiA5UD_SUdPiBK2vEwtkJJAAyukEE6AjcOk7M_iA2LVToul5FNx1d5GCglUu9kFi5ugnQluSeJOZO0jAelz3_DkWTPjv5MUosphj8NxCGZlnSevIq4DEopWK35_X4QZkJTaCZYDEASxz5ppHT8BWY8n2gyCCnIhSQdDBCaMQhBJwu_Uls6huwvqgEOGqYJpgQgS4OjDAOQpwQGLD9NRjt4EuuH1RzqMeyEuqelnH0_IsLBQoMHpIsdDyhM1cO3f6eDevbu3s6Xbeik8VUyTlGTSEPmQF2HFQ8mE4OxpW0iUHoCXA51BxG1gx9XzqkgR6yuqRvWtpedF8fJ0M86bpBEg_CKwTypAw0qVBtQWgacW2hUNfcRG1h5iPZs0SgPo6ef3GJIjl_9DEmeYOR1ULBWqWve8P6NX393YEHrhPVUOhJ83w98ul_GHFTMwzTgTKCxvEgjXQiJCERHiBAxzBDDGlyhDU53Eo5kviJYbXRL5EsDC9Dz_EfS7OAyJj4OUe1QtwgrJaMnCUJWWxohgycxePo_RcX06CQAiEHMBLsz8F_QW_7mp6udd1dHXHo2o5hm4bGVJrCWkbkhRhBXaP_kVaSl8exLoWLEUf4oFOoKjbIlShBQMFO8vhE0kHNlpOQyiuWQgjqy4L9HpEaFB4dwVmhF7nr167p7i7V17VNaCuAL0n8cSBWG0fPv7io6CNRURraMKyUwItXLV8chVVTj0zLAHX1vErk05jaZr2m26Yl_CiIPDCV0CARpKeBMFJLIbEV6CJAywKohKaiGjgY8yeDYAd1pUvY2WRJBRbECmqNoDr9UDMpeA_rrr9Y8cK_WTPrWbcCZ6rx4_gZpQzy4KVjnUmlEINDm_HACNUIf4XUBDozHl0ynsDt6Vi7ds0KLQ70CPQ1osEip2AcybHDifjkJwOpWxRDh5VFvDuihAoKkoLBkDghQOosZQhTwEdIkdUIhhnJKxJTOmlNW9MN8KnQjwOPFCIOGYYFvQYipMdS1oEK6ZYg0w_CMSTYyGcYR89IJU6DRlw0QgrjJhoqPKWrS1RGRShzcGioAyKZSZgxphluY_oL6Bg3ydIRQdjduaFjbV9vt_FXgSQCCRUoKzsmIJHWgN0Uh0FE4U_SV6Aq9A_Q4MmIaSgYN4ZINEzOJCodBgQoqeo0Msf01GcTS4XGvEgnrQX0wBDzvJBoEGHI0EMj8ILGmiZRDYRj4ygH9MW4v_djlSghuVSUC39ACbN_Y_oZRgx4hOdHBs1s3Za8OAiqZNzEgaiW_zs7wZGLPZ0wsG0bcsfXZXBKC3VoIqgYUBkoN4pVaZK4EPPVpReHU7Y0KZ0Y1WxZkZvH931cLYmypiWOH8oNgtBhRUakWE_yO4A5qEjTMS0rh8p8TwTE6a36Qq1j54Rpy7ojSgCRNxpHz0hF2wQX2uCP8neVl5O4jGMtGY7koCYdypjjjqVL1UHZfTrpA0NUS8Xujg3t7RA5oVuGujAh3wIyoAWFskhyxFJbEWhZZlBeGOUTUrRTtpFYs6Sx_Cf1B1LLcICcOKhFk1JK8ueIMBPpLCnZ1mIwyiZbhhl45GrULcKKF4Q5y6htaBR5UGY9eZK0jKNnlKINQXz0gbwnU8j2CXXDSEwadRDkBjZTGEtGy8kOsV_sq5RL3etX9_f09Pf1YOQLtuFYjiCXsU_mFWSBLhkKUWDSFVqkhzFl88icCc4Fk38SypwUwQJCk9EwOeARw42bk56jPmSPW4bl_yGJU03z_MAPosZC7aRp0wSIumRPMtdIY3SOo2fEEg_KO96Yd5UeGqyzdF1XzBoiRJdpo5SlFdPgy3EkP0y5t6ujfX1_b2e5VMSvYCeGLtMjfNhZgsJPoWoAoUem5kgvX8RKSE8aIsfRIIEWc2ulVUVfJbooVTmSwMARPX0oUn4BQU56CxLvM0u1ajV0nJzQ7SqFScLa_qZJ06bXt02i9nPCEXEnjTtjHD1jKAMAlBU8Sb5fJgNQzk1CCbEayuuEyRRHiScQfz232rOho6O9p7vLr7rgHA7hCyqIHcKRTL8hu8qgMRZaIJGDXwmUYDlg2TqZRRr7bTSWQYSZIKQoQsQJ8TGnPQsaYIMS6SMWM8mos_2_8YFYFIVkjQVBZFmGF0QVN2hsnrDl7G0b2yaLBJmSYmcynMfR8zHKAJYzwAKn8QszRppORjjAUClHbrW7a31n_zpoK_nUi_XQ97xqoa7OdX2wEwvsFBLIMCGyQi_UHEeToiokwqLJFBspUDTiN9JjJxmRvBHZ0STdpH4TrFsIY1rsE6i0iA33jZ4fXp9Bn6N0IQaQF2mOVfBcgNSc2Dpl6lZb1U_aDFux6nq2Yyo1zuRHG7fYx1S0oT8okKjcPwkgiRh28aOPfbfU2dG9YX372tUh2TAeZI1tSjcLGWKmC81FgSqHfDNkKlOgwTClfCGuEklnsbTAQYPCUNOJ0XAaPIWmZNiJrb6NsYiY4UZyCrY6TiX8wbDCd6oSv0dg0ZB8YUCSLtVEGoXPNQvtbm6ZOGvuHNHYRKmvPnRZPkpTwyTuCGpo0jh6RitaJg9cSxCTBDAjWrQihUHqMo7ihNlQwMkPS_3Lly5du2aVEQeOZQIOMrQgTPwbSjOJfDjS3ULhTYoaaORlMSi_PYip_kgjN52QXgIKXhlEvEOcG8gDgKpBdn0cc5Q_lvpK5ygURjggFqwlbuUg4qeRSsgw9SrQHMO0sqHWgFpdN_1cQbfybdMnt02dJhrqpWqKDItxoyvBI1d4ESUfR8_IRQmbOIGOojxBnEAH_eqHPsZVCg_y1YpSsbO9vWtDR7Gvt1zsN_Woob6uUi6S7zjijNJAk4qDTGV2y0CkkKdP09iIIldQxA4aPZ3xLHSk_R5K6UbWumRAhFlAjqlxsrqLcrmo_ihgPUXw40C7dDGbnhvAKNct4ld_GIAm52tqYZlP3WKmXqgTtQXBDiOImJh91UN0zjh6xlZS6ChtZZJB62Ewc45tm7xmLiA54lY7li9buXJlsdgHDEDimBqpJy2MmD6zTRQnVJXq1TjYHWuJTcZ0N2LfXmrfExqIUTNp1oUir0y6YnLSxLxyRyPnTrIKK85ZNkQahy1ArD1K6NFNy45kvqIfxrDKNcNsaW3dcsstzUmTaBmXpicSJk4sLCV1RKoik074f9H1__vLpk4fjKZlaCa51CJBKTURhYHioP2jBetWrayWSgXLxNQ2LSMK_HKxmLOlAiLdRYghpiJXFKtVw5L6JpQXRwwjGRpOn0iTKCiTK2J_lWTbJIghwy0x_qRtzX7LKC4XSxS7MHTDBqGB_IsJq7oJPUl_RMtubZs8faut7NYJdAEexNKTJ5aIU1HcIdcpjqNn84qafxAE5CmGrAiCxLPb37ts4UcbVqwI3FLeIZ7jVaqBG_ZspyafC32ZmyxNIfZNSyeOBETimSbSKomRKXFkpKARFPTmu2taECTKc1CkzbIsVk2CLX4uYVQo5CkJgxSg7pFiEz7YMqy6QEydseX0mTNFXa0UgdK5IFd5yWXriQOdACmtOX0wfKJxzTXWwupBz3w1TR3WCDFfnXL2RG_P8sVLVixZ6MQ07IAUqG0U0gmh5oHSSrWip_9JASELuJKQbIc8OlKH0YkRFF2Quo6lkw72E52gRV7EPhdDYk_5B0JPhlSlLxEmHdVG4kgPCG4yNhFHumUVamoMJweZufO2c4WTE44jF7NTorO03WJNTRDlwUp0YObhkzTIcfSMWgYsHecj8m8k1Q_mq_93LFqwbOmSoFppyOdj140jA5IG10HqaCDSvh_HkhHDaqGQuEbUltBDA2zocr052fky9kRhciEDqBSR4EQsDojK4EPMwU6dct1JNqUuZ_HL8_VkDTpMfAlEiosFOmSkbjp5p7m1tQHGVHOzZME6bXEgdROgG6SzI06DdtITneImC500uSQeR8_GEmcBMvBAljSy1cXkFmVDx_L5H7avXm1bRkE3iz29ecvK2XZAoxnEAafuiXwhX6lUaOUCu4alcuEVfURZJBWJyRXDvyQUJ4176_w9kmk5LIcIZBqHH1Jfn2PZMfueORfIl85mwIsyLtAIL6hWdcvJN1XsmoBEDiVayLUcpsWghhiDLWeSEycWAzsjWTO0SVYKmXm0ztS21SGY_tmvInFNJiXrqB5U0F8ymxqz0bdo8SKtSEKv5fN5dQ49SBzjtHS90uDCx7kN3ImQ2Fwh_tJ_IXL9LOrE7QxK60xiNHHq88g2RmYNk_TWZYmky5_7xnVdx3YEL50KQ9Qv0tgmP21I1irZG5Eb6zn6wfWrpsFO30h0dXUuW7l__QqvXGnQjdiP_dB1QD90y4OuCNEsE8rH0m2QY7foFux8nDCSaCOFoHFzKEIgCzuOpYtYk6PIeV3sVoa1Lz3MesK0KR6uacnmPACZbqB_KJilcziMeLlpmHrgx3h8x0FvwBZcumb97J12njJrliCBpBupO0DI9IzU_7fRnON_NGOQTz3pQxA0jbFC_woFATpxEHRGRszGfpCYSIxGPVn5gR7BMMfSGYVfDVn4fHxQ8MIJhUKBEcMUAR8UFhkcXK2CDq7lW8hF_AW_I_WyyNPwKz8FPler1VwupzBdcav4a_qGQyqf_PQ6BSgNaSjHTGRFGugkQ0rmYNE0DQJb_oCFVy2uWtW9bGW1qzvsLzkwXCwjYMubnC8iYZiUGixnrUjGU8JcslojeRZ6HNeVh_M4OZUcxPQ4IWdv0ShR1qEMoes8T7R4cOQfT1d1CXNydgGAIYU5SPWQbMNsDMOK59Y3Nce2U664wikkLpwBSnnA_hiDi5YFVHKayWPGPctDG8jCPT72oqXRWjwe18NznYeNhkrKFT6ImwIBOA0CgCWTTMze2DQl_xgrfDnLHnxlLDI6GXa4HA2W8oMKN6BYLNbW1nI9_ID4kHNyoaQWeEawEyeXC6Vkkuogzi7I4zmGc_0ocCh7nfRFZe26tcuWdK1aAwmjBb4jdAuWsK4FsMvlogR6RumPCZOHIo6rk_svWe8ns0WFDIwSZngaxGmQQUifrsa_vo3ZyEm3MMI40iVSo11PTHdaSKNTgiD5rTmXgpJUZQ4z_ubq6_t9f8LESbN2222wDhrAiDejmNy5LHV4BsvVPGZWW2XxselxLlyDmv0sOVSFfA4DixFQKpVqamqUnOOJSNrEcXAtjkOooEKAA1_J1jUMBrRSauh31KxEi8hgjg8COtwM1s6oDccBF_VVrtEUBqf9JYMt5YfMzML_gjgyoVryJqal39u7dumSdUuWQpo5cexQk2wWFSFFAcJI9lAktxkQmlIJvEyTEv8YOnJFDE0kgBdURjOtjX2byblRva2nH4YfWblVkyGpdBjFPuSgRio9BrOOXLnQyy7U9ZYrU2fO2nLX3YX0LKeh9oFlAMMbvSTjygPMqoRsBKk7hrxgOC3GM1vNfiHxxJjgmtWvPHKADssboARg4moBHcYEPgM3IpUfqApXMY_JSkr_KmTnAhksxgBBQIeFViQpBdrAtdFyXVoEY3qB1Bdh2Nvb20Q2iBLeJO5Je3K3aHrFrxQsK65Uly_Yv27REqvqNdQUcA_pgInIhjDPE71q0HZvcZCY4_EAiWKYtvwQcTqoTKaRVpG_kXlIcz0Jm8tYVTZDUQkefbDvMnXMkFsnogx2nQJlFIcPOASad7oqlW22237y9tsT3ZHLRg3H3kyoDFFM1gIYDHzgKc5jrMi8GBtr5vN54FmuDPqVq1XiQX3gcWX6IlKlw8KDRIXUWUyGuHksn0TiOiOBh2txRGlAhiBzI4Yvt1ndEWoB50SS8QA6nuvScQpkGxHFKRP2LBWlZuuU3blq0cL_9vV10FOG5YR4wIpZcGj5jFxhIImeThGoKEzyrdg20vj2OpNCCWXKGYukEY6Wk8oL0hD3xr_sikYeuI3hbnYbQgbSbJRBVtTikS85cnG0vqaiib0O3Mtum5S4ktEkufllMrhZ0_LjaS6UN954A929xRZbNDc3MynZrIp4DmE4Ozo6Vq1atccee6A25jesyASbOXLgca_333579uzZu_22G0CD4_j7_PPPb9iwAb0MeVBXV4fLMX4HHHDApEmTFAKeeeaZJUuWHHLIIVOmTEELVeNfeeWVRYsWyRW1xNCBvJ122ulTn_rURx99tGLFis9_9rMs_MhMM02Ipeee_cvOO_8Mqfb4448XciSiuG240eTJk3fYYQc0QBdy8GPN7excsXCB6C01WXmIOMgUAjruRU42Ge2M5C5bclGmbuoa5w_HEF1kolEck5Ip2A_sJYFKaBkZXdfSpBk1Q3XJZ2VmqcyQjjm7XlLwiCMT8vyBWSI6cS_Kg_CWXhh5AaBvmbX5uL527332JhOdrEAbMhzQ0WRgbkA2vxaNhtchSqKwUJ599lkMTENDA2sECA8tU9T48TBsWnDclZMYAgODtNVWW7W0tLDuIJmeweL8_fNPOukkwOuaa6658847Dz74YBZL55xzzq677nreeedNnz597dq19fX1CxYswJFXX30VmEbfAzpf_9rXjj766Kuuuurdd99tampiAn7QQQdtueWWONje3g7cTJgw4Te__c13vvOdxYsX33fffffee_8777zD1hw3HledcMIJTzzxRGNj41e__tWn_vRkW1sbmg3gQmqiB_rq6xXUIBW1cjVHDl6zgBpAksGfXDc2dVokQ2qLPL4mpUrRtPYFR7F4wDWVqMqiXSe1YsVy_WfkkYlOHI5TATN5x0P2MAXJSTMmkimWQcyIw7eSm7tStUFYAsyRY_XrGxvbWiftugut2ZDbjFF0xXEk64o1I2OWcxbK5uuwxObCpMeM7OvrQ_9jyBkE_JknN_8Ftph4YngwNdHROBO8BLIK0gLHMSrr168H7CAtmEEzR8GcZiHEguf444__0pe_9F__9V___vWvv_KVr0BszJo1S0jJhA977bUX6oQAAHrwobu7G8Js2rRpK1euBLAAEQz81KlTgZgXX3wR56BVr732GqrCOdtDr0ut973vfe_MM84AGiAk1q1b9_TTT5tS5LBBgMdEq_ATHgHn9xX7MYq_66F5PT09EydO5K4BsSIYGLl1Hy023TBn2l7VdUzTBzVycn1_lbbKAZ5cvyafK3f3O4YdxCFkT2watrQYmNrDsgvl_jy0FvY5gIM2BGFAHME08BvMacck3w0j2LFtFoSc88MCNfEfAqMGEb5iuVJbX9dbKpo56OxcV38vZqirC9OxKmEAmTp7zuzGtinCMckRCI7MHhorzdExNA6xcOQejSWVDdGV2jdZ5j4SejDAaCXm_gcffHDqqafusssuUApZA5urALe46667Xn_9dXz99Kc_feyxx2YtaqYpy5YtQyUvvPACm0vss_Gq2OvT399_yimn4CDQA52y995777fffhASEBVsUr388ss___nPURuLQ5Y30CP4FXeETIIOWrNmzXHHHXf__ffjyHPPPcdsCVJq7ty5SlfiCNA2Y8YM5luoGbdGy4FsfFAeSLYPcEJrayvQgxMgzyAyA9clnQWJWC6Jzq5qZ29U8R0IY91E4z2X8kaNnONRRg5UAWzx0NKBGEcLPeHYgcYJwl5i9ZPkpVkaytV6cjgtcutGtHqC3H1SJLKIl6Eu0G_TrXqSNMkNLjg7MOYEHb2I3q6t6ylXzHy_q7_vIWe7mlZbVzu1tWXq9OlAFaY73QX8yknTLTI6LvHqaEnCm0QMUUC5RDHUDX2M0CH0sGb58MMPjzzySAwqH1WOO5E6bXkqoOt5civCwdYy_mK6YLSgQTCKd999d5YC4ydci0G94oorAJorr7zy_fffJ2OnqenEE0_89tprzz___F_84heQNMATPouMewboROWHHXYY7ghx8uSTT7KdBcxddtllp512GjANxP_2t7_F9sHkxpMDu3icSy65BCIHXQDRCIyi_couW758Odv80FxoA_7yA0K0QBpFeF7pg6b_tvKdy9YEZTev20mgwDQp_dgkQz0ql6WhBU2kQQKAhlFUQjdpvQLvSxEJ9iTJFb8xuaAx7YlhG3KFIHkEHSeny711KO3GltyANB_lIeqmxZSR0r8kjgJKq_cg8ABMA9w07_y1y86106aInC13dacoF0MC9676YV53BoFGpFwHwk8n56cmh5jCarZFXtMh9SaDZAj04CiwggE_4ogjMAfQ9dBK7G5Bh3IoYGMwxXHwFeer_Aa77PgnvjHUFqYvLidTMRVLfDmG_cILLwQlkhPbYjNq2223BYNG6wEgiD1Ujs8MPtwCNYD2QtkB3PiV0cyt2meffSCBUNVzskAD4jgu9GnjteDRRx8Fa8blUGdoG_tZFktA_a9_9SsAHZV861vfgrYFntBIkkWVKhRDU0Mj5Wt6vu763R1deaiHmjzteVzFdHcoXd2DkNcpadNyNOn5hcHmw_6CIvPJriIGpEmtIQczIJpiyVRgjDHUFgXWDblvD0EqhuUlbBOVAD7SJIto63aDPKuUuAjJY1HuhBlrYa4_F4i47Lp_HNbU5GqnTxW2RZLENHhjXBkl10DJhR35G93mA6AjpNsikgNHgjHZsCeSkiLxgMQZf8FwVMxkZEGh8FxH7_P0VSa3IrzAAUCGr_y_U_KHzVGROgwxDNApOI11Fr6qbdXOPvtsdikpHzT_wjjabrvtUAPwwR4g1MwKkSUQKDOkDrnXpBRk6x1nght94xvfYNfUUUcdxQ1TXnJuKgQhUIKW8_OgWshxJ5cDeeL59B__8R8wTyyT9uMnVxPnZEmLSXeMhW_929vT42A8dZvysnJ5Tao8mjOw50OIHIuWRsE4dsxq4Nv5nFcsy_wLmcmeemLYUuJNB_AvzGkcsKDOpJdRM0xgruoFZAyRgYZ7G6HMPCeBhy8gJuRUJN1ViaPeUn9NXQPm7_wddkD_Ctot1wMcgFtLDkq5Wsnn8raZE5vEHbJBCaAXDc0EHGGN2bFyuGcANJwWM5kZqHAmV8R9zTJG_YsZHAqGygZGDfhVOWxwPlht9n7obuW_Q_0grVAxoMPQGszNGbgKZIq7oELoSjKeyUNhsoXFnhLcV0k1Ppm_Mo75FlwnsMWPkLRQNp_rFdIbaeccnkJ0Le2kFNAmI1G0ZvkKiKUJ9Q1BX7ECrDiW4RCTiyO9Fiip_hhQK9b9KIQYiUy9q79Yo9dQ8nsopTX5ntm_TJFVSjsnY9yknZVpSwQDkKxUPTKrawuWHVfLFVwFYFJEjGLvsc_JYKgchBpkC6wuDoH05kmTZ87ZpmnqFE7mqnr00gCqOUxUBPfnppomCx3ycsnpzQOK_7ueS7FtP2C5wDonCZ4MpbYEay6RcdbhITmOzdamCjLw8OA0WmAoLQjGGf_lMJNIFSQffOutt2DCACL4CYoD9GLVqlUYVCgO_IrjQkomjB_DFY8BG3v16tWwegA1dhkAZLhwzpw5KhqKJjEte__99x5__HHcsaurC3IOliBqhtIEy2a7CZegfg6aMhZJIKGbLQvQAftetGQxjM358_e7ZApFFBWpkudp21mzcX5PV_ek2sbealDr2E6_puq5vucT1_UjoKbRqdW1mDYnxYg7RjnwP1y_FL2__zbbyQ2ZonSayWUutJCPJjoUSihfIAKDC__29PSt7VgHS3NCc7Nh2bSij8KoEjy4iLe5ELpMBfTp2fP5ZWtWWk11S9esqmrR_q5uCDzgb8ZWW8Kak4azW5sv1NfVkRVcrmy99ZYTJ7UNuW6abBrfX7xkCXqveUIrdWNnD0nrOdvw_BwSLoPRI6Q8R5dxFw8ZoGANwo44VM1DIrfz1BlASmYwYUJtaA3QBmSAmoAjQ8vgefbdd98DDjgANFZFyFEno4S1EkQCKrn99tsXLlzIrHbevHkwxTnUoJI9YKKDuACLIFJbb701EIMueOeddx555BHACGoOiphtctbCCW6kGx3T_x_vvvvHxx7F_cVyiTGH02oLNRjnwPM_WPiPvz_zHLQRNEtrbUNNbOy16_5zt9vWlTuiNNY22Hk9BwzL2FXZ810Kuprd5eJ7SxfCcNtl7vYyw9TSEvYgNx4gJ7CZbtFDsSvdNDzf7y71__Wll3xDbJfbFiabwTldeizXBNJqCE3mYND2zEYMUNRPaG7ZZsb6nq7Hn37q5VdfMe3c9BlbfOHoo1raJhZyuRXLlj326BMrli_H8wI64AOXXXbJsCMvCSsY54MPPtjesQGXfGrHnQ899FD27zN6RrfYRSr5BzmXs_kyqi6exxhjFXnIWnfZyAPOhAElpMpbsmQJk1bYU_rXQS1jIbfbbrsBRrDML774Ygz_Oeecs_eeew6y7x577DFY9WAz9957L_DFWozb8MILL1x__fWc_oPjLAi5nexzAv5u_eVtDzzwwJxt537lKyfustvOW2_1tfTrSpsiklaQH3auWPXAH_5fvGDRkoWLyHHlWHIvQLDpBi2ImhubQajRCT19vU5jDYR7xQiWd6xf2b7WNq2Fq1bOnbE16Zkghsxyyy7MbyDDyeVdvxowlTAtP45AwHsrpYqtPf3Gq92B99kDDl6zfOUWk6b0dfbW1zou6S1ds_VSteLrYupW07eeNbNuchtk0RbVyp4HHHDmmWeuXrvm6KOPxpDLdcri6C8cdchnDkYPvPjii_hPO2dNmTZVTTklAtjwpJBOrvCZzxzyyCOPQh4fd_yXvv71rw_yrcaEnlELPzKHDsTwDHzIwvyDw08QMyr1Z9gGSeOZn5M5Mp_MD79o0aJbbrkFEPz2t7_NmtVpfO1ee_0F2cY_N5UexCE8_AWJ_f73v__iCy_B7jvhpBPBNnwQ8ZBeC2KlCxhkuqUDI2v3HXeZ1DBxUkvbq2_8XvE9WihnOHU1DYJy9Oi9MkTPGxs6ij1awQxN_cPFi4Vp9Veqb7__wRbTZhDP6yvnDDvWI9POg_uWShW6kQNervlk3IDAQMjoLjnpxCtvvwWadNDeB_QUy7WNDf2QlzWFru5uSJ7WadOmz5oxAWa5LaObFppCEZVcIc9WbRJnlQwV3XXuuediukLSv_rqq3_7298OPPBAFYTh05Q5gq9PP_007M3DDz_8tNNOyyZUjbEMe_agAebcMTY3sgHUUQsQw6trobDY2lJMfIRb8_2yRiODAOoG2h0QgSEmJKSYF8udZsna2n___aHFOFCvsjjwa3t7O6Dz8ssvo5tOPfVUJ0_rnMjUktEemnNySR1ZSeXqokVLQJynT92isbH5Hx9_gFuj8bSVn2YErtdXLnuerxl6uVjKgbHl7XW9nUuXrap4QW2_fuGSpR2dvW2tuYof1mhmhdL9KP3IpMwT30f9YexHMcWkYNdLAYmPnue_9tabNflaUK6O3m7bskq93RPaWqdvPWPyjOmi1mYODOiIlMPiqXlWqE5jTwee97zzzsPsQsW33XYbWCAarzRJlgWD_T388MNTpkw566yzGDeDEkFHLZuBNbIIpOwZLtQ1ZGF_EgNCpFlg8cDcg2xhSo6OYB_jOo1RAsaDJwTRkVmYkdLQiuDvs88_OEH1FAtqoOq6664DdMCTLrnkInAOMrVgixmaL811GI62ZTO5XLtqzbq1HXnLrsvXTZwwcfLEyfU19RSZ6envLxbdItizm8e8J2riW3be1_J3__FBV2_vVrNmrly_Ih_rCxYvrqlr1C3bp_XieinghFqjHFbiINYphUuEGq2PqbqAE_19WqipqZTLjz71Jzz8vnvvO2niRNxxQlubqLGS_aWCCFpMpM5bnoEcaRFpao1KCYK6__xnP_vUU0999NFH0O_sgFUcg08GHXzooYdgedx6661tbW3MWTcLOmJk9Awy9yOVfqt2XRiDCssaaCKl2COcr8nNpln2iIytmHpFaZ8AWHPsq_Rz2NhWSajsomTHJq1y0jT04_PPPw9Nd8IJJ9ArPKIAaosSYqIw2eVP09nH43YVV65YU1vbSLzYhJqxt5u7XW2htlgswT7yPQ_mjww4BLC_nIZ6WD2Rpb374YfNTRO_9KXjb7rxZwDE_wsWzdn_U_W1DUXPNWXqIx677Aeh9MvppkwaBY4M04_jNWvXnnL6vLfffnddx3rA9Innntl2px333unAxOCm9_zR2yE16UQOojDbITzBsr2Ee_HBMX9AYl555RUcefLJJzGjQChVn_DX2traDz744He__93xxx_PXwWbYJ_g5uKSFRIse7LoGfK0QYXDSXz5cA7vbFE8l__lKuepBgsL4IAR98tf_vKiiy5SoOQzAR2_BTuOVaISphf6C_jBjEy2nWRXva6D2BK40WtSnnZ19fT29k_oa7Y0o75QXyjkdtxhN9errGvvLPaVUC2gDQXWVypBifT2umZtftmKJSvXrtn907tBR0_dPu29t991vWBtx4Z8XX1Pf29jfZMbBVHgWYYtLLKeqtWyG4BIUdANEki3TDTsu9_9Ltju66_9CTvg2p9c7zTUwuaoqc3xek4wZXQGAU_fGElgCc19y1KW8zZxkL3q0EdQ1t3d3ffccw_Qw0wZJ6Mr0F0333wzrrrkkkuUTgB0VKeNsYwVaywMOIM4K3tGpeWsO6Ik8BPz6I4KI453cqCUH49TmGGFch_dcccdUOenn346y3A0I7vuQmXWAnBvvvlmZ2cnzPuTTz5Zdk3ECQlyjxNqA_UDOeSxBYAqZbepqaUu3wCODOFBHDNXD5iRowt2eaRhsFvaJtWFXkNTw6p1aydPnXTfH_8Q6cEee_7W09_94847YE53l3vfeO_ttmlTtLzlaYGvh7R2yiT_HSyxqgisvFPfWAf05OvJAsWHuXNnX3PNNZdceilUCW5x_XeuvOmmm3bffXfbID6mpzmKylPPAXwUVybVq8BRnC5AwEGYY3_5y1_Ai___978_8sgjxxxzDHNWXIuvzz33HO4I4LIWY1t4s6AjRkaPIisiVVusKTbL5mLzh4WHilGMXPghlU_IAco9ctBBB2FSojswga699toPP_zwP__zPyGQSSqkua0iJUnoR3QK1NzKlSvxgcmjJnOKTdrzwoDmMnSLoCP39erv7O_o6GxtaqnN1dfYhcD1l69Y0dfTb9qWbuRMWwOPMXVr_tYz8xNt9Nz0Hbbs7ux55_23Z283_8TTT0YfLV_6_E9PPdlX6f_Hh_8devjn2ia3EaZ9h2Uhwdo2puRyIFOgGrEI13Su7unsyqMBsZg8edINN9xwxplf_3DBfEig887_JiTHYYd_zpTpOLypSkTaLxE_PEm4Pzm8w6pHcRf8BNGCvsIUAhY_85nPoNNwsKen50c__hEsD1gP7BxmV0g2IjnWwR3uBxXvEGk2O2pnm0vu9aLzpB8VDbhKBWLVwREED6fEV2RRQlWkKzTw97LLLlu9ejXM0YkTJz744IPg0RD7QFXWsFfp9_gA9c9pSTNnzmTcWKYT0jI52jQF_ssUJq_6A1ue0DbRMeyGhkaAZkNHB63_MvJRoEWGRrsIaFF_tfjuggV7TtqR3f6P__nx9u518_Y6iVZjGmLq9IkHHXLQHXfc1VvsXrF62Ze_fAwvD499uSRKEyoXHVODwjtuGU0q9ZV424K2ttYbb_zpWd84e_369XiQH_zgmkLO_cwBB9K_7j4FPixQe5mnwVML1iWPN8sknmBKG6CvYJmy_YUe_NnPfoYPOOcHP_gB7Nb__Z__4XCNku5K74_OmrRsns01YBFJhlOPLI2AG9Z6Y7kLOyQHGfYMVpZJ6JFbbrkFrHDBggU4jo4___yz582bd_WVVzIrFFICq_AfTlDoT1khoGN6Pk07C9TVi91qtbO9q1BbP6GhRYu11cvX9nX3BeDFTj5Xa5dLHpiLC_Fh65plF6vl9e19rZPqNVs89_xzVb960rwTS_XemppaM2d_7vOH3PzLn1c9_eHHH7nosgvRmu6unqbmRpHupcwrxWN6eRFJDkwSkHEyqSwdH7bZeub11_3wssu_tWLZ8oULPvreVVdZV1_z2y6702YGru9CmtbX8FOwvlYqe7j_hKEAPfXuu__efffd4MjQkviK3ps6dSrL6X_mbB56OCaa1V8jx2BFOpCKAo_FNWe1pDLa_W9vb2_jLHfddRdEzsMPP8wJhKBBb7_99k9_8pOtttqKDUORes9Zhqm4SrJuxAtgomuU8E6rcCDModdAZ1etWR2H8fqODpg_piHa13VMbJkWuwEUXFhxYw0qJO7u616xdlVdy5z5H7z39LN_3u_AfZtbWiK5ES7Y2i677LTjTjssWLBw5eoVj_zxkSOPPLKppZEeTEuyJeJkf0EKu4dx4EqJTvgWOoRuqVLeY9ddfvD9qy86_4I49JcsWXL55Zf_7Iab9thjdwrX1NWUSyVAmsUqnh1dkS6EHbqgc66__uojjjgCYuZ73_seLmlqajrnnHMUdLJukc0SPGJUb2FWfzEIlOwZS_4ZF_6dbHB_00hFtjB6mGuLjK3OncXqGR_gy2GC3XbbbZBtOAfoOe200_68884tt9xSBTeY_pB2KJXYh4RegywpFGw2ZHBw3dr14ArARD8ojm5tPXNr2FPLly6zTad2Qn1794ZyyW1paQKPDoQHY9sSek1tPl9j_PrXv97Q1THv1FPZaVQu9xcKdeBSxx133BVXXIHn_f399x3xhcPxQKl4SHKSk9115Bpon9NOLLNacXMFuVdLHO231z433njjueeeWylVQcNhXf7k_h_tuc9eEFGFmppEhsUxNBd7JUbWOOilr33taz__8Y_BOcAR5ioApMZxVB_KCGUzZA_jR_mpMd7SlYXZ0hgNLjZE2ceoiJda_Iei1r9eeumlO__884UXXghe3NLSAhJ9wQUXP
diff --git a/sca-java-2.x/branches/2.0-Beta3/samples/running-tuscany/running-tuscany.odt b/sca-java-2.x/branches/2.0-Beta3/samples/running-tuscany/running-tuscany.odt
new file mode 100644
index 0000000000..98ea7cc789
--- /dev/null
+++ b/sca-java-2.x/branches/2.0-Beta3/samples/running-tuscany/running-tuscany.odt
Binary files differ