From e5b7380c874745c989d1816b8f552504f038e1bc Mon Sep 17 00:00:00 2001 From: lresende Date: Thu, 26 Sep 2013 20:33:20 +0000 Subject: 2.0 branch for possible maintenance release git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@1526672 13f79535-47bb-0310-9956-ffa450edef68 --- sca-java-2.x/branches/2.0/samples/README | 19 ++ .../branches/2.0/samples/applications/pom.xml | 45 +++ .../branches/2.0/samples/applications/store/README | 29 ++ .../2.0/samples/applications/store/build.xml | 82 ++++++ .../2.0/samples/applications/store/pom.xml | 120 ++++++++ .../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 | 55 ++++ .../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 | 120 ++++++++ .../src/test/resources/store-client.composite | 38 +++ .../2.0/samples/applications/store/store.png | Bin 0 -> 15670 bytes .../2.0/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/cors.html | 41 +++ .../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 | 77 ++++++ .../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 | 126 +++++++++ .../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 | 22 ++ .../getting-started/helloworld-withdeps/node.xml | 27 ++ .../getting-started/helloworld-withdeps/pom.xml | 123 +++++++++ .../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 ++++ .../2.0/samples/getting-started/helloworld/README | 43 +++ .../2.0/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 ++++ .../branches/2.0/samples/getting-started/pom.xml | 45 +++ .../samples/learning-more/async-invocation/pom.xml | 79 ++++++ .../java/calculator/CalculateReferenceAsync.java | 57 ++++ .../java/calculator/CalculatorAsyncHandler.java | 36 +++ .../src/main/java/calculator/CalculatorClient.java | 52 ++++ .../calculator/CalculatorPrintAsyncHandler.java | 36 +++ .../java/calculator/CalculatorServiceAsync.java | 34 +++ .../calculator/CalculatorServiceAsyncImpl.java | 41 +++ .../calculator/CalculatorServiceProxyImpl.java | 128 +++++++++ .../java/calculator/CalculatorServiceSync.java | 31 +++ .../java/calculator/CalculatorServiceSyncImpl.java | 38 +++ .../src/main/resources/Calculator.composite | 43 +++ .../src/main/resources/CalculatorClient.composite | 30 ++ .../main/resources/META-INF/sca-contribution.xml | 24 ++ .../test/java/calculator/CalculatorTestCase.java | 63 +++++ .../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 ++++++++ .../contribution-osgi/META-INF/MANIFEST.MF | 19 ++ .../learning-more/contribution-osgi/README.html | 59 ++++ .../learning-more/contribution-osgi/README.odt | Bin 0 -> 13539 bytes .../learning-more/contribution-osgi/pom.xml | 95 +++++++ .../src/main/java/calculator/AddService.java | 28 ++ .../src/main/java/calculator/AddServiceImpl.java | 35 +++ .../main/java/calculator/CalculatorActivator.java | 47 ++++ .../src/main/java/calculator/CalculatorClient.java | 62 +++++ .../main/java/calculator/CalculatorService.java | 35 +++ .../java/calculator/CalculatorServiceImpl.java | 69 +++++ .../src/main/java/calculator/DivideService.java | 28 ++ .../main/java/calculator/DivideServiceImpl.java | 35 +++ .../src/main/java/calculator/MultiplyService.java | 28 ++ .../main/java/calculator/MultiplyServiceImpl.java | 35 +++ .../src/main/java/calculator/SubtractService.java | 28 ++ .../main/java/calculator/SubtractServiceImpl.java | 35 +++ .../src/main/resources/Calculator.composite | 56 ++++ .../test/java/calculator/CalculatorTestCase.java | 49 ++++ .../calculator-bundle/LICENSE | 205 ++++++++++++++ .../calculator-bundle/META-INF/MANIFEST.MF | 23 ++ .../calculator-bundle/NOTICE | 6 + .../OSGI-INF/blueprint/calculator-module.xml | 43 +++ .../OSGI-INF/calculator-component.xml | 36 +++ .../calculator-service-descriptions.xml | 73 +++++ .../OSGI-INF/sca-config/calculator-config.xml | 32 +++ .../calculator-bundle/README | 6 + .../calculator-bundle/dosgi-calculator.png | Bin 0 -> 85103 bytes .../calculator-bundle/pom.xml | 153 +++++++++++ .../java/calculator/dosgi/CalculatorService.java | 36 +++ .../calculator/dosgi/impl/CalculatorActivator.java | 78 ++++++ .../dosgi/impl/CalculatorServiceDSImpl.java | 114 ++++++++ .../dosgi/impl/CalculatorServiceImpl.java | 99 +++++++ .../calculator/dosgi/operations/AddService.java | 31 +++ .../calculator/dosgi/operations/DivideService.java | 31 +++ .../dosgi/operations/MultiplyService.java | 31 +++ .../dosgi/operations/SubtractService.java | 31 +++ .../java/calculator/rmi/OperationsRMIServer.java | 93 +++++++ .../calculator/rmi/OperationsRMIServer_Stub.java | 132 +++++++++ .../main/java/calculator/rmi/OperationsRemote.java | 37 +++ .../java/calculator/dosgi/test/CalculatorNode.java | 43 +++ .../dosgi/test/CalculatorOSGiNodeTestCase.java | 144 ++++++++++ .../java/calculator/dosgi/test/OSGiTestUtils.java | 105 +++++++ .../operations-bundle/LICENSE | 205 ++++++++++++++ .../operations-bundle/META-INF/MANIFEST.MF | 23 ++ .../operations-bundle/NOTICE | 6 + .../operations-bundle/OSGI-INF/add-component.xml | 25 ++ .../OSGI-INF/blueprint/operations-module.xml | 40 +++ .../OSGI-INF/divide-component.xml | 25 ++ .../OSGI-INF/multiply-component.xml | 25 ++ .../OSGI-INF/sca-config/operations-config.xml | 29 ++ .../OSGI-INF/subtract-component.xml | 25 ++ .../operations-bundle/README | 6 + .../operations-bundle/pom.xml | 159 +++++++++++ .../calculator/dosgi/operations/AddService.java | 31 +++ .../calculator/dosgi/operations/DivideService.java | 31 +++ .../dosgi/operations/MultiplyService.java | 31 +++ .../dosgi/operations/SubtractService.java | 31 +++ .../dosgi/operations/impl/AddServiceImpl.java | 37 +++ .../dosgi/operations/impl/DivideServiceImpl.java | 37 +++ .../dosgi/operations/impl/MultiplyServiceImpl.java | 37 +++ .../dosgi/operations/impl/OperationsActivator.java | 94 +++++++ .../dosgi/operations/impl/SubtractServiceImpl.java | 37 +++ .../dosgi/operations/test/OSGiTestUtils.java | 105 +++++++ .../dosgi/operations/test/OperationsNode.java | 43 +++ .../test/OperationsOSGiNodeTestCase.java | 104 +++++++ .../learning-more/distributed-osgi-dynamic/pom.xml | 44 +++ .../distributed-osgi-static/README.odt | Bin 0 -> 99272 bytes .../calculator-bundle/META-INF/MANIFEST.MF | 20 ++ .../OSGI-INF/blueprint/calculator-module.xml | 43 +++ .../OSGI-INF/calculator-component.xml | 36 +++ .../OSGI-INF/sca/bundle.componentType | 64 +++++ .../OSGI-INF/sca/bundle.composite | 45 +++ .../calculator-bundle/pom.xml | 153 +++++++++++ .../java/calculator/dosgi/CalculatorService.java | 36 +++ .../calculator/dosgi/impl/CalculatorActivator.java | 76 ++++++ .../dosgi/impl/CalculatorServiceDSImpl.java | 114 ++++++++ .../dosgi/impl/CalculatorServiceImpl.java | 105 +++++++ .../calculator/dosgi/operations/AddService.java | 31 +++ .../calculator/dosgi/operations/DivideService.java | 31 +++ .../dosgi/operations/MultiplyService.java | 31 +++ .../dosgi/operations/SubtractService.java | 31 +++ .../java/calculator/rmi/OperationsRMIServer.java | 93 +++++++ .../calculator/rmi/OperationsRMIServer_Stub.java | 132 +++++++++ .../main/java/calculator/rmi/OperationsRemote.java | 37 +++ .../main/resources/META-INF/sca-contribution.xml | 24 ++ .../java/calculator/dosgi/test/CalculatorNode.java | 43 +++ .../dosgi/test/CalculatorOSGiNodeTestCase.java | 152 +++++++++++ .../java/calculator/dosgi/test/OSGiTestUtils.java | 105 +++++++ .../operations-bundle/META-INF/MANIFEST.MF | 22 ++ .../operations-bundle/OSGI-INF/add-component.xml | 25 ++ .../OSGI-INF/blueprint/operations-module.xml | 40 +++ .../OSGI-INF/divide-component.xml | 25 ++ .../OSGI-INF/multiply-component.xml | 25 ++ .../OSGI-INF/sca/bundle.componentType | 54 ++++ .../OSGI-INF/sca/bundle.composite | 43 +++ .../OSGI-INF/subtract-component.xml | 25 ++ .../operations-bundle/pom.xml | 161 +++++++++++ .../calculator/dosgi/operations/AddService.java | 31 +++ .../calculator/dosgi/operations/DivideService.java | 31 +++ .../dosgi/operations/MultiplyService.java | 31 +++ .../dosgi/operations/SubtractService.java | 31 +++ .../dosgi/operations/impl/AddServiceImpl.java | 37 +++ .../dosgi/operations/impl/DivideServiceImpl.java | 37 +++ .../dosgi/operations/impl/MultiplyServiceImpl.java | 37 +++ .../dosgi/operations/impl/OperationsActivator.java | 88 ++++++ .../dosgi/operations/impl/SubtractServiceImpl.java | 37 +++ .../main/resources/META-INF/sca-contribution.xml | 23 ++ .../dosgi/operations/test/OSGiTestUtils.java | 105 +++++++ .../dosgi/operations/test/OperationsNode.java | 43 +++ .../test/OperationsOSGiNodeTestCase.java | 105 +++++++ .../learning-more/distributed-osgi-static/pom.xml | 44 +++ .../branches/2.0/samples/learning-more/pom.xml | 49 ++++ sca-java-2.x/branches/2.0/samples/pom.xml | 41 +++ .../2.0/samples/running-tuscany/ant/README.html | 47 ++++ .../2.0/samples/running-tuscany/ant/README.odt | Bin 0 -> 16886 bytes .../2.0/samples/running-tuscany/ant/build.xml | 83 ++++++ .../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 +++ .../2.0/samples/running-tuscany/eclipse/README.odt | Bin 0 -> 13875 bytes .../2.0/samples/running-tuscany/jse/README.html | 41 +++ .../2.0/samples/running-tuscany/jse/README.odt | Bin 0 -> 17390 bytes .../2.0/samples/running-tuscany/jse/pom.xml | 50 ++++ .../2.0/samples/running-tuscany/jse/run-sample.bat | 18 ++ .../2.0/samples/running-tuscany/jse/run-sample.sh | 19 ++ .../main/java/calculator/CalculatorService.java | 38 +++ .../launcher/LaunchCalculatorContribution.java | 60 ++++ .../src/test/java/launcher/LauncherTestCase.java | 33 +++ .../2.0/samples/running-tuscany/junit/README.html | 39 +++ .../2.0/samples/running-tuscany/junit/README.odt | Bin 0 -> 12924 bytes .../2.0/samples/running-tuscany/junit/pom.xml | 50 ++++ .../main/java/calculator/CalculatorService.java | 38 +++ .../LaunchCalculatorContributionTestCase.java | 51 ++++ .../2.0/samples/running-tuscany/osgi/README.html | 88 ++++++ .../2.0/samples/running-tuscany/osgi/README.odt | Bin 0 -> 15611 bytes .../branches/2.0/samples/running-tuscany/pom.xml | 46 ++++ .../samples/running-tuscany/running-tuscany.html | 128 +++++++++ .../samples/running-tuscany/running-tuscany.odt | Bin 0 -> 46251 bytes .../running-tuscany_html_m65f05d55.png | Bin 0 -> 17992 bytes 338 files changed, 17575 insertions(+) create mode 100644 sca-java-2.x/branches/2.0/samples/README create mode 100644 sca-java-2.x/branches/2.0/samples/applications/pom.xml create mode 100644 sca-java-2.x/branches/2.0/samples/applications/store/README create mode 100644 sca-java-2.x/branches/2.0/samples/applications/store/build.xml create mode 100644 sca-java-2.x/branches/2.0/samples/applications/store/pom.xml create mode 100644 sca-java-2.x/branches/2.0/samples/applications/store/src/main/java/launch/Launch.java create mode 100644 sca-java-2.x/branches/2.0/samples/applications/store/src/main/java/services/Cart.java create mode 100644 sca-java-2.x/branches/2.0/samples/applications/store/src/main/java/services/Catalog.java create mode 100644 sca-java-2.x/branches/2.0/samples/applications/store/src/main/java/services/CurrencyConverter.java create mode 100644 sca-java-2.x/branches/2.0/samples/applications/store/src/main/java/services/CurrencyConverterImpl.java create mode 100644 sca-java-2.x/branches/2.0/samples/applications/store/src/main/java/services/FruitsCatalogImpl.java create mode 100644 sca-java-2.x/branches/2.0/samples/applications/store/src/main/java/services/Item.java create mode 100644 sca-java-2.x/branches/2.0/samples/applications/store/src/main/java/services/ShoppingCartImpl.java create mode 100644 sca-java-2.x/branches/2.0/samples/applications/store/src/main/java/services/Total.java create mode 100644 sca-java-2.x/branches/2.0/samples/applications/store/src/main/resources/store.composite create mode 100644 sca-java-2.x/branches/2.0/samples/applications/store/src/main/resources/uiservices/store.html create mode 100644 sca-java-2.x/branches/2.0/samples/applications/store/src/test/java/client/Shopper.java create mode 100644 sca-java-2.x/branches/2.0/samples/applications/store/src/test/java/client/ShopperImpl.java create mode 100644 sca-java-2.x/branches/2.0/samples/applications/store/src/test/java/store/StoreTestCase.java create mode 100644 sca-java-2.x/branches/2.0/samples/applications/store/src/test/resources/store-client.composite create mode 100644 sca-java-2.x/branches/2.0/samples/applications/store/store.png create mode 100644 sca-java-2.x/branches/2.0/samples/applications/store/store.svg create mode 100644 sca-java-2.x/branches/2.0/samples/getting-started/getting-started.odt create mode 100644 sca-java-2.x/branches/2.0/samples/getting-started/getting-started.pdf create mode 100644 sca-java-2.x/branches/2.0/samples/getting-started/helloworld-jaxrs/README create mode 100644 sca-java-2.x/branches/2.0/samples/getting-started/helloworld-jaxrs/cors.html create mode 100644 sca-java-2.x/branches/2.0/samples/getting-started/helloworld-jaxrs/pom.xml create mode 100644 sca-java-2.x/branches/2.0/samples/getting-started/helloworld-jaxrs/src/main/java/sample/Helloworld.java create mode 100644 sca-java-2.x/branches/2.0/samples/getting-started/helloworld-jaxrs/src/main/java/sample/HelloworldImpl.java create mode 100644 sca-java-2.x/branches/2.0/samples/getting-started/helloworld-jaxrs/src/main/java/sample/JaxrsHelloworld.java create mode 100644 sca-java-2.x/branches/2.0/samples/getting-started/helloworld-jaxrs/src/main/resources/META-INF/sca-contribution.xml create mode 100644 sca-java-2.x/branches/2.0/samples/getting-started/helloworld-jaxrs/src/main/resources/helloworld.composite create mode 100644 sca-java-2.x/branches/2.0/samples/getting-started/helloworld-jaxrs/src/test/java/sample/HelloworldTestCase.java create mode 100644 sca-java-2.x/branches/2.0/samples/getting-started/helloworld-jsonp/README create mode 100644 sca-java-2.x/branches/2.0/samples/getting-started/helloworld-jsonp/pom.xml create mode 100644 sca-java-2.x/branches/2.0/samples/getting-started/helloworld-jsonp/src/main/java/sample/Helloworld.java create mode 100644 sca-java-2.x/branches/2.0/samples/getting-started/helloworld-jsonp/src/main/java/sample/HelloworldImpl.java create mode 100644 sca-java-2.x/branches/2.0/samples/getting-started/helloworld-jsonp/src/main/resources/META-INF/sca-contribution.xml create mode 100644 sca-java-2.x/branches/2.0/samples/getting-started/helloworld-jsonp/src/main/resources/helloworld.composite create mode 100644 sca-java-2.x/branches/2.0/samples/getting-started/helloworld-jsonp/src/test/java/sample/HelloworldTestCase.java create mode 100644 sca-java-2.x/branches/2.0/samples/getting-started/helloworld-jsonrpc/README create mode 100644 sca-java-2.x/branches/2.0/samples/getting-started/helloworld-jsonrpc/pom.xml create mode 100644 sca-java-2.x/branches/2.0/samples/getting-started/helloworld-jsonrpc/src/main/java/sample/Helloworld.java create mode 100644 sca-java-2.x/branches/2.0/samples/getting-started/helloworld-jsonrpc/src/main/java/sample/HelloworldImpl.java create mode 100644 sca-java-2.x/branches/2.0/samples/getting-started/helloworld-jsonrpc/src/main/resources/META-INF/sca-contribution.xml create mode 100644 sca-java-2.x/branches/2.0/samples/getting-started/helloworld-jsonrpc/src/main/resources/helloworld.composite create mode 100644 sca-java-2.x/branches/2.0/samples/getting-started/helloworld-jsonrpc/src/test/java/sample/HelloworldTestCase.java create mode 100644 sca-java-2.x/branches/2.0/samples/getting-started/helloworld-scaclient/README create mode 100644 sca-java-2.x/branches/2.0/samples/getting-started/helloworld-scaclient/pom.xml create mode 100644 sca-java-2.x/branches/2.0/samples/getting-started/helloworld-scaclient/src/main/java/sample/Helloworld.java create mode 100644 sca-java-2.x/branches/2.0/samples/getting-started/helloworld-scaclient/src/main/java/sample/HelloworldSCAClient.java create mode 100644 sca-java-2.x/branches/2.0/samples/getting-started/helloworld-scaclient/src/test/java/sample/HelloworldTestCase.java create mode 100644 sca-java-2.x/branches/2.0/samples/getting-started/helloworld-spring/README create mode 100644 sca-java-2.x/branches/2.0/samples/getting-started/helloworld-spring/pom.xml create mode 100644 sca-java-2.x/branches/2.0/samples/getting-started/helloworld-spring/src/main/java/sample/Helloworld.java create mode 100644 sca-java-2.x/branches/2.0/samples/getting-started/helloworld-spring/src/main/java/sample/HelloworldImpl.java create mode 100644 sca-java-2.x/branches/2.0/samples/getting-started/helloworld-spring/src/main/resources/META-INF/sca-contribution.xml create mode 100644 sca-java-2.x/branches/2.0/samples/getting-started/helloworld-spring/src/main/resources/helloworld-context.xml create mode 100644 sca-java-2.x/branches/2.0/samples/getting-started/helloworld-spring/src/main/resources/helloworld.composite create mode 100644 sca-java-2.x/branches/2.0/samples/getting-started/helloworld-spring/src/test/java/sample/HelloworldTestCase.java create mode 100644 sca-java-2.x/branches/2.0/samples/getting-started/helloworld-webapp/README create mode 100644 sca-java-2.x/branches/2.0/samples/getting-started/helloworld-webapp/pom.xml create mode 100644 sca-java-2.x/branches/2.0/samples/getting-started/helloworld-webapp/src/main/java/sample/Helloworld.java create mode 100644 sca-java-2.x/branches/2.0/samples/getting-started/helloworld-webapp/src/main/webapp/WEB-INF/web.composite create mode 100644 sca-java-2.x/branches/2.0/samples/getting-started/helloworld-webapp/src/main/webapp/WEB-INF/web.xml create mode 100644 sca-java-2.x/branches/2.0/samples/getting-started/helloworld-webapp/src/main/webapp/hello.jsp create mode 100644 sca-java-2.x/branches/2.0/samples/getting-started/helloworld-webapp/src/test/java/itest/HelloworldTestCase.java create mode 100644 sca-java-2.x/branches/2.0/samples/getting-started/helloworld-webapp/src/test/resources/test-web.xml create mode 100644 sca-java-2.x/branches/2.0/samples/getting-started/helloworld-webservice/README create mode 100644 sca-java-2.x/branches/2.0/samples/getting-started/helloworld-webservice/pom.xml create mode 100644 sca-java-2.x/branches/2.0/samples/getting-started/helloworld-webservice/src/main/java/sample/Helloworld.java create mode 100644 sca-java-2.x/branches/2.0/samples/getting-started/helloworld-webservice/src/main/java/sample/HelloworldImpl.java create mode 100644 sca-java-2.x/branches/2.0/samples/getting-started/helloworld-webservice/src/main/resources/META-INF/sca-contribution.xml create mode 100644 sca-java-2.x/branches/2.0/samples/getting-started/helloworld-webservice/src/main/resources/helloworld.composite create mode 100644 sca-java-2.x/branches/2.0/samples/getting-started/helloworld-webservice/src/test/java/sample/HelloworldTestCase.java create mode 100644 sca-java-2.x/branches/2.0/samples/getting-started/helloworld-withdeps/README create mode 100644 sca-java-2.x/branches/2.0/samples/getting-started/helloworld-withdeps/node.xml create mode 100644 sca-java-2.x/branches/2.0/samples/getting-started/helloworld-withdeps/pom.xml create mode 100644 sca-java-2.x/branches/2.0/samples/getting-started/helloworld-withdeps/src/main/assembly/resources/META-INF/helloworld.composite create mode 100644 sca-java-2.x/branches/2.0/samples/getting-started/helloworld-withdeps/src/main/assembly/resources/META-INF/sca-contribution.xml create mode 100644 sca-java-2.x/branches/2.0/samples/getting-started/helloworld-withdeps/src/main/assembly/zip.xml create mode 100644 sca-java-2.x/branches/2.0/samples/getting-started/helloworld-withdeps/src/main/java/sample/Helloworld.java create mode 100644 sca-java-2.x/branches/2.0/samples/getting-started/helloworld-withdeps/src/main/java/sample/HelloworldImpl.java create mode 100644 sca-java-2.x/branches/2.0/samples/getting-started/helloworld-withdeps/src/test/java/sample/HelloworldTestCase.java create mode 100644 sca-java-2.x/branches/2.0/samples/getting-started/helloworld/README create mode 100644 sca-java-2.x/branches/2.0/samples/getting-started/helloworld/pom.xml create mode 100644 sca-java-2.x/branches/2.0/samples/getting-started/helloworld/src/main/java/sample/Helloworld.java create mode 100644 sca-java-2.x/branches/2.0/samples/getting-started/helloworld/src/main/java/sample/HelloworldImpl.java create mode 100644 sca-java-2.x/branches/2.0/samples/getting-started/helloworld/src/main/resources/META-INF/sca-contribution.xml create mode 100644 sca-java-2.x/branches/2.0/samples/getting-started/helloworld/src/main/resources/helloworld.composite create mode 100644 sca-java-2.x/branches/2.0/samples/getting-started/helloworld/src/test/java/sample/HelloworldTestCase.java create mode 100644 sca-java-2.x/branches/2.0/samples/getting-started/pom.xml create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/async-invocation/pom.xml create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/async-invocation/src/main/java/calculator/CalculateReferenceAsync.java create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/async-invocation/src/main/java/calculator/CalculatorAsyncHandler.java create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/async-invocation/src/main/java/calculator/CalculatorClient.java create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/async-invocation/src/main/java/calculator/CalculatorPrintAsyncHandler.java create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/async-invocation/src/main/java/calculator/CalculatorServiceAsync.java create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/async-invocation/src/main/java/calculator/CalculatorServiceAsyncImpl.java create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/async-invocation/src/main/java/calculator/CalculatorServiceProxyImpl.java create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/async-invocation/src/main/java/calculator/CalculatorServiceSync.java create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/async-invocation/src/main/java/calculator/CalculatorServiceSyncImpl.java create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/async-invocation/src/main/resources/Calculator.composite create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/async-invocation/src/main/resources/CalculatorClient.composite create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/async-invocation/src/main/resources/META-INF/sca-contribution.xml create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/async-invocation/src/test/java/calculator/CalculatorTestCase.java create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/binding-comet/autocomplete-webapp/README create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/binding-comet/autocomplete-webapp/pom.xml create mode 100644 sca-java-2.x/branches/2.0/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/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/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/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/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/samples/learning-more/binding-comet/autocomplete-webapp/src/main/resources/countries.txt create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/binding-comet/autocomplete-webapp/src/main/webapp/META-INF/MANIFEST.MF create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/binding-comet/autocomplete-webapp/src/main/webapp/WEB-INF/web.composite create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/binding-comet/autocomplete-webapp/src/main/webapp/WEB-INF/web.xml create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/binding-comet/autocomplete-webapp/src/main/webapp/index.html create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/binding-comet/chat-webapp/README create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/binding-comet/chat-webapp/pom.xml create mode 100644 sca-java-2.x/branches/2.0/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/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/samples/learning-more/binding-comet/chat-webapp/src/main/webapp/META-INF/MANIFEST.MF create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/binding-comet/chat-webapp/src/main/webapp/WEB-INF/web.composite create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/binding-comet/chat-webapp/src/main/webapp/WEB-INF/web.xml create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/binding-comet/chat-webapp/src/main/webapp/index.html create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/binding-comet/pom.xml create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/binding-comet/pubsub-webapp/README create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/binding-comet/pubsub-webapp/pom.xml create mode 100644 sca-java-2.x/branches/2.0/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/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/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/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/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/samples/learning-more/binding-comet/pubsub-webapp/src/main/webapp/META-INF/MANIFEST.MF create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/binding-comet/pubsub-webapp/src/main/webapp/WEB-INF/web.composite create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/binding-comet/pubsub-webapp/src/main/webapp/WEB-INF/web.xml create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/binding-comet/pubsub-webapp/src/main/webapp/index.html create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/binding-comet/weather-webapp/README create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/binding-comet/weather-webapp/pom.xml create mode 100644 sca-java-2.x/branches/2.0/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/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/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/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/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/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/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/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/samples/learning-more/binding-comet/weather-webapp/src/main/webapp/META-INF/MANIFEST.MF create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/binding-comet/weather-webapp/src/main/webapp/WEB-INF/web.composite create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/binding-comet/weather-webapp/src/main/webapp/WEB-INF/web.xml create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/binding-comet/weather-webapp/src/main/webapp/index.html create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/binding-websocket/autocomplete-webapp/README create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/binding-websocket/autocomplete-webapp/pom.xml create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/binding-websocket/autocomplete-webapp/src/main/java/sample/Country.java create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/binding-websocket/autocomplete-webapp/src/main/java/sample/CountryRepository.java create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/binding-websocket/autocomplete-webapp/src/main/java/sample/CountryRepositoryImpl.java create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/binding-websocket/autocomplete-webapp/src/main/java/sample/CountryService.java create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/binding-websocket/autocomplete-webapp/src/main/java/sample/CountryServiceImpl.java create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/binding-websocket/autocomplete-webapp/src/main/resources/countries.txt create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/binding-websocket/autocomplete-webapp/src/main/webapp/META-INF/MANIFEST.MF create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/binding-websocket/autocomplete-webapp/src/main/webapp/WEB-INF/web.composite create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/binding-websocket/autocomplete-webapp/src/main/webapp/WEB-INF/web.xml create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/binding-websocket/autocomplete-webapp/src/main/webapp/index.html create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/binding-websocket/chat-webapp/README create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/binding-websocket/chat-webapp/pom.xml create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/binding-websocket/chat-webapp/src/main/java/sample/ChatService.java create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/binding-websocket/chat-webapp/src/main/java/sample/ChatServiceImpl.java create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/binding-websocket/chat-webapp/src/main/webapp/META-INF/MANIFEST.MF create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/binding-websocket/chat-webapp/src/main/webapp/WEB-INF/web.composite create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/binding-websocket/chat-webapp/src/main/webapp/WEB-INF/web.xml create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/binding-websocket/chat-webapp/src/main/webapp/index.html create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/binding-websocket/pom.xml create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/binding-websocket/pubsub-webapp/README create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/binding-websocket/pubsub-webapp/pom.xml create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/binding-websocket/pubsub-webapp/src/main/java/sample/Event.java create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/binding-websocket/pubsub-webapp/src/main/java/sample/EventProcessor.java create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/binding-websocket/pubsub-webapp/src/main/java/sample/EventProcessorConsumerService.java create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/binding-websocket/pubsub-webapp/src/main/java/sample/EventProcessorProducerService.java create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/binding-websocket/pubsub-webapp/src/main/java/sample/Producer.java create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/binding-websocket/pubsub-webapp/src/main/webapp/META-INF/MANIFEST.MF create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/binding-websocket/pubsub-webapp/src/main/webapp/WEB-INF/web.composite create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/binding-websocket/pubsub-webapp/src/main/webapp/WEB-INF/web.xml create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/binding-websocket/pubsub-webapp/src/main/webapp/index.html create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/binding-websocket/weather-webapp/README create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/binding-websocket/weather-webapp/pom.xml create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/binding-websocket/weather-webapp/src/main/java/sample/Helper.java create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/binding-websocket/weather-webapp/src/main/java/sample/HumidityService.java create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/binding-websocket/weather-webapp/src/main/java/sample/PrecipitationService.java create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/binding-websocket/weather-webapp/src/main/java/sample/PrecipitationServiceImpl.java create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/binding-websocket/weather-webapp/src/main/java/sample/TemperatureHumidityServiceImpl.java create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/binding-websocket/weather-webapp/src/main/java/sample/TemperatureService.java create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/binding-websocket/weather-webapp/src/main/java/sample/model/Location.java create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/binding-websocket/weather-webapp/src/main/java/sample/model/Response.java create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/binding-websocket/weather-webapp/src/main/webapp/META-INF/MANIFEST.MF create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/binding-websocket/weather-webapp/src/main/webapp/WEB-INF/web.composite create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/binding-websocket/weather-webapp/src/main/webapp/WEB-INF/web.xml create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/binding-websocket/weather-webapp/src/main/webapp/index.html create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/contribution-osgi/META-INF/MANIFEST.MF create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/contribution-osgi/README.html create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/contribution-osgi/README.odt create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/contribution-osgi/pom.xml create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/contribution-osgi/src/main/java/calculator/AddService.java create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/contribution-osgi/src/main/java/calculator/AddServiceImpl.java create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/contribution-osgi/src/main/java/calculator/CalculatorActivator.java create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/contribution-osgi/src/main/java/calculator/CalculatorClient.java create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/contribution-osgi/src/main/java/calculator/CalculatorService.java create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/contribution-osgi/src/main/java/calculator/CalculatorServiceImpl.java create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/contribution-osgi/src/main/java/calculator/DivideService.java create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/contribution-osgi/src/main/java/calculator/DivideServiceImpl.java create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/contribution-osgi/src/main/java/calculator/MultiplyService.java create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/contribution-osgi/src/main/java/calculator/MultiplyServiceImpl.java create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/contribution-osgi/src/main/java/calculator/SubtractService.java create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/contribution-osgi/src/main/java/calculator/SubtractServiceImpl.java create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/contribution-osgi/src/main/resources/Calculator.composite create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/contribution-osgi/src/test/java/calculator/CalculatorTestCase.java create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/calculator-bundle/LICENSE create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/calculator-bundle/META-INF/MANIFEST.MF create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/calculator-bundle/NOTICE create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/calculator-bundle/OSGI-INF/blueprint/calculator-module.xml create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/calculator-bundle/OSGI-INF/calculator-component.xml create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/calculator-bundle/OSGI-INF/remote-service/calculator-service-descriptions.xml create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/calculator-bundle/OSGI-INF/sca-config/calculator-config.xml create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/calculator-bundle/README create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/calculator-bundle/dosgi-calculator.png create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/calculator-bundle/pom.xml create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/calculator-bundle/src/main/java/calculator/dosgi/CalculatorService.java create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/calculator-bundle/src/main/java/calculator/dosgi/impl/CalculatorActivator.java create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/calculator-bundle/src/main/java/calculator/dosgi/impl/CalculatorServiceDSImpl.java create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/calculator-bundle/src/main/java/calculator/dosgi/impl/CalculatorServiceImpl.java create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/calculator-bundle/src/main/java/calculator/dosgi/operations/AddService.java create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/calculator-bundle/src/main/java/calculator/dosgi/operations/DivideService.java create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/calculator-bundle/src/main/java/calculator/dosgi/operations/MultiplyService.java create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/calculator-bundle/src/main/java/calculator/dosgi/operations/SubtractService.java create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/calculator-bundle/src/main/java/calculator/rmi/OperationsRMIServer.java create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/calculator-bundle/src/main/java/calculator/rmi/OperationsRMIServer_Stub.java create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/calculator-bundle/src/main/java/calculator/rmi/OperationsRemote.java create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/calculator-bundle/src/test/java/calculator/dosgi/test/CalculatorNode.java create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/calculator-bundle/src/test/java/calculator/dosgi/test/CalculatorOSGiNodeTestCase.java create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/calculator-bundle/src/test/java/calculator/dosgi/test/OSGiTestUtils.java create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/operations-bundle/LICENSE create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/operations-bundle/META-INF/MANIFEST.MF create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/operations-bundle/NOTICE create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/operations-bundle/OSGI-INF/add-component.xml create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/operations-bundle/OSGI-INF/blueprint/operations-module.xml create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/operations-bundle/OSGI-INF/divide-component.xml create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/operations-bundle/OSGI-INF/multiply-component.xml create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/operations-bundle/OSGI-INF/sca-config/operations-config.xml create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/operations-bundle/OSGI-INF/subtract-component.xml create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/operations-bundle/README create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/operations-bundle/pom.xml create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/operations-bundle/src/main/java/calculator/dosgi/operations/AddService.java create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/operations-bundle/src/main/java/calculator/dosgi/operations/DivideService.java create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/operations-bundle/src/main/java/calculator/dosgi/operations/MultiplyService.java create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/operations-bundle/src/main/java/calculator/dosgi/operations/SubtractService.java create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/operations-bundle/src/main/java/calculator/dosgi/operations/impl/AddServiceImpl.java create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/operations-bundle/src/main/java/calculator/dosgi/operations/impl/DivideServiceImpl.java create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/operations-bundle/src/main/java/calculator/dosgi/operations/impl/MultiplyServiceImpl.java create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/operations-bundle/src/main/java/calculator/dosgi/operations/impl/OperationsActivator.java create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/operations-bundle/src/main/java/calculator/dosgi/operations/impl/SubtractServiceImpl.java create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/operations-bundle/src/test/java/calculator/dosgi/operations/test/OSGiTestUtils.java create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/operations-bundle/src/test/java/calculator/dosgi/operations/test/OperationsNode.java create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/operations-bundle/src/test/java/calculator/dosgi/operations/test/OperationsOSGiNodeTestCase.java create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/pom.xml create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/README.odt create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/calculator-bundle/META-INF/MANIFEST.MF create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/calculator-bundle/OSGI-INF/blueprint/calculator-module.xml create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/calculator-bundle/OSGI-INF/calculator-component.xml create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/calculator-bundle/OSGI-INF/sca/bundle.componentType create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/calculator-bundle/OSGI-INF/sca/bundle.composite create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/calculator-bundle/pom.xml create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/calculator-bundle/src/main/java/calculator/dosgi/CalculatorService.java create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/calculator-bundle/src/main/java/calculator/dosgi/impl/CalculatorActivator.java create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/calculator-bundle/src/main/java/calculator/dosgi/impl/CalculatorServiceDSImpl.java create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/calculator-bundle/src/main/java/calculator/dosgi/impl/CalculatorServiceImpl.java create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/calculator-bundle/src/main/java/calculator/dosgi/operations/AddService.java create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/calculator-bundle/src/main/java/calculator/dosgi/operations/DivideService.java create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/calculator-bundle/src/main/java/calculator/dosgi/operations/MultiplyService.java create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/calculator-bundle/src/main/java/calculator/dosgi/operations/SubtractService.java create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/calculator-bundle/src/main/java/calculator/rmi/OperationsRMIServer.java create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/calculator-bundle/src/main/java/calculator/rmi/OperationsRMIServer_Stub.java create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/calculator-bundle/src/main/java/calculator/rmi/OperationsRemote.java create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/calculator-bundle/src/main/resources/META-INF/sca-contribution.xml create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/calculator-bundle/src/test/java/calculator/dosgi/test/CalculatorNode.java create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/calculator-bundle/src/test/java/calculator/dosgi/test/CalculatorOSGiNodeTestCase.java create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/calculator-bundle/src/test/java/calculator/dosgi/test/OSGiTestUtils.java create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/operations-bundle/META-INF/MANIFEST.MF create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/operations-bundle/OSGI-INF/add-component.xml create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/operations-bundle/OSGI-INF/blueprint/operations-module.xml create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/operations-bundle/OSGI-INF/divide-component.xml create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/operations-bundle/OSGI-INF/multiply-component.xml create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/operations-bundle/OSGI-INF/sca/bundle.componentType create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/operations-bundle/OSGI-INF/sca/bundle.composite create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/operations-bundle/OSGI-INF/subtract-component.xml create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/operations-bundle/pom.xml create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/operations-bundle/src/main/java/calculator/dosgi/operations/AddService.java create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/operations-bundle/src/main/java/calculator/dosgi/operations/DivideService.java create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/operations-bundle/src/main/java/calculator/dosgi/operations/MultiplyService.java create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/operations-bundle/src/main/java/calculator/dosgi/operations/SubtractService.java create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/operations-bundle/src/main/java/calculator/dosgi/operations/impl/AddServiceImpl.java create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/operations-bundle/src/main/java/calculator/dosgi/operations/impl/DivideServiceImpl.java create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/operations-bundle/src/main/java/calculator/dosgi/operations/impl/MultiplyServiceImpl.java create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/operations-bundle/src/main/java/calculator/dosgi/operations/impl/OperationsActivator.java create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/operations-bundle/src/main/java/calculator/dosgi/operations/impl/SubtractServiceImpl.java create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/operations-bundle/src/main/resources/META-INF/sca-contribution.xml create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/operations-bundle/src/test/java/calculator/dosgi/operations/test/OSGiTestUtils.java create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/operations-bundle/src/test/java/calculator/dosgi/operations/test/OperationsNode.java create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/operations-bundle/src/test/java/calculator/dosgi/operations/test/OperationsOSGiNodeTestCase.java create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/pom.xml create mode 100644 sca-java-2.x/branches/2.0/samples/learning-more/pom.xml create mode 100644 sca-java-2.x/branches/2.0/samples/pom.xml create mode 100644 sca-java-2.x/branches/2.0/samples/running-tuscany/ant/README.html create mode 100644 sca-java-2.x/branches/2.0/samples/running-tuscany/ant/README.odt create mode 100644 sca-java-2.x/branches/2.0/samples/running-tuscany/ant/build.xml create mode 100644 sca-java-2.x/branches/2.0/samples/running-tuscany/calculator-contribution.jar create mode 100644 sca-java-2.x/branches/2.0/samples/running-tuscany/command-line/README.html create mode 100644 sca-java-2.x/branches/2.0/samples/running-tuscany/command-line/README.odt create mode 100644 sca-java-2.x/branches/2.0/samples/running-tuscany/eclipse/README.html create mode 100644 sca-java-2.x/branches/2.0/samples/running-tuscany/eclipse/README.odt create mode 100644 sca-java-2.x/branches/2.0/samples/running-tuscany/jse/README.html create mode 100644 sca-java-2.x/branches/2.0/samples/running-tuscany/jse/README.odt create mode 100644 sca-java-2.x/branches/2.0/samples/running-tuscany/jse/pom.xml create mode 100644 sca-java-2.x/branches/2.0/samples/running-tuscany/jse/run-sample.bat create mode 100644 sca-java-2.x/branches/2.0/samples/running-tuscany/jse/run-sample.sh create mode 100644 sca-java-2.x/branches/2.0/samples/running-tuscany/jse/src/main/java/calculator/CalculatorService.java create mode 100644 sca-java-2.x/branches/2.0/samples/running-tuscany/jse/src/main/java/launcher/LaunchCalculatorContribution.java create mode 100644 sca-java-2.x/branches/2.0/samples/running-tuscany/jse/src/test/java/launcher/LauncherTestCase.java create mode 100644 sca-java-2.x/branches/2.0/samples/running-tuscany/junit/README.html create mode 100644 sca-java-2.x/branches/2.0/samples/running-tuscany/junit/README.odt create mode 100644 sca-java-2.x/branches/2.0/samples/running-tuscany/junit/pom.xml create mode 100644 sca-java-2.x/branches/2.0/samples/running-tuscany/junit/src/main/java/calculator/CalculatorService.java create mode 100644 sca-java-2.x/branches/2.0/samples/running-tuscany/junit/src/test/java/launcher/LaunchCalculatorContributionTestCase.java create mode 100644 sca-java-2.x/branches/2.0/samples/running-tuscany/osgi/README.html create mode 100644 sca-java-2.x/branches/2.0/samples/running-tuscany/osgi/README.odt create mode 100644 sca-java-2.x/branches/2.0/samples/running-tuscany/pom.xml create mode 100644 sca-java-2.x/branches/2.0/samples/running-tuscany/running-tuscany.html create mode 100644 sca-java-2.x/branches/2.0/samples/running-tuscany/running-tuscany.odt create mode 100644 sca-java-2.x/branches/2.0/samples/running-tuscany/running-tuscany_html_m65f05d55.png (limited to 'sca-java-2.x/branches/2.0/samples') diff --git a/sca-java-2.x/branches/2.0/samples/README b/sca-java-2.x/branches/2.0/samples/README new file mode 100644 index 0000000000..2261b2cfb8 --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/README @@ -0,0 +1,19 @@ +Apache Tuscany Samples +====================== + + +Welcome to the Tuscany SCA samples. The following tutorial samples are included to demonstrate some of the features of Tuscany. It is reccomended that beginners follow these sequetially. + +In this folder you should see the following: + + running-tuscany/ - Instructions on how to run Tuscany in various different environments. + + getting-started/ - Introduction to SCA and the different features supported by Tuscany. + + applications/ - One example of an SCA web application running on Tuscany. + + learning-more/ - Examples of advanced topics, such as bindings, OSGi applications, and more. + + +Note that not all the samples may have been tested with every release. The "getting-started" and "applications" samples should work but the others may not and are provided on an FYI YMMV basis. + diff --git a/sca-java-2.x/branches/2.0/samples/applications/pom.xml b/sca-java-2.x/branches/2.0/samples/applications/pom.xml new file mode 100644 index 0000000000..2c04fa537e --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/applications/pom.xml @@ -0,0 +1,45 @@ + + + + 4.0.0 + + org.apache.tuscany.sca.samples + tuscany-samples + 2.0 + ../pom.xml + + + tuscany-samples-applications + 2.0 + pom + Apache Tuscany SCA Sample Applications + + + + default + + true + + + store + + + + diff --git a/sca-java-2.x/branches/2.0/samples/applications/store/README b/sca-java-2.x/branches/2.0/samples/applications/store/README new file mode 100644 index 0000000000..12573a4870 --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/applications/store/README @@ -0,0 +1,29 @@ +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 Or Maven +-------------------------------------------------- +With the binary distribution the sample can be built using Ant or Maven as follows: + +cd store +ant compile OR mvn clean install + +and then, to run: + +ant run OR mvn exec:java + +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/samples/applications/store/build.xml b/sca-java-2.x/branches/2.0/samples/applications/store/build.xml new file mode 100644 index 0000000000..e28e7c87be --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/applications/store/build.xml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sca-java-2.x/branches/2.0/samples/applications/store/pom.xml b/sca-java-2.x/branches/2.0/samples/applications/store/pom.xml new file mode 100644 index 0000000000..f94a7223fa --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/applications/store/pom.xml @@ -0,0 +1,120 @@ + + + + 4.0.0 + + org.apache.tuscany.sca.samples + tuscany-samples + 2.0 + ../../pom.xml + + sample-store + Apache Tuscany SCA Sample Getting Started Online Store + + + + org.apache.tuscany.sca + tuscany-base-runtime-pom + 2.0 + pom + + + org.apache.tuscany.sca + tuscany-data-api + 2.0 + + + org.apache.tuscany.sca + tuscany-binding-atom-runtime + 2.0 + + + org.apache.tuscany.sca + tuscany-binding-http-runtime + 2.0 + + + org.apache.tuscany.sca + tuscany-binding-rest-runtime + 2.0 + + + org.apache.tuscany.sca + tuscany-binding-jsonrpc-runtime + 2.0 + + + org.apache.tuscany.sca + tuscany-implementation-widget-runtime + 2.0 + + + org.apache.tuscany.sca + tuscany-implementation-widget-runtime-dojo + 2.0 + + + org.apache.tuscany.sca + tuscany-web-javascript-dojo + 2.0 + + + 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/samples/applications/store/src/main/java/launch/Launch.java b/sca-java-2.x/branches/2.0/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/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/samples/applications/store/src/main/java/services/Cart.java b/sca-java-2.x/branches/2.0/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/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/samples/applications/store/src/main/java/services/Catalog.java b/sca-java-2.x/branches/2.0/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/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/samples/applications/store/src/main/java/services/CurrencyConverter.java b/sca-java-2.x/branches/2.0/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/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/samples/applications/store/src/main/java/services/CurrencyConverterImpl.java b/sca-java-2.x/branches/2.0/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/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/samples/applications/store/src/main/java/services/FruitsCatalogImpl.java b/sca-java-2.x/branches/2.0/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/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/samples/applications/store/src/main/java/services/Item.java b/sca-java-2.x/branches/2.0/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/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/samples/applications/store/src/main/java/services/ShoppingCartImpl.java b/sca-java-2.x/branches/2.0/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/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/samples/applications/store/src/main/java/services/Total.java b/sca-java-2.x/branches/2.0/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/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/samples/applications/store/src/main/resources/store.composite b/sca-java-2.x/branches/2.0/samples/applications/store/src/main/resources/store.composite new file mode 100644 index 0000000000..bb60f96a7a --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/applications/store/src/main/resources/store.composite @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + USD + + + + + + + + + + + + + + + + + + + + + diff --git a/sca-java-2.x/branches/2.0/samples/applications/store/src/main/resources/uiservices/store.html b/sca-java-2.x/branches/2.0/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/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/samples/applications/store/src/test/java/client/Shopper.java b/sca-java-2.x/branches/2.0/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/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/samples/applications/store/src/test/java/client/ShopperImpl.java b/sca-java-2.x/branches/2.0/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/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/samples/applications/store/src/test/java/store/StoreTestCase.java b/sca-java-2.x/branches/2.0/samples/applications/store/src/test/java/store/StoreTestCase.java new file mode 100644 index 0000000000..2aa4f89e2f --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/applications/store/src/test/java/store/StoreTestCase.java @@ -0,0 +1,120 @@ +/* + * 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.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/samples/applications/store/src/test/resources/store-client.composite b/sca-java-2.x/branches/2.0/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/samples/applications/store/src/test/resources/store-client.composite @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + diff --git a/sca-java-2.x/branches/2.0/samples/applications/store/store.png b/sca-java-2.x/branches/2.0/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/samples/applications/store/store.png differ diff --git a/sca-java-2.x/branches/2.0/samples/applications/store/store.svg b/sca-java-2.x/branches/2.0/samples/applications/store/store.svg new file mode 100644 index 0000000000..74f8ecd36d --- /dev/null +++ b/sca-java-2.x/branches/2.0/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/samples/getting-started/getting-started.odt b/sca-java-2.x/branches/2.0/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/samples/getting-started/getting-started.odt differ diff --git a/sca-java-2.x/branches/2.0/samples/getting-started/getting-started.pdf b/sca-java-2.x/branches/2.0/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/samples/getting-started/getting-started.pdf differ diff --git a/sca-java-2.x/branches/2.0/samples/getting-started/helloworld-jaxrs/README b/sca-java-2.x/branches/2.0/samples/getting-started/helloworld-jaxrs/README new file mode 100644 index 0000000000..ae2a0101e0 --- /dev/null +++ b/sca-java-2.x/branches/2.0/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/samples/getting-started/helloworld-jaxrs/cors.html b/sca-java-2.x/branches/2.0/samples/getting-started/helloworld-jaxrs/cors.html new file mode 100644 index 0000000000..9b5106673c --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/getting-started/helloworld-jaxrs/cors.html @@ -0,0 +1,41 @@ + + + + + + +

Apache Tuscany Helloworld JAX-RS Sample

+ +

This page uses the Tuscany 'Cross-Origin Resource Sharing' (CORS) support to enable calling the Helloworld JAX-RS service with JQuery

+ +Invoke the Helloworld service + +

+Clicking the above link should result in a pop-up alert box saying "Hello World". +

+ + + \ No newline at end of file diff --git a/sca-java-2.x/branches/2.0/samples/getting-started/helloworld-jaxrs/pom.xml b/sca-java-2.x/branches/2.0/samples/getting-started/helloworld-jaxrs/pom.xml new file mode 100644 index 0000000000..dab06bbad4 --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/getting-started/helloworld-jaxrs/pom.xml @@ -0,0 +1,120 @@ + + + + 4.0.0 + + + org.apache.tuscany.sca.samples + tuscany-samples + 2.0 + + + helloworld-jaxrs + 2.0 + + 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/samples/getting-started/helloworld-jaxrs/src/main/java/sample/Helloworld.java b/sca-java-2.x/branches/2.0/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/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/samples/getting-started/helloworld-jaxrs/src/main/java/sample/HelloworldImpl.java b/sca-java-2.x/branches/2.0/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/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/samples/getting-started/helloworld-jaxrs/src/main/java/sample/JaxrsHelloworld.java b/sca-java-2.x/branches/2.0/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/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/samples/getting-started/helloworld-jaxrs/src/main/resources/META-INF/sca-contribution.xml b/sca-java-2.x/branches/2.0/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/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/samples/getting-started/helloworld-jaxrs/src/main/resources/helloworld.composite b/sca-java-2.x/branches/2.0/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/samples/getting-started/helloworld-jaxrs/src/main/resources/helloworld.composite @@ -0,0 +1,33 @@ + + + + + + + + + + + + + diff --git a/sca-java-2.x/branches/2.0/samples/getting-started/helloworld-jaxrs/src/test/java/sample/HelloworldTestCase.java b/sca-java-2.x/branches/2.0/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/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/samples/getting-started/helloworld-jsonp/README b/sca-java-2.x/branches/2.0/samples/getting-started/helloworld-jsonp/README new file mode 100644 index 0000000000..5a99f91036 --- /dev/null +++ b/sca-java-2.x/branches/2.0/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/samples/getting-started/helloworld-jsonp/pom.xml b/sca-java-2.x/branches/2.0/samples/getting-started/helloworld-jsonp/pom.xml new file mode 100644 index 0000000000..cd5599923e --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/getting-started/helloworld-jsonp/pom.xml @@ -0,0 +1,113 @@ + + + + 4.0.0 + + + org.apache.tuscany.sca.samples + tuscany-samples + 2.0 + + + + helloworld-jsonp + 2.0 + + 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/samples/getting-started/helloworld-jsonp/src/main/java/sample/Helloworld.java b/sca-java-2.x/branches/2.0/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/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/samples/getting-started/helloworld-jsonp/src/main/java/sample/HelloworldImpl.java b/sca-java-2.x/branches/2.0/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/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/samples/getting-started/helloworld-jsonp/src/main/resources/META-INF/sca-contribution.xml b/sca-java-2.x/branches/2.0/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/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/samples/getting-started/helloworld-jsonp/src/main/resources/helloworld.composite b/sca-java-2.x/branches/2.0/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/samples/getting-started/helloworld-jsonp/src/main/resources/helloworld.composite @@ -0,0 +1,32 @@ + + + + + + + + + + + + diff --git a/sca-java-2.x/branches/2.0/samples/getting-started/helloworld-jsonp/src/test/java/sample/HelloworldTestCase.java b/sca-java-2.x/branches/2.0/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/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/samples/getting-started/helloworld-jsonrpc/README b/sca-java-2.x/branches/2.0/samples/getting-started/helloworld-jsonrpc/README new file mode 100644 index 0000000000..c197ddcd95 --- /dev/null +++ b/sca-java-2.x/branches/2.0/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/samples/getting-started/helloworld-jsonrpc/pom.xml b/sca-java-2.x/branches/2.0/samples/getting-started/helloworld-jsonrpc/pom.xml new file mode 100644 index 0000000000..4811017425 --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/getting-started/helloworld-jsonrpc/pom.xml @@ -0,0 +1,113 @@ + + + + 4.0.0 + + + org.apache.tuscany.sca.samples + tuscany-samples + 2.0 + + + + helloworld-jsonrpc + 2.0 + + 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/samples/getting-started/helloworld-jsonrpc/src/main/java/sample/Helloworld.java b/sca-java-2.x/branches/2.0/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/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/samples/getting-started/helloworld-jsonrpc/src/main/java/sample/HelloworldImpl.java b/sca-java-2.x/branches/2.0/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/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/samples/getting-started/helloworld-jsonrpc/src/main/resources/META-INF/sca-contribution.xml b/sca-java-2.x/branches/2.0/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/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/samples/getting-started/helloworld-jsonrpc/src/main/resources/helloworld.composite b/sca-java-2.x/branches/2.0/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/samples/getting-started/helloworld-jsonrpc/src/main/resources/helloworld.composite @@ -0,0 +1,32 @@ + + + + + + + + + + + + diff --git a/sca-java-2.x/branches/2.0/samples/getting-started/helloworld-jsonrpc/src/test/java/sample/HelloworldTestCase.java b/sca-java-2.x/branches/2.0/samples/getting-started/helloworld-jsonrpc/src/test/java/sample/HelloworldTestCase.java new file mode 100644 index 0000000000..f4f382a590 --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/getting-started/helloworld-jsonrpc/src/test/java/sample/HelloworldTestCase.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.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"); + String response = read(url.openStream()); + System.out.println(response); + Assert.assertTrue(response.contains("\"id\":1,\"result\":\"Hello World\"")); + + } 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/samples/getting-started/helloworld-scaclient/README b/sca-java-2.x/branches/2.0/samples/getting-started/helloworld-scaclient/README new file mode 100644 index 0000000000..5672944c8f --- /dev/null +++ b/sca-java-2.x/branches/2.0/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/samples/getting-started/helloworld-scaclient/pom.xml b/sca-java-2.x/branches/2.0/samples/getting-started/helloworld-scaclient/pom.xml new file mode 100644 index 0000000000..f1d8980e07 --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/getting-started/helloworld-scaclient/pom.xml @@ -0,0 +1,121 @@ + + + + 4.0.0 + + + org.apache.tuscany.sca.samples + tuscany-samples + 2.0 + + + + helloworld-scaclient + 2.0 + + 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/samples/getting-started/helloworld-scaclient/src/main/java/sample/Helloworld.java b/sca-java-2.x/branches/2.0/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/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/samples/getting-started/helloworld-scaclient/src/main/java/sample/HelloworldSCAClient.java b/sca-java-2.x/branches/2.0/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/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/samples/getting-started/helloworld-scaclient/src/test/java/sample/HelloworldTestCase.java b/sca-java-2.x/branches/2.0/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/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/samples/getting-started/helloworld-spring/README b/sca-java-2.x/branches/2.0/samples/getting-started/helloworld-spring/README new file mode 100644 index 0000000000..5fb675b502 --- /dev/null +++ b/sca-java-2.x/branches/2.0/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/samples/getting-started/helloworld-spring/pom.xml b/sca-java-2.x/branches/2.0/samples/getting-started/helloworld-spring/pom.xml new file mode 100644 index 0000000000..b60d2fd172 --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/getting-started/helloworld-spring/pom.xml @@ -0,0 +1,106 @@ + + + + 4.0.0 + + + org.apache.tuscany.sca.samples + tuscany-samples + 2.0 + + + helloworld-spring + 2.0 + + 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/samples/getting-started/helloworld-spring/src/main/java/sample/Helloworld.java b/sca-java-2.x/branches/2.0/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/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/samples/getting-started/helloworld-spring/src/main/java/sample/HelloworldImpl.java b/sca-java-2.x/branches/2.0/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/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/samples/getting-started/helloworld-spring/src/main/resources/META-INF/sca-contribution.xml b/sca-java-2.x/branches/2.0/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/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/samples/getting-started/helloworld-spring/src/main/resources/helloworld-context.xml b/sca-java-2.x/branches/2.0/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/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/samples/getting-started/helloworld-spring/src/main/resources/helloworld.composite b/sca-java-2.x/branches/2.0/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/samples/getting-started/helloworld-spring/src/main/resources/helloworld.composite @@ -0,0 +1,29 @@ + + + + + + + + + diff --git a/sca-java-2.x/branches/2.0/samples/getting-started/helloworld-spring/src/test/java/sample/HelloworldTestCase.java b/sca-java-2.x/branches/2.0/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/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/samples/getting-started/helloworld-webapp/README b/sca-java-2.x/branches/2.0/samples/getting-started/helloworld-webapp/README new file mode 100644 index 0000000000..bcf11d9886 --- /dev/null +++ b/sca-java-2.x/branches/2.0/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/samples/getting-started/helloworld-webapp/pom.xml b/sca-java-2.x/branches/2.0/samples/getting-started/helloworld-webapp/pom.xml new file mode 100644 index 0000000000..b807bf9c30 --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/getting-started/helloworld-webapp/pom.xml @@ -0,0 +1,181 @@ + + + + 4.0.0 + + + org.apache.tuscany.sca.samples + tuscany-samples + 2.0 + + + + helloworld-webapp + 2.0 + + 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/samples/getting-started/helloworld-webapp/src/main/java/sample/Helloworld.java b/sca-java-2.x/branches/2.0/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/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/samples/getting-started/helloworld-webapp/src/main/webapp/WEB-INF/web.composite b/sca-java-2.x/branches/2.0/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/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/samples/getting-started/helloworld-webapp/src/main/webapp/WEB-INF/web.xml b/sca-java-2.x/branches/2.0/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/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/samples/getting-started/helloworld-webapp/src/main/webapp/hello.jsp b/sca-java-2.x/branches/2.0/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/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/samples/getting-started/helloworld-webapp/src/test/java/itest/HelloworldTestCase.java b/sca-java-2.x/branches/2.0/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/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/samples/getting-started/helloworld-webapp/src/test/resources/test-web.xml b/sca-java-2.x/branches/2.0/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/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/samples/getting-started/helloworld-webservice/README b/sca-java-2.x/branches/2.0/samples/getting-started/helloworld-webservice/README new file mode 100644 index 0000000000..b61a694fa9 --- /dev/null +++ b/sca-java-2.x/branches/2.0/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/samples/getting-started/helloworld-webservice/pom.xml b/sca-java-2.x/branches/2.0/samples/getting-started/helloworld-webservice/pom.xml new file mode 100644 index 0000000000..c747e35923 --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/getting-started/helloworld-webservice/pom.xml @@ -0,0 +1,126 @@ + + + + 4.0.0 + + + org.apache.tuscany.sca.samples + tuscany-samples + 2.0 + + + + helloworld-webservice + 2.0 + + 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.codehaus.woodstox + wstx-asl + 3.2.9 + 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} + + + org.codehaus.woodstox + wstx-asl + 3.2.9 + + + + + + + + diff --git a/sca-java-2.x/branches/2.0/samples/getting-started/helloworld-webservice/src/main/java/sample/Helloworld.java b/sca-java-2.x/branches/2.0/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/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/samples/getting-started/helloworld-webservice/src/main/java/sample/HelloworldImpl.java b/sca-java-2.x/branches/2.0/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/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/samples/getting-started/helloworld-webservice/src/main/resources/META-INF/sca-contribution.xml b/sca-java-2.x/branches/2.0/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/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/samples/getting-started/helloworld-webservice/src/main/resources/helloworld.composite b/sca-java-2.x/branches/2.0/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/samples/getting-started/helloworld-webservice/src/main/resources/helloworld.composite @@ -0,0 +1,32 @@ + + + + + + + + + + + + diff --git a/sca-java-2.x/branches/2.0/samples/getting-started/helloworld-webservice/src/test/java/sample/HelloworldTestCase.java b/sca-java-2.x/branches/2.0/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/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/samples/getting-started/helloworld-withdeps/README b/sca-java-2.x/branches/2.0/samples/getting-started/helloworld-withdeps/README new file mode 100644 index 0000000000..5bb69df953 --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/getting-started/helloworld-withdeps/README @@ -0,0 +1,22 @@ +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 +- use a node.xml file to configure the contributions used by the Tuscany maven plugin + +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 explore the state of the domain with Shell commands and 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/samples/getting-started/helloworld-withdeps/node.xml b/sca-java-2.x/branches/2.0/samples/getting-started/helloworld-withdeps/node.xml new file mode 100644 index 0000000000..2af170d609 --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/getting-started/helloworld-withdeps/node.xml @@ -0,0 +1,27 @@ + + + + + + + \ No newline at end of file diff --git a/sca-java-2.x/branches/2.0/samples/getting-started/helloworld-withdeps/pom.xml b/sca-java-2.x/branches/2.0/samples/getting-started/helloworld-withdeps/pom.xml new file mode 100644 index 0000000000..c05d63dd2e --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/getting-started/helloworld-withdeps/pom.xml @@ -0,0 +1,123 @@ + + + + 4.0.0 + + + org.apache.tuscany.sca.samples + tuscany-samples + 2.0 + + + helloworld-withdeps + 2.0 + + 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} + + node.xml + + + + + + + + diff --git a/sca-java-2.x/branches/2.0/samples/getting-started/helloworld-withdeps/src/main/assembly/resources/META-INF/helloworld.composite b/sca-java-2.x/branches/2.0/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/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/samples/getting-started/helloworld-withdeps/src/main/assembly/resources/META-INF/sca-contribution.xml b/sca-java-2.x/branches/2.0/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/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/samples/getting-started/helloworld-withdeps/src/main/assembly/zip.xml b/sca-java-2.x/branches/2.0/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/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/samples/getting-started/helloworld-withdeps/src/main/java/sample/Helloworld.java b/sca-java-2.x/branches/2.0/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/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/samples/getting-started/helloworld-withdeps/src/main/java/sample/HelloworldImpl.java b/sca-java-2.x/branches/2.0/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/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/samples/getting-started/helloworld-withdeps/src/test/java/sample/HelloworldTestCase.java b/sca-java-2.x/branches/2.0/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/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/samples/getting-started/helloworld/README b/sca-java-2.x/branches/2.0/samples/getting-started/helloworld/README new file mode 100644 index 0000000000..fc306caa34 --- /dev/null +++ b/sca-java-2.x/branches/2.0/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-SNAPSHOT + Define value for property 'package': org.apache.tuscany.sca.samples: sample + diff --git a/sca-java-2.x/branches/2.0/samples/getting-started/helloworld/pom.xml b/sca-java-2.x/branches/2.0/samples/getting-started/helloworld/pom.xml new file mode 100644 index 0000000000..a7cb670682 --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/getting-started/helloworld/pom.xml @@ -0,0 +1,92 @@ + + + + 4.0.0 + + + org.apache.tuscany.sca.samples + tuscany-samples + 2.0 + + + helloworld + 2.0 + + 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/samples/getting-started/helloworld/src/main/java/sample/Helloworld.java b/sca-java-2.x/branches/2.0/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/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/samples/getting-started/helloworld/src/main/java/sample/HelloworldImpl.java b/sca-java-2.x/branches/2.0/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/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/samples/getting-started/helloworld/src/main/resources/META-INF/sca-contribution.xml b/sca-java-2.x/branches/2.0/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/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/samples/getting-started/helloworld/src/main/resources/helloworld.composite b/sca-java-2.x/branches/2.0/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/samples/getting-started/helloworld/src/main/resources/helloworld.composite @@ -0,0 +1,29 @@ + + + + + + + + + diff --git a/sca-java-2.x/branches/2.0/samples/getting-started/helloworld/src/test/java/sample/HelloworldTestCase.java b/sca-java-2.x/branches/2.0/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/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/samples/getting-started/pom.xml b/sca-java-2.x/branches/2.0/samples/getting-started/pom.xml new file mode 100644 index 0000000000..74004c1b6e --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/getting-started/pom.xml @@ -0,0 +1,45 @@ + + + + 4.0.0 + + org.apache.tuscany.sca.samples + tuscany-samples + 2.0 + + + tuscany-samples-getting-started + 2.0 + 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/samples/learning-more/async-invocation/pom.xml b/sca-java-2.x/branches/2.0/samples/learning-more/async-invocation/pom.xml new file mode 100644 index 0000000000..899d3c53c4 --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/async-invocation/pom.xml @@ -0,0 +1,79 @@ + + + + 4.0.0 + + org.apache.tuscany.sca.samples + tuscany-samples + 2.0 + + + sample-async-invocation + Apache Tuscany SCA Sample Async Invocation + + + + 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 + 2.0 + + + + org.apache.tuscany.sca + tuscany-base-runtime-pom + pom + 2.0 + test + + + + junit + junit + 4.8.1 + test + + + + + ${project.artifactId} + + + org.apache.tuscany.sca + tuscany-maven-plugin + 2.0 + + + + + diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/async-invocation/src/main/java/calculator/CalculateReferenceAsync.java b/sca-java-2.x/branches/2.0/samples/learning-more/async-invocation/src/main/java/calculator/CalculateReferenceAsync.java new file mode 100644 index 0000000000..630a77d77b --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/async-invocation/src/main/java/calculator/CalculateReferenceAsync.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 calculator; + +import java.util.concurrent.Future; + +import javax.xml.ws.AsyncHandler; +import javax.xml.ws.Response; + +import org.oasisopen.sca.annotation.Remotable; + +/** + * Async client version of the CalculatorService interface + * + */ + +@Remotable +public interface CalculateReferenceAsync { + + // Sync + public String calculate(Integer i1); + + // Aysnc Poll + public Response calculateAsync(Integer i1); + + // Async Callback + public Future calculateAsync(Integer i1, AsyncHandler handler); + + + // Sync + public void print(Integer i1); + + // Aysnc Poll + public Response printAsync(Integer i1); + + // Async Callback + public Future printAsync(Integer i1, AsyncHandler handler); + +} + diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/async-invocation/src/main/java/calculator/CalculatorAsyncHandler.java b/sca-java-2.x/branches/2.0/samples/learning-more/async-invocation/src/main/java/calculator/CalculatorAsyncHandler.java new file mode 100644 index 0000000000..abaeef8062 --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/async-invocation/src/main/java/calculator/CalculatorAsyncHandler.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 calculator; + +import javax.xml.ws.AsyncHandler; +import javax.xml.ws.Response; + +/** + * Handles callbacks to the async client + */ + +public class CalculatorAsyncHandler implements AsyncHandler { + public void handleResponse(Response res) { + try { + System.out.println("Async client callback patern: result in handler = " + res.get()); + } catch(Exception ex){ + System.out.println("Async client callback patern: exception in handler = " + ex.getMessage()); + } + } +} diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/async-invocation/src/main/java/calculator/CalculatorClient.java b/sca-java-2.x/branches/2.0/samples/learning-more/async-invocation/src/main/java/calculator/CalculatorClient.java new file mode 100644 index 0000000000..d1ef16c519 --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/async-invocation/src/main/java/calculator/CalculatorClient.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 calculator; + +import org.oasisopen.sca.annotation.EagerInit; +import org.oasisopen.sca.annotation.Init; +import org.oasisopen.sca.annotation.Reference; +import org.oasisopen.sca.annotation.Scope; + +/** + * This client program shows how to create an SCA runtime, start it, + * and locate and invoke a SCA component + */ +@Scope("COMPOSITE") @EagerInit +public class CalculatorClient { + + private CalculatorServiceSync calculatorService; + + + @Reference + public void setCalculatorService(CalculatorServiceSync calculatorService) { + this.calculatorService = calculatorService; + } + + @Init + public void calculate() { + System.out.println("calculation=" + calculatorService.calculate(20)); + System.out.println("print"); + /* TUSCANY-3757 + calculatorService.print(27); + */ + } + + +} diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/async-invocation/src/main/java/calculator/CalculatorPrintAsyncHandler.java b/sca-java-2.x/branches/2.0/samples/learning-more/async-invocation/src/main/java/calculator/CalculatorPrintAsyncHandler.java new file mode 100644 index 0000000000..8faf390974 --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/async-invocation/src/main/java/calculator/CalculatorPrintAsyncHandler.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 calculator; + +import javax.xml.ws.AsyncHandler; +import javax.xml.ws.Response; + +/** + * Handles callbacks to the async client + */ + +public class CalculatorPrintAsyncHandler implements AsyncHandler { + public void handleResponse(Response res) { + try { + System.out.println("Async client callback patern: result in print handler = " + res.get()); + } catch(Exception ex){ + System.out.println("Async client callback patern: exception in print handler = " + ex.getMessage()); + } + } +} diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/async-invocation/src/main/java/calculator/CalculatorServiceAsync.java b/sca-java-2.x/branches/2.0/samples/learning-more/async-invocation/src/main/java/calculator/CalculatorServiceAsync.java new file mode 100644 index 0000000000..fe8a890a92 --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/async-invocation/src/main/java/calculator/CalculatorServiceAsync.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 calculator; + +import org.oasisopen.sca.ResponseDispatch; +import org.oasisopen.sca.annotation.AsyncInvocation; +import org.oasisopen.sca.annotation.Remotable; + +/** + * The async Calculator service interface. + */ + +@Remotable +@AsyncInvocation +public interface CalculatorServiceAsync { + void calculateAsync(Integer n1, ResponseDispatch response); + void printAsync(Integer n1, ResponseDispatch response); +} diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/async-invocation/src/main/java/calculator/CalculatorServiceAsyncImpl.java b/sca-java-2.x/branches/2.0/samples/learning-more/async-invocation/src/main/java/calculator/CalculatorServiceAsyncImpl.java new file mode 100644 index 0000000000..e8b603d10d --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/async-invocation/src/main/java/calculator/CalculatorServiceAsyncImpl.java @@ -0,0 +1,41 @@ +/* + * 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.ResponseDispatch; + +public class CalculatorServiceAsyncImpl implements CalculatorServiceAsync { + + @Override + public void calculateAsync(Integer n1, ResponseDispatch response) { + int result = n1 + n1; + String retval = "async service invoked: " + n1 + " + " + n1 + " = " + result; + + response.sendResponse(retval); + } + + @Override + public void printAsync(Integer n1, ResponseDispatch response) { + int result = n1 + n1; + String retval = "async service invoked: " + n1 + " + " + n1 + " = " + result; + System.out.println(retval); + } + +} diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/async-invocation/src/main/java/calculator/CalculatorServiceProxyImpl.java b/sca-java-2.x/branches/2.0/samples/learning-more/async-invocation/src/main/java/calculator/CalculatorServiceProxyImpl.java new file mode 100644 index 0000000000..5b3809bfc9 --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/async-invocation/src/main/java/calculator/CalculatorServiceProxyImpl.java @@ -0,0 +1,128 @@ +/* + * 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 java.util.concurrent.ExecutionException; +import java.util.concurrent.Future; + +import javax.xml.ws.Response; + +import org.oasisopen.sca.annotation.Reference; + +/** + * An implementation of the Calculator service which just proxies + * to sync and asyn versions of the calculator service. This proxy + * exercises the various async interface alternatives + */ +public class CalculatorServiceProxyImpl implements CalculatorServiceSync { + + @Reference + protected CalculateReferenceAsync calculatorServiceRefSync; + + @Reference + protected CalculateReferenceAsync calculatorServiceRefAsync; + + @Override + public String calculate(Integer n1) { + String result = null; + + // calculate using a sync service + System.out.println("Calling sync service for calculate"); + result = calculate(calculatorServiceRefSync, n1); + + // calculate using an aycn service + System.out.println("Calling async service for calculate"); + result += calculate(calculatorServiceRefAsync, n1); + + return result; + } + + // exercise sync and async versions of a service interface method + private String calculate(CalculateReferenceAsync calculatorRef, Integer n1) { + + // sync + String result = calculatorRef.calculate(1); + System.out.println("Sync client patern: result = " + result); + + // async poll + Response response = calculatorRef.calculateAsync(20); + + while (!response.isDone()){ + System.out.println("Waiting for poll"); + try { + Thread.sleep(500); + } catch (Exception ex) { + // do nothing + } + } + + try { + result = response.get(); + System.out.println("Async client poll patern: result = " + result); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (ExecutionException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + // async callback + CalculatorAsyncHandler handler = new CalculatorAsyncHandler(); + Future future = calculatorRef.calculateAsync(3, handler); + + while (!future.isDone()){ + System.out.println("Waiting for callback"); + try { + Thread.sleep(500); + } catch (Exception ex) { + // do nothing + } + } + + return result; + } + + @Override + public void print(Integer n1) { + + // calculate using a sync service + System.out.println("Calling sync service for print"); + print(calculatorServiceRefSync, n1); + + // calculate using an asycn service + System.out.println("Calling async service for print"); + print(calculatorServiceRefAsync, n1); + } + + // exercise sync and async versions of a service interface method + private void print(CalculateReferenceAsync calculatorRef, Integer n1) { + + // sync + calculatorRef.print(1); + + // async poll + Response response = calculatorRef.printAsync(20); + + // async callback + CalculatorPrintAsyncHandler handler = new CalculatorPrintAsyncHandler(); + Future future = calculatorRef.printAsync(3, handler); + + } +} diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/async-invocation/src/main/java/calculator/CalculatorServiceSync.java b/sca-java-2.x/branches/2.0/samples/learning-more/async-invocation/src/main/java/calculator/CalculatorServiceSync.java new file mode 100644 index 0000000000..bc9de67816 --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/async-invocation/src/main/java/calculator/CalculatorServiceSync.java @@ -0,0 +1,31 @@ +/* + * 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 sync Calculator service interface. + */ + +@Remotable +public interface CalculatorServiceSync { + String calculate(Integer n1); + void print(Integer n1); +} diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/async-invocation/src/main/java/calculator/CalculatorServiceSyncImpl.java b/sca-java-2.x/branches/2.0/samples/learning-more/async-invocation/src/main/java/calculator/CalculatorServiceSyncImpl.java new file mode 100644 index 0000000000..9a91313cee --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/async-invocation/src/main/java/calculator/CalculatorServiceSyncImpl.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; + +public class CalculatorServiceSyncImpl implements CalculatorServiceSync { + + @Override + public String calculate(Integer n1) { + int result = n1 + n1; + String retval = "sync service invoked: " + n1 + " + " + n1 + " = " + result; + return retval; + } + + @Override + public void print(Integer n1) { + int result = n1 + n1; + String retval = "sync service invoked: " + n1 + " + " + n1 + " = " + result; + System.out.println(retval); + } + +} diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/async-invocation/src/main/resources/Calculator.composite b/sca-java-2.x/branches/2.0/samples/learning-more/async-invocation/src/main/resources/Calculator.composite new file mode 100644 index 0000000000..6117d436db --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/async-invocation/src/main/resources/Calculator.composite @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/async-invocation/src/main/resources/CalculatorClient.composite b/sca-java-2.x/branches/2.0/samples/learning-more/async-invocation/src/main/resources/CalculatorClient.composite new file mode 100644 index 0000000000..374ef27e2b --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/async-invocation/src/main/resources/CalculatorClient.composite @@ -0,0 +1,30 @@ + + + + + + + + + + diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/async-invocation/src/main/resources/META-INF/sca-contribution.xml b/sca-java-2.x/branches/2.0/samples/learning-more/async-invocation/src/main/resources/META-INF/sca-contribution.xml new file mode 100644 index 0000000000..70aab0e051 --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/async-invocation/src/main/resources/META-INF/sca-contribution.xml @@ -0,0 +1,24 @@ + + + + + + \ No newline at end of file diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/async-invocation/src/test/java/calculator/CalculatorTestCase.java b/sca-java-2.x/branches/2.0/samples/learning-more/async-invocation/src/test/java/calculator/CalculatorTestCase.java new file mode 100644 index 0000000000..b4b5ff85f1 --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/async-invocation/src/test/java/calculator/CalculatorTestCase.java @@ -0,0 +1,63 @@ +/* + * 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 java.net.URI; + +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; +import org.oasisopen.sca.client.SCAClientFactory; + +/* + * A unit test for the Calculator composite that just fires up the + * composite and expects the EagerInit of the CalculatorClient component + * to do its thing + */ +public class CalculatorTestCase { + + @Test + public void testCalculate() throws NoSuchServiceException { + + // Run the SCA composite in a Tuscany runtime + //TuscanyRuntime.runComposite("Calculator.composite", "target/classes"); + Node node = null; + + try { + TuscanyRuntime tuscanyRuntime = TuscanyRuntime.newInstance(); + node = tuscanyRuntime.createNode(); + node.installContribution("AsyncSample", "target/classes", null, null); + node.startComposite("AsyncSample", "Calculator.composite"); + node.startComposite("AsyncSample", "CalculatorClient.composite"); + + SCAClientFactory scaClientFactory = SCAClientFactory.newInstance(URI.create("default")); + CalculatorClient calculatorClient = scaClientFactory.getService(CalculatorClient.class, "CalculatorClient"); + + calculatorClient.calculate(); + }catch (Exception e){ + e.printStackTrace(); + } finally { + // Stop the Tuscany runtime Node + node.stop(); + } + } +} diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/binding-comet/autocomplete-webapp/README b/sca-java-2.x/branches/2.0/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/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/samples/learning-more/binding-comet/autocomplete-webapp/pom.xml b/sca-java-2.x/branches/2.0/samples/learning-more/binding-comet/autocomplete-webapp/pom.xml new file mode 100644 index 0000000000..d33a490d2b --- /dev/null +++ b/sca-java-2.x/branches/2.0/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 + ../pom.xml + + + sample-binding-comet-autocomplete-webapp + war + 2.0 + Apache Tuscany SCA Sample binding.comet Real-Time Suggestions Webapp + + + + org.apache.tuscany.sca + tuscany-binding-comet-runtime + 2.0 + + + javax + javaee-web-api + 6.0 + provided + + + org.apache.tuscany.sca + tuscany-base-runtime-pom + 2.0 + 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 + + + + + + + + + diff --git a/sca-java-2.x/branches/2.0/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/samples/learning-more/binding-comet/autocomplete-webapp/src/main/resources/countries.txt b/sca-java-2.x/branches/2.0/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/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/samples/learning-more/binding-comet/autocomplete-webapp/src/main/webapp/META-INF/MANIFEST.MF b/sca-java-2.x/branches/2.0/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/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/samples/learning-more/binding-comet/autocomplete-webapp/src/main/webapp/WEB-INF/web.composite b/sca-java-2.x/branches/2.0/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/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/samples/learning-more/binding-comet/autocomplete-webapp/src/main/webapp/WEB-INF/web.xml b/sca-java-2.x/branches/2.0/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/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/samples/learning-more/binding-comet/autocomplete-webapp/src/main/webapp/index.html b/sca-java-2.x/branches/2.0/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/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/samples/learning-more/binding-comet/chat-webapp/README b/sca-java-2.x/branches/2.0/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/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/samples/learning-more/binding-comet/chat-webapp/pom.xml b/sca-java-2.x/branches/2.0/samples/learning-more/binding-comet/chat-webapp/pom.xml new file mode 100644 index 0000000000..494df712a6 --- /dev/null +++ b/sca-java-2.x/branches/2.0/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 + ../pom.xml + + + sample-binding-comet-chat-webapp + war + 2.0 + Apache Tuscany SCA Sample binding.comet Chat Webapp + + + + org.apache.tuscany.sca + tuscany-binding-comet-runtime + 2.0 + + + javax + javaee-web-api + 6.0 + provided + + + org.apache.tuscany.sca + tuscany-base-runtime-pom + 2.0 + 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 + + + + + + + + diff --git a/sca-java-2.x/branches/2.0/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/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/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/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/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/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/samples/learning-more/binding-comet/chat-webapp/src/main/webapp/META-INF/MANIFEST.MF b/sca-java-2.x/branches/2.0/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/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/samples/learning-more/binding-comet/chat-webapp/src/main/webapp/WEB-INF/web.composite b/sca-java-2.x/branches/2.0/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/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/samples/learning-more/binding-comet/chat-webapp/src/main/webapp/WEB-INF/web.xml b/sca-java-2.x/branches/2.0/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/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/samples/learning-more/binding-comet/chat-webapp/src/main/webapp/index.html b/sca-java-2.x/branches/2.0/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/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/samples/learning-more/binding-comet/pom.xml b/sca-java-2.x/branches/2.0/samples/learning-more/binding-comet/pom.xml new file mode 100644 index 0000000000..2f8193b893 --- /dev/null +++ b/sca-java-2.x/branches/2.0/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 + ../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/samples/learning-more/binding-comet/pubsub-webapp/README b/sca-java-2.x/branches/2.0/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/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/samples/learning-more/binding-comet/pubsub-webapp/pom.xml b/sca-java-2.x/branches/2.0/samples/learning-more/binding-comet/pubsub-webapp/pom.xml new file mode 100644 index 0000000000..0e497e3cb0 --- /dev/null +++ b/sca-java-2.x/branches/2.0/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 + ../pom.xml + + + sample-binding-comet-pubsub-webapp + war + 2.0 + Apache Tuscany SCA Sample binding.comet PubSub Webapp + + + + org.apache.tuscany.sca + tuscany-binding-comet-runtime + 2.0 + + + javax + javaee-web-api + 6.0 + provided + + + org.apache.tuscany.sca + tuscany-base-runtime-pom + 2.0 + 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 + + + + + + + + diff --git a/sca-java-2.x/branches/2.0/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/samples/learning-more/binding-comet/pubsub-webapp/src/main/webapp/META-INF/MANIFEST.MF b/sca-java-2.x/branches/2.0/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/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/samples/learning-more/binding-comet/pubsub-webapp/src/main/webapp/WEB-INF/web.composite b/sca-java-2.x/branches/2.0/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/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/samples/learning-more/binding-comet/pubsub-webapp/src/main/webapp/WEB-INF/web.xml b/sca-java-2.x/branches/2.0/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/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/samples/learning-more/binding-comet/pubsub-webapp/src/main/webapp/index.html b/sca-java-2.x/branches/2.0/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/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/samples/learning-more/binding-comet/weather-webapp/README b/sca-java-2.x/branches/2.0/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/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/samples/learning-more/binding-comet/weather-webapp/pom.xml b/sca-java-2.x/branches/2.0/samples/learning-more/binding-comet/weather-webapp/pom.xml new file mode 100644 index 0000000000..25c0094aa9 --- /dev/null +++ b/sca-java-2.x/branches/2.0/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 + ../pom.xml + + + sample-binding-comet-weather-webapp + war + 2.0 + Apache Tuscany SCA Sample binding.comet Weather Monitor Webapp + + + + org.apache.tuscany.sca + tuscany-binding-comet-runtime + 2.0 + + + javax + javaee-web-api + 6.0 + provided + + + org.apache.tuscany.sca + tuscany-base-runtime-pom + 2.0 + pom + compile + + + + + + + com.googlecode.t7mp + maven-t7-plugin + 0.9.6 + + + + org.apache.tuscany.sca.samples + sample-binding-comet-weather-webapp + 2.0 + + + + + + + + diff --git a/sca-java-2.x/branches/2.0/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/samples/learning-more/binding-comet/weather-webapp/src/main/webapp/META-INF/MANIFEST.MF b/sca-java-2.x/branches/2.0/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/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/samples/learning-more/binding-comet/weather-webapp/src/main/webapp/WEB-INF/web.composite b/sca-java-2.x/branches/2.0/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/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/samples/learning-more/binding-comet/weather-webapp/src/main/webapp/WEB-INF/web.xml b/sca-java-2.x/branches/2.0/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/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/samples/learning-more/binding-comet/weather-webapp/src/main/webapp/index.html b/sca-java-2.x/branches/2.0/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/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/samples/learning-more/binding-websocket/autocomplete-webapp/README b/sca-java-2.x/branches/2.0/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/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/samples/learning-more/binding-websocket/autocomplete-webapp/pom.xml b/sca-java-2.x/branches/2.0/samples/learning-more/binding-websocket/autocomplete-webapp/pom.xml new file mode 100644 index 0000000000..81100c11ba --- /dev/null +++ b/sca-java-2.x/branches/2.0/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 + ../pom.xml + + + sample-binding-websocket-autocomplete-webapp + war + 2.0 + Apache Tuscany SCA Sample binding.websocket Autocomplete Webapp + + + + org.apache.tuscany.sca + tuscany-binding-websocket + 2.0 + + + org.apache.tuscany.sca + tuscany-base-runtime-pom + 2.0 + pom + compile + + + + + + + org.mortbay.jetty + maven-jetty-plugin + 6.1.26 + + + + + + diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/binding-websocket/autocomplete-webapp/src/main/java/sample/Country.java b/sca-java-2.x/branches/2.0/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/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/samples/learning-more/binding-websocket/autocomplete-webapp/src/main/java/sample/CountryRepository.java b/sca-java-2.x/branches/2.0/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/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/samples/learning-more/binding-websocket/autocomplete-webapp/src/main/java/sample/CountryRepositoryImpl.java b/sca-java-2.x/branches/2.0/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/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/samples/learning-more/binding-websocket/autocomplete-webapp/src/main/java/sample/CountryService.java b/sca-java-2.x/branches/2.0/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/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/samples/learning-more/binding-websocket/autocomplete-webapp/src/main/java/sample/CountryServiceImpl.java b/sca-java-2.x/branches/2.0/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/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/samples/learning-more/binding-websocket/autocomplete-webapp/src/main/resources/countries.txt b/sca-java-2.x/branches/2.0/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/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/samples/learning-more/binding-websocket/autocomplete-webapp/src/main/webapp/META-INF/MANIFEST.MF b/sca-java-2.x/branches/2.0/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/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/samples/learning-more/binding-websocket/autocomplete-webapp/src/main/webapp/WEB-INF/web.composite b/sca-java-2.x/branches/2.0/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/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/samples/learning-more/binding-websocket/autocomplete-webapp/src/main/webapp/WEB-INF/web.xml b/sca-java-2.x/branches/2.0/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/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/samples/learning-more/binding-websocket/autocomplete-webapp/src/main/webapp/index.html b/sca-java-2.x/branches/2.0/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/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/samples/learning-more/binding-websocket/chat-webapp/README b/sca-java-2.x/branches/2.0/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/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/samples/learning-more/binding-websocket/chat-webapp/pom.xml b/sca-java-2.x/branches/2.0/samples/learning-more/binding-websocket/chat-webapp/pom.xml new file mode 100644 index 0000000000..847795ff74 --- /dev/null +++ b/sca-java-2.x/branches/2.0/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 + ../pom.xml + + + sample-binding-websocket-chat-webapp + war + 2.0 + Apache Tuscany SCA Sample binding.websocket Chat Webapp + + + + org.apache.tuscany.sca + tuscany-binding-websocket + 2.0 + + + org.apache.tuscany.sca + tuscany-base-runtime-pom + 2.0 + 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/samples/learning-more/binding-websocket/chat-webapp/src/main/java/sample/ChatService.java b/sca-java-2.x/branches/2.0/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/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/samples/learning-more/binding-websocket/chat-webapp/src/main/java/sample/ChatServiceImpl.java b/sca-java-2.x/branches/2.0/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/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/samples/learning-more/binding-websocket/chat-webapp/src/main/webapp/META-INF/MANIFEST.MF b/sca-java-2.x/branches/2.0/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/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/samples/learning-more/binding-websocket/chat-webapp/src/main/webapp/WEB-INF/web.composite b/sca-java-2.x/branches/2.0/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/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/samples/learning-more/binding-websocket/chat-webapp/src/main/webapp/WEB-INF/web.xml b/sca-java-2.x/branches/2.0/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/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/samples/learning-more/binding-websocket/chat-webapp/src/main/webapp/index.html b/sca-java-2.x/branches/2.0/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/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/samples/learning-more/binding-websocket/pom.xml b/sca-java-2.x/branches/2.0/samples/learning-more/binding-websocket/pom.xml new file mode 100644 index 0000000000..0a4dcb775c --- /dev/null +++ b/sca-java-2.x/branches/2.0/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 + ../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/samples/learning-more/binding-websocket/pubsub-webapp/README b/sca-java-2.x/branches/2.0/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/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/samples/learning-more/binding-websocket/pubsub-webapp/pom.xml b/sca-java-2.x/branches/2.0/samples/learning-more/binding-websocket/pubsub-webapp/pom.xml new file mode 100644 index 0000000000..2855ea5f45 --- /dev/null +++ b/sca-java-2.x/branches/2.0/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 + ../pom.xml + + + sample-binding-websocket-pubsub-webapp + war + 2.0 + Apache Tuscany SCA Sample binding.websocket PubSub Webapp + + + + org.apache.tuscany.sca + tuscany-binding-websocket + 2.0 + + + org.apache.tuscany.sca + tuscany-base-runtime-pom + 2.0 + 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/samples/learning-more/binding-websocket/pubsub-webapp/src/main/java/sample/Event.java b/sca-java-2.x/branches/2.0/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/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/samples/learning-more/binding-websocket/pubsub-webapp/src/main/java/sample/EventProcessor.java b/sca-java-2.x/branches/2.0/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/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/samples/learning-more/binding-websocket/pubsub-webapp/src/main/java/sample/EventProcessorConsumerService.java b/sca-java-2.x/branches/2.0/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/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/samples/learning-more/binding-websocket/pubsub-webapp/src/main/java/sample/EventProcessorProducerService.java b/sca-java-2.x/branches/2.0/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/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/samples/learning-more/binding-websocket/pubsub-webapp/src/main/java/sample/Producer.java b/sca-java-2.x/branches/2.0/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/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/samples/learning-more/binding-websocket/pubsub-webapp/src/main/webapp/META-INF/MANIFEST.MF b/sca-java-2.x/branches/2.0/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/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/samples/learning-more/binding-websocket/pubsub-webapp/src/main/webapp/WEB-INF/web.composite b/sca-java-2.x/branches/2.0/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/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/samples/learning-more/binding-websocket/pubsub-webapp/src/main/webapp/WEB-INF/web.xml b/sca-java-2.x/branches/2.0/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/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/samples/learning-more/binding-websocket/pubsub-webapp/src/main/webapp/index.html b/sca-java-2.x/branches/2.0/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/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/samples/learning-more/binding-websocket/weather-webapp/README b/sca-java-2.x/branches/2.0/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/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/samples/learning-more/binding-websocket/weather-webapp/pom.xml b/sca-java-2.x/branches/2.0/samples/learning-more/binding-websocket/weather-webapp/pom.xml new file mode 100644 index 0000000000..801cf8126c --- /dev/null +++ b/sca-java-2.x/branches/2.0/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 + ../pom.xml + + + sample-binding-websocket-weather-webapp + war + 2.0 + Apache Tuscany SCA Sample binding.websocket Weather Monitor Webapp + + + + org.apache.tuscany.sca + tuscany-binding-websocket + 2.0 + + + org.apache.tuscany.sca + tuscany-base-runtime-pom + 2.0 + pom + compile + + + + + + + org.mortbay.jetty + maven-jetty-plugin + 6.1.26 + + + + + + diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/binding-websocket/weather-webapp/src/main/java/sample/Helper.java b/sca-java-2.x/branches/2.0/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/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/samples/learning-more/binding-websocket/weather-webapp/src/main/java/sample/HumidityService.java b/sca-java-2.x/branches/2.0/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/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/samples/learning-more/binding-websocket/weather-webapp/src/main/java/sample/PrecipitationService.java b/sca-java-2.x/branches/2.0/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/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/samples/learning-more/binding-websocket/weather-webapp/src/main/java/sample/PrecipitationServiceImpl.java b/sca-java-2.x/branches/2.0/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/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/samples/learning-more/binding-websocket/weather-webapp/src/main/java/sample/TemperatureHumidityServiceImpl.java b/sca-java-2.x/branches/2.0/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/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/samples/learning-more/binding-websocket/weather-webapp/src/main/java/sample/TemperatureService.java b/sca-java-2.x/branches/2.0/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/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/samples/learning-more/binding-websocket/weather-webapp/src/main/java/sample/model/Location.java b/sca-java-2.x/branches/2.0/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/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/samples/learning-more/binding-websocket/weather-webapp/src/main/java/sample/model/Response.java b/sca-java-2.x/branches/2.0/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/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/samples/learning-more/binding-websocket/weather-webapp/src/main/webapp/META-INF/MANIFEST.MF b/sca-java-2.x/branches/2.0/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/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/samples/learning-more/binding-websocket/weather-webapp/src/main/webapp/WEB-INF/web.composite b/sca-java-2.x/branches/2.0/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/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/samples/learning-more/binding-websocket/weather-webapp/src/main/webapp/WEB-INF/web.xml b/sca-java-2.x/branches/2.0/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/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/samples/learning-more/binding-websocket/weather-webapp/src/main/webapp/index.html b/sca-java-2.x/branches/2.0/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/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/samples/learning-more/contribution-osgi/META-INF/MANIFEST.MF b/sca-java-2.x/branches/2.0/samples/learning-more/contribution-osgi/META-INF/MANIFEST.MF new file mode 100644 index 0000000000..a9c9b2a8f9 --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/contribution-osgi/META-INF/MANIFEST.MF @@ -0,0 +1,19 @@ +Manifest-Version: 1.0 +Bundle-Version: 2.0.0 +Bundle-Name: Sample Calculator OSGi +Bundle-Activator: calculator.CalculatorActivator +Bundle-ManifestVersion: 2 +Import-Package: org.oasisopen.sca.annotation;version="2.0.0", + org.oasisopen.sca;version="2.0.0", + org.apache.tuscany.sca;version="2.0.0", + org.apache.tuscany.sca.core;version="2.0.0", + org.osgi.framework, + org.osgi.service.component;resolution:=optional, + org.osgi.service.packageadmin, + org.osgi.util.tracker +Bundle-SymbolicName: sample.calculator.osgi +Bundle-Vendor: The Apache Software Foundation +Eclipse-LazyStart: true +Bundle-License: http://www.apache.org/licenses/LICENSE-2.0.txt +Bundle-DocURL: http://www.apache.org/ +Bundle-RequiredExecutionEnvironment: J2SE-1.5,JavaSE-1.6 diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/contribution-osgi/README.html b/sca-java-2.x/branches/2.0/samples/learning-more/contribution-osgi/README.html new file mode 100644 index 0000000000..18e1c62b74 --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/contribution-osgi/README.html @@ -0,0 +1,59 @@ + + + + + + + + + + + + + +

Contribution OSGi

+


+

+
This sample packages the calculator sample as an OSGi bundle. The main differences over and above the basic calculator sample is that the bundle has a bundle activator. When the bundle is installed and started in OSGi the bundle activator starts the Tuscany runtime and runs the sample. 
+
+See samples/running_tuscany/osgi for instructions for installing the Tuscany runtime in OSGi. Once the runtime is installed this contribution can be installed from the OSGi command line using the following command. 
+
+osgi> install file:///c:\path\to\Tuscany\installation\samples\learning-more\contribution-osgi\target\sample-contribution-osgi.jar
+
+This should give rise to a message indicating the bundle ID as follows:
+
+Bundle id is 264
+
+The bundle can then be started using:
+
+osgi> start 264
+ + \ No newline at end of file diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/contribution-osgi/README.odt b/sca-java-2.x/branches/2.0/samples/learning-more/contribution-osgi/README.odt new file mode 100644 index 0000000000..934c402bdf Binary files /dev/null and b/sca-java-2.x/branches/2.0/samples/learning-more/contribution-osgi/README.odt differ diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/contribution-osgi/pom.xml b/sca-java-2.x/branches/2.0/samples/learning-more/contribution-osgi/pom.xml new file mode 100644 index 0000000000..6aadf450ee --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/contribution-osgi/pom.xml @@ -0,0 +1,95 @@ + + + + 4.0.0 + + + org.apache.tuscany.sca.samples + tuscany-samples + 2.0 + + + sample-contribution-osgi + 2.0 + + Apache Tuscany SCA Sample Calculator OSGi + + + ${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-pom + pom + 2.0 + + + + org.apache.tuscany.sca + tuscany-osgi-runtime-pom + pom + 2.0 + + + + junit + junit + 4.8.1 + test + + + + + + ${artifactId} + + + + maven-jar-plugin + + + ${basedir}/META-INF/MANIFEST.MF + + + + + + + diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/contribution-osgi/src/main/java/calculator/AddService.java b/sca-java-2.x/branches/2.0/samples/learning-more/contribution-osgi/src/main/java/calculator/AddService.java new file mode 100644 index 0000000000..5a1e7a638a --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/contribution-osgi/src/main/java/calculator/AddService.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 calculator; + +/** + * The Add service interface + */ +public interface AddService { + + double add(double n1, double n2); + +} diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/contribution-osgi/src/main/java/calculator/AddServiceImpl.java b/sca-java-2.x/branches/2.0/samples/learning-more/contribution-osgi/src/main/java/calculator/AddServiceImpl.java new file mode 100644 index 0000000000..caf4d358df --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/contribution-osgi/src/main/java/calculator/AddServiceImpl.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 calculator; + +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * An implementation of the Add service + */ +public class AddServiceImpl implements AddService { + + public double add(double n1, double n2) { + Logger logger = Logger.getLogger("calculator"); + logger.log(Level.FINEST, "Adding " + n1 + " and " + n2); + return n1 + n2; + } + +} diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/contribution-osgi/src/main/java/calculator/CalculatorActivator.java b/sca-java-2.x/branches/2.0/samples/learning-more/contribution-osgi/src/main/java/calculator/CalculatorActivator.java new file mode 100644 index 0000000000..5e65623761 --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/contribution-osgi/src/main/java/calculator/CalculatorActivator.java @@ -0,0 +1,47 @@ +/* + * 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 java.util.logging.Logger; + +import org.apache.tuscany.sca.Node; +import org.apache.tuscany.sca.TuscanyRuntime; +import org.osgi.framework.BundleActivator; +import org.osgi.framework.BundleContext; + +/** + * + */ +public class CalculatorActivator implements BundleActivator { + private Logger logger = Logger.getLogger(CalculatorActivator.class.getName()); + + public void start(BundleContext context) throws Exception { + logger.info("Starting " + context.getBundle()); + Node node = TuscanyRuntime.runComposite("Calculator.composite", context.getBundle().getLocation()); + node.stop(); + } + + public void stop(BundleContext context) throws Exception { + logger.info("Stopping " + context.getBundle()); + // Registered services will be automatically unregistered + } + +} diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/contribution-osgi/src/main/java/calculator/CalculatorClient.java b/sca-java-2.x/branches/2.0/samples/learning-more/contribution-osgi/src/main/java/calculator/CalculatorClient.java new file mode 100644 index 0000000000..2b791a8e1f --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/contribution-osgi/src/main/java/calculator/CalculatorClient.java @@ -0,0 +1,62 @@ +/* + * 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.EagerInit; +import org.oasisopen.sca.annotation.Init; +import org.oasisopen.sca.annotation.Reference; +import org.oasisopen.sca.annotation.Scope; + +/** + * This client program shows how to create an SCA runtime, start it, + * and locate and invoke a SCA component + */ +@Scope("COMPOSITE") @EagerInit +public class CalculatorClient { + + private CalculatorService calculatorService; + + @Reference + public void setCalculatorService(CalculatorService calculatorService) { + this.calculatorService = calculatorService; + } + + @Init + public void calculate() { + + // Calculate + System.out.println("SCA API ClassLoader: " + print(Reference.class.getClassLoader())); + System.out.println("3 + 2=" + calculatorService.add(3, 2)); + System.out.println("3 - 2=" + calculatorService.subtract(3, 2)); + System.out.println("3 * 2=" + calculatorService.multiply(3, 2)); + System.out.println("3 / 2=" + calculatorService.divide(3, 2)); + } + + private static String print(ClassLoader cl) { + StringBuffer buf = new StringBuffer(); + for (; cl != null;) { + buf.append(cl.toString()); + buf.append(' '); + cl = cl.getParent(); + } + return buf.toString(); + } + +} diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/contribution-osgi/src/main/java/calculator/CalculatorService.java b/sca-java-2.x/branches/2.0/samples/learning-more/contribution-osgi/src/main/java/calculator/CalculatorService.java new file mode 100644 index 0000000000..ad87375529 --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/contribution-osgi/src/main/java/calculator/CalculatorService.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 calculator; + + +/** + * The Calculator service interface. + */ +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/samples/learning-more/contribution-osgi/src/main/java/calculator/CalculatorServiceImpl.java b/sca-java-2.x/branches/2.0/samples/learning-more/contribution-osgi/src/main/java/calculator/CalculatorServiceImpl.java new file mode 100644 index 0000000000..0f03d6e7a1 --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/contribution-osgi/src/main/java/calculator/CalculatorServiceImpl.java @@ -0,0 +1,69 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package calculator; + +import org.oasisopen.sca.annotation.Reference; + +/** + * An implementation of the Calculator service. + */ +public class CalculatorServiceImpl implements CalculatorService { + + private AddService addService; + private SubtractService subtractService; + private MultiplyService multiplyService; + private DivideService divideService; + + @Reference + public void setAddService(AddService addService) { + this.addService = addService; + } + + @Reference + public void setSubtractService(SubtractService subtractService) { + this.subtractService = subtractService; + } + + @Reference + public void setDivideService(DivideService divideService) { + this.divideService = divideService; + } + + @Reference + public void setMultiplyService(MultiplyService multiplyService) { + this.multiplyService = multiplyService; + } + + public double add(double n1, double n2) { + return addService.add(n1, n2); + } + + public double subtract(double n1, double n2) { + return subtractService.subtract(n1, n2); + } + + public double multiply(double n1, double n2) { + return multiplyService.multiply(n1, n2); + } + + public double divide(double n1, double n2) { + return divideService.divide(n1, n2); + } + +} diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/contribution-osgi/src/main/java/calculator/DivideService.java b/sca-java-2.x/branches/2.0/samples/learning-more/contribution-osgi/src/main/java/calculator/DivideService.java new file mode 100644 index 0000000000..ef6a8b375b --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/contribution-osgi/src/main/java/calculator/DivideService.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 calculator; + +/** + * The divide service interface + */ +public interface DivideService { + + double divide(double n1, double n2); + +} diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/contribution-osgi/src/main/java/calculator/DivideServiceImpl.java b/sca-java-2.x/branches/2.0/samples/learning-more/contribution-osgi/src/main/java/calculator/DivideServiceImpl.java new file mode 100644 index 0000000000..cd91935f08 --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/contribution-osgi/src/main/java/calculator/DivideServiceImpl.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 calculator; + +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * An implementation of the Divide service. + */ +public class DivideServiceImpl implements DivideService { + + public double divide(double n1, double n2) { + Logger logger = Logger.getLogger("calculator"); + logger.log(Level.FINEST, "Dividing " + n1 + " with " + n2); + return n1 / n2; + } + +} diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/contribution-osgi/src/main/java/calculator/MultiplyService.java b/sca-java-2.x/branches/2.0/samples/learning-more/contribution-osgi/src/main/java/calculator/MultiplyService.java new file mode 100644 index 0000000000..db568cc762 --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/contribution-osgi/src/main/java/calculator/MultiplyService.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 calculator; + +/** + * The interface for the multiply service + */ +public interface MultiplyService { + + double multiply(double n1, double n2); + +} diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/contribution-osgi/src/main/java/calculator/MultiplyServiceImpl.java b/sca-java-2.x/branches/2.0/samples/learning-more/contribution-osgi/src/main/java/calculator/MultiplyServiceImpl.java new file mode 100644 index 0000000000..c85357fcd8 --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/contribution-osgi/src/main/java/calculator/MultiplyServiceImpl.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 calculator; + +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * An implementation of the Multiply service. + */ +public class MultiplyServiceImpl implements MultiplyService { + + public double multiply(double n1, double n2) { + Logger logger = Logger.getLogger("calculator"); + logger.log(Level.FINEST, "Multiplying " + n1 + " with " + n2); + return n1 * n2; + } + +} diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/contribution-osgi/src/main/java/calculator/SubtractService.java b/sca-java-2.x/branches/2.0/samples/learning-more/contribution-osgi/src/main/java/calculator/SubtractService.java new file mode 100644 index 0000000000..56ee372fc4 --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/contribution-osgi/src/main/java/calculator/SubtractService.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 calculator; + +/** + * The interface for the multiply service + */ +public interface SubtractService { + + double subtract(double n1, double n2); + +} diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/contribution-osgi/src/main/java/calculator/SubtractServiceImpl.java b/sca-java-2.x/branches/2.0/samples/learning-more/contribution-osgi/src/main/java/calculator/SubtractServiceImpl.java new file mode 100644 index 0000000000..1b669084d9 --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/contribution-osgi/src/main/java/calculator/SubtractServiceImpl.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 calculator; + +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * An implementation of the subtract service. + */ +public class SubtractServiceImpl implements SubtractService { + + public double subtract(double n1, double n2) { + Logger logger = Logger.getLogger("calculator"); + logger.log(Level.FINEST, "Subtracting " + n1 + " from " + n2); + return n1 - n2; + } + +} diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/contribution-osgi/src/main/resources/Calculator.composite b/sca-java-2.x/branches/2.0/samples/learning-more/contribution-osgi/src/main/resources/Calculator.composite new file mode 100644 index 0000000000..3a7326caaa --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/contribution-osgi/src/main/resources/Calculator.composite @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/contribution-osgi/src/test/java/calculator/CalculatorTestCase.java b/sca-java-2.x/branches/2.0/samples/learning-more/contribution-osgi/src/test/java/calculator/CalculatorTestCase.java new file mode 100644 index 0000000000..a81b58bced --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/contribution-osgi/src/test/java/calculator/CalculatorTestCase.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 calculator; + +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; + +/* + * A unit test for the Calculator composite that just fires up the + * composite and expects the EagerInit of the CalculatorClient component + * to do its thing + */ +public class CalculatorTestCase { + + @Test + public void testCalculate() throws NoSuchServiceException { + + // Run the SCA composite in a Tuscany runtime + Node node = TuscanyRuntime.runComposite("Calculator.composite", "target/classes"); + try { + + + + } finally { + // Stop the Tuscany runtime Node + node.stop(); + } + } +} diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/calculator-bundle/LICENSE b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/calculator-bundle/LICENSE new file mode 100644 index 0000000000..6e529a25c4 --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/calculator-bundle/LICENSE @@ -0,0 +1,205 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed 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. + + + diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/calculator-bundle/META-INF/MANIFEST.MF b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/calculator-bundle/META-INF/MANIFEST.MF new file mode 100644 index 0000000000..6ce24a4a32 --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/calculator-bundle/META-INF/MANIFEST.MF @@ -0,0 +1,23 @@ +Manifest-Version: 1.0 +Export-Package: calculator.dosgi;version="1.0.1", + calculator.dosgi.operations;version="1.0.1" +Bundle-Version: 1.0.0 +Bundle-Name: calculator.dosgi.dynamic +Bundle-Activator: calculator.dosgi.impl.CalculatorActivator +Bundle-ManifestVersion: 2 +Import-Package: org.oasisopen.sca.annotation;version="2.0.0", + org.osgi.framework, + org.osgi.service.component;resolution:=optional, + org.osgi.service.packageadmin, + org.osgi.util.tracker +Bundle-SymbolicName: calculator.dosgi.dynamic +Bundle-Vendor: The Apache Software Foundation +Bundle-ActivationPolicy: lazy +Eclipse-LazyStart: true +Bundle-License: http://www.apache.org/licenses/LICENSE-2.0.txt +Bundle-DocURL: http://www.apache.org/ +Service-Component-Disabled: OSGI-INF/calculator-component.xml +Bundle-RequiredExecutionEnvironment: J2SE-1.5,JavaSE-1.6 +SCA-Configuration: OSGI-INF/sca-config/calculator-config.xml +Remote-Service: OSGI-INF/remote-service/*.xml + diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/calculator-bundle/NOTICE b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/calculator-bundle/NOTICE new file mode 100644 index 0000000000..6d4936d0ac --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/calculator-bundle/NOTICE @@ -0,0 +1,6 @@ +${pom.name} +Copyright (c) 2005 - 2012 The Apache Software Foundation + +This product includes software developed by +The Apache Software Foundation (http://www.apache.org/). + diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/calculator-bundle/OSGI-INF/blueprint/calculator-module.xml b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/calculator-bundle/OSGI-INF/blueprint/calculator-module.xml new file mode 100644 index 0000000000..fe0bbf21df --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/calculator-bundle/OSGI-INF/blueprint/calculator-module.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/calculator-bundle/OSGI-INF/calculator-component.xml b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/calculator-bundle/OSGI-INF/calculator-component.xml new file mode 100644 index 0000000000..457588bfb6 --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/calculator-bundle/OSGI-INF/calculator-component.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/calculator-bundle/OSGI-INF/remote-service/calculator-service-descriptions.xml b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/calculator-bundle/OSGI-INF/remote-service/calculator-service-descriptions.xml new file mode 100644 index 0000000000..31bd023710 --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/calculator-bundle/OSGI-INF/remote-service/calculator-service-descriptions.xml @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + {http://sample}Add + + + + + + + + + + + + + + {http://sample}Subtract + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/calculator-bundle/OSGI-INF/sca-config/calculator-config.xml b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/calculator-bundle/OSGI-INF/sca-config/calculator-config.xml new file mode 100644 index 0000000000..3350883a1f --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/calculator-bundle/OSGI-INF/sca-config/calculator-config.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/calculator-bundle/README b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/calculator-bundle/README new file mode 100644 index 0000000000..52afa44559 --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/calculator-bundle/README @@ -0,0 +1,6 @@ +Distributed OSGi Calculator Sample +================================== +This sample implements a distributed calculator using Distributed OSGi (RFC 119) over SCA. + +See http://tuscany.apache.org/documentation-2x/20-beta-samples-documentation.html +for more information diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/calculator-bundle/dosgi-calculator.png b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/calculator-bundle/dosgi-calculator.png new file mode 100644 index 0000000000..805baa54d2 Binary files /dev/null and b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/calculator-bundle/dosgi-calculator.png differ diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/calculator-bundle/pom.xml b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/calculator-bundle/pom.xml new file mode 100644 index 0000000000..d753804c64 --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/calculator-bundle/pom.xml @@ -0,0 +1,153 @@ + + + + 4.0.0 + + org.apache.tuscany.sca.samples + tuscany-samples + 2.0 + ../../../pom.xml + + + sample-calculator-bundle-dynamic + Apache Tuscany SCA Sample OSGi Remote Services Dynamic Calculator + + + + org.apache.tuscany.sca + tuscany-feature-ejava + 2.0 + pom + + + org.apache.tuscany.sca + tuscany-feature-webservice + 2.0 + pom + runtime + + + org.apache.tuscany.sca + tuscany-node-launcher-equinox + 2.0 + test + + + + org.apache.tuscany.sca + tuscany-node-impl-osgi + 2.0 + runtime + + + + org.eclipse.osgi + services + 3.2.0-v20090520-1800 + + + + junit + junit + 4.8.1 + test + + + + + org.eclipse.equinox + ds + 1.1.0-v20090601 + test + + + + org.eclipse.equinox + util + 1.0.100-v20090520-1800 + test + + + + + + ${project.artifactId} + + + maven-eclipse-plugin + 2.5.1 + + + org.eclipse.pde.ManifestBuilder + org.eclipse.jdt.core.javabuilder + + + org.eclipse.jdt.core.javanature + org.eclipse.pde.PluginNature + + + org.eclipse.jdt.launching.JRE_CONTAINER + + + + + + + maven-jar-plugin + + + ${basedir}/META-INF/MANIFEST.MF + + + + + + org.apache.tuscany.maven.plugins + maven-osgi-junit-plugin + 1.0 + + + org.apache.tuscany.sca + tuscany-node-launcher-equinox + ${project.version} + + + + + osgi-test + test + + test + + + + + osgi.configuration.area + ${project.build.directory}/equinox + + + + + + + + + + diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/calculator-bundle/src/main/java/calculator/dosgi/CalculatorService.java b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/calculator-bundle/src/main/java/calculator/dosgi/CalculatorService.java new file mode 100644 index 0000000000..796b1afe61 --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/calculator-bundle/src/main/java/calculator/dosgi/CalculatorService.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 calculator.dosgi; + +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/samples/learning-more/distributed-osgi-dynamic/calculator-bundle/src/main/java/calculator/dosgi/impl/CalculatorActivator.java b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/calculator-bundle/src/main/java/calculator/dosgi/impl/CalculatorActivator.java new file mode 100644 index 0000000000..b14c9e2f4a --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/calculator-bundle/src/main/java/calculator/dosgi/impl/CalculatorActivator.java @@ -0,0 +1,78 @@ +/* + * 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.dosgi.impl; + +import java.util.Dictionary; +import java.util.Hashtable; +import java.util.logging.Logger; + +import org.osgi.framework.Bundle; +import org.osgi.framework.BundleActivator; +import org.osgi.framework.BundleContext; +import org.osgi.framework.ServiceReference; +import org.osgi.service.packageadmin.PackageAdmin; + +import calculator.dosgi.CalculatorService; +import calculator.dosgi.operations.AddService; + +/** + * + */ +public class CalculatorActivator implements BundleActivator { + private Logger logger = Logger.getLogger(CalculatorActivator.class.getName()); + + private Bundle getBundle(BundleContext bundleContext, Class cls) { + PackageAdmin packageAdmin = null; + // PackageAdmin is used to resolve bundles + ServiceReference ref = bundleContext.getServiceReference("org.osgi.service.packageadmin.PackageAdmin"); + if (ref != null) { + packageAdmin = (PackageAdmin)bundleContext.getService(ref); + Bundle bundle = packageAdmin.getBundle(cls); + if (bundle != null) { + logger.info(cls.getName() + " is loaded by bundle: " + bundle.getSymbolicName()); + } + bundleContext.ungetService(ref); + return bundle; + } + return null; + } + + public void start(BundleContext context) throws Exception { + logger.info("Starting " + context.getBundle()); + Dictionary props = new Hashtable(); + props.put("sca.service", "CalculatorComponent#service-name(Calculator)"); + props.put("calculator", "Calculator"); + props.put("service.exported.configs", new String[] {"org.osgi.sca"}); + props.put("org.osgi.sca.bindings", new String[] {"{http://sample}Calculator"}); + props.put("service.exported.interfaces", new String[] {"*"}); + logger.info("Registering " + CalculatorService.class.getName()); + CalculatorService calculator = new CalculatorServiceImpl(context); + context.registerService(CalculatorService.class.getName(), calculator, props); + + getBundle(context, AddService.class); + + } + + public void stop(BundleContext context) throws Exception { + logger.info("Stopping " + context.getBundle()); + // Registered services will be automatically unregistered + } + +} diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/calculator-bundle/src/main/java/calculator/dosgi/impl/CalculatorServiceDSImpl.java b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/calculator-bundle/src/main/java/calculator/dosgi/impl/CalculatorServiceDSImpl.java new file mode 100644 index 0000000000..9c80c5beb9 --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/calculator-bundle/src/main/java/calculator/dosgi/impl/CalculatorServiceDSImpl.java @@ -0,0 +1,114 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package calculator.dosgi.impl; + +import org.osgi.service.component.ComponentContext; + +import calculator.dosgi.CalculatorService; +import calculator.dosgi.operations.AddService; +import calculator.dosgi.operations.DivideService; +import calculator.dosgi.operations.MultiplyService; +import calculator.dosgi.operations.SubtractService; + +/** + * An implementation of the Calculator service. + */ +public class CalculatorServiceDSImpl implements CalculatorService { + private AddService addService; + private SubtractService subtractService; + private MultiplyService multiplyService; + private DivideService divideService; + + public CalculatorServiceDSImpl() { + super(); + System.out.println("CalculatorServiceDSImpl()"); + } + + protected void activate(ComponentContext context) { + System.out.println("Activating " + context); + } + + protected void deactivate(ComponentContext context) { + System.out.println("Deactivating " + context); + } + + /* + * The following setters can be used for DS injection + */ + public void setAddService(AddService addService) { + System.out.println("setAddService()"); + this.addService = addService; + } + + public void setSubtractService(SubtractService subtractService) { + this.subtractService = subtractService; + } + + public void setDivideService(DivideService divideService) { + this.divideService = divideService; + } + + public void setMultiplyService(MultiplyService multiplyService) { + this.multiplyService = multiplyService; + } + + /* + * The following setters can be used for DS injection + */ + public void unsetAddService(AddService addService) { + System.out.println("unsetAddService()"); + this.addService = null; + } + + public void unsetSubtractService(SubtractService subtractService) { + this.subtractService = null; + } + + public void unsetDivideService(DivideService divideService) { + this.divideService = null; + } + + public void unsetMultiplyService(MultiplyService multiplyService) { + this.multiplyService = null; + } + private T getService(Class cls) { + for (Object s : new Object[] {addService, subtractService, multiplyService, divideService}) { + if (cls.isInstance(s)) { + return cls.cast(s); + } + } + throw new IllegalStateException(cls.getSimpleName() + " is not available"); + } + + public double add(double n1, double n2) { + return getService(AddService.class).add(n1, n2); + } + + public double subtract(double n1, double n2) { + return getService(SubtractService.class).subtract(n1, n2); + } + + public double multiply(double n1, double n2) { + return getService(MultiplyService.class).multiply(n1, n2); + } + + public double divide(double n1, double n2) { + return getService(DivideService.class).divide(n1, n2); + } +} diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/calculator-bundle/src/main/java/calculator/dosgi/impl/CalculatorServiceImpl.java b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/calculator-bundle/src/main/java/calculator/dosgi/impl/CalculatorServiceImpl.java new file mode 100644 index 0000000000..c22706c9f6 --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/calculator-bundle/src/main/java/calculator/dosgi/impl/CalculatorServiceImpl.java @@ -0,0 +1,99 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package calculator.dosgi.impl; + +import static org.osgi.framework.Constants.OBJECTCLASS; + +import java.util.HashMap; +import java.util.Map; + +import org.osgi.framework.BundleContext; +import org.osgi.framework.Filter; +import org.osgi.framework.InvalidSyntaxException; +import org.osgi.util.tracker.ServiceTracker; + +import calculator.dosgi.CalculatorService; +import calculator.dosgi.operations.AddService; +import calculator.dosgi.operations.DivideService; +import calculator.dosgi.operations.MultiplyService; +import calculator.dosgi.operations.SubtractService; + +/** + * An implementation of the Calculator service. + */ +public class CalculatorServiceImpl implements CalculatorService { + private Map, ServiceTracker> remoteServices = new HashMap, ServiceTracker>(); + + public CalculatorServiceImpl() { + super(); + } + + public CalculatorServiceImpl(BundleContext context) { + super(); + for (Class cls : new Class[] {AddService.class, SubtractService.class, MultiplyService.class, + DivideService.class}) { + Filter remoteFilter = null; + try { + remoteFilter = + context.createFilter("(&(" + OBJECTCLASS + "=" + cls.getName() + ") (service.imported=*))"); + } catch (InvalidSyntaxException e) { + e.printStackTrace(); + } + ServiceTracker tracker = new ServiceTracker(context, remoteFilter, null); + this.remoteServices.put(cls, tracker); + tracker.open(); + } + } + + private T getService(Class cls) { + ServiceTracker tracker = remoteServices.get(cls); + try { + // Wait for 10 seconds until the remote services are imported + tracker.waitForService(10000); + } catch (InterruptedException e) { + throw new IllegalStateException(cls.getSimpleName() + " is not available"); + } + Object[] remoteObjects = tracker.getServices(); + if (remoteObjects != null) { + for (Object s : remoteObjects) { + if (cls.isInstance(s)) { + System.out.println("Remote service: " + s); + return cls.cast(s); + } + } + } + throw new IllegalStateException(cls.getSimpleName() + " is not available"); + } + + public double add(double n1, double n2) { + return getService(AddService.class).add(n1, n2); + } + + public double subtract(double n1, double n2) { + return getService(SubtractService.class).subtract(n1, n2); + } + + public double multiply(double n1, double n2) { + return getService(MultiplyService.class).multiply(n1, n2); + } + + public double divide(double n1, double n2) { + return getService(DivideService.class).divide(n1, n2); + } +} diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/calculator-bundle/src/main/java/calculator/dosgi/operations/AddService.java b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/calculator-bundle/src/main/java/calculator/dosgi/operations/AddService.java new file mode 100644 index 0000000000..7d68dbd5c5 --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/calculator-bundle/src/main/java/calculator/dosgi/operations/AddService.java @@ -0,0 +1,31 @@ +/* + * 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.dosgi.operations; + +import org.oasisopen.sca.annotation.Remotable; + +/** + * The interface for the add service + */ +@Remotable +public interface AddService { + + double add(double n1, double n2); + +} diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/calculator-bundle/src/main/java/calculator/dosgi/operations/DivideService.java b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/calculator-bundle/src/main/java/calculator/dosgi/operations/DivideService.java new file mode 100644 index 0000000000..998f6e9554 --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/calculator-bundle/src/main/java/calculator/dosgi/operations/DivideService.java @@ -0,0 +1,31 @@ +/* + * 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.dosgi.operations; + +import org.oasisopen.sca.annotation.Remotable; + +/** + * The interface for the divide service + */ +@Remotable +public interface DivideService { + + double divide(double n1, double n2); + +} diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/calculator-bundle/src/main/java/calculator/dosgi/operations/MultiplyService.java b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/calculator-bundle/src/main/java/calculator/dosgi/operations/MultiplyService.java new file mode 100644 index 0000000000..7ed6db2e6b --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/calculator-bundle/src/main/java/calculator/dosgi/operations/MultiplyService.java @@ -0,0 +1,31 @@ +/* + * 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.dosgi.operations; + +import org.oasisopen.sca.annotation.Remotable; + +/** + * The interface for the multiply service + */ +@Remotable +public interface MultiplyService { + + double multiply(double n1, double n2); + +} diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/calculator-bundle/src/main/java/calculator/dosgi/operations/SubtractService.java b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/calculator-bundle/src/main/java/calculator/dosgi/operations/SubtractService.java new file mode 100644 index 0000000000..cb98b8fb67 --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/calculator-bundle/src/main/java/calculator/dosgi/operations/SubtractService.java @@ -0,0 +1,31 @@ +/* + * 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.dosgi.operations; + +import org.oasisopen.sca.annotation.Remotable; + +/** + * The interface for the subtract service + */ +@Remotable +public interface SubtractService { + + double subtract(double n1, double n2); + +} diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/calculator-bundle/src/main/java/calculator/rmi/OperationsRMIServer.java b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/calculator-bundle/src/main/java/calculator/rmi/OperationsRMIServer.java new file mode 100644 index 0000000000..1a3e36f571 --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/calculator-bundle/src/main/java/calculator/rmi/OperationsRMIServer.java @@ -0,0 +1,93 @@ +/* + * 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.rmi; + +import java.io.Serializable; +import java.rmi.Remote; +import java.rmi.RemoteException; +import java.rmi.registry.LocateRegistry; +import java.rmi.registry.Registry; +import java.rmi.server.UnicastRemoteObject; + +/** + * + */ +public class OperationsRMIServer implements OperationsRemote, Serializable { + + private static final long serialVersionUID = 6081008315263103012L; + private transient Registry registry; + + public OperationsRMIServer() throws RemoteException { + super(); + } + + public double add(double n1, double n2) { + return n1 + n2; + } + + public double subtract(double n1, double n2) { + return n1 - n2; + } + + public double divide(double n1, double n2) { + return n1 / n2; + } + + public double multiply(double n1, double n2) { + return n1 * n2; + } + + public void start() throws RemoteException { + Thread thread = new Thread() { + public void run() { + try { + System.out.println("Starting the RMI server for calculator operations..."); + Remote stub = UnicastRemoteObject.exportObject(OperationsRMIServer.this); + registry = LocateRegistry.createRegistry(8085); + registry.bind("AddService", stub); + registry.bind("SubtractService", stub); + registry.bind("MultiplyService", stub); + registry.bind("DivideService", stub); + System.out.println("RMI server for calculator operations is now started."); + } catch (Exception e) { + e.printStackTrace(); + } + } + }; + thread.start(); + } + + public void stop() { + if (registry != null) { + try { + registry.unbind("AddService"); + registry.unbind("SubtractService"); + registry.unbind("MultiplyService"); + registry.unbind("DivideService"); + UnicastRemoteObject.unexportObject(this, false); + UnicastRemoteObject.unexportObject(registry, false); + registry = null; + } catch (Exception e) { + e.printStackTrace(); + } + } + } + +} diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/calculator-bundle/src/main/java/calculator/rmi/OperationsRMIServer_Stub.java b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/calculator-bundle/src/main/java/calculator/rmi/OperationsRMIServer_Stub.java new file mode 100644 index 0000000000..d573f6b8fa --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/calculator-bundle/src/main/java/calculator/rmi/OperationsRMIServer_Stub.java @@ -0,0 +1,132 @@ +/* + * 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. + */ + +// Stub class generated by rmic, do not edit. +// Contents subject to change without notice. +package calculator.rmi; + +public final class OperationsRMIServer_Stub extends java.rmi.server.RemoteStub implements calculator.rmi.OperationsRemote { + private static final long serialVersionUID = 2; + + private static java.lang.reflect.Method $method_add_0; + private static java.lang.reflect.Method $method_divide_1; + private static java.lang.reflect.Method $method_multiply_2; + private static java.lang.reflect.Method $method_subtract_3; + + static { + try { + $method_add_0 = + calculator.rmi.OperationsRemote.class.getMethod("add", new java.lang.Class[] {double.class, double.class}); + $method_divide_1 = + calculator.rmi.OperationsRemote.class.getMethod("divide", + new java.lang.Class[] {double.class, double.class}); + $method_multiply_2 = + calculator.rmi.OperationsRemote.class.getMethod("multiply", new java.lang.Class[] {double.class, + double.class}); + $method_subtract_3 = + calculator.rmi.OperationsRemote.class.getMethod("subtract", new java.lang.Class[] {double.class, + double.class}); + } catch (java.lang.NoSuchMethodException e) { + throw new java.lang.NoSuchMethodError("stub class initialization failed"); + } + } + + // constructors + public OperationsRMIServer_Stub(java.rmi.server.RemoteRef ref) { + super(ref); + } + + // methods from remote interfaces + + // implementation of add(double, double) + public double add(double $param_double_1, double $param_double_2) throws java.rmi.RemoteException { + try { + Object $result = + ref.invoke(this, + $method_add_0, + new java.lang.Object[] {new java.lang.Double($param_double_1), + new java.lang.Double($param_double_2)}, + 864055858262779977L); + return ((java.lang.Double)$result).doubleValue(); + } catch (java.lang.RuntimeException e) { + throw e; + } catch (java.rmi.RemoteException e) { + throw e; + } catch (java.lang.Exception e) { + throw new java.rmi.UnexpectedException("undeclared checked exception", e); + } + } + + // implementation of divide(double, double) + public double divide(double $param_double_1, double $param_double_2) throws java.rmi.RemoteException { + try { + Object $result = + ref.invoke(this, + $method_divide_1, + new java.lang.Object[] {new java.lang.Double($param_double_1), + new java.lang.Double($param_double_2)}, + 8097593626497421928L); + return ((java.lang.Double)$result).doubleValue(); + } catch (java.lang.RuntimeException e) { + throw e; + } catch (java.rmi.RemoteException e) { + throw e; + } catch (java.lang.Exception e) { + throw new java.rmi.UnexpectedException("undeclared checked exception", e); + } + } + + // implementation of multiply(double, double) + public double multiply(double $param_double_1, double $param_double_2) throws java.rmi.RemoteException { + try { + Object $result = + ref.invoke(this, + $method_multiply_2, + new java.lang.Object[] {new java.lang.Double($param_double_1), + new java.lang.Double($param_double_2)}, + -346155016949350695L); + return ((java.lang.Double)$result).doubleValue(); + } catch (java.lang.RuntimeException e) { + throw e; + } catch (java.rmi.RemoteException e) { + throw e; + } catch (java.lang.Exception e) { + throw new java.rmi.UnexpectedException("undeclared checked exception", e); + } + } + + // implementation of subtract(double, double) + public double subtract(double $param_double_1, double $param_double_2) throws java.rmi.RemoteException { + try { + Object $result = + ref.invoke(this, + $method_subtract_3, + new java.lang.Object[] {new java.lang.Double($param_double_1), + new java.lang.Double($param_double_2)}, + -610707357620578750L); + return ((java.lang.Double)$result).doubleValue(); + } catch (java.lang.RuntimeException e) { + throw e; + } catch (java.rmi.RemoteException e) { + throw e; + } catch (java.lang.Exception e) { + throw new java.rmi.UnexpectedException("undeclared checked exception", e); + } + } +} diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/calculator-bundle/src/main/java/calculator/rmi/OperationsRemote.java b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/calculator-bundle/src/main/java/calculator/rmi/OperationsRemote.java new file mode 100644 index 0000000000..d735ce8172 --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/calculator-bundle/src/main/java/calculator/rmi/OperationsRemote.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 calculator.rmi; + +import java.rmi.Remote; +import java.rmi.RemoteException; + +/** + * RMI Remote interface + */ +public interface OperationsRemote extends Remote { + double add(double n1, double n2) throws RemoteException; + + double subtract(double n1, double n2) throws RemoteException; + + double multiply(double n1, double n2) throws RemoteException; + + double divide(double n1, double n2) throws RemoteException; + +} diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/calculator-bundle/src/test/java/calculator/dosgi/test/CalculatorNode.java b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/calculator-bundle/src/test/java/calculator/dosgi/test/CalculatorNode.java new file mode 100644 index 0000000000..7f96067764 --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/calculator-bundle/src/test/java/calculator/dosgi/test/CalculatorNode.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 calculator.dosgi.test; + +import org.apache.tuscany.sca.node.equinox.launcher.NodeLauncher; + +/** + * + */ +public class CalculatorNode { + + /** + * @param args + */ + public static void main(String[] args) { + if (args.length == 0) { + args = new String[] {"-bundles"}; + } + try { + NodeLauncher.main(args); + } catch (Exception e) { + e.printStackTrace(); + } + } + +} diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/calculator-bundle/src/test/java/calculator/dosgi/test/CalculatorOSGiNodeTestCase.java b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/calculator-bundle/src/test/java/calculator/dosgi/test/CalculatorOSGiNodeTestCase.java new file mode 100644 index 0000000000..8be6de5e41 --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/calculator-bundle/src/test/java/calculator/dosgi/test/CalculatorOSGiNodeTestCase.java @@ -0,0 +1,144 @@ +/* + * 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.dosgi.test; + +import static calculator.dosgi.test.OSGiTestUtils.bundleStatus; + +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.Reader; +import java.net.URL; + +import org.apache.tuscany.sca.node.equinox.launcher.EquinoxHost; +import org.junit.AfterClass; +import org.junit.Assert; +import org.junit.BeforeClass; +import org.junit.Test; +import org.osgi.framework.Bundle; +import org.osgi.framework.BundleContext; +import org.osgi.framework.Constants; +import org.osgi.framework.ServiceReference; + +import calculator.dosgi.CalculatorService; +import calculator.rmi.OperationsRMIServer; + +/** + * + */ +public class CalculatorOSGiNodeTestCase { + private static EquinoxHost host; + private static BundleContext context; + private static Bundle calculatorBundle; + private static OperationsRMIServer rmiServer; + + /** + * @throws java.lang.Exception + */ + @BeforeClass + public static void setUpBeforeClass() throws Exception { + try { + rmiServer = new OperationsRMIServer(); + rmiServer.start(); + + host = new EquinoxHost(); + context = host.start(); + + for (Bundle b : context.getBundles()) { + System.out.println(b); + if (b.getSymbolicName().equals("org.eclipse.equinox.ds") || b.getSymbolicName() + .startsWith("org.apache.tuscany.sca.")) { + try { + if (b.getHeaders().get(Constants.FRAGMENT_HOST) == null) { + // Start the non-fragment bundle + b.start(); + } + } catch (Exception e) { + e.printStackTrace(); + } + System.out.println(bundleStatus(b, false)); + } + if ("calculator.dosgi.dynamic".equals(b.getSymbolicName())) { + calculatorBundle = b; + } + } + + if (calculatorBundle != null) { + calculatorBundle.start(); + System.out.println(bundleStatus(calculatorBundle, false)); + } + + } catch (Exception e) { + e.printStackTrace(); + throw e; + } + } + + @Test + public void testOSGi() { + ServiceReference ref = + calculatorBundle.getBundleContext().getServiceReference(CalculatorService.class.getName()); + Assert.assertNotNull(ref); + Object service = context.getService(ref); + Assert.assertNotNull(service); + CalculatorService calculator = OSGiTestUtils.cast(service, CalculatorService.class); + System.out.println("2.0 + 1.0 = " + calculator.add(2.0, 1.0)); + System.out.println("2.0 - 1.0 = " + calculator.subtract(2.0, 1.0)); + System.out.println("2.0 * 1.0 = " + calculator.multiply(2.0, 1.0)); + System.out.println("2.0 / 1.0 = " + calculator.divide(2.0, 1.0)); + } + + @Test + /** + * Test the Web service exposed by the Calculator + */ + public void testWS() throws Exception { + URL url = new URL("http://localhost:8086/CalculatorService?wsdl"); + InputStream is = url.openStream(); + Reader reader = new InputStreamReader(is); + char[] content = new char[10240]; // 10k + int len = 0; + while (true) { + int size = reader.read(content, len, content.length - len); + if (size < 0) { + break; + } + len += size; + } + Assert.assertTrue(len > 0); + String str = new String(content, 0, len); + System.out.println(str); + Assert.assertTrue(str.indexOf(" + * @param obj + * @param cls + * @return + */ + public static T cast(Object obj, Class cls) { + if (cls.isInstance(obj)) { + return cls.cast(obj); + } else { + return cls.cast(Proxy.newProxyInstance(cls.getClassLoader(), + new Class[] {cls}, + new InvocationHandlerImpl(obj))); + } + } +} diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/operations-bundle/LICENSE b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/operations-bundle/LICENSE new file mode 100644 index 0000000000..6e529a25c4 --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/operations-bundle/LICENSE @@ -0,0 +1,205 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed 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. + + + diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/operations-bundle/META-INF/MANIFEST.MF b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/operations-bundle/META-INF/MANIFEST.MF new file mode 100644 index 0000000000..cea4e2ff79 --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/operations-bundle/META-INF/MANIFEST.MF @@ -0,0 +1,23 @@ +Manifest-Version: 1.0 +Export-Package: calculator.dosgi.operations;version="1.0.1" +Bundle-Version: 1.0.0 +Bundle-Name: calculator.dosgi.dynamic.operations +Bundle-Activator: calculator.dosgi.operations.impl.OperationsActivator +Bundle-ManifestVersion: 2 +Import-Package: calculator.dosgi.operations;version="[1.0.1,1.0.1]", + org.oasisopen.sca.annotation;version="2.0.0", + org.osgi.framework, + org.osgi.service.component;resolution:=optional, + org.osgi.service.packageadmin +Bundle-SymbolicName: calculator.dosgi.dynamic.operations +Bundle-Vendor: The Apache Software Foundation +Bundle-ActivationPolicy: lazy +Eclipse-LazyStart: true +Bundle-License: http://www.apache.org/licenses/LICENSE-2.0.txt +Bundle-DocURL: http://www.apache.org/ +Service-Component-Disabled: OSGI-INF/add-component.xml, + OSGI-INF/subtract-component.xml, + OSGI-INF/multiply-component.xml, + OSGI-INF/divide-component.xml +Bundle-RequiredExecutionEnvironment: J2SE-1.5,JavaSE-1.6 +SCA-Configuration: OSGI-INF/sca-config/*.xml diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/operations-bundle/NOTICE b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/operations-bundle/NOTICE new file mode 100644 index 0000000000..6d4936d0ac --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/operations-bundle/NOTICE @@ -0,0 +1,6 @@ +${pom.name} +Copyright (c) 2005 - 2012 The Apache Software Foundation + +This product includes software developed by +The Apache Software Foundation (http://www.apache.org/). + diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/operations-bundle/OSGI-INF/add-component.xml b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/operations-bundle/OSGI-INF/add-component.xml new file mode 100644 index 0000000000..bf4ccc3d28 --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/operations-bundle/OSGI-INF/add-component.xml @@ -0,0 +1,25 @@ + + + + + + + + diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/operations-bundle/OSGI-INF/blueprint/operations-module.xml b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/operations-bundle/OSGI-INF/blueprint/operations-module.xml new file mode 100644 index 0000000000..e3b690f24a --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/operations-bundle/OSGI-INF/blueprint/operations-module.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/operations-bundle/OSGI-INF/divide-component.xml b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/operations-bundle/OSGI-INF/divide-component.xml new file mode 100644 index 0000000000..b939a5de80 --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/operations-bundle/OSGI-INF/divide-component.xml @@ -0,0 +1,25 @@ + + + + + + + + diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/operations-bundle/OSGI-INF/multiply-component.xml b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/operations-bundle/OSGI-INF/multiply-component.xml new file mode 100644 index 0000000000..2bf897d72a --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/operations-bundle/OSGI-INF/multiply-component.xml @@ -0,0 +1,25 @@ + + + + + + + + diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/operations-bundle/OSGI-INF/sca-config/operations-config.xml b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/operations-bundle/OSGI-INF/sca-config/operations-config.xml new file mode 100644 index 0000000000..300a7d374c --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/operations-bundle/OSGI-INF/sca-config/operations-config.xml @@ -0,0 +1,29 @@ + + + + + + + + + \ No newline at end of file diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/operations-bundle/OSGI-INF/subtract-component.xml b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/operations-bundle/OSGI-INF/subtract-component.xml new file mode 100644 index 0000000000..4af00695da --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/operations-bundle/OSGI-INF/subtract-component.xml @@ -0,0 +1,25 @@ + + + + + + + + diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/operations-bundle/README b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/operations-bundle/README new file mode 100644 index 0000000000..52afa44559 --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/operations-bundle/README @@ -0,0 +1,6 @@ +Distributed OSGi Calculator Sample +================================== +This sample implements a distributed calculator using Distributed OSGi (RFC 119) over SCA. + +See http://tuscany.apache.org/documentation-2x/20-beta-samples-documentation.html +for more information diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/operations-bundle/pom.xml b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/operations-bundle/pom.xml new file mode 100644 index 0000000000..cab2d5e57b --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/operations-bundle/pom.xml @@ -0,0 +1,159 @@ + + + + 4.0.0 + + org.apache.tuscany.sca.samples + tuscany-samples + 2.0 + ../../../pom.xml + + + sample-operations-bundle-dynamic + Apache Tuscany SCA Sample OSGi Remote Services Dynamic Operations + + + + org.apache.tuscany.sca + tuscany-base-runtime-pom + 2.0 + pom + + + org.apache.tuscany.sca + tuscany-osgi-runtime-pom + 2.0 + pom + + + org.apache.tuscany.sca + tuscany-binding-rmi-runtime + 2.0 + + + + org.apache.tuscany.sca + tuscany-node-launcher-equinox + 2.0 + test + + + + org.apache.tuscany.sca + tuscany-node-impl-osgi + 2.0 + runtime + + + + org.eclipse.osgi + services + 3.2.0-v20090520-1800 + test + + + + + org.eclipse.equinox + ds + 1.1.0-v20090601 + test + + + + org.eclipse.equinox + util + 1.0.100-v20090520-1800 + test + + + + junit + junit + 4.8.1 + test + + + + + + ${project.artifactId} + + + maven-eclipse-plugin + 2.5.1 + + + org.eclipse.pde.ManifestBuilder + org.eclipse.jdt.core.javabuilder + + + org.eclipse.jdt.core.javanature + org.eclipse.pde.PluginNature + + + org.eclipse.jdt.launching.JRE_CONTAINER + + + + + + + maven-jar-plugin + + + ${basedir}/META-INF/MANIFEST.MF + + + + + + org.apache.tuscany.maven.plugins + maven-osgi-junit-plugin + 1.0 + + + org.apache.tuscany.sca + tuscany-node-launcher-equinox + ${project.version} + + + + + osgi-test + test + + test + + + + + osgi.configuration.area + ${project.build.directory}/equinox + + + + + + + + + + diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/operations-bundle/src/main/java/calculator/dosgi/operations/AddService.java b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/operations-bundle/src/main/java/calculator/dosgi/operations/AddService.java new file mode 100644 index 0000000000..7d68dbd5c5 --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/operations-bundle/src/main/java/calculator/dosgi/operations/AddService.java @@ -0,0 +1,31 @@ +/* + * 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.dosgi.operations; + +import org.oasisopen.sca.annotation.Remotable; + +/** + * The interface for the add service + */ +@Remotable +public interface AddService { + + double add(double n1, double n2); + +} diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/operations-bundle/src/main/java/calculator/dosgi/operations/DivideService.java b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/operations-bundle/src/main/java/calculator/dosgi/operations/DivideService.java new file mode 100644 index 0000000000..998f6e9554 --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/operations-bundle/src/main/java/calculator/dosgi/operations/DivideService.java @@ -0,0 +1,31 @@ +/* + * 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.dosgi.operations; + +import org.oasisopen.sca.annotation.Remotable; + +/** + * The interface for the divide service + */ +@Remotable +public interface DivideService { + + double divide(double n1, double n2); + +} diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/operations-bundle/src/main/java/calculator/dosgi/operations/MultiplyService.java b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/operations-bundle/src/main/java/calculator/dosgi/operations/MultiplyService.java new file mode 100644 index 0000000000..7ed6db2e6b --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/operations-bundle/src/main/java/calculator/dosgi/operations/MultiplyService.java @@ -0,0 +1,31 @@ +/* + * 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.dosgi.operations; + +import org.oasisopen.sca.annotation.Remotable; + +/** + * The interface for the multiply service + */ +@Remotable +public interface MultiplyService { + + double multiply(double n1, double n2); + +} diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/operations-bundle/src/main/java/calculator/dosgi/operations/SubtractService.java b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/operations-bundle/src/main/java/calculator/dosgi/operations/SubtractService.java new file mode 100644 index 0000000000..cb98b8fb67 --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/operations-bundle/src/main/java/calculator/dosgi/operations/SubtractService.java @@ -0,0 +1,31 @@ +/* + * 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.dosgi.operations; + +import org.oasisopen.sca.annotation.Remotable; + +/** + * The interface for the subtract service + */ +@Remotable +public interface SubtractService { + + double subtract(double n1, double n2); + +} diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/operations-bundle/src/main/java/calculator/dosgi/operations/impl/AddServiceImpl.java b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/operations-bundle/src/main/java/calculator/dosgi/operations/impl/AddServiceImpl.java new file mode 100644 index 0000000000..e0a6622136 --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/operations-bundle/src/main/java/calculator/dosgi/operations/impl/AddServiceImpl.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 calculator.dosgi.operations.impl; + +import java.util.logging.Level; +import java.util.logging.Logger; + +import calculator.dosgi.operations.AddService; + +/** + * An implementation of the Add service + */ +public class AddServiceImpl implements AddService { + + public double add(double n1, double n2) { + Logger logger = Logger.getLogger("calculator"); + logger.log(Level.INFO, "Adding " + n1 + " and " + n2); + return n1 + n2; + } + +} diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/operations-bundle/src/main/java/calculator/dosgi/operations/impl/DivideServiceImpl.java b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/operations-bundle/src/main/java/calculator/dosgi/operations/impl/DivideServiceImpl.java new file mode 100644 index 0000000000..028f860885 --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/operations-bundle/src/main/java/calculator/dosgi/operations/impl/DivideServiceImpl.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 calculator.dosgi.operations.impl; + +import java.util.logging.Level; +import java.util.logging.Logger; + +import calculator.dosgi.operations.DivideService; + +/** + * An implementation of the Divide service. + */ +public class DivideServiceImpl implements DivideService { + + public double divide(double n1, double n2) { + Logger logger = Logger.getLogger("calculator"); + logger.log(Level.INFO, "Dividing " + n1 + " with " + n2); + return n1 / n2; + } + +} diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/operations-bundle/src/main/java/calculator/dosgi/operations/impl/MultiplyServiceImpl.java b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/operations-bundle/src/main/java/calculator/dosgi/operations/impl/MultiplyServiceImpl.java new file mode 100644 index 0000000000..e928317c2e --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/operations-bundle/src/main/java/calculator/dosgi/operations/impl/MultiplyServiceImpl.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 calculator.dosgi.operations.impl; + +import java.util.logging.Level; +import java.util.logging.Logger; + +import calculator.dosgi.operations.MultiplyService; + +/** + * An implementation of the Multiply service. + */ +public class MultiplyServiceImpl implements MultiplyService { + + public double multiply(double n1, double n2) { + Logger logger = Logger.getLogger("calculator"); + logger.log(Level.INFO, "Multiplying " + n1 + " with " + n2); + return n1 * n2; + } + +} diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/operations-bundle/src/main/java/calculator/dosgi/operations/impl/OperationsActivator.java b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/operations-bundle/src/main/java/calculator/dosgi/operations/impl/OperationsActivator.java new file mode 100644 index 0000000000..e01265068a --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/operations-bundle/src/main/java/calculator/dosgi/operations/impl/OperationsActivator.java @@ -0,0 +1,94 @@ +/* + * 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.dosgi.operations.impl; + +import java.util.Dictionary; +import java.util.Hashtable; +import java.util.logging.Logger; + +import org.osgi.framework.Bundle; +import org.osgi.framework.BundleActivator; +import org.osgi.framework.BundleContext; +import org.osgi.framework.ServiceReference; +import org.osgi.service.packageadmin.PackageAdmin; + +import calculator.dosgi.operations.AddService; +import calculator.dosgi.operations.DivideService; +import calculator.dosgi.operations.MultiplyService; +import calculator.dosgi.operations.SubtractService; + +/** + * + */ +public class OperationsActivator implements BundleActivator { + private Logger logger = Logger.getLogger(OperationsActivator.class.getName()); + + public void start(BundleContext context) throws Exception { + logger.info("Starting " + context.getBundle()); + + Dictionary props = new Hashtable(); + props.put("service.exported.configs", new String[] {"org.osgi.sca"}); + props.put("service.exported.interfaces", new String[] {"*"}); + + logger.info("Registering " + AddService.class.getName()); + props.put("sca.service", "AddComponent#service-name(Add)"); + props.put("org.osgi.sca.bindings", new String[] {"{http://sample}Add"}); + context.registerService(AddService.class.getName(), new AddServiceImpl(), props); + + logger.info("Registering " + SubtractService.class.getName()); + props.put("sca.service", "SubtractComponent#service-name(Subtract)"); + props.put("org.osgi.sca.bindings", new String[] {"{http://sample}Subtract"}); + context.registerService(SubtractService.class.getName(), new SubtractServiceImpl(), props); + + logger.info("Registering " + MultiplyService.class.getName()); + props.put("sca.service", "MultiplyComponent#service-name(Multiply)"); + props.put("org.osgi.sca.bindings", new String[] {"{http://sample}Multiply"}); + context.registerService(MultiplyService.class.getName(), new MultiplyServiceImpl(), props); + + logger.info("Registering " + DivideService.class.getName()); + props.put("sca.service", "DivideComponent#service-name(Divide)"); + props.put("org.osgi.sca.bindings", new String[] {"{http://sample}Divide"}); + context.registerService(DivideService.class.getName(), new DivideServiceImpl(), props); + + getBundle(context, AddService.class); + } + + public void stop(BundleContext context) throws Exception { + logger.info("Stopping " + context.getBundle()); + // Registered services will be automatically unregistered + } + + private Bundle getBundle(BundleContext bundleContext, Class cls) { + PackageAdmin packageAdmin = null; + // PackageAdmin is used to resolve bundles + ServiceReference ref = bundleContext.getServiceReference("org.osgi.service.packageadmin.PackageAdmin"); + if (ref != null) { + packageAdmin = (PackageAdmin)bundleContext.getService(ref); + Bundle bundle = packageAdmin.getBundle(cls); + if (bundle != null) { + logger.info(cls.getName() + " is loaded by bundle: " + bundle.getSymbolicName()); + } + bundleContext.ungetService(ref); + return bundle; + } + return null; + } + +} diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/operations-bundle/src/main/java/calculator/dosgi/operations/impl/SubtractServiceImpl.java b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/operations-bundle/src/main/java/calculator/dosgi/operations/impl/SubtractServiceImpl.java new file mode 100644 index 0000000000..565670963f --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/operations-bundle/src/main/java/calculator/dosgi/operations/impl/SubtractServiceImpl.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 calculator.dosgi.operations.impl; + +import java.util.logging.Level; +import java.util.logging.Logger; + +import calculator.dosgi.operations.SubtractService; + +/** + * An implementation of the subtract service. + */ +public class SubtractServiceImpl implements SubtractService { + + public double subtract(double n1, double n2) { + Logger logger = Logger.getLogger("calculator"); + logger.log(Level.INFO, "Subtracting " + n1 + " from " + n2); + return n1 - n2; + } + +} diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/operations-bundle/src/test/java/calculator/dosgi/operations/test/OSGiTestUtils.java b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/operations-bundle/src/test/java/calculator/dosgi/operations/test/OSGiTestUtils.java new file mode 100644 index 0000000000..3407507e3b --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/operations-bundle/src/test/java/calculator/dosgi/operations/test/OSGiTestUtils.java @@ -0,0 +1,105 @@ +/* + * 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.dosgi.operations.test; + +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Method; +import java.lang.reflect.Proxy; + +import org.osgi.framework.Bundle; + +/** + * + * Utility class to create OSGi bundles + * + * @version $Rev: 796166 $ $Date: 2009-07-21 08:03:47 +0100 (Tue, 21 Jul 2009) $ + */ +public class OSGiTestUtils { + private static class InvocationHandlerImpl implements InvocationHandler { + private Object instance; + + public InvocationHandlerImpl(Object instance) { + super(); + this.instance = instance; + } + + public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { + Method m = instance.getClass().getMethod(method.getName(), method.getParameterTypes()); + return m.invoke(instance, args); + } + + } + + /** + * Returns a string representation of the given bundle. + * + * @param b + * @param verbose + * @return + */ + public static String bundleStatus(Bundle bundle, boolean verbose) { + StringBuffer sb = new StringBuffer(); + sb.append(bundle.getBundleId()).append(" ").append(bundle.getSymbolicName()); + int s = bundle.getState(); + if ((s & Bundle.UNINSTALLED) != 0) { + sb.append(" UNINSTALLED"); + } + if ((s & Bundle.INSTALLED) != 0) { + sb.append(" INSTALLED"); + } + if ((s & Bundle.RESOLVED) != 0) { + sb.append(" RESOLVED"); + } + if ((s & Bundle.STARTING) != 0) { + sb.append(" STARTING"); + } + if ((s & Bundle.STOPPING) != 0) { + sb.append(" STOPPING"); + } + if ((s & Bundle.ACTIVE) != 0) { + sb.append(" ACTIVE"); + } + + if (verbose) { + sb.append(" ").append(bundle.getLocation()); + sb.append(" ").append(bundle.getHeaders()); + } + return sb.toString(); + } + + /** + * A utility to cast the object to the given interface. If the class for the object + * is loaded by a different classloader, a proxy will be created. + * + * @param + * @param obj + * @param cls + * @return + */ + public static T cast(Object obj, Class cls) { + if (cls.isInstance(obj)) { + return cls.cast(obj); + } else { + return cls.cast(Proxy.newProxyInstance(cls.getClassLoader(), + new Class[] {cls}, + new InvocationHandlerImpl(obj))); + } + } +} diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/operations-bundle/src/test/java/calculator/dosgi/operations/test/OperationsNode.java b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/operations-bundle/src/test/java/calculator/dosgi/operations/test/OperationsNode.java new file mode 100644 index 0000000000..faf61d11e4 --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/operations-bundle/src/test/java/calculator/dosgi/operations/test/OperationsNode.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 calculator.dosgi.operations.test; + +import org.apache.tuscany.sca.node.equinox.launcher.NodeLauncher; + +/** + * + */ +public class OperationsNode { + + /** + * @param args + */ + public static void main(String[] args) { + if (args.length == 0) { + args = new String[] {"-bundles"}; + } + try { + NodeLauncher.main(args); + } catch (Exception e) { + e.printStackTrace(); + } + } + +} diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/operations-bundle/src/test/java/calculator/dosgi/operations/test/OperationsOSGiNodeTestCase.java b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/operations-bundle/src/test/java/calculator/dosgi/operations/test/OperationsOSGiNodeTestCase.java new file mode 100644 index 0000000000..45385889ef --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/operations-bundle/src/test/java/calculator/dosgi/operations/test/OperationsOSGiNodeTestCase.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 calculator.dosgi.operations.test; + +import static calculator.dosgi.operations.test.OSGiTestUtils.bundleStatus; + +import java.rmi.registry.LocateRegistry; +import java.rmi.registry.Registry; + +import org.apache.tuscany.sca.node.equinox.launcher.EquinoxHost; +import org.junit.AfterClass; +import org.junit.Assert; +import org.junit.BeforeClass; +import org.junit.Test; +import org.osgi.framework.Bundle; +import org.osgi.framework.BundleContext; +import org.osgi.framework.Constants; + +import calculator.dosgi.operations.AddService; + +/** + * + */ +public class OperationsOSGiNodeTestCase { + private static EquinoxHost host; + private static BundleContext context; + private static Bundle operationsBundle; + + /** + * @throws java.lang.Exception + */ + @BeforeClass + public static void setUpBeforeClass() throws Exception { + try { + host = new EquinoxHost(); + context = host.start(); + + for (Bundle b : context.getBundles()) { + if (b.getSymbolicName().equals("org.eclipse.equinox.ds") || b.getSymbolicName() + .startsWith("org.apache.tuscany.sca.")) { + try { + if (b.getHeaders().get(Constants.FRAGMENT_HOST) == null) { + // Start the non-fragment bundle + b.start(); + } + } catch (Exception e) { + e.printStackTrace(); + } + System.out.println(bundleStatus(b, false)); + } + if ("calculator.dosgi.dynamic.operations".equals(b.getSymbolicName())) { + operationsBundle = b; + } + } + + if (operationsBundle != null) { + operationsBundle.start(); + System.out.println(bundleStatus(operationsBundle, false)); + } + + } catch (Exception e) { + e.printStackTrace(); + throw e; + } + } + + @Test + public void testOSGi() throws Exception { + Registry registry = LocateRegistry.getRegistry(8085); + Object add = registry.lookup("AddService"); + AddService addService = OSGiTestUtils.cast(add, AddService.class); + double sum = addService.add(1.0, 2.0); + Assert.assertEquals(3.0, sum, 0.0); + } + + /** + * @throws java.lang.Exception + */ + @AfterClass + public static void tearDownAfterClass() throws Exception { + if (host != null) { + host.stop(); + context = null; + } + } + +} diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/pom.xml b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/pom.xml new file mode 100644 index 0000000000..a344398049 --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/pom.xml @@ -0,0 +1,44 @@ + + + + 4.0.0 + + org.apache.tuscany.sca.samples + tuscany-samples-learning-more + 2.0 + ../pom.xml + + tuscany-samples-distributed-osgi-dynamic + pom + Apache Tuscany SCA Distributed OSGI Dynamically Configured Samples + + + + default + + true + + + calculator-bundle + operations-bundle + + + + diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/README.odt b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/README.odt new file mode 100644 index 0000000000..22b73cfc79 Binary files /dev/null and b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/README.odt differ diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/calculator-bundle/META-INF/MANIFEST.MF b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/calculator-bundle/META-INF/MANIFEST.MF new file mode 100644 index 0000000000..542b53b085 --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/calculator-bundle/META-INF/MANIFEST.MF @@ -0,0 +1,20 @@ +Manifest-Version: 1.0 +Export-Package: calculator.dosgi;version="1.0.0", + calculator.dosgi.operations;version="1.0.0" +Bundle-Version: 1.0.0 +Bundle-Name: calculator.dosgi +Bundle-Activator: calculator.dosgi.impl.CalculatorActivator +Bundle-ManifestVersion: 2 +Import-Package: org.oasisopen.sca.annotation;version="2.0.0", + org.osgi.framework, + org.osgi.service.component;resolution:=optional, + org.osgi.service.packageadmin, + org.osgi.util.tracker +Bundle-SymbolicName: calculator.dosgi +Bundle-Vendor: The Apache Software Foundation +Bundle-ActivationPolicy: lazy +Eclipse-LazyStart: true +Bundle-License: http://www.apache.org/licenses/LICENSE-2.0.txt +Bundle-DocURL: http://www.apache.org/ +Service-Component-Disabled: OSGI-INF/calculator-component.xml +Bundle-RequiredExecutionEnvironment: J2SE-1.5,JavaSE-1.6 diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/calculator-bundle/OSGI-INF/blueprint/calculator-module.xml b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/calculator-bundle/OSGI-INF/blueprint/calculator-module.xml new file mode 100644 index 0000000000..fe0bbf21df --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/calculator-bundle/OSGI-INF/blueprint/calculator-module.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/calculator-bundle/OSGI-INF/calculator-component.xml b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/calculator-bundle/OSGI-INF/calculator-component.xml new file mode 100644 index 0000000000..457588bfb6 --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/calculator-bundle/OSGI-INF/calculator-component.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/calculator-bundle/OSGI-INF/sca/bundle.componentType b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/calculator-bundle/OSGI-INF/sca/bundle.componentType new file mode 100644 index 0000000000..5e8e7ebcd3 --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/calculator-bundle/OSGI-INF/sca/bundle.componentType @@ -0,0 +1,64 @@ + + + + + + + + + + 1 + ABC + + + + + + + + 1 + ABC + + + + + + 1 + ABC + + + + + + 1 + ABC + + + + + + 1 + ABC + + + + diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/calculator-bundle/OSGI-INF/sca/bundle.composite b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/calculator-bundle/OSGI-INF/sca/bundle.composite new file mode 100644 index 0000000000..7ebb64eb8f --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/calculator-bundle/OSGI-INF/sca/bundle.composite @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/calculator-bundle/pom.xml b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/calculator-bundle/pom.xml new file mode 100644 index 0000000000..265d652f8d --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/calculator-bundle/pom.xml @@ -0,0 +1,153 @@ + + + + 4.0.0 + + org.apache.tuscany.sca.samples + tuscany-samples + 2.0 + ../../../pom.xml + + + sample-calculator-bundle + Apache Tuscany SCA Sample OSGi Remote Services Calculator + + + + org.apache.tuscany.sca + tuscany-feature-ejava + 2.0 + pom + + + org.apache.tuscany.sca + tuscany-feature-webservice + 2.0 + pom + runtime + + + org.apache.tuscany.sca + tuscany-node-launcher-equinox + 2.0 + test + + + + org.apache.tuscany.sca + tuscany-node-impl-osgi + 2.0 + runtime + + + + org.eclipse.osgi + services + 3.2.0-v20090520-1800 + + + + junit + junit + 4.8.1 + test + + + + + org.eclipse.equinox + ds + 1.1.0-v20090601 + test + + + + org.eclipse.equinox + util + 1.0.100-v20090520-1800 + test + + + + + + ${project.artifactId} + + + maven-eclipse-plugin + 2.5.1 + + + org.eclipse.pde.ManifestBuilder + org.eclipse.jdt.core.javabuilder + + + org.eclipse.jdt.core.javanature + org.eclipse.pde.PluginNature + + + org.eclipse.jdt.launching.JRE_CONTAINER + + + + + + + maven-jar-plugin + + + ${basedir}/META-INF/MANIFEST.MF + + + + + + org.apache.tuscany.maven.plugins + maven-osgi-junit-plugin + 1.0 + + + org.apache.tuscany.sca + tuscany-node-launcher-equinox + ${project.version} + + + + + osgi-test + test + + test + + + + + osgi.configuration.area + ${project.build.directory}/equinox + + + + + + + + + + diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/calculator-bundle/src/main/java/calculator/dosgi/CalculatorService.java b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/calculator-bundle/src/main/java/calculator/dosgi/CalculatorService.java new file mode 100644 index 0000000000..796b1afe61 --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/calculator-bundle/src/main/java/calculator/dosgi/CalculatorService.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 calculator.dosgi; + +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/samples/learning-more/distributed-osgi-static/calculator-bundle/src/main/java/calculator/dosgi/impl/CalculatorActivator.java b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/calculator-bundle/src/main/java/calculator/dosgi/impl/CalculatorActivator.java new file mode 100644 index 0000000000..b7babcc0af --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/calculator-bundle/src/main/java/calculator/dosgi/impl/CalculatorActivator.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 calculator.dosgi.impl; + +import java.util.Dictionary; +import java.util.Hashtable; +import java.util.logging.Logger; + +import org.osgi.framework.Bundle; +import org.osgi.framework.BundleActivator; +import org.osgi.framework.BundleContext; +import org.osgi.framework.ServiceReference; +import org.osgi.service.packageadmin.PackageAdmin; + +import calculator.dosgi.CalculatorService; +import calculator.dosgi.operations.AddService; + +/** + * + */ +public class CalculatorActivator implements BundleActivator { + private Logger logger = Logger.getLogger(CalculatorActivator.class.getName()); + + private Bundle getBundle(BundleContext bundleContext, Class cls) { + PackageAdmin packageAdmin = null; + // PackageAdmin is used to resolve bundles + ServiceReference ref = bundleContext.getServiceReference("org.osgi.service.packageadmin.PackageAdmin"); + if (ref != null) { + packageAdmin = (PackageAdmin)bundleContext.getService(ref); + Bundle bundle = packageAdmin.getBundle(cls); + if (bundle != null) { + logger.info(cls.getName() + " is loaded by bundle: " + bundle.getSymbolicName()); + } + bundleContext.ungetService(ref); + return bundle; + } + return null; + } + + public void start(BundleContext context) throws Exception { + logger.info("Starting " + context.getBundle()); + Dictionary props = new Hashtable(); + props.put("sca.service", "CalculatorComponent#service-name(Calculator)"); + props.put("calculator", "Calculator"); + + logger.info("Registering " + CalculatorService.class.getName()); + CalculatorService calculator = new CalculatorServiceImpl(context); + context.registerService(CalculatorService.class.getName(), calculator, props); + + getBundle(context, AddService.class); + + } + + public void stop(BundleContext context) throws Exception { + logger.info("Stopping " + context.getBundle()); + // Registered services will be automatically unregistered + } + +} diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/calculator-bundle/src/main/java/calculator/dosgi/impl/CalculatorServiceDSImpl.java b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/calculator-bundle/src/main/java/calculator/dosgi/impl/CalculatorServiceDSImpl.java new file mode 100644 index 0000000000..9c80c5beb9 --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/calculator-bundle/src/main/java/calculator/dosgi/impl/CalculatorServiceDSImpl.java @@ -0,0 +1,114 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package calculator.dosgi.impl; + +import org.osgi.service.component.ComponentContext; + +import calculator.dosgi.CalculatorService; +import calculator.dosgi.operations.AddService; +import calculator.dosgi.operations.DivideService; +import calculator.dosgi.operations.MultiplyService; +import calculator.dosgi.operations.SubtractService; + +/** + * An implementation of the Calculator service. + */ +public class CalculatorServiceDSImpl implements CalculatorService { + private AddService addService; + private SubtractService subtractService; + private MultiplyService multiplyService; + private DivideService divideService; + + public CalculatorServiceDSImpl() { + super(); + System.out.println("CalculatorServiceDSImpl()"); + } + + protected void activate(ComponentContext context) { + System.out.println("Activating " + context); + } + + protected void deactivate(ComponentContext context) { + System.out.println("Deactivating " + context); + } + + /* + * The following setters can be used for DS injection + */ + public void setAddService(AddService addService) { + System.out.println("setAddService()"); + this.addService = addService; + } + + public void setSubtractService(SubtractService subtractService) { + this.subtractService = subtractService; + } + + public void setDivideService(DivideService divideService) { + this.divideService = divideService; + } + + public void setMultiplyService(MultiplyService multiplyService) { + this.multiplyService = multiplyService; + } + + /* + * The following setters can be used for DS injection + */ + public void unsetAddService(AddService addService) { + System.out.println("unsetAddService()"); + this.addService = null; + } + + public void unsetSubtractService(SubtractService subtractService) { + this.subtractService = null; + } + + public void unsetDivideService(DivideService divideService) { + this.divideService = null; + } + + public void unsetMultiplyService(MultiplyService multiplyService) { + this.multiplyService = null; + } + private T getService(Class cls) { + for (Object s : new Object[] {addService, subtractService, multiplyService, divideService}) { + if (cls.isInstance(s)) { + return cls.cast(s); + } + } + throw new IllegalStateException(cls.getSimpleName() + " is not available"); + } + + public double add(double n1, double n2) { + return getService(AddService.class).add(n1, n2); + } + + public double subtract(double n1, double n2) { + return getService(SubtractService.class).subtract(n1, n2); + } + + public double multiply(double n1, double n2) { + return getService(MultiplyService.class).multiply(n1, n2); + } + + public double divide(double n1, double n2) { + return getService(DivideService.class).divide(n1, n2); + } +} diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/calculator-bundle/src/main/java/calculator/dosgi/impl/CalculatorServiceImpl.java b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/calculator-bundle/src/main/java/calculator/dosgi/impl/CalculatorServiceImpl.java new file mode 100644 index 0000000000..906fabfff1 --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/calculator-bundle/src/main/java/calculator/dosgi/impl/CalculatorServiceImpl.java @@ -0,0 +1,105 @@ +/* + * 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.dosgi.impl; + +import static org.osgi.framework.Constants.OBJECTCLASS; + +import org.osgi.framework.BundleContext; +import org.osgi.framework.Filter; +import org.osgi.framework.InvalidSyntaxException; +import org.osgi.util.tracker.ServiceTracker; + +import calculator.dosgi.CalculatorService; +import calculator.dosgi.operations.AddService; +import calculator.dosgi.operations.DivideService; +import calculator.dosgi.operations.MultiplyService; +import calculator.dosgi.operations.SubtractService; + +/** + * An implementation of the Calculator service. + */ +public class CalculatorServiceImpl implements CalculatorService { + private ServiceTracker remoteServices; + private ServiceTracker localServices; + + public CalculatorServiceImpl() { + super(); + } + + public CalculatorServiceImpl(BundleContext context) { + super(); + Filter remoteFilter = null, localFilter = null; + try { + remoteFilter = + context.createFilter("(&(" + OBJECTCLASS + "=calculator.dosgi.operations.*) (service.imported=*))"); + localFilter = + context.createFilter("(&(" + OBJECTCLASS + "=calculator.dosgi.operations.*) (!(service.imported=*)))"); + } catch (InvalidSyntaxException e) { + e.printStackTrace(); + } + this.remoteServices = new ServiceTracker(context, remoteFilter, null); + remoteServices.open(); + this.localServices = new ServiceTracker(context, localFilter, null); + localServices.open(); + } + + private T getService(Class cls) { + try { + // Wait for 10 seconds until the remote services are imported + remoteServices.waitForService(10000); + } catch (InterruptedException e) { + throw new IllegalStateException(cls.getSimpleName() + " is not available"); + } + Object[] remoteObjects = remoteServices.getServices(); + if (remoteObjects != null) { + for (Object s : remoteObjects) { + if (cls.isInstance(s)) { + System.out.println("Remote service: " + s); + return cls.cast(s); + } + } + } + Object[] localObjects = localServices.getServices(); + if (localObjects != null) { + for (Object s : localObjects) { + if (cls.isInstance(s)) { + System.out.println("Local service: " + s); + return cls.cast(s); + } + } + } + throw new IllegalStateException(cls.getSimpleName() + " is not available"); + } + + public double add(double n1, double n2) { + return getService(AddService.class).add(n1, n2); + } + + public double subtract(double n1, double n2) { + return getService(SubtractService.class).subtract(n1, n2); + } + + public double multiply(double n1, double n2) { + return getService(MultiplyService.class).multiply(n1, n2); + } + + public double divide(double n1, double n2) { + return getService(DivideService.class).divide(n1, n2); + } +} diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/calculator-bundle/src/main/java/calculator/dosgi/operations/AddService.java b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/calculator-bundle/src/main/java/calculator/dosgi/operations/AddService.java new file mode 100644 index 0000000000..7d68dbd5c5 --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/calculator-bundle/src/main/java/calculator/dosgi/operations/AddService.java @@ -0,0 +1,31 @@ +/* + * 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.dosgi.operations; + +import org.oasisopen.sca.annotation.Remotable; + +/** + * The interface for the add service + */ +@Remotable +public interface AddService { + + double add(double n1, double n2); + +} diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/calculator-bundle/src/main/java/calculator/dosgi/operations/DivideService.java b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/calculator-bundle/src/main/java/calculator/dosgi/operations/DivideService.java new file mode 100644 index 0000000000..998f6e9554 --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/calculator-bundle/src/main/java/calculator/dosgi/operations/DivideService.java @@ -0,0 +1,31 @@ +/* + * 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.dosgi.operations; + +import org.oasisopen.sca.annotation.Remotable; + +/** + * The interface for the divide service + */ +@Remotable +public interface DivideService { + + double divide(double n1, double n2); + +} diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/calculator-bundle/src/main/java/calculator/dosgi/operations/MultiplyService.java b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/calculator-bundle/src/main/java/calculator/dosgi/operations/MultiplyService.java new file mode 100644 index 0000000000..7ed6db2e6b --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/calculator-bundle/src/main/java/calculator/dosgi/operations/MultiplyService.java @@ -0,0 +1,31 @@ +/* + * 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.dosgi.operations; + +import org.oasisopen.sca.annotation.Remotable; + +/** + * The interface for the multiply service + */ +@Remotable +public interface MultiplyService { + + double multiply(double n1, double n2); + +} diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/calculator-bundle/src/main/java/calculator/dosgi/operations/SubtractService.java b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/calculator-bundle/src/main/java/calculator/dosgi/operations/SubtractService.java new file mode 100644 index 0000000000..cb98b8fb67 --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/calculator-bundle/src/main/java/calculator/dosgi/operations/SubtractService.java @@ -0,0 +1,31 @@ +/* + * 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.dosgi.operations; + +import org.oasisopen.sca.annotation.Remotable; + +/** + * The interface for the subtract service + */ +@Remotable +public interface SubtractService { + + double subtract(double n1, double n2); + +} diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/calculator-bundle/src/main/java/calculator/rmi/OperationsRMIServer.java b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/calculator-bundle/src/main/java/calculator/rmi/OperationsRMIServer.java new file mode 100644 index 0000000000..1a3e36f571 --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/calculator-bundle/src/main/java/calculator/rmi/OperationsRMIServer.java @@ -0,0 +1,93 @@ +/* + * 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.rmi; + +import java.io.Serializable; +import java.rmi.Remote; +import java.rmi.RemoteException; +import java.rmi.registry.LocateRegistry; +import java.rmi.registry.Registry; +import java.rmi.server.UnicastRemoteObject; + +/** + * + */ +public class OperationsRMIServer implements OperationsRemote, Serializable { + + private static final long serialVersionUID = 6081008315263103012L; + private transient Registry registry; + + public OperationsRMIServer() throws RemoteException { + super(); + } + + public double add(double n1, double n2) { + return n1 + n2; + } + + public double subtract(double n1, double n2) { + return n1 - n2; + } + + public double divide(double n1, double n2) { + return n1 / n2; + } + + public double multiply(double n1, double n2) { + return n1 * n2; + } + + public void start() throws RemoteException { + Thread thread = new Thread() { + public void run() { + try { + System.out.println("Starting the RMI server for calculator operations..."); + Remote stub = UnicastRemoteObject.exportObject(OperationsRMIServer.this); + registry = LocateRegistry.createRegistry(8085); + registry.bind("AddService", stub); + registry.bind("SubtractService", stub); + registry.bind("MultiplyService", stub); + registry.bind("DivideService", stub); + System.out.println("RMI server for calculator operations is now started."); + } catch (Exception e) { + e.printStackTrace(); + } + } + }; + thread.start(); + } + + public void stop() { + if (registry != null) { + try { + registry.unbind("AddService"); + registry.unbind("SubtractService"); + registry.unbind("MultiplyService"); + registry.unbind("DivideService"); + UnicastRemoteObject.unexportObject(this, false); + UnicastRemoteObject.unexportObject(registry, false); + registry = null; + } catch (Exception e) { + e.printStackTrace(); + } + } + } + +} diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/calculator-bundle/src/main/java/calculator/rmi/OperationsRMIServer_Stub.java b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/calculator-bundle/src/main/java/calculator/rmi/OperationsRMIServer_Stub.java new file mode 100644 index 0000000000..d573f6b8fa --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/calculator-bundle/src/main/java/calculator/rmi/OperationsRMIServer_Stub.java @@ -0,0 +1,132 @@ +/* + * 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. + */ + +// Stub class generated by rmic, do not edit. +// Contents subject to change without notice. +package calculator.rmi; + +public final class OperationsRMIServer_Stub extends java.rmi.server.RemoteStub implements calculator.rmi.OperationsRemote { + private static final long serialVersionUID = 2; + + private static java.lang.reflect.Method $method_add_0; + private static java.lang.reflect.Method $method_divide_1; + private static java.lang.reflect.Method $method_multiply_2; + private static java.lang.reflect.Method $method_subtract_3; + + static { + try { + $method_add_0 = + calculator.rmi.OperationsRemote.class.getMethod("add", new java.lang.Class[] {double.class, double.class}); + $method_divide_1 = + calculator.rmi.OperationsRemote.class.getMethod("divide", + new java.lang.Class[] {double.class, double.class}); + $method_multiply_2 = + calculator.rmi.OperationsRemote.class.getMethod("multiply", new java.lang.Class[] {double.class, + double.class}); + $method_subtract_3 = + calculator.rmi.OperationsRemote.class.getMethod("subtract", new java.lang.Class[] {double.class, + double.class}); + } catch (java.lang.NoSuchMethodException e) { + throw new java.lang.NoSuchMethodError("stub class initialization failed"); + } + } + + // constructors + public OperationsRMIServer_Stub(java.rmi.server.RemoteRef ref) { + super(ref); + } + + // methods from remote interfaces + + // implementation of add(double, double) + public double add(double $param_double_1, double $param_double_2) throws java.rmi.RemoteException { + try { + Object $result = + ref.invoke(this, + $method_add_0, + new java.lang.Object[] {new java.lang.Double($param_double_1), + new java.lang.Double($param_double_2)}, + 864055858262779977L); + return ((java.lang.Double)$result).doubleValue(); + } catch (java.lang.RuntimeException e) { + throw e; + } catch (java.rmi.RemoteException e) { + throw e; + } catch (java.lang.Exception e) { + throw new java.rmi.UnexpectedException("undeclared checked exception", e); + } + } + + // implementation of divide(double, double) + public double divide(double $param_double_1, double $param_double_2) throws java.rmi.RemoteException { + try { + Object $result = + ref.invoke(this, + $method_divide_1, + new java.lang.Object[] {new java.lang.Double($param_double_1), + new java.lang.Double($param_double_2)}, + 8097593626497421928L); + return ((java.lang.Double)$result).doubleValue(); + } catch (java.lang.RuntimeException e) { + throw e; + } catch (java.rmi.RemoteException e) { + throw e; + } catch (java.lang.Exception e) { + throw new java.rmi.UnexpectedException("undeclared checked exception", e); + } + } + + // implementation of multiply(double, double) + public double multiply(double $param_double_1, double $param_double_2) throws java.rmi.RemoteException { + try { + Object $result = + ref.invoke(this, + $method_multiply_2, + new java.lang.Object[] {new java.lang.Double($param_double_1), + new java.lang.Double($param_double_2)}, + -346155016949350695L); + return ((java.lang.Double)$result).doubleValue(); + } catch (java.lang.RuntimeException e) { + throw e; + } catch (java.rmi.RemoteException e) { + throw e; + } catch (java.lang.Exception e) { + throw new java.rmi.UnexpectedException("undeclared checked exception", e); + } + } + + // implementation of subtract(double, double) + public double subtract(double $param_double_1, double $param_double_2) throws java.rmi.RemoteException { + try { + Object $result = + ref.invoke(this, + $method_subtract_3, + new java.lang.Object[] {new java.lang.Double($param_double_1), + new java.lang.Double($param_double_2)}, + -610707357620578750L); + return ((java.lang.Double)$result).doubleValue(); + } catch (java.lang.RuntimeException e) { + throw e; + } catch (java.rmi.RemoteException e) { + throw e; + } catch (java.lang.Exception e) { + throw new java.rmi.UnexpectedException("undeclared checked exception", e); + } + } +} diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/calculator-bundle/src/main/java/calculator/rmi/OperationsRemote.java b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/calculator-bundle/src/main/java/calculator/rmi/OperationsRemote.java new file mode 100644 index 0000000000..d735ce8172 --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/calculator-bundle/src/main/java/calculator/rmi/OperationsRemote.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 calculator.rmi; + +import java.rmi.Remote; +import java.rmi.RemoteException; + +/** + * RMI Remote interface + */ +public interface OperationsRemote extends Remote { + double add(double n1, double n2) throws RemoteException; + + double subtract(double n1, double n2) throws RemoteException; + + double multiply(double n1, double n2) throws RemoteException; + + double divide(double n1, double n2) throws RemoteException; + +} diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/calculator-bundle/src/main/resources/META-INF/sca-contribution.xml b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/calculator-bundle/src/main/resources/META-INF/sca-contribution.xml new file mode 100644 index 0000000000..2fae5f5d28 --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/calculator-bundle/src/main/resources/META-INF/sca-contribution.xml @@ -0,0 +1,24 @@ + + + + + + diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/calculator-bundle/src/test/java/calculator/dosgi/test/CalculatorNode.java b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/calculator-bundle/src/test/java/calculator/dosgi/test/CalculatorNode.java new file mode 100644 index 0000000000..7f96067764 --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/calculator-bundle/src/test/java/calculator/dosgi/test/CalculatorNode.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 calculator.dosgi.test; + +import org.apache.tuscany.sca.node.equinox.launcher.NodeLauncher; + +/** + * + */ +public class CalculatorNode { + + /** + * @param args + */ + public static void main(String[] args) { + if (args.length == 0) { + args = new String[] {"-bundles"}; + } + try { + NodeLauncher.main(args); + } catch (Exception e) { + e.printStackTrace(); + } + } + +} diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/calculator-bundle/src/test/java/calculator/dosgi/test/CalculatorOSGiNodeTestCase.java b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/calculator-bundle/src/test/java/calculator/dosgi/test/CalculatorOSGiNodeTestCase.java new file mode 100644 index 0000000000..96a5f7d4eb --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/calculator-bundle/src/test/java/calculator/dosgi/test/CalculatorOSGiNodeTestCase.java @@ -0,0 +1,152 @@ +/* + * 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.dosgi.test; + +import static calculator.dosgi.test.OSGiTestUtils.bundleStatus; + +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.Reader; +import java.net.URL; + +import org.apache.tuscany.sca.node.equinox.launcher.EquinoxHost; +import org.junit.AfterClass; +import org.junit.Assert; +import org.junit.BeforeClass; +import org.junit.Test; +import org.osgi.framework.Bundle; +import org.osgi.framework.BundleContext; +import org.osgi.framework.Constants; +import org.osgi.framework.ServiceReference; + +import calculator.dosgi.CalculatorService; +import calculator.rmi.OperationsRMIServer; + +/** + * + */ +public class CalculatorOSGiNodeTestCase { + private static EquinoxHost host; + private static BundleContext context; + private static Bundle calculatorBundle; + private static OperationsRMIServer rmiServer; + + /** + * @throws java.lang.Exception + */ + @BeforeClass + public static void setUpBeforeClass() throws Exception { + try { + rmiServer = new OperationsRMIServer(); + rmiServer.start(); + + host = new EquinoxHost(); + context = host.start(); + + for (Bundle b : context.getBundles()) { + System.out.println(b); + // debug to print out exported packages + // handy if you want to find aplit packages + //Object exports = b.getHeaders().get(Constants.EXPORT_PACKAGE); + //if (exports != null){ + // System.out.println(exports.toString()); + //} + if (b.getSymbolicName().equals("org.eclipse.equinox.ds") || b.getSymbolicName() + .startsWith("org.apache.tuscany.sca.")) { + try { + if (b.getHeaders().get(Constants.FRAGMENT_HOST) == null) { + // Start the non-fragment bundle + b.start(); + } + } catch (Exception e) { + e.printStackTrace(); + } + System.out.println(bundleStatus(b, false)); + } else { + System.out.println(bundleStatus(b, false)); + } + if ("calculator.dosgi".equals(b.getSymbolicName())) { + calculatorBundle = b; + } + } + + if (calculatorBundle != null) { + calculatorBundle.start(); + System.out.println(bundleStatus(calculatorBundle, false)); + } + + } catch (Exception e) { + e.printStackTrace(); + throw e; + } + } + + @Test + public void testOSGi() { + ServiceReference ref = + calculatorBundle.getBundleContext().getServiceReference(CalculatorService.class.getName()); + Assert.assertNotNull(ref); + Object service = context.getService(ref); + Assert.assertNotNull(service); + CalculatorService calculator = OSGiTestUtils.cast(service, CalculatorService.class); + System.out.println("2.0 + 1.0 = " + calculator.add(2.0, 1.0)); + System.out.println("2.0 - 1.0 = " + calculator.subtract(2.0, 1.0)); + System.out.println("2.0 * 1.0 = " + calculator.multiply(2.0, 1.0)); + System.out.println("2.0 / 1.0 = " + calculator.divide(2.0, 1.0)); + } + + @Test + /** + * Test the Web service exposed by the Calculator + */ + public void testWS() throws Exception { + URL url = new URL("http://localhost:8086/CalculatorService?wsdl"); + InputStream is = url.openStream(); + Reader reader = new InputStreamReader(is); + char[] content = new char[10240]; // 10k + int len = 0; + while (true) { + int size = reader.read(content, len, content.length - len); + if (size < 0) { + break; + } + len += size; + } + Assert.assertTrue(len > 0); + String str = new String(content, 0, len); + System.out.println(str); + Assert.assertTrue(str.indexOf(" + * @param obj + * @param cls + * @return + */ + public static T cast(Object obj, Class cls) { + if (cls.isInstance(obj)) { + return cls.cast(obj); + } else { + return cls.cast(Proxy.newProxyInstance(cls.getClassLoader(), + new Class[] {cls}, + new InvocationHandlerImpl(obj))); + } + } +} diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/operations-bundle/META-INF/MANIFEST.MF b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/operations-bundle/META-INF/MANIFEST.MF new file mode 100644 index 0000000000..82a803e3a6 --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/operations-bundle/META-INF/MANIFEST.MF @@ -0,0 +1,22 @@ +Manifest-Version: 1.0 +Export-Package: calculator.dosgi.operations;version="1.0.0" +Bundle-Version: 1.0.0 +Bundle-Name: calculator.dosgi.operations +Bundle-Activator: calculator.dosgi.operations.impl.OperationsActivator +Bundle-ManifestVersion: 2 +Import-Package: calculator.dosgi.operations;version="[1.0.0,1.0.0]", + org.oasisopen.sca.annotation;version="2.0.0", + org.osgi.framework, + org.osgi.service.component;resolution:=optional, + org.osgi.service.packageadmin +Bundle-SymbolicName: calculator.dosgi.operations +Bundle-Vendor: The Apache Software Foundation +Bundle-ActivationPolicy: lazy +Eclipse-LazyStart: true +Bundle-License: http://www.apache.org/licenses/LICENSE-2.0.txt +Bundle-DocURL: http://www.apache.org/ +Service-Component-Disabled: OSGI-INF/add-component.xml, + OSGI-INF/subtract-component.xml, + OSGI-INF/multiply-component.xml, + OSGI-INF/divide-component.xml +Bundle-RequiredExecutionEnvironment: J2SE-1.5,JavaSE-1.6 diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/operations-bundle/OSGI-INF/add-component.xml b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/operations-bundle/OSGI-INF/add-component.xml new file mode 100644 index 0000000000..bf4ccc3d28 --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/operations-bundle/OSGI-INF/add-component.xml @@ -0,0 +1,25 @@ + + + + + + + + diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/operations-bundle/OSGI-INF/blueprint/operations-module.xml b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/operations-bundle/OSGI-INF/blueprint/operations-module.xml new file mode 100644 index 0000000000..e3b690f24a --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/operations-bundle/OSGI-INF/blueprint/operations-module.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/operations-bundle/OSGI-INF/divide-component.xml b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/operations-bundle/OSGI-INF/divide-component.xml new file mode 100644 index 0000000000..b939a5de80 --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/operations-bundle/OSGI-INF/divide-component.xml @@ -0,0 +1,25 @@ + + + + + + + + diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/operations-bundle/OSGI-INF/multiply-component.xml b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/operations-bundle/OSGI-INF/multiply-component.xml new file mode 100644 index 0000000000..2bf897d72a --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/operations-bundle/OSGI-INF/multiply-component.xml @@ -0,0 +1,25 @@ + + + + + + + + diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/operations-bundle/OSGI-INF/sca/bundle.componentType b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/operations-bundle/OSGI-INF/sca/bundle.componentType new file mode 100644 index 0000000000..74704be28d --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/operations-bundle/OSGI-INF/sca/bundle.componentType @@ -0,0 +1,54 @@ + + + + + + + + + + 1 + ABC + + + + + + 1 + ABC + + + + + + 1 + ABC + + + + + + 1 + ABC + + + diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/operations-bundle/OSGI-INF/sca/bundle.composite b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/operations-bundle/OSGI-INF/sca/bundle.composite new file mode 100644 index 0000000000..816ba3c89c --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/operations-bundle/OSGI-INF/sca/bundle.composite @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/operations-bundle/OSGI-INF/subtract-component.xml b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/operations-bundle/OSGI-INF/subtract-component.xml new file mode 100644 index 0000000000..4af00695da --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/operations-bundle/OSGI-INF/subtract-component.xml @@ -0,0 +1,25 @@ + + + + + + + + diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/operations-bundle/pom.xml b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/operations-bundle/pom.xml new file mode 100644 index 0000000000..be8390fe30 --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/operations-bundle/pom.xml @@ -0,0 +1,161 @@ + + + + 4.0.0 + + org.apache.tuscany.sca.samples + tuscany-samples + 2.0 + ../../../pom.xml + + + sample-operations-bundle + Apache Tuscany SCA Sample OSGi Remote Services Calculator Operations + + + + org.apache.tuscany.sca + tuscany-base-runtime-pom + 2.0 + pom + + + org.apache.tuscany.sca + tuscany-osgi-runtime-pom + 2.0 + pom + + + org.apache.tuscany.sca + tuscany-binding-rmi-runtime + 2.0 + + + + org.apache.tuscany.sca + tuscany-node-launcher-equinox + 2.0 + test + + + + org.apache.tuscany.sca + tuscany-node-impl-osgi + 2.0 + runtime + + + + org.eclipse.osgi + services + 3.2.0-v20090520-1800 + test + + + + + org.eclipse.equinox + ds + 1.1.0-v20090601 + test + + + + org.eclipse.equinox + util + 1.0.100-v20090520-1800 + test + + + + junit + junit + 4.8.1 + test + + + + + + ${project.artifactId} + + + maven-eclipse-plugin + 2.5.1 + + + org.eclipse.pde.ManifestBuilder + org.eclipse.jdt.core.javabuilder + + + org.eclipse.jdt.core.javanature + org.eclipse.pde.PluginNature + + + org.eclipse.jdt.launching.JRE_CONTAINER + + + + + + + maven-jar-plugin + + + ${basedir}/META-INF/MANIFEST.MF + + + + + + + + + diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/operations-bundle/src/main/java/calculator/dosgi/operations/AddService.java b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/operations-bundle/src/main/java/calculator/dosgi/operations/AddService.java new file mode 100644 index 0000000000..7d68dbd5c5 --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/operations-bundle/src/main/java/calculator/dosgi/operations/AddService.java @@ -0,0 +1,31 @@ +/* + * 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.dosgi.operations; + +import org.oasisopen.sca.annotation.Remotable; + +/** + * The interface for the add service + */ +@Remotable +public interface AddService { + + double add(double n1, double n2); + +} diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/operations-bundle/src/main/java/calculator/dosgi/operations/DivideService.java b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/operations-bundle/src/main/java/calculator/dosgi/operations/DivideService.java new file mode 100644 index 0000000000..998f6e9554 --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/operations-bundle/src/main/java/calculator/dosgi/operations/DivideService.java @@ -0,0 +1,31 @@ +/* + * 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.dosgi.operations; + +import org.oasisopen.sca.annotation.Remotable; + +/** + * The interface for the divide service + */ +@Remotable +public interface DivideService { + + double divide(double n1, double n2); + +} diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/operations-bundle/src/main/java/calculator/dosgi/operations/MultiplyService.java b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/operations-bundle/src/main/java/calculator/dosgi/operations/MultiplyService.java new file mode 100644 index 0000000000..7ed6db2e6b --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/operations-bundle/src/main/java/calculator/dosgi/operations/MultiplyService.java @@ -0,0 +1,31 @@ +/* + * 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.dosgi.operations; + +import org.oasisopen.sca.annotation.Remotable; + +/** + * The interface for the multiply service + */ +@Remotable +public interface MultiplyService { + + double multiply(double n1, double n2); + +} diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/operations-bundle/src/main/java/calculator/dosgi/operations/SubtractService.java b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/operations-bundle/src/main/java/calculator/dosgi/operations/SubtractService.java new file mode 100644 index 0000000000..cb98b8fb67 --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/operations-bundle/src/main/java/calculator/dosgi/operations/SubtractService.java @@ -0,0 +1,31 @@ +/* + * 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.dosgi.operations; + +import org.oasisopen.sca.annotation.Remotable; + +/** + * The interface for the subtract service + */ +@Remotable +public interface SubtractService { + + double subtract(double n1, double n2); + +} diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/operations-bundle/src/main/java/calculator/dosgi/operations/impl/AddServiceImpl.java b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/operations-bundle/src/main/java/calculator/dosgi/operations/impl/AddServiceImpl.java new file mode 100644 index 0000000000..e0a6622136 --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/operations-bundle/src/main/java/calculator/dosgi/operations/impl/AddServiceImpl.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 calculator.dosgi.operations.impl; + +import java.util.logging.Level; +import java.util.logging.Logger; + +import calculator.dosgi.operations.AddService; + +/** + * An implementation of the Add service + */ +public class AddServiceImpl implements AddService { + + public double add(double n1, double n2) { + Logger logger = Logger.getLogger("calculator"); + logger.log(Level.INFO, "Adding " + n1 + " and " + n2); + return n1 + n2; + } + +} diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/operations-bundle/src/main/java/calculator/dosgi/operations/impl/DivideServiceImpl.java b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/operations-bundle/src/main/java/calculator/dosgi/operations/impl/DivideServiceImpl.java new file mode 100644 index 0000000000..028f860885 --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/operations-bundle/src/main/java/calculator/dosgi/operations/impl/DivideServiceImpl.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 calculator.dosgi.operations.impl; + +import java.util.logging.Level; +import java.util.logging.Logger; + +import calculator.dosgi.operations.DivideService; + +/** + * An implementation of the Divide service. + */ +public class DivideServiceImpl implements DivideService { + + public double divide(double n1, double n2) { + Logger logger = Logger.getLogger("calculator"); + logger.log(Level.INFO, "Dividing " + n1 + " with " + n2); + return n1 / n2; + } + +} diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/operations-bundle/src/main/java/calculator/dosgi/operations/impl/MultiplyServiceImpl.java b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/operations-bundle/src/main/java/calculator/dosgi/operations/impl/MultiplyServiceImpl.java new file mode 100644 index 0000000000..e928317c2e --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/operations-bundle/src/main/java/calculator/dosgi/operations/impl/MultiplyServiceImpl.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 calculator.dosgi.operations.impl; + +import java.util.logging.Level; +import java.util.logging.Logger; + +import calculator.dosgi.operations.MultiplyService; + +/** + * An implementation of the Multiply service. + */ +public class MultiplyServiceImpl implements MultiplyService { + + public double multiply(double n1, double n2) { + Logger logger = Logger.getLogger("calculator"); + logger.log(Level.INFO, "Multiplying " + n1 + " with " + n2); + return n1 * n2; + } + +} diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/operations-bundle/src/main/java/calculator/dosgi/operations/impl/OperationsActivator.java b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/operations-bundle/src/main/java/calculator/dosgi/operations/impl/OperationsActivator.java new file mode 100644 index 0000000000..6bc14c1c78 --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/operations-bundle/src/main/java/calculator/dosgi/operations/impl/OperationsActivator.java @@ -0,0 +1,88 @@ +/* + * 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.dosgi.operations.impl; + +import java.util.Dictionary; +import java.util.Hashtable; +import java.util.logging.Logger; + +import org.osgi.framework.Bundle; +import org.osgi.framework.BundleActivator; +import org.osgi.framework.BundleContext; +import org.osgi.framework.ServiceReference; +import org.osgi.service.packageadmin.PackageAdmin; + +import calculator.dosgi.operations.AddService; +import calculator.dosgi.operations.DivideService; +import calculator.dosgi.operations.MultiplyService; +import calculator.dosgi.operations.SubtractService; + +/** + * + */ +public class OperationsActivator implements BundleActivator { + private Logger logger = Logger.getLogger(OperationsActivator.class.getName()); + + public void start(BundleContext context) throws Exception { + logger.info("Starting " + context.getBundle()); + + Dictionary props = new Hashtable(); + + logger.info("Registering " + AddService.class.getName()); + props.put("sca.service", "AddComponent#service-name(Add)"); + context.registerService(AddService.class.getName(), new AddServiceImpl(), props); + + logger.info("Registering " + SubtractService.class.getName()); + props.put("sca.service", "SubtractComponent#service-name(Subtract)"); + context.registerService(SubtractService.class.getName(), new SubtractServiceImpl(), props); + + logger.info("Registering " + MultiplyService.class.getName()); + props.put("sca.service", "MultiplyComponent#service-name(Multiply)"); + context.registerService(MultiplyService.class.getName(), new MultiplyServiceImpl(), props); + + logger.info("Registering " + DivideService.class.getName()); + props.put("sca.service", "DivideComponent#service-name(Divide)"); + context.registerService(DivideService.class.getName(), new DivideServiceImpl(), props); + + getBundle(context, AddService.class); + } + + public void stop(BundleContext context) throws Exception { + logger.info("Stopping " + context.getBundle()); + // Registered services will be automatically unregistered + } + + private Bundle getBundle(BundleContext bundleContext, Class cls) { + PackageAdmin packageAdmin = null; + // PackageAdmin is used to resolve bundles + ServiceReference ref = bundleContext.getServiceReference("org.osgi.service.packageadmin.PackageAdmin"); + if (ref != null) { + packageAdmin = (PackageAdmin)bundleContext.getService(ref); + Bundle bundle = packageAdmin.getBundle(cls); + if (bundle != null) { + logger.info(cls.getName() + " is loaded by bundle: " + bundle.getSymbolicName()); + } + bundleContext.ungetService(ref); + return bundle; + } + return null; + } + +} diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/operations-bundle/src/main/java/calculator/dosgi/operations/impl/SubtractServiceImpl.java b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/operations-bundle/src/main/java/calculator/dosgi/operations/impl/SubtractServiceImpl.java new file mode 100644 index 0000000000..565670963f --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/operations-bundle/src/main/java/calculator/dosgi/operations/impl/SubtractServiceImpl.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 calculator.dosgi.operations.impl; + +import java.util.logging.Level; +import java.util.logging.Logger; + +import calculator.dosgi.operations.SubtractService; + +/** + * An implementation of the subtract service. + */ +public class SubtractServiceImpl implements SubtractService { + + public double subtract(double n1, double n2) { + Logger logger = Logger.getLogger("calculator"); + logger.log(Level.INFO, "Subtracting " + n1 + " from " + n2); + return n1 - n2; + } + +} diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/operations-bundle/src/main/resources/META-INF/sca-contribution.xml b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/operations-bundle/src/main/resources/META-INF/sca-contribution.xml new file mode 100644 index 0000000000..66d93248f0 --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/operations-bundle/src/main/resources/META-INF/sca-contribution.xml @@ -0,0 +1,23 @@ + + + + + diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/operations-bundle/src/test/java/calculator/dosgi/operations/test/OSGiTestUtils.java b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/operations-bundle/src/test/java/calculator/dosgi/operations/test/OSGiTestUtils.java new file mode 100644 index 0000000000..3407507e3b --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/operations-bundle/src/test/java/calculator/dosgi/operations/test/OSGiTestUtils.java @@ -0,0 +1,105 @@ +/* + * 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.dosgi.operations.test; + +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Method; +import java.lang.reflect.Proxy; + +import org.osgi.framework.Bundle; + +/** + * + * Utility class to create OSGi bundles + * + * @version $Rev: 796166 $ $Date: 2009-07-21 08:03:47 +0100 (Tue, 21 Jul 2009) $ + */ +public class OSGiTestUtils { + private static class InvocationHandlerImpl implements InvocationHandler { + private Object instance; + + public InvocationHandlerImpl(Object instance) { + super(); + this.instance = instance; + } + + public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { + Method m = instance.getClass().getMethod(method.getName(), method.getParameterTypes()); + return m.invoke(instance, args); + } + + } + + /** + * Returns a string representation of the given bundle. + * + * @param b + * @param verbose + * @return + */ + public static String bundleStatus(Bundle bundle, boolean verbose) { + StringBuffer sb = new StringBuffer(); + sb.append(bundle.getBundleId()).append(" ").append(bundle.getSymbolicName()); + int s = bundle.getState(); + if ((s & Bundle.UNINSTALLED) != 0) { + sb.append(" UNINSTALLED"); + } + if ((s & Bundle.INSTALLED) != 0) { + sb.append(" INSTALLED"); + } + if ((s & Bundle.RESOLVED) != 0) { + sb.append(" RESOLVED"); + } + if ((s & Bundle.STARTING) != 0) { + sb.append(" STARTING"); + } + if ((s & Bundle.STOPPING) != 0) { + sb.append(" STOPPING"); + } + if ((s & Bundle.ACTIVE) != 0) { + sb.append(" ACTIVE"); + } + + if (verbose) { + sb.append(" ").append(bundle.getLocation()); + sb.append(" ").append(bundle.getHeaders()); + } + return sb.toString(); + } + + /** + * A utility to cast the object to the given interface. If the class for the object + * is loaded by a different classloader, a proxy will be created. + * + * @param + * @param obj + * @param cls + * @return + */ + public static T cast(Object obj, Class cls) { + if (cls.isInstance(obj)) { + return cls.cast(obj); + } else { + return cls.cast(Proxy.newProxyInstance(cls.getClassLoader(), + new Class[] {cls}, + new InvocationHandlerImpl(obj))); + } + } +} diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/operations-bundle/src/test/java/calculator/dosgi/operations/test/OperationsNode.java b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/operations-bundle/src/test/java/calculator/dosgi/operations/test/OperationsNode.java new file mode 100644 index 0000000000..faf61d11e4 --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/operations-bundle/src/test/java/calculator/dosgi/operations/test/OperationsNode.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 calculator.dosgi.operations.test; + +import org.apache.tuscany.sca.node.equinox.launcher.NodeLauncher; + +/** + * + */ +public class OperationsNode { + + /** + * @param args + */ + public static void main(String[] args) { + if (args.length == 0) { + args = new String[] {"-bundles"}; + } + try { + NodeLauncher.main(args); + } catch (Exception e) { + e.printStackTrace(); + } + } + +} diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/operations-bundle/src/test/java/calculator/dosgi/operations/test/OperationsOSGiNodeTestCase.java b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/operations-bundle/src/test/java/calculator/dosgi/operations/test/OperationsOSGiNodeTestCase.java new file mode 100644 index 0000000000..ef58d1f60b --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/operations-bundle/src/test/java/calculator/dosgi/operations/test/OperationsOSGiNodeTestCase.java @@ -0,0 +1,105 @@ +/* + * 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.dosgi.operations.test; + +import static calculator.dosgi.operations.test.OSGiTestUtils.bundleStatus; + +import java.rmi.registry.LocateRegistry; +import java.rmi.registry.Registry; + +import org.apache.tuscany.sca.node.equinox.launcher.EquinoxHost; +import org.junit.AfterClass; +import org.junit.Assert; +import org.junit.BeforeClass; +import org.junit.Test; +import org.osgi.framework.Bundle; +import org.osgi.framework.BundleContext; +import org.osgi.framework.Constants; + +import calculator.dosgi.operations.AddService; + +/** + * + */ +public class OperationsOSGiNodeTestCase { + private static EquinoxHost host; + private static BundleContext context; + private static Bundle operationsBundle; + + /** + * @throws java.lang.Exception + */ + @BeforeClass + public static void setUpBeforeClass() throws Exception { + try { + host = new EquinoxHost(); + context = host.start(); + + for (Bundle b : context.getBundles()) { + if (b.getSymbolicName().equals("org.eclipse.equinox.ds") || b.getSymbolicName() + .startsWith("org.apache.tuscany.sca.")) { + try { + if (b.getHeaders().get(Constants.FRAGMENT_HOST) == null) { + // Start the non-fragment bundle + b.start(); + } + } catch (Exception e) { + System.out.println("Error for bundle: " + b.getSymbolicName()); + e.printStackTrace(); + } + System.out.println(bundleStatus(b, false)); + } + if ("calculator.dosgi.operations".equals(b.getSymbolicName())) { + operationsBundle = b; + } + } + + if (operationsBundle != null) { + operationsBundle.start(); + System.out.println(bundleStatus(operationsBundle, false)); + } + + } catch (Exception e) { + e.printStackTrace(); + throw e; + } + } + + @Test + public void testOSGi() throws Exception { + Registry registry = LocateRegistry.getRegistry(8085); + Object add = registry.lookup("AddService"); + AddService addService = OSGiTestUtils.cast(add, AddService.class); + double sum = addService.add(1.0, 2.0); + Assert.assertEquals(3.0, sum, 0.0); + } + + /** + * @throws java.lang.Exception + */ + @AfterClass + public static void tearDownAfterClass() throws Exception { + if (host != null) { + host.stop(); + context = null; + } + } + +} diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/pom.xml b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/pom.xml new file mode 100644 index 0000000000..ee2989d6d1 --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/pom.xml @@ -0,0 +1,44 @@ + + + + 4.0.0 + + org.apache.tuscany.sca.samples + tuscany-samples-learning-more + 2.0 + ../pom.xml + + tuscany-samples-distributed-osgi-static + pom + Apache Tuscany SCA Distributed OSGI Statically Configured Samples + + + + default + + true + + + calculator-bundle + operations-bundle + + + + diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/pom.xml b/sca-java-2.x/branches/2.0/samples/learning-more/pom.xml new file mode 100644 index 0000000000..74bd04c97b --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/pom.xml @@ -0,0 +1,49 @@ + + + + 4.0.0 + + org.apache.tuscany.sca.samples + tuscany-samples + 2.0 + ../pom.xml + + + tuscany-samples-learning-more + 2.0 + pom + Apache Tuscany SCA Sample Learning More + + + + default + + true + + + async-invocation + + binding-websocket + contribution-osgi + distributed-osgi-static + + + + diff --git a/sca-java-2.x/branches/2.0/samples/pom.xml b/sca-java-2.x/branches/2.0/samples/pom.xml new file mode 100644 index 0000000000..b59fd0bb4e --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/pom.xml @@ -0,0 +1,41 @@ + + + + 4.0.0 + + org.apache.tuscany.sca + tuscany-sca + 2.0 + + + org.apache.tuscany.sca.samples + tuscany-samples + 2.0 + pom + Apache Tuscany SCA Samples + + + applications + getting-started + running-tuscany + learning-more + + + diff --git a/sca-java-2.x/branches/2.0/samples/running-tuscany/ant/README.html b/sca-java-2.x/branches/2.0/samples/running-tuscany/ant/README.html new file mode 100644 index 0000000000..414205ac23 --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/running-tuscany/ant/README.html @@ -0,0 +1,47 @@ + + + +- no title specified

Running the Tuscany runtime from Ant

 

If you're an Ant user it's handy to be able to deploy and run a contribution from an Ant script. This sample re-use the calculator-composite.jar and runs it using the Tuscany shell started from an Ant script.

 

To run the sample :

 

cd ant

ant

 

You will of course need to have Ant (http://ant.apache.org/) installed. This sample was created with Ant version 1.8.0.

 

In the build.xml there are several different targets. Each describes a different way of constructing the Java classpath to include the correct Tuscany jars.

 

Target

Description

run-all-manifest-jar

Includes a single manifest jar on the classpath which in turn references all of the jars in the binary distribution's modules directory

run-base-extension-paths

For the Ant user Tuscany ships with predefined Ant paths for each of the Tuscany extensions.

run-base-extension-manifests

For completeness we also ship manifest jars for the Tuscany base and each of the extensions

run-base-extension-jars

If you want to re-package Tuscany we ship stand-alone jars for the Tuscany base and extensions

 

The sample build.xml file defaults to running the run-all-manifest-jar target. To run other targets add the name of the target to then end of the command line. For example,

 

ant run-base-extension-paths

 

 

diff --git a/sca-java-2.x/branches/2.0/samples/running-tuscany/ant/README.odt b/sca-java-2.x/branches/2.0/samples/running-tuscany/ant/README.odt new file mode 100644 index 0000000000..e89825446f Binary files /dev/null and b/sca-java-2.x/branches/2.0/samples/running-tuscany/ant/README.odt differ diff --git a/sca-java-2.x/branches/2.0/samples/running-tuscany/ant/build.xml b/sca-java-2.x/branches/2.0/samples/running-tuscany/ant/build.xml new file mode 100644 index 0000000000..0448ee498f --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/running-tuscany/ant/build.xml @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sca-java-2.x/branches/2.0/samples/running-tuscany/calculator-contribution.jar b/sca-java-2.x/branches/2.0/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/samples/running-tuscany/calculator-contribution.jar differ diff --git a/sca-java-2.x/branches/2.0/samples/running-tuscany/command-line/README.html b/sca-java-2.x/branches/2.0/samples/running-tuscany/command-line/README.html new file mode 100644 index 0000000000..6343cf5f85 --- /dev/null +++ b/sca-java-2.x/branches/2.0/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/samples/running-tuscany/command-line/README.odt b/sca-java-2.x/branches/2.0/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/samples/running-tuscany/command-line/README.odt differ diff --git a/sca-java-2.x/branches/2.0/samples/running-tuscany/eclipse/README.html b/sca-java-2.x/branches/2.0/samples/running-tuscany/eclipse/README.html new file mode 100644 index 0000000000..b31333b7e8 --- /dev/null +++ b/sca-java-2.x/branches/2.0/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/samples/running-tuscany/eclipse/README.odt b/sca-java-2.x/branches/2.0/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/samples/running-tuscany/eclipse/README.odt differ diff --git a/sca-java-2.x/branches/2.0/samples/running-tuscany/jse/README.html b/sca-java-2.x/branches/2.0/samples/running-tuscany/jse/README.html new file mode 100644 index 0000000000..fc36b9b643 --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/running-tuscany/jse/README.html @@ -0,0 +1,41 @@ + + + +- no title specified

Running the Tuscany runtime from a Java program

 

The Tuscany SCA Runtime provides a Node API that allows the runtime to be started from within a Java program. A Node in Tuscany represents a set of activated composites and a Node is configured  with all of the contributions required for those composites to run. The idea is to allow you to partition the domain up into it's constituent deployable composites and run each one in its own node on an appropriate machine. In that way the domain can easily be distributed while SCA takes care of making sure that wired services can communicate regardless of where they are.

 

The basic pattern is as follows:

 

1/ Use the org.apache.tuscany.sca.node.NodeFactory API to create a org.apache.tuscany.sca.node.Node instance configured with enough contributions to run the required composite

2/ Start the Node instance. This starts deployable composites contained in the provided contributions

3/ Interact with the services that the Node instance has made available

4/ Stop the Node instance

 

The pattern is demonstrated in this sample in the launcher.LaunchCalculatorContribution class. It loads the calculator-contribution.jar contribution found in the parent directory, makes a simple call to add two numbers together using the Calculator service and then shuts down.

 

To run the sample on Windows do:

 

cd jse

run-sample.bat

 

To run the sample on *nix do:

 

cd jse

run-sample.sh

 

To re-build the sample classes do

 

cd jse

mvn

 

Note. The mvn build will automatically run a unit test that also runs the sample.

 

\ No newline at end of file diff --git a/sca-java-2.x/branches/2.0/samples/running-tuscany/jse/README.odt b/sca-java-2.x/branches/2.0/samples/running-tuscany/jse/README.odt new file mode 100644 index 0000000000..232c0dd590 Binary files /dev/null and b/sca-java-2.x/branches/2.0/samples/running-tuscany/jse/README.odt differ diff --git a/sca-java-2.x/branches/2.0/samples/running-tuscany/jse/pom.xml b/sca-java-2.x/branches/2.0/samples/running-tuscany/jse/pom.xml new file mode 100644 index 0000000000..b67bc70a78 --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/running-tuscany/jse/pom.xml @@ -0,0 +1,50 @@ + + + + 4.0.0 + + org.apache.tuscany.sca.samples + tuscany-samples-running-tuscany + 2.0 + ../pom.xml + + jse + Apache Tuscany SCA Samples JSE + + + + org.apache.tuscany.sca + tuscany-base-runtime + 2.0 + + + + junit + junit + 4.8.1 + test + + + + + + ${project.artifactId} + + diff --git a/sca-java-2.x/branches/2.0/samples/running-tuscany/jse/run-sample.bat b/sca-java-2.x/branches/2.0/samples/running-tuscany/jse/run-sample.bat new file mode 100644 index 0000000000..a7965ff45c --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/running-tuscany/jse/run-sample.bat @@ -0,0 +1,18 @@ +REM # Licensed to the Apache Software Foundation (ASF) under one +REM # or more contributor license agreements. See the NOTICE file +REM # distributed with this work for additional information +REM # regarding copyright ownership. The ASF licenses this file +REM # to you under the Apache License, Version 2.0 (the +REM # "License"); you may not use this file except in compliance +REM # with the License. You may obtain a copy of the License at +REM # +REM # http://www.apache.org/licenses/LICENSE-2.0 +REM # +REM # Unless required by applicable law or agreed to in writing, +REM # software distributed under the License is distributed on an +REM # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +REM # KIND, either express or implied. See the License for the +REM # specific language governing permissions and limitations +REM # under the License. + +java -cp ..\..\..\features\tuscany-base-runtime-pom\tuscany-base-runtime-pom-manifest.jar;target\jse.jar launcher.LaunchCalculatorContribution diff --git a/sca-java-2.x/branches/2.0/samples/running-tuscany/jse/run-sample.sh b/sca-java-2.x/branches/2.0/samples/running-tuscany/jse/run-sample.sh new file mode 100644 index 0000000000..ecc78c2e46 --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/running-tuscany/jse/run-sample.sh @@ -0,0 +1,19 @@ +# 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 + +#!/bin/bash + +java -cp ../../../features/tuscany-base-runtime-pom/tuscany-base-runtime-pom-manifest.jar;target/jse.jar launcher.LaunchCalculatorContribution diff --git a/sca-java-2.x/branches/2.0/samples/running-tuscany/jse/src/main/java/calculator/CalculatorService.java b/sca-java-2.x/branches/2.0/samples/running-tuscany/jse/src/main/java/calculator/CalculatorService.java new file mode 100644 index 0000000000..12d80ffd1c --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/running-tuscany/jse/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/samples/running-tuscany/jse/src/main/java/launcher/LaunchCalculatorContribution.java b/sca-java-2.x/branches/2.0/samples/running-tuscany/jse/src/main/java/launcher/LaunchCalculatorContribution.java new file mode 100644 index 0000000000..2b787fb6b8 --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/running-tuscany/jse/src/main/java/launcher/LaunchCalculatorContribution.java @@ -0,0 +1,60 @@ +/* + * 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 org.apache.tuscany.sca.node.Contribution; +import org.apache.tuscany.sca.node.Node; +import org.apache.tuscany.sca.node.NodeFactory; + +import calculator.CalculatorService; + +/** + * This program shows how to create an embedded SCA runtime, load a contribution, + * start it and locate and invoke an SCA component from Java. + */ +public class LaunchCalculatorContribution { + + /* + * Use the Tuscany Node API to: + * - create a Node instance and load a contribution from the parent directory + * - start the node (which starts deployable composites) + * - get a local service proxy + * - make a service call using the proxy + * - stop the node + */ + public static void main(String[] args) 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); + + if (result != 5.0){ + throw new RuntimeException("Expected 5.0 but result was " + result); + } + + node.stop(); + } + +} diff --git a/sca-java-2.x/branches/2.0/samples/running-tuscany/jse/src/test/java/launcher/LauncherTestCase.java b/sca-java-2.x/branches/2.0/samples/running-tuscany/jse/src/test/java/launcher/LauncherTestCase.java new file mode 100644 index 0000000000..8adabd8137 --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/running-tuscany/jse/src/test/java/launcher/LauncherTestCase.java @@ -0,0 +1,33 @@ +/* + * 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 org.junit.Test; + +/** + * Test the sample launcher + */ +public class LauncherTestCase { + + @Test + public void testCalculatorContribution() throws Exception { + LaunchCalculatorContribution.main(null); + } + +} diff --git a/sca-java-2.x/branches/2.0/samples/running-tuscany/junit/README.html b/sca-java-2.x/branches/2.0/samples/running-tuscany/junit/README.html new file mode 100644 index 0000000000..00d6592cb8 --- /dev/null +++ b/sca-java-2.x/branches/2.0/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/samples/running-tuscany/junit/README.odt b/sca-java-2.x/branches/2.0/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/samples/running-tuscany/junit/README.odt differ diff --git a/sca-java-2.x/branches/2.0/samples/running-tuscany/junit/pom.xml b/sca-java-2.x/branches/2.0/samples/running-tuscany/junit/pom.xml new file mode 100644 index 0000000000..31bc92068d --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/running-tuscany/junit/pom.xml @@ -0,0 +1,50 @@ + + + + 4.0.0 + + org.apache.tuscany.sca.samples + tuscany-samples-running-tuscany + 2.0 + ../pom.xml + + junit + Apache Tuscany SCA Samples JUnit + + + + org.apache.tuscany.sca + tuscany-base-runtime + 2.0 + + + + junit + junit + 4.8.1 + test + + + + + + ${project.artifactId} + + diff --git a/sca-java-2.x/branches/2.0/samples/running-tuscany/junit/src/main/java/calculator/CalculatorService.java b/sca-java-2.x/branches/2.0/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/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/samples/running-tuscany/junit/src/test/java/launcher/LaunchCalculatorContributionTestCase.java b/sca-java-2.x/branches/2.0/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/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/samples/running-tuscany/osgi/README.html b/sca-java-2.x/branches/2.0/samples/running-tuscany/osgi/README.html new file mode 100644 index 0000000000..95f57f8b03 --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/running-tuscany/osgi/README.html @@ -0,0 +1,88 @@ + + + + + + + + + + + + + +

Running the Tuscany runtime from OSGi

+


+

+
The Tuscany runtime can be run in and OSGi container. 

+Running in Equinox

+

On Windows, run

+
+cd modules
+java -jar osgi-3.5.0-v20090520.jar -configuration ..\features\configuration -clean -console
+
+On *Unix, run
+
+cd modules
+java -jar osgi-3.5.0-v20090520.jar -configuration ../features/configuration -clean -console
+
+You should see the osgi console:
+
+osgi>
+
+You can run "ss" command under the osgi> to see the status of the bundles:
+
+osgi> ss
+
+Then you can install and start contributions as bundles by doing the following:
+
+osgi> install file:///./path/to/contribution_bundle.jar
+
+For example, on Windows, 
+
+osgi> install file:///c:\path\to\Tuscany\installation\samples\learning-more\contribution-osgi\target\sample-contribution-osgi.jar
+
+Note. This sample contribution contains a bundle activator to fire up the Tuscany runtime. We are not relying on any Tuscany runtime service to detect the installation of the ontribution bundle. 

+Running on Felix

+

See +http://tuscany.apache.org/documentation-2x/running-tuscany-sca-2x-with-equinox-and-felix.html

+


+

+


+

+


+

+ + \ No newline at end of file diff --git a/sca-java-2.x/branches/2.0/samples/running-tuscany/osgi/README.odt b/sca-java-2.x/branches/2.0/samples/running-tuscany/osgi/README.odt new file mode 100644 index 0000000000..5fc0091d0e Binary files /dev/null and b/sca-java-2.x/branches/2.0/samples/running-tuscany/osgi/README.odt differ diff --git a/sca-java-2.x/branches/2.0/samples/running-tuscany/pom.xml b/sca-java-2.x/branches/2.0/samples/running-tuscany/pom.xml new file mode 100644 index 0000000000..e1c68adbb1 --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/running-tuscany/pom.xml @@ -0,0 +1,46 @@ + + + + 4.0.0 + + org.apache.tuscany.sca.samples + tuscany-samples + 2.0 + + + + tuscany-samples-running-tuscany + 2.0 + pom + Apache Tuscany SCA Samples Running Tuscany + + + + default + + true + + + jse + junit + + + + diff --git a/sca-java-2.x/branches/2.0/samples/running-tuscany/running-tuscany.html b/sca-java-2.x/branches/2.0/samples/running-tuscany/running-tuscany.html new file mode 100644 index 0000000000..ffaa3f1fe0 --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/running-tuscany/running-tuscany.html @@ -0,0 +1,128 @@ + + + + + + + + + + + + + +


+

Starting the Tuscany SCA Runtime

+


+

+

How you run the Tuscany runtime, load +contributions and start composites depends on what environment you're +running in and what you're trying to achieve. For example, if you +just want to try out some samples then you may want to run the +Tuscany runtime from the command line using the Tuscany shell or from +Maven or Ant. If on the other hand you want Tuscany to run in a +WebApp, in OSGi or you want to debug the runtime in an IDE like +Eclipse different approaches are required.

+


+

+

The samples in this directory show +various ways in which you can start Tuscany.

+


+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+


+

+
+


+

+
+

command-line

+
+

Deploy a contribution from the command line using the Tuscany + Shell without writing any code

+
+

eclipse

+
+

Deploy and debug a contribution project from the Eclipse IDE

+
+

jse

+
+

Deploy a contribution from a simple Java program

+
+

junit

+
+

Deploy a contribution from a JUnit test case

+
+

ant

+
+

Deploy a contribution from an Ant script

+
+

osgi

+
+

Start the Tuscany runtime in OSGi and install a contribution

+
+


+

+


+

+ + \ No newline at end of file diff --git a/sca-java-2.x/branches/2.0/samples/running-tuscany/running-tuscany.odt b/sca-java-2.x/branches/2.0/samples/running-tuscany/running-tuscany.odt new file mode 100644 index 0000000000..039ac00408 Binary files /dev/null and b/sca-java-2.x/branches/2.0/samples/running-tuscany/running-tuscany.odt differ diff --git a/sca-java-2.x/branches/2.0/samples/running-tuscany/running-tuscany_html_m65f05d55.png b/sca-java-2.x/branches/2.0/samples/running-tuscany/running-tuscany_html_m65f05d55.png new file mode 100644 index 0000000000..ad6ba6b202 Binary files /dev/null and b/sca-java-2.x/branches/2.0/samples/running-tuscany/running-tuscany_html_m65f05d55.png differ -- cgit v1.2.3