http://git-wip-us.apache.org/repos/asf/syncope/blob/d5b57922/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/attrvalue/validation/URLValidator.java ---------------------------------------------------------------------- diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/attrvalue/validation/URLValidator.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/attrvalue/validation/URLValidator.java index 3138ca9..5646b0b 100644 --- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/attrvalue/validation/URLValidator.java +++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/attrvalue/validation/URLValidator.java @@ -22,16 +22,11 @@ import java.net.MalformedURLException; import java.net.URL; import org.apache.syncope.core.persistence.api.attrvalue.validation.InvalidPlainAttrValueException; import org.apache.syncope.core.persistence.api.entity.PlainAttrValue; -import org.apache.syncope.core.persistence.api.entity.PlainSchema; public class URLValidator extends AbstractValidator { private static final long serialVersionUID = 792457177290331518L; - public URLValidator(final PlainSchema schema) { - super(schema); - } - @Override protected void doValidate(final PlainAttrValue attrValue) { try {
http://git-wip-us.apache.org/repos/asf/syncope/blob/d5b57922/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/content/ContentLoaderHandler.java ---------------------------------------------------------------------- diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/content/ContentLoaderHandler.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/content/ContentLoaderHandler.java index 713fee0..e67d5c8 100644 --- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/content/ContentLoaderHandler.java +++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/content/ContentLoaderHandler.java @@ -41,21 +41,19 @@ public class ContentLoaderHandler extends DefaultHandler { private static final Logger LOG = LoggerFactory.getLogger(ContentLoaderHandler.class); - private final DataSource dataSource; + private final JdbcTemplate jdbcTemplate; private final String rootElement; private final boolean continueOnError; public ContentLoaderHandler(final DataSource dataSource, final String rootElement, final boolean continueOnError) { - this.dataSource = dataSource; + this.jdbcTemplate = new JdbcTemplate(dataSource); this.rootElement = rootElement; this.continueOnError = continueOnError; } private Object[] getParameters(final String tableName, final Attributes attrs) { - JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource); - Map<String, Integer> colTypes = jdbcTemplate.query( "SELECT * FROM " + tableName + " WHERE 0=1", (final ResultSet rs) -> { Map<String, Integer> colTypes1 = new HashMap<>(); @@ -185,7 +183,6 @@ public class ContentLoaderHandler extends DefaultHandler { } query.append(") VALUES (").append(values).append(')'); - JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource); try { jdbcTemplate.update(query.toString(), getParameters(qName, atts)); } catch (DataAccessException e) { http://git-wip-us.apache.org/repos/asf/syncope/blob/d5b57922/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractAnySearchDAO.java ---------------------------------------------------------------------- diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractAnySearchDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractAnySearchDAO.java index 6faeeab..cf93dc5 100644 --- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractAnySearchDAO.java +++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractAnySearchDAO.java @@ -153,7 +153,7 @@ public abstract class AbstractAnySearchDAO extends AbstractDAO<Any<?>> implement && cond.getType() != AttributeCond.Type.ISNULL && cond.getType() != AttributeCond.Type.ISNOTNULL) { - schema.getValidator().validate(cond.getExpression(), attrValue); + ((JPAPlainSchema) schema).validator().validate(cond.getExpression(), attrValue); } } catch (ValidationException e) { LOG.error("Could not validate expression '" + cond.getExpression() + "'", e); @@ -225,7 +225,7 @@ public abstract class AbstractAnySearchDAO extends AbstractDAO<Any<?>> implement && condClone.getType() != AttributeCond.Type.ISNOTNULL) { try { - schema.getValidator().validate(condClone.getExpression(), attrValue); + ((JPAPlainSchema) schema).validator().validate(condClone.getExpression(), attrValue); } catch (ValidationException e) { LOG.error("Could not validate expression '" + condClone.getExpression() + "'", e); throw new IllegalArgumentException(); http://git-wip-us.apache.org/repos/asf/syncope/blob/d5b57922/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/DefaultAccountRule.java ---------------------------------------------------------------------- diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/DefaultAccountRule.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/DefaultAccountRule.java index c54517f..6faf055 100644 --- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/DefaultAccountRule.java +++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/DefaultAccountRule.java @@ -35,16 +35,20 @@ public class DefaultAccountRule implements AccountRule { private DefaultAccountRuleConf conf; - @Transactional(readOnly = true) @Override - public void enforce(final AccountRuleConf conf, final User user) { + public void setConf(final AccountRuleConf conf) { if (conf instanceof DefaultAccountRuleConf) { this.conf = DefaultAccountRuleConf.class.cast(conf); } else { throw new IllegalArgumentException( - AccountRuleConf.class.getName() + " expected, got " + conf.getClass().getName()); + DefaultAccountRuleConf.class.getName() + " expected, got " + conf.getClass().getName()); } + } + + @Transactional(readOnly = true) + @Override + public void enforce(final User user) { this.conf.getSchemasNotPermitted().stream(). map(schema -> user.getPlainAttr(schema)). filter(attr -> attr.isPresent()). http://git-wip-us.apache.org/repos/asf/syncope/blob/d5b57922/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/DefaultPasswordRule.java ---------------------------------------------------------------------- diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/DefaultPasswordRule.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/DefaultPasswordRule.java index e3eeacd..d0abddd 100644 --- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/DefaultPasswordRule.java +++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/DefaultPasswordRule.java @@ -33,16 +33,24 @@ public class DefaultPasswordRule implements PasswordRule { private DefaultPasswordRuleConf conf; - @Transactional(readOnly = true) @Override - public void enforce(final PasswordRuleConf conf, final User user) { + public PasswordRuleConf getConf() { + return conf; + } + + @Override + public void setConf(final PasswordRuleConf conf) { if (conf instanceof DefaultPasswordRuleConf) { this.conf = (DefaultPasswordRuleConf) conf; } else { throw new IllegalArgumentException( - PasswordRuleConf.class.getName() + " expected, got " + conf.getClass().getName()); + DefaultPasswordRuleConf.class.getName() + " expected, got " + conf.getClass().getName()); } + } + @Transactional(readOnly = true) + @Override + public void enforce(final User user) { this.conf.getSchemasNotPermitted().stream(). map(schema -> user.getPlainAttr(schema)). filter(attr -> attr.isPresent()). http://git-wip-us.apache.org/repos/asf/syncope/blob/d5b57922/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAnyObjectDAO.java ---------------------------------------------------------------------- diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAnyObjectDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAnyObjectDAO.java index 1aa14de..01c1c29 100644 --- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAnyObjectDAO.java +++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAnyObjectDAO.java @@ -22,7 +22,6 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Date; -import java.util.HashMap; import java.util.HashSet; import java.util.LinkedHashMap; import java.util.List; @@ -123,15 +122,12 @@ public class JPAAnyObjectDAO extends AbstractAnyDAO<AnyObject> implements AnyObj "SELECT e.realm, COUNT(e) FROM " + JPAAnyObject.class.getSimpleName() + " e " + "WHERE e.type=:type GROUP BY e.realm"); query.setParameter("type", anyType); + @SuppressWarnings("unchecked") List<Object[]> results = query.getResultList(); - - Map<String, Integer> countByRealm = new HashMap<>(results.size()); - for (Object[] result : results) { - countByRealm.put(((Realm) result[0]).getFullPath(), ((Number) result[1]).intValue()); - } - - return Collections.unmodifiableMap(countByRealm); + return results.stream().collect(Collectors.toMap( + result -> ((Realm) result[0]).getFullPath(), + result -> ((Number) result[1]).intValue())); } @Override http://git-wip-us.apache.org/repos/asf/syncope/blob/d5b57922/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAGroupDAO.java ---------------------------------------------------------------------- diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAGroupDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAGroupDAO.java index d777f70..62be797 100644 --- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAGroupDAO.java +++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAGroupDAO.java @@ -22,7 +22,6 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Date; -import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; @@ -161,15 +160,12 @@ public class JPAGroupDAO extends AbstractAnyDAO<Group> implements GroupDAO { public Map<String, Integer> countByRealm() { Query query = entityManager().createQuery( "SELECT e.realm, COUNT(e) FROM " + JPAGroup.class.getSimpleName() + " e GROUP BY e.realm"); + @SuppressWarnings("unchecked") List<Object[]> results = query.getResultList(); - - Map<String, Integer> countByRealm = new HashMap<>(results.size()); - for (Object[] result : results) { - countByRealm.put(((Realm) result[0]).getFullPath(), ((Number) result[1]).intValue()); - } - - return Collections.unmodifiableMap(countByRealm); + return results.stream().collect(Collectors.toMap( + result -> ((Realm) result[0]).getFullPath(), + result -> ((Number) result[1]).intValue())); } @Override http://git-wip-us.apache.org/repos/asf/syncope/blob/d5b57922/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAImplementationDAO.java ---------------------------------------------------------------------- diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAImplementationDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAImplementationDAO.java new file mode 100644 index 0000000..091c4b0 --- /dev/null +++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAImplementationDAO.java @@ -0,0 +1,70 @@ +/* + * 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.dao; + +import java.util.List; +import javax.persistence.TypedQuery; +import org.apache.syncope.common.lib.types.ImplementationType; +import org.apache.syncope.core.persistence.api.dao.ImplementationDAO; +import org.apache.syncope.core.persistence.api.entity.Implementation; +import org.apache.syncope.core.persistence.jpa.entity.JPAImplementation; +import org.springframework.stereotype.Repository; +import org.springframework.transaction.annotation.Transactional; + +@Repository +public class JPAImplementationDAO extends AbstractDAO<Implementation> implements ImplementationDAO { + + @Transactional(readOnly = true) + @Override + public Implementation find(final String key) { + return entityManager().find(JPAImplementation.class, key); + } + + @Override + public List<Implementation> find(final ImplementationType type) { + TypedQuery<Implementation> query = entityManager().createQuery( + "SELECT e FROM " + JPAImplementation.class.getSimpleName() + " e WHERE e.type=:type", + Implementation.class); + query.setParameter("type", type); + return query.getResultList(); + } + + @Override + public List<Implementation> findAll() { + TypedQuery<Implementation> query = entityManager().createQuery( + "SELECT e FROM " + JPAImplementation.class.getSimpleName() + " e", Implementation.class); + return query.getResultList(); + } + + @Override + public Implementation save(final Implementation implementation) { + return entityManager().merge(implementation); + } + + @Override + public void delete(final String key) { + Implementation implementation = find(key); + if (implementation == null) { + return; + } + + entityManager().remove(implementation); + } + +} http://git-wip-us.apache.org/repos/asf/syncope/blob/d5b57922/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAMailTemplateDAO.java ---------------------------------------------------------------------- diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAMailTemplateDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAMailTemplateDAO.java index 428e4e8..e419f20 100644 --- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAMailTemplateDAO.java +++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAMailTemplateDAO.java @@ -41,8 +41,8 @@ public class JPAMailTemplateDAO extends AbstractDAO<MailTemplate> implements Mai } @Override - public MailTemplate save(final MailTemplate notification) { - return entityManager().merge(notification); + public MailTemplate save(final MailTemplate template) { + return entityManager().merge(template); } @Override http://git-wip-us.apache.org/repos/asf/syncope/blob/d5b57922/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAUserDAO.java ---------------------------------------------------------------------- diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAUserDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAUserDAO.java index 5b6998e..92f7c0a 100644 --- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAUserDAO.java +++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAUserDAO.java @@ -22,10 +22,10 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Date; -import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.Set; import java.util.regex.Pattern; import java.util.stream.Collectors; @@ -44,7 +44,6 @@ import org.apache.syncope.core.provisioning.api.utils.policy.PasswordPolicyExcep import org.apache.syncope.core.spring.security.AuthContextUtils; import org.apache.syncope.core.spring.security.DelegatedAdministrationException; import org.apache.syncope.core.spring.ApplicationContextProvider; -import org.apache.syncope.core.persistence.api.ImplementationLookup; import org.apache.syncope.core.persistence.api.attrvalue.validation.InvalidEntityException; import org.apache.syncope.core.persistence.api.dao.AccessTokenDAO; import org.apache.syncope.core.persistence.api.dao.AccountRule; @@ -56,6 +55,7 @@ import org.apache.syncope.core.persistence.api.dao.UserDAO; import org.apache.syncope.core.persistence.api.entity.AccessToken; import org.apache.syncope.core.persistence.api.entity.AnyUtils; import org.apache.syncope.core.persistence.api.entity.Entity; +import org.apache.syncope.core.persistence.api.entity.Implementation; import org.apache.syncope.core.persistence.api.entity.Realm; import org.apache.syncope.core.persistence.api.entity.Role; import org.apache.syncope.core.persistence.api.entity.group.Group; @@ -68,8 +68,8 @@ import org.apache.syncope.core.persistence.jpa.entity.JPAAnyUtilsFactory; import org.apache.syncope.core.persistence.jpa.entity.user.JPAUser; import org.apache.syncope.core.provisioning.api.event.AnyCreatedUpdatedEvent; import org.apache.syncope.core.provisioning.api.event.AnyDeletedEvent; +import org.apache.syncope.core.spring.ImplementationManager; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.support.AbstractBeanDefinition; import org.springframework.stereotype.Repository; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; @@ -86,9 +86,6 @@ public class JPAUserDAO extends AbstractAnyDAO<User> implements UserDAO { @Autowired private AccessTokenDAO accessTokenDAO; - @Autowired - private ImplementationLookup implementationLookup; - @Resource(name = "adminUser") private String adminUser; @@ -145,30 +142,24 @@ public class JPAUserDAO extends AbstractAnyDAO<User> implements UserDAO { public Map<String, Integer> countByRealm() { Query query = entityManager().createQuery( "SELECT e.realm, COUNT(e) FROM " + JPAUser.class.getSimpleName() + " e GROUP BY e.realm"); + @SuppressWarnings("unchecked") List<Object[]> results = query.getResultList(); - - Map<String, Integer> countByRealm = new HashMap<>(results.size()); - for (Object[] result : results) { - countByRealm.put(((Realm) result[0]).getFullPath(), ((Number) result[1]).intValue()); - } - - return Collections.unmodifiableMap(countByRealm); + return results.stream().collect(Collectors.toMap( + result -> ((Realm) result[0]).getFullPath(), + result -> ((Number) result[1]).intValue())); } @Override public Map<String, Integer> countByStatus() { Query query = entityManager().createQuery( "SELECT e.status, COUNT(e) FROM " + JPAUser.class.getSimpleName() + " e GROUP BY e.status"); + @SuppressWarnings("unchecked") List<Object[]> results = query.getResultList(); - - Map<String, Integer> countByStatus = new HashMap<>(results.size()); - for (Object[] result : results) { - countByStatus.put(((String) result[0]), ((Number) result[1]).intValue()); - } - - return Collections.unmodifiableMap(countByStatus); + return results.stream().collect(Collectors.toMap( + result -> (String) result[0], + result -> ((Number) result[1]).intValue())); } @Override @@ -304,28 +295,12 @@ public class JPAUserDAO extends AbstractAnyDAO<User> implements UserDAO { throw new PasswordPolicyException("Password mandatory"); } - policy.getRuleConfs().forEach(ruleConf -> { - Class<? extends PasswordRule> ruleClass = - implementationLookup.getPasswordRuleClass(ruleConf.getClass()); - if (ruleClass == null) { - LOG.warn("Could not find matching password rule for {}", ruleConf.getClass()); - } else { - // fetch (or create) rule - PasswordRule rule; - if (ApplicationContextProvider.getBeanFactory().containsSingleton(ruleClass.getName())) { - rule = (PasswordRule) ApplicationContextProvider.getBeanFactory(). - getSingleton(ruleClass.getName()); - } else { - rule = (PasswordRule) ApplicationContextProvider.getBeanFactory(). - createBean(ruleClass, AbstractBeanDefinition.AUTOWIRE_BY_TYPE, false); - ApplicationContextProvider.getBeanFactory(). - registerSingleton(ruleClass.getName(), rule); - } - - // enforce rule - rule.enforce(ruleConf, user); + for (Implementation impl : policy.getRules()) { + Optional<PasswordRule> rule = ImplementationManager.buildPasswordRule(impl); + if (rule.isPresent()) { + rule.get().enforce(user); } - }); + } if (user.verifyPasswordHistory(user.getClearPassword(), policy.getHistoryLength())) { throw new PasswordPolicyException("Password value was used in the past: not allowed"); @@ -376,28 +351,12 @@ public class JPAUserDAO extends AbstractAnyDAO<User> implements UserDAO { } for (AccountPolicy policy : getAccountPolicies(user)) { - policy.getRuleConfs().forEach(ruleConf -> { - Class<? extends AccountRule> ruleClass = - implementationLookup.getAccountRuleClass(ruleConf.getClass()); - if (ruleClass == null) { - LOG.warn("Could not find matching account rule for {}", ruleConf.getClass()); - } else { - // fetch (or create) rule - AccountRule rule; - if (ApplicationContextProvider.getBeanFactory().containsSingleton(ruleClass.getName())) { - rule = (AccountRule) ApplicationContextProvider.getBeanFactory(). - getSingleton(ruleClass.getName()); - } else { - rule = (AccountRule) ApplicationContextProvider.getBeanFactory(). - createBean(ruleClass, AbstractBeanDefinition.AUTOWIRE_BY_TYPE, false); - ApplicationContextProvider.getBeanFactory(). - registerSingleton(ruleClass.getName(), rule); - } - - // enforce rule - rule.enforce(ruleConf, user); + for (Implementation impl : policy.getRules()) { + Optional<AccountRule> rule = ImplementationManager.buildAccountRule(impl); + if (rule.isPresent()) { + rule.get().enforce(user); } - }); + } suspend |= user.getFailedLogins() != null && policy.getMaxAuthenticationAttempts() > 0 && user.getFailedLogins() > policy.getMaxAuthenticationAttempts() && !user.isSuspended(); http://git-wip-us.apache.org/repos/asf/syncope/blob/d5b57922/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractEntity.java ---------------------------------------------------------------------- diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractEntity.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractEntity.java index 08c367d..edc21db 100644 --- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractEntity.java +++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractEntity.java @@ -24,7 +24,9 @@ import java.util.HashSet; import java.util.Set; import org.apache.commons.lang3.builder.EqualsBuilder; import org.apache.commons.lang3.builder.HashCodeBuilder; +import org.apache.syncope.common.lib.types.ImplementationType; import org.apache.syncope.core.persistence.api.entity.Entity; +import org.apache.syncope.core.persistence.api.entity.Implementation; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.BeanUtils; @@ -41,6 +43,12 @@ public abstract class AbstractEntity implements Entity { } } + protected void checkImplementationType(final Implementation object, final ImplementationType expected) { + if (object != null && object.getType() != expected) { + throw new ClassCastException("Expected " + expected + ", got " + object.getType()); + } + } + /** * @param property the integer representing a boolean value * @return the boolean value corresponding to the property param http://git-wip-us.apache.org/repos/asf/syncope/blob/d5b57922/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractPlainAttr.java ---------------------------------------------------------------------- diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractPlainAttr.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractPlainAttr.java index 0070fde..f67adef 100644 --- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractPlainAttr.java +++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractPlainAttr.java @@ -48,7 +48,7 @@ public abstract class AbstractPlainAttr<O extends Any<?>> extends AbstractGenera protected JPAPlainSchema schema; @Override - public PlainSchema getSchema() { + public JPAPlainSchema getSchema() { return schema; } @@ -71,7 +71,7 @@ public abstract class AbstractPlainAttr<O extends Any<?>> extends AbstractGenera checkNonNullSchema(); attrValue.setAttr(this); - getSchema().getValidator().validate(value, attrValue); + getSchema().validator().validate(value, attrValue); if (getSchema().isUniqueConstraint()) { setUniqueValue((PlainAttrUniqueValue) attrValue); http://git-wip-us.apache.org/repos/asf/syncope/blob/d5b57922/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAEntityFactory.java ---------------------------------------------------------------------- diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAEntityFactory.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAEntityFactory.java index 985bfa0..3223f18 100644 --- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAEntityFactory.java +++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAEntityFactory.java @@ -127,6 +127,7 @@ import org.apache.syncope.core.persistence.api.entity.resource.OrgUnit; import org.apache.syncope.core.persistence.jpa.entity.resource.JPAOrgUnit; import org.apache.syncope.core.persistence.api.entity.DynRealm; import org.apache.syncope.core.persistence.api.entity.DynRealmMembership; +import org.apache.syncope.core.persistence.api.entity.Implementation; import org.apache.syncope.core.persistence.api.entity.resource.ExternalResourceHistoryConf; import org.apache.syncope.core.persistence.api.entity.resource.OrgUnitItem; import org.apache.syncope.core.persistence.jpa.entity.resource.JPAExternalResourceHistoryConf; @@ -272,6 +273,8 @@ public class JPAEntityFactory implements EntityFactory { result = (E) new JPAUDynGroupMembership(); } else if (reference.equals(AccessToken.class)) { result = (E) new JPAAccessToken(); + } else if (reference.equals(Implementation.class)) { + result = (E) new JPAImplementation(); } else { throw new IllegalArgumentException("Could not find a JPA implementation of " + reference.getName()); } http://git-wip-us.apache.org/repos/asf/syncope/blob/d5b57922/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAImplementation.java ---------------------------------------------------------------------- diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAImplementation.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAImplementation.java new file mode 100644 index 0000000..dfa1134 --- /dev/null +++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAImplementation.java @@ -0,0 +1,82 @@ +/* + * 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 javax.persistence.Cacheable; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; +import javax.persistence.Lob; +import javax.persistence.Table; +import org.apache.syncope.common.lib.types.ImplementationEngine; +import org.apache.syncope.common.lib.types.ImplementationType; +import org.apache.syncope.core.persistence.api.entity.Implementation; + +@Entity +@Table(name = JPAImplementation.TABLE) +@Cacheable +public class JPAImplementation extends AbstractProvidedKeyEntity implements Implementation { + + public static final String TABLE = "Implementation"; + + private static final long serialVersionUID = 8700713975100295322L; + + @Column(nullable = false) + @Enumerated(EnumType.STRING) + private ImplementationEngine engine; + + @Column(nullable = false) + @Enumerated(EnumType.STRING) + private ImplementationType type; + + @Lob + private String body; + + @Override + public ImplementationEngine getEngine() { + return engine; + } + + @Override + public void setEngine(final ImplementationEngine engine) { + this.engine = engine; + } + + @Override + public ImplementationType getType() { + return type; + } + + @Override + public void setType(final ImplementationType type) { + this.type = type; + } + + @Override + public String getBody() { + return body; + } + + @Override + public void setBody(final String body) { + this.body = body; + } + +} http://git-wip-us.apache.org/repos/asf/syncope/blob/d5b57922/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPANotification.java ---------------------------------------------------------------------- diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPANotification.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPANotification.java index bd9a148..b895d65 100644 --- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPANotification.java +++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPANotification.java @@ -33,13 +33,16 @@ import javax.persistence.FetchType; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.persistence.OneToMany; +import javax.persistence.OneToOne; import javax.persistence.Table; import javax.validation.constraints.Max; import javax.validation.constraints.Min; import javax.validation.constraints.NotNull; +import org.apache.syncope.common.lib.types.ImplementationType; import org.apache.syncope.common.lib.types.TraceLevel; import org.apache.syncope.core.persistence.api.entity.AnyAbout; import org.apache.syncope.core.persistence.api.entity.AnyType; +import org.apache.syncope.core.persistence.api.entity.Implementation; import org.apache.syncope.core.persistence.api.entity.MailTemplate; import org.apache.syncope.core.persistence.api.entity.Notification; @@ -73,7 +76,8 @@ public class JPANotification extends AbstractGeneratedKeyEntity implements Notif @NotNull private String recipientAttrName; - private String recipientsProviderClassName; + @OneToOne + private JPAImplementation recipientsProvider; @NotNull @Basic @@ -131,13 +135,15 @@ public class JPANotification extends AbstractGeneratedKeyEntity implements Notif } @Override - public String getRecipientsProviderClassName() { - return recipientsProviderClassName; + public Implementation getRecipientsProvider() { + return recipientsProvider; } @Override - public void setRecipientsProviderClassName(final String recipientsProviderClassName) { - this.recipientsProviderClassName = recipientsProviderClassName; + public void setRecipientsProvider(final Implementation recipientsProvider) { + checkType(recipientsProvider, JPAImplementation.class); + checkImplementationType(recipientsProvider, ImplementationType.RECIPIENTS_PROVIDER); + this.recipientsProvider = (JPAImplementation) recipientsProvider; } @Override http://git-wip-us.apache.org/repos/asf/syncope/blob/d5b57922/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAPlainSchema.java ---------------------------------------------------------------------- diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAPlainSchema.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAPlainSchema.java index 8a1dcdd..e97017f 100644 --- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAPlainSchema.java +++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAPlainSchema.java @@ -18,7 +18,6 @@ */ package org.apache.syncope.core.persistence.jpa.entity; -import java.lang.reflect.Constructor; import javax.persistence.Basic; import javax.persistence.Column; import javax.persistence.Entity; @@ -35,11 +34,14 @@ import javax.validation.constraints.Min; import javax.validation.constraints.NotNull; import org.apache.syncope.common.lib.types.AttrSchemaType; import org.apache.syncope.common.lib.types.CipherAlgorithm; +import org.apache.syncope.common.lib.types.ImplementationType; import org.apache.syncope.core.persistence.api.attrvalue.validation.Validator; import org.apache.syncope.core.persistence.api.entity.AnyTypeClass; +import org.apache.syncope.core.persistence.api.entity.Implementation; import org.apache.syncope.core.persistence.api.entity.PlainSchema; import org.apache.syncope.core.persistence.jpa.attrvalue.validation.BasicValidator; import org.apache.syncope.core.persistence.jpa.validation.entity.PlainSchemaCheck; +import org.apache.syncope.core.spring.ImplementationManager; @Entity @Table(name = JPAPlainSchema.TABLE) @@ -100,8 +102,11 @@ public class JPAPlainSchema extends AbstractSchema implements PlainSchema { @Column(nullable = true) private String mimeType; + @OneToOne + private JPAImplementation validator; + @Transient - private Validator validator; + private Validator validatorImpl; public JPAPlainSchema() { super(); @@ -174,38 +179,37 @@ public class JPAPlainSchema extends AbstractSchema implements PlainSchema { this.readonly = getBooleanAsInteger(readonly); } - @Override - public Validator getValidator() { - if (validator != null) { - return validator; + public Validator validator() { + if (validatorImpl != null) { + return validatorImpl; } - if (getValidatorClass() != null && getValidatorClass().length() > 0) { + if (getValidator() != null) { try { - Constructor<?> validatorConstructor = Class.forName(getValidatorClass()). - getConstructor(new Class<?>[] { PlainSchema.class }); - validator = (Validator) validatorConstructor.newInstance(this); + validatorImpl = ImplementationManager.build(getValidator()); } catch (Exception e) { - LOG.error("Could not instantiate validator of type {}, reverting to {}", - getValidatorClass(), BasicValidator.class.getSimpleName(), e); + LOG.error("While building {}", getValidator(), e); } } - if (validator == null) { - validator = new BasicValidator(this); + if (validatorImpl == null) { + validatorImpl = new BasicValidator(); } + validatorImpl.setSchema(this); - return validator; + return validatorImpl; } @Override - public String getValidatorClass() { - return validatorClass; + public Implementation getValidator() { + return validator; } @Override - public void setValidatorClass(final String validatorClass) { - this.validatorClass = validatorClass; + public void setValidator(final Implementation validator) { + checkType(validator, JPAImplementation.class); + checkImplementationType(validator, ImplementationType.VALIDATOR); + this.validator = (JPAImplementation) validator; } @Override http://git-wip-us.apache.org/repos/asf/syncope/blob/d5b57922/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPARealm.java ---------------------------------------------------------------------- diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPARealm.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPARealm.java index 40017fe..49bb739 100644 --- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPARealm.java +++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPARealm.java @@ -19,16 +19,11 @@ package org.apache.syncope.core.persistence.jpa.entity; import java.util.ArrayList; -import java.util.HashSet; import java.util.List; import java.util.Optional; -import java.util.Set; import java.util.stream.Collectors; import javax.persistence.Cacheable; import javax.persistence.CascadeType; -import javax.persistence.CollectionTable; -import javax.persistence.Column; -import javax.persistence.ElementCollection; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.JoinColumn; @@ -41,8 +36,10 @@ import javax.persistence.UniqueConstraint; import javax.validation.constraints.Size; import org.apache.commons.lang3.StringUtils; import org.apache.syncope.common.lib.SyncopeConstants; +import org.apache.syncope.common.lib.types.ImplementationType; 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.Implementation; import org.apache.syncope.core.persistence.api.entity.policy.AccountPolicy; import org.apache.syncope.core.persistence.api.entity.policy.PasswordPolicy; import org.apache.syncope.core.persistence.api.entity.Realm; @@ -75,12 +72,13 @@ public class JPARealm extends AbstractGeneratedKeyEntity implements Realm { @ManyToOne(fetch = FetchType.EAGER) private JPAAccountPolicy accountPolicy; - @ElementCollection(fetch = FetchType.EAGER) - @Column(name = "actionClassName") - @CollectionTable(name = "Realm_actionsClassNames", + @ManyToMany(fetch = FetchType.EAGER) + @JoinTable(name = TABLE + "Action", joinColumns = - @JoinColumn(name = "realm_id", referencedColumnName = "id")) - private Set<String> actionsClassNames = new HashSet<>(); + @JoinColumn(name = "realm_id"), + inverseJoinColumns = + @JoinColumn(name = "implementation_id")) + private List<JPAImplementation> actions = new ArrayList<>(); @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER, mappedBy = "realm") private List<JPAAnyTemplateRealm> templates = new ArrayList<>(); @@ -143,8 +141,15 @@ public class JPARealm extends AbstractGeneratedKeyEntity implements Realm { } @Override - public Set<String> getActionsClassNames() { - return actionsClassNames; + public boolean add(final Implementation action) { + checkType(action, JPAImplementation.class); + checkImplementationType(action, ImplementationType.LOGIC_ACTIONS); + return actions.contains((JPAImplementation) action) || actions.add((JPAImplementation) action); + } + + @Override + public List<? extends Implementation> getActions() { + return actions; } @Override http://git-wip-us.apache.org/repos/asf/syncope/blob/d5b57922/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAReport.java ---------------------------------------------------------------------- diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAReport.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAReport.java index a048ef4..29e7bf7 100644 --- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAReport.java +++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAReport.java @@ -20,20 +20,22 @@ package org.apache.syncope.core.persistence.jpa.entity; import java.util.ArrayList; import java.util.List; -import java.util.stream.Collectors; import javax.persistence.Basic; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.JoinColumn; +import javax.persistence.JoinTable; +import javax.persistence.ManyToMany; import javax.persistence.ManyToOne; import javax.persistence.OneToMany; import javax.persistence.Table; import javax.validation.constraints.Max; import javax.validation.constraints.Min; import javax.validation.constraints.NotNull; -import org.apache.syncope.common.lib.report.ReportletConf; +import org.apache.syncope.common.lib.types.ImplementationType; +import org.apache.syncope.core.persistence.api.entity.Implementation; import org.apache.syncope.core.persistence.api.entity.Report; import org.apache.syncope.core.persistence.api.entity.ReportExec; import org.apache.syncope.core.persistence.api.entity.ReportTemplate; @@ -51,8 +53,13 @@ public class JPAReport extends AbstractGeneratedKeyEntity implements Report { @Column(unique = true, nullable = false) private String name; - @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER, mappedBy = "report") - private List<JPAReportletConfInstance> reportletConfs = new ArrayList<>(); + @ManyToMany(fetch = FetchType.EAGER) + @JoinTable(name = TABLE + "Reportlet", + joinColumns = + @JoinColumn(name = "report_id"), + inverseJoinColumns = + @JoinColumn(name = "implementation_id")) + private List<JPAImplementation> reportlets = new ArrayList<>(); private String cronExpression; @@ -91,26 +98,15 @@ public class JPAReport extends AbstractGeneratedKeyEntity implements Report { } @Override - public boolean add(final ReportletConf reportletConf) { - if (reportletConf == null) { - return false; - } - - JPAReportletConfInstance instance = new JPAReportletConfInstance(); - instance.setReport(this); - instance.setInstance(reportletConf); - - return reportletConfs.add(instance); - } - - @Override - public void removeAllReportletConfs() { - reportletConfs.clear(); + public boolean add(final Implementation reportlet) { + checkType(reportlet, JPAImplementation.class); + checkImplementationType(reportlet, ImplementationType.REPORTLET); + return reportlets.contains((JPAImplementation) reportlet) || reportlets.add((JPAImplementation) reportlet); } @Override - public List<ReportletConf> getReportletConfs() { - return reportletConfs.stream().map(input -> input.getInstance()).collect(Collectors.toList()); + public List<? extends Implementation> getReportlets() { + return reportlets; } @Override http://git-wip-us.apache.org/repos/asf/syncope/blob/d5b57922/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAReportletConfInstance.java ---------------------------------------------------------------------- diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAReportletConfInstance.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAReportletConfInstance.java deleted file mode 100644 index 1fe7c37..0000000 --- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAReportletConfInstance.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * 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 javax.persistence.Entity; -import javax.persistence.Lob; -import javax.persistence.ManyToOne; -import javax.persistence.Table; -import org.apache.syncope.common.lib.report.ReportletConf; -import org.apache.syncope.core.persistence.api.entity.Report; -import org.apache.syncope.core.provisioning.api.serialization.POJOHelper; - -@Entity -@Table(name = JPAReportletConfInstance.TABLE) -public class JPAReportletConfInstance extends AbstractGeneratedKeyEntity { - - private static final long serialVersionUID = -2436055132955674610L; - - public static final String TABLE = "ReportletConfInstance"; - - @Lob - private String serializedInstance; - - @ManyToOne - private JPAReport report; - - public Report getReport() { - return report; - } - - public void setReport(final Report report) { - checkType(report, JPAReport.class); - this.report = (JPAReport) report; - } - - public ReportletConf getInstance() { - return serializedInstance == null - ? null - : POJOHelper.deserialize(serializedInstance, ReportletConf.class); - } - - public void setInstance(final ReportletConf instance) { - this.serializedInstance = instance == null - ? null - : POJOHelper.serialize(instance); - } -} http://git-wip-us.apache.org/repos/asf/syncope/blob/d5b57922/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/policy/JPAAccountPolicy.java ---------------------------------------------------------------------- diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/policy/JPAAccountPolicy.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/policy/JPAAccountPolicy.java index 200716d..aebad0b 100644 --- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/policy/JPAAccountPolicy.java +++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/policy/JPAAccountPolicy.java @@ -22,21 +22,20 @@ import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; -import java.util.stream.Collectors; import javax.persistence.Basic; -import javax.persistence.CascadeType; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.JoinColumn; import javax.persistence.JoinTable; import javax.persistence.ManyToMany; -import javax.persistence.OneToMany; import javax.persistence.Table; import javax.validation.constraints.Max; import javax.validation.constraints.Min; -import org.apache.syncope.common.lib.policy.AccountRuleConf; +import org.apache.syncope.common.lib.types.ImplementationType; +import org.apache.syncope.core.persistence.api.entity.Implementation; import org.apache.syncope.core.persistence.api.entity.policy.AccountPolicy; import org.apache.syncope.core.persistence.api.entity.resource.ExternalResource; +import org.apache.syncope.core.persistence.jpa.entity.JPAImplementation; import org.apache.syncope.core.persistence.jpa.entity.resource.JPAExternalResource; @Entity @@ -54,8 +53,13 @@ public class JPAAccountPolicy extends AbstractPolicy implements AccountPolicy { private int maxAuthenticationAttempts; - @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER, mappedBy = "accountPolicy") - private List<JPAAccountRuleConfInstance> ruleConfs = new ArrayList<>(); + @ManyToMany(fetch = FetchType.EAGER) + @JoinTable(name = TABLE + "Rule", + joinColumns = + @JoinColumn(name = "policy_id"), + inverseJoinColumns = + @JoinColumn(name = "implementation_id")) + private List<JPAImplementation> rules = new ArrayList<>(); /** * Resources for alternative user authentication: if empty, only internal storage will be used. @@ -88,26 +92,15 @@ public class JPAAccountPolicy extends AbstractPolicy implements AccountPolicy { } @Override - public boolean add(final AccountRuleConf accountRuleConf) { - if (accountRuleConf == null) { - return false; - } - - JPAAccountRuleConfInstance instance = new JPAAccountRuleConfInstance(); - instance.setAccountPolicy(this); - instance.setInstance(accountRuleConf); - - return ruleConfs.add(instance); - } - - @Override - public void removeAllRuleConfs() { - ruleConfs.clear(); + public boolean add(final Implementation rule) { + checkType(rule, JPAImplementation.class); + checkImplementationType(rule, ImplementationType.ACCOUNT_RULE); + return rules.contains((JPAImplementation) rule) || rules.add((JPAImplementation) rule); } @Override - public List<AccountRuleConf> getRuleConfs() { - return ruleConfs.stream().map(input -> input.getInstance()).collect(Collectors.toList()); + public List<? extends Implementation> getRules() { + return rules; } @Override @@ -120,9 +113,4 @@ public class JPAAccountPolicy extends AbstractPolicy implements AccountPolicy { public Set<? extends ExternalResource> getResources() { return resources; } - - @Override - public Set<String> getResourceKeys() { - return getResources().stream().map(resource -> resource.getKey()).collect(Collectors.toSet()); - } } http://git-wip-us.apache.org/repos/asf/syncope/blob/d5b57922/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/policy/JPAAccountRuleConfInstance.java ---------------------------------------------------------------------- diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/policy/JPAAccountRuleConfInstance.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/policy/JPAAccountRuleConfInstance.java deleted file mode 100644 index 7272c6e..0000000 --- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/policy/JPAAccountRuleConfInstance.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * 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.policy; - -import javax.persistence.Entity; -import javax.persistence.Lob; -import javax.persistence.ManyToOne; -import javax.persistence.Table; -import org.apache.syncope.common.lib.policy.AccountRuleConf; -import org.apache.syncope.core.provisioning.api.serialization.POJOHelper; -import org.apache.syncope.core.persistence.api.entity.policy.AccountPolicy; -import org.apache.syncope.core.persistence.jpa.entity.AbstractGeneratedKeyEntity; - -@Entity -@Table(name = JPAAccountRuleConfInstance.TABLE) -public class JPAAccountRuleConfInstance extends AbstractGeneratedKeyEntity { - - private static final long serialVersionUID = -2436055132955674610L; - - public static final String TABLE = "AccountRuleConfInstance"; - - @Lob - private String serializedInstance; - - @ManyToOne - private JPAAccountPolicy accountPolicy; - - public AccountPolicy getAccountPolicy() { - return accountPolicy; - } - - public void setAccountPolicy(final AccountPolicy report) { - checkType(report, JPAAccountPolicy.class); - this.accountPolicy = (JPAAccountPolicy) report; - } - - public AccountRuleConf getInstance() { - return serializedInstance == null - ? null - : POJOHelper.deserialize(serializedInstance, AccountRuleConf.class); - } - - public void setInstance(final AccountRuleConf instance) { - this.serializedInstance = instance == null - ? null - : POJOHelper.serialize(instance); - } -} http://git-wip-us.apache.org/repos/asf/syncope/blob/d5b57922/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/policy/JPAPasswordPolicy.java ---------------------------------------------------------------------- diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/policy/JPAPasswordPolicy.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/policy/JPAPasswordPolicy.java index 1ea375d..fddf5ed 100644 --- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/policy/JPAPasswordPolicy.java +++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/policy/JPAPasswordPolicy.java @@ -20,17 +20,19 @@ package org.apache.syncope.core.persistence.jpa.entity.policy; import java.util.ArrayList; import java.util.List; -import java.util.stream.Collectors; import javax.persistence.Basic; -import javax.persistence.CascadeType; import javax.persistence.Entity; import javax.persistence.FetchType; -import javax.persistence.OneToMany; +import javax.persistence.JoinColumn; +import javax.persistence.JoinTable; +import javax.persistence.ManyToMany; import javax.persistence.Table; import javax.validation.constraints.Max; import javax.validation.constraints.Min; -import org.apache.syncope.common.lib.policy.PasswordRuleConf; +import org.apache.syncope.common.lib.types.ImplementationType; +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.jpa.entity.JPAImplementation; @Entity @Table(name = JPAPasswordPolicy.TABLE) @@ -47,8 +49,13 @@ public class JPAPasswordPolicy extends AbstractPolicy implements PasswordPolicy private int historyLength; - @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER, mappedBy = "passwordPolicy") - private List<JPAPasswordRuleConfInstance> ruleConfs = new ArrayList<>(); + @ManyToMany(fetch = FetchType.EAGER) + @JoinTable(name = TABLE + "Rule", + joinColumns = + @JoinColumn(name = "policy_id"), + inverseJoinColumns = + @JoinColumn(name = "implementation_id")) + private List<JPAImplementation> rules = new ArrayList<>(); @Override public boolean isAllowNullPassword() { @@ -71,25 +78,14 @@ public class JPAPasswordPolicy extends AbstractPolicy implements PasswordPolicy } @Override - public boolean add(final PasswordRuleConf passwordRuleConf) { - if (passwordRuleConf == null) { - return false; - } - - JPAPasswordRuleConfInstance instance = new JPAPasswordRuleConfInstance(); - instance.setPasswordPolicy(this); - instance.setInstance(passwordRuleConf); - - return ruleConfs.add(instance); - } - - @Override - public void removeAllRuleConfs() { - ruleConfs.clear(); + public boolean add(final Implementation rule) { + checkType(rule, JPAImplementation.class); + checkImplementationType(rule, ImplementationType.PASSWORD_RULE); + return rules.contains((JPAImplementation) rule) || rules.add((JPAImplementation) rule); } @Override - public List<PasswordRuleConf> getRuleConfs() { - return ruleConfs.stream().map(input -> input.getInstance()).collect(Collectors.toList()); + public List<? extends Implementation> getRules() { + return rules; } } http://git-wip-us.apache.org/repos/asf/syncope/blob/d5b57922/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/policy/JPAPasswordRuleConfInstance.java ---------------------------------------------------------------------- diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/policy/JPAPasswordRuleConfInstance.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/policy/JPAPasswordRuleConfInstance.java deleted file mode 100644 index 788496f..0000000 --- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/policy/JPAPasswordRuleConfInstance.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * 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.policy; - -import javax.persistence.Entity; -import javax.persistence.Lob; -import javax.persistence.ManyToOne; -import javax.persistence.Table; -import org.apache.syncope.common.lib.policy.PasswordRuleConf; -import org.apache.syncope.core.provisioning.api.serialization.POJOHelper; -import org.apache.syncope.core.persistence.api.entity.policy.PasswordPolicy; -import org.apache.syncope.core.persistence.jpa.entity.AbstractGeneratedKeyEntity; - -@Entity -@Table(name = JPAPasswordRuleConfInstance.TABLE) -public class JPAPasswordRuleConfInstance extends AbstractGeneratedKeyEntity { - - private static final long serialVersionUID = -2436055132955674610L; - - public static final String TABLE = "PasswordRuleConfInstance"; - - @Lob - private String serializedInstance; - - @ManyToOne - private JPAPasswordPolicy passwordPolicy; - - public PasswordPolicy getPasswordPolicy() { - return passwordPolicy; - } - - public void setPasswordPolicy(final PasswordPolicy report) { - checkType(report, JPAPasswordPolicy.class); - this.passwordPolicy = (JPAPasswordPolicy) report; - } - - public PasswordRuleConf getInstance() { - return serializedInstance == null - ? null - : POJOHelper.deserialize(serializedInstance, PasswordRuleConf.class); - } - - public void setInstance(final PasswordRuleConf instance) { - this.serializedInstance = instance == null - ? null - : POJOHelper.serialize(instance); - } -} http://git-wip-us.apache.org/repos/asf/syncope/blob/d5b57922/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/resource/JPAExternalResource.java ---------------------------------------------------------------------- diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/resource/JPAExternalResource.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/resource/JPAExternalResource.java index 8283df0..0dd78ea 100644 --- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/resource/JPAExternalResource.java +++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/resource/JPAExternalResource.java @@ -35,7 +35,9 @@ import javax.persistence.EnumType; import javax.persistence.Enumerated; import javax.persistence.FetchType; import javax.persistence.JoinColumn; +import javax.persistence.JoinTable; import javax.persistence.Lob; +import javax.persistence.ManyToMany; import javax.persistence.ManyToOne; import javax.persistence.OneToMany; import javax.persistence.OneToOne; @@ -46,6 +48,7 @@ import javax.validation.constraints.NotNull; import org.apache.commons.lang3.StringUtils; import org.apache.syncope.common.lib.types.ConnConfProperty; import org.apache.syncope.common.lib.types.ConnectorCapability; +import org.apache.syncope.common.lib.types.ImplementationType; import org.apache.syncope.common.lib.types.TraceLevel; import org.apache.syncope.core.persistence.api.entity.policy.AccountPolicy; import org.apache.syncope.core.persistence.api.entity.ConnInstance; @@ -53,6 +56,7 @@ import org.apache.syncope.core.persistence.api.entity.policy.PasswordPolicy; import org.apache.syncope.core.persistence.jpa.validation.entity.ExternalResourceCheck; import org.apache.syncope.core.provisioning.api.serialization.POJOHelper; import org.apache.syncope.core.persistence.api.entity.AnyType; +import org.apache.syncope.core.persistence.api.entity.Implementation; import org.apache.syncope.core.persistence.api.entity.resource.ExternalResource; import org.apache.syncope.core.persistence.api.entity.resource.Provision; import org.apache.syncope.core.persistence.jpa.entity.policy.JPAAccountPolicy; @@ -62,6 +66,7 @@ import org.apache.syncope.core.persistence.jpa.entity.policy.JPAPullPolicy; import org.apache.syncope.core.persistence.api.entity.policy.PullPolicy; import org.apache.syncope.core.persistence.api.entity.resource.OrgUnit; import org.apache.syncope.core.persistence.jpa.entity.AbstractProvidedKeyEntity; +import org.apache.syncope.core.persistence.jpa.entity.JPAImplementation; import org.identityconnectors.framework.common.objects.ObjectClass; /** @@ -156,15 +161,13 @@ public class JPAExternalResource extends AbstractProvidedKeyEntity implements Ex @JoinColumn(name = "resource_id", referencedColumnName = "id")) private Set<ConnectorCapability> capabilitiesOverride = new HashSet<>(); - /** - * (Optional) classes for PropagationAction. - */ - @ElementCollection(fetch = FetchType.EAGER) - @Column(name = "actionClassName") - @CollectionTable(name = "ExternalResource_PropActions", + @ManyToMany(fetch = FetchType.EAGER) + @JoinTable(name = TABLE + "PropagationAction", joinColumns = - @JoinColumn(name = "resource_id", referencedColumnName = "id")) - private List<String> propagationActionsClassNames = new ArrayList<>(); + @JoinColumn(name = "resource_id"), + inverseJoinColumns = + @JoinColumn(name = "implementation_id")) + private List<JPAImplementation> propagationActions = new ArrayList<>(); public JPAExternalResource() { super(); @@ -357,7 +360,16 @@ public class JPAExternalResource extends AbstractProvidedKeyEntity implements Ex } @Override - public List<String> getPropagationActionsClassNames() { - return propagationActionsClassNames; + public boolean add(final Implementation propagationAction) { + checkType(propagationAction, JPAImplementation.class); + checkImplementationType(propagationAction, ImplementationType.PROPAGATION_ACTIONS); + return propagationActions.contains((JPAImplementation) propagationAction) + || propagationActions.add((JPAImplementation) propagationAction); } + + @Override + public List<? extends Implementation> getPropagationActions() { + return propagationActions; + } + } http://git-wip-us.apache.org/repos/asf/syncope/blob/d5b57922/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/resource/JPAMappingItem.java ---------------------------------------------------------------------- diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/resource/JPAMappingItem.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/resource/JPAMappingItem.java index 8624a70..1f55c8d 100644 --- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/resource/JPAMappingItem.java +++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/resource/JPAMappingItem.java @@ -21,16 +21,18 @@ package org.apache.syncope.core.persistence.jpa.entity.resource; import java.util.ArrayList; import java.util.List; import javax.persistence.Cacheable; -import javax.persistence.CollectionTable; -import javax.persistence.Column; -import javax.persistence.ElementCollection; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.JoinColumn; +import javax.persistence.JoinTable; +import javax.persistence.ManyToMany; import javax.persistence.ManyToOne; import javax.persistence.Table; +import org.apache.syncope.common.lib.types.ImplementationType; +import org.apache.syncope.core.persistence.api.entity.Implementation; import org.apache.syncope.core.persistence.api.entity.resource.Mapping; import org.apache.syncope.core.persistence.api.entity.resource.MappingItem; +import org.apache.syncope.core.persistence.jpa.entity.JPAImplementation; @Entity @Table(name = JPAMappingItem.TABLE) @@ -44,15 +46,13 @@ public class JPAMappingItem extends AbstractItem implements MappingItem { @ManyToOne private JPAMapping mapping; - /** - * (Optional) classes for MappingItem transformation. - */ - @ElementCollection(fetch = FetchType.EAGER) - @Column(name = "transformerClassName") - @CollectionTable(name = TABLE + "_Transformer", + @ManyToMany(fetch = FetchType.EAGER) + @JoinTable(name = TABLE + "Transformer", joinColumns = - @JoinColumn(name = "mappingItem_id", referencedColumnName = "id")) - private List<String> transformerClassNames = new ArrayList<>(); + @JoinColumn(name = "item_id"), + inverseJoinColumns = + @JoinColumn(name = "implementation_id")) + private List<JPAImplementation> transformers = new ArrayList<>(); @Override public Mapping getMapping() { @@ -66,7 +66,16 @@ public class JPAMappingItem extends AbstractItem implements MappingItem { } @Override - public List<String> getTransformerClassNames() { - return transformerClassNames; + public boolean add(final Implementation transformer) { + checkType(transformer, JPAImplementation.class); + checkImplementationType(transformer, ImplementationType.ITEM_TRANSFORMER); + return transformers.contains((JPAImplementation) transformer) + || transformers.add((JPAImplementation) transformer); } + + @Override + public List<? extends Implementation> getTransformers() { + return transformers; + } + } http://git-wip-us.apache.org/repos/asf/syncope/blob/d5b57922/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/resource/JPAOrgUnitItem.java ---------------------------------------------------------------------- diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/resource/JPAOrgUnitItem.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/resource/JPAOrgUnitItem.java index 24f59ce..769ca9f 100644 --- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/resource/JPAOrgUnitItem.java +++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/resource/JPAOrgUnitItem.java @@ -21,16 +21,18 @@ package org.apache.syncope.core.persistence.jpa.entity.resource; import java.util.ArrayList; import java.util.List; import javax.persistence.Cacheable; -import javax.persistence.CollectionTable; -import javax.persistence.Column; -import javax.persistence.ElementCollection; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.JoinColumn; +import javax.persistence.JoinTable; +import javax.persistence.ManyToMany; import javax.persistence.ManyToOne; import javax.persistence.Table; +import org.apache.syncope.common.lib.types.ImplementationType; +import org.apache.syncope.core.persistence.api.entity.Implementation; import org.apache.syncope.core.persistence.api.entity.resource.OrgUnit; import org.apache.syncope.core.persistence.api.entity.resource.OrgUnitItem; +import org.apache.syncope.core.persistence.jpa.entity.JPAImplementation; @Entity @Table(name = JPAOrgUnitItem.TABLE) @@ -44,15 +46,13 @@ public class JPAOrgUnitItem extends AbstractItem implements OrgUnitItem { @ManyToOne private JPAOrgUnit orgUnit; - /** - * (Optional) classes for Item transformation. - */ - @ElementCollection(fetch = FetchType.EAGER) - @Column(name = "transformerClassName") - @CollectionTable(name = TABLE + "_Transformer", + @ManyToMany(fetch = FetchType.EAGER) + @JoinTable(name = TABLE + "Transformer", joinColumns = - @JoinColumn(name = "orgUnitItem_id", referencedColumnName = "id")) - private List<String> transformerClassNames = new ArrayList<>(); + @JoinColumn(name = "item_id"), + inverseJoinColumns = + @JoinColumn(name = "implementation_id")) + private List<JPAImplementation> transformers = new ArrayList<>(); @Override public OrgUnit getOrgUnit() { @@ -66,7 +66,15 @@ public class JPAOrgUnitItem extends AbstractItem implements OrgUnitItem { } @Override - public List<String> getTransformerClassNames() { - return transformerClassNames; + public boolean add(final Implementation transformer) { + checkType(transformer, JPAImplementation.class); + checkImplementationType(transformer, ImplementationType.ITEM_TRANSFORMER); + return transformers.contains((JPAImplementation) transformer) + || transformers.add((JPAImplementation) transformer); + } + + @Override + public List<? extends Implementation> getTransformers() { + return transformers; } } http://git-wip-us.apache.org/repos/asf/syncope/blob/d5b57922/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/task/JPAPullTask.java ---------------------------------------------------------------------- diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/task/JPAPullTask.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/task/JPAPullTask.java index 54f70cf..d42c3ea 100644 --- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/task/JPAPullTask.java +++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/task/JPAPullTask.java @@ -19,29 +19,30 @@ package org.apache.syncope.core.persistence.jpa.entity.task; import java.util.ArrayList; -import java.util.HashSet; import java.util.List; import java.util.Optional; -import java.util.Set; import javax.persistence.CascadeType; -import javax.persistence.CollectionTable; -import javax.persistence.Column; import javax.persistence.DiscriminatorValue; -import javax.persistence.ElementCollection; import javax.persistence.Entity; import javax.persistence.EnumType; import javax.persistence.Enumerated; import javax.persistence.FetchType; import javax.persistence.JoinColumn; +import javax.persistence.JoinTable; +import javax.persistence.ManyToMany; import javax.persistence.ManyToOne; import javax.persistence.OneToMany; +import javax.persistence.OneToOne; import javax.validation.constraints.NotNull; +import org.apache.syncope.common.lib.types.ImplementationType; import org.apache.syncope.common.lib.types.PullMode; import org.apache.syncope.core.persistence.api.entity.AnyType; +import org.apache.syncope.core.persistence.api.entity.Implementation; import org.apache.syncope.core.persistence.api.entity.Realm; import org.apache.syncope.core.persistence.jpa.entity.JPARealm; import org.apache.syncope.core.persistence.api.entity.task.PullTask; import org.apache.syncope.core.persistence.api.entity.task.AnyTemplatePullTask; +import org.apache.syncope.core.persistence.jpa.entity.JPAImplementation; @Entity @DiscriminatorValue("PullTask") @@ -53,17 +54,19 @@ public class JPAPullTask extends AbstractProvisioningTask implements PullTask { @NotNull private PullMode pullMode; - private String reconciliationFilterBuilderClassName; + @OneToOne + private JPAImplementation reconFilterBuilder; @ManyToOne(fetch = FetchType.EAGER, optional = false) private JPARealm destinationRealm; - @ElementCollection(fetch = FetchType.EAGER) - @Column(name = "actionClassName") - @CollectionTable(name = "PullTask_actionsClassNames", + @ManyToMany(fetch = FetchType.EAGER) + @JoinTable(name = "PullTaskAction", joinColumns = - @JoinColumn(name = "pullTask_id", referencedColumnName = "id")) - private Set<String> actionsClassNames = new HashSet<>(); + @JoinColumn(name = "task_id"), + inverseJoinColumns = + @JoinColumn(name = "implementation_id")) + private List<JPAImplementation> actions = new ArrayList<>(); @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER, mappedBy = "pullTask") private List<JPAAnyTemplatePullTask> templates = new ArrayList<>(); @@ -79,13 +82,15 @@ public class JPAPullTask extends AbstractProvisioningTask implements PullTask { } @Override - public String getReconciliationFilterBuilderClassName() { - return reconciliationFilterBuilderClassName; + public Implementation getReconFilterBuilder() { + return reconFilterBuilder; } @Override - public void setReconciliationFilterBuilderClassName(final String reconciliationFilterBuilderClassName) { - this.reconciliationFilterBuilderClassName = reconciliationFilterBuilderClassName; + public void setReconFilterBuilder(final Implementation reconFilterBuilder) { + checkType(reconFilterBuilder, JPAImplementation.class); + checkImplementationType(reconFilterBuilder, ImplementationType.RECON_FILTER_BUILDER); + this.reconFilterBuilder = (JPAImplementation) reconFilterBuilder; } @Override @@ -100,8 +105,15 @@ public class JPAPullTask extends AbstractProvisioningTask implements PullTask { } @Override - public Set<String> getActionsClassNames() { - return actionsClassNames; + public boolean add(final Implementation action) { + checkType(action, JPAImplementation.class); + checkImplementationType(action, ImplementationType.PULL_ACTIONS); + return actions.contains((JPAImplementation) action) || actions.add((JPAImplementation) action); + } + + @Override + public List<? extends Implementation> getActions() { + return actions; } @Override http://git-wip-us.apache.org/repos/asf/syncope/blob/d5b57922/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/task/JPAPushTask.java ---------------------------------------------------------------------- diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/task/JPAPushTask.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/task/JPAPushTask.java index efa84b7..abadd8c 100644 --- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/task/JPAPushTask.java +++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/task/JPAPushTask.java @@ -19,24 +19,24 @@ package org.apache.syncope.core.persistence.jpa.entity.task; import java.util.ArrayList; -import java.util.HashSet; import java.util.List; import java.util.Optional; -import java.util.Set; import javax.persistence.CascadeType; -import javax.persistence.CollectionTable; -import javax.persistence.Column; import javax.persistence.DiscriminatorValue; -import javax.persistence.ElementCollection; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.JoinColumn; +import javax.persistence.JoinTable; +import javax.persistence.ManyToMany; import javax.persistence.ManyToOne; import javax.persistence.OneToMany; +import org.apache.syncope.common.lib.types.ImplementationType; import org.apache.syncope.core.persistence.api.entity.AnyType; +import org.apache.syncope.core.persistence.api.entity.Implementation; import org.apache.syncope.core.persistence.api.entity.Realm; import org.apache.syncope.core.persistence.api.entity.task.PushTask; import org.apache.syncope.core.persistence.api.entity.task.PushTaskAnyFilter; +import org.apache.syncope.core.persistence.jpa.entity.JPAImplementation; import org.apache.syncope.core.persistence.jpa.entity.JPARealm; @Entity @@ -48,12 +48,13 @@ public class JPAPushTask extends AbstractProvisioningTask implements PushTask { @ManyToOne(fetch = FetchType.EAGER, optional = false) private JPARealm sourceRealm; - @ElementCollection(fetch = FetchType.EAGER) - @Column(name = "actionClassName") - @CollectionTable(name = "PushTask_actionsClassNames", + @ManyToMany(fetch = FetchType.EAGER) + @JoinTable(name = "PushTaskAction", joinColumns = - @JoinColumn(name = "pushTask_id", referencedColumnName = "id")) - private Set<String> actionsClassNames = new HashSet<>(); + @JoinColumn(name = "task_id"), + inverseJoinColumns = + @JoinColumn(name = "implementation_id")) + private List<JPAImplementation> actions = new ArrayList<>(); @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER, mappedBy = "pushTask") private List<JPAPushTaskAnyFilter> filters = new ArrayList<>(); @@ -70,8 +71,15 @@ public class JPAPushTask extends AbstractProvisioningTask implements PushTask { } @Override - public Set<String> getActionsClassNames() { - return actionsClassNames; + public boolean add(final Implementation action) { + checkType(action, JPAImplementation.class); + checkImplementationType(action, ImplementationType.PUSH_ACTIONS); + return actions.contains((JPAImplementation) action) || actions.add((JPAImplementation) action); + } + + @Override + public List<? extends Implementation> getActions() { + return actions; } @Override http://git-wip-us.apache.org/repos/asf/syncope/blob/d5b57922/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/task/JPASchedTask.java ---------------------------------------------------------------------- diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/task/JPASchedTask.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/task/JPASchedTask.java index 3a27e1b..e69d5ef 100644 --- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/task/JPASchedTask.java +++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/task/JPASchedTask.java @@ -22,12 +22,16 @@ import java.util.Date; import javax.persistence.Basic; import javax.persistence.DiscriminatorValue; import javax.persistence.Entity; +import javax.persistence.OneToOne; import javax.persistence.Temporal; import javax.persistence.TemporalType; import javax.validation.constraints.Max; import javax.validation.constraints.Min; import javax.validation.constraints.NotNull; +import org.apache.syncope.common.lib.types.ImplementationType; +import org.apache.syncope.core.persistence.api.entity.Implementation; import org.apache.syncope.core.persistence.api.entity.task.SchedTask; +import org.apache.syncope.core.persistence.jpa.entity.JPAImplementation; import org.apache.syncope.core.persistence.jpa.validation.entity.SchedTaskCheck; @Entity @@ -42,7 +46,8 @@ public class JPASchedTask extends AbstractTask implements SchedTask { private String cronExpression; - private String jobDelegateClassName; + @OneToOne(optional = false) + private JPAImplementation jobDelegate; @NotNull private String name; @@ -83,13 +88,15 @@ public class JPASchedTask extends AbstractTask implements SchedTask { } @Override - public String getJobDelegateClassName() { - return jobDelegateClassName; + public Implementation getJobDelegate() { + return jobDelegate; } @Override - public void setJobDelegateClassName(final String jobDelegateClassName) { - this.jobDelegateClassName = jobDelegateClassName; + public void setJobDelegate(final Implementation jobDelegate) { + checkType(jobDelegate, JPAImplementation.class); + checkImplementationType(jobDelegate, ImplementationType.TASKJOB_DELEGATE); + this.jobDelegate = (JPAImplementation) jobDelegate; } @Override