/*
* 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.persistence.jpa.entity;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.collections4.IterableUtils;
import org.apache.commons.collections4.Predicate;
import org.apache.syncope.core.persistence.api.entity.Any;
import org.apache.syncope.core.persistence.api.entity.GroupablePlainAttr;
import org.apache.syncope.core.persistence.api.entity.Membership;
import org.apache.syncope.core.persistence.api.entity.GroupableRelatable;
import org.apache.syncope.core.persistence.api.entity.Relationship;
import org.apache.syncope.core.persistence.api.entity.RelationshipType;
public abstract class AbstractGroupableRelatable<
L extends Any<P>,
M extends Membership<L>,
P extends GroupablePlainAttr<L, M>,
R extends Any<?>,
REL extends Relationship<L, R>>
extends AbstractAny<P> implements GroupableRelatable<L, M, P, R, REL> {
private static final long serialVersionUID = -2269285197388729673L;
protected abstract List<? extends P> internalGetPlainAttrs();
@Override
public boolean remove(final P attr) {
return internalGetPlainAttrs().remove(attr);
}
@Override
public P getPlainAttr(final String plainSchemaName) {
return IterableUtils.find(internalGetPlainAttrs(), new Predicate<P>() {
@Override
public boolean evaluate(final P plainAttr) {
return plainAttr != null && plainAttr.getSchema() != null
&& plainAttr.getMembership() == null
&& plainSchemaName.equals(plainAttr.getSchema().getKey());
}
});
}
@Override
public P getPlainAttr(final String plainSchemaName, final Membership<?> membership) {
return IterableUtils.find(internalGetPlainAttrs(), new Predicate<P>() {
@Override
public boolean evaluate(final P plainAttr) {
return plainAttr != null && plainAttr.getSchema() != null
&& plainAttr.getMembership() != null && plainAttr.getMembership().equals(membership)
&& plainSchemaName.equals(plainAttr.getSchema().getKey());
}
});
}
@Override
public List<? extends P> getPlainAttrs() {
return CollectionUtils.select(internalGetPlainAttrs(), new Predicate<P>() {
@Override
public boolean evaluate(final P plainAttr) {
return plainAttr != null && plainAttr.getSchema() != null
&& plainAttr.getMembership() == null;
}
}, new ArrayList<P>());
}
@Override
public Collection<? extends P> getPlainAttrs(final String plainSchemaName) {
return CollectionUtils.select(internalGetPlainAttrs(), new Predicate<P>() {
@Override
public boolean evaluate(final P plainAttr) {
return plainAttr != null && plainAttr.getSchema() != null
&& plainSchemaName.equals(plainAttr.getSchema().getKey());
}
});
}
@Override
public Collection<? extends P> getPlainAttrs(final Membership<?> membership) {
return CollectionUtils.select(internalGetPlainAttrs(), new Predicate<P>() {
@Override
public boolean evaluate(final P plainAttr) {
return plainAttr != null && plainAttr.getSchema() != null
&& membership.equals(plainAttr.getMembership());
}
});
}
@Override
public M getMembership(final String groupKey) {
return IterableUtils.find(getMemberships(), new Predicate<M>() {
@Override
public boolean evaluate(final M membership) {
return groupKey != null && groupKey.equals(membership.getRightEnd().getKey());
}
});
}
@Override
public REL getRelationship(final RelationshipType relationshipType, final String otherEndKey) {
return IterableUtils.find(getRelationships(), new Predicate<REL>() {
@Override
public boolean evaluate(final REL relationship) {
return otherEndKey != null && otherEndKey.equals(relationship.getRightEnd().getKey())
&& ((relationshipType == null && relationship.getType() == null)
|| (relationshipType != null && relationshipType.equals(relationship.getType())));
}
});
}
@Override
public Collection<? extends REL> getRelationships(final RelationshipType relationshipType) {
return CollectionUtils.select(getRelationships(), new Predicate<REL>() {
@Override
public boolean evaluate(final REL relationship) {
return relationshipType != null && relationshipType.equals(relationship.getType());
}
});
}
@Override
public Collection<? extends REL> getRelationships(final String otherEndKey) {
return CollectionUtils.select(getRelationships(), new Predicate<REL>() {
@Override
public boolean evaluate(final REL relationship) {
return otherEndKey != null && otherEndKey.equals(relationship.getRightEnd().getKey());
}
});
}
}