diff options
Diffstat (limited to '')
218 files changed, 12040 insertions, 0 deletions
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 @@ +<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<project>
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>org.apache.tuscany.sca.samples</groupId>
+ <artifactId>tuscany-samples</artifactId>
+ <version>2.0</version>
+ <relativePath/>
+ </parent>
+ <artifactId>sample-async-invocation</artifactId>
+ <name>Apache Tuscany SCA Sample Async Invocation</name>
+
+ <!-- ASF repositories so sample can be built from SVN without building trunk-->
+ <repositories><repository>
+ <id>apache.snapshots</id>
+ <name>Apache Snapshot Repository</name>
+ <url>http://repository.apache.org/snapshots</url>
+ <releases><enabled>false</enabled></releases>
+ </repository></repositories>
+ <pluginRepositories><pluginRepository>
+ <id>apache.snapshots</id>
+ <name>Apache Snapshot Repository</name>
+ <url>http://repository.apache.org/snapshots</url>
+ <releases><enabled>false</enabled></releases>
+ </pluginRepository></pluginRepositories>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.tuscany.sca</groupId>
+ <artifactId>tuscany-sca-api</artifactId>
+ <version>2.0</version>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.tuscany.sca</groupId>
+ <artifactId>tuscany-base-runtime-pom</artifactId>
+ <type>pom</type>
+ <version>2.0</version>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <version>4.8.1</version>
+ <scope>test</scope>
+ </dependency>
+ </dependencies>
+
+ <build>
+ <finalName>${project.artifactId}</finalName>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.tuscany.sca</groupId>
+ <artifactId>tuscany-maven-plugin</artifactId>
+ <version>2.0</version>
+ </plugin>
+ </plugins>
+ </build>
+
+</project>
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<String> calculateAsync(Integer i1);
+
+ // Async Callback
+ public Future<String> calculateAsync(Integer i1, AsyncHandler<String> handler);
+
+
+ // Sync
+ public void print(Integer i1);
+
+ // Aysnc Poll
+ public Response<Void> printAsync(Integer i1);
+
+ // Async Callback
+ public Future<Void> printAsync(Integer i1, AsyncHandler<Void> 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<String> {
+ public void handleResponse(Response<String> 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<Void> {
+ public void handleResponse(Response<Void> 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<String> response);
+ void printAsync(Integer n1, ResponseDispatch<Void> 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<String> response) {
+ int result = n1 + n1;
+ String retval = "async service invoked: " + n1 + " + " + n1 + " = " + result;
+
+ response.sendResponse(retval);
+ }
+
+ @Override
+ public void printAsync(Integer n1, ResponseDispatch<Void> 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<String> 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<String> 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<Void> response = calculatorRef.printAsync(20);
+
+ // async callback
+ CalculatorPrintAsyncHandler handler = new CalculatorPrintAsyncHandler();
+ Future<Void> 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 @@ +<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<composite xmlns="http://docs.oasis-open.org/ns/opencsa/sca/200912"
+ targetNamespace="http://sample"
+ xmlns:sample="http://sample"
+ xmlns:sca="http://docs.oasis-open.org/ns/opencsa/sca/200912"
+ name="Calculator">
+
+ <component name="CalculatorServiceComponent">
+ <implementation.java class="calculator.CalculatorServiceProxyImpl"/>
+ <reference name="calculatorServiceRefSync" target="CalculatorSync"/>
+ <reference name="calculatorServiceRefAsync" target="CalculatorAsync"/>
+ </component>
+
+ <component name="CalculatorSync">
+ <implementation.java class="calculator.CalculatorServiceSyncImpl"/>
+ </component>
+
+ <component name="CalculatorAsync">
+ <implementation.java class="calculator.CalculatorServiceAsyncImpl"/>
+ <service name="CalculatorServiceAsync">
+ <binding.ws uri="http://localhost:8085/CalculatorAsync"/>
+ </service>
+ </component>
+
+</composite>
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 @@ +<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<composite xmlns="http://docs.oasis-open.org/ns/opencsa/sca/200912"
+ targetNamespace="http://sample"
+ xmlns:sample="http://sample"
+ name="CalculatorClient">
+
+ <component name="CalculatorClient">
+ <implementation.java class="calculator.CalculatorClient"/>
+ <reference name="calculatorService" target="CalculatorServiceComponent" />
+ </component>
+
+</composite>
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 @@ +<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<contribution xmlns="http://docs.oasis-open.org/ns/opencsa/sca/200912"
+ xmlns:sample="http://sample">
+ <deployable composite="sample:Calculator"/>
+ <deployable composite="sample:CalculatorClient"/>
+</contribution>
\ 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 <tuscany:binding.comet/> to a service definition, the Tuscany runtime +will handle the communication between the browser client and the service +implementation using Comet techniques. This enables bidirectional communication +over HTTP, therefore enabling server push. For more information, check +http://en.wikipedia.org/wiki/Comet_(programming). + +The comet binding is using the Atmosphere Framework under the hood to acomodate +as many deployment envorinments as possible. Basically, it checks if the +application server supports Servlet 3.0 falling back to a number of native +comet solutions provided by vendors (Jetty, Tomcat, WebLogic, GlassFish and +others). If none is available, Atmosphere will fallback to blocking IO. + +Invoking comet services can be done using Tuscany's javascript API which simulates +SCA in the browser. It uses the Atmosphere jQuery plugin under the hood. In order +to use it, the following script has to be included in the client page: + <script type="text/javascript" + src="tuscany-comet-js/org.apache.tuscany.sca.CometComponentContext.js"> + </script> + +The javascript toolkit permits choosing between two comet techniques: HTTP streaming +and long polling. More detailed information about them can be found on the previously +mentioned wikipedia page. + +First, a connect operation has to be issued in order to initiate communication +with the server side using the technique of your choice. This is done using the +connection method as follows: + SCA.TuscanyComet.connect('streaming'); // for HTTP streaming + SCA.TuscanyComet.connect('long-polling'); // for long polling + SCA.TuscanyComet.connect(); // starts with HTTP streaming and falls back to long polling if necessary + +The Tuscany Comet toolkit will inject proxies for all services defined in the composite +that are using binding.comet. All invocation and connection management is handled +under the hood so in order to invoke a comet service, the following should be called: + SCA.CometComponentContext.<service name>.<operation name>(<parameters>, callback); + +The callback parameter is the function that will handle responses received for a +certain service operation. It has a single argument which is the response: + function callback(response) { + // handle response + }; + +Note that the data exchange is automatically handled by the binding, so the +parameters should have the same structure as the data types defined in the method +definition. Also, the response will have the same data type as the return type of +the service method. Objects are passed over the wire in JSON format. + +Another detail worth mentioning is that the binding will use a single HTTP +connection to handle communication between a browser client and all services +defined using binding.comet in the same composite. Requests and responses will get +multiplexed via the same channel and get routed to the appropriate service +implementation, respectively javascript function. This is done in order to avoid +the 2 HTTP connection limit imposed by browsers. For more info, check +http://www.openajax.org/runtime/wiki/The_Two_HTTP_Connection_Limit_Issue. + +In order to run the sample, you can execute "mvn clean install t7:run" which will +start a Tomcat 7 instance automatically or use "mvn package" and deploy the resulting +war to the application server of your choice. + +Next, point your browser at + http://localhost:8080/sample-binding-comet-autocomplete-webapp/ + +You can see how suggestions are being received in real time when characters are +entered in the text field. You can see the persistent HTTP streaming connection +or long polling subsequent connections using the developer tools provided by +your browser. + +The comet binding is an experimental binding so community feedback is much +appreciated. Feel free to send comments or suggestions on the Apache Tuscany +dev mailing list (dev@tuscany.apache.org).
\ No newline at end of file diff --git a/sca-java-2.x/branches/2.0/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 @@ +<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>org.apache.tuscany.sca.samples</groupId>
+ <artifactId>tuscany-samples-binding-comet</artifactId>
+ <version>2.0</version>
+ <relativePath>../pom.xml</relativePath>
+ </parent>
+
+ <artifactId>sample-binding-comet-autocomplete-webapp</artifactId>
+ <packaging>war</packaging>
+ <version>2.0</version>
+ <name>Apache Tuscany SCA Sample binding.comet Real-Time Suggestions Webapp</name>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.tuscany.sca</groupId>
+ <artifactId>tuscany-binding-comet-runtime</artifactId>
+ <version>2.0</version>
+ </dependency>
+ <dependency>
+ <groupId>javax</groupId>
+ <artifactId>javaee-web-api</artifactId>
+ <version>6.0</version>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.tuscany.sca</groupId>
+ <artifactId>tuscany-base-runtime-pom</artifactId>
+ <version>2.0</version>
+ <type>pom</type>
+ <scope>compile</scope>
+ </dependency>
+ <dependency>
+ <groupId>com.google.guava</groupId>
+ <artifactId>guava</artifactId>
+ <version>r09</version>
+ <type>jar</type>
+ <scope>compile</scope>
+ </dependency>
+ </dependencies>
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>com.googlecode.t7mp</groupId>
+ <artifactId>maven-t7-plugin</artifactId>
+ <version>0.9.6</version>
+ <configuration>
+ <webapps>
+ <webappArtifact>
+ <groupId>org.apache.tuscany.sca.samples</groupId>
+ <artifactId>sample-binding-comet-autocomplete-webapp</artifactId>
+ <version>2.0</version>
+ </webappArtifact>
+ </webapps>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+
+</project>
+
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<Country> 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<Country> countries; + + @Constructor + public CountryRepositoryImpl(@Property(name = "fileName") String fileName) { + this.fileName = fileName; + countries = new ArrayList<Country>(); + } + + @Init + public void start() { + try { + BufferedReader reader = new BufferedReader(new InputStreamReader(getClass().getClassLoader() + .getResourceAsStream(fileName))); + String line; + while ((line = reader.readLine()) != null) { + if (!line.startsWith("#")) { + Country c = new Country(); + c.setName(line); + countries.add(c); + } + } + } catch (FileNotFoundException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + @Override + public List<Country> findStartingWith(String text) { + List<Country> result = new ArrayList<Country>(); + for (Country c : countries) { + if (c.getName().toLowerCase().startsWith(text.toLowerCase())) { + result.add(c); + } + } + return result; + } + +} diff --git a/sca-java-2.x/branches/2.0/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<Country> 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<Country> 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 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. +--> +<composite xmlns="http://docs.oasis-open.org/ns/opencsa/sca/200912" + xmlns:tuscany="http://tuscany.apache.org/xmlns/sca/1.1" + xmlns:sca="http://docs.oasis-open.org/ns/opencsa/sca/200912" + targetNamespace="http://samples" name="Chat"> + + <component name="CountryServiceComponent"> + <implementation.java + class="org.apache.tuscany.sca.sample.comet.CountryServiceImpl" /> + <service name="CountryService"> + <interface.java interface="org.apache.tuscany.sca.sample.comet.CountryService" /> + <tuscany:binding.comet /> + </service> + <reference name="repository" target="CountryRepositoryComponent" /> + </component> + + <component name="CountryRepositoryComponent"> + <implementation.java + class="org.apache.tuscany.sca.sample.comet.CountryRepositoryImpl" /> + <property name="fileName">countries.txt</property> + </component> + +</composite>
\ No newline at end of file diff --git a/sca-java-2.x/branches/2.0/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 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. +--> +<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:j2ee="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_3.0.xsd" version="3.0"> + <display-name>Apache Tuscany Stock Comet Sample</display-name> + <filter> + <filter-name>tuscany</filter-name> + <filter-class>org.apache.tuscany.sca.host.webapp.TuscanyServletFilter</filter-class> + <async-supported>true</async-supported> + </filter> + <filter-mapping> + <filter-name>tuscany</filter-name> + <url-pattern>/*</url-pattern> + </filter-mapping> + <welcome-file-list> + <welcome-file>index.html</welcome-file> + </welcome-file-list> +</web-app>
\ No newline at end of file diff --git a/sca-java-2.x/branches/2.0/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 @@ +<!-- + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. +--> +<html> + <head> + <title>Apache Tuscany Comet Sample</title> + <!-- Tuscany Comet Javascript Toolkit is dependent on jQuery --> + <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js" type="text/javascript"></script> + <script type="text/javascript" src="tuscany-comet-js/org.apache.tuscany.sca.CometComponentContext.js"></script> + <script type="text/javascript"> + var user = ""; + + $(document).ready(function() + { + // Tuscany Comet specific API + SCA.TuscanyComet.connect(); + + $("#country").keyup(function() { + var text = $("#country").val(); + if (text != "") { + SCA.CometComponentContext.CountryService.getCountriesStartingWith(text, callback); + } else { + $("#suggestions").html(""); + } + }); + + $("#country").focus(); + }); + + function callback(response) { + var html = '<ul>'; + $.each(response, function(index, country) { + html += '<li>' + country.name + "</li>" + }); + html += '</ul>' + $("#suggestions").html(html); + } + + </script> + </head> + <body> + <h2>Apache Tuscany Comet Sample</h2> + <h3>Real-time suggestions</h3> + <table> + <tr> + <td>Enter a country name</td> + <td><input type="text" id='country'/></td> + </tr> + </table> + </div> + <div id="suggestions"> + </div> + </body> +</html> diff --git a/sca-java-2.x/branches/2.0/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 <tuscany:binding.comet/> to a service definition, the Tuscany runtime +will handle the communication between the browser client and the service +implementation using Comet techniques. This enables bidirectional communication +over HTTP, therefore enabling server push. For more information, check +http://en.wikipedia.org/wiki/Comet_(programming). + +The comet binding is using the Atmosphere Framework under the hood to acomodate +as many deployment envorinments as possible. Basically, it checks if the +application server supports Servlet 3.0 falling back to a number of native +comet solutions provided by vendors (Jetty, Tomcat, WebLogic, GlassFish and +others). If none is available, Atmosphere will fallback to blocking IO. + +In order to enable callbacks to push multiple responses, you need to declare the +CometCallback in the service definition as follows: + <interface.java interface="org.apache.tuscany.sca.sample.comet.ChatService" + callbackInterface="org.apache.tuscany.sca.binding.comet.runtime.callback.CometCallback" /> + <tuscany:binding.comet /> + <callback> + <tuscany:binding.comet /> + </callback> + +The callback object has methods that facilitate sending messages back to the +calling client. It can be injected in the service implementation using the @Callback +annotation. However, the service implementation for this sample has the COMPOSITE +scope so the callback reference has to be obtained from the ComponentContext. + +One requirement that service methods have to meet to enable multiple response +support is that they have to be annotated with @OneWay to enable non-blocking +support. Without it, methods are treated synchronously sending a single response +which is the object returned by the method call. + +Invoking comet services can be done using Tuscany's javascript API which simulates +SCA in the browser. It uses the Atmosphere jQuery plugin under the hood. In order +to use it, the following script has to be included in the client page: + <script type="text/javascript" + src="tuscany-comet-js/org.apache.tuscany.sca.CometComponentContext.js"> + </script> + +The javascript toolkit permits choosing between two comet techniques: HTTP streaming +and long polling. More detailed information about them can be found on the previously +mentioned wikipedia page. + +First, a connect operation has to be issued in order to initiate communication +with the server side using the technique of your choice. This is done using the +connection method as follows: + SCA.TuscanyComet.connect('streaming'); // for HTTP streaming + SCA.TuscanyComet.connect('long-polling'); // for long polling + SCA.TuscanyComet.connect(); // starts with HTTP streaming and falls back to long polling if necessary + +The Tuscany Comet toolkit will inject proxies for all services defined in the composite +that are using binding.comet. All invocation and connection management is handled +under the hood so in order to invoke a comet service, the following should be called: + SCA.CometComponentContext.<service name>.<operation name>(<parameters>, callback); + +The callback parameter is the function that will handle responses received for a +certain service operation. It has a single argument which is the response: + function callback(response) { + // handle response + }; + +Note that the data exchange is automatically handled by the binding, so parameters +will be mapped to the data types defined in the method definition. Also, the response +will have the same data type as the server side object used to wrap the response. +Objects are passed over the wire in JSON format. + +Another detail worth mentioning is that the binding will use a single HTTP +connection to handle communication between a browser client and all services +defined using binding.comet in the same composite. Requests and responses will get +multiplexed via the same channel and get routed to the appropriate service +implementation, respectively javascript function. This is done in order to avoid +the 2 HTTP connection limit imposed by browsers. For more info, check +http://www.openajax.org/runtime/wiki/The_Two_HTTP_Connection_Limit_Issue. + +In order to run the sample, you can execute "mvn clean install t7:run" which will +start a Tomcat 7 instance automatically or use "mvn package" and deploy the resulting +war to the application server of your choice. + +Next, point your browser at + http://localhost:8080/sample-binding-comet-chat-webapp/ + +You can now chat using multiple tabs or browsers. You can see the persistent HTTP +streaming connection or long polling subsequent connections using the developer tools +provided by your browser. + +The comet binding is an experimental binding so community feedback is much +appreciated. Feel free to send comments or suggestions on the Apache Tuscany +dev mailing list (dev@tuscany.apache.org).
\ No newline at end of file diff --git a/sca-java-2.x/branches/2.0/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 @@ +<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>org.apache.tuscany.sca.samples</groupId>
+ <artifactId>tuscany-samples-binding-comet</artifactId>
+ <version>2.0</version>
+ <relativePath>../pom.xml</relativePath>
+ </parent>
+
+ <artifactId>sample-binding-comet-chat-webapp</artifactId>
+ <packaging>war</packaging>
+ <version>2.0</version>
+ <name>Apache Tuscany SCA Sample binding.comet Chat Webapp</name>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.tuscany.sca</groupId>
+ <artifactId>tuscany-binding-comet-runtime</artifactId>
+ <version>2.0</version>
+ </dependency>
+ <dependency>
+ <groupId>javax</groupId>
+ <artifactId>javaee-web-api</artifactId>
+ <version>6.0</version>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.tuscany.sca</groupId>
+ <artifactId>tuscany-base-runtime-pom</artifactId>
+ <version>2.0</version>
+ <type>pom</type>
+ <scope>compile</scope>
+ </dependency>
+ <dependency>
+ <groupId>com.google.guava</groupId>
+ <artifactId>guava</artifactId>
+ <version>r09</version>
+ <type>jar</type>
+ <scope>compile</scope>
+ </dependency>
+ </dependencies>
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>com.googlecode.t7mp</groupId>
+ <artifactId>maven-t7-plugin</artifactId>
+ <version>0.9.6</version>
+ <configuration>
+ <webapps>
+ <webappArtifact>
+ <groupId>org.apache.tuscany.sca.samples</groupId>
+ <artifactId>sample-binding-comet-chat-webapp</artifactId>
+ <version>2.0</version>
+ </webappArtifact>
+ </webapps>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+</project>
+
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<CometCallback> clients = new CopyOnWriteArrayList<CometCallback>(); + + @Override + public void postMessage(String user, String message) { + for (CometCallback callback : new ArrayList<CometCallback>(clients)) { + Status status = callback.sendMessage(user + ": " + message); + if (status == Status.CLIENT_DISCONNECTED) { + clients.remove(callback); + } + } + } + + @Override + public void register() { + // saving the callback object during register() method so it will push data back to the client + // using the callback method defined for the register operation in the js when used + clients.add(context.getRequestContext().<CometCallback> getCallback()); + } +} diff --git a/sca-java-2.x/branches/2.0/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 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. +--> +<composite xmlns="http://docs.oasis-open.org/ns/opencsa/sca/200912" + xmlns:tuscany="http://tuscany.apache.org/xmlns/sca/1.1" + targetNamespace="http://samples" name="Chat"> + + <component name="ChatComponent"> + <implementation.java + class="org.apache.tuscany.sca.sample.comet.ChatServiceImpl" /> + <service name="ChatService"> + <interface.java interface="org.apache.tuscany.sca.sample.comet.ChatService" + callbackInterface="org.apache.tuscany.sca.binding.comet.runtime.callback.CometCallback" /> + <tuscany:binding.comet /> + <callback> + <tuscany:binding.comet /> + </callback> + </service> + </component> + +</composite>
\ No newline at end of file diff --git a/sca-java-2.x/branches/2.0/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 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. +--> +<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:j2ee="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_3.0.xsd" version="3.0"> + <display-name>Apache Tuscany Stock Comet Sample</display-name> + <filter> + <filter-name>tuscany</filter-name> + <filter-class>org.apache.tuscany.sca.host.webapp.TuscanyServletFilter</filter-class> + <async-supported>true</async-supported> + </filter> + <filter-mapping> + <filter-name>tuscany</filter-name> + <url-pattern>/*</url-pattern> + </filter-mapping> + <welcome-file-list> + <welcome-file>index.html</welcome-file> + </welcome-file-list> +</web-app>
\ No newline at end of file diff --git a/sca-java-2.x/branches/2.0/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 @@ +<!-- + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. +--> +<html> + <head> + <title>Apache Tuscany Comet Sample</title> + <!-- Tuscany Comet Javascript Toolkit is dependent on jQuery --> + <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js" type="text/javascript"></script> + <script type="text/javascript" src="tuscany-comet-js/org.apache.tuscany.sca.CometComponentContext.js"></script> + <script type="text/javascript"> + var user = ""; + + $(document).ready(function() + { + $("#chat").hide(); + $("#username").focus(); + + // Tuscany Comet specific API + SCA.TuscanyComet.connect(); + + $("#register").click(function() { + register(messageCallback); + }); + + $("#username").keyup(function(e) { + if(e.keyCode == 13) { + register(messageCallback); + } + }); + + function register(callback) { + SCA.CometComponentContext.ChatService.register(callback); + user = $("#username").val(); + $("#login").hide(); + $("#chat").show(); + $("#message").focus(); + } + + $("#send").click(function() { + postMessage(user, $("#message").val(), postCallback); + }); + + $("#message").keyup(function(e) { + if(e.keyCode == 13) { + postMessage(user, $("#message").val(), postCallback); + } + }); + + function postMessage(user, message, callback) { + SCA.CometComponentContext.ChatService.postMessage(user, message, callback); + $("#message").val(""); + $("#message").focus(); + } + + }); + + // this method is invoked on new messages because the CometCallback object is saved + // during the register call so uses it's callback to push data back + function messageCallback(response) { + var textarea = document.getElementById('textarea'); + textarea.value += response + "\n"; + textarea.scrollTop = textarea.scrollHeight; + } + + function postCallback(response) { + } + + </script> + </head> + <body> + <h2>Apache Tuscany Comet Sample</h2> + <h3>Chat</h3> + <p/> + <div id="login"> + <table> + <tr> + <td>Nickname</td> + <td><input type="text" id='username'/></td> + <td><input type="button" id='register' value='Login'/></td> + </tr> + </table> + </div> + <div id="chat"> + <h3>Server notifications</h3> + <textarea id="textarea" rows="15" cols="30" readonly></textarea> + <table> + <tr> + <td><input type="text" id='message'/></td> + <td><input type="button" id='send' value='Send'/></td> + </tr> + </table> + </div> + </body> +</html> diff --git a/sca-java-2.x/branches/2.0/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 @@ +<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<project>
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>org.apache.tuscany.sca.samples</groupId>
+ <artifactId>tuscany-samples-learning-more</artifactId>
+ <version>2.0</version>
+ <relativePath>../pom.xml</relativePath>
+ </parent>
+
+ <artifactId>tuscany-samples-binding-comet</artifactId>
+ <packaging>pom</packaging>
+ <name>Apache Tuscany SCA Sample binding.comet</name>
+
+ <profiles>
+ <profile>
+ <id>default</id>
+ <activation>
+ <activeByDefault>true</activeByDefault>
+ </activation>
+ <modules>
+ <module>autocomplete-webapp</module>
+ <module>weather-webapp</module>
+ <module>pubsub-webapp</module>
+ <module>chat-webapp</module>
+ </modules>
+ </profile>
+ </profiles>
+</project>
diff --git a/sca-java-2.x/branches/2.0/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 <tuscany:binding.comet/> to a service definition, the Tuscany runtime +will handle the communication between the browser client and the service +implementation using Comet techniques. This enables bidirectional communication +over HTTP, therefore enabling server push. For more information, check +http://en.wikipedia.org/wiki/Comet_(programming). + +The comet binding is using the Atmosphere Framework under the hood to acomodate +as many deployment envorinments as possible. Basically, it checks if the +application server supports Servlet 3.0 falling back to a number of native +comet solutions provided by vendors (Jetty, Tomcat, WebLogic, GlassFish and +others). If none is available, Atmosphere will fallback to blocking IO. + +In order to enable callbacks to push multiple responses, you need to declare the +CometCallback in the service definition as follows: + <interface.java interface="org.apache.tuscany.sca.sample.comet.ChatService" + callbackInterface="org.apache.tuscany.sca.binding.comet.runtime.callback.CometCallback" /> + <tuscany:binding.comet /> + <callback> + <tuscany:binding.comet /> + </callback> + +The callback object has methods that facilitate sending messages back to the +calling client. It can be injected in the service implementation using the @Callback +annotation. + +One requirement that service methods have to meet to enable multiple response +support is that they have to be annotated with @OneWay to enable non-blocking +support. Without it, methods are treated synchronously sending a single response +which is the object returned by the method call. + +Invoking comet services can be done using Tuscany's javascript API which simulates +SCA in the browser. It uses the Atmosphere jQuery plugin under the hood. In order +to use it, the following script has to be included in the client page: + <script type="text/javascript" + src="tuscany-comet-js/org.apache.tuscany.sca.CometComponentContext.js"> + </script> + +The javascript toolkit permits choosing between two comet techniques: HTTP streaming +and long polling. More detailed information about them can be found on the previously +mentioned wikipedia page. + +First, a connect operation has to be issued in order to initiate communication +with the server side using the technique of your choice. This is done using the +connection method as follows: + SCA.TuscanyComet.connect('streaming'); // for HTTP streaming + SCA.TuscanyComet.connect('long-polling'); // for long polling + SCA.TuscanyComet.connect(); // starts with HTTP streaming and falls back to long polling if necessary + +The Tuscany Comet toolkit will inject proxies for all services defined in the composite +that are using binding.comet. All invocation and connection management is handled +under the hood so in order to invoke a comet service, the following should be called: + SCA.CometComponentContext.<service name>.<operation name>(<parameters>, callback); + +The callback parameter is the function that will handle responses received for a +certain service operation. It has a single argument which is the response: + function callback(response) { + // handle response + }; + +Note that the data exchange is automatically handled by the binding, so parameters +will be mapped to the data types defined in the method definition. Also, the response +will have the same data type as the server side object used to wrap the response. +Objects are passed over the wire in JSON format. + +Another detail worth mentioning is that the binding will use a single HTTP +connection to handle communication between a browser client and all services +defined using binding.comet in the same composite. Requests and responses will get +multiplexed via the same channel and get routed to the appropriate service +implementation, respectively javascript function. This is done in order to avoid +the 2 HTTP connection limit imposed by browsers. For more info, check +http://www.openajax.org/runtime/wiki/The_Two_HTTP_Connection_Limit_Issue. + +In order to run the sample, you can execute "mvn clean install t7:run" which will +start a Tomcat 7 instance automatically or use "mvn package" and deploy the resulting +war to the application server of your choice. + +Next, point your browser at + http://localhost:8080/sample-binding-comet-chat-webapp/ + +You can now register or unregister for any of a number of events. When an event is fired +on the server side, the browser client will receive a notification which will be displayed +in the page. You can see the persistent HTTP streaming connection or long polling subsequent +connections using the developer tools provided by your browser. + +The comet binding is an experimental binding so community feedback is much +appreciated. Feel free to send comments or suggestions on the Apache Tuscany +dev mailing list (dev@tuscany.apache.org).
\ No newline at end of file diff --git a/sca-java-2.x/branches/2.0/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 @@ +<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>org.apache.tuscany.sca.samples</groupId>
+ <artifactId>tuscany-samples-binding-comet</artifactId>
+ <version>2.0</version>
+ <relativePath>../pom.xml</relativePath>
+ </parent>
+
+ <artifactId>sample-binding-comet-pubsub-webapp</artifactId>
+ <packaging>war</packaging>
+ <version>2.0</version>
+ <name>Apache Tuscany SCA Sample binding.comet PubSub Webapp</name>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.tuscany.sca</groupId>
+ <artifactId>tuscany-binding-comet-runtime</artifactId>
+ <version>2.0</version>
+ </dependency>
+ <dependency>
+ <groupId>javax</groupId>
+ <artifactId>javaee-web-api</artifactId>
+ <version>6.0</version>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.tuscany.sca</groupId>
+ <artifactId>tuscany-base-runtime-pom</artifactId>
+ <version>2.0</version>
+ <type>pom</type>
+ <scope>compile</scope>
+ </dependency>
+ <dependency>
+ <groupId>com.google.guava</groupId>
+ <artifactId>guava</artifactId>
+ <version>r09</version>
+ <type>jar</type>
+ <scope>compile</scope>
+ </dependency>
+ </dependencies>
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>com.googlecode.t7mp</groupId>
+ <artifactId>maven-t7-plugin</artifactId>
+ <version>0.9.6</version>
+ <configuration>
+ <webapps>
+ <webappArtifact>
+ <groupId>org.apache.tuscany.sca.samples</groupId>
+ <artifactId>sample-binding-comet-pubsub-webapp</artifactId>
+ <version>2.0</version>
+ </webappArtifact>
+ </webapps>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+</project>
+
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<String, CometCallback> clients = new ConcurrentHashMap<String, CometCallback>(); + private Multimap<String, String> eventListeners = Multimaps.synchronizedMultimap(HashMultimap + .<String, String> create()); + + @Override + public void onEvent(String eventName, String eventData) { + // System.out.println("EventProcessor: Received event " + eventName + + // "..."); + List<String> destinations = new ArrayList<String>(); + synchronized (eventListeners) { + destinations.addAll(eventListeners.get(eventName)); + } + Event event = new Event(); + event.setName(eventName); + event.setData(eventData); + for (String registrationId : destinations) { + CometCallback client = clients.get(registrationId); + if (client == null) { + // client has unregistered from this event + synchronized (eventListeners) { + eventListeners.remove(eventName, registrationId); + } + } else { + Status status = client.sendMessage(event); + if (status == Status.CLIENT_DISCONNECTED) { + unregister(registrationId); + } + } + } + } + + @Override + public void register(String eventName) { + String registrationId = UUID.randomUUID().toString(); + CometCallback callback = componentContext.getRequestContext().getCallback(); + clients.put(registrationId, callback); + synchronized (eventListeners) { + eventListeners.put(eventName, registrationId); + } + Event event = new Event(); + event.setId(registrationId); + event.setName(eventName); + event.setData(new Date().toString()); + callback.sendMessage(event); + } + + @Override + public void unregister(String registrationId) { + clients.remove(registrationId); + // unregistration from eventListeners done during onEvent + } + + @Destroy + public void shutdown() { + clients.clear(); + eventListeners.clear(); + clients = null; + eventListeners = null; + } +} diff --git a/sca-java-2.x/branches/2.0/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 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. +--> +<composite xmlns="http://docs.oasis-open.org/ns/opencsa/sca/200912" + xmlns:tuscany="http://tuscany.apache.org/xmlns/sca/1.1" + targetNamespace="http://samples" name="Event"> + + <component name="EventProcessorComponent"> + <implementation.java + class="org.apache.tuscany.sca.sample.comet.EventProcessor" /> + <service name="EventProcessorConsumerService"> + <interface.java + interface="org.apache.tuscany.sca.sample.comet.EventProcessorConsumerService" + callbackInterface="org.apache.tuscany.sca.binding.comet.runtime.callback.CometCallback" /> + <tuscany:binding.comet /> + <callback> + <tuscany:binding.comet /> + </callback> + </service> + <service name="EventProcessorProducerService"> + <interface.java + interface="org.apache.tuscany.sca.sample.comet.EventProcessorProducerService" /> + </service> + </component> + + <component name="SLOWProducerComponent"> + <implementation.java class="org.apache.tuscany.sca.sample.comet.Producer" /> + <reference name="eventProcessor" target="EventProcessorComponent" /> + <property name="eventName">SLOW</property> + <property name="frequency">6000</property> + </component> + + <component name="MODERATEProducerComponent"> + <implementation.java class="org.apache.tuscany.sca.sample.comet.Producer" /> + <reference name="eventProcessor" target="EventProcessorComponent" /> + <property name="eventName">MODERATE</property> + <property name="frequency">3000</property> + </component> + + <component name="FASTProducerComponent"> + <implementation.java class="org.apache.tuscany.sca.sample.comet.Producer" /> + <reference name="eventProcessor" target="EventProcessorComponent" /> + <property name="eventName">FAST</property> + <property name="frequency">1000</property> + </component> + +</composite>
\ No newline at end of file diff --git a/sca-java-2.x/branches/2.0/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 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. +--> +<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:j2ee="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_3.0.xsd" version="3.0"> + <display-name>Apache Tuscany Stock Comet Sample</display-name> + <filter> + <filter-name>tuscany</filter-name> + <filter-class>org.apache.tuscany.sca.host.webapp.TuscanyServletFilter</filter-class> + <async-supported>true</async-supported> + </filter> + <filter-mapping> + <filter-name>tuscany</filter-name> + <url-pattern>/*</url-pattern> + </filter-mapping> + <welcome-file-list> + <welcome-file>index.html</welcome-file> + </welcome-file-list> +</web-app>
\ No newline at end of file diff --git a/sca-java-2.x/branches/2.0/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 @@ +<!-- + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. +--> +<html> +<head> + <title>Apache Tuscany Comet Sample</title> + <!-- Tuscany Comet Javascript Toolkit is dependent on jQuery --> + <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js" type="text/javascript"></script> + <script type="text/javascript" src="tuscany-comet-js/org.apache.tuscany.sca.CometComponentContext.js"></script> + <script type="text/javascript"> + $(document).ready(function() + { + // Tuscany Comet specific API + $('#connect').click(function(event) { + /* transport can be : long-polling or streaming */ + SCA.TuscanyComet.connect($('#transport').val()); + $('#connect').val('Switch'); + }); + + + $('#registerEventButton').click(function(event) { + var eventName = $('#registerEventName').val(); + if (registrationIds[eventName] != null) { + alert("Already registered for " + eventName + " events"); + } else { + SCA.CometComponentContext.EventProcessorConsumerService.register(eventName, responseReceived); + } + }); + + $('#unregisterEventButton').click(function(event) { + var eventName = $('#unregisterEventName').val(); + if (registrationIds[eventName] != null) { + SCA.CometComponentContext.EventProcessorConsumerService.unregister(registrationIds[eventName], responseReceived); + registrationIds[eventName] = null; + } else { + alert("Not registered for " + eventName + " events"); + } + }); + + }); + + var registrationIds = {}; + + function responseReceived(event) { + var text = ''; + if (event.id != null) { + // registration notification + registrationIds[event.name] = event.id; + text = "Registered to " + event.name + " with id " + event.id + " at " + event.data; + } else { + // event notification + text = event.name + ": " + event.data; + } + var textarea = $('#textarea'); + $(textarea).val($(textarea).val() + text + "\n"); + $(textarea).scrollTop($(textarea)[0].scrollHeight); + } + + </script> +</head> +<body> + <div id='sidebar'> + <h2>Apache Tuscany Comet Sample</h2> + <label>Select transport</label> <select id="transport"> + <option id="streaming" value="streaming">http streaming</option> + <option id="long-polling" value="long-polling">long-polling</option> + </select> <input id='connect' type='submit' value='Connect' /> + <h3>PubSub for FAST, MODERATE and SLOW events</h3> + <p /> + <table> + <tr> + <td>Event name</td> + <td><input type="text" id='registerEventName' value='FAST' /> + </td> + <td><input type="button" id='registerEventButton' + value='Register' /> + </td> + </tr> + <tr> + <td>Event name</td> + <td><input type="text" id='unregisterEventName' value='FAST' /> + </td> + <td><input type="button" id='unregisterEventButton' + value='Unregister' /> + </td> + </tr> + </table> + <h3>Server notifications</h3> + <textarea id="textarea" rows="15" cols="80" readonly></textarea> + </div> +</body> +</html> diff --git a/sca-java-2.x/branches/2.0/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 <tuscany:binding.comet/> to a service definition, the Tuscany runtime +will handle the communication between the browser client and the service +implementation using Comet techniques. This enables bidirectional communication +over HTTP, therefore enabling server push. For more information, check +http://en.wikipedia.org/wiki/Comet_(programming). + +The comet binding is using the Atmosphere Framework under the hood to acomodate +as many deployment envorinments as possible. Basically, it checks if the +application server supports Servlet 3.0 falling back to a number of native +comet solutions provided by vendors (Jetty, Tomcat, WebLogic, GlassFish and +others). If none is available, Atmosphere will fallback to blocking IO. + +In order to enable callbacks to push multiple responses, you need to declare the +CometCallback in the service definition as follows: + <interface.java interface="org.apache.tuscany.sca.sample.comet.ChatService" + callbackInterface="org.apache.tuscany.sca.binding.comet.runtime.callback.CometCallback" /> + <tuscany:binding.comet /> + <callback> + <tuscany:binding.comet /> + </callback> + +The callback object has methods that facilitate sending messages back to the +calling client. It can be injected in the service implementation using the @Callback +annotation. + +One requirement that service methods have to meet to enable multiple response +support is that they have to be annotated with @OneWay to enable non-blocking +support. Without it, methods are treated synchronously sending a single response +which is the object returned by the method call. + +Invoking comet services can be done using Tuscany's javascript API which simulates +SCA in the browser. It uses the Atmosphere jQuery plugin under the hood. In order +to use it, the following script has to be included in the client page: + <script type="text/javascript" + src="tuscany-comet-js/org.apache.tuscany.sca.CometComponentContext.js"> + </script> + +The javascript toolkit permits choosing between two comet techniques: HTTP streaming +and long polling. More detailed information about them can be found on the previously +mentioned wikipedia page. + +First, a connect operation has to be issued in order to initiate communication +with the server side using the technique of your choice. This is done using the +connection method as follows: + SCA.TuscanyComet.connect('streaming'); // for HTTP streaming + SCA.TuscanyComet.connect('long-polling'); // for long polling + SCA.TuscanyComet.connect(); // starts with HTTP streaming and falls back to long polling if necessary + +The Tuscany Comet toolkit will inject proxies for all services defined in the composite +that are using binding.comet. All invocation and connection management is handled +under the hood so in order to invoke a comet service, the following should be called: + SCA.CometComponentContext.<service name>.<operation name>(<parameters>, callback); + +The callback parameter is the function that will handle responses received for a +certain service operation. It has a single argument which is the response: + function callback(response) { + // handle response + }; + +Note that the data exchange is automatically handled by the binding, so parameters +will be mapped to the data types defined in the method definition. Also, the response +will have the same data type as the server side object used to wrap the response. +Objects are passed over the wire in JSON format. + +Another detail worth mentioning is that the binding will use a single HTTP +connection to handle communication between a browser client and all services +defined using binding.comet in the same composite. Requests and responses will get +multiplexed via the same channel and get routed to the appropriate service +implementation, respectively javascript function. This is done in order to avoid +the 2 HTTP connection limit imposed by browsers. For more info, check +http://www.openajax.org/runtime/wiki/The_Two_HTTP_Connection_Limit_Issue. + +In order to run the sample, you can execute "mvn clean install t7:run" which will +start a Tomcat 7 instance automatically or use "mvn package" and deploy the resulting +war to the application server of your choice. + +Next, point your browser at + http://localhost:8080/sample-binding-comet-weather-webapp/ + +You can now set a location and register for various weather parameters. Notifications +will be pushed to the browser when weather parameters change. You can see the persistent +HTTP streaming connection or long polling subsequent connections using the developer +tools provided by your browser. + +The comet binding is an experimental binding so community feedback is much +appreciated. Feel free to send comments or suggestions on the Apache Tuscany +dev mailing list (dev@tuscany.apache.org).
\ No newline at end of file diff --git a/sca-java-2.x/branches/2.0/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 @@ +<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>org.apache.tuscany.sca.samples</groupId>
+ <artifactId>tuscany-samples-binding-comet</artifactId>
+ <version>2.0</version>
+ <relativePath>../pom.xml</relativePath>
+ </parent>
+
+ <artifactId>sample-binding-comet-weather-webapp</artifactId>
+ <packaging>war</packaging>
+ <version>2.0</version>
+ <name>Apache Tuscany SCA Sample binding.comet Weather Monitor Webapp</name>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.tuscany.sca</groupId>
+ <artifactId>tuscany-binding-comet-runtime</artifactId>
+ <version>2.0</version>
+ </dependency>
+ <dependency>
+ <groupId>javax</groupId>
+ <artifactId>javaee-web-api</artifactId>
+ <version>6.0</version>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.tuscany.sca</groupId>
+ <artifactId>tuscany-base-runtime-pom</artifactId>
+ <version>2.0</version>
+ <type>pom</type>
+ <scope>compile</scope>
+ </dependency>
+ </dependencies>
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>com.googlecode.t7mp</groupId>
+ <artifactId>maven-t7-plugin</artifactId>
+ <version>0.9.6</version>
+ <configuration>
+ <webapps>
+ <webappArtifact>
+ <groupId>org.apache.tuscany.sca.samples</groupId>
+ <artifactId>sample-binding-comet-weather-webapp</artifactId>
+ <version>2.0</version>
+ </webappArtifact>
+ </webapps>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+</project>
+
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 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. +--> +<composite xmlns="http://docs.oasis-open.org/ns/opencsa/sca/200912" + xmlns:tuscany="http://tuscany.apache.org/xmlns/sca/1.1" + targetNamespace="http://samples" + name="Weather"> + + <component name="c1"> + <implementation.java class="org.apache.tuscany.sca.sample.comet.TemperatureHumidityServiceImpl"/> + <service name="TemperatureService"> + <interface.java interface="org.apache.tuscany.sca.sample.comet.TemperatureService" + callbackInterface="org.apache.tuscany.sca.binding.comet.runtime.callback.CometCallback"/> + <tuscany:binding.comet/> + <callback> + <tuscany:binding.comet/> + </callback> + </service> + <service name="HumidityService"> + <interface.java interface="org.apache.tuscany.sca.sample.comet.HumidityService" + callbackInterface="org.apache.tuscany.sca.binding.comet.runtime.callback.CometCallback"/> + <tuscany:binding.comet/> + <callback> + <tuscany:binding.comet/> + </callback> + </service> + </component> + + + <component name="c2"> + <implementation.java class="org.apache.tuscany.sca.sample.comet.PrecipitationServiceImpl"/> + <service name="PrecipitationService"> + <interface.java interface="org.apache.tuscany.sca.sample.comet.PrecipitationService" + callbackInterface="org.apache.tuscany.sca.binding.comet.runtime.callback.CometCallback"/> + <tuscany:binding.comet/> + <callback> + <tuscany:binding.comet/> + </callback> + </service> + </component> + +</composite>
\ No newline at end of file diff --git a/sca-java-2.x/branches/2.0/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 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. +--> +<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:j2ee="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_3.0.xsd" version="3.0"> + <display-name>Apache Tuscany Stock Comet Sample</display-name> + <filter> + <filter-name>tuscany</filter-name> + <filter-class>org.apache.tuscany.sca.host.webapp.TuscanyServletFilter</filter-class> + <async-supported>true</async-supported> + </filter> + <filter-mapping> + <filter-name>tuscany</filter-name> + <url-pattern>/*</url-pattern> + </filter-mapping> + <welcome-file-list> + <welcome-file>index.html</welcome-file> + </welcome-file-list> +</web-app>
\ No newline at end of file diff --git a/sca-java-2.x/branches/2.0/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 @@ +<!-- + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. +--> +<html> + <head> + <title>Apache Tuscany Comet Sample</title> + <!-- Tuscany Comet Javascript Toolkit is dependent on jQuery --> + <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js" type="text/javascript"></script> + <script type="text/javascript" src="tuscany-comet-js/org.apache.tuscany.sca.CometComponentContext.js"></script> + <script type="text/javascript"> + $(document).ready(function() + { + // Initialization + var location = new Object(); + location.city = null; + location.country = null; + + $('#locationButton').attr('disabled', 'disabled'); + $('#tempCButton').attr('disabled', 'disabled'); + $('#tempFButton').attr('disabled', 'disabled'); + $('#humButton').attr('disabled', 'disabled'); + $('#precipButton').attr('disabled', 'disabled'); + + $('#locationButton').click(function(event) { + location.city = $('#city').val(); + location.country = $('#country').val(); + $('#locationButton').val('Switch location'); + $('#tempCButton').removeAttr('disabled'); + $('#tempFButton').removeAttr('disabled'); + $('#humButton').removeAttr('disabled'); + $('#precipButton').removeAttr('disabled'); + $('#tempCText').text('N/A'); + $('#tempCDate').text(''); + $('#tempFText').text('N/A'); + $('#tempFDate').text(''); + $('#humText').text('N/A'); + $('#humDate').text(''); + $('#precipText').text('N/A'); + $('#precipDate').textContent(''); + }); + + // Tuscany Comet specific API + $('#connect').click(function(event) { + /* transport can be : long-polling or streaming */ + SCA.TuscanyComet.connect($('#transport').val()); + $('#connect').val('Switch'); + $('#locationButton').removeAttr('disabled'); + }); + + + $('#tempCButton').click(function(event) { + SCA.CometComponentContext.TemperatureService.getTemperature(location, 1, updateTempC); + $('#tempCButton').removeAttr('disabled'); + }); + + $('#tempFButton').click(function(event) { + SCA.CometComponentContext.TemperatureService.getTemperature(location, 2, updateTempF); + $('#tempFButton').removeAttr('disabled'); + }); + + $('#humButton').click(function(event) { + SCA.CometComponentContext.HumidityService.getHumidity(location, updateHum); + $('#humButton').removeAttr('disabled'); + }); + + $('#precipButton').click(function(event) { + SCA.CometComponentContext.PrecipitationService.getPrecipitation(location, updatePrecip); + $('#precipButton').removeAttr('disabled'); + }); + }); + + function updateTempC(response) { + $('#tempCText').text(response.data); + $('#tempCDate').text(response.date); + } + + function updateTempF(response) { + $('#tempFText').text(response.data); + $('#tempFDate').text(response.date); + } + + function updateHum(response) { + $('#humText').text(response.data); + $('#humDate').text(response.date); + } + + function updatePrecip(response) { + $('#precipText').text(response.data); + $('#precipDate').text(response.date); + } + </script> + </head> + <body> + <div id='sidebar'> + <h2>Apache Tuscany Comet Sample</h2> + <label>Select transport</label> + <select id="transport"> + <option id="streaming" value="streaming">http streaming</option> + <option id="long-polling" value="long-polling">long-polling</option> + </select> + <input id='connect' type='submit' value='Connect'/> + <h3>Weather Monitor</h3> + <p/> + <table> + <tr> + <td>City</td> + <td><input type="text" id='city' value='Brasov'/></td> + </tr> + <tr> + <td>Country</td> + <td><input type="text" id ='country' value='Romania'/></td> + </tr> + </table> + <input type="button" id='locationButton' value='Set location'/> + <p/> + <table> + <tr> + <th align="left">Temperature (Celsius):</th> + <td><span id='tempCText'>N/A</span></td> + <td><input type='button' id='tempCButton' value="Update"/></td> + <td><span id='tempCDate'></span> + </tr> + <tr> + <th align="left">Temperature (Fahrenheit):</th> + <td><span id='tempFText'>N/A</span></td> + <td><input type='button' id='tempFButton' value="Update"/></td> + <td><span id='tempFDate'></span> + </tr> + <tr> + <th align="left">Humidity:</th> + <td><span id='humText'>N/A</span></td> + <td><input type='button' id='humButton' value="Update"/></td> + <td><span id='humDate'></span> + </tr> + <tr> + <th align="left">Precipitation probability:</th> + <td><span id='precipText'>N/A</span></td> + <td><input type='button' id='precipButton' value="Update"/></td> + <td><span id='precipDate'></span> + </tr> + </table> + </div> + </body> +</html> diff --git a/sca-java-2.x/branches/2.0/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 <tuscany:binding.websocket port="8090"/> to a service definition, the +Tuscany runtime will start a websocket server listening for requests coming +in for the exposed service at the specified port. If no port is specified, the +runtime will use port 9000 as a default. + +The websocket binding uses embedded Jetty instances as websocket servers. At the +moment, Jetty 8.0.0-M3 is used which has support for the 00, 01, 06 and 07 +versions of the websocket protocol drafts. + +IN ORDER TO RUN THIS SAMPLE SUCCESSFULLY PLEASE CHECK IF YOUR BROWSER SUPPORTS +THE ABOVE WEBSOCKET PROTOCOL VERSIONS AND THAT THE WEBSOCKET SUPPORT IS ENABLED. + +The websocket binding also features a javascript API to simulate SCA in the +browser. In order to use it, the following script has to be included in the +client page: + <script type="text/javascript" + src="org.apache.tuscany.sca.WebsocketComponentContext.js"> + </script> + +This will inject proxies for all services defined in the composite that are +using binding.websocket. All invocation and connection management is handled +under the hood so in order to invoke a websocket service, the following should +be called: + Tuscany.WebsocketComponentContext.<component name>.<service name>.<operation name>(<parameters>); + +Given the asynchornous nature of websockets, a function should be defined in +order to handle responses received for a certain service operation. This should +be done as follows: + Tuscany.WebsocketComponentContext.<component name>.<service name>.<operation name>.responseHandler = function(response) { + // handle response + }; + +Note that the data exchange is automatically handled by the binding, so the +parameters should have the same structure as the data types defined in the method +definition. Also, the response will have the same data type as the return type of +the service method. Objects are passed over the wire in JSON format. + +Another detail worth mentioning is that the binding will use a single websocket +connection to handle communication between a browser client and all services +defined using binding.websocket on the same port. Requests and responses will get +multiplexed via the same channel and get routed to the appropriate service +implementation, respectively javascript function. + +In order to run the sample, you can execute "mvn jetty:run" which will start a Jetty +instance automatically or use "mvn package" and deploy the resulting war to the +application server of your choice. + +Next, point your browser at + http://localhost:8080/sample-binding-websocket-autocomplete-webapp/ + +You can see how suggestions are being received in real time when characters are +entered in the text field. You can see the persistent websocket connection using +the developer tools provided by your browser. + +The websocket binding is an experimental binding so community feedback is much +appreciated. Feel free to send comments or suggestions on the Apache Tuscany +dev mailing list (dev@tuscany.apache.org).
\ No newline at end of file diff --git a/sca-java-2.x/branches/2.0/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 @@ +<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>org.apache.tuscany.sca.samples</groupId>
+ <artifactId>tuscany-samples-binding-websocket</artifactId>
+ <version>2.0</version>
+ <relativePath>../pom.xml</relativePath>
+ </parent>
+
+ <artifactId>sample-binding-websocket-autocomplete-webapp</artifactId>
+ <packaging>war</packaging>
+ <version>2.0</version>
+ <name>Apache Tuscany SCA Sample binding.websocket Autocomplete Webapp</name>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.tuscany.sca</groupId>
+ <artifactId>tuscany-binding-websocket</artifactId>
+ <version>2.0</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.tuscany.sca</groupId>
+ <artifactId>tuscany-base-runtime-pom</artifactId>
+ <version>2.0</version>
+ <type>pom</type>
+ <scope>compile</scope>
+ </dependency>
+ </dependencies>
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.mortbay.jetty</groupId>
+ <artifactId>maven-jetty-plugin</artifactId>
+ <version>6.1.26</version>
+ </plugin>
+ </plugins>
+ </build>
+
+</project>
+
diff --git a/sca-java-2.x/branches/2.0/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<Country> 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<Country> countries; + + @Constructor + public CountryRepositoryImpl(@Property(name = "fileName") String fileName) { + this.fileName = fileName; + countries = new ArrayList<Country>(); + } + + @Init + public void start() { + try { + BufferedReader reader = new BufferedReader(new InputStreamReader(getClass().getClassLoader() + .getResourceAsStream(fileName))); + String line; + while ((line = reader.readLine()) != null) { + if (!line.startsWith("#")) { + Country c = new Country(); + c.setName(line); + countries.add(c); + } + } + } catch (FileNotFoundException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + @Override + public List<Country> findStartingWith(String text) { + List<Country> result = new ArrayList<Country>(); + for (Country c : countries) { + if (c.getName().toLowerCase().startsWith(text.toLowerCase())) { + result.add(c); + } + } + return result; + } + +} diff --git a/sca-java-2.x/branches/2.0/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<Country> 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<Country> 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 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. +--> +<composite xmlns="http://docs.oasis-open.org/ns/opencsa/sca/200912" + xmlns:tuscany="http://tuscany.apache.org/xmlns/sca/1.1" + xmlns:sca="http://docs.oasis-open.org/ns/opencsa/sca/200912" + targetNamespace="http://samples" name="Chat"> + + <component name="CountryServiceComponent"> + <implementation.java + class="sample.CountryServiceImpl" /> + <service name="CountryService"> + <interface.java interface="sample.CountryService" /> + <tuscany:binding.websocket port="8090" /> + </service> + <reference name="repository" target="CountryRepositoryComponent" /> + </component> + + <component name="CountryRepositoryComponent"> + <implementation.java class="sample.CountryRepositoryImpl" /> + <property name="fileName">countries.txt</property> + </component> + +</composite>
\ No newline at end of file diff --git a/sca-java-2.x/branches/2.0/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 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. +--> +<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:j2ee="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_3.0.xsd" version="3.0"> + <display-name>Apache Tuscany Stock Comet Sample</display-name> + <filter> + <filter-name>tuscany</filter-name> + <filter-class>org.apache.tuscany.sca.host.webapp.TuscanyServletFilter</filter-class> + <async-supported>true</async-supported> + </filter> + <filter-mapping> + <filter-name>tuscany</filter-name> + <url-pattern>/*</url-pattern> + </filter-mapping> + <welcome-file-list> + <welcome-file>index.html</welcome-file> + </welcome-file-list> +</web-app>
\ No newline at end of file diff --git a/sca-java-2.x/branches/2.0/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 @@ +<!-- + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. +--> +<html> + <head> + <title>Apache Tuscany Websocket Sample</title> + <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js" type="text/javascript"></script> + <script type="text/javascript" src="org.apache.tuscany.sca.WebsocketComponentContext.js"></script> + <script type="text/javascript"> + var user = ""; + + Tuscany.WebsocketComponentContext.CountryServiceComponent.CountryService.getCountriesStartingWith.responseHandler = function(response) { + var html = '<ul>'; + $.each(response, function(index, country) { + html += '<li>' + country.name + "</li>" + }); + html += '</ul>' + $("#suggestions").html(html); + } + + $(document).ready(function() + { + $("#country").keyup(function() { + var text = $("#country").val(); + if (text != "") { + Tuscany.WebsocketComponentContext.CountryServiceComponent.CountryService.getCountriesStartingWith(text); + } else { + $("#suggestions").html(""); + } + }); + $("#country").focus(); + }); + + </script> + </head> + <body> + <h2>Apache Tuscany Websocket Sample</h2> + <h3>Real-time suggestions</h3> + <table> + <tr> + <td>Enter a country name</td> + <td><input type="text" id='country'/></td> + </tr> + </table> + </div> + <div id="suggestions"> + </div> + </body> +</html> diff --git a/sca-java-2.x/branches/2.0/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 <tuscany:binding.websocket port="8090"/> to a service definition, the +Tuscany runtime will start a websocket server listening for requests coming +in for the exposed service at the specified port. If no port is specified, the +runtime will use port 9000 as a default. + +The websocket binding uses embedded Jetty instances as websocket servers. At the +moment, Jetty 8.0.0-M3 is used which has support for the 00, 01, 06 and 07 +versions of the websocket protocol drafts. + +IN ORDER TO RUN THIS SAMPLE SUCCESSFULLY PLEASE CHECK IF YOUR BROWSER SUPPORTS +THE ABOVE WEBSOCKET PROTOCOL VERSIONS AND THAT THE WEBSOCKET SUPPORT IS ENABLED. + +In order to enable callbacks to push multiple responses, you need to declare the +WebsocketBindingCallback in the service definition as follows: + + <interface.java interface="sample.ChatService" + callbackInterface="org.apache.tuscany.sca.binding.websocket.runtime.WebsocketBindingCallback" /> + <tuscany:binding.websocket /> + <callback> + <tuscany:binding.websocket /> + </callback> + +The callback object has methods that facilitate sending messages back to the +calling client. It can be injected in the service implementation using the @Callback +annotation. However, the service implementation for this sample has the COMPOSITE +scope so the callback reference has to be obtained from the ComponentContext. + +One requirement that service methods have to meet to enable multiple response +support is that they have to be annotated with @OneWay to enable non-blocking +support. Without it, methods are treated synchronously sending a single response +which is the object returned by the method call. + +The websocket binding also features a javascript API to simulate SCA in the +browser. In order to use it, the following script has to be included in the +client page: + <script type="text/javascript" + src="org.apache.tuscany.sca.WebsocketComponentContext.js"> + </script> + +This will inject proxies for all services defined in the composite that are +using binding.websocket. All invocation and connection management is handled +under the hood so in order to invoke a websocket service, the following should +be called: + Tuscany.WebsocketComponentContext.<component name>.<service name>.<operation name>(<parameters>); + +Given the asynchornous nature of websockets, a function should be defined in +order to handle responses received for a certain service operation. This should +be done as follows: + Tuscany.WebsocketComponentContext.<component name>.<service name>.<operation name>.responseHandler = function(response) { + // handle response + }; + +Note that the data exchange is automatically handled by the binding, so parameters +will be mapped to the data types defined in the method definition. Also, the response +will have the same data type as the server side object used to wrap the response. +Objects are passed over the wire in JSON format. + +Another detail worth mentioning is that the binding will use a single persistent +websocket connection to handle communication between a browser client and all services +defined using binding.websocket on the same port. Requests and responses will get +multiplexed via the same channel and get routed to the appropriate service +implementation, respectively javascript function. + +In order to run the sample, you can execute "mvn jetty:run" which will start a Jetty +instance automatically or use "mvn package" and deploy the resulting war to the +application server of your choice. + +Next, point your browser at + http://localhost:8080/sample-binding-websocket-chat-webapp/ + +You can now chat using multiple tabs or browsers. You can see the persistent websocket +connection using the developer tools provided by your browser. + +The websocket binding is an experimental binding so community feedback is much +appreciated. Feel free to send comments or suggestions on the Apache Tuscany +dev mailing list (dev@tuscany.apache.org).
\ No newline at end of file diff --git a/sca-java-2.x/branches/2.0/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 @@ +<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>org.apache.tuscany.sca.samples</groupId>
+ <artifactId>tuscany-samples-binding-websocket</artifactId>
+ <version>2.0</version>
+ <relativePath>../pom.xml</relativePath>
+ </parent>
+
+ <artifactId>sample-binding-websocket-chat-webapp</artifactId>
+ <packaging>war</packaging>
+ <version>2.0</version>
+ <name>Apache Tuscany SCA Sample binding.websocket Chat Webapp</name>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.tuscany.sca</groupId>
+ <artifactId>tuscany-binding-websocket</artifactId>
+ <version>2.0</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.tuscany.sca</groupId>
+ <artifactId>tuscany-base-runtime-pom</artifactId>
+ <version>2.0</version>
+ <type>pom</type>
+ <scope>compile</scope>
+ </dependency>
+ <dependency>
+ <groupId>com.google.guava</groupId>
+ <artifactId>guava</artifactId>
+ <version>r09</version>
+ <type>jar</type>
+ <scope>compile</scope>
+ </dependency>
+ </dependencies>
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.mortbay.jetty</groupId>
+ <artifactId>maven-jetty-plugin</artifactId>
+ <version>6.1.26</version>
+ </plugin>
+ </plugins>
+ </build>
+
+</project>
+
diff --git a/sca-java-2.x/branches/2.0/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<WebsocketBindingCallback> clients = new CopyOnWriteArrayList<WebsocketBindingCallback>(); + + @Override + public void postMessage(String user, String message) { + for (WebsocketBindingCallback callback : new ArrayList<WebsocketBindingCallback>(clients)) { + WebsocketStatus status = callback.sendMessage(user + ": " + message); + if (status == WebsocketStatus.CLOSED) { + clients.remove(callback); + } + } + } + + @Override + public void register() { + // saving the callback object during register() method so it will push + // data back to the client + // using the callback method defined for the register operation in the + // js when used + clients.add(context.getRequestContext().<WebsocketBindingCallback> getCallback()); + } +} diff --git a/sca-java-2.x/branches/2.0/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 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. +--> +<composite xmlns="http://docs.oasis-open.org/ns/opencsa/sca/200912" + xmlns:tuscany="http://tuscany.apache.org/xmlns/sca/1.1" + targetNamespace="http://samples" name="Chat"> + + <component name="ChatComponent"> + <implementation.java + class="sample.ChatServiceImpl" /> + <service name="ChatService"> + <interface.java interface="sample.ChatService" + callbackInterface="org.apache.tuscany.sca.binding.websocket.runtime.WebsocketBindingCallback" /> + <tuscany:binding.websocket /> + <callback> + <tuscany:binding.websocket /> + </callback> + </service> + </component> + +</composite>
\ No newline at end of file diff --git a/sca-java-2.x/branches/2.0/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 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. +--> +<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:j2ee="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_3.0.xsd" version="3.0"> + <display-name>Apache Tuscany Stock Comet Sample</display-name> + <filter> + <filter-name>tuscany</filter-name> + <filter-class>org.apache.tuscany.sca.host.webapp.TuscanyServletFilter</filter-class> + <async-supported>true</async-supported> + </filter> + <filter-mapping> + <filter-name>tuscany</filter-name> + <url-pattern>/*</url-pattern> + </filter-mapping> + <welcome-file-list> + <welcome-file>index.html</welcome-file> + </welcome-file-list> +</web-app>
\ No newline at end of file diff --git a/sca-java-2.x/branches/2.0/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 @@ +<!-- + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. +--> +<html> + <head> + <title>Apache Tuscany Websocket Sample</title> + <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js" type="text/javascript"></script> + <script type="text/javascript" src="org.apache.tuscany.sca.WebsocketComponentContext.js"></script> + <script type="text/javascript"> + var user = ""; + + $(document).ready(function() + { + $("#chat").hide(); + $("#username").focus(); + + $("#register").click(function() { + register(); + }); + + $("#username").keyup(function(e) { + if(e.keyCode == 13) { + register(); + } + }); + + Tuscany.WebsocketComponentContext.ChatComponent.ChatService.register.responseHandler = function(response) { + var textarea = document.getElementById('textarea'); + textarea.value += response + "\n"; + textarea.scrollTop = textarea.scrollHeight; + } + + function register() { + Tuscany.WebsocketComponentContext.ChatComponent.ChatService.register(); + user = $("#username").val(); + $("#login").hide(); + $("#chat").show(); + $("#message").focus(); + } + + $("#send").click(function() { + postMessage(user, $("#message").val()); + }); + + $("#message").keyup(function(e) { + if(e.keyCode == 13) { + postMessage(user, $("#message").val()); + } + }); + + function postMessage(user, message) { + Tuscany.WebsocketComponentContext.ChatComponent.ChatService.postMessage(user, message); + $("#message").val(""); + $("#message").focus(); + } + + }); + </script> + </head> + <body> + <h2>Apache Tuscany Comet Sample</h2> + <h3>Chat</h3> + <p/> + <div id="login"> + <table> + <tr> + <td>Nickname</td> + <td><input type="text" id='username'/></td> + <td><input type="button" id='register' value='Login'/></td> + </tr> + </table> + </div> + <div id="chat"> + <h3>Server notifications</h3> + <textarea id="textarea" rows="15" cols="30" readonly></textarea> + <table> + <tr> + <td><input type="text" id='message'/></td> + <td><input type="button" id='send' value='Send'/></td> + </tr> + </table> + </div> + </body> +</html> diff --git a/sca-java-2.x/branches/2.0/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 @@ +<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<project>
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>org.apache.tuscany.sca.samples</groupId>
+ <artifactId>tuscany-samples-learning-more</artifactId>
+ <version>2.0</version>
+ <relativePath>../pom.xml</relativePath>
+ </parent>
+
+ <artifactId>tuscany-samples-binding-websocket</artifactId>
+ <packaging>pom</packaging>
+ <name>Apache Tuscany SCA Sample binding.websocket</name>
+
+ <profiles>
+ <profile>
+ <id>default</id>
+ <activation>
+ <activeByDefault>true</activeByDefault>
+ </activation>
+ <modules>
+ <module>autocomplete-webapp</module>
+ <module>weather-webapp</module>
+ <module>chat-webapp</module>
+ <module>pubsub-webapp</module>
+ </modules>
+ </profile>
+ </profiles>
+</project>
diff --git a/sca-java-2.x/branches/2.0/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 <tuscany:binding.websocket port="8090"/> to a service definition, the +Tuscany runtime will start a websocket server listening for requests coming +in for the exposed service at the specified port. If no port is specified, the +runtime will use port 9000 as a default. + +The websocket binding uses embedded Jetty instances as websocket servers. At the +moment, Jetty 8.0.0-M3 is used which has support for the 00, 01, 06 and 07 +versions of the websocket protocol drafts. + +IN ORDER TO RUN THIS SAMPLE SUCCESSFULLY PLEASE CHECK IF YOUR BROWSER SUPPORTS +THE ABOVE WEBSOCKET PROTOCOL VERSIONS AND THAT THE WEBSOCKET SUPPORT IS ENABLED. + +In order to enable callbacks to push multiple responses, you need to declare the +WebsocketBindingCallback in the service definition as follows: + + <interface.java interface="sample.ChatService" + callbackInterface="org.apache.tuscany.sca.binding.websocket.runtime.WebsocketBindingCallback" /> + <tuscany:binding.websocket /> + <callback> + <tuscany:binding.websocket /> + </callback> + +The callback object has methods that facilitate sending messages back to the +calling client. It can be injected in the service implementation using the @Callback +annotation. However, the service implementation for this sample has the COMPOSITE +scope so the callback reference has to be obtained from the ComponentContext. + +One requirement that service methods have to meet to enable multiple response +support is that they have to be annotated with @OneWay to enable non-blocking +support. Without it, methods are treated synchronously sending a single response +which is the object returned by the method call. + +The websocket binding also features a javascript API to simulate SCA in the +browser. In order to use it, the following script has to be included in the +client page: + <script type="text/javascript" + src="org.apache.tuscany.sca.WebsocketComponentContext.js"> + </script> + +This will inject proxies for all services defined in the composite that are +using binding.websocket. All invocation and connection management is handled +under the hood so in order to invoke a websocket service, the following should +be called: + Tuscany.WebsocketComponentContext.<component name>.<service name>.<operation name>(<parameters>); + +Given the asynchornous nature of websockets, a function should be defined in +order to handle responses received for a certain service operation. This should +be done as follows: + Tuscany.WebsocketComponentContext.<component name>.<service name>.<operation name>.responseHandler = function(response) { + // handle response + }; + +Note that the data exchange is automatically handled by the binding, so parameters +will be mapped to the data types defined in the method definition. Also, the response +will have the same data type as the server side object used to wrap the response. +Objects are passed over the wire in JSON format. + +Another detail worth mentioning is that the binding will use a single persistent +websocket connection to handle communication between a browser client and all services +defined using binding.websocket on the same port. Requests and responses will get +multiplexed via the same channel and get routed to the appropriate service +implementation, respectively javascript function. + +In order to run the sample, you can execute "mvn jetty:run" which will start a Jetty +instance automatically or use "mvn package" and deploy the resulting war to the +application server of your choice. + +Next, point your browser at + http://localhost:8080/sample-binding-websocket-chat-webapp/ + +You can now register or unregister for any of a number of events. When an event is fired +on the server side, the browser client will receive a notification which will be displayed +in the page. You can see the persistent websocket connection using the developer tools +provided by your browser. + +The websocket binding is an experimental binding so community feedback is much +appreciated. Feel free to send comments or suggestions on the Apache Tuscany +dev mailing list (dev@tuscany.apache.org).
\ No newline at end of file diff --git a/sca-java-2.x/branches/2.0/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 @@ +<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>org.apache.tuscany.sca.samples</groupId>
+ <artifactId>tuscany-samples-binding-websocket</artifactId>
+ <version>2.0</version>
+ <relativePath>../pom.xml</relativePath>
+ </parent>
+
+ <artifactId>sample-binding-websocket-pubsub-webapp</artifactId>
+ <packaging>war</packaging>
+ <version>2.0</version>
+ <name>Apache Tuscany SCA Sample binding.websocket PubSub Webapp</name>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.tuscany.sca</groupId>
+ <artifactId>tuscany-binding-websocket</artifactId>
+ <version>2.0</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.tuscany.sca</groupId>
+ <artifactId>tuscany-base-runtime-pom</artifactId>
+ <version>2.0</version>
+ <type>pom</type>
+ <scope>compile</scope>
+ </dependency>
+ <dependency>
+ <groupId>com.google.guava</groupId>
+ <artifactId>guava</artifactId>
+ <version>r09</version>
+ <type>jar</type>
+ <scope>compile</scope>
+ </dependency>
+ </dependencies>
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.mortbay.jetty</groupId>
+ <artifactId>maven-jetty-plugin</artifactId>
+ <version>6.1.26</version>
+ </plugin>
+ </plugins>
+ </build>
+
+</project>
+
diff --git a/sca-java-2.x/branches/2.0/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<String, WebsocketBindingCallback> clients = new ConcurrentHashMap<String, WebsocketBindingCallback>(); + private Multimap<String, String> eventListeners = Multimaps.synchronizedMultimap(HashMultimap.<String, String> create()); + + @Override + public void onEvent(String eventName, String eventData) { + List<String> destinations = new ArrayList<String>(); + synchronized (eventListeners) { + destinations.addAll(eventListeners.get(eventName)); + } + Event event = new Event(); + event.setName(eventName); + event.setData(eventData); + for (String registrationId : destinations) { + WebsocketBindingCallback client = clients.get(registrationId); + if (client == null) { + // client has unregistered from this event + synchronized (eventListeners) { + eventListeners.remove(eventName, registrationId); + } + } else { + WebsocketStatus status = client.sendMessage(event); + if (status == WebsocketStatus.CLOSED) { + unregister(registrationId); + } + } + } + } + + @Override + public void register(String eventName) { + String registrationId = UUID.randomUUID().toString(); + WebsocketBindingCallback callback = componentContext.getRequestContext().getCallback(); + clients.put(registrationId, callback); + synchronized (eventListeners) { + eventListeners.put(eventName, registrationId); + } + Event event = new Event(); + event.setId(registrationId); + event.setName(eventName); + event.setData(new Date().toString()); + callback.sendMessage(event); + } + + @Override + public void unregister(String registrationId) { + clients.remove(registrationId); + // unregistration from eventListeners done during onEvent + } + + @Destroy + public void shutdown() { + clients.clear(); + eventListeners.clear(); + clients = null; + eventListeners = null; + } +} diff --git a/sca-java-2.x/branches/2.0/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 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. +--> +<composite xmlns="http://docs.oasis-open.org/ns/opencsa/sca/200912" + xmlns:tuscany="http://tuscany.apache.org/xmlns/sca/1.1" + targetNamespace="http://samples" name="Event"> + + <component name="EventProcessorComponent"> + <implementation.java class="sample.EventProcessor" /> + <service name="EventProcessorConsumerService"> + <interface.java interface="sample.EventProcessorConsumerService" + callbackInterface="org.apache.tuscany.sca.binding.websocket.runtime.WebsocketBindingCallback" /> + <tuscany:binding.websocket /> + <callback> + <tuscany:binding.websocket /> + </callback> + </service> + <service name="EventProcessorProducerService"> + <interface.java interface="sample.EventProcessorProducerService" /> + </service> + </component> + + <component name="SLOWProducerComponent"> + <implementation.java class="sample.Producer" /> + <reference name="eventProcessor" target="EventProcessorComponent" /> + <property name="eventName">SLOW</property> + <property name="frequency">6000</property> + </component> + + <component name="MODERATEProducerComponent"> + <implementation.java class="sample.Producer" /> + <reference name="eventProcessor" target="EventProcessorComponent" /> + <property name="eventName">MODERATE</property> + <property name="frequency">3000</property> + </component> + + <component name="FASTProducerComponent"> + <implementation.java class="sample.Producer" /> + <reference name="eventProcessor" target="EventProcessorComponent" /> + <property name="eventName">FAST</property> + <property name="frequency">1000</property> + </component> + +</composite>
\ No newline at end of file diff --git a/sca-java-2.x/branches/2.0/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 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. +--> +<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:j2ee="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_3.0.xsd" version="3.0"> + <display-name>Apache Tuscany Stock Comet Sample</display-name> + <filter> + <filter-name>tuscany</filter-name> + <filter-class>org.apache.tuscany.sca.host.webapp.TuscanyServletFilter</filter-class> + <async-supported>true</async-supported> + </filter> + <filter-mapping> + <filter-name>tuscany</filter-name> + <url-pattern>/*</url-pattern> + </filter-mapping> + <welcome-file-list> + <welcome-file>index.html</welcome-file> + </welcome-file-list> +</web-app>
\ No newline at end of file diff --git a/sca-java-2.x/branches/2.0/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 @@ +<!-- + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. +--> +<html> +<head> + <title>Apache Tuscany Websocket Sample</title> + <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js" type="text/javascript"></script> + <script type="text/javascript" src="org.apache.tuscany.sca.WebsocketComponentContext.js"></script> + <script type="text/javascript"> + var registrationIds = {}; + + Tuscany.WebsocketComponentContext.EventProcessorComponent.EventProcessorConsumerService.register.responseHandler = function(event) { + var text = ''; + if (event.id != null) { + // registration notification + registrationIds[event.name] = event.id; + text = "Registered to " + event.name + " with id " + event.id + " at " + event.data; + } else { + // event notification + text = event.name + ": " + event.data; + } + var textarea = $('#textarea'); + $(textarea).val($(textarea).val() + text + "\n"); + $(textarea).scrollTop($(textarea)[0].scrollHeight); + } + + $(document).ready(function() + { + $('#registerEventButton').click(function(event) { + var eventName = $('#registerEventName').val(); + if (registrationIds[eventName] != null) { + alert("Already registered for " + eventName + " events"); + } else { + Tuscany.WebsocketComponentContext.EventProcessorComponent.EventProcessorConsumerService.register(eventName); + } + }); + + $('#unregisterEventButton').click(function(event) { + var eventName = $('#unregisterEventName').val(); + if (registrationIds[eventName] != null) { + Tuscany.WebsocketComponentContext.EventProcessorComponent.EventProcessorConsumerService.unregister(registrationIds[eventName]); + registrationIds[eventName] = null; + } else { + alert("Not registered for " + eventName + " events"); + } + }); + }); + </script> +</head> +<body> + <h2>Apache Tuscany Websocket Sample</h2> + <h3>PubSub for FAST, MODERATE and SLOW events</h3> + <p/> + <table> + <tr> + <td>Event name</td> + <td> + <select id="registerEventName"> + <option value="FAST">FAST</option> + <option value="MODERATE">MODERATE</option> + <option value="SLOW">SLOW</option> + </select> + </td> + <td><input type="button" id='registerEventButton' value='Register' /></td> + </tr> + <tr> + <td>Event name</td> + <td> + <select id="unregisterEventName"> + <option value="FAST">FAST</option> + <option value="MODERATE">MODERATE</option> + <option value="SLOW">SLOW</option> + </select> + </td> + <td><input type="button" id='unregisterEventButton' value='Unregister' /></td> + </tr> + </table> + <h3>Server notifications</h3> + <textarea id="textarea" rows="15" cols="80" readonly></textarea> +</body> +</html> diff --git a/sca-java-2.x/branches/2.0/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 <tuscany:binding.websocket port="8090"/> to a service definition, the +Tuscany runtime will start a websocket server listening for requests coming +in for the exposed service at the specified port. If no port is specified, the +runtime will use port 9000 as a default. + +The websocket binding uses embedded Jetty instances as websocket servers. At the +moment, Jetty 8.0.0-M3 is used which has support for the 00, 01, 06 and 07 +versions of the websocket protocol drafts. + +IN ORDER TO RUN THIS SAMPLE SUCCESSFULLY PLEASE CHECK IF YOUR BROWSER SUPPORTS +THE ABOVE WEBSOCKET PROTOCOL VERSIONS AND THAT THE WEBSOCKET SUPPORT IS ENABLED. + +In order to enable callbacks to push multiple responses, you need to declare the +WebsocketBindingCallback in the service definition as follows: + + <interface.java interface="sample.ChatService" + callbackInterface="org.apache.tuscany.sca.binding.websocket.runtime.WebsocketBindingCallback" /> + <tuscany:binding.websocket /> + <callback> + <tuscany:binding.websocket /> + </callback> + +The callback object has methods that facilitate sending messages back to the +calling client. It can be injected in the service implementation using the @Callback +annotation. + +One requirement that service methods have to meet to enable multiple response +support is that they have to be annotated with @OneWay to enable non-blocking +support. Without it, methods are treated synchronously sending a single response +which is the object returned by the method call. + +The websocket binding also features a javascript API to simulate SCA in the +browser. In order to use it, the following script has to be included in the +client page: + <script type="text/javascript" + src="org.apache.tuscany.sca.WebsocketComponentContext.js"> + </script> + +This will inject proxies for all services defined in the composite that are +using binding.websocket. All invocation and connection management is handled +under the hood so in order to invoke a websocket service, the following should +be called: + Tuscany.WebsocketComponentContext.<component name>.<service name>.<operation name>(<parameters>); + +Given the asynchornous nature of websockets, a function should be defined in +order to handle responses received for a certain service operation. This should +be done as follows: + Tuscany.WebsocketComponentContext.<component name>.<service name>.<operation name>.responseHandler = function(response) { + // handle response + }; + +Note that the data exchange is automatically handled by the binding, so parameters +will be mapped to the data types defined in the method definition. Also, the response +will have the same data type as the server side object used to wrap the response. +Objects are passed over the wire in JSON format. + +Another detail worth mentioning is that the binding will use a single persistent +websocket connection to handle communication between a browser client and all services +defined using binding.websocket on the same port. Requests and responses will get +multiplexed via the same channel and get routed to the appropriate service +implementation, respectively javascript function. + +In order to run the sample, you can execute "mvn jetty:run" which will start a Jetty +instance automatically or use "mvn package" and deploy the resulting war to the +application server of your choice. + +Next, point your browser at + http://localhost:8080/sample-binding-websocket-weather-webapp/ + +You can now set a location and register for various weather parameters. Notifications +will be pushed to the browser when weather parameters change. You can see the persistent +websocket connection handling all the communication using the developer tools provided +by your browser. + +The websocket binding is an experimental binding so community feedback is much +appreciated. Feel free to send comments or suggestions on the Apache Tuscany +dev mailing list (dev@tuscany.apache.org).
\ No newline at end of file diff --git a/sca-java-2.x/branches/2.0/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 @@ +<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>org.apache.tuscany.sca.samples</groupId>
+ <artifactId>tuscany-samples-binding-websocket</artifactId>
+ <version>2.0</version>
+ <relativePath>../pom.xml</relativePath>
+ </parent>
+
+ <artifactId>sample-binding-websocket-weather-webapp</artifactId>
+ <packaging>war</packaging>
+ <version>2.0</version>
+ <name>Apache Tuscany SCA Sample binding.websocket Weather Monitor Webapp</name>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.tuscany.sca</groupId>
+ <artifactId>tuscany-binding-websocket</artifactId>
+ <version>2.0</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.tuscany.sca</groupId>
+ <artifactId>tuscany-base-runtime-pom</artifactId>
+ <version>2.0</version>
+ <type>pom</type>
+ <scope>compile</scope>
+ </dependency>
+ </dependencies>
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.mortbay.jetty</groupId>
+ <artifactId>maven-jetty-plugin</artifactId>
+ <version>6.1.26</version>
+ </plugin>
+ </plugins>
+ </build>
+
+</project>
+
diff --git a/sca-java-2.x/branches/2.0/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 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. +--> +<composite xmlns="http://docs.oasis-open.org/ns/opencsa/sca/200912" + xmlns:tuscany="http://tuscany.apache.org/xmlns/sca/1.1" + targetNamespace="http://samples" + name="Weather"> + + <component name="c1"> + <implementation.java class="sample.TemperatureHumidityServiceImpl"/> + <service name="TemperatureService"> + <interface.java interface="sample.TemperatureService" + callbackInterface="org.apache.tuscany.sca.binding.websocket.runtime.WebsocketBindingCallback"/> + <tuscany:binding.websocket/> + <callback> + <tuscany:binding.websocket/> + </callback> + </service> + <service name="HumidityService"> + <interface.java interface="sample.HumidityService" + callbackInterface="org.apache.tuscany.sca.binding.websocket.runtime.WebsocketBindingCallback"/> + <tuscany:binding.websocket/> + <callback> + <tuscany:binding.websocket/> + </callback> + </service> + </component> + + <component name="c2"> + <implementation.java class="sample.PrecipitationServiceImpl"/> + <service name="PrecipitationService"> + <interface.java interface="sample.PrecipitationService" + callbackInterface="org.apache.tuscany.sca.binding.websocket.runtime.WebsocketBindingCallback"/> + <tuscany:binding.websocket/> + <callback> + <tuscany:binding.websocket/> + </callback> + </service> + </component> + +</composite> diff --git a/sca-java-2.x/branches/2.0/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 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. +--> +<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:j2ee="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_3.0.xsd" version="3.0"> + <display-name>Apache Tuscany Stock Comet Sample</display-name> + <filter> + <filter-name>tuscany</filter-name> + <filter-class>org.apache.tuscany.sca.host.webapp.TuscanyServletFilter</filter-class> + <async-supported>true</async-supported> + </filter> + <filter-mapping> + <filter-name>tuscany</filter-name> + <url-pattern>/*</url-pattern> + </filter-mapping> + <welcome-file-list> + <welcome-file>index.html</welcome-file> + </welcome-file-list> +</web-app>
\ No newline at end of file diff --git a/sca-java-2.x/branches/2.0/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 @@ +<!-- + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. +--> +<html> + <head> + <title>Apache Tuscany Websocket Sample</title> + <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js" type="text/javascript"></script> + <script type="text/javascript" src="org.apache.tuscany.sca.WebsocketComponentContext.js"></script> + <script type="text/javascript"> + $(document).ready(function(){ + var location = {}; + location.city = null; + location.country = null; + + $('#tempButton').attr('disabled', 'disabled'); + $('#humButton').attr('disabled', 'disabled'); + $('#precipButton').attr('disabled', 'disabled'); + + $('#locationButton').click(function(event) { + location.city = $('#city').val(); + location.country = $('#country').val(); + $('#locationButton').attr('disabled', 'disabled'); + $('#tempButton').removeAttr('disabled'); + $('#humButton').removeAttr('disabled'); + $('#precipButton').removeAttr('disabled'); + }); + + $('#tempButton').click(function(event) { + Tuscany.WebsocketComponentContext.c1.TemperatureService.getTemperature(location); + $('#tempButton').attr('disabled', 'disabled'); + }); + + Tuscany.WebsocketComponentContext.c1.TemperatureService.getTemperature.responseHandler = function(response) { + $('#tempText').text(response.data); + $('#tempDate').text(response.date); + } + + $('#humButton').click(function(event) { + Tuscany.WebsocketComponentContext.c1.HumidityService.getHumidity(location); + $('#humButton').attr('disabled', 'disabled'); + }); + + Tuscany.WebsocketComponentContext.c1.HumidityService.getHumidity.responseHandler = function(response) { + $('#humText').text(response.data); + $('#humDate').text(response.date); + } + + $('#precipButton').click(function(event) { + Tuscany.WebsocketComponentContext.c2.PrecipitationService.getPrecipitation(location); + $('#precipButton').attr('disabled', 'disabled'); + }); + + Tuscany.WebsocketComponentContext.c2.PrecipitationService.getPrecipitation.responseHandler = function(response) { + $('#precipText').text(response.data); + $('#precipDate').text(response.date); + } + }); + </script> + </head> + <body> + <div id='sidebar'> + <h2>Apache Tuscany Weather Sample</h2> + <h3>Weather Monitor</h3> + <p/> + <table> + <tr> + <td>City</td> + <td><input type="text" id='city' value='Brasov'/></td> + </tr> + <tr> + <td>Country</td> + <td><input type="text" id ='country' value='Romania'/></td> + </tr> + </table> + <input type="button" id='locationButton' value='Set location'/> + <p/> + <table> + <tr> + <th align="left">Temperature:</th> + <td><span id='tempText'>N/A</span></td> + <td><input type='button' id='tempButton' value="Update"/></td> + <td><span id='tempDate'></span> + </tr> + <tr> + <th align="left">Humidity:</th> + <td><span id='humText'>N/A</span></td> + <td><input type='button' id='humButton' value="Update"/></td> + <td><span id='humDate'></span> + </tr> + <tr> + <th align="left">Precipitation probability:</th> + <td><span id='precipText'>N/A</span></td> + <td><input type='button' id='precipButton' value="Update"/></td> + <td><span id='precipDate'></span> + </tr> + </table> + </div> + </body> +</html> diff --git a/sca-java-2.x/branches/2.0/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 @@ +<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<HTML>
+<HEAD>
+ <META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=windows-1252">
+ <TITLE></TITLE>
+ <META NAME="GENERATOR" CONTENT="OpenOffice.org 3.3 (Win32)">
+ <META NAME="AUTHOR" CONTENT="ant ">
+ <META NAME="CREATED" CONTENT="20110315;9485571">
+ <META NAME="CHANGED" CONTENT="20110906;11493347">
+ <STYLE TYPE="text/css">
+ <!--
+ @page { margin: 2cm }
+ P { margin-bottom: 0.21cm }
+ H1 { margin-bottom: 0.21cm }
+ H1.western { font-family: "Arial", sans-serif; font-size: 16pt }
+ H1.cjk { font-family: "SimSun"; font-size: 16pt }
+ H1.ctl { font-family: "Mangal"; font-size: 16pt }
+ PRE.cjk { font-family: "NSimSun", monospace }
+ A:link { so-language: zxx }
+ -->
+ </STYLE>
+</HEAD>
+<BODY LANG="en-GB" DIR="LTR">
+<H1 CLASS="western">Contribution OSGi</H1>
+<P STYLE="margin-bottom: 0cm"><BR>
+</P>
+<PRE CLASS="western"><FONT FACE="Times New Roman, serif"><FONT SIZE=3>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. </FONT></FONT>
+
+<FONT FACE="Times New Roman, serif"><FONT SIZE=3>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. </FONT></FONT>
+
+<FONT FACE="Courier New, monospace"><FONT SIZE=2>osgi> install file:///c:\path\to\Tuscany\installation\samples\learning-more\contribution-osgi\target\sample-contribution-osgi.jar</FONT></FONT>
+
+<FONT FACE="Times New Roman, serif"><FONT SIZE=3>This should give rise to a message indicating the bundle ID as follows:</FONT></FONT>
+
+<FONT FACE="Courier New, monospace"><FONT SIZE=2>Bundle id is 264</FONT></FONT>
+
+<FONT FACE="Times New Roman, serif"><FONT SIZE=3>The bundle can then be started using:</FONT></FONT>
+
+<FONT FACE="Courier New, monospace"><FONT SIZE=2>osgi> start 264</FONT></FONT></PRE>
+</BODY>
+</HTML>
\ 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 Binary files differnew file mode 100644 index 0000000000..934c402bdf --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/contribution-osgi/README.odt 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 @@ +<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
+ http://maven.apache.org/maven-v4_0_0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.apache.tuscany.sca.samples</groupId>
+ <artifactId>tuscany-samples</artifactId>
+ <version>2.0</version>
+ <relativePath />
+ </parent>
+ <artifactId>sample-contribution-osgi</artifactId>
+ <version>2.0</version>
+
+ <name>Apache Tuscany SCA Sample Calculator OSGi</name>
+
+ <properties>
+ <tuscany.version>${project.version}</tuscany.version>
+ </properties>
+
+ <!-- ASF repositories so sample can be built from SVN without building trunk-->
+ <repositories><repository>
+ <id>apache.snapshots</id>
+ <name>Apache Snapshot Repository</name>
+ <url>http://repository.apache.org/snapshots</url>
+ <releases><enabled>false</enabled></releases>
+ </repository></repositories>
+ <pluginRepositories><pluginRepository>
+ <id>apache.snapshots</id>
+ <name>Apache Snapshot Repository</name>
+ <url>http://repository.apache.org/snapshots</url>
+ <releases><enabled>false</enabled></releases>
+ </pluginRepository></pluginRepositories>
+
+ <dependencies>
+
+ <dependency>
+ <groupId>org.apache.tuscany.sca</groupId>
+ <artifactId>tuscany-base-runtime-pom</artifactId>
+ <type>pom</type>
+ <version>2.0</version>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.tuscany.sca</groupId>
+ <artifactId>tuscany-osgi-runtime-pom</artifactId>
+ <type>pom</type>
+ <version>2.0</version>
+ </dependency>
+
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <version>4.8.1</version>
+ <scope>test</scope>
+ </dependency>
+
+ </dependencies>
+
+ <build>
+ <finalName>${artifactId}</finalName>
+ <pluginManagement>
+ <plugins>
+ <plugin>
+ <artifactId>maven-jar-plugin</artifactId>
+ <configuration>
+ <archive>
+ <manifestFile>${basedir}/META-INF/MANIFEST.MF</manifestFile>
+ </archive>
+ </configuration>
+ </plugin>
+ </plugins>
+ </pluginManagement>
+ </build>
+</project>
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 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. +--> +<composite xmlns="http://docs.oasis-open.org/ns/opencsa/sca/200912" + targetNamespace="http://sample" + xmlns:sample="http://sample" + name="Calculator"> + + + <component name="CalculatorServiceComponent"> + <implementation.java class="calculator.CalculatorServiceImpl"/> + <reference name="addService" target="AddServiceComponent" /> + <reference name="subtractService" target="SubtractServiceComponent" /> + <reference name="multiplyService" target="MultiplyServiceComponent" /> + <reference name="divideService" target="DivideServiceComponent" /> + </component> + + <component name="AddServiceComponent"> + <implementation.java class="calculator.AddServiceImpl"/> + </component> + + <component name="SubtractServiceComponent"> + <implementation.java class="calculator.SubtractServiceImpl"/> + </component> + + <component name="MultiplyServiceComponent"> + <implementation.java class="calculator.MultiplyServiceImpl"/> + </component> + + <component name="DivideServiceComponent"> + <implementation.java class="calculator.DivideServiceImpl"/> + </component> + + + <component name="CalculatorClient"> + <implementation.java class="calculator.CalculatorClient"/> + <reference name="calculatorService" target="CalculatorServiceComponent" /> + </component> + +</composite> 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 @@ +<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<!-- A sample module-context.xml for OSGI RFC 124 (BluePrint Service) -->
+<components xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
+ <component id="CalculatorComponent" class="calculator.dosgi.impl.CalculatorServiceImpl">
+ <property name="addService" ref="AddService" />
+ <property name="subtractService" ref="SubtractService" />
+ <property name="multiplyService" ref="MultiplyService" />
+ <property name="divideService" ref="DivideService" />
+ </component>
+
+ <!-- We can derive the SCA services for the implementation.osgi -->
+ <service id="CalculatorService" ref="CalculatorComponent" interface="calculator.dosgi.CalculatorService">
+ </service>
+
+ <!-- We can derive the SCA references for the implementation.osgi -->
+ <reference id="AddService" interface="calculator.dosgi.operations.AddService">
+ </reference>
+ <reference id="SubtractService" interface="calculator.dosgi.operations.SubtractService">
+ </reference>
+ <reference id="MultiplyService" interface="calculator.dosgi.operations.MultiplyService">
+ </reference>
+ <reference id="DivideService" interface="calculator.dosgi.operations.DivideService">
+ </reference>
+
+</components>
\ 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 @@ +<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<scr:component name="CalculatorComponent"
+ xmlns:scr="http://www.osgi.org/xmlns/scr/v1.0.0">
+ <implementation class="calculator.dosgi.impl.CalculatorServiceDSImpl" />
+ <service>
+ <provide interface="calculator.dosgi.CalculatorService" />
+ </service>
+
+ <reference name="addService" interface="calculator.dosgi.operations.AddService" bind="setAddService" unbind="unsetAddService"
+ policy="dynamic" />
+ <reference name="subtractService" interface="calculator.dosgi.operations.SubtractService" bind="setSubtractService"
+ unbind="unsetSubtractService" policy="dynamic" />
+ <reference name="multiplyService" interface="calculator.dosgi.operations.MultiplyService" bind="setMultiplyService"
+ unbind="unsetMultiplyService" policy="dynamic" />
+ <reference name="divideService" interface="calculator.dosgi.operations.DivideService" bind="setDivideService"
+ unbind="unsetDivideService" policy="dynamic" />
+
+</scr:component>
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 @@ +<?xml version="1.0" encoding="UTF-8"?>
+<!--
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+-->
+<!-- A consumer-side service description file for RFC 119 -->
+<endpoint-descriptions xmlns="http://www.osgi.org/xmlns/rsa/v1.0.0"
+ xmlns:sca="http://docs.oasis-open.org/ns/opencsa/sca/200912"
+ xmlns:tuscany="http://tuscany.apache.org/xmlns/sca/1.1">
+ <!-- Describe a remote OSGi service -->
+ <endpoint-description>
+ <property name="objectClass" value="calculator.dosgi.operations.AddService" />
+ <property name="remote.configs.supported" value="org.osgi.sca"/>
+ <property name="service.imported.configs" value="org.osgi.sca"/>
+ <property name="sca.reference" value="addService"/>
+<!-- ##############################################################################################################-->
+<!-- Property org.osgi.sca.bindings can be removed when running with -Dorg.osgi.sca.domain.registry=tribes:default -->
+ <property name="org.osgi.sca.bindings">
+ <list>
+ <value>{http://sample}Add</value>
+ </list>
+ </property>
+<!-- ##############################################################################################################-->
+ </endpoint-description>
+ <endpoint-description>
+ <property name="objectClass" value="calculator.dosgi.operations.SubtractService" />
+ <property name="service.imported.configs" value="org.osgi.sca"/>
+ <property name="remote.configs.supported" value="org.osgi.sca"/>
+ <property name="sca.reference" value="subtractService"/>
+<!-- ##############################################################################################################-->
+<!-- Property org.osgi.sca.bindings can be removed when running with -Dorg.osgi.sca.domain.registry=tribes:default -->
+ <property name="org.osgi.sca.bindings">
+ <list>
+ <value>{http://sample}Subtract</value>
+ </list>
+ </property>
+<!-- ##############################################################################################################-->
+ </endpoint-description>
+ <endpoint-description>
+ <property name="objectClass" value="calculator.dosgi.operations.MultiplyService" />
+ <property name="service.imported.configs" value="org.osgi.sca"/>
+ <property name="remote.configs.supported" value="org.osgi.sca"/>
+ <property name="sca.reference" value="multiplyService"/>
+<!-- ##############################################################################################################-->
+<!-- Property org.osgi.sca.bindings can be removed when running with -Dorg.osgi.sca.domain.registry=tribes:default -->
+ <property name="org.osgi.sca.bindings" value="{http://sample}Multiply"/>
+<!-- ##############################################################################################################-->
+ </endpoint-description>
+ <endpoint-description>
+ <property name="objectClass" value="calculator.dosgi.operations.DivideService" />
+ <property name="service.imported.configs" value="org.osgi.sca"/>
+ <property name="remote.configs.supported" value="org.osgi.sca"/>
+ <property name="sca.reference" value="divideService"/>
+<!-- ##############################################################################################################-->
+<!-- Property org.osgi.sca.bindings can be removed when running with -Dorg.osgi.sca.domain.registry=tribes:default -->
+ <property name="org.osgi.sca.bindings" value="{http://sample}Divide"/>
+<!-- ##############################################################################################################-->
+ </endpoint-description>
+</endpoint-descriptions>
\ 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 @@ +<?xml version="1.0" encoding="UTF-8"?>
+<!--
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+-->
+<scact:sca-config targetNamespace="http://sample"
+ xmlns:scact="http://www.osgi.org/xmlns/scact/v1.0.0"
+ xmlns:sca="http://docs.oasis-open.org/ns/opencsa/sca/200912"
+ xmlns:tuscany="http://tuscany.apache.org/xmlns/sca/1.1">
+ <sca:binding.ws name="Calculator" uri="http://localhost:8086/CalculatorService"/>
+
+ <!-- bindings for the remote services -->
+ <tuscany:binding.rmi name="Add" uri="rmi://localhost:8085/AddService"/>
+ <tuscany:binding.rmi name="Divide" uri="rmi://localhost:8085/DivideService"/>
+ <tuscany:binding.rmi name="Subtract" uri="rmi://localhost:8085/SubtractService"/>
+ <tuscany:binding.rmi name="Multiply" uri="rmi://localhost:8085/MultiplyService"/>
+</scact:sca-config>
+
\ 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 Binary files differnew file mode 100644 index 0000000000..805baa54d2 --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/calculator-bundle/dosgi-calculator.png 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 @@ +<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<project>
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>org.apache.tuscany.sca.samples</groupId>
+ <artifactId>tuscany-samples</artifactId>
+ <version>2.0</version>
+ <relativePath>../../../pom.xml</relativePath>
+ </parent>
+
+ <artifactId>sample-calculator-bundle-dynamic</artifactId>
+ <name>Apache Tuscany SCA Sample OSGi Remote Services Dynamic Calculator</name>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.tuscany.sca</groupId>
+ <artifactId>tuscany-feature-ejava</artifactId>
+ <version>2.0</version>
+ <type>pom</type>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.tuscany.sca</groupId>
+ <artifactId>tuscany-feature-webservice</artifactId>
+ <version>2.0</version>
+ <type>pom</type>
+ <scope>runtime</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.tuscany.sca</groupId>
+ <artifactId>tuscany-node-launcher-equinox</artifactId>
+ <version>2.0</version>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.tuscany.sca</groupId>
+ <artifactId>tuscany-node-impl-osgi</artifactId>
+ <version>2.0</version>
+ <scope>runtime</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.eclipse.osgi</groupId>
+ <artifactId>services</artifactId>
+ <version>3.2.0-v20090520-1800</version>
+ </dependency>
+
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <version>4.8.1</version>
+ <scope>test</scope>
+ </dependency>
+
+ <!-- Equinox Declarative Services -->
+ <dependency>
+ <groupId>org.eclipse.equinox</groupId>
+ <artifactId>ds</artifactId>
+ <version>1.1.0-v20090601</version>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.eclipse.equinox</groupId>
+ <artifactId>util</artifactId>
+ <version>1.0.100-v20090520-1800</version>
+ <scope>test</scope>
+ </dependency>
+
+ </dependencies>
+
+ <build>
+ <finalName>${project.artifactId}</finalName>
+ <plugins>
+ <plugin>
+ <artifactId>maven-eclipse-plugin</artifactId>
+ <version>2.5.1</version>
+ <configuration>
+ <buildcommands>
+ <buildcommand>org.eclipse.pde.ManifestBuilder</buildcommand>
+ <buildcommand>org.eclipse.jdt.core.javabuilder</buildcommand>
+ </buildcommands>
+ <projectnatures>
+ <projectnature>org.eclipse.jdt.core.javanature</projectnature>
+ <projectnature>org.eclipse.pde.PluginNature</projectnature>
+ </projectnatures>
+ <classpathContainers>
+ <classpathContainer>org.eclipse.jdt.launching.JRE_CONTAINER
+ </classpathContainer>
+ </classpathContainers>
+ </configuration>
+ </plugin>
+
+ <plugin>
+ <artifactId>maven-jar-plugin</artifactId>
+ <configuration>
+ <archive>
+ <manifestFile>${basedir}/META-INF/MANIFEST.MF</manifestFile>
+ </archive>
+ </configuration>
+ </plugin>
+
+ <plugin>
+ <groupId>org.apache.tuscany.maven.plugins</groupId>
+ <artifactId>maven-osgi-junit-plugin</artifactId>
+ <version>1.0</version>
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.tuscany.sca</groupId>
+ <artifactId>tuscany-node-launcher-equinox</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ </dependencies>
+ <executions>
+ <execution>
+ <id>osgi-test</id>
+ <phase>test</phase>
+ <goals>
+ <goal>test</goal>
+ </goals>
+ <configuration>
+ <systemProperties>
+ <property>
+ <name>osgi.configuration.area</name>
+ <value>${project.build.directory}/equinox</value>
+ </property>
+ </systemProperties>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+
+</project>
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<String, Object> props = new Hashtable<String, Object>();
+ 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> T getService(Class<T> 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<Class<?>, ServiceTracker> remoteServices = new HashMap<Class<?>, 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> T getService(Class<T> 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("<wsdl:definitions") != -1);
+ }
+
+ /**
+ * @throws java.lang.Exception
+ */
+ @AfterClass
+ public static void tearDownAfterClass() throws Exception {
+ if (host != null) {
+ host.stop();
+ rmiServer.stop();
+ host = null;
+ rmiServer = null;
+ context = null;
+ }
+ }
+
+}
diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/calculator-bundle/src/test/java/calculator/dosgi/test/OSGiTestUtils.java b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/calculator-bundle/src/test/java/calculator/dosgi/test/OSGiTestUtils.java new file mode 100644 index 0000000000..43c4d0bf4b --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-dynamic/calculator-bundle/src/test/java/calculator/dosgi/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.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 <T>
+ * @param obj
+ * @param cls
+ * @return
+ */
+ public static <T> T cast(Object obj, Class<T> 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 @@ +<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<scr:component name="AddComponent" xmlns:scr="http://www.osgi.org/xmlns/scr/v1.0.0">
+ <implementation class="calculator.dosgi.operations.impl.AddServiceImpl" />
+ <service>
+ <provide interface="calculator.dosgi.operations.AddService" />
+ </service>
+</scr:component>
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 @@ +<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<!-- A sample module-context.xml for OSGI RFC 124 (BluePrint Service) -->
+<components xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
+ <component id="AddComponent" class="calculator.dosgi.operations.impl.AddServiceImpl">
+ </component>
+ <component id="SubtractComponent" class="calculator.dosgi.operations.impl.SubtractServiceImpl">
+ </component>
+ <component id="MultiplyComponent" class="calculator.dosgi.operations.impl.MultiplyServiceImpl">
+ </component>
+ <component id="DivideComponent" class="calculator.dosgi.operations.impl.DivideServiceImpl">
+ </component>
+
+ <!-- We can derive the SCA services for the implementation.osgi -->
+ <service id="AddService" ref="AddComponent" interface="calculator.dosgi.operations.AddService">
+ </service>
+ <service id="SubtractService" ref="SubtractComponent" interface="calculator.dosgi.operations.SubtractService">
+ </service>
+ <service id="MultiplyService" ref="MultiplyComponent" interface="calculator.dosgi.operations.MultiplyService">
+ </service>
+ <service id="DivideService" ref="DivideComponent" interface="calculator.dosgi.operations.DivideService">
+ </service>
+</components>
\ 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 @@ +<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<scr:component name="DivideComponent" xmlns:scr="http://www.osgi.org/xmlns/scr/v1.0.0">
+ <implementation class="calculator.dosgi.operations.impl.DivideServiceImpl" />
+ <service>
+ <provide interface="calculator.dosgi.operations.DivideService" />
+ </service>
+</scr:component>
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 @@ +<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<scr:component name="MultiplyComponent" xmlns:scr="http://www.osgi.org/xmlns/scr/v1.0.0">
+ <implementation class="calculator.dosgi.operations.impl.MultiplyServiceImpl" />
+ <service>
+ <provide interface="calculator.dosgi.operations.MultiplyService" />
+ </service>
+</scr:component>
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 @@ +<?xml version="1.0" encoding="UTF-8"?>
+<!--
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+-->
+<scact:sca-config targetNamespace="http://sample"
+ xmlns:scact="http://www.osgi.org/xmlns/scact/v1.0.0"
+ xmlns:sca="http://docs.oasis-open.org/ns/opencsa/sca/200912"
+ xmlns:tuscany="http://tuscany.apache.org/xmlns/sca/1.1">
+ <tuscany:binding.rmi name="Add" uri="rmi://localhost:8085/AddService"/>
+ <tuscany:binding.rmi name="Divide" uri="rmi://localhost:8085/DivideService"/>
+ <tuscany:binding.rmi name="Subtract" uri="rmi://localhost:8085/SubtractService"/>
+ <tuscany:binding.rmi name="Multiply" uri="rmi://localhost:8085/MultiplyService"/>
+</scact:sca-config>
+
\ 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 @@ +<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<scr:component name="SubtractComponent" xmlns:scr="http://www.osgi.org/xmlns/scr/v1.0.0">
+ <implementation class="calculator.dosgi.operations.impl.SubtractServiceImpl" />
+ <service>
+ <provide interface="calculator.dosgi.operations.SubtractService" />
+ </service>
+</scr:component>
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 @@ +<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<project>
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>org.apache.tuscany.sca.samples</groupId>
+ <artifactId>tuscany-samples</artifactId>
+ <version>2.0</version>
+ <relativePath>../../../pom.xml</relativePath>
+ </parent>
+
+ <artifactId>sample-operations-bundle-dynamic</artifactId>
+ <name>Apache Tuscany SCA Sample OSGi Remote Services Dynamic Operations</name>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.tuscany.sca</groupId>
+ <artifactId>tuscany-base-runtime-pom</artifactId>
+ <version>2.0</version>
+ <type>pom</type>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.tuscany.sca</groupId>
+ <artifactId>tuscany-osgi-runtime-pom</artifactId>
+ <version>2.0</version>
+ <type>pom</type>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.tuscany.sca</groupId>
+ <artifactId>tuscany-binding-rmi-runtime</artifactId>
+ <version>2.0</version>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.tuscany.sca</groupId>
+ <artifactId>tuscany-node-launcher-equinox</artifactId>
+ <version>2.0</version>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.tuscany.sca</groupId>
+ <artifactId>tuscany-node-impl-osgi</artifactId>
+ <version>2.0</version>
+ <scope>runtime</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.eclipse.osgi</groupId>
+ <artifactId>services</artifactId>
+ <version>3.2.0-v20090520-1800</version>
+ <scope>test</scope>
+ </dependency>
+
+ <!-- Equinox Declarative Services -->
+ <dependency>
+ <groupId>org.eclipse.equinox</groupId>
+ <artifactId>ds</artifactId>
+ <version>1.1.0-v20090601</version>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.eclipse.equinox</groupId>
+ <artifactId>util</artifactId>
+ <version>1.0.100-v20090520-1800</version>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <version>4.8.1</version>
+ <scope>test</scope>
+ </dependency>
+
+ </dependencies>
+
+ <build>
+ <finalName>${project.artifactId}</finalName>
+ <plugins>
+ <plugin>
+ <artifactId>maven-eclipse-plugin</artifactId>
+ <version>2.5.1</version>
+ <configuration>
+ <buildcommands>
+ <buildcommand>org.eclipse.pde.ManifestBuilder</buildcommand>
+ <buildcommand>org.eclipse.jdt.core.javabuilder</buildcommand>
+ </buildcommands>
+ <projectnatures>
+ <projectnature>org.eclipse.jdt.core.javanature</projectnature>
+ <projectnature>org.eclipse.pde.PluginNature</projectnature>
+ </projectnatures>
+ <classpathContainers>
+ <classpathContainer>org.eclipse.jdt.launching.JRE_CONTAINER
+ </classpathContainer>
+ </classpathContainers>
+ </configuration>
+ </plugin>
+
+ <plugin>
+ <artifactId>maven-jar-plugin</artifactId>
+ <configuration>
+ <archive>
+ <manifestFile>${basedir}/META-INF/MANIFEST.MF</manifestFile>
+ </archive>
+ </configuration>
+ </plugin>
+
+ <plugin>
+ <groupId>org.apache.tuscany.maven.plugins</groupId>
+ <artifactId>maven-osgi-junit-plugin</artifactId>
+ <version>1.0</version>
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.tuscany.sca</groupId>
+ <artifactId>tuscany-node-launcher-equinox</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ </dependencies>
+ <executions>
+ <execution>
+ <id>osgi-test</id>
+ <phase>test</phase>
+ <goals>
+ <goal>test</goal>
+ </goals>
+ <configuration>
+ <systemProperties>
+ <property>
+ <name>osgi.configuration.area</name>
+ <value>${project.build.directory}/equinox</value>
+ </property>
+ </systemProperties>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+
+</project>
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<String, Object> props = new Hashtable<String, Object>();
+ 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 <T>
+ * @param obj
+ * @param cls
+ * @return
+ */
+ public static <T> T cast(Object obj, Class<T> 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 @@ +<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<project>
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>org.apache.tuscany.sca.samples</groupId>
+ <artifactId>tuscany-samples-learning-more</artifactId>
+ <version>2.0</version>
+ <relativePath>../pom.xml</relativePath>
+ </parent>
+ <artifactId>tuscany-samples-distributed-osgi-dynamic</artifactId>
+ <packaging>pom</packaging>
+ <name>Apache Tuscany SCA Distributed OSGI Dynamically Configured Samples</name>
+
+ <profiles>
+ <profile>
+ <id>default</id>
+ <activation>
+ <activeByDefault>true</activeByDefault>
+ </activation>
+ <modules>
+ <module>calculator-bundle</module>
+ <module>operations-bundle</module>
+ </modules>
+ </profile>
+ </profiles>
+</project>
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 Binary files differnew file mode 100644 index 0000000000..22b73cfc79 --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/README.odt 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 @@ +<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<!-- A sample module-context.xml for OSGI RFC 124 (BluePrint Service) -->
+<components xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
+ <component id="CalculatorComponent" class="calculator.dosgi.impl.CalculatorServiceImpl">
+ <property name="addService" ref="AddService" />
+ <property name="subtractService" ref="SubtractService" />
+ <property name="multiplyService" ref="MultiplyService" />
+ <property name="divideService" ref="DivideService" />
+ </component>
+
+ <!-- We can derive the SCA services for the implementation.osgi -->
+ <service id="CalculatorService" ref="CalculatorComponent" interface="calculator.dosgi.CalculatorService">
+ </service>
+
+ <!-- We can derive the SCA references for the implementation.osgi -->
+ <reference id="AddService" interface="calculator.dosgi.operations.AddService">
+ </reference>
+ <reference id="SubtractService" interface="calculator.dosgi.operations.SubtractService">
+ </reference>
+ <reference id="MultiplyService" interface="calculator.dosgi.operations.MultiplyService">
+ </reference>
+ <reference id="DivideService" interface="calculator.dosgi.operations.DivideService">
+ </reference>
+
+</components>
\ 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 @@ +<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<scr:component name="CalculatorComponent"
+ xmlns:scr="http://www.osgi.org/xmlns/scr/v1.0.0">
+ <implementation class="calculator.dosgi.impl.CalculatorServiceDSImpl" />
+ <service>
+ <provide interface="calculator.dosgi.CalculatorService" />
+ </service>
+
+ <reference name="addService" interface="calculator.dosgi.operations.AddService" bind="setAddService" unbind="unsetAddService"
+ policy="dynamic" />
+ <reference name="subtractService" interface="calculator.dosgi.operations.SubtractService" bind="setSubtractService"
+ unbind="unsetSubtractService" policy="dynamic" />
+ <reference name="multiplyService" interface="calculator.dosgi.operations.MultiplyService" bind="setMultiplyService"
+ unbind="unsetMultiplyService" policy="dynamic" />
+ <reference name="divideService" interface="calculator.dosgi.operations.DivideService" bind="setDivideService"
+ unbind="unsetDivideService" policy="dynamic" />
+
+</scr:component>
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 @@ +<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<componentType xmlns="http://docs.oasis-open.org/ns/opencsa/sca/200912"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ xmlns:t="http://tuscany.apache.org/xmlns/sca/1.1">
+ <!-- The service elment defines an SCA view of the OSGi service -->
+ <service name="CalculatorService">
+ <!-- The interface will be mapped into the OSGi service class -->
+ <interface.java interface="calculator.dosgi.CalculatorService"/>
+ <!-- The list of OSGi properties -->
+ <extensions>
+ <t:osgi.property name="prop1">1</t:osgi.property>
+ <t:osgi.property name="prop2">ABC</t:osgi.property>
+ </extensions>
+ </service>
+
+ <!-- The reference elment defines an SCA proxy to a remote OSGi service -->
+ <reference name="addService">
+ <interface.java interface="calculator.dosgi.operations.AddService"/>
+ <extensions>
+ <t:osgi.property name="prop1">1</t:osgi.property>
+ <t:osgi.property name="prop2">ABC</t:osgi.property>
+ </extensions>
+ </reference>
+ <reference name="subtractService">
+ <interface.java interface="calculator.dosgi.operations.SubtractService"/>
+ <extensions>
+ <t:osgi.property name="prop1">1</t:osgi.property>
+ <t:osgi.property name="prop2">ABC</t:osgi.property>
+ </extensions>
+ </reference>
+ <reference name="multiplyService">
+ <interface.java interface="calculator.dosgi.operations.MultiplyService"/>
+ <extensions>
+ <t:osgi.property name="prop1">1</t:osgi.property>
+ <t:osgi.property name="prop2">ABC</t:osgi.property>
+ </extensions>
+ </reference>
+ <reference name="divideService">
+ <interface.java interface="calculator.dosgi.operations.DivideService"/>
+ <extensions>
+ <t:osgi.property name="prop1">1</t:osgi.property>
+ <t:osgi.property name="prop2">ABC</t:osgi.property>
+ </extensions>
+ </reference>
+
+</componentType>
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 @@ +<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<composite xmlns="http://docs.oasis-open.org/ns/opencsa/sca/200912"
+ xmlns:tuscany="http://tuscany.apache.org/xmlns/sca/1.1"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ targetNamespace="http://calculator.dosgi"
+ name="CalculatorComposite">
+
+ <component name="CalculatorComponent">
+ <tuscany:implementation.osgi bundleSymbolicName="calculator.dosgi" bundleVersion="1.0.0" />
+ <service name="CalculatorService">
+ <binding.ws uri="http://localhost:8086/CalculatorService"/>
+ </service>
+ <reference name="addService">
+ <tuscany:binding.rmi uri="rmi://localhost:8085/AddService"/>
+ </reference>
+ <reference name="subtractService">
+ <tuscany:binding.rmi uri="rmi://localhost:8085/SubtractService"/>
+ </reference>
+ <reference name="multiplyService">
+ <tuscany:binding.rmi uri="rmi://localhost:8085/MultiplyService"/>
+ </reference>
+ <reference name="divideService">
+ <tuscany:binding.rmi uri="rmi://localhost:8085/DivideService"/>
+ </reference>
+ </component>
+
+</composite>
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 @@ +<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<project>
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>org.apache.tuscany.sca.samples</groupId>
+ <artifactId>tuscany-samples</artifactId>
+ <version>2.0</version>
+ <relativePath>../../../pom.xml</relativePath>
+ </parent>
+
+ <artifactId>sample-calculator-bundle</artifactId>
+ <name>Apache Tuscany SCA Sample OSGi Remote Services Calculator</name>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.tuscany.sca</groupId>
+ <artifactId>tuscany-feature-ejava</artifactId>
+ <version>2.0</version>
+ <type>pom</type>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.tuscany.sca</groupId>
+ <artifactId>tuscany-feature-webservice</artifactId>
+ <version>2.0</version>
+ <type>pom</type>
+ <scope>runtime</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.tuscany.sca</groupId>
+ <artifactId>tuscany-node-launcher-equinox</artifactId>
+ <version>2.0</version>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.tuscany.sca</groupId>
+ <artifactId>tuscany-node-impl-osgi</artifactId>
+ <version>2.0</version>
+ <scope>runtime</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.eclipse.osgi</groupId>
+ <artifactId>services</artifactId>
+ <version>3.2.0-v20090520-1800</version>
+ </dependency>
+
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <version>4.8.1</version>
+ <scope>test</scope>
+ </dependency>
+
+ <!-- Equinox Declarative Services -->
+ <dependency>
+ <groupId>org.eclipse.equinox</groupId>
+ <artifactId>ds</artifactId>
+ <version>1.1.0-v20090601</version>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.eclipse.equinox</groupId>
+ <artifactId>util</artifactId>
+ <version>1.0.100-v20090520-1800</version>
+ <scope>test</scope>
+ </dependency>
+
+ </dependencies>
+
+ <build>
+ <finalName>${project.artifactId}</finalName>
+ <plugins>
+ <plugin>
+ <artifactId>maven-eclipse-plugin</artifactId>
+ <version>2.5.1</version>
+ <configuration>
+ <buildcommands>
+ <buildcommand>org.eclipse.pde.ManifestBuilder</buildcommand>
+ <buildcommand>org.eclipse.jdt.core.javabuilder</buildcommand>
+ </buildcommands>
+ <projectnatures>
+ <projectnature>org.eclipse.jdt.core.javanature</projectnature>
+ <projectnature>org.eclipse.pde.PluginNature</projectnature>
+ </projectnatures>
+ <classpathContainers>
+ <classpathContainer>org.eclipse.jdt.launching.JRE_CONTAINER
+ </classpathContainer>
+ </classpathContainers>
+ </configuration>
+ </plugin>
+
+ <plugin>
+ <artifactId>maven-jar-plugin</artifactId>
+ <configuration>
+ <archive>
+ <manifestFile>${basedir}/META-INF/MANIFEST.MF</manifestFile>
+ </archive>
+ </configuration>
+ </plugin>
+
+ <plugin>
+ <groupId>org.apache.tuscany.maven.plugins</groupId>
+ <artifactId>maven-osgi-junit-plugin</artifactId>
+ <version>1.0</version>
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.tuscany.sca</groupId>
+ <artifactId>tuscany-node-launcher-equinox</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ </dependencies>
+ <executions>
+ <execution>
+ <id>osgi-test</id>
+ <phase>test</phase>
+ <goals>
+ <goal>test</goal>
+ </goals>
+ <configuration>
+ <systemProperties>
+ <property>
+ <name>osgi.configuration.area</name>
+ <value>${project.build.directory}/equinox</value>
+ </property>
+ </systemProperties>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+
+</project>
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<String, Object> props = new Hashtable<String, Object>();
+ 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> T getService(Class<T> 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> T getService(Class<T> 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 @@ +<?xml version="1.0" encoding="UTF-8"?>
+<!--
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+-->
+
+<contribution xmlns="http://docs.oasis-open.org/ns/opencsa/sca/200912"
+ xmlns:c="http://calculator.dosgi">
+ <deployable composite="c:CalculatorComposite" />
+</contribution>
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("<wsdl:definitions") != -1);
+ }
+
+ /**
+ * @throws java.lang.Exception
+ */
+ @AfterClass
+ public static void tearDownAfterClass() throws Exception {
+ if (host != null) {
+ host.stop();
+ rmiServer.stop();
+ host = null;
+ rmiServer = null;
+ context = null;
+ }
+ }
+
+}
diff --git a/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/calculator-bundle/src/test/java/calculator/dosgi/test/OSGiTestUtils.java b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/calculator-bundle/src/test/java/calculator/dosgi/test/OSGiTestUtils.java new file mode 100644 index 0000000000..43c4d0bf4b --- /dev/null +++ b/sca-java-2.x/branches/2.0/samples/learning-more/distributed-osgi-static/calculator-bundle/src/test/java/calculator/dosgi/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.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 <T>
+ * @param obj
+ * @param cls
+ * @return
+ */
+ public static <T> T cast(Object obj, Class<T> 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 @@ +<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<scr:component name="AddComponent" xmlns:scr="http://www.osgi.org/xmlns/scr/v1.0.0">
+ <implementation class="calculator.dosgi.operations.impl.AddServiceImpl" />
+ <service>
+ <provide interface="calculator.dosgi.operations.AddService" />
+ </service>
+</scr:component>
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 @@ +<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<!-- A sample module-context.xml for OSGI RFC 124 (BluePrint Service) -->
+<components xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
+ <component id="AddComponent" class="calculator.dosgi.operations.impl.AddServiceImpl">
+ </component>
+ <component id="SubtractComponent" class="calculator.dosgi.operations.impl.SubtractServiceImpl">
+ </component>
+ <component id="MultiplyComponent" class="calculator.dosgi.operations.impl.MultiplyServiceImpl">
+ </component>
+ <component id="DivideComponent" class="calculator.dosgi.operations.impl.DivideServiceImpl">
+ </component>
+
+ <!-- We can derive the SCA services for the implementation.osgi -->
+ <service id="AddService" ref="AddComponent" interface="calculator.dosgi.operations.AddService">
+ </service>
+ <service id="SubtractService" ref="SubtractComponent" interface="calculator.dosgi.operations.SubtractService">
+ </service>
+ <service id="MultiplyService" ref="MultiplyComponent" interface="calculator.dosgi.operations.MultiplyService">
+ </service>
+ <service id="DivideService" ref="DivideComponent" interface="calculator.dosgi.operations.DivideService">
+ </service>
+</components>
\ 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 @@ +<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<scr:component name="DivideComponent" xmlns:scr="http://www.osgi.org/xmlns/scr/v1.0.0">
+ <implementation class="calculator.dosgi.operations.impl.DivideServiceImpl" />
+ <service>
+ <provide interface="calculator.dosgi.operations.DivideService" />
+ </service>
+</scr:component>
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 @@ +<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<scr:component name="MultiplyComponent" xmlns:scr="http://www.osgi.org/xmlns/scr/v1.0.0">
+ <implementation class="calculator.dosgi.operations.impl.MultiplyServiceImpl" />
+ <service>
+ <provide interface="calculator.dosgi.operations.MultiplyService" />
+ </service>
+</scr:component>
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 @@ +<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<componentType xmlns="http://docs.oasis-open.org/ns/opencsa/sca/200912"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ xmlns:t="http://tuscany.apache.org/xmlns/sca/1.1">
+
+
+ <!-- The service elment defines an SCA proxy to a remote OSGi service -->
+ <service name="AddService">
+ <interface.java interface="calculator.dosgi.operations.AddService"/>
+ <extensions>
+ <t:osgi.property name="prop1">1</t:osgi.property>
+ <t:osgi.property name="prop2">ABC</t:osgi.property>
+ </extensions>
+ </service>
+ <service name="SubtractService">
+ <interface.java interface="calculator.dosgi.operations.SubtractService"/>
+ <extensions>
+ <t:osgi.property name="prop1">1</t:osgi.property>
+ <t:osgi.property name="prop2">ABC</t:osgi.property>
+ </extensions>
+ </service>
+ <service name="MultiplyService">
+ <interface.java interface="calculator.dosgi.operations.MultiplyService"/>
+ <extensions>
+ <t:osgi.property name="prop1">1</t:osgi.property>
+ <t:osgi.property name="prop2">ABC</t:osgi.property>
+ </extensions>
+ </service>
+ <service name="DivideService">
+ <interface.java interface="calculator.dosgi.operations.DivideService"/>
+ <extensions>
+ <t:osgi.property name="prop1">1</t:osgi.property>
+ <t:osgi.property name="prop2">ABC</t:osgi.property>
+ </extensions>
+ </service>
+</componentType>
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 @@ +<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<composite xmlns="http://docs.oasis-open.org/ns/opencsa/sca/200912"
+ xmlns:tuscany="http://tuscany.apache.org/xmlns/sca/1.1"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ targetNamespace="http://calculator.dosgi"
+ name="OperationsComposite">
+
+ <component name="OperationsComponent">
+ <tuscany:implementation.osgi bundleSymbolicName="calculator.dosgi.operations" bundleVersion="1.0.0" />
+ <service name="AddService">
+ <tuscany:binding.rmi uri="rmi://localhost:8085/AddService"/>
+ </service>
+ <service name="SubtractService">
+ <tuscany:binding.rmi uri="rmi://localhost:8085/SubtractService"/>
+ </service>
+ <service name="MultiplyService">
+ <tuscany:binding.rmi uri="rmi://localhost:8085/MultiplyService"/>
+ </service>
+ <service name="DivideService">
+ <tuscany:binding.rmi uri="rmi://localhost:8085/DivideService"/>
+ </service>
+
+ </component>
+
+</composite>
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 @@ +<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<scr:component name="SubtractComponent" xmlns:scr="http://www.osgi.org/xmlns/scr/v1.0.0">
+ <implementation class="calculator.dosgi.operations.impl.SubtractServiceImpl" />
+ <service>
+ <provide interface="calculator.dosgi.operations.SubtractService" />
+ </service>
+</scr:component>
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 @@ +<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<project>
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>org.apache.tuscany.sca.samples</groupId>
+ <artifactId>tuscany-samples</artifactId>
+ <version>2.0</version>
+ <relativePath>../../../pom.xml</relativePath>
+ </parent>
+
+ <artifactId>sample-operations-bundle</artifactId>
+ <name>Apache Tuscany SCA Sample OSGi Remote Services Calculator Operations</name>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.tuscany.sca</groupId>
+ <artifactId>tuscany-base-runtime-pom</artifactId>
+ <version>2.0</version>
+ <type>pom</type>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.tuscany.sca</groupId>
+ <artifactId>tuscany-osgi-runtime-pom</artifactId>
+ <version>2.0</version>
+ <type>pom</type>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.tuscany.sca</groupId>
+ <artifactId>tuscany-binding-rmi-runtime</artifactId>
+ <version>2.0</version>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.tuscany.sca</groupId>
+ <artifactId>tuscany-node-launcher-equinox</artifactId>
+ <version>2.0</version>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.tuscany.sca</groupId>
+ <artifactId>tuscany-node-impl-osgi</artifactId>
+ <version>2.0</version>
+ <scope>runtime</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.eclipse.osgi</groupId>
+ <artifactId>services</artifactId>
+ <version>3.2.0-v20090520-1800</version>
+ <scope>test</scope>
+ </dependency>
+
+ <!-- Equinox Declarative Services -->
+ <dependency>
+ <groupId>org.eclipse.equinox</groupId>
+ <artifactId>ds</artifactId>
+ <version>1.1.0-v20090601</version>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.eclipse.equinox</groupId>
+ <artifactId>util</artifactId>
+ <version>1.0.100-v20090520-1800</version>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <version>4.8.1</version>
+ <scope>test</scope>
+ </dependency>
+
+ </dependencies>
+
+ <build>
+ <finalName>${project.artifactId}</finalName>
+ <plugins>
+ <plugin>
+ <artifactId>maven-eclipse-plugin</artifactId>
+ <version>2.5.1</version>
+ <configuration>
+ <buildcommands>
+ <buildcommand>org.eclipse.pde.ManifestBuilder</buildcommand>
+ <buildcommand>org.eclipse.jdt.core.javabuilder</buildcommand>
+ </buildcommands>
+ <projectnatures>
+ <projectnature>org.eclipse.jdt.core.javanature</projectnature>
+ <projectnature>org.eclipse.pde.PluginNature</projectnature>
+ </projectnatures>
+ <classpathContainers>
+ <classpathContainer>org.eclipse.jdt.launching.JRE_CONTAINER
+ </classpathContainer>
+ </classpathContainers>
+ </configuration>
+ </plugin>
+
+ <plugin>
+ <artifactId>maven-jar-plugin</artifactId>
+ <configuration>
+ <archive>
+ <manifestFile>${basedir}/META-INF/MANIFEST.MF</manifestFile>
+ </archive>
+ </configuration>
+ </plugin>
+
+<!-- Don't think we need this as the JUnit test starts equinox
+ <plugin>
+ <groupId>org.apache.tuscany.maven.plugins</groupId>
+ <artifactId>maven-osgi-junit-plugin</artifactId>
+ <version>1.0</version>
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.tuscany.sca</groupId>
+ <artifactId>tuscany-node-launcher-equinox</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ </dependencies>
+ <executions>
+ <execution>
+ <id>osgi-test</id>
+ <phase>test</phase>
+ <goals>
+ <goal>test</goal>
+ </goals>
+ <configuration>
+ <systemProperties>
+ <property>
+ <name>osgi.configuration.area</name>
+ <value>${project.build.directory}/equinox</value>
+ </property>
+ </systemProperties>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+-->
+ </plugins>
+ </build>
+
+</project>
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<String, Object> props = new Hashtable<String, Object>();
+
+ 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 @@ +<?xml version="1.0" encoding="UTF-8"?>
+<!--
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+-->
+<contribution xmlns="http://docs.oasis-open.org/ns/opencsa/sca/200912"
+ xmlns:c="http://calculator.dosgi">
+ <deployable composite="c:OperationsComposite" />
+</contribution>
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 <T>
+ * @param obj
+ * @param cls
+ * @return
+ */
+ public static <T> T cast(Object obj, Class<T> 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 @@ +<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<project>
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>org.apache.tuscany.sca.samples</groupId>
+ <artifactId>tuscany-samples-learning-more</artifactId>
+ <version>2.0</version>
+ <relativePath>../pom.xml</relativePath>
+ </parent>
+ <artifactId>tuscany-samples-distributed-osgi-static</artifactId>
+ <packaging>pom</packaging>
+ <name>Apache Tuscany SCA Distributed OSGI Statically Configured Samples</name>
+
+ <profiles>
+ <profile>
+ <id>default</id>
+ <activation>
+ <activeByDefault>true</activeByDefault>
+ </activation>
+ <modules>
+ <module>calculator-bundle</module>
+ <module>operations-bundle</module>
+ </modules>
+ </profile>
+ </profiles>
+</project>
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 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. +--> +<project> + <modelVersion>4.0.0</modelVersion> + <parent> + <groupId>org.apache.tuscany.sca.samples</groupId> + <artifactId>tuscany-samples</artifactId> + <version>2.0</version> + <relativePath>../pom.xml</relativePath> + </parent> + + <artifactId>tuscany-samples-learning-more</artifactId> + <version>2.0</version> + <packaging>pom</packaging> + <name>Apache Tuscany SCA Sample Learning More</name> + + <profiles> + <profile> + <id>default</id> + <activation> + <activeByDefault>true</activeByDefault> + </activation> + <modules> + <module>async-invocation</module> + <!-- removed as its broken presently module>binding-comet</module --> + <module>binding-websocket</module> + <module>contribution-osgi</module> + <module>distributed-osgi-static</module> + </modules> + </profile> + </profiles> +</project> |