2
0
Эх сурвалжийг харах

Add initialization support.

Ben Alex 20 жил өмнө
parent
commit
5dcbb416ec

+ 43 - 0
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.
+ * 
+ * <p>
+ * Structured as a separate interface (rather than a subclass of
+ * <code>Dao</code>), as it is not required for all persistence strategies.
+ * </p>
+ *
+ * @author Ben Alex
+ * @version $Id$
+ */
+public interface InitializationCapable {
+    //~ Methods ================================================================
+
+    /**
+     * Initializes the indicated object.
+     * 
+     * <p>
+     * May throw an exception if the implementation so desires.
+     * </p>
+     *
+     * @param entity to initialize
+     */
+    public void initialize(Object entity);
+}

+ 50 - 0
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 <code>Object</code> (provided that the passed
+     * <code>Object</code> implements <code>InitializationCapable</code>).
+     *
+     * @param daoOrServices the potential source for
+     *        <code>InitializationCapable</code> services (never <code>null</code>)
+     * @param entity to evict (can be <code>null</code>)
+     */
+    public static void initializeIfRequired(Object daoOrServices,
+        Object entity) {
+		Assert.notNull(daoOrServices);
+		if (daoOrServices instanceof InitializationCapable) {
+			((InitializationCapable) daoOrServices).initialize(entity);
+		}
+    }
+
+}

+ 9 - 2
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<E extends PersistableEntity> extends HibernateDaoSupport implements Dao<E>,
-    EvictionCapable {
+    EvictionCapable, InitializationCapable {
     //~ Instance fields ========================================================
 
     /** The class that this instance provides services for */
@@ -158,7 +159,11 @@ public class DaoHibernate<E extends PersistableEntity> extends HibernateDaoSuppo
      */
     protected void initHibernateDao() throws Exception {}
 
-    /**
+    public void initialize(Object entity) {
+		Hibernate.initialize(entity);
+	}
+
+	/**
      * Provides a <code>HibernateCallback</code> that will load a list of
      * objects by a <code>Collection</code> of identities.
      *
@@ -211,6 +216,8 @@ public class DaoHibernate<E extends PersistableEntity> 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();