You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@felix.apache.org by cl...@apache.org on 2013/09/26 19:51:20 UTC
svn commit: r1526626 [3/3] - in /felix/trunk/ipojo:
manipulator/annotations/src/main/java/org/apache/felix/ipojo/annotations/
manipulator/ipojo-ant-task/src/main/resources/META-INF/xsd/
manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manip...
Copied: felix/trunk/ipojo/runtime/core-it/ipojo-core-service-dependency-timeout-test/src/test/java/org/apache/felix/ipojo/runtime/test/dependencies/timeout/NullableTest.java (from r1526161, felix/trunk/ipojo/handler/temporal/temporal-dependency-handler-it/src/it/temporal-it/src/test/java/org/apache/felix/ipojo/handler/temporal/test/NullableTest.java)
URL: http://svn.apache.org/viewvc/felix/trunk/ipojo/runtime/core-it/ipojo-core-service-dependency-timeout-test/src/test/java/org/apache/felix/ipojo/runtime/test/dependencies/timeout/NullableTest.java?p2=felix/trunk/ipojo/runtime/core-it/ipojo-core-service-dependency-timeout-test/src/test/java/org/apache/felix/ipojo/runtime/test/dependencies/timeout/NullableTest.java&p1=felix/trunk/ipojo/handler/temporal/temporal-dependency-handler-it/src/it/temporal-it/src/test/java/org/apache/felix/ipojo/handler/temporal/test/NullableTest.java&r1=1526161&r2=1526626&rev=1526626&view=diff
==============================================================================
--- felix/trunk/ipojo/handler/temporal/temporal-dependency-handler-it/src/it/temporal-it/src/test/java/org/apache/felix/ipojo/handler/temporal/test/NullableTest.java (original)
+++ felix/trunk/ipojo/runtime/core-it/ipojo-core-service-dependency-timeout-test/src/test/java/org/apache/felix/ipojo/runtime/test/dependencies/timeout/NullableTest.java Thu Sep 26 17:51:18 2013
@@ -16,11 +16,12 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.felix.ipojo.handler.temporal.test;
+
+package org.apache.felix.ipojo.runtime.test.dependencies.timeout;
import org.apache.felix.ipojo.ComponentInstance;
-import org.apache.felix.ipojo.handler.temporal.services.CheckService;
-import org.apache.felix.ipojo.handler.temporal.services.FooService;
+import org.apache.felix.ipojo.runtime.test.dependencies.timeout.services.CheckService;
+import org.apache.felix.ipojo.runtime.test.dependencies.timeout.services.FooService;
import org.junit.Test;
import org.osgi.framework.ServiceReference;
@@ -29,51 +30,11 @@ import static org.junit.Assert.*;
public class NullableTest extends Common {
@Test
- public void testNullable() {
- String prov = "provider";
- ComponentInstance provider = ipojoHelper.createComponentInstance("TEMPORAL-FooProvider", prov);
- String un = "under-1";
- ComponentInstance under = ipojoHelper.createComponentInstance("TEMPORAL-NullableCheckServiceProvider", un);
-
- ServiceReference ref_fs = ipojoHelper.getServiceReferenceByName(FooService.class.getName(), prov);
- assertNotNull("Check foo availability", ref_fs);
-
- ServiceReference ref_cs = ipojoHelper.getServiceReferenceByName(CheckService.class.getName(), un);
- assertNotNull("Check cs availability", ref_cs);
-
- CheckService cs = (CheckService) osgiHelper.getServiceObject(ref_cs);
- assertTrue("Check invocation", cs.check());
-
- // Stop the provider.
- provider.stop();
- ref_cs = ipojoHelper.getServiceReferenceByName(CheckService.class.getName(), un);
- assertNotNull("Check cs availability - 2", ref_cs);
- long begin = System.currentTimeMillis();
- DelayedProvider dp = new DelayedProvider(provider, 200);
- dp.start();
- cs = (CheckService) osgiHelper.getServiceObject(ref_cs);
- assertTrue("Check invocation - 2", cs.check());
- long end = System.currentTimeMillis();
-
- assertTrue("Assert delay", (end - begin) >= 200);
-
- ref_cs = ipojoHelper.getServiceReferenceByName(CheckService.class.getName(), un);
- assertNotNull("Check cs availability - 3", ref_cs);
- cs = (CheckService) osgiHelper.getServiceObject(ref_cs);
- assertTrue("Check invocation - 3", cs.check());
-
- provider.stop();
- provider.dispose();
- under.stop();
- under.dispose();
- }
-
- @Test
public void testNullableTimeout() {
String prov = "provider";
- ComponentInstance provider = ipojoHelper.createComponentInstance("TEMPORAL-FooProvider", prov);
+ ComponentInstance provider = ipojoHelper.createComponentInstance("FooProvider", prov);
String un = "under-1";
- ComponentInstance under = ipojoHelper.createComponentInstance("TEMPORAL-NullableCheckServiceProvider", un);
+ ComponentInstance under = ipojoHelper.createComponentInstance("NullableCheckServiceProvider", un);
ServiceReference ref_fs = ipojoHelper.getServiceReferenceByName(FooService.class.getName(), prov);
assertNotNull("Check foo availability", ref_fs);
@@ -107,125 +68,9 @@ public class NullableTest extends Common
@Test
public void testDelayTimeout() {
String prov = "provider";
- ComponentInstance provider = ipojoHelper.createComponentInstance("TEMPORAL-FooProvider", prov);
- String un = "under-1";
- ComponentInstance under = ipojoHelper.createComponentInstance("TEMPORAL-NullableCheckServiceProviderTimeout", un);
-
- ServiceReference ref_fs = ipojoHelper.getServiceReferenceByName(FooService.class.getName(), prov);
- assertNotNull("Check foo availability", ref_fs);
-
- ServiceReference ref_cs = ipojoHelper.getServiceReferenceByName(CheckService.class.getName(), un);
- assertNotNull("Check cs availability", ref_cs);
-
- CheckService cs = (CheckService) osgiHelper.getServiceObject(ref_cs);
- assertTrue("Check invocation", cs.check());
-
- // Stop the provider.
- provider.stop();
- ref_cs = ipojoHelper.getServiceReferenceByName(CheckService.class.getName(), un);
- assertNotNull("Check cs availability - 2", ref_cs);
- long begin = System.currentTimeMillis();
- DelayedProvider dp = new DelayedProvider(provider, 200);
- dp.start();
- cs = (CheckService) osgiHelper.getServiceObject(ref_cs);
- assertTrue("Check invocation - 2", cs.check());
- long end = System.currentTimeMillis();
-
- assertTrue("Assert delay", (end - begin) >= 200);
-
- ref_cs = ipojoHelper.getServiceReferenceByName(CheckService.class.getName(), un);
- assertNotNull("Check cs availability - 3", ref_cs);
- cs = (CheckService) osgiHelper.getServiceObject(ref_cs);
- assertTrue("Check invocation - 3", cs.check());
-
- provider.stop();
- provider.dispose();
- under.stop();
- under.dispose();
- }
-
- @Test
- public void testNullableWithProxy() {
- String prov = "provider";
- ComponentInstance provider = ipojoHelper.createComponentInstance("TEMPORAL-FooProvider", prov);
- String un = "under-1";
- ComponentInstance under = ipojoHelper.createComponentInstance("TEMPORAL-NullableProxiedCheckServiceProvider", un);
-
- ServiceReference ref_fs = ipojoHelper.getServiceReferenceByName(FooService.class.getName(), prov);
- assertNotNull("Check foo availability", ref_fs);
-
- ServiceReference ref_cs = ipojoHelper.getServiceReferenceByName(CheckService.class.getName(), un);
- assertNotNull("Check cs availability", ref_cs);
-
- CheckService cs = (CheckService) osgiHelper.getServiceObject(ref_cs);
- assertTrue("Check invocation", cs.check());
-
- // Stop the provider.
- provider.stop();
- ref_cs = ipojoHelper.getServiceReferenceByName(CheckService.class.getName(), un);
- assertNotNull("Check cs availability - 2", ref_cs);
- long begin = System.currentTimeMillis();
- DelayedProvider dp = new DelayedProvider(provider, 200);
- dp.start();
- cs = (CheckService) osgiHelper.getServiceObject(ref_cs);
- assertTrue("Check invocation - 2", cs.check());
- long end = System.currentTimeMillis();
-
- assertTrue("Assert delay", (end - begin) >= 200);
-
- ref_cs = ipojoHelper.getServiceReferenceByName(CheckService.class.getName(), un);
- assertNotNull("Check cs availability - 3", ref_cs);
- cs = (CheckService) osgiHelper.getServiceObject(ref_cs);
- assertTrue("Check invocation - 3", cs.check());
-
- provider.stop();
- provider.dispose();
- under.stop();
- under.dispose();
- }
-
- @Test
- public void testNullableTimeoutWithProxy() {
- String prov = "provider";
- ComponentInstance provider = ipojoHelper.createComponentInstance("TEMPORAL-FooProvider", prov);
+ ComponentInstance provider = ipojoHelper.createComponentInstance("FooProvider", prov);
String un = "under-1";
- ComponentInstance under = ipojoHelper.createComponentInstance("TEMPORAL-NullableProxiedCheckServiceProvider", un);
-
- ServiceReference ref_fs = ipojoHelper.getServiceReferenceByName(FooService.class.getName(), prov);
- assertNotNull("Check foo availability", ref_fs);
-
- ServiceReference ref_cs = ipojoHelper.getServiceReferenceByName(CheckService.class.getName(), un);
- assertNotNull("Check cs availability", ref_cs);
-
- CheckService cs = (CheckService) osgiHelper.getServiceObject(ref_cs);
- assertTrue("Check invocation", cs.check());
-
- // Stop the provider.
- provider.stop();
- ref_cs = ipojoHelper.getServiceReferenceByName(CheckService.class.getName(), un);
- assertNotNull("Check cs availability - 2", ref_cs);
- cs = (CheckService) osgiHelper.getServiceObject(ref_cs);
- boolean res = false;
- try {
- res = cs.check();
- } catch (RuntimeException e) {
- fail("A nullable was expected ...");
- }
- assertFalse("Check nullable", res);
-
- provider.stop();
- provider.dispose();
- under.stop();
- under.dispose();
- return;
- }
-
- @Test
- public void testDelayTimeoutWithProxy() {
- String prov = "provider";
- ComponentInstance provider = ipojoHelper.createComponentInstance("TEMPORAL-FooProvider", prov);
- String un = "under-1";
- ComponentInstance under = ipojoHelper.createComponentInstance("TEMPORAL-NullableProxiedCheckServiceProviderTimeout", un);
+ ComponentInstance under = ipojoHelper.createComponentInstance("NullableCheckServiceProviderTimeout", un);
ServiceReference ref_fs = ipojoHelper.getServiceReferenceByName(FooService.class.getName(), prov);
assertNotNull("Check foo availability", ref_fs);
@@ -260,276 +105,4 @@ public class NullableTest extends Common
under.dispose();
}
- @Test
- public void testNullableMultipleTimeout() {
- String prov = "provider";
- ComponentInstance provider = ipojoHelper.createComponentInstance("TEMPORAL-FooProvider", prov);
- String un = "under-1";
- ComponentInstance under = ipojoHelper.createComponentInstance("TEMPORAL-NullableMultipleCheckServiceProviderTimeout", un);
-
- ServiceReference ref_fs = ipojoHelper.getServiceReferenceByName(FooService.class.getName(), prov);
- assertNotNull("Check foo availability", ref_fs);
-
- ServiceReference ref_cs = ipojoHelper.getServiceReferenceByName(CheckService.class.getName(), un);
- assertNotNull("Check cs availability", ref_cs);
-
- CheckService cs = (CheckService) osgiHelper.getServiceObject(ref_cs);
- assertTrue("Check invocation", cs.check());
-
- // Stop the provider.
- provider.stop();
- ref_cs = ipojoHelper.getServiceReferenceByName(CheckService.class.getName(), un);
- assertNotNull("Check cs availability - 2", ref_cs);
- DelayedProvider dp = new DelayedProvider(provider, 400);
- dp.start();
- cs = (CheckService) osgiHelper.getServiceObject(ref_cs);
- boolean res = false;
- try {
- res = cs.check();
- } catch (RuntimeException e) {
- fail("A nullable was expected ...");
- }
- assertFalse("Check nullable", res);
-
- dp.stop();
- provider.stop();
- provider.dispose();
- under.stop();
- under.dispose();
- return;
- }
-
- @Test
- public void testNullableCollectionTimeout() {
- String prov = "provider";
- ComponentInstance provider = ipojoHelper.createComponentInstance("TEMPORAL-FooProvider", prov);
- String un = "under-1";
- ComponentInstance under = ipojoHelper.createComponentInstance("TEMPORAL-NullableColCheckServiceProviderTimeout", un);
-
- ServiceReference ref_fs = ipojoHelper.getServiceReferenceByName(FooService.class.getName(), prov);
- assertNotNull("Check foo availability", ref_fs);
-
- ServiceReference ref_cs = ipojoHelper.getServiceReferenceByName(CheckService.class.getName(), un);
- assertNotNull("Check cs availability", ref_cs);
-
- CheckService cs = (CheckService) osgiHelper.getServiceObject(ref_cs);
- assertTrue("Check invocation", cs.check());
-
- // Stop the provider.
- provider.stop();
- ref_cs = ipojoHelper.getServiceReferenceByName(CheckService.class.getName(), un);
- assertNotNull("Check cs availability - 2", ref_cs);
- DelayedProvider dp = new DelayedProvider(provider, 400);
- dp.start();
- cs = (CheckService) osgiHelper.getServiceObject(ref_cs);
- boolean res = false;
- try {
- res = cs.check();
- } catch (RuntimeException e) {
- fail("A nullable was expected ...");
- }
- assertFalse("Check nullable", res);
-
- dp.stop();
- provider.stop();
- provider.dispose();
- under.stop();
- under.dispose();
- return;
- }
-
- @Test
- public void testNullableProxiedCollectionTimeout() {
- String prov = "provider";
- ComponentInstance provider = ipojoHelper.createComponentInstance("TEMPORAL-FooProvider", prov);
- String un = "under-1";
- ComponentInstance under = ipojoHelper.createComponentInstance("TEMPORAL-NullableProxiedColCheckServiceProviderTimeout", un);
-
- ServiceReference ref_fs = ipojoHelper.getServiceReferenceByName(FooService.class.getName(), prov);
- assertNotNull("Check foo availability", ref_fs);
-
- ServiceReference ref_cs = ipojoHelper.getServiceReferenceByName(CheckService.class.getName(), un);
- assertNotNull("Check cs availability", ref_cs);
-
- CheckService cs = (CheckService) osgiHelper.getServiceObject(ref_cs);
- assertTrue("Check invocation", cs.check());
-
- // Stop the provider.
- provider.stop();
- ref_cs = ipojoHelper.getServiceReferenceByName(CheckService.class.getName(), un);
- assertNotNull("Check cs availability - 2", ref_cs);
- DelayedProvider dp = new DelayedProvider(provider, 400);
- dp.start();
- cs = (CheckService) osgiHelper.getServiceObject(ref_cs);
- boolean res = false;
- try {
- res = cs.check();
- } catch (RuntimeException e) {
- fail("A nullable was expected ...");
- }
- assertFalse("Check nullable", res);
-
- dp.stop();
- provider.stop();
- provider.dispose();
- under.stop();
- under.dispose();
- return;
- }
-
- @Test
- public void testDelayOnMultipleDependency() {
- String prov = "provider";
- ComponentInstance provider1 = ipojoHelper.createComponentInstance("TEMPORAL-FooProvider", prov);
- String prov2 = "provider2";
- ComponentInstance provider2 = ipojoHelper.createComponentInstance("TEMPORAL-FooProvider", prov2);
- String un = "under-1";
- ComponentInstance under = ipojoHelper.createComponentInstance("TEMPORAL-NullableMultipleCheckServiceProviderTimeout", un);
-
- ServiceReference ref_fs = ipojoHelper.getServiceReferenceByName(FooService.class.getName(), prov);
- assertNotNull("Check foo availability", ref_fs);
-
- ServiceReference ref_cs = ipojoHelper.getServiceReferenceByName(CheckService.class.getName(), un);
- assertNotNull("Check cs availability", ref_cs);
-
- CheckService cs = (CheckService) osgiHelper.getServiceObject(ref_cs);
- assertTrue("Check invocation", cs.check());
-
- // Stop the providers.
- provider1.stop();
- provider2.stop();
- ref_cs = ipojoHelper.getServiceReferenceByName(CheckService.class.getName(), un);
- assertNotNull("Check cs availability - 2", ref_cs);
- long begin = System.currentTimeMillis();
- DelayedProvider dp = new DelayedProvider(provider1, 1500);
- DelayedProvider dp2 = new DelayedProvider(provider2, 100);
- dp.start();
- dp2.start();
- cs = (CheckService) osgiHelper.getServiceObject(ref_cs);
- assertTrue("Check invocation - 2", cs.check());
- long end = System.currentTimeMillis();
- System.out.println("delay = " + (end - begin));
- assertTrue("Assert min delay", (end - begin) >= 100);
- assertTrue("Assert max delay", (end - begin) <= 1000);
- dp.stop();
- dp2.stop();
-
- provider1.stop();
- provider2.stop();
-
- ref_cs = ipojoHelper.getServiceReferenceByName(CheckService.class.getName(), un);
- assertNotNull("Check cs availability - 3", ref_cs);
- cs = (CheckService) osgiHelper.getServiceObject(ref_cs);
-
- assertFalse("Check invocation - 3", cs.check()); // Will return false as the contained nullable will return false to the foo method.
-
- provider1.dispose();
- provider2.dispose();
- under.stop();
- under.dispose();
- }
-
- @Test
- public void testDelayOnCollectionDependency() {
- String prov = "provider";
- ComponentInstance provider1 = ipojoHelper.createComponentInstance("TEMPORAL-FooProvider", prov);
- String prov2 = "provider2";
- ComponentInstance provider2 = ipojoHelper.createComponentInstance("TEMPORAL-FooProvider", prov2);
- String un = "under-1";
- ComponentInstance under = ipojoHelper.createComponentInstance("TEMPORAL-NullableColCheckServiceProviderTimeout", un);
-
- ServiceReference ref_fs = ipojoHelper.getServiceReferenceByName(FooService.class.getName(), prov);
- assertNotNull("Check foo availability", ref_fs);
-
- ServiceReference ref_cs = ipojoHelper.getServiceReferenceByName(CheckService.class.getName(), un);
- assertNotNull("Check cs availability", ref_cs);
-
- CheckService cs = (CheckService) osgiHelper.getServiceObject(ref_cs);
- assertTrue("Check invocation", cs.check());
-
- // Stop the providers.
- provider1.stop();
- provider2.stop();
- ref_cs = ipojoHelper.getServiceReferenceByName(CheckService.class.getName(), un);
- assertNotNull("Check cs availability - 2", ref_cs);
- long begin = System.currentTimeMillis();
- DelayedProvider dp = new DelayedProvider(provider1, 1500);
- DelayedProvider dp2 = new DelayedProvider(provider2, 100);
- dp.start();
- dp2.start();
- cs = (CheckService) osgiHelper.getServiceObject(ref_cs);
- assertTrue("Check invocation - 2", cs.check());
- long end = System.currentTimeMillis();
- System.out.println("delay = " + (end - begin));
- assertTrue("Assert min delay", (end - begin) >= 100);
- assertTrue("Assert max delay", (end - begin) <= 1000);
- dp.stop();
- dp2.stop();
-
- provider1.stop();
- provider2.stop();
-
- ref_cs = ipojoHelper.getServiceReferenceByName(CheckService.class.getName(), un);
- assertNotNull("Check cs availability - 3", ref_cs);
- cs = (CheckService) osgiHelper.getServiceObject(ref_cs);
-
- assertFalse("Check invocation - 3", cs.check()); // Will return false as the contained nullable will return false to the foo method.
-
- provider1.dispose();
- provider2.dispose();
- under.stop();
- under.dispose();
- }
-
- @Test
- public void testDelayOnProxiedCollectionDependency() {
- String prov = "provider";
- ComponentInstance provider1 = ipojoHelper.createComponentInstance("TEMPORAL-FooProvider", prov);
- String prov2 = "provider2";
- ComponentInstance provider2 = ipojoHelper.createComponentInstance("TEMPORAL-FooProvider", prov2);
- String un = "under-1";
- ComponentInstance under = ipojoHelper.createComponentInstance("TEMPORAL-NullableProxiedColCheckServiceProviderTimeout", un);
-
- ServiceReference ref_fs = ipojoHelper.getServiceReferenceByName(FooService.class.getName(), prov);
- assertNotNull("Check foo availability", ref_fs);
-
- ServiceReference ref_cs = ipojoHelper.getServiceReferenceByName(CheckService.class.getName(), un);
- assertNotNull("Check cs availability", ref_cs);
-
- CheckService cs = (CheckService) osgiHelper.getServiceObject(ref_cs);
- assertTrue("Check invocation", cs.check());
-
- // Stop the providers.
- provider1.stop();
- provider2.stop();
- ref_cs = ipojoHelper.getServiceReferenceByName(CheckService.class.getName(), un);
- assertNotNull("Check cs availability - 2", ref_cs);
- long begin = System.currentTimeMillis();
- DelayedProvider dp = new DelayedProvider(provider1, 1500);
- DelayedProvider dp2 = new DelayedProvider(provider2, 100);
- dp.start();
- dp2.start();
- cs = (CheckService) osgiHelper.getServiceObject(ref_cs);
- assertTrue("Check invocation - 2", cs.check());
- long end = System.currentTimeMillis();
- System.out.println("delay = " + (end - begin));
- assertTrue("Assert min delay", (end - begin) >= 100);
- assertTrue("Assert max delay", (end - begin) <= 1000);
- dp.stop();
- dp2.stop();
-
- provider1.stop();
- provider2.stop();
-
- ref_cs = ipojoHelper.getServiceReferenceByName(CheckService.class.getName(), un);
- assertNotNull("Check cs availability - 3", ref_cs);
- cs = (CheckService) osgiHelper.getServiceObject(ref_cs);
-
- assertFalse("Check invocation - 3", cs.check()); // Will return false as the contained nullable will return false to the foo method.
-
- provider1.dispose();
- provider2.dispose();
- under.stop();
- under.dispose();
- }
}
Copied: felix/trunk/ipojo/runtime/core-it/ipojo-core-service-dependency-timeout-test/src/test/java/org/apache/felix/ipojo/runtime/test/dependencies/timeout/TimeoutTest.java (from r1526161, felix/trunk/ipojo/handler/temporal/temporal-dependency-handler-it/src/it/temporal-it/src/test/java/org/apache/felix/ipojo/handler/temporal/test/TemporalTest.java)
URL: http://svn.apache.org/viewvc/felix/trunk/ipojo/runtime/core-it/ipojo-core-service-dependency-timeout-test/src/test/java/org/apache/felix/ipojo/runtime/test/dependencies/timeout/TimeoutTest.java?p2=felix/trunk/ipojo/runtime/core-it/ipojo-core-service-dependency-timeout-test/src/test/java/org/apache/felix/ipojo/runtime/test/dependencies/timeout/TimeoutTest.java&p1=felix/trunk/ipojo/handler/temporal/temporal-dependency-handler-it/src/it/temporal-it/src/test/java/org/apache/felix/ipojo/handler/temporal/test/TemporalTest.java&r1=1526161&r2=1526626&rev=1526626&view=diff
==============================================================================
--- felix/trunk/ipojo/handler/temporal/temporal-dependency-handler-it/src/it/temporal-it/src/test/java/org/apache/felix/ipojo/handler/temporal/test/TemporalTest.java (original)
+++ felix/trunk/ipojo/runtime/core-it/ipojo-core-service-dependency-timeout-test/src/test/java/org/apache/felix/ipojo/runtime/test/dependencies/timeout/TimeoutTest.java Thu Sep 26 17:51:18 2013
@@ -17,24 +17,24 @@
* under the License.
*/
-package org.apache.felix.ipojo.handler.temporal.test;
+package org.apache.felix.ipojo.runtime.test.dependencies.timeout;
import org.apache.felix.ipojo.ComponentInstance;
-import org.apache.felix.ipojo.handler.temporal.services.CheckService;
-import org.apache.felix.ipojo.handler.temporal.services.FooService;
+import org.apache.felix.ipojo.runtime.test.dependencies.timeout.services.CheckService;
+import org.apache.felix.ipojo.runtime.test.dependencies.timeout.services.FooService;
import org.junit.Test;
import org.osgi.framework.ServiceReference;
import static org.junit.Assert.*;
-public class TemporalTest extends Common {
+public class TimeoutTest extends Common {
@Test
public void testDelay() {
String prov = "provider";
- ComponentInstance provider = ipojoHelper.createComponentInstance("TEMPORAL-FooProvider", prov);
+ ComponentInstance provider = ipojoHelper.createComponentInstance("FooProvider", prov);
String un = "under-1";
- ComponentInstance under = ipojoHelper.createComponentInstance("TEMPORAL-CheckServiceProviderUsingTemporal", un);
+ ComponentInstance under = ipojoHelper.createComponentInstance("CheckServiceProviderTimeout", un);
ServiceReference ref_fs = ipojoHelper.getServiceReferenceByName(FooService.class.getName(), prov);
assertNotNull("Check foo availability", ref_fs);
@@ -71,246 +71,13 @@ public class TemporalTest extends Common
under.dispose();
}
- @Test
- public void testDelayWithProxy() {
- String prov = "provider";
- ComponentInstance provider = ipojoHelper.createComponentInstance("TEMPORAL-FooProvider", prov);
- String un = "under-1";
- ComponentInstance under = ipojoHelper.createComponentInstance("TEMPORAL-ProxiedCheckServiceProviderUsingTemporal", un);
-
- ServiceReference ref_fs = ipojoHelper.getServiceReferenceByName(FooService.class.getName(), prov);
- assertNotNull("Check foo availability", ref_fs);
-
- ServiceReference ref_cs = ipojoHelper.getServiceReferenceByName(CheckService.class.getName(), un);
- assertNotNull("Check cs availability", ref_cs);
-
- CheckService cs = (CheckService) osgiHelper.getServiceObject(ref_cs);
- assertTrue("Check invocation", cs.check());
-
- // Stop the provider.
- provider.stop();
- ref_cs = ipojoHelper.getServiceReferenceByName(CheckService.class.getName(), un);
- assertNotNull("Check cs availability - 2", ref_cs);
- long begin = System.currentTimeMillis();
- DelayedProvider dp = new DelayedProvider(provider, 200);
- dp.start();
- cs = (CheckService) osgiHelper.getServiceObject(ref_cs);
- assertTrue("Check invocation - 2", cs.check());
- long end = System.currentTimeMillis();
-
- assertTrue("Assert delay", (end - begin) >= 200);
-
- ref_cs = ipojoHelper.getServiceReferenceByName(CheckService.class.getName(), un);
- assertNotNull("Check cs availability - 3", ref_cs);
- cs = (CheckService) osgiHelper.getServiceObject(ref_cs);
- assertTrue("Check invocation - 3", cs.check());
-
- provider.stop();
- provider.dispose();
- under.stop();
- under.dispose();
- }
-
- @Test
- public void testTimeout() {
- String prov = "provider";
- ComponentInstance provider = ipojoHelper.createComponentInstance("TEMPORAL-FooProvider", prov);
- String un = "under-1";
- ComponentInstance under = ipojoHelper.createComponentInstance("TEMPORAL-CheckServiceProviderUsingTemporal", un);
-
- ServiceReference ref_fs = ipojoHelper.getServiceReferenceByName(FooService.class.getName(), prov);
- assertNotNull("Check foo availability", ref_fs);
-
- ServiceReference ref_cs = ipojoHelper.getServiceReferenceByName(CheckService.class.getName(), un);
- assertNotNull("Check cs availability", ref_cs);
-
- CheckService cs = (CheckService) osgiHelper.getServiceObject(ref_cs);
- assertTrue("Check invocation", cs.check());
-
- // Stop the provider.
- provider.stop();
- ref_cs = ipojoHelper.getServiceReferenceByName(CheckService.class.getName(), un);
- assertNotNull("Check cs availability - 2", ref_cs);
- DelayedProvider dp = new DelayedProvider(provider, 4000);
- dp.start();
- cs = (CheckService) osgiHelper.getServiceObject(ref_cs);
- try {
- cs.check();
- } catch (RuntimeException e) {
- // OK
- dp.stop();
- provider.stop();
- provider.dispose();
- under.stop();
- under.dispose();
- return;
- }
-
- fail("Timeout expected");
- }
-
- @Test
- public void testTimeoutWithProxy() {
- String prov = "provider";
- ComponentInstance provider = ipojoHelper.createComponentInstance("TEMPORAL-FooProvider", prov);
- String un = "under-1";
- ComponentInstance under = ipojoHelper.createComponentInstance("TEMPORAL-ProxiedCheckServiceProviderUsingTemporal", un);
-
- ServiceReference ref_fs = ipojoHelper.getServiceReferenceByName(FooService.class.getName(), prov);
- assertNotNull("Check foo availability", ref_fs);
-
- ServiceReference ref_cs = ipojoHelper.getServiceReferenceByName(CheckService.class.getName(), un);
- assertNotNull("Check cs availability", ref_cs);
-
- CheckService cs = (CheckService) osgiHelper.getServiceObject(ref_cs);
- assertTrue("Check invocation", cs.check());
-
- // Stop the provider.
- provider.stop();
- ref_cs = ipojoHelper.getServiceReferenceByName(CheckService.class.getName(), un);
- assertNotNull("Check cs availability - 2", ref_cs);
- DelayedProvider dp = new DelayedProvider(provider, 4000);
- dp.start();
- cs = (CheckService) osgiHelper.getServiceObject(ref_cs);
- try {
- cs.check();
- } catch (RuntimeException e) {
- // OK
- dp.stop();
- provider.stop();
- provider.dispose();
- under.stop();
- under.dispose();
- return;
- }
-
- fail("Timeout expected");
- }
-
- @Test
- public void testDelayTimeout() {
- String prov = "provider";
- ComponentInstance provider = ipojoHelper.createComponentInstance("TEMPORAL-FooProvider", prov);
- String un = "under-1";
- ComponentInstance under = ipojoHelper.createComponentInstance("TEMPORAL-CheckServiceProviderTimeoutUsingTemporal", un);
-
- ServiceReference ref_fs = ipojoHelper.getServiceReferenceByName(FooService.class.getName(), prov);
- assertNotNull("Check foo availability", ref_fs);
-
- ServiceReference ref_cs = ipojoHelper.getServiceReferenceByName(CheckService.class.getName(), un);
- assertNotNull("Check cs availability", ref_cs);
-
- CheckService cs = (CheckService) osgiHelper.getServiceObject(ref_cs);
- assertTrue("Check invocation", cs.check());
-
- // Stop the provider.
- provider.stop();
- ref_cs = ipojoHelper.getServiceReferenceByName(CheckService.class.getName(), un);
- assertNotNull("Check cs availability - 2", ref_cs);
- long begin = System.currentTimeMillis();
- DelayedProvider dp = new DelayedProvider(provider, 200);
- dp.start();
- cs = (CheckService) osgiHelper.getServiceObject(ref_cs);
- assertTrue("Check invocation - 2", cs.check());
- long end = System.currentTimeMillis();
-
- assertTrue("Assert delay", (end - begin) >= 200);
-
- ref_cs = ipojoHelper.getServiceReferenceByName(CheckService.class.getName(), un);
- assertNotNull("Check cs availability - 3", ref_cs);
- cs = (CheckService) osgiHelper.getServiceObject(ref_cs);
- assertTrue("Check invocation - 3", cs.check());
-
- provider.stop();
- provider.dispose();
- under.stop();
- under.dispose();
- }
-
- @Test
- public void testDelayTimeoutWithProxy() {
- String prov = "provider";
- ComponentInstance provider = ipojoHelper.createComponentInstance("TEMPORAL-FooProvider", prov);
- String un = "under-1";
- ComponentInstance under = ipojoHelper.createComponentInstance("TEMPORAL-ProxiedCheckServiceProviderTimeoutUsingTemporal", un);
-
- ServiceReference ref_fs = ipojoHelper.getServiceReferenceByName(FooService.class.getName(), prov);
- assertNotNull("Check foo availability", ref_fs);
-
- ServiceReference ref_cs = ipojoHelper.getServiceReferenceByName(CheckService.class.getName(), un);
- assertNotNull("Check cs availability", ref_cs);
-
- CheckService cs = (CheckService) osgiHelper.getServiceObject(ref_cs);
- assertTrue("Check invocation", cs.check());
-
- // Stop the provider.
- provider.stop();
- ref_cs = ipojoHelper.getServiceReferenceByName(CheckService.class.getName(), un);
- assertNotNull("Check cs availability - 2", ref_cs);
- long begin = System.currentTimeMillis();
- DelayedProvider dp = new DelayedProvider(provider, 200);
- dp.start();
- cs = (CheckService) osgiHelper.getServiceObject(ref_cs);
- assertTrue("Check invocation - 2", cs.check());
- long end = System.currentTimeMillis();
-
- assertTrue("Assert delay", (end - begin) >= 200);
-
- ref_cs = ipojoHelper.getServiceReferenceByName(CheckService.class.getName(), un);
- assertNotNull("Check cs availability - 3", ref_cs);
- cs = (CheckService) osgiHelper.getServiceObject(ref_cs);
- assertTrue("Check invocation - 3", cs.check());
-
- provider.stop();
- provider.dispose();
- under.stop();
- under.dispose();
- }
-
- @Test
- public void testSetTimeout() {
- String prov = "provider";
- ComponentInstance provider = ipojoHelper.createComponentInstance("TEMPORAL-FooProvider", prov);
- String un = "under-1";
- ComponentInstance under = ipojoHelper.createComponentInstance("TEMPORAL-CheckServiceProviderTimeoutUsingTemporal", un);
-
- ServiceReference ref_fs = ipojoHelper.getServiceReferenceByName(FooService.class.getName(), prov);
- assertNotNull("Check foo availability", ref_fs);
-
- ServiceReference ref_cs = ipojoHelper.getServiceReferenceByName(CheckService.class.getName(), un);
- assertNotNull("Check cs availability", ref_cs);
-
- CheckService cs = (CheckService) osgiHelper.getServiceObject(ref_cs);
- assertTrue("Check invocation", cs.check());
-
- // Stop the provider.
- provider.stop();
- ref_cs = ipojoHelper.getServiceReferenceByName(CheckService.class.getName(), un);
- assertNotNull("Check cs availability - 2", ref_cs);
- DelayedProvider dp = new DelayedProvider(provider, 400);
- dp.start();
- cs = (CheckService) osgiHelper.getServiceObject(ref_cs);
- try {
- cs.check();
- } catch (RuntimeException e) {
- // OK
- dp.stop();
- provider.stop();
- provider.dispose();
- under.stop();
- under.dispose();
- return;
- }
-
- fail("Timeout expected");
- }
@Test
- public void testSetTimeoutWithProxy() {
+ public void testTimeoutWithException() {
String prov = "provider";
- ComponentInstance provider = ipojoHelper.createComponentInstance("TEMPORAL-FooProvider", prov);
+ ComponentInstance provider = ipojoHelper.createComponentInstance("FooProvider", prov);
String un = "under-1";
- ComponentInstance under = ipojoHelper.createComponentInstance("TEMPORAL-ProxiedCheckServiceProviderTimeoutUsingTemporal", un);
+ ComponentInstance under = ipojoHelper.createComponentInstance("ExceptionCheckServiceProviderTimeout", un);
ServiceReference ref_fs = ipojoHelper.getServiceReferenceByName(FooService.class.getName(), prov);
assertNotNull("Check foo availability", ref_fs);
Modified: felix/trunk/ipojo/runtime/core-it/pom.xml
URL: http://svn.apache.org/viewvc/felix/trunk/ipojo/runtime/core-it/pom.xml?rev=1526626&r1=1526625&r2=1526626&view=diff
==============================================================================
--- felix/trunk/ipojo/runtime/core-it/pom.xml (original)
+++ felix/trunk/ipojo/runtime/core-it/pom.xml Thu Sep 26 17:51:18 2013
@@ -63,6 +63,7 @@
<module>ipojo-core-service-dependency-policies</module>
<module>ipojo-core-service-dependency-proxies</module>
<module>ipojo-core-service-dependency-test</module>
+ <module>ipojo-core-service-dependency-timeout-test</module>
<module>ipojo-core-service-dependency-interceptor-test</module>
<module>ipojo-core-service-providing-test</module>
<module>ipojo-api-test</module>
Modified: felix/trunk/ipojo/runtime/core/src/main/java/org/apache/felix/ipojo/handlers/dependency/Dependency.java
URL: http://svn.apache.org/viewvc/felix/trunk/ipojo/runtime/core/src/main/java/org/apache/felix/ipojo/handlers/dependency/Dependency.java?rev=1526626&r1=1526625&r2=1526626&view=diff
==============================================================================
--- felix/trunk/ipojo/runtime/core/src/main/java/org/apache/felix/ipojo/handlers/dependency/Dependency.java (original)
+++ felix/trunk/ipojo/runtime/core/src/main/java/org/apache/felix/ipojo/handlers/dependency/Dependency.java Thu Sep 26 17:51:18 2013
@@ -18,140 +18,117 @@
*/
package org.apache.felix.ipojo.handlers.dependency;
-import java.lang.reflect.Array;
-import java.lang.reflect.Constructor;
-import java.lang.reflect.InvocationHandler;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Member;
-import java.lang.reflect.Method;
-import java.lang.reflect.Proxy;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Comparator;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-import java.util.Vector;
-
-import org.apache.felix.ipojo.ConfigurationException;
-import org.apache.felix.ipojo.ConstructorInjector;
-import org.apache.felix.ipojo.FieldInterceptor;
-import org.apache.felix.ipojo.InstanceManager;
-import org.apache.felix.ipojo.MethodInterceptor;
-import org.apache.felix.ipojo.Nullable;
-import org.apache.felix.ipojo.PolicyServiceContext;
+import org.apache.felix.ipojo.*;
import org.apache.felix.ipojo.handlers.dependency.ServiceUsage.Usage;
import org.apache.felix.ipojo.util.DependencyModel;
+import org.apache.felix.ipojo.util.Log;
import org.osgi.framework.BundleContext;
import org.osgi.framework.Filter;
import org.osgi.framework.ServiceReference;
+import java.lang.reflect.*;
+import java.util.*;
+
/**
* Represent a service dependency of the component instance.
+ *
* @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
*/
public class Dependency extends DependencyModel implements FieldInterceptor, MethodInterceptor,
- ConstructorInjector {
+ ConstructorInjector {
/**
* Reference on the Dependency Handler.
*/
private final DependencyHandler m_handler;
-
/**
* Field of the dependency.
*/
private final String m_field;
-
+ /**
+ * Default-Implementation.
+ */
+ private final String m_di;
+ /**
+ * Exception to throw when no providers are available.
+ */
+ private final String m_exception;
+ /**
+ * Is the Nullable pattern enable?
+ */
+ private final boolean m_supportNullable;
/**
* List of dependency callback.
* Immutable once set.
*/
private DependencyCallback[] m_callbacks;
-
/**
* Is the dependency a service level dependency.
* Immutable once set.
*/
private boolean m_isServiceLevelRequirement;
-
/**
* Is the provider set frozen ?
*/
private boolean m_isFrozen;
-
/**
* Is the dependency started ?
*/
private boolean m_isStarted;
-
/**
* Thread Local.
*/
private ServiceUsage m_usage;
-
/**
* Type of the object to inject.
* Cannot change once set.
*/
private int m_type;
-
/**
* Nullable object.
* Immutable once set.
*/
private Object m_nullable;
-
- /**
- * Default-Implementation.
- */
- private final String m_di;
-
- /**
- * Is the Nullable pattern enable?
- */
- private final boolean m_supportNullable;
-
/**
* Id of the dependency.
* Immutable once set.
*/
private String m_id;
-
/**
* Do we have to inject proxy?
*/
private boolean m_isProxy;
-
/**
* Proxy Object.
*/
private Object m_proxyObject;
-
/**
- * Constructor paramter index.
+ * Constructor parameter index.
* -1 if not used.
*/
private int m_index = -1;
+ private int m_timeout;
/**
* Dependency constructor. After the creation the dependency is not started.
*
- * @param handler : the dependency handler managing this dependency
- * @param field : field of the dependency
- * @param spec : required specification
- * @param filter : LDAP filter of the dependency
- * @param isOptional : is the dependency an optional dependency ?
- * @param isAggregate : is the dependency an aggregate dependency
- * @param nullable : describe if the nullable ability is enable or disable
- * @param isProxy : is the proxied dependency
- * @param identity : id of the dependency, may be null
- * @param context : bundle context (or service context) to use.
- * @param policy : resolution policy
- * @param cmp : comparator to sort references
- * @param defaultImplem : default-implementation class
- */
- public Dependency(DependencyHandler handler, String field, Class spec, Filter filter, boolean isOptional, boolean isAggregate, boolean nullable, boolean isProxy, String identity, BundleContext context, int policy, Comparator cmp, String defaultImplem) {
+ * @param handler : the dependency handler managing this dependency
+ * @param field : field of the dependency
+ * @param spec : required specification
+ * @param filter : LDAP filter of the dependency
+ * @param isOptional : is the dependency an optional dependency ?
+ * @param isAggregate : is the dependency an aggregate dependency
+ * @param nullable : describe if the nullable ability is enable or disable
+ * @param isProxy : is the proxied dependency
+ * @param identity : id of the dependency, may be null
+ * @param context : bundle context (or service context) to use.
+ * @param policy : resolution policy
+ * @param cmp : comparator to sort references
+ * @param defaultImplementation : default-implementation class
+ */
+ public Dependency(DependencyHandler handler, String field, Class spec, Filter filter, boolean isOptional,
+ boolean isAggregate, boolean nullable, boolean isProxy, String identity, BundleContext context,
+ int policy, Comparator cmp, String defaultImplementation, String exception) {
super(spec, isAggregate, isOptional, filter, cmp, policy, context, handler, handler.getInstanceManager());
m_handler = handler;
m_field = field;
@@ -164,7 +141,8 @@ public class Dependency extends Dependen
}
m_supportNullable = nullable;
- m_di = defaultImplem;
+ m_di = defaultImplementation;
+ m_exception = exception;
if (identity == null) {
if (spec != null) {
@@ -182,6 +160,7 @@ public class Dependency extends Dependen
* In order to store the id of the dependency, this
* method is override. This method is called during the
* configuration.
+ *
* @param spec : request service Class
* @see org.apache.felix.ipojo.util.DependencyModel#setSpecification(java.lang.Class)
*/
@@ -199,11 +178,12 @@ public class Dependency extends Dependen
/**
* Add a callback to the dependency.
* This method is called during the configuration.
+ *
* @param callback : callback to add
*/
protected void addDependencyCallback(DependencyCallback callback) {
if (m_callbacks == null) {
- m_callbacks = new DependencyCallback[] { callback };
+ m_callbacks = new DependencyCallback[]{callback};
} else {
DependencyCallback[] newCallbacks = new DependencyCallback[m_callbacks.length + 1];
System.arraycopy(m_callbacks, 0, newCallbacks, 0, m_callbacks.length);
@@ -212,7 +192,6 @@ public class Dependency extends Dependen
}
}
-
protected void addConstructorInjection(int index) throws ConfigurationException {
m_index = index;
m_usage = new ServiceUsage();
@@ -221,6 +200,7 @@ public class Dependency extends Dependen
/**
* Stop the current dependency.
+ *
* @see org.apache.felix.ipojo.util.DependencyModel#stop()
*/
public synchronized void stop() {
@@ -238,6 +218,7 @@ public class Dependency extends Dependen
/**
* Unfreeze the dependency.
+ *
* @see org.apache.felix.ipojo.util.DependencyModel#unfreeze()
*/
public synchronized void unfreeze() {
@@ -246,13 +227,16 @@ public class Dependency extends Dependen
/**
* Call the bind method.
+ *
* @param pojo : pojo instance on which calling the bind method.
*/
protected void onObjectCreation(Object pojo) {
ServiceReference[] refs;
synchronized (this) {
- if (!m_isStarted) { return; }
+ if (!m_isStarted) {
+ return;
+ }
// We are notified of an instance creation, we have to freeze when the static policy is used
if (getBindingPolicy() == STATIC_BINDING_POLICY) {
@@ -260,7 +244,9 @@ public class Dependency extends Dependen
}
// Check optional case : nullable object case : do not call bind on nullable object
- if (isOptional() && getSize() == 0) { return; }
+ if (isOptional() && getSize() == 0) {
+ return;
+ }
refs = getServiceReferences(); // Stack confinement.
}
@@ -303,6 +289,7 @@ public class Dependency extends Dependen
/**
* Call unbind callback method.
+ *
* @param ref : reference to send (if accepted) to the method
*/
private void callUnbindMethod(ServiceReference ref) {
@@ -317,10 +304,11 @@ public class Dependency extends Dependen
/**
* Helper method calling the given callback.
- * @param callback : callback to call.
- * @param ref : service reference.
+ *
+ * @param callback : callback to call.
+ * @param ref : service reference.
* @param svcObject : the service object
- * @param pojo : pojo on which calling the callback, if null call on each created pojo objects.
+ * @param pojo : pojo on which calling the callback, if null call on each created pojo objects.
*/
private void invokeCallback(DependencyCallback callback, ServiceReference ref, Object svcObject, Object pojo) {
try {
@@ -342,10 +330,11 @@ public class Dependency extends Dependen
}
- /**
- * Call 'modify' method with the service reference in parameter (if accepted).
- * @param ref : the service reference of the modified service
- */
+ /**
+ * Call 'modify' method with the service reference in parameter (if accepted).
+ *
+ * @param ref : the service reference of the modified service
+ */
private void callModifyMethod(ServiceReference ref) {
if (m_handler.getInstanceManager().getState() > InstanceManager.STOPPED && m_handler.getInstanceManager().getPojoObjects() != null) {
for (int i = 0; m_callbacks != null && i < m_callbacks.length; i++) {
@@ -356,9 +345,9 @@ public class Dependency extends Dependen
}
}
-
/**
* Call method with the service reference in parameter (if accepted).
+ *
* @param ref : the service reference of the new service
*/
private void callBindMethod(ServiceReference ref) {
@@ -381,8 +370,32 @@ public class Dependency extends Dependen
}
}
+ private RuntimeException createExceptionToThrow() {
+ final String message = "No service available for " + DependencyHandler.getDependencyIdentifier(this);
+ if (m_exception == null) {
+ // Should never happen, but let's see.
+ return new RuntimeException(message);
+ }
+ try {
+ Class<RuntimeException> exceptionClass = (Class<RuntimeException>) getBundleContext()
+ .getBundle().loadClass(m_exception);
+ // Check constructor
+ final Constructor<RuntimeException> constructor = exceptionClass.getConstructor(new Class[]{String.class});
+ if (constructor != null) {
+ return constructor.newInstance(message);
+ } else {
+ return exceptionClass.newInstance();
+ }
+ } catch (Exception e) {
+ m_handler.getLogger().log(Log.ERROR, "Cannot create the exception object for dependency " +
+ DependencyHandler.getDependencyIdentifier(this) + " : " + e.getMessage(), e);
+ }
+
+ return new RuntimeException(message);
+ }
+
private Object createNullableObject() {
- // To load the proxy we use the POJO class loader. Indeed, this classloader imports iPOJO (so can access to Nullable) and has
+ // To load the proxy we use the POJO class loader. Indeed, this classloader imports iPOJO (so can access to Nullable) and has
// access to the service specification.
try {
ClassLoader cl = new NullableClassLoader(
@@ -390,8 +403,8 @@ public class Dependency extends Dependen
getSpecification().getClassLoader());
m_nullable =
- Proxy.newProxyInstance(cl, new Class[] {
- getSpecification(), Nullable.class }, new NullableObject()); // NOPMD
+ Proxy.newProxyInstance(cl, new Class[]{
+ getSpecification(), Nullable.class}, new NullableObject()); // NOPMD
} catch (NoClassDefFoundError e) {
// A NoClassDefFoundError is thrown if the specification uses a class not accessible by the actual instance.
@@ -410,12 +423,12 @@ public class Dependency extends Dependen
public void start() {
if (isOptional() && !isAggregate()) {
- if (m_di == null) {
+ if (m_di == null && m_exception == null) {
// If nullable are supported, create the nullable object.
if (m_supportNullable) {
createNullableObject();
}
- } else {
+ } else if (m_di != null) {
// Create the default-implementation object.
try {
Class clazz = getHandler().getInstanceManager().getContext().getBundle().loadClass(m_di);
@@ -494,9 +507,9 @@ public class Dependency extends Dependen
return m_isServiceLevelRequirement;
}
-
/**
* A new service has to be injected.
+ *
* @param reference : the new matching service reference.
* @see org.apache.felix.ipojo.util.DependencyModel#onServiceArrival(org.osgi.framework.ServiceReference)
*/
@@ -507,6 +520,7 @@ public class Dependency extends Dependen
/**
* An already injected service is modified.
+ *
* @param reference : the modified service reference.
* @see org.apache.felix.ipojo.util.DependencyModel#onServiceModification(org.osgi.framework.ServiceReference)
*/
@@ -516,6 +530,7 @@ public class Dependency extends Dependen
/**
* A used (already injected) service disappears.
+ *
* @param ref : leaving service reference.
* @see org.apache.felix.ipojo.util.DependencyModel#onServiceDeparture(org.osgi.framework.ServiceReference)
*/
@@ -527,7 +542,8 @@ public class Dependency extends Dependen
* The dependency has been reconfigured.
* Call unbind method and then bind methods. If the dependency cache is not reset,
* the thread continues to get older services.
- * @param departs : no more matching services.
+ *
+ * @param departs : no more matching services.
* @param arrivals : new services
* @see org.apache.felix.ipojo.util.DependencyModel#onDependencyReconfiguration(org.osgi.framework.ServiceReference[], org.osgi.framework.ServiceReference[])
*/
@@ -555,6 +571,7 @@ public class Dependency extends Dependen
/**
* Get the used service references list.
+ *
* @return the used service reference or null if no service reference are available.
*/
public List<ServiceReference> getServiceReferencesAsList() {
@@ -569,12 +586,13 @@ public class Dependency extends Dependen
/**
* Called by the proxy to get service objects to delegate a method.
* On aggregate dependencies, it returns a list.
+ *
* @return a service object or a nullable/default-implementation object.
- * For aggregate dependencies it returns a list or an empty list.
+ * For aggregate dependencies it returns a list or an empty list.
*/
public Object getService() {
// Check that we're in proxy mode.
- if (! m_isProxy) {
+ if (!m_isProxy) {
throw new IllegalStateException("The dependency is not a proxied dependency");
}
@@ -587,7 +605,7 @@ public class Dependency extends Dependen
usage.inc(); // Start the caching, so set the stack level to 1
m_usage.set(usage);
if (isAggregate()) {
- Object obj = usage.m_object;
+ Object obj = usage.m_object;
if (obj instanceof Set) {
List list = new ArrayList();
list.addAll((Set) obj);
@@ -628,7 +646,7 @@ public class Dependency extends Dependen
// Use the copy.
// if the copy is a set, transform to a list
if (isAggregate()) {
- Object obj = usage.m_object;
+ Object obj = usage.m_object;
if (obj instanceof Set) {
List list = new ArrayList();
list.addAll((Set) obj);
@@ -647,9 +665,10 @@ public class Dependency extends Dependen
/**
* This method is called by the replaced code in the component
* implementation class. Construct the service object list is necessary.
- * @param pojo : POJO object.
+ *
+ * @param pojo : POJO object.
* @param fieldName : field
- * @param value : last value.
+ * @param value : last value.
* @return the service object or a nullable / default implementation if defined.
* @see org.apache.felix.ipojo.FieldInterceptor#onGet(java.lang.Object, java.lang.String, java.lang.Object)
*/
@@ -662,7 +681,7 @@ public class Dependency extends Dependen
usage.inc(); // Start the caching, so set the stack level to 1
m_usage.set(usage);
}
- if (! m_isProxy) {
+ if (!m_isProxy) {
return usage.m_object;
} else {
return m_proxyObject;
@@ -670,21 +689,34 @@ public class Dependency extends Dependen
}
-
/**
* Creates the object to store in the given Thread Local.
* This object will be injected inside the POJO field.
+ *
* @param usage : Thread Local to populate.
*/
private void createServiceObject(Usage usage) {
ServiceReference[] refs = getServiceReferences();
- if (! isAggregate()) {
+
+ // manage timeout
+ if (refs == null) {
+ waitForServiceUntilTimeout();
+ }
+
+ refs = getServiceReferences();
+
+ if (!isAggregate()) {
if (refs == null) {
+ if (m_exception != null) {
+ // Throw the exception.
+ throw createExceptionToThrow();
+ }
+
if (m_nullable == null && m_supportNullable) {
m_handler.warn("[" + m_handler.getInstanceManager().getInstanceName() + "] The dependency is not optional, however no service object can be injected in " + m_field + " -> " + getSpecification().getName());
createNullableObject();
}
- usage.m_object = m_nullable; // Add null if the Nullable pattern is disable.
+ usage.m_object = m_nullable; // Add null if the Nullable pattern is disabled.
} else {
ServiceReference ref = getServiceReference();
usage.m_object = getService(ref);
@@ -711,7 +743,7 @@ public class Dependency extends Dependen
if (refs == null) {
usage.m_object = new ArrayList(0); // Create an empty list.
} else {
- // Use a list to store service objects
+ // Use a list to store service objects
List objs = new ArrayList(refs.length);
for (int i = 0; refs != null && i < refs.length; i++) {
ServiceReference ref = refs[i];
@@ -723,7 +755,7 @@ public class Dependency extends Dependen
if (refs == null) {
usage.m_object = new Vector(0); // Create an empty vector.
} else {
- // Use a vector to store service objects
+ // Use a vector to store service objects
Vector objs = new Vector(refs.length);
for (int i = 0; refs != null && i < refs.length; i++) {
ServiceReference ref = refs[i];
@@ -735,7 +767,7 @@ public class Dependency extends Dependen
if (refs == null) {
usage.m_object = new HashSet(0); // Create an empty vector.
} else {
- // Use a vector to store service objects
+ // Use a vector to store service objects
Set objs = new HashSet(refs.length);
for (int i = 0; refs != null && i < refs.length; i++) {
ServiceReference ref = refs[i];
@@ -748,11 +780,34 @@ public class Dependency extends Dependen
}
/**
+ * Waits a service providers. The wait stops when the timeout is reached.
+ */
+ private void waitForServiceUntilTimeout() {
+ // Begin to wait ...
+ long enter = System.currentTimeMillis();
+ boolean exhausted = false;
+ synchronized (this) {
+ while (getServiceReference() == null && !exhausted) {
+ try {
+ wait(1);
+ } catch (InterruptedException e) {
+ // We was interrupted ....
+ } finally {
+ long end = System.currentTimeMillis();
+ exhausted = (end - enter) > m_timeout;
+ }
+ }
+ }
+ // When this method exit, the check will be done...
+ }
+
+ /**
* The field was set.
* This method should not be call if the POJO is written correctly.
- * @param pojo : POJO object
+ *
+ * @param pojo : POJO object
* @param fieldName : field name
- * @param value : set value.
+ * @param value : set value.
* @see org.apache.felix.ipojo.FieldInterceptor#onSet(java.lang.Object, java.lang.String, java.lang.Object)
*/
public void onSet(Object pojo, String fieldName, Object value) {
@@ -761,9 +816,10 @@ public class Dependency extends Dependen
/**
* A POJO method will be invoked.
- * @param pojo : Pojo object
+ *
+ * @param pojo : Pojo object
* @param method : called method
- * @param args : arguments
+ * @param args : arguments
* @see org.apache.felix.ipojo.MethodInterceptor#onEntry(java.lang.Object, java.lang.reflect.Member, java.lang.Object[])
*/
public void onEntry(Object pojo, Member method, Object[] args) {
@@ -780,8 +836,9 @@ public class Dependency extends Dependen
/**
* A POJO method has thrown an error.
* This method does nothing and wait for the finally.
- * @param pojo : POJO object.
- * @param method : Method object.
+ *
+ * @param pojo : POJO object.
+ * @param method : Method object.
* @param throwable : thrown error
* @see org.apache.felix.ipojo.MethodInterceptor#onError(java.lang.Object, java.lang.reflect.Member, java.lang.Throwable)
*/
@@ -791,8 +848,9 @@ public class Dependency extends Dependen
/**
* A POJO method has returned.
- * @param pojo : POJO object.
- * @param method : Method object.
+ *
+ * @param pojo : POJO object.
+ * @param method : Method object.
* @param returnedObj : returned object (null for void method)
* @see org.apache.felix.ipojo.MethodInterceptor#onExit(java.lang.Object, java.lang.reflect.Member, java.lang.Object)
*/
@@ -802,7 +860,8 @@ public class Dependency extends Dependen
/**
* A POJO method is finished.
- * @param pojo : POJO object.
+ *
+ * @param pojo : POJO object.
* @param method : Method object.
* @see org.apache.felix.ipojo.MethodInterceptor#onFinally(java.lang.Object, java.lang.reflect.Member)
*/
@@ -822,6 +881,7 @@ public class Dependency extends Dependen
/**
* Gets true if the dependency use Nullable objects.
+ *
* @return true if the dependency is optional and supports nullable objects.
*/
public boolean supportsNullable() {
@@ -843,6 +903,7 @@ public class Dependency extends Dependen
/**
* Set the type to inject.
* This method set the dependency as aggregate.
+ *
* @param type either list of vector
*/
protected void setType(int type) {
@@ -851,22 +912,84 @@ public class Dependency extends Dependen
}
/**
+ * Sets the dependency timeout.
+ *
+ * @param timeout the timeout in ms.
+ */
+ public void setTimeout(int timeout) {
+ m_timeout = timeout;
+ }
+
+ /**
+ * Gets the constructor parameter.
+ *
+ * @return the index of the constructor parameter,
+ * or <code>-1</code> if not set.
+ */
+ public int getConstructorParameterIndex() {
+ return m_index;
+ }
+
+ /**
+ * Gets the object to inject in the constructor parameter.
+ *
+ * @param index the index of the parameter
+ * @return the created proxy object
+ * @see org.apache.felix.ipojo.ConstructorInjector#getConstructorParameter(int)
+ */
+ public Object getConstructorParameter(int index) {
+ if (m_index == index && m_proxyObject != null) {
+ return m_proxyObject;
+ }
+ return null;
+ }
+
+ /**
+ * Gets the type of the constructor parameter.
+ *
+ * @param index the parameter index
+ * @return the class of the object. For scalar dependency, it's the
+ * specification, for aggregate it depends of the container object:
+ * {@link List} or {@link Set}.
+ * @see org.apache.felix.ipojo.ConstructorInjector#getConstructorParameterType(int)
+ */
+ public Class getConstructorParameterType(int index) {
+ if (m_index == index && m_proxyObject != null) {
+ if (isAggregate()) {
+ switch (m_type) {
+ case DependencyHandler.LIST:
+ return List.class;
+ case DependencyHandler.SET:
+ return Set.class;
+ //TODO We should also manage the Collection type.
+ default:
+ return null; // Should never happen, it was checked before.
+ }
+ } else {
+ return getSpecification();
+ }
+ } else {
+ return null;
+ }
+ }
+
+ /**
* Classloader for nullable objects.
*/
private static class NullableClassLoader extends ClassLoader {
- /**
- * Component classloader.
- */
+ /**
+ * Component classloader.
+ */
private ClassLoader m_component;
-
- /**
- * Specification classloader.
- */
+ /**
+ * Specification classloader.
+ */
private ClassLoader m_specification;
/**
* Creates a NullableClassLoader.
- * @param cmp the component class loader.
+ *
+ * @param cmp the component class loader.
* @param spec the specification class loader.
*/
public NullableClassLoader(ClassLoader cmp, ClassLoader spec) {
@@ -878,6 +1001,7 @@ public class Dependency extends Dependen
* Loads the given class.
* This method uses the classloader of the component class
* and (if not found) the specification classloader.
+ *
* @param name the class name
* @return the class object
* @throws ClassNotFoundException if the class is not found by the two classloaders.
@@ -906,6 +1030,7 @@ public class Dependency extends Dependen
/**
* Creates the proxy classloader.
+ *
* @param parent the handler classloader.
*/
public SmartProxyFactory(ClassLoader parent) {
@@ -915,6 +1040,7 @@ public class Dependency extends Dependen
/**
* Loads a proxy class generated for the given (interface) class.
+ *
* @param clazz the service specification to proxy
* @return the Class object of the proxy.
*/
@@ -931,8 +1057,9 @@ public class Dependency extends Dependen
/**
* Create a proxy object for the given specification. The proxy
* uses the given dependency to get the service object.
+ *
* @param spec the service specification (interface)
- * @param dep the dependency used to get the service
+ * @param dep the dependency used to get the service
* @return the proxy object.
*/
public Object getProxy(Class spec, Dependency dep) {
@@ -940,7 +1067,7 @@ public class Dependency extends Dependen
Class clazz = getProxyClass(getSpecification());
Constructor constructor = clazz.getConstructor(
new Class[]{clazz.getClassLoader().loadClass(Dependency.class.getName())});
- return constructor.newInstance(new Object[] {dep});
+ return constructor.newInstance(new Object[]{dep});
} catch (Throwable e) {
m_handler.error("Cannot create the proxy object", e);
m_handler.getInstanceManager().stop();
@@ -952,6 +1079,7 @@ public class Dependency extends Dependen
* Loads the given class.
* This method uses the classloader of the specification class
* or the handler class loader.
+ *
* @param name the class name
* @return the class object
* @throws ClassNotFoundException if the class is not found by the two classloaders.
@@ -975,12 +1103,10 @@ public class Dependency extends Dependen
* HashCode method.
*/
private Method m_hashCodeMethod;
-
/**
* Equals method.
*/
private Method m_equalsMethod;
-
/**
* toStirng method.
*/
@@ -993,7 +1119,7 @@ public class Dependency extends Dependen
try {
m_hashCodeMethod = Object.class.getMethod("hashCode", null);
m_equalsMethod = Object.class
- .getMethod("equals", new Class[] { Object.class });
+ .getMethod("equals", new Class[]{Object.class});
m_toStringMethod = Object.class.getMethod("toString", null);
} catch (NoSuchMethodException e) {
throw new NoSuchMethodError(e.getMessage());
@@ -1003,22 +1129,24 @@ public class Dependency extends Dependen
/**
* Creates a proxy object for the given specification. The proxy
* uses the given dependency to get the service object.
+ *
* @param spec the service specification (interface)
* @return the proxy object.
*/
public Object getProxy(Class spec) {
return java.lang.reflect.Proxy.newProxyInstance(
getHandler().getInstanceManager().getClazz().getClassLoader(),
- new Class[] {spec},
+ new Class[]{spec},
this);
}
/**
* Invocation Handler delegating invocation on the
* service object.
- * @param proxy the proxy object
+ *
+ * @param proxy the proxy object
* @param method the method
- * @param args the arguments
+ * @param args the arguments
* @return a proxy object.
* @throws Exception if the invocation throws an exception
* @see java.lang.reflect.InvocationHandler#invoke(java.lang.Object, java.lang.reflect.Method, java.lang.Object[])
@@ -1044,51 +1172,4 @@ public class Dependency extends Dependen
}
- /**
- * Gets the constructor parameter.
- * @return the index of the constructor parameter,
- * or <code>-1</code> if not set.
- */
- public int getConstructorParameterIndex() {
- return m_index;
- }
-
- /**
- * Gets the object to inject in the constructor parameter.
- * @param index the index of the parameter
- * @return the created proxy object
- * @see org.apache.felix.ipojo.ConstructorInjector#getConstructorParameter(int)
- */
- public Object getConstructorParameter(int index) {
- if (m_index == index && m_proxyObject != null) {
- return m_proxyObject;
- }
- return null;
- }
-
- /**
- * Gets the type of the constructor parameter.
- * @param index the parameter index
- * @return the class of the object. For scalar dependency, it's the
- * specification, for aggregate it depends of the container object:
- * {@link List} or {@link Set}.
- * @see org.apache.felix.ipojo.ConstructorInjector#getConstructorParameterType(int)
- */
- public Class getConstructorParameterType(int index) {
- if (m_index == index && m_proxyObject != null) {
- if (isAggregate()) {
- switch (m_type) {
- case DependencyHandler.LIST: return List.class;
- case DependencyHandler.SET : return Set.class;
- //TODO We should also manage the Collection type.
- default: return null; // Should never happen, it was checked before.
- }
- } else {
- return getSpecification();
- }
- } else {
- return null;
- }
- }
-
}
Modified: felix/trunk/ipojo/runtime/core/src/main/java/org/apache/felix/ipojo/handlers/dependency/DependencyHandler.java
URL: http://svn.apache.org/viewvc/felix/trunk/ipojo/runtime/core/src/main/java/org/apache/felix/ipojo/handlers/dependency/DependencyHandler.java?rev=1526626&r1=1526625&r2=1526626&view=diff
==============================================================================
--- felix/trunk/ipojo/runtime/core/src/main/java/org/apache/felix/ipojo/handlers/dependency/DependencyHandler.java (original)
+++ felix/trunk/ipojo/runtime/core/src/main/java/org/apache/felix/ipojo/handlers/dependency/DependencyHandler.java Thu Sep 26 17:51:18 2013
@@ -453,6 +453,12 @@ public class DependencyHandler extends P
String opt = dependencyElement.getAttribute("optional");
boolean optional = opt != null && opt.equalsIgnoreCase("true");
String defaultImpl = dependencyElement.getAttribute("default-implementation");
+ String exception = dependencyElement.getAttribute("exception");
+ String to = dependencyElement.getAttribute("timeout");
+ int timeout = 0;
+ if (to != null) {
+ timeout = Integer.parseInt(to);
+ }
String agg = dependencyElement.getAttribute("aggregate");
boolean aggregate = agg != null && agg.equalsIgnoreCase("true");
@@ -477,7 +483,9 @@ public class DependencyHandler extends P
int policy = DependencyMetadataHelper.getPolicy(dependencyElement);
Comparator cmp = DependencyMetadataHelper.getComparator(dependencyElement, getInstanceManager().getGlobalContext());
- Dependency dep = new Dependency(this, field, spec, fil, optional, aggregate, nullable, isProxy, identity, context, policy, cmp, defaultImpl);
+ Dependency dep = new Dependency(this, field, spec, fil, optional, aggregate, nullable, isProxy, identity,
+ context, policy, cmp, defaultImpl, exception);
+ dep.setTimeout(timeout);
// Look for dependency callback :
addCallbacksToDependency(dependencyElement, dep);
Modified: felix/trunk/ipojo/runtime/core/src/main/resources/core.xsd
URL: http://svn.apache.org/viewvc/felix/trunk/ipojo/runtime/core/src/main/resources/core.xsd?rev=1526626&r1=1526625&r2=1526626&view=diff
==============================================================================
--- felix/trunk/ipojo/runtime/core/src/main/resources/core.xsd (original)
+++ felix/trunk/ipojo/runtime/core/src/main/resources/core.xsd Thu Sep 26 17:51:18 2013
@@ -299,6 +299,26 @@
</xs:annotation>
</xs:attribute>
+ <xs:attribute name="exception" type="xs:string" use="optional">
+ <xs:annotation>
+ <xs:documentation>Specifies the exception to throw for an optional service
+ dependency. If no providers are found, iPOJO creates an instance of the
+ exception (with either no parameter or a String parameter as constructor argument), and
+ throws it. The given class name must extends RuntimeException.
+ </xs:documentation>
+ </xs:annotation>
+ </xs:attribute>
+
+ <xs:attribute name="timeout" type="xs:int" use="optional">
+ <xs:annotation>
+ <xs:documentation>Specifies the timeout after which the 'no service policy' is executed
+ (nullable, null, empty collection, exception...). The value is the time in millisecond to
+ wait. -1 is used to indicate an infinite wait, 0 executes the no service policy
+ immediately.
+ </xs:documentation>
+ </xs:annotation>
+ </xs:attribute>
+
<xs:attribute name="from" type="xs:string" use="optional">
<xs:annotation>
<xs:documentation>Specific service provider. The dependency can only be fulfilled by the
Modified: felix/trunk/ipojo/runtime/core/src/test/java/org/apache/felix/ipojo/handlers/dependency/SmartProxyTest.java
URL: http://svn.apache.org/viewvc/felix/trunk/ipojo/runtime/core/src/test/java/org/apache/felix/ipojo/handlers/dependency/SmartProxyTest.java?rev=1526626&r1=1526625&r2=1526626&view=diff
==============================================================================
--- felix/trunk/ipojo/runtime/core/src/test/java/org/apache/felix/ipojo/handlers/dependency/SmartProxyTest.java (original)
+++ felix/trunk/ipojo/runtime/core/src/test/java/org/apache/felix/ipojo/handlers/dependency/SmartProxyTest.java Thu Sep 26 17:51:18 2013
@@ -63,7 +63,7 @@ public class SmartProxyTest extends Test
Mockito.when(handler.getLogger()).thenReturn(logger);
Dependency dependency = new Dependency(handler, "a_field", ArrayList.class, null, false, false, false,
- true, "dep", context, Dependency.DYNAMIC_BINDING_POLICY, null, null);
+ true, "dep", context, Dependency.DYNAMIC_BINDING_POLICY, null, null, null);
dependency.start();
// No service
@@ -73,7 +73,7 @@ public class SmartProxyTest extends Test
// Try with an Object.
dependency = new Dependency(handler, "a_field", Object.class, null, false, false, false,
- true, "dep", context, Dependency.DYNAMIC_BINDING_POLICY, null, null);
+ true, "dep", context, Dependency.DYNAMIC_BINDING_POLICY, null, null, null);
dependency.start();
// OK
Assert.assertNull(dependency.onGet(new Object(), "a_field", null));
@@ -111,7 +111,7 @@ public class SmartProxyTest extends Test
// Try with java.List
Dependency dependency = new Dependency(handler, "a_field", List.class, null, false, false, false,
- true, "dep", context, Dependency.DYNAMIC_BINDING_POLICY, null, null);
+ true, "dep", context, Dependency.DYNAMIC_BINDING_POLICY, null, null, null);
dependency.start();
// OK
@@ -122,7 +122,7 @@ public class SmartProxyTest extends Test
// Try with javax.sql.CommonDataSource
dependency = new Dependency(handler, "a_field", javax.sql.DataSource.class, null, false, false, false,
- true, "dep", context, Dependency.DYNAMIC_BINDING_POLICY, null, null);
+ true, "dep", context, Dependency.DYNAMIC_BINDING_POLICY, null, null, null);
dependency.start();
// OK
Assert.assertNotNull(dependency.onGet(new Object(), "a_field", null));