From 2e0a5f4c1368993c8cf71b9f4b59273a323b9aff Mon Sep 17 00:00:00 2001 From: antelder Date: Thu, 28 Jul 2011 11:07:25 +0000 Subject: Recreate 2.0-Beta3 branch from current trunk git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@1151792 13f79535-47bb-0310-9956-ffa450edef68 --- sca-java-2.x/branches/2.0-Beta3/samples/README | 4 + .../2.0-Beta3/samples/applications/store/README | 28 ++ .../2.0-Beta3/samples/applications/store/build.xml | 82 ++++++ .../2.0-Beta3/samples/applications/store/pom.xml | 115 ++++++++ .../store/src/main/java/launch/Launch.java | 39 +++ .../store/src/main/java/services/Cart.java | 28 ++ .../store/src/main/java/services/Catalog.java | 27 ++ .../src/main/java/services/CurrencyConverter.java | 29 ++ .../main/java/services/CurrencyConverterImpl.java | 38 +++ .../src/main/java/services/FruitsCatalogImpl.java | 52 ++++ .../store/src/main/java/services/Item.java | 54 ++++ .../src/main/java/services/ShoppingCartImpl.java | 112 ++++++++ .../store/src/main/java/services/Total.java | 29 ++ .../store/src/main/resources/store.composite | 58 ++++ .../store/src/main/resources/uiservices/store.html | 162 +++++++++++ .../store/src/test/java/client/Shopper.java | 29 ++ .../store/src/test/java/client/ShopperImpl.java | 64 +++++ .../store/src/test/java/store/StoreTestCase.java | 121 ++++++++ .../src/test/resources/store-client.composite | 38 +++ .../2.0-Beta3/samples/applications/store/store.png | Bin 0 -> 15670 bytes .../2.0-Beta3/samples/applications/store/store.svg | 304 +++++++++++++++++++++ .../samples/getting-started/getting-started.odt | Bin 0 -> 11166 bytes .../samples/getting-started/getting-started.pdf | Bin 0 -> 28006 bytes .../getting-started/helloworld-jaxrs/README | 22 ++ .../getting-started/helloworld-jaxrs/pom.xml | 120 ++++++++ .../src/main/java/sample/Helloworld.java | 28 ++ .../src/main/java/sample/HelloworldImpl.java | 27 ++ .../src/main/java/sample/JaxrsHelloworld.java | 36 +++ .../main/resources/META-INF/sca-contribution.xml | 25 ++ .../src/main/resources/helloworld.composite | 33 +++ .../src/test/java/sample/HelloworldTestCase.java | 71 +++++ .../getting-started/helloworld-jsonp/README | 23 ++ .../getting-started/helloworld-jsonp/pom.xml | 113 ++++++++ .../src/main/java/sample/Helloworld.java | 28 ++ .../src/main/java/sample/HelloworldImpl.java | 27 ++ .../main/resources/META-INF/sca-contribution.xml | 25 ++ .../src/main/resources/helloworld.composite | 32 +++ .../src/test/java/sample/HelloworldTestCase.java | 74 +++++ .../getting-started/helloworld-jsonrpc/README | 27 ++ .../getting-started/helloworld-jsonrpc/pom.xml | 113 ++++++++ .../src/main/java/sample/Helloworld.java | 28 ++ .../src/main/java/sample/HelloworldImpl.java | 27 ++ .../main/resources/META-INF/sca-contribution.xml | 25 ++ .../src/main/resources/helloworld.composite | 32 +++ .../src/test/java/sample/HelloworldTestCase.java | 75 +++++ .../getting-started/helloworld-scaclient/README | 25 ++ .../getting-started/helloworld-scaclient/pom.xml | 121 ++++++++ .../src/main/java/sample/Helloworld.java | 28 ++ .../src/main/java/sample/HelloworldSCAClient.java | 45 +++ .../src/test/java/sample/HelloworldTestCase.java | 56 ++++ .../getting-started/helloworld-spring/README | 18 ++ .../getting-started/helloworld-spring/pom.xml | 106 +++++++ .../src/main/java/sample/Helloworld.java | 28 ++ .../src/main/java/sample/HelloworldImpl.java | 27 ++ .../main/resources/META-INF/sca-contribution.xml | 25 ++ .../src/main/resources/helloworld-context.xml | 27 ++ .../src/main/resources/helloworld.composite | 29 ++ .../src/test/java/sample/HelloworldTestCase.java | 48 ++++ .../getting-started/helloworld-webapp/README | 32 +++ .../getting-started/helloworld-webapp/pom.xml | 181 ++++++++++++ .../src/main/java/sample/Helloworld.java | 28 ++ .../src/main/webapp/WEB-INF/web.composite | 30 ++ .../src/main/webapp/WEB-INF/web.xml | 41 +++ .../helloworld-webapp/src/main/webapp/hello.jsp | 37 +++ .../src/test/java/itest/HelloworldTestCase.java | 53 ++++ .../src/test/resources/test-web.xml | 30 ++ .../getting-started/helloworld-webservice/README | 18 ++ .../getting-started/helloworld-webservice/pom.xml | 113 ++++++++ .../src/main/java/sample/Helloworld.java | 28 ++ .../src/main/java/sample/HelloworldImpl.java | 27 ++ .../main/resources/META-INF/sca-contribution.xml | 25 ++ .../src/main/resources/helloworld.composite | 32 +++ .../src/test/java/sample/HelloworldTestCase.java | 76 ++++++ .../getting-started/helloworld-withdeps/README | 35 +++ .../getting-started/helloworld-withdeps/pom.xml | 120 ++++++++ .../resources/META-INF/helloworld.composite | 29 ++ .../resources/META-INF/sca-contribution.xml | 25 ++ .../helloworld-withdeps/src/main/assembly/zip.xml | 41 +++ .../src/main/java/sample/Helloworld.java | 28 ++ .../src/main/java/sample/HelloworldImpl.java | 29 ++ .../src/test/java/sample/HelloworldTestCase.java | 49 ++++ .../samples/getting-started/helloworld/README | 43 +++ .../samples/getting-started/helloworld/pom.xml | 92 +++++++ .../src/main/java/sample/Helloworld.java | 28 ++ .../src/main/java/sample/HelloworldImpl.java | 27 ++ .../main/resources/META-INF/sca-contribution.xml | 25 ++ .../src/main/resources/helloworld.composite | 29 ++ .../src/test/java/sample/HelloworldTestCase.java | 48 ++++ .../2.0-Beta3/samples/getting-started/pom.xml | 45 +++ .../binding-comet/autocomplete-webapp/README | 79 ++++++ .../binding-comet/autocomplete-webapp/pom.xml | 82 ++++++ .../apache/tuscany/sca/sample/comet/Country.java | 40 +++ .../sca/sample/comet/CountryRepository.java | 30 ++ .../sca/sample/comet/CountryRepositoryImpl.java | 80 ++++++ .../tuscany/sca/sample/comet/CountryService.java | 30 ++ .../sca/sample/comet/CountryServiceImpl.java | 36 +++ .../src/main/resources/countries.txt | 211 ++++++++++++++ .../src/main/webapp/META-INF/MANIFEST.MF | 2 + .../src/main/webapp/WEB-INF/web.composite | 41 +++ .../src/main/webapp/WEB-INF/web.xml | 34 +++ .../autocomplete-webapp/src/main/webapp/index.html | 69 +++++ .../learning-more/binding-comet/chat-webapp/README | 99 +++++++ .../binding-comet/chat-webapp/pom.xml | 81 ++++++ .../tuscany/sca/sample/comet/ChatService.java | 36 +++ .../tuscany/sca/sample/comet/ChatServiceImpl.java | 56 ++++ .../src/main/webapp/META-INF/MANIFEST.MF | 2 + .../src/main/webapp/WEB-INF/web.composite | 37 +++ .../chat-webapp/src/main/webapp/WEB-INF/web.xml | 34 +++ .../chat-webapp/src/main/webapp/index.html | 109 ++++++++ .../samples/learning-more/binding-comet/pom.xml | 47 ++++ .../binding-comet/pubsub-webapp/README | 102 +++++++ .../binding-comet/pubsub-webapp/pom.xml | 81 ++++++ .../org/apache/tuscany/sca/sample/comet/Event.java | 51 ++++ .../tuscany/sca/sample/comet/EventProcessor.java | 107 ++++++++ .../comet/EventProcessorConsumerService.java | 37 +++ .../comet/EventProcessorProducerService.java | 28 ++ .../apache/tuscany/sca/sample/comet/Producer.java | 76 ++++++ .../src/main/webapp/META-INF/MANIFEST.MF | 2 + .../src/main/webapp/WEB-INF/web.composite | 63 +++++ .../pubsub-webapp/src/main/webapp/WEB-INF/web.xml | 34 +++ .../pubsub-webapp/src/main/webapp/index.html | 107 ++++++++ .../binding-comet/weather-webapp/README | 100 +++++++ .../binding-comet/weather-webapp/pom.xml | 74 +++++ .../apache/tuscany/sca/sample/comet/Helper.java | 34 +++ .../tuscany/sca/sample/comet/HumidityService.java | 35 +++ .../sca/sample/comet/PrecipitationService.java | 35 +++ .../sca/sample/comet/PrecipitationServiceImpl.java | 56 ++++ .../comet/TemperatureHumidityServiceImpl.java | 76 ++++++ .../sca/sample/comet/TemperatureService.java | 38 +++ .../tuscany/sca/sample/comet/model/Location.java | 43 +++ .../tuscany/sca/sample/comet/model/Response.java | 45 +++ .../src/main/webapp/META-INF/MANIFEST.MF | 2 + .../src/main/webapp/WEB-INF/web.composite | 58 ++++ .../weather-webapp/src/main/webapp/WEB-INF/web.xml | 34 +++ .../weather-webapp/src/main/webapp/index.html | 159 +++++++++++ .../binding-websocket/autocomplete-webapp/README | 67 +++++ .../binding-websocket/autocomplete-webapp/pom.xml | 61 +++++ .../src/main/java/sample/Country.java | 40 +++ .../src/main/java/sample/CountryRepository.java | 30 ++ .../main/java/sample/CountryRepositoryImpl.java | 80 ++++++ .../src/main/java/sample/CountryService.java | 30 ++ .../src/main/java/sample/CountryServiceImpl.java | 36 +++ .../src/main/resources/countries.txt | 211 ++++++++++++++ .../src/main/webapp/META-INF/MANIFEST.MF | 2 + .../src/main/webapp/WEB-INF/web.composite | 40 +++ .../src/main/webapp/WEB-INF/web.xml | 34 +++ .../autocomplete-webapp/src/main/webapp/index.html | 64 +++++ .../binding-websocket/chat-webapp/README | 88 ++++++ .../binding-websocket/chat-webapp/pom.xml | 67 +++++ .../src/main/java/sample/ChatService.java | 36 +++ .../src/main/java/sample/ChatServiceImpl.java | 58 ++++ .../src/main/webapp/META-INF/MANIFEST.MF | 2 + .../src/main/webapp/WEB-INF/web.composite | 37 +++ .../chat-webapp/src/main/webapp/WEB-INF/web.xml | 34 +++ .../chat-webapp/src/main/webapp/index.html | 99 +++++++ .../learning-more/binding-websocket/pom.xml | 47 ++++ .../binding-websocket/pubsub-webapp/README | 93 +++++++ .../binding-websocket/pubsub-webapp/pom.xml | 67 +++++ .../pubsub-webapp/src/main/java/sample/Event.java | 51 ++++ .../src/main/java/sample/EventProcessor.java | 104 +++++++ .../java/sample/EventProcessorConsumerService.java | 37 +++ .../java/sample/EventProcessorProducerService.java | 28 ++ .../src/main/java/sample/Producer.java | 75 +++++ .../src/main/webapp/META-INF/MANIFEST.MF | 2 + .../src/main/webapp/WEB-INF/web.composite | 60 ++++ .../pubsub-webapp/src/main/webapp/WEB-INF/web.xml | 34 +++ .../pubsub-webapp/src/main/webapp/index.html | 96 +++++++ .../binding-websocket/weather-webapp/README | 89 ++++++ .../binding-websocket/weather-webapp/pom.xml | 60 ++++ .../src/main/java/sample/Helper.java | 34 +++ .../src/main/java/sample/HumidityService.java | 36 +++ .../src/main/java/sample/PrecipitationService.java | 36 +++ .../main/java/sample/PrecipitationServiceImpl.java | 57 ++++ .../sample/TemperatureHumidityServiceImpl.java | 77 ++++++ .../src/main/java/sample/TemperatureService.java | 36 +++ .../src/main/java/sample/model/Location.java | 43 +++ .../src/main/java/sample/model/Response.java | 45 +++ .../src/main/webapp/META-INF/MANIFEST.MF | 2 + .../src/main/webapp/WEB-INF/web.composite | 57 ++++ .../weather-webapp/src/main/webapp/WEB-INF/web.xml | 34 +++ .../weather-webapp/src/main/webapp/index.html | 114 ++++++++ .../2.0-Beta3/samples/learning-more/pom.xml | 46 ++++ sca-java-2.x/branches/2.0-Beta3/samples/pom.xml | 40 +++ .../running-tuscany/calculator-contribution.jar | Bin 0 -> 11442 bytes .../running-tuscany/command-line/README.html | 41 +++ .../running-tuscany/command-line/README.odt | Bin 0 -> 15949 bytes .../samples/running-tuscany/eclipse/README.html | 38 +++ .../samples/running-tuscany/eclipse/README.odt | Bin 0 -> 13875 bytes .../samples/running-tuscany/junit/README.html | 39 +++ .../samples/running-tuscany/junit/README.odt | Bin 0 -> 12924 bytes .../samples/running-tuscany/junit/pom.xml | 50 ++++ .../main/java/calculator/CalculatorService.java | 38 +++ .../LaunchCalculatorContributionTestCase.java | 51 ++++ .../2.0-Beta3/samples/running-tuscany/pom.xml | 45 +++ .../samples/running-tuscany/running-tuscany.html | 50 ++++ .../samples/running-tuscany/running-tuscany.odt | Bin 0 -> 45492 bytes 196 files changed, 10131 insertions(+) create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/README create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/applications/store/README create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/applications/store/build.xml create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/applications/store/pom.xml create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/applications/store/src/main/java/launch/Launch.java create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/applications/store/src/main/java/services/Cart.java create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/applications/store/src/main/java/services/Catalog.java create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/applications/store/src/main/java/services/CurrencyConverter.java create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/applications/store/src/main/java/services/CurrencyConverterImpl.java create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/applications/store/src/main/java/services/FruitsCatalogImpl.java create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/applications/store/src/main/java/services/Item.java create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/applications/store/src/main/java/services/ShoppingCartImpl.java create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/applications/store/src/main/java/services/Total.java create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/applications/store/src/main/resources/store.composite create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/applications/store/src/main/resources/uiservices/store.html create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/applications/store/src/test/java/client/Shopper.java create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/applications/store/src/test/java/client/ShopperImpl.java create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/applications/store/src/test/java/store/StoreTestCase.java create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/applications/store/src/test/resources/store-client.composite create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/applications/store/store.png create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/applications/store/store.svg create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/getting-started/getting-started.odt create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/getting-started/getting-started.pdf create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-jaxrs/README create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-jaxrs/pom.xml create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-jaxrs/src/main/java/sample/Helloworld.java create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-jaxrs/src/main/java/sample/HelloworldImpl.java create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-jaxrs/src/main/java/sample/JaxrsHelloworld.java create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-jaxrs/src/main/resources/META-INF/sca-contribution.xml create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-jaxrs/src/main/resources/helloworld.composite create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-jaxrs/src/test/java/sample/HelloworldTestCase.java create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-jsonp/README create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-jsonp/pom.xml create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-jsonp/src/main/java/sample/Helloworld.java create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-jsonp/src/main/java/sample/HelloworldImpl.java create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-jsonp/src/main/resources/META-INF/sca-contribution.xml create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-jsonp/src/main/resources/helloworld.composite create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-jsonp/src/test/java/sample/HelloworldTestCase.java create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-jsonrpc/README create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-jsonrpc/pom.xml create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-jsonrpc/src/main/java/sample/Helloworld.java create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-jsonrpc/src/main/java/sample/HelloworldImpl.java create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-jsonrpc/src/main/resources/META-INF/sca-contribution.xml create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-jsonrpc/src/main/resources/helloworld.composite create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-jsonrpc/src/test/java/sample/HelloworldTestCase.java create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-scaclient/README create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-scaclient/pom.xml create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-scaclient/src/main/java/sample/Helloworld.java create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-scaclient/src/main/java/sample/HelloworldSCAClient.java create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-scaclient/src/test/java/sample/HelloworldTestCase.java create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-spring/README create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-spring/pom.xml create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-spring/src/main/java/sample/Helloworld.java create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-spring/src/main/java/sample/HelloworldImpl.java create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-spring/src/main/resources/META-INF/sca-contribution.xml create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-spring/src/main/resources/helloworld-context.xml create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-spring/src/main/resources/helloworld.composite create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-spring/src/test/java/sample/HelloworldTestCase.java create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-webapp/README create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-webapp/pom.xml create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-webapp/src/main/java/sample/Helloworld.java create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-webapp/src/main/webapp/WEB-INF/web.composite create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-webapp/src/main/webapp/WEB-INF/web.xml create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-webapp/src/main/webapp/hello.jsp create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-webapp/src/test/java/itest/HelloworldTestCase.java create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-webapp/src/test/resources/test-web.xml create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-webservice/README create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-webservice/pom.xml create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-webservice/src/main/java/sample/Helloworld.java create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-webservice/src/main/java/sample/HelloworldImpl.java create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-webservice/src/main/resources/META-INF/sca-contribution.xml create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-webservice/src/main/resources/helloworld.composite create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-webservice/src/test/java/sample/HelloworldTestCase.java create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-withdeps/README create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-withdeps/pom.xml create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-withdeps/src/main/assembly/resources/META-INF/helloworld.composite create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-withdeps/src/main/assembly/resources/META-INF/sca-contribution.xml create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-withdeps/src/main/assembly/zip.xml create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-withdeps/src/main/java/sample/Helloworld.java create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-withdeps/src/main/java/sample/HelloworldImpl.java create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld-withdeps/src/test/java/sample/HelloworldTestCase.java create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld/README create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld/pom.xml create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld/src/main/java/sample/Helloworld.java create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld/src/main/java/sample/HelloworldImpl.java create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld/src/main/resources/META-INF/sca-contribution.xml create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld/src/main/resources/helloworld.composite create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/getting-started/helloworld/src/test/java/sample/HelloworldTestCase.java create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/getting-started/pom.xml create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/autocomplete-webapp/README create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/autocomplete-webapp/pom.xml create mode 100644 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 create mode 100644 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 create mode 100644 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 create mode 100644 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 create mode 100644 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 create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/autocomplete-webapp/src/main/resources/countries.txt create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/autocomplete-webapp/src/main/webapp/META-INF/MANIFEST.MF create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/autocomplete-webapp/src/main/webapp/WEB-INF/web.composite create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/autocomplete-webapp/src/main/webapp/WEB-INF/web.xml create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/autocomplete-webapp/src/main/webapp/index.html create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/chat-webapp/README create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/chat-webapp/pom.xml create mode 100644 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 create mode 100644 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 create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/chat-webapp/src/main/webapp/META-INF/MANIFEST.MF create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/chat-webapp/src/main/webapp/WEB-INF/web.composite create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/chat-webapp/src/main/webapp/WEB-INF/web.xml create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/chat-webapp/src/main/webapp/index.html create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/pom.xml create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/pubsub-webapp/README create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/pubsub-webapp/pom.xml create mode 100644 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 create mode 100644 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 create mode 100644 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 create mode 100644 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 create mode 100644 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 create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/pubsub-webapp/src/main/webapp/META-INF/MANIFEST.MF create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/pubsub-webapp/src/main/webapp/WEB-INF/web.composite create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/pubsub-webapp/src/main/webapp/WEB-INF/web.xml create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/pubsub-webapp/src/main/webapp/index.html create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/weather-webapp/README create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/weather-webapp/pom.xml create mode 100644 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 create mode 100644 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 create mode 100644 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 create mode 100644 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 create mode 100644 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 create mode 100644 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 create mode 100644 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 create mode 100644 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 create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/weather-webapp/src/main/webapp/META-INF/MANIFEST.MF create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/weather-webapp/src/main/webapp/WEB-INF/web.composite create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/weather-webapp/src/main/webapp/WEB-INF/web.xml create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-comet/weather-webapp/src/main/webapp/index.html create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/autocomplete-webapp/README create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/autocomplete-webapp/pom.xml create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/autocomplete-webapp/src/main/java/sample/Country.java create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/autocomplete-webapp/src/main/java/sample/CountryRepository.java create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/autocomplete-webapp/src/main/java/sample/CountryRepositoryImpl.java create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/autocomplete-webapp/src/main/java/sample/CountryService.java create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/autocomplete-webapp/src/main/java/sample/CountryServiceImpl.java create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/autocomplete-webapp/src/main/resources/countries.txt create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/autocomplete-webapp/src/main/webapp/META-INF/MANIFEST.MF create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/autocomplete-webapp/src/main/webapp/WEB-INF/web.composite create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/autocomplete-webapp/src/main/webapp/WEB-INF/web.xml create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/autocomplete-webapp/src/main/webapp/index.html create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/chat-webapp/README create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/chat-webapp/pom.xml create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/chat-webapp/src/main/java/sample/ChatService.java create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/chat-webapp/src/main/java/sample/ChatServiceImpl.java create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/chat-webapp/src/main/webapp/META-INF/MANIFEST.MF create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/chat-webapp/src/main/webapp/WEB-INF/web.composite create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/chat-webapp/src/main/webapp/WEB-INF/web.xml create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/chat-webapp/src/main/webapp/index.html create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/pom.xml create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/pubsub-webapp/README create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/pubsub-webapp/pom.xml create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/pubsub-webapp/src/main/java/sample/Event.java create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/pubsub-webapp/src/main/java/sample/EventProcessor.java create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/pubsub-webapp/src/main/java/sample/EventProcessorConsumerService.java create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/pubsub-webapp/src/main/java/sample/EventProcessorProducerService.java create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/pubsub-webapp/src/main/java/sample/Producer.java create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/pubsub-webapp/src/main/webapp/META-INF/MANIFEST.MF create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/pubsub-webapp/src/main/webapp/WEB-INF/web.composite create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/pubsub-webapp/src/main/webapp/WEB-INF/web.xml create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/pubsub-webapp/src/main/webapp/index.html create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/weather-webapp/README create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/weather-webapp/pom.xml create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/weather-webapp/src/main/java/sample/Helper.java create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/weather-webapp/src/main/java/sample/HumidityService.java create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/weather-webapp/src/main/java/sample/PrecipitationService.java create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/weather-webapp/src/main/java/sample/PrecipitationServiceImpl.java create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/weather-webapp/src/main/java/sample/TemperatureHumidityServiceImpl.java create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/weather-webapp/src/main/java/sample/TemperatureService.java create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/weather-webapp/src/main/java/sample/model/Location.java create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/weather-webapp/src/main/java/sample/model/Response.java create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/weather-webapp/src/main/webapp/META-INF/MANIFEST.MF create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/weather-webapp/src/main/webapp/WEB-INF/web.composite create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/weather-webapp/src/main/webapp/WEB-INF/web.xml create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/learning-more/binding-websocket/weather-webapp/src/main/webapp/index.html create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/learning-more/pom.xml create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/pom.xml create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/running-tuscany/calculator-contribution.jar create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/running-tuscany/command-line/README.html create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/running-tuscany/command-line/README.odt create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/running-tuscany/eclipse/README.html create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/running-tuscany/eclipse/README.odt create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/running-tuscany/junit/README.html create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/running-tuscany/junit/README.odt create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/running-tuscany/junit/pom.xml create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/running-tuscany/junit/src/main/java/calculator/CalculatorService.java create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/running-tuscany/junit/src/test/java/launcher/LaunchCalculatorContributionTestCase.java create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/running-tuscany/pom.xml create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/running-tuscany/running-tuscany.html create mode 100644 sca-java-2.x/branches/2.0-Beta3/samples/running-tuscany/running-tuscany.odt (limited to 'sca-java-2.x/branches/2.0-Beta3/samples') 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 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 @@ + + + + 4.0.0 + + org.apache.tuscany.sca.samples + tuscany-samples + 2.0-Beta3-SNAPSHOT + ../../pom.xml + + sample-store + Apache Tuscany SCA Sample Getting Started Online Store + + + + org.apache.tuscany.sca + tuscany-base-runtime-pom + 2.0-Beta3-SNAPSHOT + pom + + + org.apache.tuscany.sca + tuscany-data-api + 2.0-Beta3-SNAPSHOT + + + org.apache.tuscany.sca + tuscany-binding-atom-runtime + 2.0-Beta3-SNAPSHOT + + + org.apache.tuscany.sca + tuscany-binding-http-runtime + 2.0-Beta3-SNAPSHOT + + + org.apache.tuscany.sca + tuscany-binding-jsonrpc-runtime + 2.0-Beta3-SNAPSHOT + + + org.apache.tuscany.sca + tuscany-implementation-widget-runtime + 2.0-Beta3-SNAPSHOT + + + org.apache.tuscany.sca + tuscany-implementation-widget-runtime-dojo + 2.0-Beta3-SNAPSHOT + + + org.apache.tuscany.sca + tuscany-web-javascript-dojo + 2.0-Beta3-SNAPSHOT + + + org.mortbay.jetty + jetty + 6.1.19 + test + + + net.sourceforge.htmlunit + htmlunit + 2.6 + test + + + junit + junit + 4.8.1 + test + + + + + ${project.artifactId} + + + org.codehaus.mojo + exec-maven-plugin + 1.1.1 + + + + java + + + + + test + store.StoreTestCase + + + + + + 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 { + +} 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 catalog = new ArrayList(); + + @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 cart; + + @Init + public void init() { + cart = new HashMap(); + } + + public Entry[] getAll() { + Entry[] entries = new Entry[cart.size()]; + int i = 0; + for (Map.Entry e: cart.entrySet()) { + entries[i++] = new Entry(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[] query(String queryString) { + List> entries = new ArrayList>(); + if (queryString.startsWith("name=")) { + String name = queryString.substring(5); + for (Map.Entry e: cart.entrySet()) { + Item item = e.getValue(); + if (item.getName().equals(name)) { + entries.add(new Entry(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 @@ + + + + + + + + + + + + + + + + + USD + + + + + + + + + + + + + + + + + + + + + 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 @@ + + + +Store + + + + + + + + + +

Store

+
+

Catalog

+
+
+
+ +
+ +
+ +

Your Shopping Cart

+
+
+
+
+
+ + + (feed) +
+
+ + 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 @@ + + + + + + + + + + + + + + + + + + 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 Binary files /dev/null and b/sca-java-2.x/branches/2.0-Beta3/samples/applications/store/store.png 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 @@ + + + + + + + + + + image/svg+xml + + + + + + + + store + ufs + + ShoppingCart + + CurrencyConverter + + + + + + + + + + CurrenyCode HTTP JSONRPC Atom + + Catalog + + + + 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 Binary files /dev/null and b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/getting-started.odt 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 Binary files /dev/null and b/sca-java-2.x/branches/2.0-Beta3/samples/getting-started/getting-started.pdf 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 @@ + + + + 4.0.0 + + + org.apache.tuscany.sca.samples + tuscany-samples + 2.0-Beta3-SNAPSHOT + + + helloworld-jaxrs + 2.0-Beta3-SNAPSHOT + + Apache Tuscany SCA Samples Helloworld JAX-RS + + + ${project.version} + + + + + apache.snapshots + Apache Snapshot Repository + http://repository.apache.org/snapshots + false + + + apache.snapshots + Apache Snapshot Repository + http://repository.apache.org/snapshots + false + + + + + + org.apache.tuscany.sca + tuscany-sca-api + ${tuscany.version} + provided + + + + javax.ws.rs + jsr311-api + 1.1.1 + provided + + + + junit + junit + 4.8.1 + test + + + + org.apache.tuscany.sca + tuscany-base-runtime + ${tuscany.version} + test + + + + org.apache.tuscany.sca + tuscany-binding-rest-runtime + ${tuscany.version} + test + + + + org.mortbay.jetty + jetty + 6.1.26 + test + + + + + + + + + + + org.apache.tuscany.sca + tuscany-maven-plugin + ${tuscany.version} + + + org.apache.tuscany.sca + tuscany-binding-rest-runtime + ${tuscany.version} + + + + + + + + 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 @@ + + + + + + + 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 @@ + + + + + + + + + + + + + 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 @@ + + + + 4.0.0 + + + org.apache.tuscany.sca.samples + tuscany-samples + 2.0-Beta3-SNAPSHOT + + + + helloworld-jsonp + 2.0-Beta3-SNAPSHOT + + Apache Tuscany SCA Samples Helloworld JSONP + + + ${project.version} + + + + + apache.snapshots + Apache Snapshot Repository + http://repository.apache.org/snapshots + false + + + apache.snapshots + Apache Snapshot Repository + http://repository.apache.org/snapshots + false + + + + + + org.apache.tuscany.sca + tuscany-sca-api + ${tuscany.version} + provided + + + + junit + junit + 4.8.1 + test + + + + org.apache.tuscany.sca + tuscany-base-runtime + ${tuscany.version} + test + + + + org.apache.tuscany.sca + tuscany-binding-jsonp-runtime + ${tuscany.version} + test + + + org.mortbay.jetty + jetty + 6.1.26 + test + + + + + + + + + + + org.apache.tuscany.sca + tuscany-maven-plugin + ${tuscany.version} + + + org.apache.tuscany.sca + tuscany-binding-jsonp-runtime + ${tuscany.version} + + + + + + + + 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 @@ + + + + + + + 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 @@ + + + + + + + + + + + + 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¶ms=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 @@ + + + + 4.0.0 + + + org.apache.tuscany.sca.samples + tuscany-samples + 2.0-Beta3-SNAPSHOT + + + + helloworld-jsonrpc + 2.0-Beta3-SNAPSHOT + + Apache Tuscany SCA Samples Helloworld JSON-RPC + + + ${project.version} + + + + + apache.snapshots + Apache Snapshot Repository + http://repository.apache.org/snapshots + false + + + apache.snapshots + Apache Snapshot Repository + http://repository.apache.org/snapshots + false + + + + + + org.apache.tuscany.sca + tuscany-sca-api + ${tuscany.version} + provided + + + + junit + junit + 4.8.1 + test + + + + org.apache.tuscany.sca + tuscany-base-runtime + ${tuscany.version} + test + + + + org.apache.tuscany.sca + tuscany-binding-jsonrpc-runtime + ${tuscany.version} + test + + + org.mortbay.jetty + jetty + 6.1.26 + test + + + + + + + + + + + org.apache.tuscany.sca + tuscany-maven-plugin + ${tuscany.version} + + + org.apache.tuscany.sca + tuscany-binding-jsonrpc-runtime + ${tuscany.version} + + + + + + + + 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 @@ + + + + + + + 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 @@ + + + + + + + + + + + + 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¶ms=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 @@ + + + + 4.0.0 + + + org.apache.tuscany.sca.samples + tuscany-samples + 2.0-Beta3-SNAPSHOT + + + + helloworld-scaclient + 2.0-Beta3-SNAPSHOT + + Apache Tuscany SCA Samples Helloworld SCAClient + + + ${project.version} + + + + + apache.snapshots + Apache Snapshot Repository + http://repository.apache.org/snapshots + false + + + apache.snapshots + Apache Snapshot Repository + http://repository.apache.org/snapshots + false + + + + + + org.apache.tuscany.sca + tuscany-sca-api + ${tuscany.version} + provided + + + + junit + junit + 4.8.1 + test + + + + org.apache.tuscany.sca + tuscany-base-runtime + ${tuscany.version} + test + + + + + org.apache.tuscany.sca + tuscany-domain-hazelcast + ${tuscany.version} + test + + + + + + + + + + + org.apache.tuscany.sca + tuscany-maven-plugin + ${tuscany.version} + + sample.HelloworldSCAClient + + + + + + org.codehaus.mojo + exec-maven-plugin + 1.1.1 + + + + java + + + + + sample.HelloworldSCAClient + test + + + + + + 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 + +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 @@ + + + + 4.0.0 + + + org.apache.tuscany.sca.samples + tuscany-samples + 2.0-Beta3-SNAPSHOT + + + helloworld-spring + 2.0-Beta3-SNAPSHOT + + Apache Tuscany SCA Samples Helloworld Spring + + + ${project.version} + + + + + apache.snapshots + Apache Snapshot Repository + http://repository.apache.org/snapshots + false + + + apache.snapshots + Apache Snapshot Repository + http://repository.apache.org/snapshots + false + + + + + + org.apache.tuscany.sca + tuscany-sca-api + ${tuscany.version} + provided + + + + junit + junit + 4.8.1 + test + + + + org.apache.tuscany.sca + tuscany-base-runtime + ${tuscany.version} + test + + + + org.apache.tuscany.sca + tuscany-implementation-spring-runtime + ${tuscany.version} + test + + + + + + + + + + + org.apache.tuscany.sca + tuscany-maven-plugin + ${tuscany.version} + + + org.apache.tuscany.sca + tuscany-implementation-spring-runtime + ${tuscany.version} + + + + + + + + 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 @@ + + + + + + + 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 @@ + + + + + + + + + + \ 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 @@ + + + + + + + + + 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-.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 @@ + + + + 4.0.0 + + + org.apache.tuscany.sca.samples + tuscany-samples + 2.0-Beta3-SNAPSHOT + + + + helloworld-webapp + 2.0-Beta3-SNAPSHOT + + Apache Tuscany SCA Samples Helloworld WebApp + war + + + ${project.version} + + + + + apache.snapshots + Apache Snapshot Repository + http://repository.apache.org/snapshots + false + + + apache.snapshots + Apache Snapshot Repository + http://repository.apache.org/snapshots + false + + + + + + org.apache.tuscany.sca + tuscany-base-runtime + ${tuscany.version} + + + + junit + junit + 4.8.1 + test + + + + net.sourceforge.htmlunit + htmlunit + 2.6 + test + + + xalan + xalan + + + + + + + xalan + xalan + 2.7.0 + test + + + xml-apis + xml-apis + + + + + + + + + + + + org.apache.maven.plugins + maven-dependency-plugin + + + copy + compile + + copy + + + + + org.apache.tuscany.sca.samples + helloworld + ${project.version} + + src/main/webapp/WEB-INF/sca-contributions + + + + + + + + + + org.apache.tuscany.sca + tuscany-maven-plugin + ${tuscany.version} + + + + + org.mortbay.jetty + maven-jetty-plugin + 6.1.26 + + helloworld-webapp + foo + 9999 + + + + start-jetty + process-test-classes + + run + + + 0 + true + + + 8085 + + + + + + stop-jetty + prepare-package + + stop + + + + + + + + org.codehaus.mojo + tomcat-maven-plugin + 1.1 + + + + + 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 @@ + + + + + + + + + + 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 @@ + + + + + Apache Tuscany Helloworld Sample + + + tuscany + org.apache.tuscany.sca.host.webapp.TuscanyServletFilter + + + + tuscany + /* + + + + hello.jsp + + + 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 @@ + + +<%@ page contentType="text/html;charset=UTF-8" language="java" %> +<%@ taglib uri="http://www.osoa.org/sca/sca_jsp.tld" prefix="sca" %> + + + + + + +

Apache Tuscany Helloworld JSP Sample

+ + Calling HelloworldService sayHello("world") returns: + +

+ + <%= service.sayHello("world") %> + + + 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 @@ + + + + + + org.apache.tuscany.sca.config + uri:default?bind=127.0.0.1:54321 + + + 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 @@ + + + + 4.0.0 + + + org.apache.tuscany.sca.samples + tuscany-samples + 2.0-Beta3-SNAPSHOT + + + + helloworld-webservice + 2.0-Beta3-SNAPSHOT + + Apache Tuscany SCA Samples Helloworld Web Service + + + ${project.version} + + + + + apache.snapshots + Apache Snapshot Repository + http://repository.apache.org/snapshots + false + + + apache.snapshots + Apache Snapshot Repository + http://repository.apache.org/snapshots + false + + + + + + org.apache.tuscany.sca + tuscany-sca-api + ${tuscany.version} + provided + + + + junit + junit + 4.8.1 + test + + + + org.apache.tuscany.sca + tuscany-base-runtime + ${tuscany.version} + test + + + + org.apache.tuscany.sca + tuscany-binding-ws-runtime-axis2 + ${tuscany.version} + test + + + org.mortbay.jetty + jetty + 6.1.26 + test + + + + + + + + + + + org.apache.tuscany.sca + tuscany-maven-plugin + ${tuscany.version} + + + org.apache.tuscany.sca + tuscany-binding-ws-runtime-axis2 + ${tuscany.version} + + + + + + + + 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 @@ + + + + + + + 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 @@ + + + + + + + + + + + + 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 @@ + + + + 4.0.0 + + + org.apache.tuscany.sca.samples + tuscany-samples + 2.0-Beta3-SNAPSHOT + + + helloworld-withdeps + 2.0-Beta3-SNAPSHOT + + Apache Tuscany SCA Samples Helloworld With Dependencies + + + ${project.version} + + + + + apache.snapshots + Apache Snapshot Repository + http://repository.apache.org/snapshots + false + + + apache.snapshots + Apache Snapshot Repository + http://repository.apache.org/snapshots + false + + + + + + org.apache.tuscany.sca + tuscany-sca-api + ${tuscany.version} + provided + + + + org.apache.commons + commons-lang3 + 3.0 + + + + junit + junit + 4.8.1 + test + + + + org.apache.tuscany.sca + tuscany-base-runtime + ${tuscany.version} + test + + + + + + + + + + org.apache.maven.plugins + maven-assembly-plugin + 2.2.1 + + + zip + package + + single + + + false + + src/main/assembly/zip.xml + + + + + + + + + org.apache.tuscany.sca + tuscany-maven-plugin + ${tuscany.version} + + + + + + + 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 @@ + + + + + + + + + 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 @@ + + + + + + + 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 @@ + + + + zip + false + + + zip + + + + + src/main/assembly/resources + . + + + + + + lib + + + + 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 @@ + + + + 4.0.0 + + + org.apache.tuscany.sca.samples + tuscany-samples + 2.0-Beta3-SNAPSHOT + + + helloworld + 2.0-Beta3-SNAPSHOT + + Apache Tuscany SCA Samples Helloworld + + + ${project.version} + + + + + apache.snapshots + Apache Snapshot Repository + http://repository.apache.org/snapshots + false + + + apache.snapshots + Apache Snapshot Repository + http://repository.apache.org/snapshots + false + + + + + + org.apache.tuscany.sca + tuscany-sca-api + ${tuscany.version} + provided + + + + junit + junit + 4.8.1 + test + + + + org.apache.tuscany.sca + tuscany-base-runtime + ${tuscany.version} + test + + + + + + + + + + + org.apache.tuscany.sca + tuscany-maven-plugin + ${tuscany.version} + + + + + + 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 @@ + + + + + + + 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 @@ + + + + + + + + + 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 @@ + + + + 4.0.0 + + org.apache.tuscany.sca.samples + tuscany-samples + 2.0-Beta3-SNAPSHOT + + + tuscany-samples-getting-started + 2.0-Beta3-SNAPSHOT + pom + Apache Tuscany SCA Samples Getting Started + + + helloworld + helloworld-jaxrs + helloworld-jsonp + helloworld-jsonrpc + helloworld-scaclient + helloworld-spring + helloworld-webapp + helloworld-webservice + helloworld-withdeps + + + 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 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: + + +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..(, 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 @@ + + + + 4.0.0 + + org.apache.tuscany.sca.samples + tuscany-samples-binding-comet + 2.0-Beta3-SNAPSHOT + ../pom.xml + + + sample-binding-comet-autocomplete-webapp + war + 2.0-Beta3-SNAPSHOT + Apache Tuscany SCA Sample binding.comet Real-Time Suggestions Webapp + + + + org.apache.tuscany.sca + tuscany-binding-comet-runtime + 2.0-Beta3-SNAPSHOT + + + javax + javaee-web-api + 6.0 + provided + + + org.apache.tuscany.sca + tuscany-base-runtime-pom + 2.0-Beta3-SNAPSHOT + pom + compile + + + com.google.guava + guava + r09 + jar + compile + + + + + + + com.googlecode.t7mp + maven-t7-plugin + 0.9.6 + + + + org.apache.tuscany.sca.samples + sample-binding-comet-autocomplete-webapp + 2.0-Beta3-SNAPSHOT + + + + + + + + + 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 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 countries; + + @Constructor + public CountryRepositoryImpl(@Property(name = "fileName") String fileName) { + this.fileName = fileName; + countries = new ArrayList(); + } + + @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 findStartingWith(String text) { + List result = new ArrayList(); + 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 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 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 @@ + + + + + + + + + + + + + + + + countries.txt + + + \ 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 @@ + + + + Apache Tuscany Stock Comet Sample + + tuscany + org.apache.tuscany.sca.host.webapp.TuscanyServletFilter + true + + + tuscany + /* + + + index.html + + \ 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 @@ + + + + Apache Tuscany Comet Sample + + + + + + +

Apache Tuscany Comet Sample

+

Real-time suggestions

+ + + + + +
Enter a country name
+ +
+
+ + 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 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: + + + + + + +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: + + +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..(, 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 @@ + + + + 4.0.0 + + org.apache.tuscany.sca.samples + tuscany-samples-binding-comet + 2.0-Beta3-SNAPSHOT + ../pom.xml + + + sample-binding-comet-chat-webapp + war + 2.0-Beta3-SNAPSHOT + Apache Tuscany SCA Sample binding.comet Chat Webapp + + + + org.apache.tuscany.sca + tuscany-binding-comet-runtime + 2.0-Beta3-SNAPSHOT + + + javax + javaee-web-api + 6.0 + provided + + + org.apache.tuscany.sca + tuscany-base-runtime-pom + 2.0-Beta3-SNAPSHOT + pom + compile + + + com.google.guava + guava + r09 + jar + compile + + + + + + + com.googlecode.t7mp + maven-t7-plugin + 0.9.6 + + + + org.apache.tuscany.sca.samples + sample-binding-comet-chat-webapp + 2.0-Beta3-SNAPSHOT + + + + + + + + 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 clients = new CopyOnWriteArrayList(); + + @Override + public void postMessage(String user, String message) { + for (CometCallback callback : new ArrayList(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(). 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 @@ + + + + + + + + + + + + + + + + \ 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 @@ + + + + Apache Tuscany Stock Comet Sample + + tuscany + org.apache.tuscany.sca.host.webapp.TuscanyServletFilter + true + + + tuscany + /* + + + index.html + + \ 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 @@ + + + + Apache Tuscany Comet Sample + + + + + + +

Apache Tuscany Comet Sample

+

Chat

+

+

+ + + + + + +
Nickname
+
+
+

Server notifications

+ + + + + + +
+
+ + 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 @@ + + + + 4.0.0 + + org.apache.tuscany.sca.samples + tuscany-samples-learning-more + 2.0-Beta3-SNAPSHOT + ../pom.xml + + + tuscany-samples-binding-comet + pom + Apache Tuscany SCA Sample binding.comet + + + + default + + true + + + autocomplete-webapp + weather-webapp + pubsub-webapp + chat-webapp + + + + 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 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: + + + + + + +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: + + +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..(, 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 @@ + + + + 4.0.0 + + org.apache.tuscany.sca.samples + tuscany-samples-binding-comet + 2.0-Beta3-SNAPSHOT + ../pom.xml + + + sample-binding-comet-pubsub-webapp + war + 2.0-Beta3-SNAPSHOT + Apache Tuscany SCA Sample binding.comet PubSub Webapp + + + + org.apache.tuscany.sca + tuscany-binding-comet-runtime + 2.0-Beta3-SNAPSHOT + + + javax + javaee-web-api + 6.0 + provided + + + org.apache.tuscany.sca + tuscany-base-runtime-pom + 2.0-Beta3-SNAPSHOT + pom + compile + + + com.google.guava + guava + r09 + jar + compile + + + + + + + com.googlecode.t7mp + maven-t7-plugin + 0.9.6 + + + + org.apache.tuscany.sca.samples + sample-binding-comet-pubsub-webapp + 2.0-Beta3-SNAPSHOT + + + + + + + + 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 clients = new ConcurrentHashMap(); + private Multimap eventListeners = Multimaps.synchronizedMultimap(HashMultimap + . create()); + + @Override + public void onEvent(String eventName, String eventData) { + // System.out.println("EventProcessor: Received event " + eventName + + // "..."); + List destinations = new ArrayList(); + 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 @@ + + + + + + + + + + + + + + + + + + + + + + SLOW + 6000 + + + + + + MODERATE + 3000 + + + + + + FAST + 1000 + + + \ 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 @@ + + + + Apache Tuscany Stock Comet Sample + + tuscany + org.apache.tuscany.sca.host.webapp.TuscanyServletFilter + true + + + tuscany + /* + + + index.html + + \ 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 @@ + + + + Apache Tuscany Comet Sample + + + + + + + + + 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 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: + + + + + + +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: + + +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..(, 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 @@ + + + + 4.0.0 + + org.apache.tuscany.sca.samples + tuscany-samples-binding-comet + 2.0-Beta3-SNAPSHOT + ../pom.xml + + + sample-binding-comet-weather-webapp + war + 2.0-Beta3-SNAPSHOT + Apache Tuscany SCA Sample binding.comet Weather Monitor Webapp + + + + org.apache.tuscany.sca + tuscany-binding-comet-runtime + 2.0-Beta3-SNAPSHOT + + + javax + javaee-web-api + 6.0 + provided + + + org.apache.tuscany.sca + tuscany-base-runtime-pom + 2.0-Beta3-SNAPSHOT + pom + compile + + + + + + + com.googlecode.t7mp + maven-t7-plugin + 0.9.6 + + + + org.apache.tuscany.sca.samples + sample-binding-comet-weather-webapp + 2.0-Beta3-SNAPSHOT + + + + + + + + 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 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ 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 @@ + + + + Apache Tuscany Stock Comet Sample + + tuscany + org.apache.tuscany.sca.host.webapp.TuscanyServletFilter + true + + + tuscany + /* + + + index.html + + \ 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 @@ + + + + Apache Tuscany Comet Sample + + + + + + + + + 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 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: + + +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...(); + +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....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 @@ + + + + 4.0.0 + + org.apache.tuscany.sca.samples + tuscany-samples-binding-websocket + 2.0-Beta3-SNAPSHOT + ../pom.xml + + + sample-binding-websocket-autocomplete-webapp + war + 2.0-Beta3-SNAPSHOT + Apache Tuscany SCA Sample binding.websocket Autocomplete Webapp + + + + org.apache.tuscany.sca + tuscany-binding-websocket + 2.0-Beta3-SNAPSHOT + + + org.apache.tuscany.sca + tuscany-base-runtime-pom + 2.0-Beta3-SNAPSHOT + pom + compile + + + + + + + org.mortbay.jetty + maven-jetty-plugin + 6.1.26 + + + + + + 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 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 countries; + + @Constructor + public CountryRepositoryImpl(@Property(name = "fileName") String fileName) { + this.fileName = fileName; + countries = new ArrayList(); + } + + @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 findStartingWith(String text) { + List result = new ArrayList(); + 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 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 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 @@ + + + + + + + + + + + + + + + + countries.txt + + + \ 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 @@ + + + + Apache Tuscany Stock Comet Sample + + tuscany + org.apache.tuscany.sca.host.webapp.TuscanyServletFilter + true + + + tuscany + /* + + + index.html + + \ 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 @@ + + + + Apache Tuscany Websocket Sample + + + + + +

Apache Tuscany Websocket Sample

+

Real-time suggestions

+ + + + + +
Enter a country name
+ +
+
+ + 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 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: + + + + + + + +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: + + +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...(); + +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....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 @@ + + + + 4.0.0 + + org.apache.tuscany.sca.samples + tuscany-samples-binding-websocket + 2.0-Beta3-SNAPSHOT + ../pom.xml + + + sample-binding-websocket-chat-webapp + war + 2.0-Beta3-SNAPSHOT + Apache Tuscany SCA Sample binding.websocket Chat Webapp + + + + org.apache.tuscany.sca + tuscany-binding-websocket + 2.0-Beta3-SNAPSHOT + + + org.apache.tuscany.sca + tuscany-base-runtime-pom + 2.0-Beta3-SNAPSHOT + pom + compile + + + com.google.guava + guava + r09 + jar + compile + + + + + + + org.mortbay.jetty + maven-jetty-plugin + 6.1.26 + + + + + + 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 clients = new CopyOnWriteArrayList(); + + @Override + public void postMessage(String user, String message) { + for (WebsocketBindingCallback callback : new ArrayList(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(). 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 @@ + + + + + + + + + + + + + + + + \ 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 @@ + + + + Apache Tuscany Stock Comet Sample + + tuscany + org.apache.tuscany.sca.host.webapp.TuscanyServletFilter + true + + + tuscany + /* + + + index.html + + \ 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 @@ + + + + Apache Tuscany Websocket Sample + + + + + +

Apache Tuscany Comet Sample

+

Chat

+

+

+ + + + + + +
Nickname
+
+
+

Server notifications

+ + + + + + +
+
+ + 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 @@ + + + + 4.0.0 + + org.apache.tuscany.sca.samples + tuscany-samples-learning-more + 2.0-Beta3-SNAPSHOT + ../pom.xml + + + tuscany-samples-binding-websocket + pom + Apache Tuscany SCA Sample binding.websocket + + + + default + + true + + + autocomplete-webapp + weather-webapp + chat-webapp + pubsub-webapp + + + + 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 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: + + + + + + + +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: + + +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...(); + +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....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 @@ + + + + 4.0.0 + + org.apache.tuscany.sca.samples + tuscany-samples-binding-websocket + 2.0-Beta3-SNAPSHOT + ../pom.xml + + + sample-binding-websocket-pubsub-webapp + war + 2.0-Beta3-SNAPSHOT + Apache Tuscany SCA Sample binding.websocket PubSub Webapp + + + + org.apache.tuscany.sca + tuscany-binding-websocket + 2.0-Beta3-SNAPSHOT + + + org.apache.tuscany.sca + tuscany-base-runtime-pom + 2.0-Beta3-SNAPSHOT + pom + compile + + + com.google.guava + guava + r09 + jar + compile + + + + + + + org.mortbay.jetty + maven-jetty-plugin + 6.1.26 + + + + + + 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 clients = new ConcurrentHashMap(); + private Multimap eventListeners = Multimaps.synchronizedMultimap(HashMultimap. create()); + + @Override + public void onEvent(String eventName, String eventData) { + List destinations = new ArrayList(); + 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 @@ + + + + + + + + + + + + + + + + + + + + + + SLOW + 6000 + + + + + + MODERATE + 3000 + + + + + + FAST + 1000 + + + \ 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 @@ + + + + Apache Tuscany Stock Comet Sample + + tuscany + org.apache.tuscany.sca.host.webapp.TuscanyServletFilter + true + + + tuscany + /* + + + index.html + + \ 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 @@ + + + + Apache Tuscany Websocket Sample + + + + + +

Apache Tuscany Websocket Sample

+

PubSub for FAST, MODERATE and SLOW events

+

+ + + + + + + + + + + +
Event name + +
Event name + +
+

Server notifications

+ + + 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 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: + + + + + + + +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: + + +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...(); + +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....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 @@ + + + + 4.0.0 + + org.apache.tuscany.sca.samples + tuscany-samples-binding-websocket + 2.0-Beta3-SNAPSHOT + ../pom.xml + + + sample-binding-websocket-weather-webapp + war + 2.0-Beta3-SNAPSHOT + Apache Tuscany SCA Sample binding.websocket Weather Monitor Webapp + + + + org.apache.tuscany.sca + tuscany-binding-websocket + 2.0-Beta3-SNAPSHOT + + + org.apache.tuscany.sca + tuscany-base-runtime-pom + 2.0-Beta3-SNAPSHOT + pom + compile + + + + + + + org.mortbay.jetty + maven-jetty-plugin + 6.1.26 + + + + + + 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 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 @@ + + + + Apache Tuscany Stock Comet Sample + + tuscany + org.apache.tuscany.sca.host.webapp.TuscanyServletFilter + true + + + tuscany + /* + + + index.html + + \ 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 @@ + + + + Apache Tuscany Websocket Sample + + + + + + + + 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 @@ + + + + 4.0.0 + + org.apache.tuscany.sca.samples + tuscany-samples + 2.0-Beta3-SNAPSHOT + ../pom.xml + + + tuscany-samples-learning-more + 2.0-Beta3-SNAPSHOT + pom + Apache Tuscany SCA Learning More + + + + default + + true + + + binding-comet + binding-websocket + + + + 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 @@ + + + + 4.0.0 + + org.apache.tuscany.sca + tuscany-sca + 2.0-Beta3-SNAPSHOT + + + org.apache.tuscany.sca.samples + tuscany-samples + 2.0-Beta3-SNAPSHOT + pom + Apache Tuscany SCA Samples + + + getting-started + running-tuscany + learning-more + + + 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 Binary files /dev/null and b/sca-java-2.x/branches/2.0-Beta3/samples/running-tuscany/calculator-contribution.jar 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 @@ + + + +- no title specified

Running contributions using the Tuscany Shell

 

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.

 

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

 

  bin/tuscany.bat location_of_contribution

 

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;

 

on Windows:

 

  bin\tuscany.bat samples\getting-started\helloworld

 

on Linux:

 

  bin/tuscany.sh samples/getting-started/helloworld

 

Once the Shell has 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

 

TODO – add more instructions on how to use the shell

\ 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 Binary files /dev/null and b/sca-java-2.x/branches/2.0-Beta3/samples/running-tuscany/command-line/README.odt 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 @@ + + + +- no title specified

Running contributions inside Eclipse

 

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

 

http://tuscany.apache.org/import-existing-tuscany-sca-projects-into-eclipse.html

 

Note. these instructions refer to our 1.x code base but it holds true for our 2.x code base.

 

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.

\ 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 Binary files /dev/null and b/sca-java-2.x/branches/2.0-Beta3/samples/running-tuscany/eclipse/README.odt 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 @@ + + + +- no title specified

Running the Tuscany runtime from JUnit

 

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:

 

   launcher.LaunchCalculatorContributionTestCase.java

 

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:

 

cd junit

mvn

 

TODO – should we provide run-sample scripts. If so we need to ship JUnit or provide instructions on how to install it?

\ 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 Binary files /dev/null and b/sca-java-2.x/branches/2.0-Beta3/samples/running-tuscany/junit/README.odt 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 @@ + + + + 4.0.0 + + org.apache.tuscany.sca.samples + tuscany-samples-running-tuscany + 2.0-Beta3-SNAPSHOT + ../pom.xml + + junit + Apache Tuscany SCA Samples JUnit + + + + org.apache.tuscany.sca + tuscany-base-runtime + 2.0-Beta3-SNAPSHOT + + + + junit + junit + 4.8.1 + test + + + + + + ${project.artifactId} + + 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 @@ + + + + 4.0.0 + + org.apache.tuscany.sca.samples + tuscany-samples + 2.0-Beta3-SNAPSHOT + + + + tuscany-samples-running-tuscany + 2.0-Beta3-SNAPSHOT + pom + Apache Tuscany SCA Samples Running Tuscany + + + + default + + true + + + junit + + + + 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 @@ + + + +- no title specified