=== modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/trackedentity/TrackedEntityAttributeService.java' --- dhis-2/dhis-api/src/main/java/org/hisp/dhis/trackedentity/TrackedEntityAttributeService.java 2015-09-30 05:42:06 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/trackedentity/TrackedEntityAttributeService.java 2015-09-30 06:14:51 +0000 @@ -42,103 +42,97 @@ /** * Adds an {@link TrackedEntityAttribute} - * + * * @param attribute The to TrackedEntityAttribute add. - * * @return A generated unique id of the added {@link TrackedEntityAttribute} - * . + * . */ int addTrackedEntityAttribute( TrackedEntityAttribute attribute ); /** * Deletes a {@link TrackedEntityAttribute}. - * + * * @param attribute the TrackedEntityAttribute to delete. */ void deleteTrackedEntityAttribute( TrackedEntityAttribute attribute ); /** * Updates an {@link TrackedEntityAttribute}. - * + * * @param attribute the TrackedEntityAttribute to update. */ void updateTrackedEntityAttribute( TrackedEntityAttribute attribute ); /** * Returns a {@link TrackedEntityAttribute}. - * + * * @param id the id of the TrackedEntityAttribute to return. - * * @return the TrackedEntityAttribute with the given id */ TrackedEntityAttribute getTrackedEntityAttribute( int id ); /** * Returns the {@link TrackedEntityAttribute} with the given UID. - * + * * @param uid the UID. * @return the TrackedEntityAttribute with the given UID, or null if no - * match. + * match. */ TrackedEntityAttribute getTrackedEntityAttribute( String uid ); /** * Returns a {@link TrackedEntityAttribute} with a given name. - * + * * @param name the name of the TrackedEntityAttribute to return. - * * @return the TrackedEntityAttribute with the given name, or null if no - * match. + * match. */ TrackedEntityAttribute getTrackedEntityAttributeByName( String name ); /** * Returns a {@link TrackedEntityAttribute} with a given short name. - * + * * @param name the short name of the TrackedEntityAttribute to return. - * * @return the TrackedEntityAttribute with the given short name, or null if no - * match. + * match. */ TrackedEntityAttribute getTrackedEntityAttributeByShortName( String name ); /** * Returns a {@link TrackedEntityAttribute} with a given code. - * + * * @param name the code of the TrackedEntityAttribute to return. - * * @return the TrackedEntityAttribute with the given code, or null if no - * match. + * match. */ TrackedEntityAttribute getTrackedEntityAttributeByCode( String code ); /** * Returns all {@link TrackedEntityAttribute} - * + * * @return a List of all TrackedEntityAttribute, or an empty - * List if there are no TrackedEntityAttributes. + * List if there are no TrackedEntityAttributes. */ List getAllTrackedEntityAttributes(); /** * Get attributes without groups - * + * * @return List of attributes */ List getOptionalAttributesWithoutGroup(); /** * Get attributes without groups - * + * * @return List of attributes without group */ List getTrackedEntityAttributesWithoutGroup(); /** * Get attributes which are displayed in visit schedule - * + * * @param displayOnVisitSchedule True/False value - * * @return List of attributes */ List getTrackedEntityAttributesByDisplayOnVisitSchedule( @@ -146,56 +140,51 @@ /** * Get attributes which are displayed in visit schedule - * + * * @param displayInListNoProgram True/False value - * * @return List of attributes */ List getTrackedEntityAttributesWithoutProgram(); /** * Get attributes which are displayed in visit schedule - * + * * @param displayInListNoProgram True/False value - * * @return List of attributes */ List getTrackedEntityAttributesDisplayInList(); /** * Returns {@link TrackedEntityAttribute} list with paging - * + * * @param name Keyword for searching by name * @param min * @param max * @return a collection of all TrackedEntityAttribute, or an empty - * collection if there are no TrackedEntityAttributes. + * collection if there are no TrackedEntityAttributes. */ List getTrackedEntityAttributesBetweenByName( String name, int min, int max ); /** * Returns The number of all TrackedEntityAttribute available - * */ int getTrackedEntityAttributeCount(); /** * Returns {@link TrackedEntityAttribute} list with paging - * + * * @param min * @param max * @return a collection of all TrackedEntityAttribute, or an empty - * collection if there are no TrackedEntityAttributes. + * collection if there are no TrackedEntityAttributes. */ List getTrackedEntityAttributesBetween( int min, int max ); /** * Returns The number of TrackedEntityAttributes with the key searched - * + * * @param name Keyword for searching by name - * * @return A number - * */ int getTrackedEntityAttributeCountByName( String name ); @@ -210,4 +199,13 @@ */ boolean validateScope( TrackedEntityInstance trackedEntityInstance, TrackedEntityAttribute trackedEntityAttribute, OrganisationUnit organisationUnit, String value ); + + /** + * Validate value against tracked entity attribute value type. + * + * @param trackedEntityAttribute TrackedEntityAttribute + * @param value Value + * @return null if valid, a message if not + */ + String validateValueType( TrackedEntityAttribute trackedEntityAttribute, String value ); } === modified file 'dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/trackedentity/DefaultTrackedEntityAttributeService.java' --- dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/trackedentity/DefaultTrackedEntityAttributeService.java 2015-09-30 05:42:06 +0000 +++ dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/trackedentity/DefaultTrackedEntityAttributeService.java 2015-09-30 06:14:51 +0000 @@ -28,20 +28,24 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -import java.util.ArrayList; -import java.util.List; - import org.hisp.dhis.common.Grid; import org.hisp.dhis.common.OrganisationUnitSelectionMode; import org.hisp.dhis.common.QueryItem; import org.hisp.dhis.common.QueryOperator; +import org.hisp.dhis.common.ValueType; import org.hisp.dhis.organisationunit.OrganisationUnit; import org.hisp.dhis.program.Program; import org.hisp.dhis.program.ProgramService; +import org.hisp.dhis.system.util.DateUtils; +import org.hisp.dhis.system.util.MathUtils; +import org.hisp.dhis.user.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.Assert; +import java.util.ArrayList; +import java.util.List; + /** * @author Abyot Asalefew */ @@ -70,6 +74,9 @@ @Autowired private TrackedEntityInstanceService trackedEntityInstanceService; + @Autowired + private UserService userService; + // ------------------------------------------------------------------------- // Implementation methods // ------------------------------------------------------------------------- @@ -190,7 +197,7 @@ public int getTrackedEntityAttributeCountByName( String name ) { return attributeStore.getCountLikeName( name ); - } + } @Override public boolean validateScope( TrackedEntityInstance trackedEntityInstance, TrackedEntityAttribute trackedEntityAttribute, @@ -222,4 +229,46 @@ return instances.getHeight() == 0 || instances.getHeight() == 1 && instances.getRow( 0 ).contains( trackedEntityInstance.getUid() ); } + + @Override + public String validateValueType( TrackedEntityAttribute trackedEntityAttribute, String value ) + { + Assert.notNull( trackedEntityAttribute, "trackedEntityAttribute is required." ); + ValueType valueType = trackedEntityAttribute.getValueType(); + + if ( value.length() > 255 ) + { + return "Value length is greater than 256 chars for attribute " + trackedEntityAttribute.getUid(); + } + + if ( ValueType.NUMBER == valueType && !MathUtils.isNumeric( value ) ) + { + return "Value is not numeric for attribute " + trackedEntityAttribute.getUid(); + } + else if ( ValueType.BOOLEAN == valueType && !MathUtils.isBool( value ) ) + { + return "Value is not boolean for attribute " + trackedEntityAttribute.getUid(); + } + else if ( ValueType.DATE == valueType && !DateUtils.dateIsValid( value ) ) + { + return "Value is not date for attribute " + trackedEntityAttribute.getUid(); + } + else if ( ValueType.TRUE_ONLY == valueType && !"true".equals( value ) ) + { + return "Value is not true (true-only value type) for attribute " + trackedEntityAttribute.getUid(); + } + else if ( ValueType.USERNAME == valueType ) + { + if ( userService.getUserCredentialsByUsername( value ) == null ) + { + return "Value is not pointing to a valid username for attribute " + trackedEntityAttribute.getUid(); + } + } + else if ( ValueType.OPTION_SET == valueType && !trackedEntityAttribute.isValidOptionValue( value ) ) + { + return "Value is not pointing to a valid option for attribute " + trackedEntityAttribute.getUid(); + } + + return null; + } } === modified file 'dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/events/trackedentity/AbstractTrackedEntityInstanceService.java' --- dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/events/trackedentity/AbstractTrackedEntityInstanceService.java 2015-09-30 05:42:06 +0000 +++ dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/events/trackedentity/AbstractTrackedEntityInstanceService.java 2015-09-30 06:14:51 +0000 @@ -31,7 +31,6 @@ import com.google.common.collect.Lists; import org.hisp.dhis.common.CodeGenerator; import org.hisp.dhis.common.IdentifiableObjectManager; -import org.hisp.dhis.common.ValueType; import org.hisp.dhis.commons.collection.CachingMap; import org.hisp.dhis.dbms.DbmsManager; import org.hisp.dhis.dxf2.importsummary.ImportConflict; @@ -43,8 +42,6 @@ import org.hisp.dhis.relationship.RelationshipService; import org.hisp.dhis.relationship.RelationshipType; import org.hisp.dhis.system.callable.IdentifiableObjectSearchCallable; -import org.hisp.dhis.system.util.DateUtils; -import org.hisp.dhis.system.util.MathUtils; import org.hisp.dhis.trackedentity.TrackedEntity; import org.hisp.dhis.trackedentity.TrackedEntityAttribute; import org.hisp.dhis.trackedentity.TrackedEntityAttributeService; @@ -442,37 +439,11 @@ return importConflicts; } - if ( attribute.getValue().length() > 255 ) - { - importConflicts.add( new ImportConflict( "Attribute.value", "Value length is greater than 256 chars for attribute: " + attribute ) ); - } + String message = trackedEntityAttributeService.validateValueType( teAttribute, attribute.getValue() ); - if ( ValueType.NUMBER == teAttribute.getValueType() && !MathUtils.isNumeric( attribute.getValue() ) ) - { - importConflicts.add( new ImportConflict( "Attribute.value", "Value is not numeric for attribute: " + attribute ) ); - } - else if ( ValueType.BOOLEAN == teAttribute.getValueType() && !MathUtils.isBool( attribute.getValue() ) ) - { - importConflicts.add( new ImportConflict( "Attribute.value", "Value is not boolean for attribute: " + attribute ) ); - } - else if ( ValueType.DATE == teAttribute.getValueType() && !DateUtils.dateIsValid( attribute.getValue() ) ) - { - importConflicts.add( new ImportConflict( "Attribute.value", "Value is not date for attribute: " + attribute ) ); - } - else if ( ValueType.TRUE_ONLY == teAttribute.getValueType() && !"true".equals( attribute.getValue() ) ) - { - importConflicts.add( new ImportConflict( "Attribute.value", "Value is not true (true-only value type) for attribute: " + attribute ) ); - } - else if ( ValueType.USERNAME == teAttribute.getValueType() ) - { - if ( userService.getUserCredentialsByUsername( attribute.getValue() ) == null ) - { - importConflicts.add( new ImportConflict( "Attribute.value", "Value is not pointing to a valid username for attribute: " + attribute ) ); - } - } - else if ( ValueType.OPTION_SET == teAttribute.getValueType() && !teAttribute.isValidOptionValue( attribute.getValue() ) ) - { - importConflicts.add( new ImportConflict( "Attribute.value", "Value is not pointing to a valid option for attribute: " + attribute ) ); + if ( message != null ) + { + importConflicts.add( new ImportConflict( "Attribute.value", message ) ); } return importConflicts;