=== modified file 'dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/common/hibernate/HibernateIdentifiableObjectStore.java' --- dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/common/hibernate/HibernateIdentifiableObjectStore.java 2014-08-15 07:40:20 +0000 +++ dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/common/hibernate/HibernateIdentifiableObjectStore.java 2014-09-02 05:23:24 +0000 @@ -28,11 +28,6 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -import java.util.ArrayList; -import java.util.Collection; -import java.util.Date; -import java.util.List; - import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.hibernate.Query; @@ -45,6 +40,11 @@ import org.hisp.dhis.hibernate.exception.ReadAccessDeniedException; import org.hisp.dhis.user.User; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Date; +import java.util.List; + /** * @author bobj */ @@ -97,7 +97,7 @@ { return null; } - + T object = getObject( Restrictions.eq( "uid", uid ) ); if ( !isReadAllowed( object ) ) @@ -116,7 +116,7 @@ { return null; } - + return getObject( Restrictions.eq( "uid", uid ) ); } @@ -163,7 +163,7 @@ { return null; } - + T object = getObject( Restrictions.eq( "code", code ) ); if ( !isReadAllowed( object ) ) @@ -176,7 +176,7 @@ } @Override - @SuppressWarnings("unchecked") + @SuppressWarnings( "unchecked" ) public List getAllEqName( String name ) { Query query = sharingEnabled() ? getQueryAllEqNameAcl( name ) : getQueryAllEqName( name ); @@ -208,7 +208,7 @@ } @Override - @SuppressWarnings("unchecked") + @SuppressWarnings( "unchecked" ) public List getAllEqNameIgnoreCase( String name ) { Query query = sharingEnabled() ? getQueryAllEqNameAclIgnoreCase( name ) : getQueryAllEqNameIgnoreCase( name ); @@ -240,7 +240,7 @@ } @Override - @SuppressWarnings("unchecked") + @SuppressWarnings( "unchecked" ) public List getAllEqShortName( String shortName ) { Query query = sharingEnabled() ? getQueryAllEqShortNameAcl( shortName ) : getQueryAllEqShortName( shortName ); @@ -272,7 +272,7 @@ } @Override - @SuppressWarnings("unchecked") + @SuppressWarnings( "unchecked" ) public List getAllEqShortNameIgnoreCase( String shortName ) { Query query = sharingEnabled() ? getQueryAllEqShortNameAclIgnoreCase( shortName ) : getQueryAllEqShortNameIgnoreCase( shortName ); @@ -304,7 +304,7 @@ } @Override - @SuppressWarnings("unchecked") + @SuppressWarnings( "unchecked" ) public List getAllLikeName( String name ) { Query query = sharingEnabled() ? getQueryAllLikeNameAcl( name ) : getQueryAllLikeName( name ); @@ -336,7 +336,7 @@ } @Override - @SuppressWarnings("unchecked") + @SuppressWarnings( "unchecked" ) public List getAllLikeShortName( String shortName ) { if ( NameableObject.class.isAssignableFrom( clazz ) ) @@ -372,7 +372,7 @@ } @Override - @SuppressWarnings("unchecked") + @SuppressWarnings( "unchecked" ) public List getAllOrderedName() { Query query = sharingEnabled() ? getQueryAllOrderedNameAcl() : getQueryAllOrderedName(); @@ -400,9 +400,16 @@ } @Override - @SuppressWarnings("unchecked") + @SuppressWarnings( "unchecked" ) public List getAllOrderedName( int first, int max ) { + /* + return getSharingCriteria() + .setFirstResult( first ) + .setMaxResults( max ) + .list(); + */ + Query query = sharingEnabled() ? getQueryAllOrderedNameAcl() : getQueryAllOrderedName(); query.setFirstResult( first ); @@ -412,7 +419,7 @@ } @Override - @SuppressWarnings("unchecked") + @SuppressWarnings( "unchecked" ) public List getAllOrderedLastUpdated( int first, int max ) { Query query = sharingEnabled() ? getQueryAllOrderedLastUpdatedAcl() : getQueryAllOrderedLastUpdated(); @@ -443,7 +450,7 @@ } @Override - @SuppressWarnings("unchecked") + @SuppressWarnings( "unchecked" ) public List getAllLikeNameOrderedName( String name, int first, int max ) { Query query = sharingEnabled() ? getQueryAllLikeNameOrderedNameAcl( name ) : getQueryAllLikeNameOrderedName( name ); @@ -540,7 +547,7 @@ } @Override - @SuppressWarnings("unchecked") + @SuppressWarnings( "unchecked" ) public List getAllGeLastUpdated( Date lastUpdated ) { Query query = sharingEnabled() ? getQueryAllGeLastUpdatedAcl( lastUpdated ) : getQueryAllGeLastUpdated( lastUpdated ); @@ -572,7 +579,7 @@ } @Override - @SuppressWarnings("unchecked") + @SuppressWarnings( "unchecked" ) public List getAllGeCreated( Date created ) { Query query = sharingEnabled() ? getQueryAllGeCreatedAcl( created ) : getQueryAllGeCreated( created ); @@ -604,7 +611,7 @@ } @Override - @SuppressWarnings("unchecked") + @SuppressWarnings( "unchecked" ) public List getAllGeLastUpdatedOrderedName( Date lastUpdated ) { Query query = sharingEnabled() ? getQueryAllGeLastUpdatedOrderedNameAcl( lastUpdated ) : getQueryAllGeLastUpdatedOrderedName( lastUpdated ); @@ -636,7 +643,7 @@ } @Override - @SuppressWarnings("unchecked") + @SuppressWarnings( "unchecked" ) public List getByUser( User user ) { Query query = getQuery( "from " + clazz.getName() + " c where user = :user" ); @@ -646,7 +653,7 @@ } @Override - @SuppressWarnings("unchecked") + @SuppressWarnings( "unchecked" ) public List getByDataDimension( boolean dataDimension ) { Query query = getQuery( "from " + clazz.getName() + " c where c.dataDimension = :dataDimension" ); @@ -654,7 +661,7 @@ return query.list(); } - + @Override public List getByUid( Collection uids ) { === modified file 'dhis-2/dhis-support/dhis-support-hibernate/src/main/java/org/hisp/dhis/hibernate/HibernateGenericStore.java' --- dhis-2/dhis-support/dhis-support-hibernate/src/main/java/org/hisp/dhis/hibernate/HibernateGenericStore.java 2014-08-14 05:46:19 +0000 +++ dhis-2/dhis-support/dhis-support-hibernate/src/main/java/org/hisp/dhis/hibernate/HibernateGenericStore.java 2014-09-02 05:23:24 +0000 @@ -36,6 +36,11 @@ import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.criterion.Criterion; +import org.hibernate.criterion.DetachedCriteria; +import org.hibernate.criterion.Disjunction; +import org.hibernate.criterion.Projections; +import org.hibernate.criterion.Restrictions; +import org.hibernate.criterion.Subqueries; import org.hisp.dhis.acl.AccessStringHelper; import org.hisp.dhis.acl.AclService; import org.hisp.dhis.common.AuditLogUtil; @@ -172,6 +177,47 @@ return getClazzCriteria().setCacheable( cacheable ); } + protected final Disjunction getSharingDisjunction() + { + Disjunction disjunction = Restrictions.disjunction(); + + disjunction.add( Restrictions.like( "publicAccess", "r%" ) ); + disjunction.add( Restrictions.isNull( "user" ) ); + disjunction.add( Restrictions.eq( "user", currentUserService.getCurrentUser() ) ); + + DetachedCriteria detachedCriteria = DetachedCriteria.forClass( UserGroupAccess.class, "uga" ); + detachedCriteria.createAlias( "uga.userGroup", "ug" ); + detachedCriteria.createAlias( "ug.members", "ugm" ); + + detachedCriteria.add( Restrictions.like( "uga.access", "r%" ) ); + detachedCriteria.add( Restrictions.eq( "ugm.id", currentUserService.getCurrentUser().getId() ) ); + + detachedCriteria.setProjection( Projections.id() ); + + disjunction.add( Subqueries.exists( detachedCriteria ) ); + + return disjunction; + } + + /** + * Creates a Criteria for the implementation Class type. + * + * @return a Criteria instance. + */ + protected final Criteria getSharingCriteria() + { + Criteria criteria = getCriteria(); + + if ( !sharingEnabled() ) + { + return criteria; + } + + criteria.add( getSharingDisjunction() ); + + return criteria; + } + protected Criteria getClazzCriteria() { return sessionFactory.getCurrentSession().createCriteria( getClazz() ); @@ -203,7 +249,7 @@ * @param expressions the Criterions for the Criteria. * @return an object of the implementation Class type. */ - @SuppressWarnings("unchecked") + @SuppressWarnings( "unchecked" ) protected final T getObject( Criterion... expressions ) { return (T) getCriteria( expressions ).uniqueResult(); @@ -215,7 +261,7 @@ * @param expressions the Criterions for the Criteria. * @return a List with objects of the implementation Class type. */ - @SuppressWarnings("unchecked") + @SuppressWarnings( "unchecked" ) protected final List getList( Criterion... expressions ) { return getCriteria( expressions ).list(); @@ -291,7 +337,7 @@ } @Override - @SuppressWarnings("unchecked") + @SuppressWarnings( "unchecked" ) public final T get( int id ) { T object = (T) sessionFactory.getCurrentSession().get( getClazz(), id ); @@ -306,7 +352,7 @@ } @Override - @SuppressWarnings("unchecked") + @SuppressWarnings( "unchecked" ) public final T load( int id ) { T object = (T) sessionFactory.getCurrentSession().load( getClazz(), id ); @@ -338,7 +384,7 @@ } @Override - @SuppressWarnings("unchecked") + @SuppressWarnings( "unchecked" ) public final List getAll() { Query query = sharingEnabled() ? getQueryAllAcl() : getQueryAll(); @@ -405,6 +451,8 @@ @Override public int getCount() { + // return getSharingCriteria().list().size(); + Query query = sharingEnabled() ? getQueryCountAcl() : getQueryCount(); return ((Long) query.uniqueResult()).intValue(); @@ -439,10 +487,8 @@ protected boolean sharingEnabled() { - boolean enabled = forceAcl() || (aclService.isShareable( clazz ) && !(currentUserService.getCurrentUser() == null || + return forceAcl() || (aclService.isShareable( clazz ) && !(currentUserService.getCurrentUser() == null || CollectionUtils.containsAny( currentUserService.getCurrentUser().getUserCredentials().getAllAuthorities(), AclService.ACL_OVERRIDE_AUTHORITIES ))); - - return enabled; } protected boolean isReadAllowed( T object )