[SYNCOPE-652] Cleaning up OpenJPA slices
Project: http://git-wip-us.apache.org/repos/asf/syncope/repo Commit: http://git-wip-us.apache.org/repos/asf/syncope/commit/a6cf6a68 Tree: http://git-wip-us.apache.org/repos/asf/syncope/tree/a6cf6a68 Diff: http://git-wip-us.apache.org/repos/asf/syncope/diff/a6cf6a68 Branch: refs/heads/SYNCOPE-652 Commit: a6cf6a68f443fde895282071c3f3ff275264a8e9 Parents: 0379272 Author: Francesco Chicchiriccò <[email protected]> Authored: Tue Jul 21 11:35:52 2015 +0200 Committer: Francesco Chicchiriccò <[email protected]> Committed: Tue Jul 21 11:35:52 2015 +0200 ---------------------------------------------------------------------- .../syncope/common/lib/to/AbstractSchemaTO.java | 11 ++ .../rest/api/service/AnyTypeClassService.java | 2 +- .../apache/syncope/core/logic/SchemaLogic.java | 33 ++-- core/persistence-jpa/pom.xml | 4 - .../core/persistence/jpa/dao/AbstractDAO.java | 38 +---- .../persistence/jpa/dao/JPAAnyTypeClassDAO.java | 14 +- .../jpa/dao/JPAExternalResourceDAO.java | 4 - .../persistence/jpa/entity/JPADerSchema.java | 3 +- .../persistence/jpa/entity/JPAPlainSchema.java | 3 +- .../persistence/jpa/entity/JPAVirSchema.java | 3 +- .../jpa/slice/DomainDistributionPolicy.java | 36 ----- .../jpa/slice/DomainFinderTargetPolicy.java | 38 ----- .../jpa/slice/DomainQueryTargetPolicy.java | 41 ----- .../src/main/resources/persistence.properties | 3 +- .../resources/persistenceContextEMFactory.xml | 31 +--- .../core/persistence/jpa/inner/TaskTest.java | 27 ++++ .../persistence/jpa/outer/AnyTypeClassTest.java | 36 +++++ .../src/test/resources/persistence.properties | 3 +- .../provisioning/api/data/SchemaDataBinder.java | 18 +-- .../java/data/AnyTypeClassDataBinderImpl.java | 27 +++- .../java/data/SchemaDataBinderImpl.java | 155 ++++++++++++++----- .../fit/core/reference/AnyTypeClassITCase.java | 24 ++- pom.xml | 13 +- 23 files changed, 292 insertions(+), 275 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/syncope/blob/a6cf6a68/common/lib/src/main/java/org/apache/syncope/common/lib/to/AbstractSchemaTO.java ---------------------------------------------------------------------- diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/to/AbstractSchemaTO.java b/common/lib/src/main/java/org/apache/syncope/common/lib/to/AbstractSchemaTO.java index afd6e6b..f426f8c 100644 --- a/common/lib/src/main/java/org/apache/syncope/common/lib/to/AbstractSchemaTO.java +++ b/common/lib/src/main/java/org/apache/syncope/common/lib/to/AbstractSchemaTO.java @@ -35,6 +35,8 @@ public abstract class AbstractSchemaTO extends AbstractBaseBean { private String key; + private String anyTypeClass; + public String getKey() { return key; } @@ -43,4 +45,13 @@ public abstract class AbstractSchemaTO extends AbstractBaseBean { public void setKey(final String key) { this.key = key; } + + public String getAnyTypeClass() { + return anyTypeClass; + } + + public void setAnyTypeClass(final String anyTypeClass) { + this.anyTypeClass = anyTypeClass; + } + } http://git-wip-us.apache.org/repos/asf/syncope/blob/a6cf6a68/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/AnyTypeClassService.java ---------------------------------------------------------------------- diff --git a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/AnyTypeClassService.java b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/AnyTypeClassService.java index 18bf1c4..43c3d23 100644 --- a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/AnyTypeClassService.java +++ b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/AnyTypeClassService.java @@ -38,7 +38,7 @@ import org.apache.syncope.common.lib.to.AnyTypeClassTO; /** * REST operations for any type classes. */ -@Path("anyTypeClassClasses") +@Path("anyTypeClasses") public interface AnyTypeClassService extends JAXRSService { /** http://git-wip-us.apache.org/repos/asf/syncope/blob/a6cf6a68/core/logic/src/main/java/org/apache/syncope/core/logic/SchemaLogic.java ---------------------------------------------------------------------- diff --git a/core/logic/src/main/java/org/apache/syncope/core/logic/SchemaLogic.java b/core/logic/src/main/java/org/apache/syncope/core/logic/SchemaLogic.java index befa8bf..3da4a76 100644 --- a/core/logic/src/main/java/org/apache/syncope/core/logic/SchemaLogic.java +++ b/core/logic/src/main/java/org/apache/syncope/core/logic/SchemaLogic.java @@ -39,7 +39,6 @@ import org.apache.syncope.core.persistence.api.dao.NotFoundException; import org.apache.syncope.core.persistence.api.dao.PlainSchemaDAO; import org.apache.syncope.core.persistence.api.dao.VirSchemaDAO; import org.apache.syncope.core.persistence.api.entity.DerSchema; -import org.apache.syncope.core.persistence.api.entity.EntityFactory; import org.apache.syncope.core.persistence.api.entity.PlainSchema; import org.apache.syncope.core.persistence.api.entity.VirSchema; import org.apache.syncope.core.provisioning.api.data.SchemaDataBinder; @@ -62,9 +61,6 @@ public class SchemaLogic extends AbstractTransactionalLogic<AbstractSchemaTO> { @Autowired private SchemaDataBinder binder; - @Autowired - private EntityFactory entityFactory; - private boolean doesSchemaExist(final SchemaType schemaType, final String name) { boolean found; @@ -104,27 +100,19 @@ public class SchemaLogic extends AbstractTransactionalLogic<AbstractSchemaTO> { T created; switch (schemaType) { case VIRTUAL: - VirSchema virSchema = entityFactory.newEntity(VirSchema.class); - binder.create((VirSchemaTO) schemaTO, virSchema); - virSchema = virSchemaDAO.save(virSchema); + VirSchema virSchema = virSchemaDAO.save(binder.create((VirSchemaTO) schemaTO)); created = (T) binder.getVirSchemaTO(virSchema); break; case DERIVED: - DerSchema derSchema = entityFactory.newEntity(DerSchema.class); - binder.create((DerSchemaTO) schemaTO, derSchema); - derSchema = derSchemaDAO.save(derSchema); - + DerSchema derSchema = derSchemaDAO.save(binder.create((DerSchemaTO) schemaTO)); created = (T) binder.getDerSchemaTO(derSchema); break; case PLAIN: default: - PlainSchema normalSchema = entityFactory.newEntity(PlainSchema.class); - binder.create((PlainSchemaTO) schemaTO, normalSchema); - normalSchema = plainSchemaDAO.save(normalSchema); - - created = (T) binder.getPlainSchemaTO(normalSchema); + PlainSchema plainSchema = plainSchemaDAO.save(binder.create((PlainSchemaTO) schemaTO)); + created = (T) binder.getPlainSchemaTO(plainSchema); } return created; } @@ -241,8 +229,7 @@ public class SchemaLogic extends AbstractTransactionalLogic<AbstractSchemaTO> { throw new NotFoundException("Virtual Schema '" + schemaTO.getKey() + "'"); } - binder.update((VirSchemaTO) schemaTO, virSchema); - virSchemaDAO.save(virSchema); + virSchemaDAO.save(binder.update((VirSchemaTO) schemaTO, virSchema)); break; case DERIVED: @@ -251,19 +238,17 @@ public class SchemaLogic extends AbstractTransactionalLogic<AbstractSchemaTO> { throw new NotFoundException("Derived schema '" + schemaTO.getKey() + "'"); } - binder.update((DerSchemaTO) schemaTO, derSchema); - derSchemaDAO.save(derSchema); + derSchemaDAO.save(binder.update((DerSchemaTO) schemaTO, derSchema)); break; case PLAIN: default: - PlainSchema schema = plainSchemaDAO.find(schemaTO.getKey()); - if (schema == null) { + PlainSchema plainSchema = plainSchemaDAO.find(schemaTO.getKey()); + if (plainSchema == null) { throw new NotFoundException("Schema '" + schemaTO.getKey() + "'"); } - binder.update((PlainSchemaTO) schemaTO, schema); - plainSchemaDAO.save(schema); + plainSchemaDAO.save(binder.update((PlainSchemaTO) schemaTO, plainSchema)); } } http://git-wip-us.apache.org/repos/asf/syncope/blob/a6cf6a68/core/persistence-jpa/pom.xml ---------------------------------------------------------------------- diff --git a/core/persistence-jpa/pom.xml b/core/persistence-jpa/pom.xml index 0ab9e82..f60f3da 100644 --- a/core/persistence-jpa/pom.xml +++ b/core/persistence-jpa/pom.xml @@ -55,10 +55,6 @@ under the License. <groupId>org.apache.openjpa</groupId> <artifactId>openjpa-persistence-jdbc</artifactId> </dependency> - <dependency> - <groupId>org.apache.openjpa</groupId> - <artifactId>openjpa-slice</artifactId> - </dependency> <dependency> <groupId>org.apache.commons</groupId> http://git-wip-us.apache.org/repos/asf/syncope/blob/a6cf6a68/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractDAO.java ---------------------------------------------------------------------- diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractDAO.java index c2d5ae6..f4916c7 100644 --- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractDAO.java +++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractDAO.java @@ -19,13 +19,10 @@ package org.apache.syncope.core.persistence.jpa.dao; import java.util.List; -import javax.persistence.CacheRetrieveMode; -import javax.persistence.CacheStoreMode; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import javax.persistence.PersistenceContextType; import org.apache.commons.lang3.StringUtils; -import org.apache.openjpa.slice.SlicePersistence; import org.apache.syncope.common.lib.SyncopeConstants; import org.apache.syncope.core.persistence.api.dao.DAO; import org.apache.syncope.core.persistence.api.dao.search.OrderByClause; @@ -41,38 +38,10 @@ public abstract class AbstractDAO<E extends Entity<KEY>, KEY> implements DAO<E, protected static final Logger LOG = LoggerFactory.getLogger(DAO.class); - private static final String CACHE_STORE_MODE = "javax.persistence.cache.storeMode"; - - private static final String CACHE_RETRIEVE_MODE = "javax.persistence.cache.retrieveMode"; - @Value("#{entityManager}") @PersistenceContext(type = PersistenceContextType.TRANSACTION) protected EntityManager entityManager; - protected CacheRetrieveMode getCacheRetrieveMode() { - return entityManager.getProperties().containsKey(CACHE_RETRIEVE_MODE) - ? (CacheRetrieveMode) entityManager.getProperties().get(CACHE_RETRIEVE_MODE) - : CacheRetrieveMode.BYPASS; - } - - protected void setCacheRetrieveMode(final CacheRetrieveMode retrieveMode) { - if (retrieveMode != null) { - entityManager.getProperties().put(CACHE_RETRIEVE_MODE, retrieveMode); - } - } - - protected CacheStoreMode getCacheStoreMode() { - return entityManager.getProperties().containsKey(CACHE_STORE_MODE) - ? (CacheStoreMode) entityManager.getProperties().get(CACHE_STORE_MODE) - : CacheStoreMode.BYPASS; - } - - protected void setCacheStoreMode(final CacheStoreMode storeMode) { - if (storeMode != null) { - entityManager.getProperties().put(CACHE_STORE_MODE, storeMode); - } - } - protected String toOrderByStatement(final Class<? extends Entity<KEY>> beanClass, final String prefix, final List<OrderByClause> orderByClauses) { @@ -96,12 +65,7 @@ public abstract class AbstractDAO<E extends Entity<KEY>, KEY> implements DAO<E, @Override public String getDomain(final E entity) { - try { - return SlicePersistence.getSlice(entity); - } catch (Exception e) { - LOG.debug("While fetching slice for {}", entity, e); - return SyncopeConstants.MASTER_DOMAIN; - } + return SyncopeConstants.MASTER_DOMAIN; } @Override http://git-wip-us.apache.org/repos/asf/syncope/blob/a6cf6a68/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAnyTypeClassDAO.java ---------------------------------------------------------------------- diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAnyTypeClassDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAnyTypeClassDAO.java index 3339c9a..58b547d 100644 --- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAnyTypeClassDAO.java +++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAnyTypeClassDAO.java @@ -63,7 +63,19 @@ public class JPAAnyTypeClassDAO extends AbstractDAO<AnyTypeClass, String> implem @Override public AnyTypeClass save(final AnyTypeClass anyTypeClass) { - return entityManager.merge(anyTypeClass); + AnyTypeClass merge = entityManager.merge(anyTypeClass); + + for (PlainSchema schema : merge.getPlainSchemas()) { + schema.setAnyTypeClass(merge); + } + for (DerSchema schema : merge.getDerSchemas()) { + schema.setAnyTypeClass(merge); + } + for (VirSchema schema : merge.getVirSchemas()) { + schema.setAnyTypeClass(merge); + } + + return merge; } @Override http://git-wip-us.apache.org/repos/asf/syncope/blob/a6cf6a68/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAExternalResourceDAO.java ---------------------------------------------------------------------- diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAExternalResourceDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAExternalResourceDAO.java index 35a5b00..17553a2 100644 --- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAExternalResourceDAO.java +++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAExternalResourceDAO.java @@ -33,7 +33,6 @@ import org.apache.syncope.core.persistence.api.dao.GroupDAO; import org.apache.syncope.core.persistence.api.dao.TaskDAO; import org.apache.syncope.core.persistence.api.dao.UserDAO; import org.apache.syncope.core.persistence.api.entity.AccountPolicy; -import org.apache.syncope.core.persistence.api.entity.AnyUtilsFactory; import org.apache.syncope.core.persistence.api.entity.resource.ExternalResource; import org.apache.syncope.core.persistence.api.entity.resource.MappingItem; import org.apache.syncope.core.persistence.api.entity.Policy; @@ -70,9 +69,6 @@ public class JPAExternalResourceDAO extends AbstractDAO<ExternalResource, String @Autowired private ConnectorRegistry connRegistry; - @Autowired - private AnyUtilsFactory anyUtilsFactory; - @Override public ExternalResource find(final String name) { return entityManager.find(JPAExternalResource.class, name); http://git-wip-us.apache.org/repos/asf/syncope/blob/a6cf6a68/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPADerSchema.java ---------------------------------------------------------------------- diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPADerSchema.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPADerSchema.java index 62fc5d6..944afc4 100644 --- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPADerSchema.java +++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPADerSchema.java @@ -21,6 +21,7 @@ package org.apache.syncope.core.persistence.jpa.entity; import javax.persistence.Cacheable; import javax.persistence.Column; import javax.persistence.Entity; +import javax.persistence.FetchType; import javax.persistence.Id; import javax.persistence.OneToOne; import javax.persistence.Table; @@ -42,7 +43,7 @@ public class JPADerSchema extends AbstractEntity<String> implements DerSchema { @Id private String name; - @OneToOne + @OneToOne(fetch = FetchType.EAGER) private JPAAnyTypeClass anyTypeClass; @Column(nullable = false) http://git-wip-us.apache.org/repos/asf/syncope/blob/a6cf6a68/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 d4935e9..68eeacf 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 @@ -24,6 +24,7 @@ import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.EnumType; import javax.persistence.Enumerated; +import javax.persistence.FetchType; import javax.persistence.Id; import javax.persistence.Lob; import javax.persistence.OneToOne; @@ -54,7 +55,7 @@ public class JPAPlainSchema extends AbstractEntity<String> implements PlainSchem @Id private String name; - @OneToOne + @OneToOne(fetch = FetchType.EAGER) private JPAAnyTypeClass anyTypeClass; @Column(nullable = false) http://git-wip-us.apache.org/repos/asf/syncope/blob/a6cf6a68/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAVirSchema.java ---------------------------------------------------------------------- diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAVirSchema.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAVirSchema.java index d268aff..6c1dd73 100644 --- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAVirSchema.java +++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAVirSchema.java @@ -21,6 +21,7 @@ package org.apache.syncope.core.persistence.jpa.entity; import javax.persistence.Basic; import javax.persistence.Cacheable; import javax.persistence.Entity; +import javax.persistence.FetchType; import javax.persistence.Id; import javax.persistence.OneToOne; import javax.persistence.Table; @@ -44,7 +45,7 @@ public class JPAVirSchema extends AbstractEntity<String> implements VirSchema { @Id private String name; - @OneToOne + @OneToOne(fetch = FetchType.EAGER) private JPAAnyTypeClass anyTypeClass; @Basic http://git-wip-us.apache.org/repos/asf/syncope/blob/a6cf6a68/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/slice/DomainDistributionPolicy.java ---------------------------------------------------------------------- diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/slice/DomainDistributionPolicy.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/slice/DomainDistributionPolicy.java deleted file mode 100644 index 2e61b06..0000000 --- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/slice/DomainDistributionPolicy.java +++ /dev/null @@ -1,36 +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.slice; - -import java.util.List; -import org.apache.openjpa.slice.DistributionPolicy; -import org.apache.syncope.common.lib.SyncopeConstants; -import org.apache.syncope.core.misc.security.AuthContextUtils; -import org.apache.syncope.core.persistence.api.entity.Domain; - -public class DomainDistributionPolicy implements DistributionPolicy { - - @Override - public String distribute(final Object pc, final List<String> slices, final Object context) { - return (pc instanceof Domain) - ? SyncopeConstants.MASTER_DOMAIN - : AuthContextUtils.getDomain(); - } - -} http://git-wip-us.apache.org/repos/asf/syncope/blob/a6cf6a68/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/slice/DomainFinderTargetPolicy.java ---------------------------------------------------------------------- diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/slice/DomainFinderTargetPolicy.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/slice/DomainFinderTargetPolicy.java deleted file mode 100644 index c6cad6e..0000000 --- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/slice/DomainFinderTargetPolicy.java +++ /dev/null @@ -1,38 +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.slice; - -import java.util.List; -import org.apache.openjpa.slice.FinderTargetPolicy; -import org.apache.syncope.common.lib.SyncopeConstants; -import org.apache.syncope.core.misc.security.AuthContextUtils; -import org.apache.syncope.core.persistence.jpa.entity.JPADomain; - -public class DomainFinderTargetPolicy implements FinderTargetPolicy { - - @Override - public String[] getTargets(final Class<?> cls, final Object oid, final List<String> slices, final Object context) { - return new String[] { - JPADomain.class.equals(cls) - ? SyncopeConstants.MASTER_DOMAIN - : AuthContextUtils.getDomain() - }; - } - -} http://git-wip-us.apache.org/repos/asf/syncope/blob/a6cf6a68/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/slice/DomainQueryTargetPolicy.java ---------------------------------------------------------------------- diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/slice/DomainQueryTargetPolicy.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/slice/DomainQueryTargetPolicy.java deleted file mode 100644 index 193ef2b..0000000 --- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/slice/DomainQueryTargetPolicy.java +++ /dev/null @@ -1,41 +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.slice; - -import java.util.List; -import java.util.Map; -import org.apache.openjpa.slice.QueryTargetPolicy; -import org.apache.syncope.common.lib.SyncopeConstants; -import org.apache.syncope.core.misc.security.AuthContextUtils; -import org.apache.syncope.core.persistence.jpa.entity.JPADomain; - -public class DomainQueryTargetPolicy implements QueryTargetPolicy { - - @Override - public String[] getTargets(final String query, final Map<Object, Object> params, final String language, - final List<String> slices, final Object context) { - - return new String[] { - query.contains(JPADomain.class.getSimpleName()) - ? SyncopeConstants.MASTER_DOMAIN - : AuthContextUtils.getDomain() - }; - } - -} http://git-wip-us.apache.org/repos/asf/syncope/blob/a6cf6a68/core/persistence-jpa/src/main/resources/persistence.properties ---------------------------------------------------------------------- diff --git a/core/persistence-jpa/src/main/resources/persistence.properties b/core/persistence-jpa/src/main/resources/persistence.properties index 054808d..57f1af0 100644 --- a/core/persistence-jpa/src/main/resources/persistence.properties +++ b/core/persistence-jpa/src/main/resources/persistence.properties @@ -26,4 +26,5 @@ jpa.orm=META-INF/spring-orm.xml quartz.jobstore=org.quartz.impl.jdbcjobstore.PostgreSQLDelegate quartz.sql=tables_postgres.sql audit.sql=audit.sql -database.schema= \ No newline at end of file +database.schema= + http://git-wip-us.apache.org/repos/asf/syncope/blob/a6cf6a68/core/persistence-jpa/src/main/resources/persistenceContextEMFactory.xml ---------------------------------------------------------------------- diff --git a/core/persistence-jpa/src/main/resources/persistenceContextEMFactory.xml b/core/persistence-jpa/src/main/resources/persistenceContextEMFactory.xml index d3a7e45..5983ca6 100644 --- a/core/persistence-jpa/src/main/resources/persistenceContextEMFactory.xml +++ b/core/persistence-jpa/src/main/resources/persistenceContextEMFactory.xml @@ -21,7 +21,7 @@ under the License. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> - + <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> <property name="packagesToScan" value="org.apache.syncope.core.persistence.jpa.entity"/> @@ -47,43 +47,22 @@ under the License. </property> <property name="jpaPropertyMap"> <map> - <entry key="openjpa.Log" value="DefaultLevel=INFO, Runtime=TRACE, Tool=TRACE, SQL=TRACE"/> - <!--<entry key="openjpa.Log" value="SQL=TRACE"/> <entry key="openjpa.ConnectionFactoryProperties" value="PrintParameters=true, PrettyPrint=true, PrettyPrintLineLength=80"/>--> - + <entry key="openjpa.NontransactionalWrite" value="false"/> <entry key="openjpa.AutoDetach" value="close, commit, nontx-read, rollback"/> <entry key="openjpa.jdbc.SchemaFactory" value="native(ForeignKeys=true)"/> <entry key="openjpa.jdbc.MappingDefaults" value="ForeignKeyDeleteAction=restrict, JoinForeignKeyDeleteAction=restrict"/> - + <entry key="openjpa.DataCache" value="true"/> - <entry key="openjpa.QueryCache" value="false"/> - <entry key="openjpa.QueryCompilationCache" value="false"/> + <entry key="openjpa.QueryCache" value="true"/> <entry key="openjpa.RemoteCommitProvider" value="sjvm"/> - - <entry key="openjpa.BrokerFactory" value="slice"/> - <entry key="openjpa.BrokerImpl" value="org.apache.openjpa.slice.DistributedBrokerImpl"/> - <entry key="openjpa.slice.Lenient" value="false"/> - - <entry key="openjpa.slice.DistributionPolicy" - value="org.apache.syncope.core.persistence.jpa.slice.DomainDistributionPolicy"/> - <entry key="openjpa.slice.QueryTargetPolicy" - value="org.apache.syncope.core.persistence.jpa.slice.DomainQueryTargetPolicy"/> - <entry key="openjpa.slice.FinderTargetPolicy" - value="org.apache.syncope.core.persistence.jpa.slice.DomainFinderTargetPolicy"/> - - <entry key="openjpa.slice.Names" value="Master"/> - <entry key="openjpa.slice.Master" value="Master"/> - <entry key="openjpa.slice.Lenient" value="false"/> - - <entry key="openjpa.slice.Master.ConnectionFactory" value-ref="dataSource"/> - <entry key="openjpa.slice.Master.jdbc.DBDictionary" value="${jpa.dialect}"/> </map> </property> </bean> -</beans> +</beans> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/syncope/blob/a6cf6a68/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/TaskTest.java ---------------------------------------------------------------------- diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/TaskTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/TaskTest.java index 4f4b02c..a3bfedd 100644 --- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/TaskTest.java +++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/TaskTest.java @@ -22,7 +22,9 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; +import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Set; @@ -33,8 +35,10 @@ import org.apache.syncope.common.lib.types.TaskType; import org.apache.syncope.core.persistence.api.dao.ExternalResourceDAO; import org.apache.syncope.core.persistence.api.dao.TaskDAO; import org.apache.syncope.core.persistence.api.dao.UserDAO; +import org.apache.syncope.core.persistence.api.dao.search.OrderByClause; import org.apache.syncope.core.persistence.api.entity.resource.ExternalResource; import org.apache.syncope.core.persistence.api.entity.task.PropagationTask; +import org.apache.syncope.core.persistence.api.entity.task.Task; import org.apache.syncope.core.persistence.api.entity.user.User; import org.apache.syncope.core.persistence.jpa.AbstractTest; import org.identityconnectors.framework.common.objects.Attribute; @@ -63,6 +67,29 @@ public class TaskTest extends AbstractTest { } @Test + public void findPaginated() { + List<Task> tasks = taskDAO.findAll(1, 2, Collections.<OrderByClause>emptyList(), TaskType.PROPAGATION); + assertNotNull(tasks); + assertEquals(2, tasks.size()); + + for (Task task : tasks) { + assertNotNull(task); + } + + tasks = taskDAO.findAll(2, 2, Collections.<OrderByClause>emptyList(), TaskType.PROPAGATION); + assertNotNull(tasks); + assertEquals(2, tasks.size()); + + for (Task task : tasks) { + assertNotNull(task); + } + + tasks = taskDAO.findAll(1000, 2, Collections.<OrderByClause>emptyList(), TaskType.PROPAGATION); + assertNotNull(tasks); + assertTrue(tasks.isEmpty()); + } + + @Test public void findAll() { assertEquals(5, taskDAO.findAll(TaskType.PROPAGATION).size()); assertEquals(1, taskDAO.findAll(TaskType.NOTIFICATION).size()); http://git-wip-us.apache.org/repos/asf/syncope/blob/a6cf6a68/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/AnyTypeClassTest.java ---------------------------------------------------------------------- diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/AnyTypeClassTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/AnyTypeClassTest.java index 29b97a3..d0f0213 100644 --- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/AnyTypeClassTest.java +++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/AnyTypeClassTest.java @@ -23,6 +23,8 @@ import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; +import javax.persistence.EntityManager; +import org.apache.syncope.common.lib.types.AttrSchemaType; import org.apache.syncope.core.persistence.api.dao.AnyTypeClassDAO; import org.apache.syncope.core.persistence.api.dao.PlainSchemaDAO; import org.apache.syncope.core.persistence.api.entity.AnyTypeClass; @@ -41,6 +43,40 @@ public class AnyTypeClassTest extends AbstractTest { @Autowired private AnyTypeClassDAO anyTypeClassDAO; + @Autowired + private EntityManager entityManager; + + @Test + public void create() { + PlainSchema newSchema = entityFactory.newEntity(PlainSchema.class); + newSchema.setKey("new_plain_schema"); + newSchema.setType(AttrSchemaType.String); + + plainSchemaDAO.save(newSchema); + + plainSchemaDAO.flush(); + + newSchema = plainSchemaDAO.find(newSchema.getKey()); + assertNotNull(newSchema); + + AnyTypeClass newClass = entityFactory.newEntity(AnyTypeClass.class); + newClass.setKey("new class"); + newClass.add(newSchema); + + anyTypeClassDAO.save(newClass); + + anyTypeClassDAO.flush(); + + newClass = anyTypeClassDAO.find(newClass.getKey()); + assertNotNull(newClass); + assertEquals(1, newClass.getPlainSchemas().size()); + assertEquals(newSchema, newClass.getPlainSchemas().get(0)); + assertEquals(newClass, newClass.getPlainSchemas().get(0).getAnyTypeClass()); + + newSchema = plainSchemaDAO.find(newSchema.getKey()); + assertNotNull(newSchema.getAnyTypeClass()); + } + @Test public void delete() { AnyTypeClass minimalUser = anyTypeClassDAO.find("minimal user"); http://git-wip-us.apache.org/repos/asf/syncope/blob/a6cf6a68/core/persistence-jpa/src/test/resources/persistence.properties ---------------------------------------------------------------------- diff --git a/core/persistence-jpa/src/test/resources/persistence.properties b/core/persistence-jpa/src/test/resources/persistence.properties index 6993a0b..31ea1b0 100644 --- a/core/persistence-jpa/src/test/resources/persistence.properties +++ b/core/persistence-jpa/src/test/resources/persistence.properties @@ -27,4 +27,5 @@ quartz.jobstore=org.quartz.impl.jdbcjobstore.StdJDBCDelegate quartz.scheduler.idleWaitTime=5000 quartz.sql=tables_h2.sql audit.sql=audit.sql -database.schema= \ No newline at end of file +database.schema= + http://git-wip-us.apache.org/repos/asf/syncope/blob/a6cf6a68/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/data/SchemaDataBinder.java ---------------------------------------------------------------------- diff --git a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/data/SchemaDataBinder.java b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/data/SchemaDataBinder.java index dcb8f9f..b185ca8 100644 --- a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/data/SchemaDataBinder.java +++ b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/data/SchemaDataBinder.java @@ -27,22 +27,22 @@ import org.apache.syncope.core.persistence.api.entity.VirSchema; public interface SchemaDataBinder { - <T extends PlainSchema> void create(PlainSchemaTO schemaTO, T schema); + PlainSchema create(PlainSchemaTO schemaTO); - <T extends DerSchema> T create(DerSchemaTO derSchemaTO, T derSchema); + DerSchema create(DerSchemaTO schemaTO); - <T extends VirSchema> T create(VirSchemaTO virSchemaTO, T virSchema); + VirSchema create(VirSchemaTO schemaTO); - <T extends DerSchema> DerSchemaTO getDerSchemaTO(T derSchema); + DerSchemaTO getDerSchemaTO(DerSchema schema); - <T extends PlainSchema> PlainSchemaTO getPlainSchemaTO(T schema); + PlainSchemaTO getPlainSchemaTO(PlainSchema schema); - <T extends VirSchema> VirSchemaTO getVirSchemaTO(T virSchema); + VirSchemaTO getVirSchemaTO(VirSchema schema); - <T extends PlainSchema> void update(PlainSchemaTO schemaTO, T schema); + PlainSchema update(PlainSchemaTO schemaTO, PlainSchema schema); - <T extends DerSchema> T update(DerSchemaTO derSchemaTO, T derSchema); + DerSchema update(DerSchemaTO schemaTO, DerSchema derSchema); - <T extends VirSchema> T update(VirSchemaTO virSchemaTO, T virSchema); + VirSchema update(VirSchemaTO schemaTO, VirSchema virSchema); } http://git-wip-us.apache.org/repos/asf/syncope/blob/a6cf6a68/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AnyTypeClassDataBinderImpl.java ---------------------------------------------------------------------- diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AnyTypeClassDataBinderImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AnyTypeClassDataBinderImpl.java index 5917190..8a33e12 100644 --- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AnyTypeClassDataBinderImpl.java +++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AnyTypeClassDataBinderImpl.java @@ -63,31 +63,46 @@ public class AnyTypeClassDataBinderImpl implements AnyTypeClassDataBinder { anyTypeClass.setKey(anyTypeClassTO.getKey()); } + for (PlainSchema schema : plainSchemaDAO.findByAnyTypeClass(anyTypeClass)) { + schema.setAnyTypeClass(null); + } + anyTypeClass.getPlainSchemas().clear(); for (String schemaName : anyTypeClassTO.getPlainSchemas()) { PlainSchema schema = plainSchemaDAO.find(schemaName); - if (schema == null) { - LOG.debug("Invalid " + PlainSchema.class.getSimpleName() + "{}, ignoring...", schemaName); + if (schema == null || schema.getAnyTypeClass() != null) { + LOG.debug("Invalid or already in use" + PlainSchema.class.getSimpleName() + + "{}, ignoring...", schemaName); } else { anyTypeClass.add(schema); } } + for (DerSchema schema : derSchemaDAO.findByAnyTypeClass(anyTypeClass)) { + schema.setAnyTypeClass(null); + } + anyTypeClass.getDerSchemas().clear(); for (String schemaName : anyTypeClassTO.getDerSchemas()) { DerSchema schema = derSchemaDAO.find(schemaName); - if (schema == null) { - LOG.debug("Invalid " + DerSchema.class.getSimpleName() + "{}, ignoring...", schemaName); + if (schema == null || schema.getAnyTypeClass() != null) { + LOG.debug("Invalid or already in use" + DerSchema.class.getSimpleName() + + "{}, ignoring...", schemaName); } else { anyTypeClass.add(schema); } } + for (VirSchema schema : virSchemaDAO.findByAnyTypeClass(anyTypeClass)) { + schema.setAnyTypeClass(null); + } + anyTypeClass.getVirSchemas().clear(); for (String schemaName : anyTypeClassTO.getVirSchemas()) { VirSchema schema = virSchemaDAO.find(schemaName); - if (schema == null) { - LOG.debug("Invalid " + VirSchema.class.getSimpleName() + "{}, ignoring...", schemaName); + if (schema == null || schema.getAnyTypeClass() != null) { + LOG.debug("Invalid or already in use" + VirSchema.class.getSimpleName() + + "{}, ignoring...", schemaName); } else { anyTypeClass.add(schema); } http://git-wip-us.apache.org/repos/asf/syncope/blob/a6cf6a68/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/SchemaDataBinderImpl.java ---------------------------------------------------------------------- diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/SchemaDataBinderImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/SchemaDataBinderImpl.java index f20a265..0794f8c 100644 --- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/SchemaDataBinderImpl.java +++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/SchemaDataBinderImpl.java @@ -33,44 +33,88 @@ import org.apache.syncope.core.persistence.api.entity.PlainSchema; import org.apache.syncope.core.persistence.api.entity.VirSchema; import org.apache.syncope.core.misc.spring.BeanUtils; import org.apache.syncope.core.misc.jexl.JexlUtils; +import org.apache.syncope.core.persistence.api.dao.AnyTypeClassDAO; +import org.apache.syncope.core.persistence.api.dao.DerSchemaDAO; +import org.apache.syncope.core.persistence.api.dao.VirSchemaDAO; +import org.apache.syncope.core.persistence.api.entity.AnyTypeClass; import org.apache.syncope.core.persistence.api.entity.AnyUtils; import org.apache.syncope.core.persistence.api.entity.AnyUtilsFactory; +import org.apache.syncope.core.persistence.api.entity.EntityFactory; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component public class SchemaDataBinderImpl implements SchemaDataBinder { + private static final Logger LOG = LoggerFactory.getLogger(SchemaDataBinder.class); + + private static final String[] IGNORE_PROPERTIES = { "anyTypeClass" }; + + @Autowired + private AnyTypeClassDAO anyTypeClassDAO; + @Autowired - private PlainSchemaDAO schemaDAO; + private PlainSchemaDAO plainSchemaDAO; + + @Autowired + private DerSchemaDAO derSchemaDAO; + + @Autowired + private VirSchemaDAO virSchemaDAO; + + @Autowired + private EntityFactory entityFactory; @Autowired private AnyUtilsFactory anyUtilsFactory; // --------------- PLAIN ----------------- - private <T extends PlainSchema> void fill(final T schema, final PlainSchemaTO schemaTO) { + private PlainSchema fill(final PlainSchema schema, final PlainSchemaTO schemaTO) { if (!JexlUtils.isExpressionValid(schemaTO.getMandatoryCondition())) { SyncopeClientException sce = SyncopeClientException.build(ClientExceptionType.InvalidValues); sce.getElements().add(schemaTO.getMandatoryCondition()); throw sce; } - BeanUtils.copyProperties(schemaTO, schema); + BeanUtils.copyProperties(schemaTO, schema, IGNORE_PROPERTIES); + + PlainSchema merged = plainSchemaDAO.save(schema); + + if (schemaTO.getAnyTypeClass() != null + && (merged.getAnyTypeClass() == null + || !schemaTO.getAnyTypeClass().equals(merged.getAnyTypeClass().getKey()))) { + + AnyTypeClass anyTypeClass = anyTypeClassDAO.find(schemaTO.getAnyTypeClass()); + if (anyTypeClass == null) { + LOG.debug("Invalid " + AnyTypeClass.class.getSimpleName() + + "{}, ignoring...", schemaTO.getAnyTypeClass()); + } else { + anyTypeClass.add(merged); + merged.setAnyTypeClass(anyTypeClass); + } + } else if (schemaTO.getAnyTypeClass() == null && merged.getAnyTypeClass() != null) { + merged.getAnyTypeClass().remove(merged); + merged.setAnyTypeClass(null); + } + + return merged; } @Override - public <T extends PlainSchema> void create(final PlainSchemaTO schemaTO, final T schema) { - fill(schema, schemaTO); + public PlainSchema create(final PlainSchemaTO schemaTO) { + return fill(entityFactory.newEntity(PlainSchema.class), schemaTO); } @Override - public <T extends PlainSchema> void update(final PlainSchemaTO schemaTO, final T schema) { + public PlainSchema update(final PlainSchemaTO schemaTO, final PlainSchema schema) { SyncopeClientCompositeException scce = SyncopeClientException.buildComposite(); boolean hasAttrs = false; for (AnyTypeKind anyTypeKind : AnyTypeKind.values()) { AnyUtils anyUtils = anyUtilsFactory.getInstance(anyTypeKind); - hasAttrs |= schemaDAO.findAttrs(schema, anyUtils.plainAttrClass()).isEmpty(); + hasAttrs |= plainSchemaDAO.findAttrs(schema, anyUtils.plainAttrClass()).isEmpty(); } if (hasAttrs) { @@ -92,30 +136,31 @@ public class SchemaDataBinderImpl implements SchemaDataBinder { throw scce; } - fill(schema, schemaTO); + return fill(schema, schemaTO); } @Override - public <T extends PlainSchema> PlainSchemaTO getPlainSchemaTO(final T schema) { + public PlainSchemaTO getPlainSchemaTO(final PlainSchema schema) { PlainSchemaTO schemaTO = new PlainSchemaTO(); - BeanUtils.copyProperties(schema, schemaTO); + BeanUtils.copyProperties(schema, schemaTO, IGNORE_PROPERTIES); + schemaTO.setAnyTypeClass(schema.getAnyTypeClass() == null ? null : schema.getAnyTypeClass().getKey()); return schemaTO; } // --------------- DERIVED ----------------- - private <T extends DerSchema> T populate(final T derSchema, final DerSchemaTO derSchemaTO) { + private DerSchema fill(final DerSchema schema, final DerSchemaTO schemaTO) { SyncopeClientCompositeException scce = SyncopeClientException.buildComposite(); - if (StringUtils.isBlank(derSchemaTO.getExpression())) { + if (StringUtils.isBlank(schemaTO.getExpression())) { SyncopeClientException requiredValuesMissing = SyncopeClientException.build(ClientExceptionType.RequiredValuesMissing); requiredValuesMissing.getElements().add("expression"); scce.addException(requiredValuesMissing); - } else if (!JexlUtils.isExpressionValid(derSchemaTO.getExpression())) { + } else if (!JexlUtils.isExpressionValid(schemaTO.getExpression())) { SyncopeClientException e = SyncopeClientException.build(ClientExceptionType.InvalidValues); - e.getElements().add(derSchemaTO.getExpression()); + e.getElements().add(schemaTO.getExpression()); scce.addException(e); } @@ -124,51 +169,91 @@ public class SchemaDataBinderImpl implements SchemaDataBinder { throw scce; } - BeanUtils.copyProperties(derSchemaTO, derSchema); + BeanUtils.copyProperties(schemaTO, schema, IGNORE_PROPERTIES); + + DerSchema merged = derSchemaDAO.save(schema); + + if (schemaTO.getAnyTypeClass() != null + && (merged.getAnyTypeClass() == null + || !schemaTO.getAnyTypeClass().equals(merged.getAnyTypeClass().getKey()))) { + + AnyTypeClass anyTypeClass = anyTypeClassDAO.find(schemaTO.getAnyTypeClass()); + if (anyTypeClass == null) { + LOG.debug("Invalid " + AnyTypeClass.class.getSimpleName() + + "{}, ignoring...", schemaTO.getAnyTypeClass()); + } else { + anyTypeClass.add(merged); + merged.setAnyTypeClass(anyTypeClass); + } + } else if (schemaTO.getAnyTypeClass() == null && merged.getAnyTypeClass() != null) { + merged.getAnyTypeClass().remove(merged); + merged.setAnyTypeClass(null); + } - return derSchema; + return merged; } @Override - public <T extends DerSchema> T create(final DerSchemaTO derSchemaTO, final T derSchema) { - return populate(derSchema, derSchemaTO); + public DerSchema create(final DerSchemaTO schemaTO) { + return fill(entityFactory.newEntity(DerSchema.class), schemaTO); } @Override - public <T extends DerSchema> T update(final DerSchemaTO derSchemaTO, final T derSchema) { - return populate(derSchema, derSchemaTO); + public DerSchema update(final DerSchemaTO schemaTO, final DerSchema schema) { + return fill(schema, schemaTO); } @Override - public <T extends DerSchema> DerSchemaTO getDerSchemaTO(final T derSchema) { - DerSchemaTO derSchemaTO = new DerSchemaTO(); - BeanUtils.copyProperties(derSchema, derSchemaTO); + public DerSchemaTO getDerSchemaTO(final DerSchema schema) { + DerSchemaTO schemaTO = new DerSchemaTO(); + BeanUtils.copyProperties(schema, schemaTO, IGNORE_PROPERTIES); + schemaTO.setAnyTypeClass(schema.getAnyTypeClass() == null ? null : schema.getAnyTypeClass().getKey()); - return derSchemaTO; + return schemaTO; } // --------------- VIRTUAL ----------------- - private <T extends VirSchema> T fill(final T virSchema, final VirSchemaTO virSchemaTO) { - BeanUtils.copyProperties(virSchemaTO, virSchema); + private VirSchema fill(final VirSchema schema, final VirSchemaTO schemaTO) { + BeanUtils.copyProperties(schemaTO, schema, IGNORE_PROPERTIES); + + VirSchema merged = virSchemaDAO.save(schema); + + if (schemaTO.getAnyTypeClass() != null + && (merged.getAnyTypeClass() == null + || !schemaTO.getAnyTypeClass().equals(merged.getAnyTypeClass().getKey()))) { + + AnyTypeClass anyTypeClass = anyTypeClassDAO.find(schemaTO.getAnyTypeClass()); + if (anyTypeClass == null) { + LOG.debug("Invalid " + AnyTypeClass.class.getSimpleName() + + "{}, ignoring...", schemaTO.getAnyTypeClass()); + } else { + anyTypeClass.add(merged); + merged.setAnyTypeClass(anyTypeClass); + } + } else if (schemaTO.getAnyTypeClass() == null && merged.getAnyTypeClass() != null) { + merged.getAnyTypeClass().remove(merged); + merged.setAnyTypeClass(null); + } - return virSchema; + return merged; } @Override - public <T extends VirSchema> T create(final VirSchemaTO virSchemaTO, final T virSchema) { - return fill(virSchema, virSchemaTO); + public VirSchema create(final VirSchemaTO schemaTO) { + return fill(entityFactory.newEntity(VirSchema.class), schemaTO); } @Override - public <T extends VirSchema> T update(final VirSchemaTO virSchemaTO, final T virSchema) { - return fill(virSchema, virSchemaTO); + public VirSchema update(final VirSchemaTO schemaTO, final VirSchema schema) { + return fill(schema, schemaTO); } @Override - public <T extends VirSchema> VirSchemaTO getVirSchemaTO(final T virSchema) { - VirSchemaTO virSchemaTO = new VirSchemaTO(); - BeanUtils.copyProperties(virSchema, virSchemaTO); + public VirSchemaTO getVirSchemaTO(final VirSchema schema) { + VirSchemaTO schemaTO = new VirSchemaTO(); + BeanUtils.copyProperties(schema, schemaTO, IGNORE_PROPERTIES); + schemaTO.setAnyTypeClass(schema.getAnyTypeClass() == null ? null : schema.getAnyTypeClass().getKey()); - return virSchemaTO; + return schemaTO; } } http://git-wip-us.apache.org/repos/asf/syncope/blob/a6cf6a68/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/AnyTypeClassITCase.java ---------------------------------------------------------------------- diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/AnyTypeClassITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/AnyTypeClassITCase.java index 557f4b3..6e88c71 100644 --- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/AnyTypeClassITCase.java +++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/AnyTypeClassITCase.java @@ -21,6 +21,7 @@ package org.apache.syncope.fit.core.reference; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; @@ -28,6 +29,7 @@ import java.util.List; import javax.ws.rs.core.Response; import org.apache.syncope.common.lib.SyncopeClientException; import org.apache.syncope.common.lib.to.AnyTypeClassTO; +import org.apache.syncope.common.lib.to.DerSchemaTO; import org.apache.syncope.common.lib.to.PlainSchemaTO; import org.apache.syncope.common.lib.types.AttrSchemaType; import org.apache.syncope.common.lib.types.ClientExceptionType; @@ -58,9 +60,21 @@ public class AnyTypeClassITCase extends AbstractITCase { @Test public void crud() { + // 1. create sample schemas + PlainSchemaTO plainSchema = new PlainSchemaTO(); + plainSchema.setKey("new_plain_schema" + getUUIDString()); + plainSchema.setType(AttrSchemaType.String); + plainSchema = createSchema(SchemaType.PLAIN, plainSchema); + + DerSchemaTO derSchema = new DerSchemaTO(); + derSchema.setKey("new_der_schema" + getUUIDString()); + derSchema.setExpression(plainSchema.getKey() + " + '_' + derived_dx"); + derSchema = createSchema(SchemaType.DERIVED, derSchema); + + // 2. actual CRUD AnyTypeClassTO newClass = new AnyTypeClassTO(); newClass.setKey("new class" + getUUIDString()); - newClass.getPlainSchemas().add("firstname"); + newClass.getPlainSchemas().add(plainSchema.getKey()); Response response = anyTypeClassService.create(newClass); assertEquals(Response.Status.CREATED.getStatusCode(), response.getStatusInfo().getStatusCode()); @@ -71,7 +85,7 @@ public class AnyTypeClassITCase extends AbstractITCase { assertTrue(newClass.getDerSchemas().isEmpty()); assertTrue(newClass.getVirSchemas().isEmpty()); - newClass.getDerSchemas().add("cn"); + newClass.getDerSchemas().add(derSchema.getKey()); anyTypeClassService.update(newClass); newClass = anyTypeClassService.read(newClass.getKey()); @@ -80,6 +94,9 @@ public class AnyTypeClassITCase extends AbstractITCase { assertFalse(newClass.getDerSchemas().isEmpty()); assertTrue(newClass.getVirSchemas().isEmpty()); + assertEquals(newClass.getKey(), schemaService.read(SchemaType.PLAIN, plainSchema.getKey()).getAnyTypeClass()); + assertEquals(newClass.getKey(), schemaService.read(SchemaType.DERIVED, derSchema.getKey()).getAnyTypeClass()); + anyTypeClassService.delete(newClass.getKey()); try { @@ -88,6 +105,9 @@ public class AnyTypeClassITCase extends AbstractITCase { } catch (SyncopeClientException e) { assertEquals(ClientExceptionType.NotFound, e.getType()); } + + assertNull(schemaService.read(SchemaType.PLAIN, plainSchema.getKey()).getAnyTypeClass()); + assertNull(schemaService.read(SchemaType.DERIVED, derSchema.getKey()).getAnyTypeClass()); } @Test http://git-wip-us.apache.org/repos/asf/syncope/blob/a6cf6a68/pom.xml ---------------------------------------------------------------------- diff --git a/pom.xml b/pom.xml index 95dc8e7..f30ec4f 100644 --- a/pom.xml +++ b/pom.xml @@ -335,7 +335,7 @@ under the License. <spring.version>4.1.7.RELEASE</spring.version> <spring-security.version>4.0.1.RELEASE</spring-security.version> - <openjpa.version>2.4.1-SNAPSHOT</openjpa.version> + <openjpa.version>2.4.0</openjpa.version> <commons-dbcp.version>2.1</commons-dbcp.version> <hibernate-validator.version>5.1.3.Final</hibernate-validator.version> @@ -533,11 +533,6 @@ under the License. <artifactId>openjpa-persistence-jdbc</artifactId> <version>${openjpa.version}</version> </dependency> - <dependency> - <groupId>org.apache.openjpa</groupId> - <artifactId>openjpa-slice</artifactId> - <version>${openjpa.version}</version> - </dependency> <dependency> <groupId>org.apache.commons</groupId> @@ -1111,6 +1106,12 @@ under the License. </plugin> <plugin> + <groupId>org.apache.cxf</groupId> + <artifactId>cxf-java2wadl-plugin</artifactId> + <version>${cxf.version}</version> + </plugin> + + <plugin> <groupId>org.apache.openjpa</groupId> <artifactId>openjpa-maven-plugin</artifactId> <version>${openjpa.version}</version>
