Java tutorial
package org.xacml4j.v30.pdp.profiles; /* * #%L * Xacml4J Core Engine Implementation * %% * Copyright (C) 2009 - 2014 Xacml4J.org * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation, either version 3 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 Lesser Public License for more details. * * You should have received a copy of the GNU General Lesser Public * License along with this program. If not, see * <http://www.gnu.org/licenses/lgpl-3.0.html>. * #L% */ import java.util.Collection; import java.util.LinkedHashSet; import java.util.LinkedList; import java.util.List; import java.util.Set; import org.xacml4j.v30.Category; import org.xacml4j.v30.CategoryId; import org.xacml4j.v30.RequestContext; import org.xacml4j.v30.Result; import org.xacml4j.v30.pdp.AbstractRequestContextHandler; import org.xacml4j.v30.pdp.PolicyDecisionPointContext; import com.google.common.collect.Sets; final class MultipleResourcesViaRepeatingAttributesHandler extends AbstractRequestContextHandler { private final static String FEATURE_ID = "urn:oasis:names:tc:xacml:3.0:profile:multiple:repeated-attribute-categories"; public MultipleResourcesViaRepeatingAttributesHandler() { super(FEATURE_ID); } @Override public Collection<Result> handle(RequestContext request, PolicyDecisionPointContext context) { if (!request.containsRepeatingCategories()) { return handleNext(request, context); } List<Set<Category>> byCategory = new LinkedList<Set<Category>>(); for (CategoryId categoryId : request.getCategories()) { Collection<Category> attributes = request.getAttributes(categoryId); if (attributes == null || attributes.isEmpty()) { continue; } byCategory.add(new LinkedHashSet<Category>(attributes)); } Collection<Result> results = new LinkedList<Result>(); Set<List<Category>> cartesian = Sets.cartesianProduct(byCategory); for (List<Category> requestAttr : cartesian) { results.addAll(handleNext(RequestContext.builder().copyOf(request, requestAttr).build(), context)); } return results; } }