/** * Copyright (C) 2011 BonitaSoft S.A. * BonitaSoft, 32 rue Gustave Eiffel - 38000 Grenoble * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2.0 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package org.bonitasoft.web.rest.server.datastore.organization; import org.bonitasoft.engine.api.IdentityAPI; import org.bonitasoft.engine.api.TenantAPIAccessor; import org.bonitasoft.engine.exception.AlreadyExistsException; import org.bonitasoft.engine.exception.BonitaHomeNotSetException; import org.bonitasoft.engine.exception.ServerAPIException; import org.bonitasoft.engine.exception.UnknownAPITypeException; import org.bonitasoft.engine.identity.UserMembership; import org.bonitasoft.engine.identity.UserMembershipCriterion; import org.bonitasoft.engine.session.APISession; import org.bonitasoft.engine.session.InvalidSessionException; import org.bonitasoft.web.rest.model.identity.MembershipItem; import org.bonitasoft.web.rest.server.datastore.CommonDatastore; import org.bonitasoft.web.rest.server.framework.api.DatastoreHasAdd; import org.bonitasoft.web.rest.server.framework.api.DatastoreHasDelete; import org.bonitasoft.web.rest.server.framework.api.DatastoreHasSearch; import org.bonitasoft.web.rest.server.framework.search.ItemSearchResult; import org.bonitasoft.web.toolkit.client.common.exception.api.APIException; import org.bonitasoft.web.toolkit.client.common.exception.api.APIForbiddenException; import org.bonitasoft.web.toolkit.client.common.i18n._; import org.bonitasoft.web.toolkit.client.common.util.MapUtil; import org.bonitasoft.web.toolkit.client.data.APIID; import java.util.List; import java.util.Map; import static org.bonitasoft.web.rest.server.framework.utils.SearchOptionsBuilderUtil.computeIndex; /** * @author Séverin Moussel */ public class MembershipDatastore extends CommonDatastore<MembershipItem, UserMembership> implements DatastoreHasAdd<MembershipItem>, DatastoreHasSearch<MembershipItem>, DatastoreHasDelete { public MembershipDatastore(final APISession engineSession) { super(engineSession); } /** * @return * @throws InvalidSessionException * @throws BonitaHomeNotSetException * @throws ServerAPIException * @throws UnknownAPITypeException */ private IdentityAPI getIdentityAPI() throws InvalidSessionException, BonitaHomeNotSetException, ServerAPIException, UnknownAPITypeException { return TenantAPIAccessor.getIdentityAPI(getEngineSession()); } // ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // CONVERT // ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// @Override protected MembershipItem convertEngineToConsoleItem(final UserMembership item) { final MembershipItem result = new MembershipItem(); result.setUserId(item.getUserId()); result.setRoleId(item.getRoleId()); result.setGroupId(item.getGroupId()); result.setAssignedByUserId(item.getAssignedBy()); result.setAssignedDate(item.getAssignedDate()); return result; } // ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // CRUDS // ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// @Override public void delete(final List<APIID> ids) { try { for (final APIID id : ids) { getIdentityAPI().deleteUserMembership(id.getPartAsLong(0), id.getPartAsLong(1), id.getPartAsLong(2)); } } catch (final Exception e) { throw new APIException(e); } } @Override public ItemSearchResult<MembershipItem> search(final int page, final int resultsByPage, final String search, final String orders, final Map<String, String> filters) { try { Long userId = MapUtil.getValueAsLong(filters, MembershipItem.ATTRIBUTE_USER_ID); // Get results final List<UserMembership> engineItems = getIdentityAPI().getUserMemberships( userId, computeIndex(page, resultsByPage), resultsByPage, UserMembershipCriterion.valueOf(orders)); // Convert results final List<MembershipItem> consoleSearchResults = convertEngineToConsoleItemsList( engineItems); // Get total results final long total = getIdentityAPI().getNumberOfUserMemberships(MapUtil.getValueAsLong(filters, MembershipItem.ATTRIBUTE_USER_ID)); // Return search object return new ItemSearchResult<MembershipItem>( page, resultsByPage, total, consoleSearchResults); } catch (final Exception e) { throw new APIException(e); } } @Override public MembershipItem add(final MembershipItem item) { try { return convertEngineToConsoleItem(getIdentityAPI() .addUserMembership(item.getUserId().toLong(), item.getGroupId().toLong(), item.getRoleId().toLong())); } catch (AlreadyExistsException e) { throw new APIForbiddenException(new _("This membership is already added to user"), e); } catch (final Exception e) { throw new APIException(e); } } }