=== modified file 'dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/data/DefaultAnalyticsService.java' --- dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/data/DefaultAnalyticsService.java 2015-12-17 14:29:34 +0000 +++ dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/data/DefaultAnalyticsService.java 2015-12-21 14:19:03 +0000 @@ -54,7 +54,6 @@ import java.util.HashMap; import java.util.HashSet; import java.util.List; -import java.util.Locale; import java.util.Map; import java.util.Set; import java.util.concurrent.Future; @@ -922,10 +921,10 @@ for ( DimensionalObject dimension : dimensions ) { - i18nItems( dimension ); - List items = new ArrayList<>( dimension.getItems() ); + i18nService.internationalise( items ); + for ( DimensionalItemObject object : items ) { if ( DimensionType.PERIOD.equals( dimension.getDimensionType() ) && !calendar.isIso8601() ) @@ -991,29 +990,6 @@ return metaData; } - - /** - * Translate the items of the given dimensional object. - * - * @param dimension the dimensional object. - * @param items the dimensional items. - */ - private void i18nItems( DimensionalObject dimension ) - { - Locale locale = i18nService.getCurrentLocale(); - - if ( DimensionalObject.DATA_X_DIM_ID.equals( dimension.getDimension() ) ) - { - for ( DimensionalItemObject item : dimension.getItems() ) - { - i18nService.internationalise( item, locale ); - } - } - else - { - i18nService.internationalise( dimension.getItems(), locale ); - } - } /** * Gets the number of available cores. Uses explicit number from system === modified file 'dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/i18n/DefaultI18nService.java' --- dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/i18n/DefaultI18nService.java 2015-10-21 09:23:15 +0000 +++ dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/i18n/DefaultI18nService.java 2015-12-21 14:19:03 +0000 @@ -35,6 +35,8 @@ import org.hisp.dhis.translation.TranslationService; import org.hisp.dhis.user.UserSettingService; +import com.google.common.collect.Multimaps; + import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; @@ -88,11 +90,12 @@ } @Override + @SuppressWarnings("unchecked") public void internationalise( Object object, Locale locale ) { if ( isCollection( object ) ) { - internationaliseCollection( (Collection) object, locale ); + internationaliseCollection( (Collection) object, locale ); } else { @@ -125,30 +128,35 @@ } } - private void internationaliseCollection( Collection objects, Locale locale ) + private void internationaliseCollection( Collection objects, Locale locale ) { if ( locale == null || objects == null || objects.size() == 0 ) { return; } - Object peek = objects.iterator().next(); - - List properties = getObjectPropertyNames( peek ); - - Collection translations = translationService.getTranslations( getClassName( peek ), locale ); - - for ( Object object : objects ) + Map> classNameObjectMap = Multimaps.asMap( Multimaps.index( objects, o -> getClassName( o ) ) ); + + for ( String className : classNameObjectMap.keySet() ) { - Map translationMap = getTranslationsForObject( translations, getProperty( object, "uid" ) ); - - for ( String property : properties ) + List list = classNameObjectMap.get( className ); + + List properties = getObjectPropertyNames( list.iterator().next() ); + + Collection translations = translationService.getTranslations( className, locale ); + + for ( Object object : list ) { - String value = translationMap.get( property ); - - if ( value != null && !value.isEmpty() ) + Map translationMap = getTranslationsForObject( translations, getProperty( object, "uid" ) ); + + for ( String property : properties ) { - setProperty( object, "display", property, value ); + String value = translationMap.get( property ); + + if ( value != null && !value.isEmpty() ) + { + setProperty( object, "display", property, value ); + } } } } === modified file 'dhis-2/dhis-services/dhis-service-core/src/test/java/org/hisp/dhis/i18n/I18nServiceTest.java' --- dhis-2/dhis-services/dhis-service-core/src/test/java/org/hisp/dhis/i18n/I18nServiceTest.java 2015-09-13 17:45:53 +0000 +++ dhis-2/dhis-services/dhis-service-core/src/test/java/org/hisp/dhis/i18n/I18nServiceTest.java 2015-12-21 14:19:03 +0000 @@ -33,6 +33,7 @@ import static org.junit.Assert.assertTrue; import java.util.ArrayList; +import java.util.Arrays; import java.util.HashMap; import java.util.Iterator; import java.util.List; @@ -40,8 +41,16 @@ import java.util.Map; import org.hisp.dhis.DhisSpringTest; +import org.hisp.dhis.common.IdentifiableObject; import org.hisp.dhis.dataelement.DataElement; import org.hisp.dhis.dataelement.DataElementService; +import org.hisp.dhis.dataset.DataSet; +import org.hisp.dhis.dataset.DataSetService; +import org.hisp.dhis.indicator.Indicator; +import org.hisp.dhis.indicator.IndicatorService; +import org.hisp.dhis.indicator.IndicatorType; +import org.hisp.dhis.period.MonthlyPeriodType; +import org.hisp.dhis.period.PeriodType; import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -56,7 +65,24 @@ @Autowired private DataElementService dataElementService; + + @Autowired + private IndicatorService indicatorService; + + @Autowired + private DataSetService dataSetService; + + private IndicatorType itA; + + private PeriodType ptA = new MonthlyPeriodType(); + @Override + public void setUpTest() + { + itA = createIndicatorType( 'A' ); + indicatorService.addIndicatorType( itA ); + } + // ------------------------------------------------------------------------- // Tests // ------------------------------------------------------------------------- @@ -147,8 +173,8 @@ translationsC.put( "shortName", "frenchShortNameC" ); translationsC.put( "description", "frenchDescriptionC" ); - i18nService.updateTranslation( className, locale, translationsA,dataElementA.getUid() ); - i18nService.updateTranslation( className, locale, translationsB,dataElementB.getUid() ); + i18nService.updateTranslation( className, locale, translationsA, dataElementA.getUid() ); + i18nService.updateTranslation( className, locale, translationsB, dataElementB.getUid() ); i18nService.updateTranslation( className, locale, translationsC, dataElementC.getUid()); i18nService.internationalise( elements, locale ); @@ -159,6 +185,74 @@ assertEquals( "frenchNameB", elementIter.next().getDisplayName() ); assertEquals( "frenchNameC", elementIter.next().getDisplayName() ); } + + @Test + public void testInternationaliseCollectionMultiObjectTypes() + { + Locale locale = Locale.FRANCE; + + DataElement dataElementA = createDataElement( 'A' ); + dataElementService.addDataElement( dataElementA ); + + DataElement dataElementB = createDataElement( 'B' ); + dataElementService.addDataElement( dataElementB ); + + Indicator indicatorA = createIndicator( 'A', itA ); + indicatorService.addIndicator( indicatorA ); + + Indicator indicatorB = createIndicator( 'B', itA ); + indicatorService.addIndicator( indicatorB ); + + DataSet dataSetA = createDataSet( 'A', ptA ); + dataSetService.addDataSet( dataSetA ); + + DataSet dataSetB = createDataSet( 'B', ptA ); + dataSetService.addDataSet( dataSetB ); + + List elements = Arrays.asList( dataElementA, dataElementB, indicatorA, indicatorB, dataSetA, dataSetB ); + + Map translationsA = new HashMap<>(); + translationsA.put( "name", "frenchNameDeA" ); + translationsA.put( "shortName", "frenchShortNameDeA" ); + + Map translationsB = new HashMap<>(); + translationsB.put( "name", "frenchNameDeB" ); + translationsB.put( "shortName", "frenchShortNameDeB" ); + + Map translationsC = new HashMap<>(); + translationsC.put( "name", "frenchNameInA" ); + translationsC.put( "shortName", "frenchShortNameInA" ); + + Map translationsD = new HashMap<>(); + translationsD.put( "name", "frenchNameInB" ); + translationsD.put( "shortName", "frenchShortNameInB" ); + + Map translationsE = new HashMap<>(); + translationsE.put( "name", "frenchNameDsA" ); + translationsE.put( "shortName", "frenchShortNameDsA" ); + + Map translationsF = new HashMap<>(); + translationsF.put( "name", "frenchNameDsB" ); + translationsF.put( "shortName", "frenchShortNameDsB" ); + + i18nService.updateTranslation( DataElement.class.getSimpleName(), locale, translationsA, dataElementA.getUid() ); + i18nService.updateTranslation( DataElement.class.getSimpleName(), locale, translationsB, dataElementB.getUid() ); + i18nService.updateTranslation( Indicator.class.getSimpleName(), locale, translationsC, indicatorA.getUid() ); + i18nService.updateTranslation( Indicator.class.getSimpleName(), locale, translationsD, indicatorB.getUid() ); + i18nService.updateTranslation( DataSet.class.getSimpleName(), locale, translationsE, dataSetA.getUid() ); + i18nService.updateTranslation( DataSet.class.getSimpleName(), locale, translationsF, dataSetB.getUid() ); + + i18nService.internationalise( elements, locale ); + + Iterator iter = elements.iterator(); + + assertEquals( "frenchNameDeA", iter.next().getDisplayName() ); + assertEquals( "frenchNameDeB", iter.next().getDisplayName() ); + assertEquals( "frenchNameInA", iter.next().getDisplayName() ); + assertEquals( "frenchNameInB", iter.next().getDisplayName() ); + assertEquals( "frenchNameDsA", iter.next().getDisplayName() ); + assertEquals( "frenchNameDsB", iter.next().getDisplayName() ); + } @Test public void testGetObjectPropertyValues()