/*
* oxAuth is available under the MIT License (2008). See http://opensource.org/licenses/MIT for full text.
*
* Copyright (c) 2014, Gluu
*/
package org.xdi.oxauth.service.uma;
import java.util.Collections;
import java.util.List;
import javax.ejb.Stateless;
import javax.inject.Inject;
import javax.inject.Named;
import org.apache.commons.lang.StringUtils;
import org.gluu.site.ldap.persistence.LdapEntryManager;
import org.slf4j.Logger;
import org.xdi.ldap.model.SimpleBranch;
import org.xdi.oxauth.model.config.StaticConfiguration;
import org.xdi.oxauth.model.error.ErrorResponseFactory;
import org.xdi.oxauth.model.uma.persistence.ResourceSet;
import org.xdi.util.StringHelper;
import com.google.common.base.Preconditions;
import com.unboundid.ldap.sdk.Filter;
/**
* Provides operations with resource set descriptions
*
* @author Yuriy Movchan
* @author Yuriy Zabrovarnyy
* Date: 10.05.2012
*/
@Stateless
@Named
public class ResourceSetService {
@Inject
private Logger log;
@Inject
private LdapEntryManager ldapEntryManager;
@Inject
private ErrorResponseFactory errorResponseFactory;
@Inject
private StaticConfiguration staticConfiguration;
public void addBranch() {
SimpleBranch branch = new SimpleBranch();
branch.setOrganizationalUnitName("uma_resource_sets");
branch.setDn(getDnForResourceSet(null));
ldapEntryManager.persist(branch);
}
/**
* Add new resource set description entry
*
* @param resourceSet resourceSet
*/
public void addResourceSet(ResourceSet resourceSet) {
validate(resourceSet);
ldapEntryManager.persist(resourceSet);
}
public void validate(ResourceSet resourceSet) {
Preconditions.checkArgument(StringUtils.isNotBlank(resourceSet.getName()), "Name is required for resource set.");
Preconditions.checkArgument(resourceSet.getScopes() != null && !resourceSet.getScopes().isEmpty(), "Scope must be specified for resource set.");
prepareResourceSetsBranch();
}
/**
* Update resource set description entry
*
* @param resourceSet resourceSet
*/
public void updateResourceSet(ResourceSet resourceSet) {
validate(resourceSet);
ldapEntryManager.merge(resourceSet);
}
/**
* Remove resource set description entry
*
* @param resourceSet resourceSet
*/
public void remove(ResourceSet resourceSet) {
ldapEntryManager.remove(resourceSet);
}
/**
* Remove resource set description entry by ID.
*
* @param rsid resourceSet ID
*/
public void remove(String rsid) {
ldapEntryManager.remove(getResourceSetById(rsid));
}
public void remove(List<ResourceSet> resourceSet) {
for (ResourceSet resource : resourceSet) {
remove(resource);
}
}
/**
* Get all resource set descriptions
*
* @return List of resource set descriptions
*/
public List<ResourceSet> getAllResourceSets(String... ldapReturnAttributes) {
return ldapEntryManager.findEntries(getBaseDnForResourceSet(), ResourceSet.class, ldapReturnAttributes, null);
}
/**
* Get all resource set descriptions
*
* @return List of resource set descriptions
*/
public List<ResourceSet> getResourceSetsByAssociatedClient(String p_associatedClientDn) {
try {
prepareResourceSetsBranch();
if (StringUtils.isNotBlank(p_associatedClientDn)) {
final Filter filter = Filter.create(String.format("&(oxAssociatedClient=%s)", p_associatedClientDn));
return ldapEntryManager.findEntries(getBaseDnForResourceSet(), ResourceSet.class, filter);
}
} catch (Exception e) {
log.error(e.getMessage(), e);
}
return Collections.emptyList();
}
/**
* Get resource set descriptions by example
*
* @param resourceSet ResourceSet
* @return ResourceSet which conform example
*/
public List<ResourceSet> findResourceSets(ResourceSet resourceSet) {
return ldapEntryManager.findEntries(resourceSet);
}
public boolean containsBranch() {
return ldapEntryManager.contains(SimpleBranch.class, getDnForResourceSet(null));
}
/**
* Check if LDAP server contains resource set description with specified attributes
*
* @return True if resource set description with specified attributes exist
*/
public boolean containsResourceSet(ResourceSet resourceSet) {
return ldapEntryManager.contains(resourceSet);
}
public ResourceSet getResourceSetById(String id) {
prepareResourceSetsBranch();
ResourceSet ldapResourceSet = new ResourceSet();
ldapResourceSet.setDn(getBaseDnForResourceSet());
ldapResourceSet.setId(id);
final List<ResourceSet> result = findResourceSets(ldapResourceSet);
if (result.size() == 0) {
log.error("Failed to find resource set with id: " + id);
errorResponseFactory.throwUmaNotFoundException();
} else if (result.size() > 1) {
log.error("Multiple resource sets found with given id: " + id);
errorResponseFactory.throwUmaInternalErrorException();
}
return result.get(0);
}
private void prepareResourceSetsBranch() {
// Create resource set description branch if needed
if (!containsBranch()) {
addBranch();
}
}
/**
* Get resource set description by DN
*
* @param dn Resource set description DN
* @return Resource set description
*/
public ResourceSet getResourceSetByDn(String dn) {
return ldapEntryManager.find(ResourceSet.class, dn);
}
/**
* Build DN string for resource set description
*/
public String getDnForResourceSet(String oxId) {
if (StringHelper.isEmpty(oxId)) {
return getBaseDnForResourceSet();
}
return String.format("oxId=%s,%s", oxId, getBaseDnForResourceSet());
}
public String getBaseDnForResourceSet() {
final String umaBaseDn = staticConfiguration.getBaseDn().getUmaBase(); // "ou=uma,o=@!1111,o=gluu"
return String.format("ou=resource_sets,%s", umaBaseDn);
}
}