class RoleMappingServiceImpl implements RoleMappingService, PostConstruct {

	@Override
	public void initialize(SecurityConfiguration securityServiceConfiguration) {
		if (InitializationState.NOT_INITIALIZED != initialized) {
			return;
		}
		try {
			// Get the Role Mapping Service configuration
			config = (org.glassfish.security.services.config.RoleMappingService) securityServiceConfiguration;
			if (config != null) {
				// Get the role mapping provider configuration
				// Consider only one provider for now and take the first provider found!
				List<SecurityProvider> providersConfig = config.getSecurityProviders();
				SecurityProvider roleProviderConfig = null;
				if (providersConfig != null) roleProviderConfig = providersConfig.get(0);
				if (roleProviderConfig != null) {
					// Get the provider
					String providerName = roleProviderConfig.getName();
					if (isDebug()) {
						logger.log(DEBUG_LEVEL, "Attempting to get Role Mapping Provider \"{0}\".", providerName );
					}
					provider = AccessController.doPrivileged(
					        new PrivilegedLookup<RoleMappingProvider>(serviceLocator, RoleMappingProvider.class, providerName) );    
							
					if (provider == null) {
						throw new IllegalStateException(localStrings.getLocalString("service.role.not_provider",
								"Role Mapping Provider {0} not found.", providerName));
					}

					// Initialize the provider
					provider.initialize(roleProviderConfig);

					// Service setup complete
					initialized = InitializationState.SUCCESS_INIT;
					reasonInitFailed = null;

					// Log initialized
					logger.log(Level.INFO, ROLEMAPSVC_INITIALIZED);
				}
			}
		} catch (Exception e) {
			String eMsg = e.getMessage();
			String eClass = e.getClass().getName();
			reasonInitFailed = localStrings.getLocalString("service.role.init_failed",
					"Role Mapping Service initialization failed, exception {0}, message {1}", eClass, eMsg);
			logger.log(Level.WARNING, ROLEMAPSVC_INIT_FAILED, new Object[] {eClass, eMsg});
			throw new RuntimeException(reasonInitFailed, e);
		} finally {
			if (InitializationState.SUCCESS_INIT != initialized) {
				initialized = InitializationState.FAILED_INIT;
			}
		}
	}

}