=== modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/user/UserGroupAccess.java' --- dhis-2/dhis-api/src/main/java/org/hisp/dhis/user/UserGroupAccess.java 2016-01-04 02:27:49 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/user/UserGroupAccess.java 2016-03-01 09:01:25 +0000 @@ -42,10 +42,12 @@ { private int id; - private String access; - private UserGroup userGroup; + private transient String uid; + + private transient String access; + public UserGroupAccess() { } @@ -75,7 +77,7 @@ @JsonProperty @JacksonXmlProperty( namespace = DxfNamespaces.DXF_2_0 ) - public String userGroupUid() + public String getUserGroupUid() { return userGroup != null ? userGroup.getUid() : null; } @@ -84,7 +86,12 @@ @JacksonXmlProperty( namespace = DxfNamespaces.DXF_2_0 ) public String getUid() { - return userGroup != null ? userGroup.getUid() : null; + return uid != null ? uid : (userGroup != null ? userGroup.getUid() : null); + } + + public void setUid( String uid ) + { + this.uid = uid; } @JsonProperty @@ -96,6 +103,13 @@ public UserGroup getUserGroup() { + if ( userGroup == null ) + { + UserGroup userGroup = new UserGroup(); + userGroup.setUid( uid ); + return userGroup; + } + return userGroup; } === modified file 'dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/metadata/DefaultObjectBridge.java' --- dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/metadata/DefaultObjectBridge.java 2016-01-04 02:27:49 +0000 +++ dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/metadata/DefaultObjectBridge.java 2016-03-01 09:01:25 +0000 @@ -387,7 +387,7 @@ { return objects.iterator().next(); } - else + else if ( !objects.isEmpty() ) { String objectName; === modified file 'dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/metadata/importers/DefaultIdentifiableObjectImporter.java' --- dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/metadata/importers/DefaultIdentifiableObjectImporter.java 2016-02-25 20:15:42 +0000 +++ dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/metadata/importers/DefaultIdentifiableObjectImporter.java 2016-03-01 09:01:25 +0000 @@ -57,7 +57,6 @@ import org.hisp.dhis.dxf2.metadata.ObjectBridge; import org.hisp.dhis.dxf2.metadata.handlers.ObjectHandler; import org.hisp.dhis.dxf2.metadata.handlers.ObjectHandlerUtils; -import org.hisp.dhis.schema.validation.SchemaValidator; import org.hisp.dhis.eventchart.EventChart; import org.hisp.dhis.eventreport.EventReport; import org.hisp.dhis.expression.Expression; @@ -70,6 +69,8 @@ import org.hisp.dhis.program.ProgramValidation; import org.hisp.dhis.schema.Schema; import org.hisp.dhis.schema.SchemaService; +import org.hisp.dhis.schema.validation.SchemaValidator; +import org.hisp.dhis.schema.validation.ValidationViolation; import org.hisp.dhis.security.acl.AclService; import org.hisp.dhis.system.util.ReflectionUtils; import org.hisp.dhis.trackedentity.TrackedEntity; @@ -77,9 +78,11 @@ import org.hisp.dhis.translation.Translation; import org.hisp.dhis.user.User; import org.hisp.dhis.user.UserCredentials; +import org.hisp.dhis.user.UserGroup; +import org.hisp.dhis.user.UserGroupAccess; +import org.hisp.dhis.user.UserGroupAccessService; import org.hisp.dhis.user.UserService; import org.hisp.dhis.validation.ValidationRule; -import org.hisp.dhis.schema.validation.ValidationViolation; import org.springframework.beans.factory.annotation.Autowired; import java.lang.reflect.Field; @@ -138,6 +141,9 @@ @Autowired private UserService userService; + @Autowired + private UserGroupAccessService userGroupAccessService; + @Autowired( required = false ) private List> objectHandlers; @@ -939,7 +945,8 @@ // keeping this internal for now, might be split into several classes private class NonIdentifiableObjects { - private Set attributeValues = Sets.newHashSet(); + private Set attributeValues = new HashSet<>(); + private Set userGroupAccesses = new HashSet<>(); private Expression leftSide; private Expression rightSide; @@ -989,6 +996,7 @@ { schema = schemaService.getDynamicSchema( object.getClass() ); attributeValues = extractAttributeValues( object ); + userGroupAccesses = extractUserGroupAccesses( object ); leftSide = extractExpression( object, "leftSide" ); rightSide = extractExpression( object, "rightSide" ); compulsoryDataElementOperands = Sets.newHashSet( extractDataElementOperands( object, "compulsoryDataElementOperands" ) ); @@ -1021,6 +1029,7 @@ schema = schemaService.getDynamicSchema( object.getClass() ); saveAttributeValues( object, attributeValues ); + saveUserGroupAccess( object, userGroupAccesses ); saveExpression( object, "leftSide", leftSide ); saveExpression( object, "rightSide", rightSide ); saveDataElementOperands( object, "compulsoryDataElementOperands", compulsoryDataElementOperands ); @@ -1163,6 +1172,19 @@ return attributeValues; } + private Set extractUserGroupAccesses( T object ) + { + Set userGroupAccesses = new HashSet<>(); + + if ( schema.havePersistedProperty( "userGroupAccesses" ) ) + { + userGroupAccesses = ReflectionUtils.invokeGetterMethod( "userGroupAccesses", object ); + ReflectionUtils.invokeSetterMethod( "userGroupAccesses", object, new HashSet<>() ); + } + + return userGroupAccesses; + } + private void saveAttributeValues( T object, Collection attributeValues ) { for ( AttributeValue attributeValue : attributeValues ) @@ -1188,6 +1210,24 @@ } } + private void saveUserGroupAccess( T object, Set userGroupAccesses ) + { + for ( UserGroupAccess uga : userGroupAccesses ) + { + UserGroup userGroup = objectBridge.getObject( uga.getUserGroup() ); + + if ( userGroup == null ) + { + log.info( "Unknown reference to " + uga.getUserGroup() + " on object " + uga ); + return; + } + + uga.setUserGroup( userGroup ); + userGroupAccessService.addUserGroupAccess( uga ); + object.getUserGroupAccesses().add( uga ); + } + } + private void deleteExpression( T object, String fieldName ) { Expression expression = extractExpression( object, fieldName );