You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@onami.apache.org by ra...@apache.org on 2013/03/01 21:53:02 UTC
svn commit: r1451714 - in /incubator/onami/trunk: ./ scopes/ scopes/src/
scopes/src/main/ scopes/src/main/java/ scopes/src/main/java/org/
scopes/src/main/java/org/apache/ scopes/src/main/java/org/apache/onami/
scopes/src/main/java/org/apache/onami/scop...
Author: randgalt
Date: Fri Mar 1 20:53:01 2013
New Revision: 1451714
URL: http://svn.apache.org/r1451714
Log:
ONAMI-85
Initial checkin for Onami Scopes extension
Added:
incubator/onami/trunk/scopes/
incubator/onami/trunk/scopes/pom.xml (with props)
incubator/onami/trunk/scopes/src/
incubator/onami/trunk/scopes/src/main/
incubator/onami/trunk/scopes/src/main/java/
incubator/onami/trunk/scopes/src/main/java/org/
incubator/onami/trunk/scopes/src/main/java/org/apache/
incubator/onami/trunk/scopes/src/main/java/org/apache/onami/
incubator/onami/trunk/scopes/src/main/java/org/apache/onami/scopes/
incubator/onami/trunk/scopes/src/main/java/org/apache/onami/scopes/ConcurrentLazySingleton.java (with props)
incubator/onami/trunk/scopes/src/main/java/org/apache/onami/scopes/ConcurrentLazySingletonScope.java (with props)
incubator/onami/trunk/scopes/src/main/java/org/apache/onami/scopes/ConcurrentLazySingletonScopeImpl.java (with props)
incubator/onami/trunk/scopes/src/main/java/org/apache/onami/scopes/LazySingleton.java (with props)
incubator/onami/trunk/scopes/src/main/java/org/apache/onami/scopes/LazySingletonScope.java (with props)
incubator/onami/trunk/scopes/src/main/java/org/apache/onami/scopes/LazySingletonScopeImpl.java (with props)
incubator/onami/trunk/scopes/src/main/java/org/apache/onami/scopes/ScopesModule.java (with props)
incubator/onami/trunk/scopes/src/test/
incubator/onami/trunk/scopes/src/test/java/
incubator/onami/trunk/scopes/src/test/java/org/
incubator/onami/trunk/scopes/src/test/java/org/apache/
incubator/onami/trunk/scopes/src/test/java/org/apache/onami/
incubator/onami/trunk/scopes/src/test/java/org/apache/onami/scopes/
incubator/onami/trunk/scopes/src/test/java/org/apache/onami/scopes/AnnotatedConcurrentLazySingletonObject.java (with props)
incubator/onami/trunk/scopes/src/test/java/org/apache/onami/scopes/AnnotatedLazySingletonObject.java (with props)
incubator/onami/trunk/scopes/src/test/java/org/apache/onami/scopes/AnnotatedLazySingletonObjectAlt.java (with props)
incubator/onami/trunk/scopes/src/test/java/org/apache/onami/scopes/LazySingletonObject.java (with props)
incubator/onami/trunk/scopes/src/test/java/org/apache/onami/scopes/TestConcurrentLazySingleton.java (with props)
incubator/onami/trunk/scopes/src/test/java/org/apache/onami/scopes/TestLazySingleton.java (with props)
Modified:
incubator/onami/trunk/pom.xml
Modified: incubator/onami/trunk/pom.xml
URL: http://svn.apache.org/viewvc/incubator/onami/trunk/pom.xml?rev=1451714&r1=1451713&r2=1451714&view=diff
==============================================================================
--- incubator/onami/trunk/pom.xml (original)
+++ incubator/onami/trunk/pom.xml Fri Mar 1 20:53:01 2013
@@ -1,5 +1,4 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
+<?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
@@ -17,7 +16,8 @@
| 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">
+<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>
<groupId>org.apache.onami</groupId>
@@ -46,6 +46,7 @@
<module>spi</module>
<module>test</module>
<module>validation</module>
+ <module>scopes</module>
</modules>
<build>
Added: incubator/onami/trunk/scopes/pom.xml
URL: http://svn.apache.org/viewvc/incubator/onami/trunk/scopes/pom.xml?rev=1451714&view=auto
==============================================================================
--- incubator/onami/trunk/scopes/pom.xml (added)
+++ incubator/onami/trunk/scopes/pom.xml Fri Mar 1 20:53:01 2013
@@ -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/xsd/maven-4.0.0.xsd">
+ <parent>
+ <groupId>org.apache.onami</groupId>
+ <artifactId>org.apache.onami.parent</artifactId>
+ <version>2-incubating</version>
+ </parent>
+ <modelVersion>4.0.0</modelVersion>
+
+ <artifactId>org.apache.onami.scopes</artifactId>
+ <version>1.0.0-incubating-SNAPSHOT</version>
+
+ <description>Apache Onami-Scopes adds useful Scopes to Google Guice</description>
+
+ <dependencies>
+ <dependency>
+ <groupId>com.google.inject</groupId>
+ <artifactId>guice</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.onami</groupId>
+ <artifactId>org.apache.onami.lifecycle</artifactId>
+ <version>0.2.0-incubating-SNAPSHOT</version>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.onami</groupId>
+ <artifactId>org.apache.onami.test</artifactId>
+ <version>1.4.0-incubating</version>
+ <scope>test</scope>
+ </dependency>
+ </dependencies>
+</project>
Propchange: incubator/onami/trunk/scopes/pom.xml
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/onami/trunk/scopes/pom.xml
------------------------------------------------------------------------------
svn:keywords = Date Revision Author HeadURL Id
Propchange: incubator/onami/trunk/scopes/pom.xml
------------------------------------------------------------------------------
svn:mime-type = text/xml
Added: incubator/onami/trunk/scopes/src/main/java/org/apache/onami/scopes/ConcurrentLazySingleton.java
URL: http://svn.apache.org/viewvc/incubator/onami/trunk/scopes/src/main/java/org/apache/onami/scopes/ConcurrentLazySingleton.java?rev=1451714&view=auto
==============================================================================
--- incubator/onami/trunk/scopes/src/main/java/org/apache/onami/scopes/ConcurrentLazySingleton.java (added)
+++ incubator/onami/trunk/scopes/src/main/java/org/apache/onami/scopes/ConcurrentLazySingleton.java Fri Mar 1 20:53:01 2013
@@ -0,0 +1,43 @@
+package org.apache.onami.scopes;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import com.google.inject.ScopeAnnotation;
+import com.google.inject.Scopes;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Same as {@link LazySingleton} with the addition of allowing for more
+ * concurrency. The various {@link Scopes#SINGLETON} based scopes have
+ * a major concurrency restriction due to a blunt synchronization (see
+ * the comment inside of the Guice code). This version synchronizes
+ * on the object key and, thus, can construct multiple types of singletons
+ * concurrently.
+ */
+@Target({ ElementType.TYPE, ElementType.METHOD })
+@Retention(RetentionPolicy.RUNTIME)
+@ScopeAnnotation
+public @interface ConcurrentLazySingleton
+{
+}
Propchange: incubator/onami/trunk/scopes/src/main/java/org/apache/onami/scopes/ConcurrentLazySingleton.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/onami/trunk/scopes/src/main/java/org/apache/onami/scopes/ConcurrentLazySingleton.java
------------------------------------------------------------------------------
svn:keywords = Date Author Id Revision HeadURL
Propchange: incubator/onami/trunk/scopes/src/main/java/org/apache/onami/scopes/ConcurrentLazySingleton.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: incubator/onami/trunk/scopes/src/main/java/org/apache/onami/scopes/ConcurrentLazySingletonScope.java
URL: http://svn.apache.org/viewvc/incubator/onami/trunk/scopes/src/main/java/org/apache/onami/scopes/ConcurrentLazySingletonScope.java?rev=1451714&view=auto
==============================================================================
--- incubator/onami/trunk/scopes/src/main/java/org/apache/onami/scopes/ConcurrentLazySingletonScope.java (added)
+++ incubator/onami/trunk/scopes/src/main/java/org/apache/onami/scopes/ConcurrentLazySingletonScope.java Fri Mar 1 20:53:01 2013
@@ -0,0 +1,42 @@
+package org.apache.onami.scopes;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import com.google.inject.Scope;
+
+/**
+ * A singleton factory that returns a Guice {@link Scope} that enables concurrent lazy singletons.
+ *
+ * @see ConcurrentLazySingleton
+ */
+public class ConcurrentLazySingletonScope
+{
+ private static final Scope instance = new ConcurrentLazySingletonScopeImpl();
+
+ /**
+ * Returns the scope
+ *
+ * @return scope
+ */
+ public static Scope get()
+ {
+ return instance;
+ }
+}
Propchange: incubator/onami/trunk/scopes/src/main/java/org/apache/onami/scopes/ConcurrentLazySingletonScope.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/onami/trunk/scopes/src/main/java/org/apache/onami/scopes/ConcurrentLazySingletonScope.java
------------------------------------------------------------------------------
svn:keywords = Date Author Id Revision HeadURL
Propchange: incubator/onami/trunk/scopes/src/main/java/org/apache/onami/scopes/ConcurrentLazySingletonScope.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: incubator/onami/trunk/scopes/src/main/java/org/apache/onami/scopes/ConcurrentLazySingletonScopeImpl.java
URL: http://svn.apache.org/viewvc/incubator/onami/trunk/scopes/src/main/java/org/apache/onami/scopes/ConcurrentLazySingletonScopeImpl.java?rev=1451714&view=auto
==============================================================================
--- incubator/onami/trunk/scopes/src/main/java/org/apache/onami/scopes/ConcurrentLazySingletonScopeImpl.java (added)
+++ incubator/onami/trunk/scopes/src/main/java/org/apache/onami/scopes/ConcurrentLazySingletonScopeImpl.java Fri Mar 1 20:53:01 2013
@@ -0,0 +1,143 @@
+package org.apache.onami.scopes;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import com.google.inject.Key;
+import com.google.inject.Provider;
+import com.google.inject.ProvisionException;
+import com.google.inject.Scope;
+import com.google.inject.internal.CircularDependencyProxy;
+
+import java.util.HashMap;
+import java.util.Map;
+
+class ConcurrentLazySingletonScopeImpl
+ implements Scope
+{
+ private static final Object NULL = new Object();
+
+ private static final Map<Key<?>, LockRecord> locks = new HashMap<Key<?>, LockRecord>();
+
+ private static class LockRecord
+ {
+ private final Object lock = new Object();
+
+ private int useCount = 0;
+ }
+
+ public <T> Provider<T> scope( final Key<T> key, final Provider<T> creator )
+ {
+ return new Provider<T>()
+ {
+ /*
+ * The lazily initialized singleton instance. Once set, this will either have type T or will
+ * be equal to NULL.
+ */
+ private volatile Object instance;
+
+ // DCL on a volatile is safe as of Java 5, which we obviously require.
+ @SuppressWarnings("DoubleCheckedLocking")
+ public T get()
+ {
+ if ( instance == null )
+ {
+ try
+ {
+ final Object lock = getLock( key );
+ //noinspection SynchronizationOnLocalVariableOrMethodParameter
+ synchronized ( lock )
+ {
+ if ( instance == null )
+ {
+ T provided = creator.get();
+
+ // don't remember proxies; these exist only to serve circular dependencies
+ if ( provided instanceof CircularDependencyProxy )
+ {
+ return provided;
+ }
+
+ Object providedOrSentinel = ( provided == null ) ? NULL : provided;
+ if ( ( instance != null ) && ( instance != providedOrSentinel ) )
+ {
+ throw new ProvisionException( "Provider was reentrant while creating a singleton" );
+ }
+
+ instance = providedOrSentinel;
+ }
+ }
+ }
+ finally
+ {
+ releaseLock( key );
+ }
+ }
+
+ Object localInstance = instance;
+ // This is safe because instance has type T or is equal to NULL
+ @SuppressWarnings({ "unchecked", "UnnecessaryLocalVariable" }) T returnedInstance =
+ ( localInstance != NULL ) ? (T) localInstance : null;
+ return returnedInstance;
+ }
+
+ public String toString()
+ {
+ return String.format( "%s[%s]", creator, instance );
+ }
+ };
+ }
+
+ @SuppressWarnings("SynchronizationOnLocalVariableOrMethodParameter")
+ private Object getLock( Key<?> key )
+ {
+ synchronized ( locks )
+ {
+ LockRecord lock = locks.get( key );
+ if ( lock == null )
+ {
+ lock = new LockRecord();
+ locks.put( key, lock );
+ }
+ ++lock.useCount;
+ return lock.lock;
+ }
+ }
+
+ private void releaseLock( Key<?> key )
+ {
+ synchronized ( locks )
+ {
+ LockRecord lock = locks.get( key );
+ if ( lock != null )
+ {
+ if ( --lock.useCount <= 0 )
+ {
+ locks.remove( key );
+ }
+ }
+ }
+ }
+
+ @Override
+ public String toString()
+ {
+ return "ConcurrentLazySingletonScope.SCOPE";
+ }
+}
Propchange: incubator/onami/trunk/scopes/src/main/java/org/apache/onami/scopes/ConcurrentLazySingletonScopeImpl.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/onami/trunk/scopes/src/main/java/org/apache/onami/scopes/ConcurrentLazySingletonScopeImpl.java
------------------------------------------------------------------------------
svn:keywords = Date Author Id Revision HeadURL
Propchange: incubator/onami/trunk/scopes/src/main/java/org/apache/onami/scopes/ConcurrentLazySingletonScopeImpl.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: incubator/onami/trunk/scopes/src/main/java/org/apache/onami/scopes/LazySingleton.java
URL: http://svn.apache.org/viewvc/incubator/onami/trunk/scopes/src/main/java/org/apache/onami/scopes/LazySingleton.java?rev=1451714&view=auto
==============================================================================
--- incubator/onami/trunk/scopes/src/main/java/org/apache/onami/scopes/LazySingleton.java (added)
+++ incubator/onami/trunk/scopes/src/main/java/org/apache/onami/scopes/LazySingleton.java Fri Mar 1 20:53:01 2013
@@ -0,0 +1,38 @@
+package org.apache.onami.scopes;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import com.google.inject.ScopeAnnotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Scope annotation that marks a class as singleton that should NOT be
+ * allocated eagerly
+ */
+@Target({ ElementType.TYPE, ElementType.METHOD })
+@Retention(RetentionPolicy.RUNTIME)
+@ScopeAnnotation
+public @interface LazySingleton
+{
+}
Propchange: incubator/onami/trunk/scopes/src/main/java/org/apache/onami/scopes/LazySingleton.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/onami/trunk/scopes/src/main/java/org/apache/onami/scopes/LazySingleton.java
------------------------------------------------------------------------------
svn:keywords = Date Author Id Revision HeadURL
Propchange: incubator/onami/trunk/scopes/src/main/java/org/apache/onami/scopes/LazySingleton.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: incubator/onami/trunk/scopes/src/main/java/org/apache/onami/scopes/LazySingletonScope.java
URL: http://svn.apache.org/viewvc/incubator/onami/trunk/scopes/src/main/java/org/apache/onami/scopes/LazySingletonScope.java?rev=1451714&view=auto
==============================================================================
--- incubator/onami/trunk/scopes/src/main/java/org/apache/onami/scopes/LazySingletonScope.java (added)
+++ incubator/onami/trunk/scopes/src/main/java/org/apache/onami/scopes/LazySingletonScope.java Fri Mar 1 20:53:01 2013
@@ -0,0 +1,44 @@
+package org.apache.onami.scopes;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import com.google.inject.Scope;
+
+/**
+ * A singleton factory that returns a Guice {@link Scope} that enables lazy singletons
+ */
+public class LazySingletonScope
+{
+ /**
+ * Returns the scope
+ *
+ * @return scope
+ */
+ public static Scope get()
+ {
+ return instance;
+ }
+
+ private static final Scope instance = new LazySingletonScopeImpl();
+
+ private LazySingletonScope()
+ {
+ }
+}
Propchange: incubator/onami/trunk/scopes/src/main/java/org/apache/onami/scopes/LazySingletonScope.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/onami/trunk/scopes/src/main/java/org/apache/onami/scopes/LazySingletonScope.java
------------------------------------------------------------------------------
svn:keywords = Date Author Id Revision HeadURL
Propchange: incubator/onami/trunk/scopes/src/main/java/org/apache/onami/scopes/LazySingletonScope.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: incubator/onami/trunk/scopes/src/main/java/org/apache/onami/scopes/LazySingletonScopeImpl.java
URL: http://svn.apache.org/viewvc/incubator/onami/trunk/scopes/src/main/java/org/apache/onami/scopes/LazySingletonScopeImpl.java?rev=1451714&view=auto
==============================================================================
--- incubator/onami/trunk/scopes/src/main/java/org/apache/onami/scopes/LazySingletonScopeImpl.java (added)
+++ incubator/onami/trunk/scopes/src/main/java/org/apache/onami/scopes/LazySingletonScopeImpl.java Fri Mar 1 20:53:01 2013
@@ -0,0 +1,37 @@
+package org.apache.onami.scopes;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import com.google.inject.Key;
+import com.google.inject.Provider;
+import com.google.inject.Scope;
+import com.google.inject.Scopes;
+
+/**
+ * A Guice {@link Scope} that enables lazy singletons
+ */
+final class LazySingletonScopeImpl
+ implements Scope
+{
+ public <T> Provider<T> scope( Key<T> key, Provider<T> unscoped )
+ {
+ return Scopes.SINGLETON.scope( key, unscoped );
+ }
+}
Propchange: incubator/onami/trunk/scopes/src/main/java/org/apache/onami/scopes/LazySingletonScopeImpl.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/onami/trunk/scopes/src/main/java/org/apache/onami/scopes/LazySingletonScopeImpl.java
------------------------------------------------------------------------------
svn:keywords = Date Author Id Revision HeadURL
Propchange: incubator/onami/trunk/scopes/src/main/java/org/apache/onami/scopes/LazySingletonScopeImpl.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: incubator/onami/trunk/scopes/src/main/java/org/apache/onami/scopes/ScopesModule.java
URL: http://svn.apache.org/viewvc/incubator/onami/trunk/scopes/src/main/java/org/apache/onami/scopes/ScopesModule.java?rev=1451714&view=auto
==============================================================================
--- incubator/onami/trunk/scopes/src/main/java/org/apache/onami/scopes/ScopesModule.java (added)
+++ incubator/onami/trunk/scopes/src/main/java/org/apache/onami/scopes/ScopesModule.java Fri Mar 1 20:53:01 2013
@@ -0,0 +1,36 @@
+package org.apache.onami.scopes;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import com.google.inject.AbstractModule;
+
+/**
+ * Guice module to register scopes.
+ */
+public class ScopesModule
+ extends AbstractModule
+{
+ @Override
+ protected void configure()
+ {
+ bindScope( LazySingleton.class, LazySingletonScope.get() );
+ bindScope( ConcurrentLazySingleton.class, ConcurrentLazySingletonScope.get() );
+ }
+}
Propchange: incubator/onami/trunk/scopes/src/main/java/org/apache/onami/scopes/ScopesModule.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/onami/trunk/scopes/src/main/java/org/apache/onami/scopes/ScopesModule.java
------------------------------------------------------------------------------
svn:keywords = Date Author Id Revision HeadURL
Propchange: incubator/onami/trunk/scopes/src/main/java/org/apache/onami/scopes/ScopesModule.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: incubator/onami/trunk/scopes/src/test/java/org/apache/onami/scopes/AnnotatedConcurrentLazySingletonObject.java
URL: http://svn.apache.org/viewvc/incubator/onami/trunk/scopes/src/test/java/org/apache/onami/scopes/AnnotatedConcurrentLazySingletonObject.java?rev=1451714&view=auto
==============================================================================
--- incubator/onami/trunk/scopes/src/test/java/org/apache/onami/scopes/AnnotatedConcurrentLazySingletonObject.java (added)
+++ incubator/onami/trunk/scopes/src/test/java/org/apache/onami/scopes/AnnotatedConcurrentLazySingletonObject.java Fri Mar 1 20:53:01 2013
@@ -0,0 +1,43 @@
+package org.apache.onami.scopes;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import org.apache.onami.lifecycle.AfterInjection;
+
+import java.util.concurrent.atomic.AtomicInteger;
+
+@ConcurrentLazySingleton
+public class AnnotatedConcurrentLazySingletonObject
+{
+ public static final AtomicInteger constructorCount = new AtomicInteger( 0 );
+
+ public static final AtomicInteger postConstructCount = new AtomicInteger( 0 );
+
+ public AnnotatedConcurrentLazySingletonObject()
+ {
+ constructorCount.incrementAndGet();
+ }
+
+ @AfterInjection
+ public void postConstruct()
+ {
+ postConstructCount.incrementAndGet();
+ }
+}
Propchange: incubator/onami/trunk/scopes/src/test/java/org/apache/onami/scopes/AnnotatedConcurrentLazySingletonObject.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/onami/trunk/scopes/src/test/java/org/apache/onami/scopes/AnnotatedConcurrentLazySingletonObject.java
------------------------------------------------------------------------------
svn:keywords = Date Author Id Revision HeadURL
Propchange: incubator/onami/trunk/scopes/src/test/java/org/apache/onami/scopes/AnnotatedConcurrentLazySingletonObject.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: incubator/onami/trunk/scopes/src/test/java/org/apache/onami/scopes/AnnotatedLazySingletonObject.java
URL: http://svn.apache.org/viewvc/incubator/onami/trunk/scopes/src/test/java/org/apache/onami/scopes/AnnotatedLazySingletonObject.java?rev=1451714&view=auto
==============================================================================
--- incubator/onami/trunk/scopes/src/test/java/org/apache/onami/scopes/AnnotatedLazySingletonObject.java (added)
+++ incubator/onami/trunk/scopes/src/test/java/org/apache/onami/scopes/AnnotatedLazySingletonObject.java Fri Mar 1 20:53:01 2013
@@ -0,0 +1,43 @@
+package org.apache.onami.scopes;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import org.apache.onami.lifecycle.AfterInjection;
+
+import java.util.concurrent.atomic.AtomicInteger;
+
+@LazySingleton
+public class AnnotatedLazySingletonObject
+{
+ public static final AtomicInteger constructorCount = new AtomicInteger( 0 );
+
+ public static final AtomicInteger postConstructCount = new AtomicInteger( 0 );
+
+ public AnnotatedLazySingletonObject()
+ {
+ constructorCount.incrementAndGet();
+ }
+
+ @AfterInjection
+ public void postConstruct()
+ {
+ postConstructCount.incrementAndGet();
+ }
+}
Propchange: incubator/onami/trunk/scopes/src/test/java/org/apache/onami/scopes/AnnotatedLazySingletonObject.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/onami/trunk/scopes/src/test/java/org/apache/onami/scopes/AnnotatedLazySingletonObject.java
------------------------------------------------------------------------------
svn:keywords = Date Author Id Revision HeadURL
Propchange: incubator/onami/trunk/scopes/src/test/java/org/apache/onami/scopes/AnnotatedLazySingletonObject.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: incubator/onami/trunk/scopes/src/test/java/org/apache/onami/scopes/AnnotatedLazySingletonObjectAlt.java
URL: http://svn.apache.org/viewvc/incubator/onami/trunk/scopes/src/test/java/org/apache/onami/scopes/AnnotatedLazySingletonObjectAlt.java?rev=1451714&view=auto
==============================================================================
--- incubator/onami/trunk/scopes/src/test/java/org/apache/onami/scopes/AnnotatedLazySingletonObjectAlt.java (added)
+++ incubator/onami/trunk/scopes/src/test/java/org/apache/onami/scopes/AnnotatedLazySingletonObjectAlt.java Fri Mar 1 20:53:01 2013
@@ -0,0 +1,42 @@
+package org.apache.onami.scopes;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import javax.annotation.PostConstruct;
+import java.util.concurrent.atomic.AtomicInteger;
+
+@LazySingleton
+public class AnnotatedLazySingletonObjectAlt
+{
+ public static final AtomicInteger constructorCount = new AtomicInteger( 0 );
+
+ public static final AtomicInteger postConstructCount = new AtomicInteger( 0 );
+
+ public AnnotatedLazySingletonObjectAlt()
+ {
+ constructorCount.incrementAndGet();
+ }
+
+ @PostConstruct
+ public void postConstruct()
+ {
+ postConstructCount.incrementAndGet();
+ }
+}
Propchange: incubator/onami/trunk/scopes/src/test/java/org/apache/onami/scopes/AnnotatedLazySingletonObjectAlt.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/onami/trunk/scopes/src/test/java/org/apache/onami/scopes/AnnotatedLazySingletonObjectAlt.java
------------------------------------------------------------------------------
svn:keywords = Date Author Id Revision HeadURL
Propchange: incubator/onami/trunk/scopes/src/test/java/org/apache/onami/scopes/AnnotatedLazySingletonObjectAlt.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: incubator/onami/trunk/scopes/src/test/java/org/apache/onami/scopes/LazySingletonObject.java
URL: http://svn.apache.org/viewvc/incubator/onami/trunk/scopes/src/test/java/org/apache/onami/scopes/LazySingletonObject.java?rev=1451714&view=auto
==============================================================================
--- incubator/onami/trunk/scopes/src/test/java/org/apache/onami/scopes/LazySingletonObject.java (added)
+++ incubator/onami/trunk/scopes/src/test/java/org/apache/onami/scopes/LazySingletonObject.java Fri Mar 1 20:53:01 2013
@@ -0,0 +1,42 @@
+package org.apache.onami.scopes;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import org.apache.onami.lifecycle.AfterInjection;
+
+import java.util.concurrent.atomic.AtomicInteger;
+
+public class LazySingletonObject
+{
+ public static final AtomicInteger constructorCount = new AtomicInteger( 0 );
+
+ public static final AtomicInteger postConstructCount = new AtomicInteger( 0 );
+
+ public LazySingletonObject()
+ {
+ constructorCount.incrementAndGet();
+ }
+
+ @AfterInjection
+ public void postConstruct()
+ {
+ postConstructCount.incrementAndGet();
+ }
+}
Propchange: incubator/onami/trunk/scopes/src/test/java/org/apache/onami/scopes/LazySingletonObject.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/onami/trunk/scopes/src/test/java/org/apache/onami/scopes/LazySingletonObject.java
------------------------------------------------------------------------------
svn:keywords = Date Author Id Revision HeadURL
Propchange: incubator/onami/trunk/scopes/src/test/java/org/apache/onami/scopes/LazySingletonObject.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: incubator/onami/trunk/scopes/src/test/java/org/apache/onami/scopes/TestConcurrentLazySingleton.java
URL: http://svn.apache.org/viewvc/incubator/onami/trunk/scopes/src/test/java/org/apache/onami/scopes/TestConcurrentLazySingleton.java?rev=1451714&view=auto
==============================================================================
--- incubator/onami/trunk/scopes/src/test/java/org/apache/onami/scopes/TestConcurrentLazySingleton.java (added)
+++ incubator/onami/trunk/scopes/src/test/java/org/apache/onami/scopes/TestConcurrentLazySingleton.java Fri Mar 1 20:53:01 2013
@@ -0,0 +1,134 @@
+package org.apache.onami.scopes;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import com.google.inject.Guice;
+import com.google.inject.Inject;
+import com.google.inject.Injector;
+import com.google.inject.Provider;
+import org.apache.onami.lifecycle.AfterInjectionModule;
+import org.apache.onami.test.OnamiRunner;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.concurrent.Callable;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.Executors;
+
+@RunWith(OnamiRunner.class)
+public class TestConcurrentLazySingleton
+{
+ public static class InjectedAnnotatedProvider
+ {
+ public final Provider<AnnotatedConcurrentLazySingletonObject> provider;
+
+ @Inject
+ public InjectedAnnotatedProvider( Provider<AnnotatedConcurrentLazySingletonObject> provider )
+ {
+ this.provider = provider;
+ }
+ }
+
+ @Before
+ public void setup()
+ {
+ AnnotatedConcurrentLazySingletonObject.constructorCount.set( 0 );
+ AnnotatedConcurrentLazySingletonObject.postConstructCount.set( 0 );
+ LazySingletonObject.constructorCount.set( 0 );
+ LazySingletonObject.postConstructCount.set( 0 );
+ }
+
+ @ConcurrentLazySingleton
+ public static class DeadLockTester
+ {
+ @Inject
+ public DeadLockTester( final Injector injector )
+ throws InterruptedException
+ {
+ final CountDownLatch latch = new CountDownLatch( 1 );
+ Executors.newSingleThreadExecutor().submit( new Callable<Object>()
+ {
+ public Object call()
+ throws Exception
+ {
+ injector.getInstance( AnnotatedConcurrentLazySingletonObject.class );
+ latch.countDown();
+ return null;
+ }
+ } );
+ latch.await();
+ }
+ }
+
+ @Test
+ public void testDeadLock()
+ throws InterruptedException
+ {
+ Injector injector = Guice.createInjector( new ScopesModule() );
+ injector.getInstance( DeadLockTester.class ); // if ConcurrentLazySingleton is not used, this line will deadlock
+ Assert.assertEquals( AnnotatedConcurrentLazySingletonObject.constructorCount.get(), 1 );
+ }
+
+ @Test
+ public void testUsingAnnotation()
+ {
+ Injector injector = Guice.createInjector( new AfterInjectionModule(), new ScopesModule() );
+
+ Assert.assertEquals( AnnotatedConcurrentLazySingletonObject.constructorCount.get(), 0 );
+ Assert.assertEquals( AnnotatedConcurrentLazySingletonObject.postConstructCount.get(), 0 );
+
+ AnnotatedConcurrentLazySingletonObject instance =
+ injector.getInstance( AnnotatedConcurrentLazySingletonObject.class );
+ Assert.assertEquals( AnnotatedConcurrentLazySingletonObject.constructorCount.get(), 1 );
+ Assert.assertEquals( AnnotatedConcurrentLazySingletonObject.postConstructCount.get(), 1 );
+
+ AnnotatedConcurrentLazySingletonObject instance2 =
+ injector.getInstance( AnnotatedConcurrentLazySingletonObject.class );
+ Assert.assertEquals( AnnotatedConcurrentLazySingletonObject.constructorCount.get(), 1 );
+ Assert.assertEquals( AnnotatedConcurrentLazySingletonObject.postConstructCount.get(), 1 );
+
+ Assert.assertSame( instance, instance2 );
+ }
+
+ @Test
+ public void testUsingInWithProviderAndAnnotation()
+ {
+ Injector injector = Guice.createInjector( new AfterInjectionModule(), new ScopesModule() );
+
+ Assert.assertEquals( AnnotatedConcurrentLazySingletonObject.constructorCount.get(), 0 );
+ Assert.assertEquals( AnnotatedConcurrentLazySingletonObject.postConstructCount.get(), 0 );
+
+ InjectedAnnotatedProvider injectedProvider = injector.getInstance( InjectedAnnotatedProvider.class );
+ Assert.assertEquals( AnnotatedConcurrentLazySingletonObject.constructorCount.get(), 0 );
+ Assert.assertEquals( AnnotatedConcurrentLazySingletonObject.postConstructCount.get(), 0 );
+
+ AnnotatedConcurrentLazySingletonObject instance = injectedProvider.provider.get();
+ Assert.assertEquals( AnnotatedConcurrentLazySingletonObject.constructorCount.get(), 1 );
+ Assert.assertEquals( AnnotatedConcurrentLazySingletonObject.postConstructCount.get(), 1 );
+
+ AnnotatedConcurrentLazySingletonObject instance2 = injectedProvider.provider.get();
+ Assert.assertEquals( AnnotatedConcurrentLazySingletonObject.constructorCount.get(), 1 );
+ Assert.assertEquals( AnnotatedConcurrentLazySingletonObject.postConstructCount.get(), 1 );
+
+ Assert.assertSame( instance, instance2 );
+ }
+}
Propchange: incubator/onami/trunk/scopes/src/test/java/org/apache/onami/scopes/TestConcurrentLazySingleton.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/onami/trunk/scopes/src/test/java/org/apache/onami/scopes/TestConcurrentLazySingleton.java
------------------------------------------------------------------------------
svn:keywords = Date Author Id Revision HeadURL
Propchange: incubator/onami/trunk/scopes/src/test/java/org/apache/onami/scopes/TestConcurrentLazySingleton.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: incubator/onami/trunk/scopes/src/test/java/org/apache/onami/scopes/TestLazySingleton.java
URL: http://svn.apache.org/viewvc/incubator/onami/trunk/scopes/src/test/java/org/apache/onami/scopes/TestLazySingleton.java?rev=1451714&view=auto
==============================================================================
--- incubator/onami/trunk/scopes/src/test/java/org/apache/onami/scopes/TestLazySingleton.java (added)
+++ incubator/onami/trunk/scopes/src/test/java/org/apache/onami/scopes/TestLazySingleton.java Fri Mar 1 20:53:01 2013
@@ -0,0 +1,166 @@
+package org.apache.onami.scopes;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import com.google.inject.Binder;
+import com.google.inject.Guice;
+import com.google.inject.Inject;
+import com.google.inject.Injector;
+import com.google.inject.Module;
+import com.google.inject.Provider;
+import org.apache.onami.lifecycle.AfterInjectionModule;
+import org.apache.onami.test.OnamiRunner;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(OnamiRunner.class)
+public class TestLazySingleton
+{
+ public static class InjectedProvider
+ {
+ public final Provider<LazySingletonObject> provider;
+
+ @Inject
+ public InjectedProvider( Provider<LazySingletonObject> provider )
+ {
+ this.provider = provider;
+ }
+ }
+
+ public static class InjectedAnnotatedProvider
+ {
+ public final Provider<AnnotatedLazySingletonObject> provider;
+
+ @Inject
+ public InjectedAnnotatedProvider( Provider<AnnotatedLazySingletonObject> provider )
+ {
+ this.provider = provider;
+ }
+ }
+
+ @Before
+ public void setup()
+ {
+ AnnotatedLazySingletonObject.constructorCount.set( 0 );
+ AnnotatedLazySingletonObject.postConstructCount.set( 0 );
+ LazySingletonObject.constructorCount.set( 0 );
+ LazySingletonObject.postConstructCount.set( 0 );
+ }
+
+ @Test
+ public void testUsingAnnotation()
+ {
+ Injector injector = Guice.createInjector( new AfterInjectionModule(), new ScopesModule() );
+
+ Assert.assertEquals( AnnotatedLazySingletonObject.constructorCount.get(), 0 );
+ Assert.assertEquals( AnnotatedLazySingletonObject.postConstructCount.get(), 0 );
+
+ AnnotatedLazySingletonObject instance = injector.getInstance( AnnotatedLazySingletonObject.class );
+ Assert.assertEquals( AnnotatedLazySingletonObject.constructorCount.get(), 1 );
+ Assert.assertEquals( AnnotatedLazySingletonObject.postConstructCount.get(), 1 );
+
+ AnnotatedLazySingletonObject instance2 = injector.getInstance( AnnotatedLazySingletonObject.class );
+ Assert.assertEquals( AnnotatedLazySingletonObject.constructorCount.get(), 1 );
+ Assert.assertEquals( AnnotatedLazySingletonObject.postConstructCount.get(), 1 );
+
+ Assert.assertSame( instance, instance2 );
+ }
+
+ @Test
+ public void testUsingInWithProviderAndAnnotation()
+ {
+ Injector injector = Guice.createInjector( new AfterInjectionModule(), new ScopesModule() );
+
+ Assert.assertEquals( AnnotatedLazySingletonObject.constructorCount.get(), 0 );
+ Assert.assertEquals( AnnotatedLazySingletonObject.postConstructCount.get(), 0 );
+
+ InjectedAnnotatedProvider injectedProvider = injector.getInstance( InjectedAnnotatedProvider.class );
+ Assert.assertEquals( AnnotatedLazySingletonObject.constructorCount.get(), 0 );
+ Assert.assertEquals( AnnotatedLazySingletonObject.postConstructCount.get(), 0 );
+
+ AnnotatedLazySingletonObject instance = injectedProvider.provider.get();
+ Assert.assertEquals( AnnotatedLazySingletonObject.constructorCount.get(), 1 );
+ Assert.assertEquals( AnnotatedLazySingletonObject.postConstructCount.get(), 1 );
+
+ AnnotatedLazySingletonObject instance2 = injectedProvider.provider.get();
+ Assert.assertEquals( AnnotatedLazySingletonObject.constructorCount.get(), 1 );
+ Assert.assertEquals( AnnotatedLazySingletonObject.postConstructCount.get(), 1 );
+
+ Assert.assertSame( instance, instance2 );
+ }
+
+ @Test
+ public void testUsingIn()
+ {
+ Module module = new Module()
+ {
+ public void configure( Binder binder )
+ {
+ binder.bind( LazySingletonObject.class ).in( LazySingletonScope.get() );
+ }
+ };
+ Injector injector = Guice.createInjector( new AfterInjectionModule(), new ScopesModule(), module );
+
+ Assert.assertEquals( LazySingletonObject.constructorCount.get(), 0 );
+ Assert.assertEquals( LazySingletonObject.postConstructCount.get(), 0 );
+
+ LazySingletonObject instance = injector.getInstance( LazySingletonObject.class );
+ Assert.assertEquals( LazySingletonObject.constructorCount.get(), 1 );
+ Assert.assertEquals( LazySingletonObject.postConstructCount.get(), 1 );
+
+ LazySingletonObject instance2 = injector.getInstance( LazySingletonObject.class );
+ Assert.assertEquals( LazySingletonObject.constructorCount.get(), 1 );
+ Assert.assertEquals( LazySingletonObject.postConstructCount.get(), 1 );
+
+ Assert.assertSame( instance, instance2 );
+ }
+
+ @Test
+ public void testUsingInWithProvider()
+ {
+ Module module = new Module()
+ {
+ public void configure( Binder binder )
+ {
+ binder.bind( LazySingletonObject.class ).in( LazySingletonScope.get() );
+ }
+ };
+ Injector injector = Guice.createInjector( new AfterInjectionModule(), new ScopesModule(), module );
+
+ Assert.assertEquals( LazySingletonObject.constructorCount.get(), 0 );
+ Assert.assertEquals( LazySingletonObject.postConstructCount.get(), 0 );
+
+ InjectedProvider injectedProvider = injector.getInstance( InjectedProvider.class );
+ Assert.assertEquals( LazySingletonObject.constructorCount.get(), 0 );
+ Assert.assertEquals( LazySingletonObject.postConstructCount.get(), 0 );
+
+ LazySingletonObject instance = injectedProvider.provider.get();
+ Assert.assertEquals( LazySingletonObject.constructorCount.get(), 1 );
+ Assert.assertEquals( LazySingletonObject.postConstructCount.get(), 1 );
+
+ LazySingletonObject instance2 = injectedProvider.provider.get();
+ Assert.assertEquals( LazySingletonObject.constructorCount.get(), 1 );
+ Assert.assertEquals( LazySingletonObject.postConstructCount.get(), 1 );
+
+ Assert.assertSame( instance, instance2 );
+ }
+}
Propchange: incubator/onami/trunk/scopes/src/test/java/org/apache/onami/scopes/TestLazySingleton.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/onami/trunk/scopes/src/test/java/org/apache/onami/scopes/TestLazySingleton.java
------------------------------------------------------------------------------
svn:keywords = Date Author Id Revision HeadURL
Propchange: incubator/onami/trunk/scopes/src/test/java/org/apache/onami/scopes/TestLazySingleton.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Re: OK - I've done a bunch of checkins
Posted by Simone Tripodi <si...@apache.org>.
Hi Jordan
> Onami-us-west (me) has done several checkins - notably the initial code for the scopes module. I want to fix the other reported issues but I thought I'd wait to make sure I haven't made any mistakes with these initial checkins.
this is simply GREAT - that is the physical sign, to me, that we are
now all working under the same umbrella!!! :)
> P.S. What code-review tool do we use? I have another scope I'd like to add but I'd like it reviewed first. Should I just continue with patch files?
No more need for patches, just checkin code by yourself - having an
SCM to review code is useful to fix any possible mistake.
In the parent pom there is configured checkstyle, just create the site
using `mvn site` and have a look at the generated report.
Have a nice weekend, all the best!
-Simo
http://people.apache.org/~simonetripodi/
http://simonetripodi.livejournal.com/
http://twitter.com/simonetripodi
http://www.99soft.org/
OK - I've done a bunch of checkins
Posted by Jordan Zimmerman <jo...@jordanzimmerman.com>.
Onami-us-west (me) has done several checkins - notably the initial code for the scopes module. I want to fix the other reported issues but I thought I'd wait to make sure I haven't made any mistakes with these initial checkins.
-Jordan
P.S. What code-review tool do we use? I have another scope I'd like to add but I'd like it reviewed first. Should I just continue with patch files?