You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@felix.apache.org by ja...@apache.org on 2012/10/25 15:07:38 UTC
svn commit: r1402139 - in /felix/trunk/useradmin: pom.xml
useradmin/src/main/java/org/apache/felix/useradmin/osgi/RoleRepositoryStoreHelper.java
Author: jawi
Date: Thu Oct 25 13:07:37 2012
New Revision: 1402139
URL: http://svn.apache.org/viewvc?rev=1402139&view=rev
Log:
[FELIX-3735] Fixed issue with initialization of repository store; added integration tests to verify this behavior in the future.
Modified:
felix/trunk/useradmin/pom.xml
felix/trunk/useradmin/useradmin/src/main/java/org/apache/felix/useradmin/osgi/RoleRepositoryStoreHelper.java
Modified: felix/trunk/useradmin/pom.xml
URL: http://svn.apache.org/viewvc/felix/trunk/useradmin/pom.xml?rev=1402139&r1=1402138&r2=1402139&view=diff
==============================================================================
--- felix/trunk/useradmin/pom.xml (original)
+++ felix/trunk/useradmin/pom.xml Thu Oct 25 13:07:37 2012
@@ -32,5 +32,6 @@
<module>useradmin</module>
<module>filestore</module>
<module>mongodb</module>
+ <module>itest</module>
</modules>
</project>
Modified: felix/trunk/useradmin/useradmin/src/main/java/org/apache/felix/useradmin/osgi/RoleRepositoryStoreHelper.java
URL: http://svn.apache.org/viewvc/felix/trunk/useradmin/useradmin/src/main/java/org/apache/felix/useradmin/osgi/RoleRepositoryStoreHelper.java?rev=1402139&r1=1402138&r2=1402139&view=diff
==============================================================================
--- felix/trunk/useradmin/useradmin/src/main/java/org/apache/felix/useradmin/osgi/RoleRepositoryStoreHelper.java (original)
+++ felix/trunk/useradmin/useradmin/src/main/java/org/apache/felix/useradmin/osgi/RoleRepositoryStoreHelper.java Thu Oct 25 13:07:37 2012
@@ -17,6 +17,7 @@
package org.apache.felix.useradmin.osgi;
import java.io.IOException;
+import java.util.concurrent.atomic.AtomicBoolean;
import org.apache.felix.useradmin.RoleRepositoryStore;
import org.osgi.framework.BundleContext;
@@ -32,6 +33,8 @@ import org.osgi.util.tracker.ServiceTrac
* </p>
*/
class RoleRepositoryStoreHelper extends ServiceTracker implements RoleRepositoryStore {
+
+ private final AtomicBoolean m_initialized = new AtomicBoolean(false);
/**
* Creates a new {@link RoleRepositoryStoreHelper} instance.
@@ -42,6 +45,17 @@ class RoleRepositoryStoreHelper extends
super(context, RoleRepositoryStore.class.getName(), null /* customizer */);
}
+ public Object addingService(ServiceReference reference) {
+ // FELIX-3735: store can also become available *after* this bundle is started...
+ RoleRepositoryStore store = (RoleRepositoryStore) super.addingService(reference);
+ try {
+ initializeStore(store);
+ } catch (IOException e) {
+ // Ignore; nothing we can do about this here...
+ }
+ return store;
+ }
+
public boolean addRole(Role role) throws IOException {
RoleRepositoryStore store = getStore();
if (store != null) {
@@ -55,7 +69,7 @@ class RoleRepositoryStoreHelper extends
try {
RoleRepositoryStore store = getStore();
if (store != null) {
- store.close();
+ closeStore(store);
}
}
catch (IOException e) {
@@ -64,7 +78,7 @@ class RoleRepositoryStoreHelper extends
super.close();
}
}
-
+
public Role[] getAllRoles() throws IOException {
RoleRepositoryStore store = getStore();
if (store != null) {
@@ -82,23 +96,22 @@ class RoleRepositoryStoreHelper extends
return null;
}
-
+
public void initialize() throws IOException {
RoleRepositoryStore store = getStore();
if (store != null) {
- store.initialize();
+ initializeStore(store);
}
}
public void removedService(ServiceReference reference, Object service) {
RoleRepositoryStore removedStore = (RoleRepositoryStore) service;
try {
- removedStore.close();
+ closeStore(removedStore);
}
catch (IOException e) {
// Ignore; nothing we can do about this here...
}
-
super.removedService(reference, service);
}
@@ -120,4 +133,41 @@ class RoleRepositoryStoreHelper extends
private RoleRepositoryStore getStore() {
return (RoleRepositoryStore) getService();
}
+
+ /**
+ * Closes the given store.
+ *
+ * @param store the store to close, cannot be <code>null</code>.
+ * @throws IOException in case initialization failed.
+ */
+ private void closeStore(RoleRepositoryStore store) throws IOException {
+ // Only close the store if its initialized...
+ boolean initialized = m_initialized.get();
+ if (initialized) {
+ store.close();
+
+ do {
+ initialized = m_initialized.get();
+ } while (!m_initialized.compareAndSet(initialized, false));
+ }
+ }
+
+ /**
+ * Initializes the given store.
+ *
+ * @param store the store to initialize, cannot be <code>null</code>.
+ * @throws IOException in case initialization failed.
+ */
+ private void initializeStore(RoleRepositoryStore store) throws IOException {
+ // FELIX-3735: store can also become available *after* this bundle is started;
+ // hence we need to ensure we do not initialize the store twice...
+ boolean initialized = m_initialized.get();
+ if (!initialized) {
+ store.initialize();
+
+ do {
+ initialized = m_initialized.get();
+ } while (!m_initialized.compareAndSet(initialized, true));
+ }
+ }
}