From 5f1cb77e408253b9686cd676c6458df2931fdf6f Mon Sep 17 00:00:00 2001 From: Ben Alex Date: Mon, 9 May 2005 03:35:57 +0000 Subject: [PATCH] Domain subproject Java 1.5 compatibility. --- .classpath | 8 + domain/maven.xml | 5 +- domain/project.xml | 15 ++ .../org/acegisecurity/domain/dao/Dao.java | 41 +++-- .../domain/dao/EvictionUtils.java | 4 +- .../domain/dao/PaginatedList.java | 144 +++++++++--------- .../domain/hibernate/DaoHibernate.java | 36 +++-- .../domain/hibernate/EnumUserType.java | 95 ++++++++++++ .../IntrospectionManagerHibernate.java | 11 +- .../impl/AbstractPersistableEntity.java | 12 +- .../domain/impl/PersistableEntityInteger.java | 18 +-- .../domain/impl/PersistableEntityLong.java | 16 +- .../domain/util/CollectionUtils.java | 30 ++-- .../validation/IntrospectionManager.java | 2 +- .../domain/validation/ValidationAdvisor.java | 4 +- .../validation/ValidationInterceptor.java | 4 +- .../validation/ValidationManagerImpl.java | 10 +- .../ValidationRegistryManagerImpl.java | 10 +- 18 files changed, 297 insertions(+), 168 deletions(-) create mode 100644 domain/src/main/java/org/acegisecurity/domain/hibernate/EnumUserType.java diff --git a/.classpath b/.classpath index 9e865164fe..fc141f452b 100644 --- a/.classpath +++ b/.classpath @@ -220,5 +220,13 @@ + + + + + + + + diff --git a/domain/maven.xml b/domain/maven.xml index 89017035e2..ce023bd4cd 100644 --- a/domain/maven.xml +++ b/domain/maven.xml @@ -24,6 +24,9 @@ xmlns:util="jelly:util" xmlns:maven="jelly:maven" > + diff --git a/domain/project.xml b/domain/project.xml index 3f09c684c2..a9e0c197d2 100644 --- a/domain/project.xml +++ b/domain/project.xml @@ -17,6 +17,21 @@ hibernate 3.0.1 jar + http://www.hibernate.org + + + hibernate + ejb + 3.0-edr2 + jar + http://www.hibernate.org + + + hibernate + hibernate-annotations + 3.0-beta1 + jar + http://www.hibernate.org commons-lang diff --git a/domain/src/main/java/org/acegisecurity/domain/dao/Dao.java b/domain/src/main/java/org/acegisecurity/domain/dao/Dao.java index 0eb490b3e7..c1322329b6 100644 --- a/domain/src/main/java/org/acegisecurity/domain/dao/Dao.java +++ b/domain/src/main/java/org/acegisecurity/domain/dao/Dao.java @@ -22,10 +22,9 @@ import java.io.Serializable; import java.util.Collection; import java.util.List; - /** * Provides fundamental DAO capabilities for a single concrete {@link - * PersistableEntity}. + * PersistableEntity}, using JDK 1.5 generics. * *

* This interface provides a portable approach to Data Access Object (DAO) @@ -60,7 +59,7 @@ import java.util.List; * @author Ben Alex * @version $Id$ */ -public interface Dao { +public interface Dao { //~ Methods ================================================================ /** @@ -71,7 +70,7 @@ public interface Dao { * * @return the value created (with the identity property initialised) */ - public PersistableEntity create(PersistableEntity value); + public E create(E value); /** * Saves an existing object to the persistence layer, or creates a new @@ -84,14 +83,14 @@ public interface Dao { * * @return the saved or updated (as appropriate) value */ - public PersistableEntity createOrUpdate(PersistableEntity value); + public E createOrUpdate(E value); /** * Delete an object. * * @param value the value to delete */ - public void delete(PersistableEntity value); + public void delete(E value); /** * Return all persistent instances, including subclasses. @@ -99,7 +98,7 @@ public interface Dao { * @return all persistence instances (an empty List will be * returned if no matches are found) */ - public List findAll(); + public List findAll(); /** * Find a List of PersistableEntitys, searched by @@ -110,7 +109,7 @@ public interface Dao { * @return the values with those identifiers (an empty List * will be returned if no matches are found) */ - public List findId(Collection ids); + public List findId(Collection ids); /** * Load a persistent instance by its identifier. @@ -120,7 +119,7 @@ public interface Dao { * * @return the request item, or null if not found */ - public PersistableEntity readId(Serializable id); + public E readId(Serializable id); /** * Find persistent instances with properties matching those of the passed @@ -133,8 +132,8 @@ public interface Dao { * the query by example evaluation. *

* - * @param value parameters to filter on (the class of this object will be - * added to the filter) + * @param value parameters to filter on (the class of this object will + * be added to the filter) * @param firstElement the first result (start at zero to obtain all * results) * @param maxElements the maximum number of results desired for this page @@ -146,17 +145,17 @@ public interface Dao { * @return the requested page of the result list (a properly formed * PaginatedList is returned if no results match) */ - public PaginatedList scroll(PersistableEntity value, int firstElement, + public PaginatedList scroll(E value, int firstElement, int maxElements, String orderByAsc); - /** + /** * Find persistent instances with properties matching those of the passed * PersistableEntity, ignoring the class of the passed * PersistableEntity (useful if you pass a superclass, as you * want to find all subclass instances which match). - * - * @param value parameters to filter on (the class of this object will NOT - * be added to the filter) + * + * @param value parameters to filter on (the class of this object will + * NOT be added to the filter) * @param firstElement the first result (start at zero to obtain all * results) * @param maxElements the maximum number of results desired for this page @@ -167,11 +166,11 @@ public interface Dao { * * @return the requested page of the result list (a properly formed * PaginatedList is returned if no results match) - */ - public PaginatedList scrollWithSubclasses(PersistableEntity value, - int firstElement, int maxElements, String orderByAsc); + */ + public PaginatedList scrollWithSubclasses(E value, int firstElement, + int maxElements, String orderByAsc); - /** + /** * Indicates whether the DAO instance provides persistence services for the * specified class. * @@ -191,5 +190,5 @@ public interface Dao { * * @return the updated value */ - public PersistableEntity update(PersistableEntity value); + public E update(E value); } diff --git a/domain/src/main/java/org/acegisecurity/domain/dao/EvictionUtils.java b/domain/src/main/java/org/acegisecurity/domain/dao/EvictionUtils.java index 68f78afb53..dc2bd67df1 100644 --- a/domain/src/main/java/org/acegisecurity/domain/dao/EvictionUtils.java +++ b/domain/src/main/java/org/acegisecurity/domain/dao/EvictionUtils.java @@ -62,7 +62,7 @@ public class EvictionUtils { * @param collection whose members to evict (never null) */ public static void evictIfRequired(Object daoOrServices, - Collection collection) { + Collection collection) { Assert.notNull(collection, "Cannot evict a null Collection"); if (getEvictionCapable(daoOrServices) == null) { @@ -70,7 +70,7 @@ public class EvictionUtils { return; } - Iterator iter = collection.iterator(); + Iterator iter = collection.iterator(); while (iter.hasNext()) { Object obj = iter.next(); diff --git a/domain/src/main/java/org/acegisecurity/domain/dao/PaginatedList.java b/domain/src/main/java/org/acegisecurity/domain/dao/PaginatedList.java index df78d12b47..d2852611b7 100644 --- a/domain/src/main/java/org/acegisecurity/domain/dao/PaginatedList.java +++ b/domain/src/main/java/org/acegisecurity/domain/dao/PaginatedList.java @@ -30,7 +30,7 @@ import java.util.Vector; /** *

- * Represents a paginated List. + * JDK1.5 compatible paginated List. *

* *

@@ -52,11 +52,11 @@ import java.util.Vector; * @author Ben Alex * @version $Id$ */ -public class PaginatedList implements List { +public class PaginatedList implements List { //~ Instance fields ======================================================== protected final transient Log logger = LogFactory.getLog(getClass()); - private List list; + private List list; private int firstElement; private int maxElements; private int size; @@ -73,23 +73,23 @@ public class PaginatedList implements List { * @param entity the entity to include (can be null, which * indicates an empty PaginatedList should be created) */ - public PaginatedList(PersistableEntity entity) { + public PaginatedList(E entity) { if (entity == null) { - this.list = new Vector(); + this.list = new Vector(); this.firstElement = 0; this.maxElements = Integer.MAX_VALUE; this.size = 0; } else { - List list = new Vector(); - list.add(entity); - this.list = list; + List myList = new Vector(); + myList.add(entity); + this.list = myList; this.firstElement = 0; this.maxElements = Integer.MAX_VALUE; this.size = 1; } } - public PaginatedList(List list, int firstElement, int maxElements, int size) { + public PaginatedList(List list, int firstElement, int maxElements, int size) { this.list = list; this.firstElement = firstElement; this.maxElements = maxElements; @@ -133,7 +133,7 @@ public class PaginatedList implements List { return (size() - 1) / getMaxElements(); } - public void setList(List list) { + public void setList(List list) { this.list = list; } @@ -142,7 +142,7 @@ public class PaginatedList implements List { * * @return this page of the results */ - public List getList() { + public List getList() { return list; } @@ -196,7 +196,7 @@ public class PaginatedList implements List { * * @see java.util.List#add(int, java.lang.Object) */ - public void add(int arg0, Object arg1) { + public void add(int arg0, E arg1) { throw new UnsupportedOperationException(); } @@ -211,7 +211,7 @@ public class PaginatedList implements List { * * @see java.util.Collection#add(java.lang.Object) */ - public boolean add(Object arg0) { + public boolean add(E arg0) { throw new UnsupportedOperationException(); } @@ -226,7 +226,7 @@ public class PaginatedList implements List { * * @see java.util.Collection#addAll(java.util.Collection) */ - public boolean addAll(Collection arg0) { + public boolean addAll(Collection arg0) { throw new UnsupportedOperationException(); } @@ -242,7 +242,7 @@ public class PaginatedList implements List { * * @see java.util.List#addAll(int, java.util.Collection) */ - public boolean addAll(int arg0, Collection arg1) { + public boolean addAll(int arg0, Collection arg1) { throw new UnsupportedOperationException(); } @@ -283,7 +283,7 @@ public class PaginatedList implements List { * * @see java.util.Collection#containsAll(java.util.Collection) */ - public boolean containsAll(Collection arg0) { + public boolean containsAll(Collection arg0) { throw new UnsupportedOperationException(); } @@ -296,7 +296,7 @@ public class PaginatedList implements List { * * @see java.util.List#get(int) */ - public Object get(int arg0) { + public E get(int arg0) { return list.get(arg0); } @@ -315,7 +315,7 @@ public class PaginatedList implements List { throw new UnsupportedOperationException(); } - public Iterator iterator() { + public Iterator iterator() { return new PaginatedListIterator(); } @@ -343,7 +343,7 @@ public class PaginatedList implements List { * * @see java.util.List#listIterator() */ - public ListIterator listIterator() { + public ListIterator listIterator() { throw new UnsupportedOperationException(); } @@ -358,7 +358,7 @@ public class PaginatedList implements List { * * @see java.util.List#listIterator(int) */ - public ListIterator listIterator(int arg0) { + public ListIterator listIterator(int arg0) { throw new UnsupportedOperationException(); } @@ -373,7 +373,7 @@ public class PaginatedList implements List { * * @see java.util.List#remove(int) */ - public Object remove(int arg0) { + public E remove(int arg0) { throw new UnsupportedOperationException(); } @@ -418,7 +418,7 @@ public class PaginatedList implements List { * * @see java.util.Collection#retainAll(java.util.Collection) */ - public boolean retainAll(Collection arg0) { + public boolean retainAll(Collection arg0) { throw new UnsupportedOperationException(); } @@ -434,7 +434,7 @@ public class PaginatedList implements List { * * @see java.util.List#set(int, java.lang.Object) */ - public Object set(int arg0, Object arg1) { + public E set(int arg0, E arg1) { throw new UnsupportedOperationException(); } @@ -459,7 +459,7 @@ public class PaginatedList implements List { * * @see java.util.List#subList(int, int) */ - public List subList(int arg0, int arg1) { + public List subList(int arg0, int arg1) { throw new UnsupportedOperationException(); } @@ -467,7 +467,7 @@ public class PaginatedList implements List { return list.toArray(); } - public Object[] toArray(Object[] arg0) { + public T[] toArray(T[] arg0) { if (logger.isDebugEnabled()) { logger.debug("List size when convert to array " + list.toArray().length); @@ -475,57 +475,61 @@ public class PaginatedList implements List { return list.toArray(arg0); } + + + private class PaginatedListIterator implements Iterator { + //~ Instance fields ======================================================== - //~ Inner Classes ========================================================== + private Iterator iterator; + private int i = 0; - private class PaginatedListIterator implements Iterator { - private Iterator iterator; - private int i = 0; + /** + * @see java.util.Iterator#hasNext() + */ + public boolean hasNext() { + return i < size(); + } - /** - * @see java.util.Iterator#hasNext() - */ - public boolean hasNext() { - return i < size(); - } + /** + * This method follows the rules of Iterator.next() except that it returns + * null when requesting an element that it's not in the current page. + * + * @see java.util.Iterator#next() + */ + public E next() { + if (i == getFirstElement()) { + iterator = getList().iterator(); + } - /** - * This method follows the rules of Iterator.next() except that it - * returns null when requesting an element that it's not in the - * current page. - * - * @see java.util.Iterator#next() - */ - public Object next() { - if (i == getFirstElement()) { - iterator = getList().iterator(); - } + if ((i >= getFirstElement()) + && (i < (getFirstElement() + getMaxElements()))) { + i++; - if ((i >= getFirstElement()) - && (i < (getFirstElement() + getMaxElements()))) { - i++; + return iterator.next(); + } - return iterator.next(); - } + if (hasNext()) { + i++; - if (hasNext()) { - i++; + return null; + } else { + throw new NoSuchElementException(); + } + } - return null; - } else { - throw new NoSuchElementException(); - } - } - - /** - * Unsupported operation - * - * @throws UnsupportedOperationException - * - * @see java.util.Iterator#remove() - */ - public void remove() { - throw new UnsupportedOperationException(); - } - } + /** + * Unsupported operation + * + * @throws UnsupportedOperationException + * + * @see java.util.Iterator#remove() + */ + public void remove() { + throw new UnsupportedOperationException(); + } + } + + + + } 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 d3429ad3b3..5942790a45 100644 --- a/domain/src/main/java/org/acegisecurity/domain/hibernate/DaoHibernate.java +++ b/domain/src/main/java/org/acegisecurity/domain/hibernate/DaoHibernate.java @@ -38,15 +38,14 @@ import org.springframework.orm.hibernate3.HibernateCallback; import org.springframework.orm.hibernate3.support.HibernateDaoSupport; import org.springframework.util.Assert; - /** - * {@link Dao} implementation that uses Hibernate 3 for persistence. + * Generics supporting {@link Dao} implementation that uses Hibernate 3 for persistence. * * @author Ben Alex * @author Matthew Porter * @version $Id$ */ -public class DaoHibernate extends HibernateDaoSupport implements Dao, +public class DaoHibernate extends HibernateDaoSupport implements Dao, EvictionCapable { //~ Instance fields ======================================================== @@ -63,21 +62,21 @@ public class DaoHibernate extends HibernateDaoSupport implements Dao, return supportsClass; } - public PersistableEntity create(PersistableEntity value) { + public E create(E value) { Assert.notNull(value); getHibernateTemplate().save(value); return readId(value.getInternalId()); } - public PersistableEntity createOrUpdate(PersistableEntity value) { + public E createOrUpdate(E value) { Assert.notNull(value); getHibernateTemplate().saveOrUpdate(value); return readId(value.getInternalId()); } - public void delete(PersistableEntity value) { + public void delete(E value) { Assert.notNull(value); getHibernateTemplate().delete(value); } @@ -87,24 +86,24 @@ public class DaoHibernate extends HibernateDaoSupport implements Dao, getHibernateTemplate().evict(entity); } - public List findAll() { + public List findAll() { return getHibernateTemplate().loadAll(supportsClass); } - public List findId(Collection ids) { + public List findId(Collection ids) { Assert.notNull(ids, "Collection of IDs cannot be null"); Assert.notEmpty(ids, "There must be some values in the Collection list"); return (List) getHibernateTemplate().execute(getFindByIdCallback(ids)); } - public PersistableEntity readId(Serializable id) { + public E readId(Serializable id) { Assert.notNull(id); - return (PersistableEntity) getHibernateTemplate().get(supportsClass, id); + return (E) getHibernateTemplate().get(supportsClass, id); } - public PaginatedList scroll(PersistableEntity value, int firstElement, + public PaginatedList scroll(E value, int firstElement, int maxElements, String orderByAsc) { Assert.notNull(value); Assert.hasText(orderByAsc, @@ -112,10 +111,10 @@ public class DaoHibernate extends HibernateDaoSupport implements Dao, Assert.isInstanceOf(this.supportsClass, value, "Can only scroll with values this DAO supports"); return (PaginatedList) getHibernateTemplate().execute(getFindByValueCallback( - value.getClass(), value, firstElement, maxElements, Order.asc(orderByAsc))); + value.getClass(), value, firstElement, maxElements, Order.asc(orderByAsc))); } - public PaginatedList scrollWithSubclasses(PersistableEntity value, int firstElement, + public PaginatedList scrollWithSubclasses(E value, int firstElement, int maxElements, String orderByAsc) { Assert.notNull(value); Assert.hasText(orderByAsc, @@ -123,7 +122,7 @@ public class DaoHibernate extends HibernateDaoSupport implements Dao, Assert.isInstanceOf(this.supportsClass, value, "Can only scroll with values this DAO supports"); return (PaginatedList) getHibernateTemplate().execute(getFindByValueCallback( - this.supportsClass, value, firstElement, maxElements, Order.asc(orderByAsc))); + this.supportsClass, value, firstElement, maxElements, Order.asc(orderByAsc))); } public boolean supports(Class clazz) { @@ -132,7 +131,7 @@ public class DaoHibernate extends HibernateDaoSupport implements Dao, return this.supportsClass.equals(clazz); } - public PersistableEntity update(PersistableEntity value) { + public E update(E value) { Assert.notNull(value); getHibernateTemplate().update(value); @@ -167,7 +166,7 @@ public class DaoHibernate extends HibernateDaoSupport implements Dao, * * @return a List containing the matching objects */ - private HibernateCallback getFindByIdCallback(final Collection ids) { + private HibernateCallback getFindByIdCallback(final Collection ids) { return new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException { @@ -263,10 +262,9 @@ public class DaoHibernate extends HibernateDaoSupport implements Dao, */ int size = criteria.list().size(); - List list = criteria.setFirstResult(firstElement) - .setMaxResults(count).list(); + List list = criteria.setFirstResult(firstElement).setMaxResults(count).list(); - return new PaginatedList(list, firstElement, count, size); + return new PaginatedList(list, firstElement, count, size); } }; } diff --git a/domain/src/main/java/org/acegisecurity/domain/hibernate/EnumUserType.java b/domain/src/main/java/org/acegisecurity/domain/hibernate/EnumUserType.java new file mode 100644 index 0000000000..1a973083e5 --- /dev/null +++ b/domain/src/main/java/org/acegisecurity/domain/hibernate/EnumUserType.java @@ -0,0 +1,95 @@ +/* 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.hibernate; + +import java.io.Serializable; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Types; + + +import org.hibernate.HibernateException; +import org.hibernate.usertype.UserType; + +/** + * Java 1.5 enumeration compatible Hibernate 3 UserType. + * + * @author Ben Alex + * @version $Id$ + */ +public class EnumUserType> implements UserType { + private Class clazz = null; + protected EnumUserType(Class c) { + this.clazz = c; + } + + private static final int[] SQL_TYPES = {Types.VARCHAR}; + public int[] sqlTypes() { + return SQL_TYPES; + } + + public Class returnedClass() { + return clazz; + } + + public Object nullSafeGet(ResultSet resultSet, String[] names, Object owner) throws HibernateException, SQLException { + String name = resultSet.getString(names[0]); + E result = null; + if (!resultSet.wasNull()) { + result = Enum.valueOf(clazz, name); + } + return result; + } + + public void nullSafeSet(PreparedStatement preparedStatement, Object value, int index) throws HibernateException, SQLException { + if (null == value) { + preparedStatement.setNull(index, Types.VARCHAR); + } else { + preparedStatement.setString(index, ((Enum)value).name()); + } + } + + public Object deepCopy(Object value) throws HibernateException{ + return value; + } + + public boolean isMutable() { + return false; + } + + public Object assemble(Serializable cached, Object owner) throws HibernateException { + return cached; + } + + public Serializable disassemble(Object value) throws HibernateException { + return (Serializable)value; + } + + public Object replace(Object original, Object target, Object owner) throws HibernateException { + return original; + } + public int hashCode(Object x) throws HibernateException { + return x.hashCode(); + } + public boolean equals(Object x, Object y) throws HibernateException { + if (x == y) + return true; + if (null == x || null == y) + return false; + return x.equals(y); + } +} \ No newline at end of file diff --git a/domain/src/main/java/org/acegisecurity/domain/hibernate/IntrospectionManagerHibernate.java b/domain/src/main/java/org/acegisecurity/domain/hibernate/IntrospectionManagerHibernate.java index e7943a909d..04b4e05ba3 100644 --- a/domain/src/main/java/org/acegisecurity/domain/hibernate/IntrospectionManagerHibernate.java +++ b/domain/src/main/java/org/acegisecurity/domain/hibernate/IntrospectionManagerHibernate.java @@ -35,6 +35,7 @@ import org.springframework.util.Assert; import java.util.Collection; import java.util.Iterator; import java.util.List; +import java.util.Map; /** @@ -90,17 +91,17 @@ public class IntrospectionManagerHibernate implements IntrospectionManager, Assert.notNull(sessionFactory, "SessionFactory is required"); // Eagerly pre-register Validators for all Hibernate metadata-defined classes - Collection mappedClasses = this.sessionFactory.getAllClassMetadata() - .keySet(); + Map metadataMap = this.sessionFactory.getAllClassMetadata(); + Collection mappedClasses = metadataMap.keySet(); - for (Iterator iter = mappedClasses.iterator(); iter.hasNext();) { - String className = (String) iter.next(); + for (Iterator iter = mappedClasses.iterator(); iter.hasNext();) { + String className = iter.next(); this.validationRegistryManager.findValidator(Class.forName( className)); } } - public void obtainImmediateChildren(Object parentObject, List allObjects) { + public void obtainImmediateChildren(Object parentObject, List allObjects) { Assert.notNull(parentObject, "Violation of interface contract: parentObject null"); Assert.notNull(allObjects, diff --git a/domain/src/main/java/org/acegisecurity/domain/impl/AbstractPersistableEntity.java b/domain/src/main/java/org/acegisecurity/domain/impl/AbstractPersistableEntity.java index 71bd33668f..a5b90ad706 100644 --- a/domain/src/main/java/org/acegisecurity/domain/impl/AbstractPersistableEntity.java +++ b/domain/src/main/java/org/acegisecurity/domain/impl/AbstractPersistableEntity.java @@ -15,8 +15,11 @@ package net.sf.acegisecurity.domain.impl; -import net.sf.acegisecurity.domain.PersistableEntity; +import javax.persistence.Column; +import javax.persistence.Transient; +import javax.persistence.Version; +import net.sf.acegisecurity.domain.PersistableEntity; /** * An abstract implementation of {@link @@ -24,6 +27,8 @@ import net.sf.acegisecurity.domain.PersistableEntity; * * @author Ben Alex * @version $Id$ + * + * */ public abstract class AbstractPersistableEntity extends BusinessObject implements PersistableEntity { @@ -45,6 +50,7 @@ public abstract class AbstractPersistableEntity extends BusinessObject * @return true if the instance has not been persisted, * false otherwise */ + @Transient public final boolean isNew() { return (getInternalId() == null); } @@ -60,6 +66,8 @@ public abstract class AbstractPersistableEntity extends BusinessObject * * @return the version */ + @Version + @Column(name="version", nullable=false) public final int getVersion() { return version; } @@ -68,8 +76,6 @@ public abstract class AbstractPersistableEntity extends BusinessObject * Sets the version numbers. Should only be used by the persistence layer. * * @param version the new version number to use - * - * @hibernate.version type="integer" */ protected final void setVersion(int version) { this.version = version; diff --git a/domain/src/main/java/org/acegisecurity/domain/impl/PersistableEntityInteger.java b/domain/src/main/java/org/acegisecurity/domain/impl/PersistableEntityInteger.java index a4d7a9b16f..5253ae49e4 100644 --- a/domain/src/main/java/org/acegisecurity/domain/impl/PersistableEntityInteger.java +++ b/domain/src/main/java/org/acegisecurity/domain/impl/PersistableEntityInteger.java @@ -17,9 +17,10 @@ package net.sf.acegisecurity.domain.impl; import java.io.Serializable; +import javax.persistence.Transient; /** - * A persistable entity that uses an Integer based identity. + * A persistable entity that uses a Integer based identity. * * @author Ben Alex * @version $Id$ @@ -27,7 +28,7 @@ import java.io.Serializable; public abstract class PersistableEntityInteger extends AbstractPersistableEntity { //~ Instance fields ======================================================== - private Integer id; + protected Integer id; //~ Methods ================================================================ @@ -47,14 +48,12 @@ public abstract class PersistableEntityInteger extends AbstractPersistableEntity /** * Obtains the persistence identity of this instance. - * - * @return the instance's identity - * - * @hibernate.id generator-class="native" + * + *

Marked as abstract to remind users to implement. They'll need to implement + * so their annotations reflect the correct sequence name. */ - public Integer getId() { - return id; - } + @Transient + public abstract Integer getId(); /** * DO NOT USE DIRECTLY. @@ -72,6 +71,7 @@ public abstract class PersistableEntityInteger extends AbstractPersistableEntity * * @return the instance's identity */ + @Transient public Serializable getInternalId() { return this.getId(); } diff --git a/domain/src/main/java/org/acegisecurity/domain/impl/PersistableEntityLong.java b/domain/src/main/java/org/acegisecurity/domain/impl/PersistableEntityLong.java index 5cc7b67e73..68eed0584f 100644 --- a/domain/src/main/java/org/acegisecurity/domain/impl/PersistableEntityLong.java +++ b/domain/src/main/java/org/acegisecurity/domain/impl/PersistableEntityLong.java @@ -17,6 +17,7 @@ package net.sf.acegisecurity.domain.impl; import java.io.Serializable; +import javax.persistence.Transient; /** * A persistable entity that uses a Long based identity. @@ -27,7 +28,7 @@ import java.io.Serializable; public abstract class PersistableEntityLong extends AbstractPersistableEntity { //~ Instance fields ======================================================== - private Long id; + protected Long id; //~ Methods ================================================================ @@ -47,14 +48,12 @@ public abstract class PersistableEntityLong extends AbstractPersistableEntity { /** * Obtains the persistence identity of this instance. - * - * @return the instance's identity - * - * @hibernate.id generator-class="native" + * + *

Marked as abstract to remind users to implement. They'll need to implement + * so their annotations reflect the correct sequence name. */ - public Long getId() { - return id; - } + @Transient + public abstract Long getId(); /** * DO NOT USE DIRECTLY. @@ -72,6 +71,7 @@ public abstract class PersistableEntityLong extends AbstractPersistableEntity { * * @return the instance's identity */ + @Transient public Serializable getInternalId() { return this.getId(); } diff --git a/domain/src/main/java/org/acegisecurity/domain/util/CollectionUtils.java b/domain/src/main/java/org/acegisecurity/domain/util/CollectionUtils.java index 78b8083ae5..b38026e7c0 100644 --- a/domain/src/main/java/org/acegisecurity/domain/util/CollectionUtils.java +++ b/domain/src/main/java/org/acegisecurity/domain/util/CollectionUtils.java @@ -53,7 +53,7 @@ public class CollectionUtils { * * @return */ - public static Set add(Set set, Object object) { + public static Set add(Set set, E object) { set.add(object); return set; @@ -67,7 +67,7 @@ public class CollectionUtils { * * @return */ - public static List add(List list, Object object) { + public static List add(List list, E object) { list.add(object); return list; @@ -83,20 +83,20 @@ public class CollectionUtils { * * @throws IllegalArgumentException DOCUMENT ME! */ - public static Collection clone(Collection collection) { + public static Collection clone(Collection collection) { if (collection == null) { return null; } Class clazz = collection.getClass(); - Collection clone = null; + Collection clone = null; if (List.class.isAssignableFrom(clazz)) { - clone = new ArrayList(collection); + clone = new ArrayList(collection); } else if (SortedSet.class.isAssignableFrom(clazz)) { - clone = new TreeSet(collection); + clone = new TreeSet(collection); } else if (Set.class.isAssignableFrom(clazz)) { - clone = new HashSet(collection); + clone = new HashSet(collection); } else { throw new IllegalArgumentException("Unknown collection class: " + clazz); @@ -117,18 +117,18 @@ public class CollectionUtils { * @throws IllegalArgumentException if the Map implementation * is not supported by this method */ - public static Map clone(Map map) { + public static Map clone(Map map) { if (map == null) { return null; } Class clazz = map.getClass(); - Map clone = null; + Map clone = null; if (SortedMap.class.isAssignableFrom(clazz)) { - clone = new TreeMap(map); + clone = new TreeMap(map); } else if (Map.class.isAssignableFrom(clazz)) { - clone = new HashMap(map); + clone = new HashMap(map); } else { throw new IllegalArgumentException("Unknown map class: " + clazz); } @@ -144,8 +144,8 @@ public class CollectionUtils { * * @return */ - public static List newList(Object object) { - return add(new ArrayList(1), object); + public static List newList(E object) { + return add(new ArrayList(1), object); } /** @@ -156,7 +156,7 @@ public class CollectionUtils { * * @return */ - public static Set newSet(Object object) { - return add(new HashSet(), object); + public static Set newSet(E object) { + return add(new HashSet(), object); } } diff --git a/domain/src/main/java/org/acegisecurity/domain/validation/IntrospectionManager.java b/domain/src/main/java/org/acegisecurity/domain/validation/IntrospectionManager.java index 769d8beeda..34f1b79530 100644 --- a/domain/src/main/java/org/acegisecurity/domain/validation/IntrospectionManager.java +++ b/domain/src/main/java/org/acegisecurity/domain/validation/IntrospectionManager.java @@ -51,5 +51,5 @@ public interface IntrospectionManager { * @param allObjects the list to which this method should append each * immediate child (guaranteed to never be null) */ - public void obtainImmediateChildren(Object parentObject, List allObjects); + public void obtainImmediateChildren(Object parentObject, List allObjects); } diff --git a/domain/src/main/java/org/acegisecurity/domain/validation/ValidationAdvisor.java b/domain/src/main/java/org/acegisecurity/domain/validation/ValidationAdvisor.java index e1b4bd8b9e..1dd44bd571 100644 --- a/domain/src/main/java/org/acegisecurity/domain/validation/ValidationAdvisor.java +++ b/domain/src/main/java/org/acegisecurity/domain/validation/ValidationAdvisor.java @@ -47,7 +47,7 @@ public class ValidationAdvisor extends StaticMethodMatcherPointcutAdvisor implements InitializingBean { //~ Instance fields ======================================================== - private Class supportsClass; + private Class supportsClass; private String[] methods = {"create", "update", "createOrUpdate"}; //~ Constructors =========================================================== @@ -72,7 +72,7 @@ public class ValidationAdvisor extends StaticMethodMatcherPointcutAdvisor return methods; } - public void setSupportsClass(Class clazz) { + public void setSupportsClass(Class clazz) { this.supportsClass = clazz; } diff --git a/domain/src/main/java/org/acegisecurity/domain/validation/ValidationInterceptor.java b/domain/src/main/java/org/acegisecurity/domain/validation/ValidationInterceptor.java index c0a018d131..38c796e289 100644 --- a/domain/src/main/java/org/acegisecurity/domain/validation/ValidationInterceptor.java +++ b/domain/src/main/java/org/acegisecurity/domain/validation/ValidationInterceptor.java @@ -34,7 +34,7 @@ import org.springframework.util.Assert; * *

* For each method invocation, any argument that is assignable from {@link - * #argumentClasses}and is non-null will be passed to the + * #argumentClasses} and is non-null will be passed to the * {@link net.sf.acegisecurity.domain.validation.ValidationManager} for * processing. *

@@ -48,7 +48,7 @@ public class ValidationInterceptor implements MethodInterceptor, protected final Log logger = LogFactory.getLog(getClass()); private ValidationManager validationManager; - private Class[] argumentClasses = {BusinessObject.class, PersistableEntity.class}; + private Class[] argumentClasses = {BusinessObject.class, PersistableEntity.class}; //~ Methods ================================================================ diff --git a/domain/src/main/java/org/acegisecurity/domain/validation/ValidationManagerImpl.java b/domain/src/main/java/org/acegisecurity/domain/validation/ValidationManagerImpl.java index 6922434d3e..2b6ce021cf 100644 --- a/domain/src/main/java/org/acegisecurity/domain/validation/ValidationManagerImpl.java +++ b/domain/src/main/java/org/acegisecurity/domain/validation/ValidationManagerImpl.java @@ -116,7 +116,7 @@ public class ValidationManagerImpl implements InitializingBean, "Cannot validate a null domain object, as unable to getClass()"); // Construct a list of objects to be validated and adds self - List allObjects = new Vector(); + List allObjects = new Vector(); allObjects.add(domainObject); // Add all children (and grandchildren, great-grandchildren etc) @@ -128,7 +128,7 @@ public class ValidationManagerImpl implements InitializingBean, "The list of objects to be validated was empty"); // Process list of objects to be validated by validating each - Iterator iter = allObjects.iterator(); + Iterator iter = allObjects.iterator(); while (iter.hasNext()) { Object currentDomainObject = iter.next(); @@ -204,7 +204,7 @@ public class ValidationManagerImpl implements InitializingBean, * @param parentObject the object we wish to locate all children for * @param allObjects the list to add the located children to */ - private void obtainAllChildren(Object parentObject, List allObjects) { + private void obtainAllChildren(Object parentObject, List allObjects) { Assert.notNull(parentObject, "Violation of parentObject method contract"); Assert.notNull(allObjects, "Violation of allObjects method contract"); Assert.isTrue(allObjects.contains(parentObject), @@ -215,7 +215,7 @@ public class ValidationManagerImpl implements InitializingBean, } // Add immediate children of this domain object - List currentChildren = new Vector(); + List currentChildren = new Vector(); introspectionManager.obtainImmediateChildren(parentObject, currentChildren); @@ -223,7 +223,7 @@ public class ValidationManagerImpl implements InitializingBean, allObjects.addAll(currentChildren); // Now iterate the children, adding their children to the object list - Iterator childrenIter = currentChildren.iterator(); + Iterator childrenIter = currentChildren.iterator(); while (childrenIter.hasNext()) { Object childObject = childrenIter.next(); diff --git a/domain/src/main/java/org/acegisecurity/domain/validation/ValidationRegistryManagerImpl.java b/domain/src/main/java/org/acegisecurity/domain/validation/ValidationRegistryManagerImpl.java index d639a020d6..317f6e2e6d 100644 --- a/domain/src/main/java/org/acegisecurity/domain/validation/ValidationRegistryManagerImpl.java +++ b/domain/src/main/java/org/acegisecurity/domain/validation/ValidationRegistryManagerImpl.java @@ -46,7 +46,7 @@ public class ValidationRegistryManagerImpl implements ValidationRegistryManager, //~ Instance fields ======================================================== private ListableBeanFactory bf; - private Map validatorMap = new HashMap(); + private Map validatorMap = new HashMap(); //~ Methods ================================================================ @@ -68,11 +68,11 @@ public class ValidationRegistryManagerImpl implements ValidationRegistryManager, } // Attempt to find Validator via introspection - Map beans = BeanFactoryUtils.beansOfTypeIncludingAncestors(bf, Validator.class, true, true); - Iterator iter = beans.keySet().iterator(); + Map beans = BeanFactoryUtils.beansOfTypeIncludingAncestors(bf, Validator.class, true, true); + Iterator iter = beans.keySet().iterator(); while (iter.hasNext()) { - String beanName = (String) iter.next(); - Validator validator = (Validator) beans.get(beanName); + String beanName = iter.next(); + Validator validator = beans.get(beanName); if (validator.supports(domainClass)) { this.validatorMap.put(domainClass, beanName); return validator;