/* * Copyright (c) 2015 EMC Corporation * All Rights Reserved */ package com.emc.sa.model.dao; import java.net.URI; import java.util.List; import java.util.Map; import java.util.Set; import com.emc.storageos.db.client.constraint.NamedElementQueryResultList.NamedElement; import com.emc.storageos.db.client.model.DataObject; import com.emc.storageos.db.client.model.DataObjectWithACLs; import com.emc.storageos.db.client.model.StringSet; import com.emc.storageos.db.exceptions.DatabaseException; import com.emc.storageos.security.authentication.StorageOSUser; import com.emc.storageos.security.authorization.PermissionsKey; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import org.apache.commons.lang.StringUtils; public class BaseModelFinder<T extends DataObject> { protected DBClientWrapper client; protected Class<T> clazz; public BaseModelFinder(Class<T> clazz, DBClientWrapper client) { this.clazz = clazz; this.client = client; } protected List<URI> toURIs(StringSet in) { List<URI> out = Lists.newArrayList(); if (in != null) { for (String s : in) { out.add(URI.create(s)); } } return out; } protected List<URI> toURIs(List<NamedElement> namedElements) { List<URI> out = Lists.newArrayList(); if (namedElements != null) { for (NamedElement namedElement : namedElements) { out.add(namedElement.getId()); } } return out; } public <T extends DataObjectWithACLs> Map<URI, Set<String>> findPermissions(Class<T> type, StorageOSUser user, URI tenantId) { return findPermissions(type, user, tenantId, null); } public <T extends DataObjectWithACLs> Map<URI, Set<String>> findPermissions(Class<T> type, StorageOSUser user, URI tenantId, final Set<String> filterBy) { final Map<URI, Set<String>> permissionsMap = Maps.newHashMap(); if (user == null) { throw new IllegalArgumentException("StorageOSUser can not be null"); } if (tenantId == null) { throw new IllegalArgumentException("Tenant URI can not be null"); } try { PermissionsKey userKey = new PermissionsKey(PermissionsKey.Type.SID, user.getName(), tenantId); Map<URI, Set<String>> userPermissions = client.findByPermission(type, userKey, filterBy); if (userPermissions != null && userPermissions.isEmpty() == false) { permissionsMap.putAll(userPermissions); } if (user.getGroups() != null) { for (String group : user.getGroups()) { PermissionsKey groupKey = new PermissionsKey(PermissionsKey.Type.GROUP, group, tenantId); Map<URI, Set<String>> groupPermissions = client.findByPermission(type, groupKey, filterBy); if (groupPermissions != null && groupPermissions.isEmpty() == false) { permissionsMap.putAll(groupPermissions); } } } } catch (DatabaseException ex) { throw new DataAccessException(ex); } return permissionsMap; } public T findById(URI id) throws DataAccessException { if (id != null) { return client.findById(clazz, id); } return null; } public T findById(String id) throws DataAccessException { if (StringUtils.isNotBlank(id)) { return findById(URI.create(id)); } return null; } /** * Finds by IDs and filters out inactive. Note that the number of results could be less than IDs requested. * * @param ids IDs of records to query * @return * @throws DataAccessException */ public List<T> findByIds(List<URI> ids) throws DataAccessException { if (ids != null) { return active(client.findByIds(clazz, ids)); } return Lists.newArrayList(); } public List<T> findByIds(StringSet ids) throws DataAccessException { return findByIds(toURIs(ids)); } public static <T extends DataObject> List<T> active(List<T> unfiltered) { List<T> filtered = Lists.newArrayList(); for (T item : unfiltered) { if (item.getInactive() == null || !item.getInactive()) { filtered.add(item); } } return filtered; } }