Merges changes from PennState/SCIMple 2.22.3
diff --git a/scim-server/scim-server-common/src/main/java/org/apache/directory/scim/server/provider/ProviderRegistry.java b/scim-server/scim-server-common/src/main/java/org/apache/directory/scim/server/provider/ProviderRegistry.java
index cf4c8fd..4007db3 100644
--- a/scim-server/scim-server-common/src/main/java/org/apache/directory/scim/server/provider/ProviderRegistry.java
+++ b/scim-server/scim-server-common/src/main/java/org/apache/directory/scim/server/provider/ProviderRegistry.java
@@ -30,6 +30,8 @@
 import java.util.Map;
 import java.util.Set;
 
+import javax.ejb.Lock;
+import javax.ejb.LockType;
 import javax.ejb.Singleton;
 import javax.ejb.Startup;
 import javax.enterprise.inject.Instance;
@@ -99,6 +101,7 @@
 
   private Map<Class<? extends ScimResource>, Instance<? extends Provider<? extends ScimResource>>> providerMap = new HashMap<>();
 
+  @Lock(LockType.WRITE)
   public <T extends ScimResource> void registerProvider(Class<T> clazz, Instance<? extends Provider<T>> providerInstance) throws InvalidProviderException, JsonProcessingException, UnableToRetrieveExtensionsException {
 
     Provider<T> provider = providerInstance.get();
@@ -130,6 +133,8 @@
     providerMap.put(clazz, providerInstance);
   }
 
+  @Deprecated
+  @Lock(LockType.READ)
   @SuppressWarnings("unchecked")
   public <T extends ScimResource> Provider<T> getProvider(Class<T> clazz) {
     Instance<? extends Provider<? extends ScimResource>> providerInstance = providerMap.get(clazz);
@@ -181,13 +186,13 @@
     return resourceType;
   }
 
-  public static Schema generateBaseSchema(Class<?> clazz) throws InvalidProviderException {
+  private static Schema generateBaseSchema(Class<?> clazz) throws InvalidProviderException {
     List<Field> fieldList = ScimUtils.getFieldsUpTo(clazz, BaseResource.class);
 
     return generateSchema(clazz, fieldList);
   }
   
-  public static Schema generateExtensionSchema(Class<?> clazz) throws InvalidProviderException {
+  private static Schema generateExtensionSchema(Class<?> clazz) throws InvalidProviderException {
     log.debug("----> In generateExtensionSchema");
     
     return generateSchema(clazz, ScimUtils.getFieldsUpTo(clazz, Object.class));
diff --git a/scim-server/scim-server-common/src/main/java/org/apache/directory/scim/server/rest/BulkResourceImpl.java b/scim-server/scim-server-common/src/main/java/org/apache/directory/scim/server/rest/BulkResourceImpl.java
index 978954f..7aca970 100644
--- a/scim-server/scim-server-common/src/main/java/org/apache/directory/scim/server/rest/BulkResourceImpl.java
+++ b/scim-server/scim-server-common/src/main/java/org/apache/directory/scim/server/rest/BulkResourceImpl.java
@@ -32,6 +32,7 @@
 
 import javax.ejb.Stateless;
 import javax.enterprise.inject.Instance;
+import javax.enterprise.inject.spi.CDI;
 import javax.inject.Inject;
 import javax.ws.rs.core.Response;
 import javax.ws.rs.core.Response.Status;
diff --git a/scim-server/scim-server-common/src/main/java/org/apache/directory/scim/server/rest/GroupResourceImpl.java b/scim-server/scim-server-common/src/main/java/org/apache/directory/scim/server/rest/GroupResourceImpl.java
index 4d76b79..77e882d 100644
--- a/scim-server/scim-server-common/src/main/java/org/apache/directory/scim/server/rest/GroupResourceImpl.java
+++ b/scim-server/scim-server-common/src/main/java/org/apache/directory/scim/server/rest/GroupResourceImpl.java
@@ -22,21 +22,36 @@
  */
 package org.apache.directory.scim.server.rest;
 
-import javax.inject.Inject;
+import javax.ejb.Stateless;
+import javax.enterprise.inject.Instance;
+import javax.enterprise.inject.spi.CDI;
+import javax.enterprise.util.TypeLiteral;
 
 import org.apache.directory.scim.server.provider.Provider;
-import org.apache.directory.scim.server.provider.ProviderRegistry;
 import org.apache.directory.scim.spec.protocol.GroupResource;
 import org.apache.directory.scim.spec.resources.ScimGroup;
 
+import lombok.extern.slf4j.Slf4j;
+
+@Slf4j
+@Stateless
 public class GroupResourceImpl extends BaseResourceTypeResourceImpl<ScimGroup> implements GroupResource {
 
-  @Inject
-  ProviderRegistry providerRegistry;
+//  @Inject
+////  @ProviderQualifier(ScimGroup.class)
+//  Provider<ScimGroup> provider;
 
   @Override
   public Provider<ScimGroup> getProvider() {
-    return providerRegistry.getProvider(ScimGroup.class);
+    try {
+      final TypeLiteral<Provider<ScimGroup>> typeLiteral = new TypeLiteral<Provider<ScimGroup>>() {
+      };
+      final Instance<Provider<ScimGroup>> select = CDI.current().select(typeLiteral);
+      return select.get();
+    } catch (final Exception e) {
+      log.warn("Provider doesn't exist", e);
+      return null;
+    }
   }
   
 }
diff --git a/scim-server/scim-server-common/src/main/java/org/apache/directory/scim/server/rest/UserResourceImpl.java b/scim-server/scim-server-common/src/main/java/org/apache/directory/scim/server/rest/UserResourceImpl.java
index 7dec691..6b319b3 100644
--- a/scim-server/scim-server-common/src/main/java/org/apache/directory/scim/server/rest/UserResourceImpl.java
+++ b/scim-server/scim-server-common/src/main/java/org/apache/directory/scim/server/rest/UserResourceImpl.java
@@ -23,6 +23,9 @@
 package org.apache.directory.scim.server.rest;
 
 import javax.ejb.Stateless;
+import javax.enterprise.inject.Instance;
+import javax.enterprise.inject.spi.CDI;
+import javax.enterprise.util.TypeLiteral;
 import javax.inject.Inject;
 
 import org.apache.directory.scim.server.provider.Provider;
@@ -30,19 +33,34 @@
 import org.apache.directory.scim.spec.protocol.UserResource;
 import org.apache.directory.scim.spec.resources.ScimUser;
 
+import lombok.extern.slf4j.Slf4j;
+
 /**
  * @author shawn
  *
  */
+@Slf4j
 @Stateless
 public class UserResourceImpl extends BaseResourceTypeResourceImpl<ScimUser> implements UserResource {
 
-  @Inject
-  ProviderRegistry providerRegistry;
-
+//  @Inject
+//  ProviderRegistry providerRegistry;
+//  
+//  @Inject
+////  @ProviderQualifier(ScimUser.class)
+//  Provider<ScimUser> provider;
+  
   @Override
   public Provider<ScimUser> getProvider() {
-    return providerRegistry.getProvider(ScimUser.class);
+    try {
+      TypeLiteral<Provider<ScimUser>> typeLiteral = new TypeLiteral<Provider<ScimUser>>() {
+      };
+      Instance<Provider<ScimUser>> select = CDI.current().select(typeLiteral);
+      return select.get();
+    } catch (Exception e) {
+      log.warn("Provider doesn't exist", e);
+      return null;
+    }
   }
 
 }