=== modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/chart/Chart.java' --- dhis-2/dhis-api/src/main/java/org/hisp/dhis/chart/Chart.java 2013-05-07 07:43:44 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/chart/Chart.java 2013-05-08 22:56:40 +0000 @@ -27,28 +27,43 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +import static org.hisp.dhis.common.DimensionalObject.DATAELEMENT_DIM_ID; +import static org.hisp.dhis.common.DimensionalObject.DATASET_DIM_ID; +import static org.hisp.dhis.common.DimensionalObject.DATA_X_DIM_ID; +import static org.hisp.dhis.common.DimensionalObject.INDICATOR_DIM_ID; +import static org.hisp.dhis.common.DimensionalObject.ORGUNIT_DIM_ID; +import static org.hisp.dhis.common.DimensionalObject.PERIOD_DIM_ID; + import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; +import org.hisp.dhis.common.BaseDimensionalObject; import org.hisp.dhis.common.BaseIdentifiableObject; import org.hisp.dhis.common.BaseNameableObject; +import org.hisp.dhis.common.DimensionalObject; import org.hisp.dhis.common.DxfNamespaces; import org.hisp.dhis.common.IdentifiableObject; +import org.hisp.dhis.common.ListMap; import org.hisp.dhis.common.NameableObject; import org.hisp.dhis.common.adapter.JacksonPeriodDeserializer; import org.hisp.dhis.common.adapter.JacksonPeriodSerializer; import org.hisp.dhis.common.annotation.Scanned; import org.hisp.dhis.common.view.DetailedView; +import org.hisp.dhis.common.view.DimensionalView; import org.hisp.dhis.common.view.ExportView; import org.hisp.dhis.dataelement.DataElement; +import org.hisp.dhis.dataelement.DataElementCategoryOption; +import org.hisp.dhis.dataelement.DataElementGroup; import org.hisp.dhis.dataset.DataSet; import org.hisp.dhis.i18n.I18nFormat; import org.hisp.dhis.indicator.Indicator; import org.hisp.dhis.organisationunit.OrganisationUnit; -import org.hisp.dhis.organisationunit.OrganisationUnitGroupSet; +import org.hisp.dhis.organisationunit.OrganisationUnitGroup; +import org.hisp.dhis.period.ConfigurablePeriod; import org.hisp.dhis.period.Period; +import org.hisp.dhis.period.RelativePeriodEnum; import org.hisp.dhis.period.RelativePeriods; import org.hisp.dhis.period.comparator.AscendingPeriodEndDateComparator; @@ -84,10 +99,6 @@ public static final String TYPE_AREA = "area"; public static final String TYPE_PIE = "pie"; - public static final String DIMENSION_DATA = "data"; - public static final String DIMENSION_PERIOD = "period"; - public static final String DIMENSION_ORGANISATIONUNIT = "organisationunit"; - private String domainAxisLabel; private String rangeAxisLabel; @@ -131,6 +142,12 @@ private RelativePeriods relatives; + @Scanned + private List dataElementGroups = new ArrayList(); + + @Scanned + private List organisationUnitGroups = new ArrayList(); + private boolean userOrganisationUnit; private boolean userOrganisationUnitChildren; @@ -139,8 +156,6 @@ private boolean rewindRelativePeriods; - private OrganisationUnitGroupSet organisationUnitGroupSet; - // ------------------------------------------------------------------------- // Transient properties // ------------------------------------------------------------------------- @@ -152,6 +167,16 @@ private transient List relativeOrganisationUnits = new ArrayList(); // ------------------------------------------------------------------------- + // Web domain properties + // ------------------------------------------------------------------------- + + private transient List columns = new ArrayList(); + + private transient List rows = new ArrayList(); + + private transient List filters = new ArrayList(); + + // ------------------------------------------------------------------------- // Constructors // ------------------------------------------------------------------------- @@ -184,10 +209,87 @@ return list != null && !list.isEmpty() ? list.iterator().next() : null; } + + public void populateWebDomainProperties() + { + columns.addAll( getDimensionalObjectList( series ) ); + rows.addAll( getDimensionalObjectList( category ) ); + + for ( String filter : filterDimensions ) + { + filters.addAll( getDimensionalObjectList( filter ) ); + } + } + + private List getDimensionalObjectList( String dimension ) + { + List objects = new ArrayList(); + + if ( DATA_X_DIM_ID.equals( dimension ) ) + { + if ( !indicators.isEmpty() ) + { + objects.add( new BaseDimensionalObject( INDICATOR_DIM_ID, indicators ) ); + } + + if ( !dataElements.isEmpty() ) + { + objects.add( new BaseDimensionalObject( DATAELEMENT_DIM_ID, dataElements ) ); + } + + if ( !dataSets.isEmpty() ) + { + objects.add( new BaseDimensionalObject( DATASET_DIM_ID, dataSets ) ); + } + } + else if ( PERIOD_DIM_ID.equals( dimension ) && ( !periods.isEmpty() || hasRelativePeriods() ) ) + { + List periodList = new ArrayList( periods ); + + if ( hasRelativePeriods() ) + { + List list = relatives.getRelativePeriodEnums(); + for ( RelativePeriodEnum period : list ) + { + periodList.add( new ConfigurablePeriod( period.toString(), null, null ) ); + } + } + + objects.add( new BaseDimensionalObject( dimension, periodList ) ); + } + else if ( ORGUNIT_DIM_ID.equals( dimension ) && !organisationUnits.isEmpty() ) + { + objects.add( new BaseDimensionalObject( dimension, organisationUnits ) ); + } + else // Dynamic dimension + { + ListMap listMap = new ListMap(); + + for ( DataElementGroup group : dataElementGroups ) + { + listMap.putValue( group.getGroupSet().getDimension(), group ); + } + + for ( OrganisationUnitGroup group : organisationUnitGroups ) + { + listMap.putValue( group.getGroupSet().getUid(), group ); + } + + //TODO categories + + if ( listMap.containsKey( dimension ) ) + { + objects.add( new BaseDimensionalObject( dimension, listMap.get( dimension ) ) ); + } + } + + return objects; + } + public String generateTitle() { - if ( DIMENSION_PERIOD.equals( filterDimensions.get( 0 ) ) ) + if ( PERIOD_DIM_ID.equals( filterDimensions.get( 0 ) ) ) { return format.formatPeriod( getAllPeriods().get( 0 ) ); } @@ -234,29 +336,22 @@ { List list = new ArrayList(); - if ( DIMENSION_DATA.equals( dimension ) ) + if ( DATA_X_DIM_ID.equals( dimension ) ) { list.addAll( dataElements ); list.addAll( indicators ); list.addAll( dataSets ); } - else if ( DIMENSION_PERIOD.equals( dimension ) ) + else if ( PERIOD_DIM_ID.equals( dimension ) ) { List periods = getAllPeriods(); namePeriods( periods, format ); Collections.sort( periods, PERIOD_COMPARATOR ); list.addAll( periods ); } - else if ( DIMENSION_ORGANISATIONUNIT.equals( dimension ) ) + else if ( ORGUNIT_DIM_ID.equals( dimension ) ) { - if ( isOrganisationUnitGroupBased() ) - { - list.addAll( organisationUnitGroupSet.getOrganisationUnitGroups() ); - } - else - { - list.addAll( getAllOrganisationUnits() ); - } + list.addAll( getAllOrganisationUnits() ); } return list; @@ -271,15 +366,6 @@ } } - /** - * Indicates whether this report table is based on organisation unit groups - * or the organisation unit hierarchy. - */ - public boolean isOrganisationUnitGroupBased() - { - return organisationUnitGroupSet != null && organisationUnitGroupSet.getOrganisationUnitGroups() != null; - } - public void removeAllDataElements() { dataElements.clear(); @@ -371,11 +457,11 @@ } // ------------------------------------------------------------------------- - // Getters and setters + // Getters and setters properties // ------------------------------------------------------------------------- @JsonProperty - @JsonView( {DetailedView.class, ExportView.class} ) + @JsonView( {DetailedView.class, ExportView.class, DimensionalView.class} ) @JacksonXmlProperty( namespace = DxfNamespaces.DXF_2_0) public String getDomainAxisLabel() { @@ -388,7 +474,7 @@ } @JsonProperty - @JsonView( {DetailedView.class, ExportView.class} ) + @JsonView( {DetailedView.class, ExportView.class, DimensionalView.class} ) @JacksonXmlProperty( namespace = DxfNamespaces.DXF_2_0) public String getRangeAxisLabel() { @@ -401,7 +487,7 @@ } @JsonProperty - @JsonView( {DetailedView.class, ExportView.class} ) + @JsonView( {DetailedView.class, ExportView.class, DimensionalView.class} ) @JacksonXmlProperty( namespace = DxfNamespaces.DXF_2_0) public String getType() { @@ -439,6 +525,10 @@ this.category = category; } + @JsonProperty + @JsonView( {DetailedView.class, ExportView.class} ) + @JacksonXmlElementWrapper( localName = "filterDimensions", namespace = DxfNamespaces.DXF_2_0 ) + @JacksonXmlProperty( localName = "filterDimension", namespace = DxfNamespaces.DXF_2_0 ) public List getFilterDimensions() { return filterDimensions; @@ -450,21 +540,7 @@ } @JsonProperty - @JsonView( {DetailedView.class, ExportView.class} ) - @JacksonXmlProperty( namespace = DxfNamespaces.DXF_2_0) - public String getFilter() - { - return filterDimensions.get( 0 ); //TODO - } - - public void setFilter( String filter ) - { - this.filterDimensions.clear(); - this.filterDimensions.add( filter ); //TODO - } - - @JsonProperty - @JsonView( {DetailedView.class, ExportView.class} ) + @JsonView( {DetailedView.class, ExportView.class, DimensionalView.class} ) @JacksonXmlProperty( namespace = DxfNamespaces.DXF_2_0) public boolean isHideLegend() { @@ -477,7 +553,7 @@ } @JsonProperty - @JsonView( {DetailedView.class, ExportView.class} ) + @JsonView( {DetailedView.class, ExportView.class, DimensionalView.class} ) @JacksonXmlProperty( namespace = DxfNamespaces.DXF_2_0) public boolean isRegression() { @@ -490,7 +566,7 @@ } @JsonProperty - @JsonView( {DetailedView.class, ExportView.class} ) + @JsonView( {DetailedView.class, ExportView.class, DimensionalView.class} ) @JacksonXmlProperty( namespace = DxfNamespaces.DXF_2_0) public Double getTargetLineValue() { @@ -503,7 +579,7 @@ } @JsonProperty - @JsonView( {DetailedView.class, ExportView.class} ) + @JsonView( {DetailedView.class, ExportView.class, DimensionalView.class} ) @JacksonXmlProperty( namespace = DxfNamespaces.DXF_2_0) public String getTargetLineLabel() { @@ -516,7 +592,7 @@ } @JsonProperty - @JsonView( {DetailedView.class, ExportView.class} ) + @JsonView( {DetailedView.class, ExportView.class, DimensionalView.class} ) @JacksonXmlProperty( namespace = DxfNamespaces.DXF_2_0) public Double getBaseLineValue() { @@ -529,7 +605,7 @@ } @JsonProperty - @JsonView( {DetailedView.class, ExportView.class} ) + @JsonView( {DetailedView.class, ExportView.class, DimensionalView.class} ) @JacksonXmlProperty( namespace = DxfNamespaces.DXF_2_0) public String getBaseLineLabel() { @@ -542,7 +618,7 @@ } @JsonProperty - @JsonView( {DetailedView.class, ExportView.class} ) + @JsonView( {DetailedView.class, ExportView.class, DimensionalView.class} ) @JacksonXmlProperty( namespace = DxfNamespaces.DXF_2_0) public boolean isHideSubtitle() { @@ -645,6 +721,34 @@ @JsonProperty @JsonView( {DetailedView.class, ExportView.class} ) + @JacksonXmlElementWrapper( localName = "dataElementGroups", namespace = DxfNamespaces.DXF_2_0) + @JacksonXmlProperty( localName = "dataElementGroup", namespace = DxfNamespaces.DXF_2_0) + public List getDataElementGroups() + { + return dataElementGroups; + } + + public void setDataElementGroups( List dataElementGroups ) + { + this.dataElementGroups = dataElementGroups; + } + + @JsonProperty + @JsonView( {DetailedView.class, ExportView.class} ) + @JacksonXmlElementWrapper( localName = "organisationUnitGroups", namespace = DxfNamespaces.DXF_2_0) + @JacksonXmlProperty( localName = "organisationUnitGroup", namespace = DxfNamespaces.DXF_2_0) + public List getOrganisationUnitGroups() + { + return organisationUnitGroups; + } + + public void setOrganisationUnitGroups( List organisationUnitGroups ) + { + this.organisationUnitGroups = organisationUnitGroups; + } + + @JsonProperty + @JsonView( {DetailedView.class, ExportView.class} ) @JacksonXmlProperty( namespace = DxfNamespaces.DXF_2_0) public boolean isUserOrganisationUnit() { @@ -670,7 +774,7 @@ } @JsonProperty - @JsonView( {DetailedView.class, ExportView.class} ) + @JsonView( {DetailedView.class, ExportView.class, DimensionalView.class} ) @JacksonXmlProperty( namespace = DxfNamespaces.DXF_2_0) public boolean isShowData() { @@ -683,7 +787,7 @@ } @JsonProperty - @JsonView( {DetailedView.class, ExportView.class} ) + @JsonView( {DetailedView.class, ExportView.class, DimensionalView.class} ) @JacksonXmlProperty( namespace = DxfNamespaces.DXF_2_0) public boolean isRewindRelativePeriods() { @@ -695,28 +799,17 @@ this.rewindRelativePeriods = rewindRelativePeriods; } - @JsonProperty - @JsonView( {DetailedView.class, ExportView.class} ) - @JacksonXmlProperty( namespace = DxfNamespaces.DXF_2_0) - public OrganisationUnitGroupSet getOrganisationUnitGroupSet() - { - return organisationUnitGroupSet; - } - - public void setOrganisationUnitGroupSet( OrganisationUnitGroupSet organisationUnitGroupSet ) - { - this.organisationUnitGroupSet = organisationUnitGroupSet; - } - - // ------------------------------------------------------------------------- - // Getters and setters for transient fields - // ------------------------------------------------------------------------- - + // ------------------------------------------------------------------------- + // Getters and setters for transient properties + // ------------------------------------------------------------------------- + + @JsonIgnore public I18nFormat getFormat() { return format; } + @JsonIgnore public void setFormat( I18nFormat format ) { this.format = format; @@ -746,6 +839,62 @@ this.relativeOrganisationUnits = relativeOrganisationUnits; } + // ------------------------------------------------------------------------- + // Web domain properties + // ------------------------------------------------------------------------- + + @JsonProperty + @JsonDeserialize( contentAs = BaseDimensionalObject.class ) + @JsonSerialize( contentAs = BaseDimensionalObject.class ) + @JsonView( {DimensionalView.class} ) + @JacksonXmlElementWrapper( localName = "columns", namespace = DxfNamespaces.DXF_2_0) + @JacksonXmlProperty( localName = "column", namespace = DxfNamespaces.DXF_2_0) + public List getColumns() + { + return columns; + } + + public void setColumns( List columns ) + { + this.columns = columns; + } + + @JsonProperty + @JsonDeserialize( contentAs = BaseDimensionalObject.class ) + @JsonSerialize( contentAs = BaseDimensionalObject.class ) + @JsonView( {DimensionalView.class} ) + @JacksonXmlElementWrapper( localName = "rows", namespace = DxfNamespaces.DXF_2_0) + @JacksonXmlProperty( localName = "row", namespace = DxfNamespaces.DXF_2_0) + public List getRows() + { + return rows; + } + + public void setRows( List rows ) + { + this.rows = rows; + } + + @JsonProperty + @JsonDeserialize( contentAs = BaseDimensionalObject.class ) + @JsonSerialize( contentAs = BaseDimensionalObject.class ) + @JsonView( {DimensionalView.class} ) + @JacksonXmlElementWrapper( localName = "filters", namespace = DxfNamespaces.DXF_2_0) + @JacksonXmlProperty( localName = "filter", namespace = DxfNamespaces.DXF_2_0) + public List getFilters() + { + return filters; + } + + public void setFilters( List filters ) + { + this.filters = filters; + } + + // ------------------------------------------------------------------------- + // Merge with + // ------------------------------------------------------------------------- + @Override public void mergeWith( IdentifiableObject other ) { @@ -759,8 +908,7 @@ rangeAxisLabel = chart.getRangeAxisLabel() == null ? rangeAxisLabel : chart.getRangeAxisLabel(); type = chart.getType() == null ? type : chart.getType(); series = chart.getSeries() == null ? series : chart.getSeries(); - category = chart.getCategory() == null ? category : chart.getCategory(); - setFilter( chart.getFilter() == null ? getFilter() : chart.getFilter() ); //TODO + category = chart.getCategory() == null ? category : chart.getCategory(); hideLegend = chart.isHideLegend(); regression = chart.isRegression(); hideSubtitle = chart.isHideSubtitle(); @@ -773,9 +921,11 @@ showData = chart.isShowData(); rewindRelativePeriods = chart.isRewindRelativePeriods(); + filters.clear(); + filters.addAll( chart.getFilters() ); + relatives = chart.getRelatives() == null ? relatives : chart.getRelatives(); user = chart.getUser() == null ? user : chart.getUser(); - organisationUnitGroupSet = chart.getOrganisationUnitGroupSet() == null ? organisationUnitGroupSet : chart.getOrganisationUnitGroupSet(); removeAllIndicators(); indicators.addAll( chart.getIndicators() ); === added file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/common/BaseDimensionalObject.java' --- dhis-2/dhis-api/src/main/java/org/hisp/dhis/common/BaseDimensionalObject.java 1970-01-01 00:00:00 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/common/BaseDimensionalObject.java 2013-05-08 22:56:40 +0000 @@ -0,0 +1,88 @@ +package org.hisp.dhis.common; + +/* + * Copyright (c) 2004-2012, University of Oslo + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * * Neither the name of the HISP project nor the names of its contributors may + * be used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +import java.util.ArrayList; +import java.util.List; + +import org.hisp.dhis.common.view.DimensionalView; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonView; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper; +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement; + +@JacksonXmlRootElement( localName = "dimensionalObject", namespace = DxfNamespaces.DXF_2_0) +public class BaseDimensionalObject + extends BaseIdentifiableObject implements DimensionalObject +{ + private List items = new ArrayList(); + + public BaseDimensionalObject() + { + } + + public BaseDimensionalObject( String dimension, List items ) + { + this.uid = dimension; + this.items = new ArrayList( items ); + } + + @JsonProperty + @JsonView( {DimensionalView.class} ) + @JacksonXmlProperty( namespace = DxfNamespaces.DXF_2_0 ) + public String getDimension() + { + return uid; + } + + public void setDimension( String dimension ) + { + this.uid = dimension; + } + + @Override + @JsonProperty + @JsonSerialize( contentAs = BaseIdentifiableObject.class ) + @JsonDeserialize( contentAs = BaseIdentifiableObject.class ) + @JsonView( { DimensionalView.class } ) + @JacksonXmlElementWrapper( localName = "items", namespace = DxfNamespaces.DXF_2_0 ) + @JacksonXmlProperty( localName = "item", namespace = DxfNamespaces.DXF_2_0 ) + public List getItems() + { + return items; + } + + public void setItems( List items ) + { + this.items = items; + } +} === modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/common/DimensionService.java' --- dhis-2/dhis-api/src/main/java/org/hisp/dhis/common/DimensionService.java 2013-04-23 12:02:26 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/common/DimensionService.java 2013-05-08 10:15:29 +0000 @@ -36,5 +36,7 @@ { DimensionalObject getDimension( String uid ); + DimensionType getDimensionType( String uid ); + List getAllDimensions(); } === renamed file 'dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/DimensionType.java' => 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/common/DimensionType.java' --- dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/DimensionType.java 2013-05-07 08:37:33 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/common/DimensionType.java 2013-05-08 10:15:29 +0000 @@ -1,4 +1,4 @@ -package org.hisp.dhis.analytics; +package org.hisp.dhis.common; /* * Copyright (c) 2004-2012, University of Oslo @@ -35,6 +35,7 @@ INDICATOR, DATAELEMENT, DATASET, + DATAELEMENT_OPERAND, DATA_X, CATEGORY_OPTION_COMBO, PERIOD, === modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/common/DimensionalObject.java' --- dhis-2/dhis-api/src/main/java/org/hisp/dhis/common/DimensionalObject.java 2013-05-07 08:37:33 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/common/DimensionalObject.java 2013-05-08 22:56:40 +0000 @@ -27,53 +27,26 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +import java.util.Arrays; import java.util.List; -import org.hisp.dhis.common.view.DimensionalView; - -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonView; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper; -import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; -import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement; - /** * @author Lars Helge Overland */ -@JacksonXmlRootElement( localName = "dimension", namespace = DxfNamespaces.DXF_2_0) -@JsonSerialize( contentAs = DimensionalObject.class ) -public abstract class DimensionalObject - extends BaseIdentifiableObject +public interface DimensionalObject { - public static final String DATA_X_DIM_ID = "dx"; // in, de, ds - public static final String INDICATOR_DIM_ID = "in"; - public static final String DATAELEMENT_DIM_ID = "de"; - public static final String DATASET_DIM_ID = "ds"; - public static final String CATEGORYOPTIONCOMBO_DIM_ID = "co"; - public static final String PERIOD_DIM_ID = "pe"; - public static final String ORGUNIT_DIM_ID = "ou"; - - @JsonProperty - @JsonView({ DimensionalView.class }) - @JacksonXmlProperty( namespace = DxfNamespaces.DXF_2_0) - public String getDimension() - { - return getUid(); - } - - @JsonProperty - @JsonSerialize( contentAs = BaseIdentifiableObject.class ) - @JsonView({ DimensionalView.class }) - @JacksonXmlElementWrapper( localName = "items", namespace = DxfNamespaces.DXF_2_0 ) - @JacksonXmlProperty( localName = "item", namespace = DxfNamespaces.DXF_2_0 ) - public List getItems() - { - return getDimensionItems(); - } - - /** - * Returns an immutable collection of the dimension items for this dimension. - */ - public abstract List getDimensionItems(); + final String DATA_X_DIM_ID = "dx"; // in, de, ds, do + final String INDICATOR_DIM_ID = "in"; + final String DATAELEMENT_DIM_ID = "de"; + final String DATASET_DIM_ID = "ds"; + final String DATAELEMENT_OPERAND_ID = "do"; + final String CATEGORYOPTIONCOMBO_DIM_ID = "co"; + final String PERIOD_DIM_ID = "pe"; + final String ORGUNIT_DIM_ID = "ou"; + + final List DATA_X_DIMS = Arrays.asList( INDICATOR_DIM_ID, DATAELEMENT_DIM_ID, DATASET_DIM_ID, DATAELEMENT_OPERAND_ID ); + + String getDimension(); + + List getItems(); } === modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/common/IdentifiableObjectUtils.java' --- dhis-2/dhis-api/src/main/java/org/hisp/dhis/common/IdentifiableObjectUtils.java 2013-01-13 13:49:33 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/common/IdentifiableObjectUtils.java 2013-05-08 10:15:29 +0000 @@ -83,7 +83,7 @@ return uids; } - + /** * Filters the given list of IdentifiableObjects based on the given key. * === modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/dataelement/DataElementCategory.java' --- dhis-2/dhis-api/src/main/java/org/hisp/dhis/dataelement/DataElementCategory.java 2013-04-23 12:02:26 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/dataelement/DataElementCategory.java 2013-05-08 22:56:40 +0000 @@ -30,12 +30,13 @@ import java.util.ArrayList; import java.util.List; +import org.hisp.dhis.common.BaseDimensionalObject; import org.hisp.dhis.common.BaseIdentifiableObject; -import org.hisp.dhis.common.DimensionalObject; import org.hisp.dhis.common.DxfNamespaces; import org.hisp.dhis.common.IdentifiableObject; import org.hisp.dhis.common.annotation.Scanned; import org.hisp.dhis.common.view.DetailedView; +import org.hisp.dhis.common.view.DimensionalView; import org.hisp.dhis.common.view.ExportView; import org.hisp.dhis.concept.Concept; @@ -57,7 +58,7 @@ */ @JacksonXmlRootElement( localName = "category", namespace = DxfNamespaces.DXF_2_0) public class DataElementCategory - extends DimensionalObject + extends BaseDimensionalObject { /** * Determines if a de-serialized file is compatible with this class. @@ -142,6 +143,21 @@ { return new ArrayList( categoryOptions ); } + + // ------------------------------------------------------------------------- + // Dimensional object + // ------------------------------------------------------------------------- + + @Override + @JsonProperty + @JsonSerialize( contentAs = BaseIdentifiableObject.class ) + @JsonView( { DetailedView.class, DimensionalView.class } ) + @JacksonXmlElementWrapper( localName = "items", namespace = DxfNamespaces.DXF_2_0 ) + @JacksonXmlProperty( localName = "item", namespace = DxfNamespaces.DXF_2_0 ) + public List getItems() + { + return new ArrayList( categoryOptions ); + } // ------------------------------------------------------------------------- // hashCode, equals and toString === modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/dataelement/DataElementGroupSet.java' --- dhis-2/dhis-api/src/main/java/org/hisp/dhis/dataelement/DataElementGroupSet.java 2013-04-23 12:02:26 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/dataelement/DataElementGroupSet.java 2013-05-08 22:56:40 +0000 @@ -32,13 +32,14 @@ import java.util.Collections; import java.util.List; +import org.hisp.dhis.common.BaseDimensionalObject; import org.hisp.dhis.common.BaseIdentifiableObject; -import org.hisp.dhis.common.DimensionalObject; import org.hisp.dhis.common.DxfNamespaces; import org.hisp.dhis.common.IdentifiableObject; import org.hisp.dhis.common.annotation.Scanned; import org.hisp.dhis.common.comparator.IdentifiableObjectNameComparator; import org.hisp.dhis.common.view.DetailedView; +import org.hisp.dhis.common.view.DimensionalView; import org.hisp.dhis.common.view.ExportView; import com.fasterxml.jackson.annotation.JsonProperty; @@ -57,7 +58,7 @@ */ @JacksonXmlRootElement( localName = "dataElementGroupSet", namespace = DxfNamespaces.DXF_2_0) public class DataElementGroupSet - extends DimensionalObject + extends BaseDimensionalObject { /** * Determines if a de-serialized file is compatible with this class. @@ -177,6 +178,21 @@ { return new ArrayList( members ); } + + // ------------------------------------------------------------------------- + // Dimensional object + // ------------------------------------------------------------------------- + + @Override + @JsonProperty + @JsonSerialize( contentAs = BaseIdentifiableObject.class ) + @JsonView( { DimensionalView.class } ) + @JacksonXmlElementWrapper( localName = "items", namespace = DxfNamespaces.DXF_2_0 ) + @JacksonXmlProperty( localName = "item", namespace = DxfNamespaces.DXF_2_0 ) + public List getItems() + { + return new ArrayList( members ); + } // ------------------------------------------------------------------------- // equals and hashCode === modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/organisationunit/OrganisationUnitGroupSet.java' --- dhis-2/dhis-api/src/main/java/org/hisp/dhis/organisationunit/OrganisationUnitGroupSet.java 2013-04-23 12:02:26 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/organisationunit/OrganisationUnitGroupSet.java 2013-05-08 22:56:40 +0000 @@ -35,13 +35,14 @@ import java.util.List; import java.util.Set; +import org.hisp.dhis.common.BaseDimensionalObject; import org.hisp.dhis.common.BaseIdentifiableObject; -import org.hisp.dhis.common.DimensionalObject; import org.hisp.dhis.common.DxfNamespaces; import org.hisp.dhis.common.IdentifiableObject; import org.hisp.dhis.common.annotation.Scanned; import org.hisp.dhis.common.comparator.IdentifiableObjectNameComparator; import org.hisp.dhis.common.view.DetailedView; +import org.hisp.dhis.common.view.DimensionalView; import org.hisp.dhis.common.view.ExportView; import com.fasterxml.jackson.annotation.JsonProperty; @@ -56,7 +57,7 @@ */ @JacksonXmlRootElement(localName = "organisationUnitGroupSet", namespace = DxfNamespaces.DXF_2_0) public class OrganisationUnitGroupSet - extends DimensionalObject + extends BaseDimensionalObject { /** * Determines if a de-serialized file is compatible with this class. @@ -169,6 +170,21 @@ { return new ArrayList( organisationUnitGroups ); } + + // ------------------------------------------------------------------------- + // Dimensional object + // ------------------------------------------------------------------------- + + @Override + @JsonProperty + @JsonSerialize( contentAs = BaseIdentifiableObject.class ) + @JsonView( { DetailedView.class, DimensionalView.class } ) + @JacksonXmlElementWrapper( localName = "items", namespace = DxfNamespaces.DXF_2_0 ) + @JacksonXmlProperty( localName = "item", namespace = DxfNamespaces.DXF_2_0 ) + public List getItems() + { + return new ArrayList( organisationUnitGroups ); + } // ------------------------------------------------------------------------- // hashCode and equals === added file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/period/ConfigurablePeriod.java' --- dhis-2/dhis-api/src/main/java/org/hisp/dhis/period/ConfigurablePeriod.java 1970-01-01 00:00:00 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/period/ConfigurablePeriod.java 2013-05-07 13:47:18 +0000 @@ -0,0 +1,20 @@ +package org.hisp.dhis.period; + +public class ConfigurablePeriod + extends Period +{ + private String isoDate; + + public ConfigurablePeriod( String isoDate, String name, String code ) + { + this.isoDate = isoDate; + this.name = name; + this.code = code; + } + + @Override + public String getIsoDate() + { + return isoDate; + } +} === modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/period/Period.java' --- dhis-2/dhis-api/src/main/java/org/hisp/dhis/period/Period.java 2013-02-13 03:57:52 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/period/Period.java 2013-05-07 13:47:18 +0000 @@ -101,6 +101,7 @@ this.endDate = endDate; } + @Deprecated public Period( String externalId ) { final String[] id = externalId.split( SEPARATOR ); === modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/period/RelativePeriods.java' --- dhis-2/dhis-api/src/main/java/org/hisp/dhis/period/RelativePeriods.java 2013-03-14 11:51:43 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/period/RelativePeriods.java 2013-05-08 22:56:40 +0000 @@ -772,12 +772,89 @@ map.put( RelativePeriodEnum.THIS_FINANCIAL_YEAR, new RelativePeriods().setThisFinancialYear( true ).getRelativePeriods( format, dynamicNames ) ); map.put( RelativePeriodEnum.LAST_FINANCIAL_YEAR, new RelativePeriods().setLastFinancialYear( true ).getRelativePeriods( format, dynamicNames ) ); map.put( RelativePeriodEnum.LAST_5_FINANCIAL_YEARS, new RelativePeriods().setLast5FinancialYears( true ).getRelativePeriods( format, dynamicNames ) ); + map.put( RelativePeriodEnum.LAST_WEEK, new RelativePeriods().setLast4Weeks( true ).getRelativePeriods( format, dynamicNames ) ); map.put( RelativePeriodEnum.LAST_4_WEEKS, new RelativePeriods().setLast4Weeks( true ).getRelativePeriods( format, dynamicNames ) ); map.put( RelativePeriodEnum.LAST_12_WEEKS, new RelativePeriods().setLast12Weeks( true ).getRelativePeriods( format, dynamicNames ) ); map.put( RelativePeriodEnum.LAST_52_WEEKS, new RelativePeriods().setLast52Weeks( true ).getRelativePeriods( format, dynamicNames ) ); return map.get( relativePeriod ); } + + /** + * Returns a list of RelativePeriodEnums based on the state of this RelativePeriods. + * + * @return a list of RelativePeriodEnums. + */ + public List getRelativePeriodEnums() + { + List list = new ArrayList(); + + add( list, RelativePeriodEnum.LAST_MONTH, reportingMonth ); + add( list, RelativePeriodEnum.LAST_BIMONTH, reportingBimonth ); + add( list, RelativePeriodEnum.LAST_QUARTER, reportingQuarter ); + add( list, RelativePeriodEnum.LAST_SIX_MONTH, lastSixMonth ); + add( list, RelativePeriodEnum.MONTHS_THIS_YEAR, monthsThisYear ); + add( list, RelativePeriodEnum.QUARTERS_THIS_YEAR, quartersThisYear ); + add( list, RelativePeriodEnum.THIS_YEAR, thisYear ); + add( list, RelativePeriodEnum.MONTHS_LAST_YEAR, monthsLastYear ); + add( list, RelativePeriodEnum.QUARTERS_LAST_YEAR, quartersLastYear ); + add( list, RelativePeriodEnum.LAST_YEAR, lastYear ); + add( list, RelativePeriodEnum.LAST_5_YEARS, last5Years ); + add( list, RelativePeriodEnum.LAST_12_MONTHS, last12Months ); + add( list, RelativePeriodEnum.LAST_3_MONTHS, last3Months ); + add( list, RelativePeriodEnum.LAST_6_BIMONTHS, last6BiMonths ); + add( list, RelativePeriodEnum.LAST_4_QUARTERS, last4Quarters ); + add( list, RelativePeriodEnum.LAST_2_SIXMONTHS, last2SixMonths ); + add( list, RelativePeriodEnum.THIS_FINANCIAL_YEAR, thisFinancialYear ); + add( list, RelativePeriodEnum.LAST_FINANCIAL_YEAR, lastFinancialYear ); + add( list, RelativePeriodEnum.LAST_5_FINANCIAL_YEARS, last5FinancialYears ); + add( list, RelativePeriodEnum.LAST_WEEK, lastWeek ); + add( list, RelativePeriodEnum.LAST_4_WEEKS, last4Weeks ); + add( list, RelativePeriodEnum.LAST_12_WEEKS, last12Weeks ); + add( list, RelativePeriodEnum.LAST_52_WEEKS, last52Weeks ); + + return list; + } + + public RelativePeriods setRelativePeriodsFromEnums( List relativePeriods ) + { + if ( relativePeriods != null ) + { + reportingMonth = relativePeriods.contains( RelativePeriodEnum.LAST_MONTH ); + reportingBimonth = relativePeriods.contains( RelativePeriodEnum.LAST_BIMONTH ); + reportingQuarter = relativePeriods.contains( RelativePeriodEnum.LAST_QUARTER ); + lastSixMonth = relativePeriods.contains( RelativePeriodEnum.LAST_SIX_MONTH ); + monthsThisYear = relativePeriods.contains( RelativePeriodEnum.MONTHS_THIS_YEAR ); + quartersThisYear = relativePeriods.contains( RelativePeriodEnum.QUARTERS_THIS_YEAR ); + thisYear = relativePeriods.contains( RelativePeriodEnum.THIS_YEAR ); + monthsLastYear = relativePeriods.contains( RelativePeriodEnum.MONTHS_LAST_YEAR ); + quartersLastYear = relativePeriods.contains( RelativePeriodEnum.QUARTERS_LAST_YEAR ); + lastYear = relativePeriods.contains( RelativePeriodEnum.LAST_YEAR ); + last5Years = relativePeriods.contains( RelativePeriodEnum.LAST_5_YEARS ); + last12Months = relativePeriods.contains( RelativePeriodEnum.LAST_12_MONTHS ); + last3Months = relativePeriods.contains( RelativePeriodEnum.LAST_3_MONTHS ); + last6BiMonths = relativePeriods.contains( RelativePeriodEnum.LAST_6_BIMONTHS ); + last4Quarters = relativePeriods.contains( RelativePeriodEnum.LAST_4_QUARTERS ); + last2SixMonths = relativePeriods.contains( RelativePeriodEnum.LAST_2_SIXMONTHS ); + thisFinancialYear = relativePeriods.contains( RelativePeriodEnum.THIS_FINANCIAL_YEAR ); + lastFinancialYear = relativePeriods.contains( RelativePeriodEnum.LAST_FINANCIAL_YEAR ); + last5FinancialYears = relativePeriods.contains( RelativePeriodEnum.LAST_5_FINANCIAL_YEARS ); + lastWeek = relativePeriods.contains( RelativePeriodEnum.LAST_WEEK ); + last4Weeks = relativePeriods.contains( RelativePeriodEnum.LAST_4_WEEKS ); + last12Weeks = relativePeriods.contains( RelativePeriodEnum.LAST_12_WEEKS ); + last52Weeks = relativePeriods.contains( RelativePeriodEnum.LAST_52_WEEKS ); + } + + return this; + } + + private static void add( List list, T element, boolean add ) + { + if ( add ) + { + list.add( element ); + } + } // ------------------------------------------------------------------------- // Getters & setters === modified file 'dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/DataQueryParams.java' --- dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/DataQueryParams.java 2013-05-07 08:37:33 +0000 +++ dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/DataQueryParams.java 2013-05-08 10:15:29 +0000 @@ -28,9 +28,9 @@ */ import static org.hisp.dhis.analytics.AggregationType.AVERAGE_INT_DISAGGREGATION; -import static org.hisp.dhis.analytics.DimensionType.DATASET; -import static org.hisp.dhis.analytics.DimensionType.ORGANISATIONUNIT; -import static org.hisp.dhis.analytics.DimensionType.ORGANISATIONUNIT_GROUPSET; +import static org.hisp.dhis.common.DimensionType.DATASET; +import static org.hisp.dhis.common.DimensionType.ORGANISATIONUNIT; +import static org.hisp.dhis.common.DimensionType.ORGANISATIONUNIT_GROUPSET; import static org.hisp.dhis.common.DimensionalObject.CATEGORYOPTIONCOMBO_DIM_ID; import static org.hisp.dhis.common.DimensionalObject.DATAELEMENT_DIM_ID; import static org.hisp.dhis.common.DimensionalObject.DATASET_DIM_ID; @@ -54,6 +54,7 @@ import org.apache.commons.lang.StringUtils; import org.hisp.dhis.common.CombinationGenerator; +import org.hisp.dhis.common.DimensionType; import org.hisp.dhis.common.IdentifiableObject; import org.hisp.dhis.common.ListMap; import org.hisp.dhis.dataelement.DataElementCategory; === modified file 'dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/Dimension.java' --- dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/Dimension.java 2013-05-07 08:37:33 +0000 +++ dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/Dimension.java 2013-05-08 10:15:29 +0000 @@ -30,6 +30,7 @@ import java.util.ArrayList; import java.util.List; +import org.hisp.dhis.common.DimensionType; import org.hisp.dhis.common.IdentifiableObject; /** === 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 2013-05-07 08:37:33 +0000 +++ dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/data/DefaultAnalyticsService.java 2013-05-08 10:15:29 +0000 @@ -65,7 +65,7 @@ import org.hisp.dhis.analytics.DataQueryParams; import org.hisp.dhis.analytics.Dimension; import org.hisp.dhis.analytics.DimensionItem; -import org.hisp.dhis.analytics.DimensionType; +import org.hisp.dhis.common.DimensionType; import org.hisp.dhis.analytics.IllegalQueryException; import org.hisp.dhis.analytics.QueryPlanner; import org.hisp.dhis.common.Grid; === modified file 'dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/data/DefaultQueryPlanner.java' --- dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/data/DefaultQueryPlanner.java 2013-05-07 08:37:33 +0000 +++ dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/data/DefaultQueryPlanner.java 2013-05-08 10:15:29 +0000 @@ -47,7 +47,7 @@ import org.hisp.dhis.analytics.AggregationType; import org.hisp.dhis.analytics.DataQueryParams; import org.hisp.dhis.analytics.Dimension; -import org.hisp.dhis.analytics.DimensionType; +import org.hisp.dhis.common.DimensionType; import org.hisp.dhis.analytics.IllegalQueryException; import org.hisp.dhis.analytics.QueryPlanner; import org.hisp.dhis.analytics.table.PartitionUtils; === modified file 'dhis-2/dhis-services/dhis-service-analytics/src/test/java/org/hisp/dhis/analytics/DataQueryParamsTest.java' --- dhis-2/dhis-services/dhis-service-analytics/src/test/java/org/hisp/dhis/analytics/DataQueryParamsTest.java 2013-05-07 08:37:33 +0000 +++ dhis-2/dhis-services/dhis-service-analytics/src/test/java/org/hisp/dhis/analytics/DataQueryParamsTest.java 2013-05-08 10:15:29 +0000 @@ -39,6 +39,7 @@ import java.util.List; import java.util.Map; +import org.hisp.dhis.common.DimensionType; import org.hisp.dhis.common.IdentifiableObject; import org.hisp.dhis.period.Period; import org.junit.Test; === modified file 'dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/common/DefaultDimensionService.java' --- dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/common/DefaultDimensionService.java 2013-04-23 12:02:26 +0000 +++ dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/common/DefaultDimensionService.java 2013-05-08 22:56:40 +0000 @@ -28,13 +28,13 @@ */ import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; import java.util.List; +import java.util.Map; import org.hisp.dhis.dataelement.DataElementCategory; -import org.hisp.dhis.dataelement.DataElementCategoryService; import org.hisp.dhis.dataelement.DataElementGroupSet; -import org.hisp.dhis.dataelement.DataElementService; -import org.hisp.dhis.organisationunit.OrganisationUnitGroupService; import org.hisp.dhis.organisationunit.OrganisationUnitGroupSet; import org.springframework.beans.factory.annotation.Autowired; @@ -45,32 +45,26 @@ implements DimensionService { @Autowired - private DataElementService dataElementService; - - @Autowired - private OrganisationUnitGroupService organisationUnitGroupService; - - @Autowired - private DataElementCategoryService categoryService; + private IdentifiableObjectManager identifiableObjectManager; @Override public DimensionalObject getDimension( String uid ) - { - DataElementGroupSet degs = dataElementService.getDataElementGroupSet( uid ); + { + DataElementGroupSet degs = identifiableObjectManager.get( DataElementGroupSet.class, uid ); if ( degs != null ) { return degs; } - OrganisationUnitGroupSet ougs = organisationUnitGroupService.getOrganisationUnitGroupSet( uid ); + OrganisationUnitGroupSet ougs = identifiableObjectManager.get( OrganisationUnitGroupSet.class, uid ); if ( ougs != null ) { return ougs; } - DataElementCategory cat = categoryService.getDataElementCategory( uid ); + DataElementCategory cat = identifiableObjectManager.get( DataElementCategory.class, uid ); if ( cat != null ) { @@ -79,15 +73,55 @@ return null; } + + public DimensionType getDimensionType( String uid ) + { + DataElementGroupSet degs = identifiableObjectManager.get( DataElementGroupSet.class, uid ); + + if ( degs != null ) + { + return DimensionType.DATAELEMENT_GROUPSET; + } + + OrganisationUnitGroupSet ougs = identifiableObjectManager.get( OrganisationUnitGroupSet.class, uid ); + + if ( ougs != null ) + { + return DimensionType.ORGANISATIONUNIT_GROUPSET; + } + + DataElementCategory cat = identifiableObjectManager.get( DataElementCategory.class, uid ); + + if ( cat != null ) + { + return DimensionType.CATEGORY; + } + final Map dimObjectTypeMap = new HashMap(); + + dimObjectTypeMap.put( DimensionalObject.DATA_X_DIM_ID, DimensionType.DATA_X ); + dimObjectTypeMap.put( DimensionalObject.INDICATOR_DIM_ID, DimensionType.INDICATOR ); + dimObjectTypeMap.put( DimensionalObject.DATAELEMENT_DIM_ID, DimensionType.DATAELEMENT ); + dimObjectTypeMap.put( DimensionalObject.DATASET_DIM_ID, DimensionType.DATASET ); + dimObjectTypeMap.put( DimensionalObject.DATAELEMENT_OPERAND_ID, DimensionType.DATAELEMENT_OPERAND ); + dimObjectTypeMap.put( DimensionalObject.PERIOD_DIM_ID, DimensionType.PERIOD ); + dimObjectTypeMap.put( DimensionalObject.ORGUNIT_DIM_ID, DimensionType.ORGANISATIONUNIT ); + + return dimObjectTypeMap.get( uid ); + } + @Override public List getAllDimensions() { - List dimensions = new ArrayList(); + Collection degs = identifiableObjectManager.getAll( DataElementGroupSet.class ); + Collection ougs = identifiableObjectManager.getAll( OrganisationUnitGroupSet.class ); + Collection dcs = identifiableObjectManager.getAll( DataElementCategory.class ); + + final List dimensions = new ArrayList(); - dimensions.addAll( dataElementService.getAllDataElementGroupSets() ); - dimensions.addAll( organisationUnitGroupService.getAllOrganisationUnitGroupSets() ); - dimensions.addAll( categoryService.getDataDimensionDataElementCategories() ); + dimensions.addAll( degs ); + dimensions.addAll( ougs ); + dimensions.addAll( dcs ); return dimensions; } === modified file 'dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/common/DefaultIdentifiableObjectManager.java' --- dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/common/DefaultIdentifiableObjectManager.java 2013-03-22 09:48:50 +0000 +++ dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/common/DefaultIdentifiableObjectManager.java 2013-05-08 10:15:29 +0000 @@ -180,7 +180,7 @@ return object; } - + @Override @SuppressWarnings("unchecked") public Collection getAll( Class clazz ) === modified file 'dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/period/DefaultPeriodService.java' --- dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/period/DefaultPeriodService.java 2013-01-25 16:38:21 +0000 +++ dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/period/DefaultPeriodService.java 2013-05-08 10:15:29 +0000 @@ -135,7 +135,7 @@ return periods; } - + public Collection getPeriodsByPeriodType( PeriodType periodType ) { return periodStore.getPeriodsByPeriodType( periodType ); === modified file 'dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/startup/TableAlteror.java' --- dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/startup/TableAlteror.java 2013-05-05 18:08:08 +0000 +++ dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/startup/TableAlteror.java 2013-05-08 10:15:29 +0000 @@ -333,6 +333,7 @@ executeSql( "ALTER TABLE chart DROP COLUMN last12individualmonths" ); executeSql( "ALTER TABLE chart DROP COLUMN individualmonthsthisyear" ); executeSql( "ALTER TABLE chart DROP COLUMN individualquartersthisyear" ); + executeSql( "ALTER TABLE chart DROP COLUMN organisationunitgroupsetid" ); // remove source @@ -458,9 +459,19 @@ executeSql( "update chart set userorganisationunitchildren = false where userorganisationunitchildren is null" ); executeSql( "update chart set userorganisationunit = false where userorganisationunit is null" ); + executeSql( "update chart set series = 'dx' where series = 'data'" ); + executeSql( "update chart set series = 'pe' where series = 'period'" ); + executeSql( "update chart set series = 'ou' where series = 'organisationunit'" ); + executeSql( "update chart set category = 'dx' where category = 'data'" ); + executeSql( "update chart set category = 'pe' where category = 'period'" ); + executeSql( "update chart set category = 'ou' where category = 'organisationunit'" ); + executeSql( "update chart_filters set filter = 'dx' where filter = 'data'" ); + executeSql( "update chart_filters set filter = 'pe' where filter = 'period'" ); + executeSql( "update chart_filters set filter = 'ou' where filter = 'organisationunit'" ); + executeSql( "insert into chart_filters (chartid, sort_order, filter) select chartid, 0, filter from chart" ); executeSql( "alter table chart drop column filter" ); - + executeSql( "update users set selfregistered = false where selfregistered is null" ); executeSql( "update users set disabled = false where disabled is null" ); executeSql( "update dataentryform set format = 1 where format is null" ); === modified file 'dhis-2/dhis-services/dhis-service-reporting/src/main/java/org/hisp/dhis/chart/impl/DefaultChartService.java' --- dhis-2/dhis-services/dhis-service-reporting/src/main/java/org/hisp/dhis/chart/impl/DefaultChartService.java 2013-05-02 12:31:26 +0000 +++ dhis-2/dhis-services/dhis-service-reporting/src/main/java/org/hisp/dhis/chart/impl/DefaultChartService.java 2013-05-08 22:56:40 +0000 @@ -35,6 +35,7 @@ import org.hisp.dhis.chart.Chart; import org.hisp.dhis.chart.ChartService; import org.hisp.dhis.chart.ChartStore; +import org.hisp.dhis.common.DimensionalObject; import org.hisp.dhis.common.NameableObject; import org.hisp.dhis.dataelement.DataElement; import org.hisp.dhis.dataelement.DataElementCategoryOptionCombo; @@ -229,7 +230,7 @@ } chart.setType( TYPE_LINE ); - chart.setDimensions( Chart.DIMENSION_DATA, Chart.DIMENSION_PERIOD, Chart.DIMENSION_ORGANISATIONUNIT ); + chart.setDimensions( DimensionalObject.DATA_X_DIM_ID, DimensionalObject.PERIOD_DIM_ID, DimensionalObject.ORGUNIT_DIM_ID ); chart.setHideLegend( true ); chart.getIndicators().add( indicator ); chart.setRelativePeriods( periods ); @@ -253,7 +254,7 @@ } chart.setType( TYPE_COLUMN ); - chart.setDimensions( Chart.DIMENSION_DATA, Chart.DIMENSION_ORGANISATIONUNIT, Chart.DIMENSION_PERIOD ); + chart.setDimensions( DimensionalObject.DATA_X_DIM_ID, DimensionalObject.ORGUNIT_DIM_ID, DimensionalObject.PERIOD_DIM_ID ); chart.setHideLegend( true ); chart.getIndicators().add( indicator ); chart.setRelativePeriods( periods ); === modified file 'dhis-2/dhis-services/dhis-service-reporting/src/main/java/org/hisp/dhis/datasetreport/jdbc/AnalyticsDataSetReportStore.java' --- dhis-2/dhis-services/dhis-service-reporting/src/main/java/org/hisp/dhis/datasetreport/jdbc/AnalyticsDataSetReportStore.java 2013-05-03 15:06:31 +0000 +++ dhis-2/dhis-services/dhis-service-reporting/src/main/java/org/hisp/dhis/datasetreport/jdbc/AnalyticsDataSetReportStore.java 2013-05-08 10:15:29 +0000 @@ -38,7 +38,7 @@ import org.hisp.dhis.analytics.AnalyticsService; import org.hisp.dhis.analytics.DataQueryParams; -import org.hisp.dhis.analytics.DimensionType; +import org.hisp.dhis.common.DimensionType; import org.hisp.dhis.dataelement.DataElement; import org.hisp.dhis.dataelement.DataElementCategory; import org.hisp.dhis.dataset.DataSet; === modified file 'dhis-2/dhis-services/dhis-service-reporting/src/main/java/org/hisp/dhis/reporttable/jdbc/JDBCReportTableManager.java' --- dhis-2/dhis-services/dhis-service-reporting/src/main/java/org/hisp/dhis/reporttable/jdbc/JDBCReportTableManager.java 2012-08-31 14:38:21 +0000 +++ dhis-2/dhis-services/dhis-service-reporting/src/main/java/org/hisp/dhis/reporttable/jdbc/JDBCReportTableManager.java 2013-05-08 10:15:29 +0000 @@ -90,16 +90,8 @@ public Map getAggregatedValueMap( Chart chart ) { - if ( chart.isOrganisationUnitGroupBased() ) - { - return getAggregatedValueMapOrgUnitGroups( chart.getDataElements(), chart.getIndicators(), - chart.getAllPeriods(), chart.getOrganisationUnitGroupSet().getOrganisationUnitGroups(), chart.getFirstOrganisationUnit(), null, false, false ); - } - else - { - return getAggregatedValueMapOrgUnitHierarchy( chart.getDataElements(), chart.getIndicators(), chart.getDataSets(), - chart.getAllPeriods(), chart.getAllOrganisationUnits(), null, false, false ); - } + return getAggregatedValueMapOrgUnitHierarchy( chart.getDataElements(), chart.getIndicators(), chart.getDataSets(), + chart.getAllPeriods(), chart.getAllOrganisationUnits(), null, false, false ); } // ------------------------------------------------------------------------- === modified file 'dhis-2/dhis-services/dhis-service-reporting/src/main/resources/org/hisp/dhis/chart/hibernate/Chart.hbm.xml' --- dhis-2/dhis-services/dhis-service-reporting/src/main/resources/org/hisp/dhis/chart/hibernate/Chart.hbm.xml 2013-05-07 07:43:44 +0000 +++ dhis-2/dhis-services/dhis-service-reporting/src/main/resources/org/hisp/dhis/chart/hibernate/Chart.hbm.xml 2013-05-08 22:56:40 +0000 @@ -85,9 +85,6 @@ foreign-key="fk_chart_organisationunits_organisationunitid" /> - - @@ -99,6 +96,22 @@ + + + + + + + + + + + + + + === modified file 'dhis-2/dhis-support/dhis-support-test/src/main/java/org/hisp/dhis/DhisConvenienceTest.java' --- dhis-2/dhis-support/dhis-support-test/src/main/java/org/hisp/dhis/DhisConvenienceTest.java 2013-04-04 18:06:19 +0000 +++ dhis-2/dhis-support/dhis-support-test/src/main/java/org/hisp/dhis/DhisConvenienceTest.java 2013-05-08 22:56:40 +0000 @@ -39,6 +39,7 @@ import org.hisp.dhis.aggregation.AggregatedDataValueService; import org.hisp.dhis.aggregation.AggregatedOrgUnitDataValueService; import org.hisp.dhis.chart.Chart; +import org.hisp.dhis.common.DimensionalObject; import org.hisp.dhis.concept.Concept; import org.hisp.dhis.constant.Constant; import org.hisp.dhis.constant.ConstantService; @@ -851,7 +852,7 @@ chart.setIndicators( indicators ); chart.setPeriods( periods ); chart.setOrganisationUnits( units ); - chart.setDimensions( Chart.DIMENSION_DATA, Chart.DIMENSION_PERIOD, Chart.DIMENSION_ORGANISATIONUNIT ); + chart.setDimensions( DimensionalObject.DATA_X_DIM_ID, DimensionalObject.PERIOD_DIM_ID, DimensionalObject.ORGUNIT_DIM_ID ); return chart; } === modified file 'dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/api/controller/ChartController.java' --- dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/api/controller/ChartController.java 2013-04-24 14:11:57 +0000 +++ dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/api/controller/ChartController.java 2013-05-08 22:56:40 +0000 @@ -27,11 +27,26 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +import static org.hisp.dhis.common.DimensionType.DATAELEMENT; +import static org.hisp.dhis.common.DimensionType.DATAELEMENT_GROUPSET; +import static org.hisp.dhis.common.DimensionType.DATASET; +import static org.hisp.dhis.common.DimensionType.INDICATOR; +import static org.hisp.dhis.common.DimensionType.ORGANISATIONUNIT; +import static org.hisp.dhis.common.DimensionType.ORGANISATIONUNIT_GROUPSET; +import static org.hisp.dhis.common.DimensionType.PERIOD; import static org.hisp.dhis.common.IdentifiableObjectUtils.getUids; +import static org.hisp.dhis.organisationunit.OrganisationUnit.KEY_USER_ORGUNIT; +import static org.hisp.dhis.organisationunit.OrganisationUnit.KEY_USER_ORGUNIT_CHILDREN; +import static org.hisp.dhis.common.DimensionalObject.DATA_X_DIMS; +import static org.hisp.dhis.common.DimensionalObject.DATA_X_DIM_ID; import java.io.IOException; import java.io.InputStream; +import java.util.ArrayList; import java.util.Date; +import java.util.HashSet; +import java.util.List; +import java.util.Set; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -40,6 +55,9 @@ import org.hisp.dhis.api.utils.ContextUtils.CacheStrategy; import org.hisp.dhis.chart.Chart; import org.hisp.dhis.chart.ChartService; +import org.hisp.dhis.common.DimensionService; +import org.hisp.dhis.common.DimensionType; +import org.hisp.dhis.common.DimensionalObject; import org.hisp.dhis.dataelement.DataElementService; import org.hisp.dhis.dataset.DataSetService; import org.hisp.dhis.dxf2.utils.JacksonUtils; @@ -53,6 +71,9 @@ import org.hisp.dhis.organisationunit.OrganisationUnitService; import org.hisp.dhis.period.Period; import org.hisp.dhis.period.PeriodService; +import org.hisp.dhis.period.PeriodType; +import org.hisp.dhis.period.RelativePeriodEnum; +import org.hisp.dhis.period.RelativePeriods; import org.hisp.dhis.system.util.CodecUtils; import org.hisp.dhis.user.UserService; import org.jfree.chart.ChartUtilities; @@ -103,6 +124,9 @@ private OrganisationUnitGroupService organisationUnitGroupService; @Autowired + private DimensionService dimensionService; + + @Autowired private I18nManager i18nManager; @Autowired @@ -219,6 +243,8 @@ @Override public void postProcessEntity( Chart chart ) throws Exception { + chart.populateWebDomainProperties(); + I18nFormat format = i18nManager.getI18nFormat(); if ( chart.getPeriods() != null && !chart.getPeriods().isEmpty() ) @@ -236,20 +262,126 @@ private void mergeChart( Chart chart ) { - chart.setDataElements( dataElementService.getDataElementsByUid( getUids( chart.getDataElements() ) ) ); - chart.setIndicators( indicatorService.getIndicatorsByUid( getUids( chart.getIndicators() ) ) ); - chart.setDataSets( dataSetService.getDataSetsByUid( getUids( chart.getDataSets() ) ) ); - chart.setOrganisationUnits( organisationUnitService.getOrganisationUnitsByUid( getUids( chart.getOrganisationUnits() ) ) ); - chart.setPeriods( periodService.reloadPeriods( chart.getPeriods() ) ); - - if ( chart.getOrganisationUnitGroupSet() != null ) - { - chart.setOrganisationUnitGroupSet( organisationUnitGroupService.getOrganisationUnitGroupSet( chart.getOrganisationUnitGroupSet().getUid() ) ); - } + chart.getIndicators().clear(); + chart.getDataElements().clear(); + chart.getDataSets().clear(); + chart.getPeriods().clear(); + chart.setRelatives( null ); + chart.getOrganisationUnits().clear(); + chart.getDataElementGroups().clear(); + chart.getOrganisationUnitGroups().clear(); + chart.getFilterDimensions().clear(); if ( chart.getUser() != null ) { chart.setUser( userService.getUser( chart.getUser().getUid() ) ); } + + mergeDimensionalObjects( chart, chart.getColumns() ); + mergeDimensionalObjects( chart, chart.getRows() ); + mergeDimensionalObjects( chart, chart.getFilters() ); + + chart.setSeries( toDimension( chart.getColumns().get( 0 ).getDimension() ) ); + chart.setCategory( toDimension( chart.getRows().get( 0 ).getDimension() ) ); + + for ( DimensionalObject dimension : chart.getFilters() ) + { + chart.getFilterDimensions().add( toDimension( dimension.getDimension() ) ); + } + } + + private void mergeDimensionalObjects( Chart chart, List dimensions ) + { + for ( DimensionalObject dimension : dimensions ) + { + DimensionType type = dimensionService.getDimensionType( dimension.getDimension() ); + + List uids = getUids( dimension.getItems() ); + + if ( INDICATOR.equals( type ) ) + { + chart.getIndicators().addAll( indicatorService.getIndicatorsByUid( uids ) ); + } + else if ( DATAELEMENT.equals( type ) ) + { + chart.getDataElements().addAll( dataElementService.getDataElementsByUid( uids ) ); + } + else if ( DATASET.equals( type ) ) + { + chart.getDataSets().addAll( dataSetService.getDataSetsByUid( uids ) ); + } + else if ( PERIOD.equals( type ) ) + { + List enums = new ArrayList(); + Set periods = new HashSet(); + + for ( String isoPeriod : uids ) + { + if ( RelativePeriodEnum.contains( isoPeriod ) ) + { + enums.add( RelativePeriodEnum.valueOf( isoPeriod ) ); + } + else + { + Period period = PeriodType.getPeriodFromIsoString( isoPeriod ); + + if ( period != null ) + { + periods.add( period ); + } + } + } + + chart.setRelatives( new RelativePeriods().setRelativePeriodsFromEnums( enums ) ); + chart.setPeriods( periodService.reloadPeriods( new ArrayList( periods ) ) ); + } + else if ( ORGANISATIONUNIT.equals( type ) ) + { + List ous = new ArrayList(); + + for ( String ou : uids ) + { + if ( KEY_USER_ORGUNIT.equals( ou ) ) + { + chart.setUserOrganisationUnit( true ); + } + else if ( KEY_USER_ORGUNIT_CHILDREN.equals( ou ) ) + { + chart.setUserOrganisationUnitChildren( true ); + } + else + { + OrganisationUnit unit = organisationUnitService.getOrganisationUnit( ou ); + + if ( unit != null ) + { + ous.add( unit ); + } + } + } + + chart.setOrganisationUnits( ous ); + } + else if ( DATAELEMENT_GROUPSET.equals( type ) ) + { + chart.getDataElementGroups().addAll( dataElementService.getDataElementGroupsByUid( uids ) ); + } + else if ( ORGANISATIONUNIT_GROUPSET.equals( type ) ) + { + chart.getOrganisationUnitGroups().addAll( organisationUnitGroupService.getOrganisationUnitGroupsByUid( uids ) ); + } + + //TODO categories and operands + } + } + + private static String toDimension( String object ) + { + if ( DATA_X_DIMS.contains( object ) ) + { + return DATA_X_DIM_ID; + } + + return object; } }