Search in sources :

Example 11 with OrderByClause

use of org.apache.syncope.core.persistence.api.dao.search.OrderByClause in project syncope by apache.

the class GroupServiceImpl method replace.

@Override
public Response replace(final String id, final SCIMGroup group) {
    if (!id.equals(group.getId())) {
        throw new BadRequestException(ErrorType.invalidPath, "Expected " + id + ", found " + group.getId());
    }
    ResponseBuilder builder = checkETag(Resource.Group, id);
    if (builder != null) {
        return builder.build();
    }
    // save current group members
    Set<String> beforeMembers = new HashSet<>();
    MembershipCond membCond = new MembershipCond();
    membCond.setGroup(id);
    SearchCond searchCond = SearchCond.getLeafCond(membCond);
    int count = userLogic().search(searchCond, 1, 1, Collections.<OrderByClause>emptyList(), SyncopeConstants.ROOT_REALM, false).getLeft();
    for (int page = 1; page <= (count / AnyDAO.DEFAULT_PAGE_SIZE) + 1; page++) {
        beforeMembers.addAll(userLogic().search(searchCond, page, AnyDAO.DEFAULT_PAGE_SIZE, Collections.<OrderByClause>emptyList(), SyncopeConstants.ROOT_REALM, false).getRight().stream().map(EntityTO::getKey).collect(Collectors.toSet()));
    }
    // update group, don't change members
    ProvisioningResult<GroupTO> result = groupLogic().update(AnyOperations.diff(binder().toGroupTO(group), groupLogic().read(id), false), false);
    // assign new members
    Set<String> afterMembers = new HashSet<>();
    group.getMembers().forEach(member -> {
        afterMembers.add(member.getValue());
        if (!beforeMembers.contains(member.getValue())) {
            UserPatch patch = new UserPatch();
            patch.setKey(member.getValue());
            patch.getMemberships().add(new MembershipPatch.Builder().operation(PatchOperation.ADD_REPLACE).group(result.getEntity().getKey()).build());
            try {
                userLogic().update(patch, false);
            } catch (Exception e) {
                LOG.error("While setting membership of {} to {}", result.getEntity().getKey(), member.getValue(), e);
            }
        }
    });
    // remove unconfirmed members
    beforeMembers.stream().filter(member -> !afterMembers.contains(member)).forEach(user -> {
        UserPatch patch = new UserPatch();
        patch.setKey(user);
        patch.getMemberships().add(new MembershipPatch.Builder().operation(PatchOperation.DELETE).group(result.getEntity().getKey()).build());
        try {
            userLogic().update(patch, false);
        } catch (Exception e) {
            LOG.error("While removing membership of {} from {}", result.getEntity().getKey(), user, e);
        }
    });
    return updateResponse(result.getEntity().getKey(), binder().toSCIMGroup(result.getEntity(), uriInfo.getAbsolutePathBuilder().path(result.getEntity().getKey()).build().toASCIIString(), Collections.<String>emptyList(), Collections.<String>emptyList()));
}
Also used : Arrays(java.util.Arrays) BadRequestException(org.apache.syncope.ext.scimv2.api.BadRequestException) ErrorType(org.apache.syncope.ext.scimv2.api.type.ErrorType) OrderByClause(org.apache.syncope.core.persistence.api.dao.search.OrderByClause) ArrayUtils(org.apache.commons.lang3.ArrayUtils) UserPatch(org.apache.syncope.common.lib.patch.UserPatch) ProvisioningResult(org.apache.syncope.common.lib.to.ProvisioningResult) StringUtils(org.apache.commons.lang3.StringUtils) HashSet(java.util.HashSet) MembershipPatch(org.apache.syncope.common.lib.patch.MembershipPatch) EntityTO(org.apache.syncope.common.lib.to.EntityTO) SortOrder(org.apache.syncope.ext.scimv2.api.type.SortOrder) ListResponse(org.apache.syncope.ext.scimv2.api.data.ListResponse) ResponseBuilder(javax.ws.rs.core.Response.ResponseBuilder) SyncopeConstants(org.apache.syncope.common.lib.SyncopeConstants) SCIMGroup(org.apache.syncope.ext.scimv2.api.data.SCIMGroup) SearchCond(org.apache.syncope.core.persistence.api.dao.search.SearchCond) Set(java.util.Set) GroupTO(org.apache.syncope.common.lib.to.GroupTO) Collectors(java.util.stream.Collectors) Resource(org.apache.syncope.ext.scimv2.api.type.Resource) Response(javax.ws.rs.core.Response) AnyDAO(org.apache.syncope.core.persistence.api.dao.AnyDAO) PatchOperation(org.apache.syncope.common.lib.types.PatchOperation) SCIMSearchRequest(org.apache.syncope.ext.scimv2.api.data.SCIMSearchRequest) Member(org.apache.syncope.ext.scimv2.api.data.Member) GroupService(org.apache.syncope.ext.scimv2.api.service.GroupService) MembershipCond(org.apache.syncope.core.persistence.api.dao.search.MembershipCond) Collections(java.util.Collections) AnyOperations(org.apache.syncope.common.lib.AnyOperations) ResponseBuilder(javax.ws.rs.core.Response.ResponseBuilder) MembershipCond(org.apache.syncope.core.persistence.api.dao.search.MembershipCond) UserPatch(org.apache.syncope.common.lib.patch.UserPatch) BadRequestException(org.apache.syncope.ext.scimv2.api.BadRequestException) GroupTO(org.apache.syncope.common.lib.to.GroupTO) EntityTO(org.apache.syncope.common.lib.to.EntityTO) OrderByClause(org.apache.syncope.core.persistence.api.dao.search.OrderByClause) BadRequestException(org.apache.syncope.ext.scimv2.api.BadRequestException) SearchCond(org.apache.syncope.core.persistence.api.dao.search.SearchCond) ResponseBuilder(javax.ws.rs.core.Response.ResponseBuilder) HashSet(java.util.HashSet)

Example 12 with OrderByClause

use of org.apache.syncope.core.persistence.api.dao.search.OrderByClause in project syncope by apache.

the class SCIMDataBinder method toSCIMGroup.

public SCIMGroup toSCIMGroup(final GroupTO groupTO, final String location, final List<String> attributes, final List<String> excludedAttributes) {
    SCIMGroup group = new SCIMGroup(groupTO.getKey(), new Meta(Resource.Group, groupTO.getCreationDate(), groupTO.getLastChangeDate() == null ? groupTO.getCreationDate() : groupTO.getLastChangeDate(), groupTO.getETagValue(), location), output(attributes, excludedAttributes, "displayName", groupTO.getName()));
    MembershipCond membCond = new MembershipCond();
    membCond.setGroup(groupTO.getKey());
    SearchCond searchCond = SearchCond.getLeafCond(membCond);
    if (output(attributes, excludedAttributes, "members")) {
        int count = userLogic.search(searchCond, 1, 1, Collections.<OrderByClause>emptyList(), SyncopeConstants.ROOT_REALM, false).getLeft();
        for (int page = 1; page <= (count / AnyDAO.DEFAULT_PAGE_SIZE) + 1; page++) {
            List<UserTO> users = userLogic.search(searchCond, page, AnyDAO.DEFAULT_PAGE_SIZE, Collections.<OrderByClause>emptyList(), SyncopeConstants.ROOT_REALM, false).getRight();
            users.forEach(userTO -> {
                group.getMembers().add(new Member(userTO.getKey(), StringUtils.substringBefore(location, "/Groups") + "/Users/" + userTO.getKey(), userTO.getUsername()));
            });
        }
    }
    return group;
}
Also used : Meta(org.apache.syncope.ext.scimv2.api.data.Meta) SCIMGroup(org.apache.syncope.ext.scimv2.api.data.SCIMGroup) OrderByClause(org.apache.syncope.core.persistence.api.dao.search.OrderByClause) UserTO(org.apache.syncope.common.lib.to.UserTO) MembershipCond(org.apache.syncope.core.persistence.api.dao.search.MembershipCond) SearchCond(org.apache.syncope.core.persistence.api.dao.search.SearchCond) Member(org.apache.syncope.ext.scimv2.api.data.Member)

Example 13 with OrderByClause

use of org.apache.syncope.core.persistence.api.dao.search.OrderByClause in project syncope by apache.

the class ReconciliationReportlet method doExtract.

@Override
protected void doExtract(final ReportletConf conf, final ContentHandler handler, final AtomicReference<String> status) throws SAXException {
    if (conf instanceof ReconciliationReportletConf) {
        this.conf = ReconciliationReportletConf.class.cast(conf);
    } else {
        throw new ReportException(new IllegalArgumentException("Invalid configuration provided"));
    }
    AttributesImpl atts = new AttributesImpl();
    if (StringUtils.isBlank(this.conf.getUserMatchingCond())) {
        int total = userDAO.count();
        int pages = (total / AnyDAO.DEFAULT_PAGE_SIZE) + 1;
        status.set("Processing " + total + " users in " + pages + " pages");
        atts.addAttribute("", "", "total", ReportXMLConst.XSD_INT, String.valueOf(total));
        handler.startElement("", "", getAnyElementName(AnyTypeKind.USER) + "s", atts);
        for (int page = 1; page <= pages; page++) {
            status.set("Processing " + total + " users: page " + page + " of " + pages);
            doExtract(handler, userDAO.findAll(page, AnyDAO.DEFAULT_PAGE_SIZE));
        }
    } else {
        SearchCond cond = SearchCondConverter.convert(this.conf.getUserMatchingCond());
        int total = searchDAO.count(SyncopeConstants.FULL_ADMIN_REALMS, cond, AnyTypeKind.USER);
        int pages = (total / AnyDAO.DEFAULT_PAGE_SIZE) + 1;
        status.set("Processing " + total + " users in " + pages + " pages");
        atts.addAttribute("", "", "total", ReportXMLConst.XSD_INT, String.valueOf(total));
        handler.startElement("", "", getAnyElementName(AnyTypeKind.USER) + "s", atts);
        for (int page = 1; page <= pages; page++) {
            status.set("Processing " + total + " users: page " + page + " of " + pages);
            doExtract(handler, searchDAO.search(SyncopeConstants.FULL_ADMIN_REALMS, cond, page, PAGE_SIZE, Collections.<OrderByClause>emptyList(), AnyTypeKind.USER));
        }
    }
    handler.endElement("", "", getAnyElementName(AnyTypeKind.USER) + "s");
    atts.clear();
    if (StringUtils.isBlank(this.conf.getGroupMatchingCond())) {
        int total = groupDAO.count();
        int pages = (total / AnyDAO.DEFAULT_PAGE_SIZE) + 1;
        status.set("Processing " + total + " groups in " + pages + " pages");
        atts.addAttribute("", "", "total", ReportXMLConst.XSD_INT, String.valueOf(total));
        handler.startElement("", "", getAnyElementName(AnyTypeKind.GROUP) + "s", atts);
        for (int page = 1; page <= pages; page++) {
            status.set("Processing " + total + " groups: page " + page + " of " + pages);
            doExtract(handler, groupDAO.findAll(page, AnyDAO.DEFAULT_PAGE_SIZE));
        }
    } else {
        SearchCond cond = SearchCondConverter.convert(this.conf.getUserMatchingCond());
        int total = searchDAO.count(SyncopeConstants.FULL_ADMIN_REALMS, cond, AnyTypeKind.GROUP);
        int pages = (total / AnyDAO.DEFAULT_PAGE_SIZE) + 1;
        status.set("Processing " + total + " groups in " + pages + " pages");
        atts.addAttribute("", "", "total", ReportXMLConst.XSD_INT, String.valueOf(total));
        handler.startElement("", "", getAnyElementName(AnyTypeKind.GROUP) + "s", atts);
        for (int page = 1; page <= pages; page++) {
            status.set("Processing " + total + " groups: page " + page + " of " + pages);
            doExtract(handler, searchDAO.search(SyncopeConstants.FULL_ADMIN_REALMS, cond, page, PAGE_SIZE, Collections.<OrderByClause>emptyList(), AnyTypeKind.GROUP));
        }
    }
    handler.endElement("", "", getAnyElementName(AnyTypeKind.GROUP) + "s");
    for (AnyType anyType : anyTypeDAO.findAll()) {
        if (!anyType.equals(anyTypeDAO.findUser()) && !anyType.equals(anyTypeDAO.findGroup())) {
            AnyTypeCond anyTypeCond = new AnyTypeCond();
            anyTypeCond.setAnyTypeKey(anyType.getKey());
            SearchCond cond = StringUtils.isBlank(this.conf.getAnyObjectMatchingCond()) ? SearchCond.getLeafCond(anyTypeCond) : SearchCond.getAndCond(SearchCond.getLeafCond(anyTypeCond), SearchCondConverter.convert(this.conf.getAnyObjectMatchingCond()));
            int total = searchDAO.count(SyncopeConstants.FULL_ADMIN_REALMS, cond, AnyTypeKind.ANY_OBJECT);
            int pages = (total / AnyDAO.DEFAULT_PAGE_SIZE) + 1;
            status.set("Processing " + total + " any objects " + anyType.getKey() + " in " + pages + " pages");
            atts.clear();
            atts.addAttribute("", "", "type", ReportXMLConst.XSD_STRING, anyType.getKey());
            atts.addAttribute("", "", "total", ReportXMLConst.XSD_INT, String.valueOf(total));
            handler.startElement("", "", getAnyElementName(AnyTypeKind.ANY_OBJECT) + "s", atts);
            for (int page = 1; page <= pages; page++) {
                status.set("Processing " + total + " any objects " + anyType.getKey() + ": page " + page + " of " + pages);
                doExtract(handler, searchDAO.search(SyncopeConstants.FULL_ADMIN_REALMS, cond, page, PAGE_SIZE, Collections.<OrderByClause>emptyList(), AnyTypeKind.ANY_OBJECT));
            }
            handler.endElement("", "", getAnyElementName(AnyTypeKind.ANY_OBJECT) + "s");
        }
    }
}
Also used : AttributesImpl(org.xml.sax.helpers.AttributesImpl) OrderByClause(org.apache.syncope.core.persistence.api.dao.search.OrderByClause) AnyTypeCond(org.apache.syncope.core.persistence.api.dao.search.AnyTypeCond) ReconciliationReportletConf(org.apache.syncope.common.lib.report.ReconciliationReportletConf) SearchCond(org.apache.syncope.core.persistence.api.dao.search.SearchCond) AnyType(org.apache.syncope.core.persistence.api.entity.AnyType)

Example 14 with OrderByClause

use of org.apache.syncope.core.persistence.api.dao.search.OrderByClause in project syncope by apache.

the class AbstractServiceImpl method getOrderByClauses.

protected List<OrderByClause> getOrderByClauses(final String orderBy) {
    if (StringUtils.isBlank(orderBy)) {
        return Collections.<OrderByClause>emptyList();
    }
    List<OrderByClause> result = new ArrayList<>();
    for (String clause : orderBy.split(",")) {
        String[] elems = clause.split(" ");
        if (elems.length > 0 && StringUtils.isNotBlank(elems[0])) {
            OrderByClause obc = new OrderByClause();
            obc.setField(elems[0].trim());
            if (elems.length > 1 && StringUtils.isNotBlank(elems[1])) {
                obc.setDirection(elems[1].trim().equalsIgnoreCase(OrderByClause.Direction.ASC.name()) ? OrderByClause.Direction.ASC : OrderByClause.Direction.DESC);
            }
            result.add(obc);
        }
    }
    return result;
}
Also used : OrderByClause(org.apache.syncope.core.persistence.api.dao.search.OrderByClause) ArrayList(java.util.ArrayList)

Example 15 with OrderByClause

use of org.apache.syncope.core.persistence.api.dao.search.OrderByClause in project syncope by apache.

the class AbstractAnySearchDAO method search.

@Override
public <T extends Any<?>> List<T> search(final Set<String> adminRealms, final SearchCond cond, final int page, final int itemsPerPage, final List<OrderByClause> orderBy, final AnyTypeKind kind) {
    if (adminRealms == null || adminRealms.isEmpty()) {
        LOG.error("No realms provided");
        return Collections.<T>emptyList();
    }
    LOG.debug("Search condition:\n{}", cond);
    if (cond == null || !cond.isValid()) {
        LOG.error("Invalid search condition:\n{}", cond);
        return Collections.<T>emptyList();
    }
    List<OrderByClause> effectiveOrderBy;
    if (orderBy.isEmpty()) {
        OrderByClause keyClause = new OrderByClause();
        keyClause.setField("key");
        keyClause.setDirection(OrderByClause.Direction.ASC);
        effectiveOrderBy = Collections.singletonList(keyClause);
    } else {
        effectiveOrderBy = orderBy;
    }
    return doSearch(adminRealms, cond, page, itemsPerPage, effectiveOrderBy, kind);
}
Also used : OrderByClause(org.apache.syncope.core.persistence.api.dao.search.OrderByClause)

Aggregations

OrderByClause (org.apache.syncope.core.persistence.api.dao.search.OrderByClause)19 Collectors (java.util.stream.Collectors)6 ArrayList (java.util.ArrayList)5 List (java.util.List)5 SearchCond (org.apache.syncope.core.persistence.api.dao.search.SearchCond)5 Method (java.lang.reflect.Method)4 ArrayUtils (org.apache.commons.lang3.ArrayUtils)4 Pair (org.apache.commons.lang3.tuple.Pair)4 ExternalResourceDAO (org.apache.syncope.core.persistence.api.dao.ExternalResourceDAO)4 NotFoundException (org.apache.syncope.core.persistence.api.dao.NotFoundException)4 AbstractTest (org.apache.syncope.core.persistence.jpa.AbstractTest)4 Test (org.junit.jupiter.api.Test)4 Autowired (org.springframework.beans.factory.annotation.Autowired)4 PreAuthorize (org.springframework.security.access.prepost.PreAuthorize)4 Component (org.springframework.stereotype.Component)4 Transactional (org.springframework.transaction.annotation.Transactional)4 Map (java.util.Map)3 StringUtils (org.apache.commons.lang3.StringUtils)3 Triple (org.apache.commons.lang3.tuple.Triple)3 SyncopeClientException (org.apache.syncope.common.lib.SyncopeClientException)3