From 5dcbb416ecdccd9970f26afb339ee2026e664112 Mon Sep 17 00:00:00 2001 From: Ben Alex Date: Thu, 12 May 2005 06:06:20 +0000 Subject: [PATCH] Add initialization support. --- .../domain/dao/InitializationCapable.java | 43 ++++++++++++++++ .../domain/dao/InitializationUtils.java | 50 +++++++++++++++++++ .../domain/hibernate/DaoHibernate.java | 11 +++- 3 files changed, 102 insertions(+), 2 deletions(-) create mode 100644 domain/src/main/java/org/acegisecurity/domain/dao/InitializationCapable.java create mode 100644 domain/src/main/java/org/acegisecurity/domain/dao/InitializationUtils.java diff --git a/domain/src/main/java/org/acegisecurity/domain/dao/InitializationCapable.java b/domain/src/main/java/org/acegisecurity/domain/dao/InitializationCapable.java new file mode 100644 index 0000000000..104f36fb05 --- /dev/null +++ b/domain/src/main/java/org/acegisecurity/domain/dao/InitializationCapable.java @@ -0,0 +1,43 @@ +/* Copyright 2004, 2005 Acegi Technology Pty Limited + * + * Licensed 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 net.sf.acegisecurity.domain.dao; + +/** + * Indicates an implementation capable of initializing an object, such that + * any lazy loading is guaranteed to have been completed. + * + *

+ * Structured as a separate interface (rather than a subclass of + * Dao), as it is not required for all persistence strategies. + *

+ * + * @author Ben Alex + * @version $Id$ + */ +public interface InitializationCapable { + //~ Methods ================================================================ + + /** + * Initializes the indicated object. + * + *

+ * May throw an exception if the implementation so desires. + *

+ * + * @param entity to initialize + */ + public void initialize(Object entity); +} diff --git a/domain/src/main/java/org/acegisecurity/domain/dao/InitializationUtils.java b/domain/src/main/java/org/acegisecurity/domain/dao/InitializationUtils.java new file mode 100644 index 0000000000..0e4cf2dac6 --- /dev/null +++ b/domain/src/main/java/org/acegisecurity/domain/dao/InitializationUtils.java @@ -0,0 +1,50 @@ +/* Copyright 2004, 2005 Acegi Technology Pty Limited + * + * Licensed 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 net.sf.acegisecurity.domain.dao; + +import org.springframework.util.Assert; + + + +/** + * Convenience methods that support initialization of lazily loaded collections + * and associations using DAOs and other objects that implement + * {@link net.sf.acegisecurity.domain.dao.InitializationCapable}. + * + * @author Ben Alex + * @version $Id$ + */ +public class InitializationUtils { + //~ Methods ================================================================ + + /** + * Initializes the passed entity using the passed + * DAO or services layer Object (provided that the passed + * Object implements InitializationCapable). + * + * @param daoOrServices the potential source for + * InitializationCapable services (never null) + * @param entity to evict (can be null) + */ + public static void initializeIfRequired(Object daoOrServices, + Object entity) { + Assert.notNull(daoOrServices); + if (daoOrServices instanceof InitializationCapable) { + ((InitializationCapable) daoOrServices).initialize(entity); + } + } + +} diff --git a/domain/src/main/java/org/acegisecurity/domain/hibernate/DaoHibernate.java b/domain/src/main/java/org/acegisecurity/domain/hibernate/DaoHibernate.java index 5942790a45..e39e6db104 100644 --- a/domain/src/main/java/org/acegisecurity/domain/hibernate/DaoHibernate.java +++ b/domain/src/main/java/org/acegisecurity/domain/hibernate/DaoHibernate.java @@ -22,6 +22,7 @@ import java.util.List; import net.sf.acegisecurity.domain.PersistableEntity; import net.sf.acegisecurity.domain.dao.Dao; import net.sf.acegisecurity.domain.dao.EvictionCapable; +import net.sf.acegisecurity.domain.dao.InitializationCapable; import net.sf.acegisecurity.domain.dao.PaginatedList; import org.hibernate.Criteria; @@ -46,7 +47,7 @@ import org.springframework.util.Assert; * @version $Id$ */ public class DaoHibernate extends HibernateDaoSupport implements Dao, - EvictionCapable { + EvictionCapable, InitializationCapable { //~ Instance fields ======================================================== /** The class that this instance provides services for */ @@ -158,7 +159,11 @@ public class DaoHibernate extends HibernateDaoSuppo */ protected void initHibernateDao() throws Exception {} - /** + public void initialize(Object entity) { + Hibernate.initialize(entity); + } + + /** * Provides a HibernateCallback that will load a list of * objects by a Collection of identities. * @@ -211,6 +216,8 @@ public class DaoHibernate extends HibernateDaoSuppo .getClassMetadata(bean .getClass()); + Assert.notNull(classMetadata, "ClassMetadata for " + bean.getClass() + " unavailable from Hibernate - have you mapped this class against the SessionFactory?"); + /* get persistent properties */ Type[] propertyTypes = classMetadata.getPropertyTypes(); String[] propertyNames = classMetadata.getPropertyNames();