package com.adobe.acs.commons.users.impl; import com.adobe.granite.jmx.annotation.AnnotatedStandardMBean; import org.apache.commons.lang.StringUtils; import org.apache.felix.scr.annotations.*; import org.apache.sling.commons.osgi.PropertiesUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.management.DynamicMBean; import javax.management.NotCompliantMBeanException; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; @Component @Properties({ @Property( label = "MBean Name", name = "jmx.objectname", value = "com.adobe.acs.commons:type=Ensure Service User", propertyPrivate = true ) }) @References({ @Reference( referenceInterface = EnsureServiceUser.class, policy = ReferencePolicy.DYNAMIC, cardinality = ReferenceCardinality.OPTIONAL_MULTIPLE) }) @Service(value = DynamicMBean.class) public class EnsureServiceUserManagerImpl extends AnnotatedStandardMBean implements EnsureServiceUserManager { private final Logger log = LoggerFactory.getLogger(EnsureServiceUserManagerImpl.class); private Map<String, EnsureServiceUser> ensureServiceUsers = new ConcurrentHashMap<String, EnsureServiceUser>(); public EnsureServiceUserManagerImpl() throws NotCompliantMBeanException { super(EnsureServiceUserManager.class); } @Override public final void ensureAll() { for (final EnsureServiceUser ensureServiceUser: ensureServiceUsers.values()) { try { ensureServiceUser.ensure(ensureServiceUser.getOperation(), ensureServiceUser.getServiceUser()); } catch (EnsureServiceUserException e) { log.error("Error Ensuring Service User [ {} ]", ensureServiceUser.getServiceUser().getPrincipalName(), e); } } } @Override public final void ensurePrincipalName(String principalName) { for (final EnsureServiceUser ensureServiceUser: ensureServiceUsers.values()) { if (StringUtils.equals(principalName, ensureServiceUser.getServiceUser().getPrincipalName())) { try { ensureServiceUser.ensure(ensureServiceUser.getOperation(), ensureServiceUser.getServiceUser()); } catch (EnsureServiceUserException e) { log.error("Error Ensuring Service User [ {} ]", ensureServiceUser.getServiceUser().getPrincipalName(), e); } } } } protected final void bindEnsureServiceUser(final EnsureServiceUser service, final Map<Object, Object> props) { final String type = PropertiesUtil.toString(props.get("service.pid"), null); if (type != null) { this.ensureServiceUsers.put(type, service); } } protected final void unbindEnsureServiceUser(final EnsureServiceUser service, final Map<Object, Object> props) { final String type = PropertiesUtil.toString(props.get("service.pid"), null); if (type != null) { this.ensureServiceUsers.remove(type); } } }