blob: 43df9c9f6fbf0a0ead083aca7213aaede4e932db [file] [log] [blame]
/*
* 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.provisioning.java.data;
import org.apache.syncope.common.lib.SyncopeClientException;
import org.apache.syncope.common.lib.to.RealmTO;
import org.apache.syncope.common.lib.types.ClientExceptionType;
import org.apache.syncope.core.provisioning.api.PropagationByResource;
import org.apache.syncope.common.lib.types.ResourceOperation;
import org.apache.syncope.core.provisioning.java.utils.TemplateUtils;
import org.apache.syncope.core.persistence.api.dao.AnyTypeDAO;
import org.apache.syncope.core.persistence.api.dao.ExternalResourceDAO;
import org.apache.syncope.core.persistence.api.dao.ImplementationDAO;
import org.apache.syncope.core.persistence.api.dao.PolicyDAO;
import org.apache.syncope.core.persistence.api.dao.RealmDAO;
import org.apache.syncope.core.persistence.api.entity.AnyTemplateRealm;
import org.apache.syncope.core.persistence.api.entity.AnyType;
import org.apache.syncope.core.persistence.api.entity.policy.AccountPolicy;
import org.apache.syncope.core.persistence.api.entity.EntityFactory;
import org.apache.syncope.core.persistence.api.entity.Implementation;
import org.apache.syncope.core.persistence.api.entity.policy.PasswordPolicy;
import org.apache.syncope.core.persistence.api.entity.Realm;
import org.apache.syncope.core.persistence.api.entity.policy.AccessPolicy;
import org.apache.syncope.core.persistence.api.entity.policy.AttrReleasePolicy;
import org.apache.syncope.core.persistence.api.entity.policy.Policy;
import org.apache.syncope.core.persistence.api.entity.resource.ExternalResource;
import org.apache.syncope.core.provisioning.api.data.RealmDataBinder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.apache.syncope.core.persistence.api.entity.policy.AuthPolicy;
public class RealmDataBinderImpl implements RealmDataBinder {
protected static final Logger LOG = LoggerFactory.getLogger(RealmDataBinder.class);
protected final AnyTypeDAO anyTypeDAO;
protected final ImplementationDAO implementationDAO;
protected final RealmDAO realmDAO;
protected final PolicyDAO policyDAO;
protected final ExternalResourceDAO resourceDAO;
protected final EntityFactory entityFactory;
public RealmDataBinderImpl(
final AnyTypeDAO anyTypeDAO,
final ImplementationDAO implementationDAO,
final RealmDAO realmDAO,
final PolicyDAO policyDAO,
final ExternalResourceDAO resourceDAO,
final EntityFactory entityFactory) {
this.anyTypeDAO = anyTypeDAO;
this.implementationDAO = implementationDAO;
this.realmDAO = realmDAO;
this.policyDAO = policyDAO;
this.resourceDAO = resourceDAO;
this.entityFactory = entityFactory;
}
protected void setTemplates(final RealmTO realmTO, final Realm realm) {
// validate JEXL expressions from templates and proceed if fine
TemplateUtils.check(realmTO.getTemplates(), ClientExceptionType.InvalidRealm);
realmTO.getTemplates().forEach((key, template) -> {
AnyType type = anyTypeDAO.find(key);
if (type == null) {
LOG.debug("Invalid AnyType {} specified, ignoring...", key);
} else {
AnyTemplateRealm anyTemplate = realm.getTemplate(type).orElse(null);
if (anyTemplate == null) {
anyTemplate = entityFactory.newEntity(AnyTemplateRealm.class);
anyTemplate.setAnyType(type);
anyTemplate.setRealm(realm);
realm.add(anyTemplate);
}
anyTemplate.set(template);
}
});
// remove all templates not contained in the TO
realm.getTemplates().
removeIf(template -> !realmTO.getTemplates().containsKey(template.getAnyType().getKey()));
}
@Override
public Realm create(final Realm parent, final RealmTO realmTO) {
Realm realm = entityFactory.newEntity(Realm.class);
realm.setName(realmTO.getName());
realm.setParent(parent);
if (realmTO.getPasswordPolicy() != null) {
Policy policy = policyDAO.find(realmTO.getPasswordPolicy());
if (policy instanceof PasswordPolicy) {
realm.setPasswordPolicy((PasswordPolicy) policy);
} else {
SyncopeClientException sce = SyncopeClientException.build(ClientExceptionType.InvalidPolicy);
sce.getElements().add("Expected " + PasswordPolicy.class.getSimpleName()
+ ", found " + policy.getClass().getSimpleName());
throw sce;
}
}
if (realmTO.getAccountPolicy() != null) {
Policy policy = policyDAO.find(realmTO.getAccountPolicy());
if (policy instanceof AccountPolicy) {
realm.setAccountPolicy((AccountPolicy) policy);
} else {
SyncopeClientException sce = SyncopeClientException.build(ClientExceptionType.InvalidPolicy);
sce.getElements().add("Expected " + AccountPolicy.class.getSimpleName()
+ ", found " + policy.getClass().getSimpleName());
throw sce;
}
}
if (realmTO.getAuthPolicy() != null) {
Policy policy = policyDAO.find(realmTO.getAuthPolicy());
if (policy instanceof AuthPolicy) {
realm.setAuthPolicy((AuthPolicy) policy);
} else {
SyncopeClientException sce = SyncopeClientException.build(ClientExceptionType.InvalidPolicy);
sce.getElements().add("Expected " + AuthPolicy.class.getSimpleName()
+ ", found " + policy.getClass().getSimpleName());
throw sce;
}
}
if (realmTO.getAccessPolicy() != null) {
Policy policy = policyDAO.find(realmTO.getAccessPolicy());
if (policy instanceof AccessPolicy) {
realm.setAccessPolicy((AccessPolicy) policy);
} else {
SyncopeClientException sce = SyncopeClientException.build(ClientExceptionType.InvalidPolicy);
sce.getElements().add("Expected " + AccessPolicy.class.getSimpleName()
+ ", found " + policy.getClass().getSimpleName());
throw sce;
}
}
if (realmTO.getAttrReleasePolicy() != null) {
Policy policy = policyDAO.find(realmTO.getAttrReleasePolicy());
if (policy instanceof AttrReleasePolicy) {
realm.setAttrReleasePolicy((AttrReleasePolicy) policy);
} else {
SyncopeClientException sce = SyncopeClientException.build(ClientExceptionType.InvalidPolicy);
sce.getElements().add("Expected " + AttrReleasePolicy.class.getSimpleName()
+ ", found " + policy.getClass().getSimpleName());
throw sce;
}
}
realmTO.getActions().forEach(logicActionsKey -> {
Implementation logicAction = implementationDAO.find(logicActionsKey);
if (logicAction == null) {
LOG.debug("Invalid " + Implementation.class.getSimpleName() + " {}, ignoring...", logicActionsKey);
} else {
realm.add(logicAction);
}
});
setTemplates(realmTO, realm);
realmTO.getResources().forEach(resourceKey -> {
ExternalResource resource = resourceDAO.find(resourceKey);
if (resource == null) {
LOG.debug("Invalid " + ExternalResource.class.getSimpleName() + " {}, ignoring...", resourceKey);
} else {
realm.add(resource);
}
});
return realm;
}
@Override
public PropagationByResource<String> update(final Realm realm, final RealmTO realmTO) {
realm.setName(realmTO.getName());
realm.setParent(realmTO.getParent() == null ? null : realmDAO.find(realmTO.getParent()));
if (realmTO.getAccountPolicy() == null) {
realm.setAccountPolicy(null);
} else {
Policy policy = policyDAO.find(realmTO.getAccountPolicy());
if (policy instanceof AccountPolicy) {
realm.setAccountPolicy((AccountPolicy) policy);
} else {
SyncopeClientException sce = SyncopeClientException.build(ClientExceptionType.InvalidPolicy);
sce.getElements().add("Expected " + AccountPolicy.class.getSimpleName()
+ ", found " + policy.getClass().getSimpleName());
throw sce;
}
}
if (realmTO.getPasswordPolicy() == null) {
realm.setPasswordPolicy(null);
} else {
Policy policy = policyDAO.find(realmTO.getPasswordPolicy());
if (policy instanceof PasswordPolicy) {
realm.setPasswordPolicy((PasswordPolicy) policy);
} else {
SyncopeClientException sce = SyncopeClientException.build(ClientExceptionType.InvalidPolicy);
sce.getElements().add("Expected " + PasswordPolicy.class.getSimpleName()
+ ", found " + policy.getClass().getSimpleName());
throw sce;
}
}
if (realmTO.getAuthPolicy() == null) {
realm.setAuthPolicy(null);
} else {
Policy policy = policyDAO.find(realmTO.getAuthPolicy());
if (policy instanceof AuthPolicy) {
realm.setAuthPolicy((AuthPolicy) policy);
} else {
SyncopeClientException sce = SyncopeClientException.build(ClientExceptionType.InvalidPolicy);
sce.getElements().add("Expected " + AuthPolicy.class.getSimpleName()
+ ", found " + policy.getClass().getSimpleName());
throw sce;
}
}
if (realmTO.getAccessPolicy() == null) {
realm.setAccessPolicy(null);
} else {
Policy policy = policyDAO.find(realmTO.getAccessPolicy());
if (policy instanceof AccessPolicy) {
realm.setAccessPolicy((AccessPolicy) policy);
} else {
SyncopeClientException sce = SyncopeClientException.build(ClientExceptionType.InvalidPolicy);
sce.getElements().add("Expected " + AccessPolicy.class.getSimpleName()
+ ", found " + policy.getClass().getSimpleName());
throw sce;
}
}
if (realmTO.getAttrReleasePolicy() == null) {
realm.setAttrReleasePolicy(null);
} else {
Policy policy = policyDAO.find(realmTO.getAttrReleasePolicy());
if (policy instanceof AttrReleasePolicy) {
realm.setAttrReleasePolicy((AttrReleasePolicy) policy);
} else {
SyncopeClientException sce = SyncopeClientException.build(ClientExceptionType.InvalidPolicy);
sce.getElements().add("Expected " + AttrReleasePolicy.class.getSimpleName()
+ ", found " + policy.getClass().getSimpleName());
throw sce;
}
}
realmTO.getActions().forEach(logicActionsKey -> {
Implementation logicActions = implementationDAO.find(logicActionsKey);
if (logicActions == null) {
LOG.debug("Invalid " + Implementation.class.getSimpleName() + " {}, ignoring...", logicActionsKey);
} else {
realm.add(logicActions);
}
});
// remove all implementations not contained in the TO
realm.getActions().
removeIf(implementation -> !realmTO.getActions().contains(implementation.getKey()));
setTemplates(realmTO, realm);
PropagationByResource<String> propByRes = new PropagationByResource<>();
realmTO.getResources().forEach(resourceKey -> {
ExternalResource resource = resourceDAO.find(resourceKey);
if (resource == null) {
LOG.debug("Invalid " + ExternalResource.class.getSimpleName() + " {}, ignoring...", resourceKey);
} else {
realm.add(resource);
propByRes.add(ResourceOperation.CREATE, resource.getKey());
}
});
// remove all resources not contained in the TO
realm.getResources().removeIf(resource -> {
boolean contained = realmTO.getResources().contains(resource.getKey());
if (!contained) {
propByRes.add(ResourceOperation.DELETE, resource.getKey());
}
return !contained;
});
return propByRes;
}
@Override
public RealmTO getRealmTO(final Realm realm, final boolean admin) {
RealmTO realmTO = new RealmTO();
realmTO.setKey(realm.getKey());
realmTO.setName(realm.getName());
realmTO.setParent(realm.getParent() == null ? null : realm.getParent().getKey());
realmTO.setFullPath(realm.getFullPath());
if (admin) {
realmTO.setAccountPolicy(realm.getAccountPolicy() == null ? null : realm.getAccountPolicy().getKey());
realmTO.setPasswordPolicy(realm.getPasswordPolicy() == null ? null : realm.getPasswordPolicy().getKey());
realmTO.setAuthPolicy(
realm.getAuthPolicy() == null ? null : realm.getAuthPolicy().getKey());
realmTO.setAccessPolicy(realm.getAccessPolicy() == null ? null : realm.getAccessPolicy().getKey());
realmTO.setAttrReleasePolicy(
realm.getAttrReleasePolicy() == null ? null : realm.getAttrReleasePolicy().getKey());
realm.getActions().forEach(action -> realmTO.getActions().add(action.getKey()));
realm.getTemplates().forEach(
template -> realmTO.getTemplates().put(template.getAnyType().getKey(), template.get()));
realm.getResources().forEach(resource -> realmTO.getResources().add(resource.getKey()));
}
return realmTO;
}
}