blob: 92c24aebf8ec9357a81b687b4ae052a081f04164 [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 java.util.Iterator;
import java.util.stream.Collectors;
import org.apache.syncope.common.lib.SyncopeClientException;
import org.apache.syncope.common.lib.to.ApplicationTO;
import org.apache.syncope.common.lib.to.PrivilegeTO;
import org.apache.syncope.common.lib.types.ClientExceptionType;
import org.apache.syncope.core.persistence.api.dao.ApplicationDAO;
import org.apache.syncope.core.persistence.api.entity.Application;
import org.apache.syncope.core.persistence.api.entity.EntityFactory;
import org.apache.syncope.core.persistence.api.entity.Privilege;
import org.apache.syncope.core.provisioning.api.data.ApplicationDataBinder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class ApplicationDataBinderImpl implements ApplicationDataBinder {
protected static final Logger LOG = LoggerFactory.getLogger(ApplicationDataBinder.class);
protected final ApplicationDAO applicationDAO;
protected final EntityFactory entityFactory;
public ApplicationDataBinderImpl(final ApplicationDAO applicationDAO, final EntityFactory entityFactory) {
this.applicationDAO = applicationDAO;
this.entityFactory = entityFactory;
}
@Override
public Application create(final ApplicationTO applicationTO) {
return update(entityFactory.newEntity(Application.class), applicationTO);
}
@Override
public Application update(final Application toBeUpdated, final ApplicationTO applicationTO) {
toBeUpdated.setKey(applicationTO.getKey());
Application application = applicationDAO.save(toBeUpdated);
application.setDescription(applicationTO.getDescription());
// 1. add or update all (valid) privileges from TO
applicationTO.getPrivileges().forEach(privilegeTO -> {
if (privilegeTO == null) {
LOG.error("Null {}", PrivilegeTO.class.getSimpleName());
} else {
Privilege privilege = applicationDAO.findPrivilege(privilegeTO.getKey());
if (privilege == null) {
privilege = entityFactory.newEntity(Privilege.class);
privilege.setKey(privilegeTO.getKey());
privilege.setApplication(application);
application.add(privilege);
} else if (!application.equals(privilege.getApplication())) {
SyncopeClientException sce = SyncopeClientException.build(ClientExceptionType.InvalidPrivilege);
sce.getElements().add(
"Privilege " + privilege.getKey() + " already owned by " + privilege.getApplication());
throw sce;
}
privilege.setDescription(privilegeTO.getDescription());
privilege.setSpec(privilegeTO.getSpec());
}
});
// 2. remove all privileges not contained in the TO
for (Iterator<? extends Privilege> itor = application.getPrivileges().iterator(); itor.hasNext();) {
Privilege privilege = itor.next();
if (!applicationTO.getPrivileges().stream().
anyMatch(privilegeTO -> privilege.getKey().equals(privilegeTO.getKey()))) {
privilege.setApplication(null);
itor.remove();
}
}
return application;
}
@Override
public PrivilegeTO getPrivilegeTO(final Privilege privilege) {
PrivilegeTO privilegeTO = new PrivilegeTO();
privilegeTO.setKey(privilege.getKey());
privilegeTO.setDescription(privilege.getDescription());
privilegeTO.setApplication(privilege.getApplication().getKey());
privilegeTO.setSpec(privilege.getSpec());
return privilegeTO;
}
@Override
public ApplicationTO getApplicationTO(final Application application) {
ApplicationTO applicationTO = new ApplicationTO();
applicationTO.setKey(application.getKey());
applicationTO.setDescription(application.getDescription());
applicationTO.getPrivileges().addAll(
application.getPrivileges().stream().map(this::getPrivilegeTO).collect(Collectors.toList()));
return applicationTO;
}
}