/* * JBoss, Home of Professional Open Source * * Copyright 2013 Red Hat, Inc. and/or its affiliates. * * Licensed 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.picketlink.idm.internal; import org.picketlink.idm.IdentityManagementException; import org.picketlink.idm.PartitionManager; import org.picketlink.idm.RelationshipManager; import org.picketlink.idm.config.IdentityStoreConfiguration.IdentityOperation; import org.picketlink.idm.event.RelationshipCreatedEvent; import org.picketlink.idm.event.RelationshipDeletedEvent; import org.picketlink.idm.event.RelationshipUpdatedEvent; import org.picketlink.idm.model.IdentityType; import org.picketlink.idm.model.Relationship; import org.picketlink.idm.query.RelationshipQuery; import org.picketlink.idm.query.internal.DefaultRelationshipQuery; import org.picketlink.idm.spi.IdentityContext; import java.util.List; import static org.picketlink.idm.IDMInternalMessages.MESSAGES; /** * Default implementation for RelationshipManager. * <p/> * This class is not thread-safe! * * @author Shane Bryzak */ public class ContextualRelationshipManager extends AbstractAttributedTypeManager<Relationship> implements RelationshipManager { private final PartitionManager partitionManager; public ContextualRelationshipManager(DefaultPartitionManager partitionManager) { super(partitionManager.getConfiguration(), null); this.partitionManager = partitionManager; } @Override protected void doAdd(Relationship relationship) { IdentityContext identityContext = getIdentityContext(); getStoreSelector().getStoreForRelationshipOperation(identityContext, relationship.getClass(), relationship, IdentityOperation.create) .add(identityContext, relationship); } @Override protected void fireAttributedTypeAddedEvent(Relationship relationship) { fireEvent(new RelationshipCreatedEvent(relationship, this.partitionManager)); } @Override protected void fireAttributedTypeUpdatedEvent(Relationship relationship) { fireEvent(new RelationshipUpdatedEvent(relationship, this.partitionManager)); } @Override protected void doUpdate(Relationship relationship) { IdentityContext identityContext = getIdentityContext(); getStoreSelector().getStoreForRelationshipOperation(identityContext, relationship.getClass(), relationship, IdentityOperation.update) .update(identityContext, relationship); } @Override protected void fireAttributedTypeRemovedEvent(Relationship attributedType) { fireEvent(new RelationshipDeletedEvent(attributedType, this.partitionManager)); } @Override protected void doRemove(Relationship relationship) { IdentityContext identityContext = getIdentityContext(); getStoreSelector().getStoreForRelationshipOperation(identityContext, relationship.getClass(), relationship, IdentityOperation.delete) .remove(identityContext, relationship); } @Override public <T extends Relationship> RelationshipQuery<T> createRelationshipQuery(Class<T> relationshipClass) { if (relationshipClass == null) { MESSAGES.nullArgument("Relationship Type"); } return new DefaultRelationshipQuery<T>(getIdentityContext(), relationshipClass, this); } @Override public <C extends Relationship> C lookupById(Class<C> attributedType, String id) throws IdentityManagementException { List<C> result = createRelationshipQuery(attributedType).setParameter (Relationship.ID, id) .getResultList(); if (!result.isEmpty()) { return result.get(0); } return null; } @Override public boolean inheritsPrivileges(IdentityType identity, IdentityType assignee) { if (identity.equals(assignee)) { return true; } PrivilegeChainQuery privilegeChainQuery = getConfiguration().getPrivilegeChainQuery(); return privilegeChainQuery.inheritsPrivileges(this, identity, assignee); } @Override protected void checkUniqueness(Relationship attributedType) throws IdentityManagementException { //no-op } @Override protected void checkIfExists(Relationship attributedType) throws IdentityManagementException { //no-op } public PartitionManager getPartitionManager() { return this.partitionManager; } }