/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.apache.syncope.core.rest.cxf.service; import java.net.URI; import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Set; import javax.ws.rs.core.MultivaluedMap; import javax.ws.rs.core.Response; import javax.ws.rs.core.UriBuilder; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.Pair; import org.apache.syncope.common.lib.patch.ResourceDeassociationPatch; import org.apache.syncope.common.lib.to.AnyTO; import org.apache.syncope.common.lib.to.BulkActionResult; import org.apache.syncope.common.lib.to.ConnObjectTO; import org.apache.syncope.common.lib.to.PagedConnObjectTOResult; import org.apache.syncope.common.lib.to.ResourceTO; import org.apache.syncope.common.lib.types.AnyTypeKind; import org.apache.syncope.common.rest.api.RESTHeaders; import org.apache.syncope.common.rest.api.beans.ConnObjectTOListQuery; import org.apache.syncope.common.rest.api.service.ResourceService; import org.apache.syncope.core.logic.AbstractResourceAssociator; import org.apache.syncope.core.logic.AnyObjectLogic; import org.apache.syncope.core.logic.ResourceLogic; import org.apache.syncope.core.logic.GroupLogic; import org.apache.syncope.core.logic.UserLogic; import org.identityconnectors.framework.common.objects.SearchResult; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service public class ResourceServiceImpl extends AbstractServiceImpl implements ResourceService { @Autowired private ResourceLogic logic; @Autowired private AnyObjectLogic anyObjectLogic; @Autowired private UserLogic userLogic; @Autowired private GroupLogic groupLogic; @Override public Response create(final ResourceTO resourceTO) { ResourceTO created = logic.create(resourceTO); URI location = uriInfo.getAbsolutePathBuilder().path(created.getKey()).build(); return Response.created(location). header(RESTHeaders.RESOURCE_KEY, created.getKey()). build(); } @Override public void update(final ResourceTO resourceTO) { logic.update(resourceTO); } @Override public void setLatestSyncToken(final String key, final String anyTypeKey) { logic.setLatestSyncToken(key, anyTypeKey); } @Override public void removeSyncToken(final String key, final String anyTypeKey) { logic.removeSyncToken(key, anyTypeKey); } @Override public void delete(final String key) { logic.delete(key); } @Override public ResourceTO read(final String key) { return logic.read(key); } @Override public List<ResourceTO> list() { return logic.list(); } @Override public ConnObjectTO readConnObject(final String key, final String anyTypeKey, final String anyKey) { return logic.readConnObject(key, anyTypeKey, anyKey); } @Override public PagedConnObjectTOResult listConnObjects( final String key, final String anyTypeKey, final ConnObjectTOListQuery listQuery) { Pair<SearchResult, List<ConnObjectTO>> list = logic.listConnObjects(key, anyTypeKey, listQuery.getSize(), listQuery.getPagedResultsCookie(), getOrderByClauses(listQuery.getOrderBy())); PagedConnObjectTOResult result = new PagedConnObjectTOResult(); if (list.getLeft() != null) { result.setAllResultsReturned(list.getLeft().isAllResultsReturned()); result.setPagedResultsCookie(list.getLeft().getPagedResultsCookie()); result.setRemainingPagedResults(list.getLeft().getRemainingPagedResults()); } result.getResult().addAll(list.getRight()); UriBuilder builder = uriInfo.getAbsolutePathBuilder(); MultivaluedMap<String, String> queryParams = uriInfo.getQueryParameters(); for (Map.Entry<String, List<String>> queryParam : queryParams.entrySet()) { builder = builder.queryParam(queryParam.getKey(), queryParam.getValue().toArray()); } if (StringUtils.isNotBlank(result.getPagedResultsCookie())) { result.setNext(builder. replaceQueryParam(PARAM_CONNID_PAGED_RESULTS_COOKIE, result.getPagedResultsCookie()). build()); } return result; } @Override public void check(final ResourceTO resourceTO) { logic.check(resourceTO); } @Override public BulkActionResult bulkDeassociation(final ResourceDeassociationPatch patch) { AbstractResourceAssociator<? extends AnyTO> associator = patch.getAnyTypeKey().equalsIgnoreCase(AnyTypeKind.USER.name()) ? userLogic : patch.getAnyTypeKey().equalsIgnoreCase(AnyTypeKind.GROUP.name()) ? groupLogic : anyObjectLogic; BulkActionResult result = new BulkActionResult(); for (String anyKey : patch.getAnyKyes()) { Set<String> resources = Collections.singleton(patch.getKey()); try { switch (patch.getAction()) { case DEPROVISION: associator.deprovision(anyKey, resources, isNullPriorityAsync()); break; case UNASSIGN: associator.unassign(anyKey, resources, isNullPriorityAsync()); break; case UNLINK: associator.unlink(anyKey, resources); break; default: } result.getResults().put(anyKey, BulkActionResult.Status.SUCCESS); } catch (Exception e) { LOG.warn("While executing {} on {} {}", patch.getAction(), patch.getAnyTypeKey(), anyKey, e); result.getResults().put(anyKey, BulkActionResult.Status.FAILURE); } } return result; } }