=== 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 2012-04-17 14:23:08 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/chart/Chart.java 2012-04-18 20:24:12 +0000 @@ -38,6 +38,7 @@ import org.hisp.dhis.common.Dxf2Namespace; import org.hisp.dhis.common.IdentifiableObject; import org.hisp.dhis.common.NameableObject; +import org.hisp.dhis.common.annotation.Scanned; import org.hisp.dhis.common.view.DetailedView; import org.hisp.dhis.common.view.ExportView; import org.hisp.dhis.dataelement.DataElement; @@ -112,18 +113,22 @@ private String baseLineLabel; + @Scanned private List indicators = new ArrayList(); + @Scanned private List dataElements = new ArrayList(); + @Scanned private List dataSets = new ArrayList(); + @Scanned private List organisationUnits = new ArrayList(); private RelativePeriods relatives; private boolean userOrganisationUnit; - + private boolean userOrganisationUnitChildren; private User user; @@ -690,9 +695,16 @@ user = chart.getUser() == null ? user : chart.getUser(); organisationUnitGroupSet = chart.getOrganisationUnitGroupSet() == null ? organisationUnitGroupSet : chart.getOrganisationUnitGroupSet(); + indicators.clear(); indicators.addAll( chart.getIndicators() ); + + dataElements.clear(); dataElements.addAll( chart.getDataElements() ); + + dataSets.clear(); dataSets.addAll( chart.getDataSets() ); + + organisationUnits.clear(); organisationUnits.addAll( chart.getOrganisationUnits() ); } } === added file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/common/adapter/JacksonPeriodDeserializer.java' --- dhis-2/dhis-api/src/main/java/org/hisp/dhis/common/adapter/JacksonPeriodDeserializer.java 1970-01-01 00:00:00 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/common/adapter/JacksonPeriodDeserializer.java 2012-04-18 20:24:12 +0000 @@ -0,0 +1,52 @@ +package org.hisp.dhis.common.adapter; + +/* + * 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 com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.JsonDeserializer; +import org.hisp.dhis.period.Period; +import org.hisp.dhis.period.PeriodType; + +import java.io.IOException; + +/** + * @author Morten Olav Hansen + */ +public class JacksonPeriodDeserializer + extends JsonDeserializer +{ + @Override + public Period deserialize( JsonParser jp, DeserializationContext ctxt ) throws IOException, JsonProcessingException + { + String periodString = jp.readValueAs( String.class ); + + return PeriodType.getPeriodFromIsoString( periodString ); + } +} === added file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/common/adapter/JacksonPeriodSerializer.java' --- dhis-2/dhis-api/src/main/java/org/hisp/dhis/common/adapter/JacksonPeriodSerializer.java 1970-01-01 00:00:00 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/common/adapter/JacksonPeriodSerializer.java 2012-04-18 20:24:12 +0000 @@ -0,0 +1,52 @@ +package org.hisp.dhis.common.adapter; + +/* + * 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 com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.SerializerProvider; +import org.hisp.dhis.period.Period; + +import java.io.IOException; + +/** + * @author Morten Olav Hansen + */ +public class JacksonPeriodSerializer + extends JsonSerializer +{ + @Override + public void serialize( Period value, JsonGenerator jgen, SerializerProvider provider ) throws IOException, JsonProcessingException + { + if ( value.getIsoDate() != null ) + { + jgen.writeString( value.getIsoDate() ); + } + } +} === added directory 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/common/annotation' === added file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/common/annotation/Scanned.java' --- dhis-2/dhis-api/src/main/java/org/hisp/dhis/common/annotation/Scanned.java 1970-01-01 00:00:00 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/common/annotation/Scanned.java 2012-04-18 20:24:12 +0000 @@ -0,0 +1,27 @@ +package org.hisp.dhis.common.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * A very simple annotation that is currently only used for marking identifiable collections + * that should be part of the auto-populating reference scanning of the DefaultImporter. + * + * This is here to separate between collections that we want scanned (e.g. dataSet.indicators) and collections + * that we don't want scanned (e.g. reportTable.allIndicators). + * + * TODO + * - refactor out scanner from DefaultImporter + * - add support for profiling (only scan for this profile, etc) + * - add support for annotation the setter or getter also + * + * @author Morten Olav Hansen + */ +@Target( {ElementType.FIELD} ) +@Retention( RetentionPolicy.RUNTIME ) +public @interface Scanned +{ + String[] value() default {}; +} === modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/dataset/DataSet.java' --- dhis-2/dhis-api/src/main/java/org/hisp/dhis/dataset/DataSet.java 2012-04-17 08:04:52 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/dataset/DataSet.java 2012-04-18 20:24:12 +0000 @@ -40,6 +40,7 @@ import org.hisp.dhis.common.IdentifiableObject; import org.hisp.dhis.common.adapter.JacksonPeriodTypeDeserializer; import org.hisp.dhis.common.adapter.JacksonPeriodTypeSerializer; +import org.hisp.dhis.common.annotation.Scanned; import org.hisp.dhis.common.view.DetailedView; import org.hisp.dhis.common.view.ExportView; import org.hisp.dhis.dataelement.DataElement; @@ -81,28 +82,33 @@ /** * All DataElements associated with this DataSet. */ + @Scanned private Set dataElements = new HashSet(); /** * Indicators associated with this data set. Indicators are used for view and * output purposes, such as calculated fields in forms and reports. */ + @Scanned private Set indicators = new HashSet(); /** * The DataElementOperands for which data must be entered in order for the * DataSet to be considered as complete. */ + @Scanned private Set compulsoryDataElementOperands = new HashSet(); /** * All Sources that register data with this DataSet. */ + @Scanned private Set sources = new HashSet(); /** * The Sections associated with the DataSet. */ + @Scanned private Set
sections = new HashSet
(); /** @@ -180,6 +186,11 @@ unit.getDataSets().remove( this ); } + public void removeAllOrganisationUnits() + { + sources.clear(); + } + public void updateOrganisationUnits( Set updates ) { for ( OrganisationUnit unit : new HashSet( sources ) ) @@ -208,6 +219,11 @@ dataElement.getDataSets().remove( dataElement ); } + public void removeAllDataElements() + { + dataElements.clear(); + } + public void updateDataElements( Set updates ) { for ( DataElement dataElement : new HashSet( dataElements ) ) @@ -236,6 +252,26 @@ indicator.getDataSets().remove( this ); } + public void removeAllIndicators() + { + indicators.clear(); + } + + public void addCompulsoryDataElementOperand( DataElementOperand dataElementOperand ) + { + compulsoryDataElementOperands.add( dataElementOperand ); + } + + public void removeCompulsoryDataElementOperand( DataElementOperand dataElementOperand ) + { + compulsoryDataElementOperands.remove( dataElementOperand ); + } + + public void removeAllCompulsoryDataElementOperands() + { + compulsoryDataElementOperands.clear(); + } + public boolean hasDataEntryForm() { return dataEntryForm != null; @@ -488,45 +524,33 @@ version = version != null ? version : dataSet.getVersion(); expiryDays = dataSet.getExpiryDays(); - dataElements.clear(); + removeAllDataElements(); for ( DataElement dataElement : dataSet.getDataElements() ) { addDataElement( dataElement ); } - indicators.clear(); + removeAllIndicators(); for ( Indicator indicator : dataSet.getIndicators() ) { addIndicator( indicator ); } - compulsoryDataElementOperands.clear(); + removeAllCompulsoryDataElementOperands(); for ( DataElementOperand dataElementOperand : dataSet.getCompulsoryDataElementOperands() ) { - compulsoryDataElementOperands.add( dataElementOperand ); + addCompulsoryDataElementOperand( dataElementOperand ); } - sources.clear(); + removeAllOrganisationUnits(); for ( OrganisationUnit organisationUnit : dataSet.getSources() ) { addOrganisationUnit( organisationUnit ); } - - sections.clear(); - - for ( Section section : dataSet.getSections() ) - { - sections.add( section ); - - if ( section.getDataSet() == null ) - { - section.setDataSet( this ); - } - } } } } === modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/dataset/Section.java' --- dhis-2/dhis-api/src/main/java/org/hisp/dhis/dataset/Section.java 2012-04-13 10:38:21 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/dataset/Section.java 2012-04-18 20:24:12 +0000 @@ -31,6 +31,7 @@ import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement; import org.hisp.dhis.common.BaseIdentifiableObject; import org.hisp.dhis.common.Dxf2Namespace; +import org.hisp.dhis.common.IdentifiableObject; import org.hisp.dhis.common.view.DetailedView; import org.hisp.dhis.common.view.ExportView; import org.hisp.dhis.dataelement.DataElement; @@ -79,6 +80,36 @@ // Logic // ------------------------------------------------------------------------- + public void addDataElement( DataElement dataElement ) + { + dataElements.add( dataElement ); + } + + public void removeDataElement( DataElement dataElement ) + { + dataElements.remove( dataElement ); + } + + public void addGreyedField( DataElementOperand greyedField ) + { + greyedFields.add( greyedField ); + } + + public void removeGreyedField( DataElementOperand greyedField ) + { + greyedFields.remove( greyedField ); + } + + public void removeAllGreyedFields() + { + greyedFields.clear(); + } + + public void removeAllDataElements() + { + dataElements.clear(); + } + public DataElementCategoryCombo getCategoryCombo() { return dataElements != null && dataElements.size() > 0 ? dataElements.iterator().next().getCategoryCombo() : null; @@ -189,11 +220,6 @@ this.dataElements = dataElements; } - public void addDataElement( DataElement dataElement ) - { - this.dataElements.add( dataElement ); - } - public int getSortOrder() { return sortOrder; @@ -217,4 +243,31 @@ { this.greyedFields = greyedFields; } + + @Override + public void mergeWith( IdentifiableObject other ) + { + super.mergeWith( other ); + + if ( other.getClass().isInstance( this ) ) + { + Section section = (Section) other; + + dataSet = section.getDataSet() == null ? dataSet : section.getDataSet(); + + removeAllDataElements(); + + for ( DataElement dataElement : section.getDataElements() ) + { + addDataElement( dataElement ); + } + + removeAllGreyedFields(); + + for ( DataElementOperand dataElementOperand : section.getGreyedFields() ) + { + addGreyedField( dataElementOperand ); + } + } + } } === modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/organisationunit/OrganisationUnit.java' --- dhis-2/dhis-api/src/main/java/org/hisp/dhis/organisationunit/OrganisationUnit.java 2012-04-17 08:04:52 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/organisationunit/OrganisationUnit.java 2012-04-18 20:24:12 +0000 @@ -40,6 +40,7 @@ import org.hisp.dhis.common.BaseNameableObject; import org.hisp.dhis.common.Dxf2Namespace; 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.ExportView; @@ -93,10 +94,13 @@ private String url; + @Scanned private Set groups = new HashSet(); + @Scanned private Set dataSets = new HashSet(); + @Scanned private Set users = new HashSet(); private String contactPerson; === modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/organisationunit/OrganisationUnitGroup.java' --- dhis-2/dhis-api/src/main/java/org/hisp/dhis/organisationunit/OrganisationUnitGroup.java 2012-04-17 08:04:52 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/organisationunit/OrganisationUnitGroup.java 2012-04-18 20:24:12 +0000 @@ -37,6 +37,7 @@ import org.hisp.dhis.common.BaseNameableObject; import org.hisp.dhis.common.Dxf2Namespace; 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.ExportView; @@ -55,6 +56,7 @@ */ private static final long serialVersionUID = -1131637847640209166L; + @Scanned private Set members = new HashSet(); private OrganisationUnitGroupSet groupSet; === 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 2012-04-17 08:04:52 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/organisationunit/OrganisationUnitGroupSet.java 2012-04-18 20:24:12 +0000 @@ -36,6 +36,7 @@ import org.hisp.dhis.common.BaseIdentifiableObject; import org.hisp.dhis.common.Dxf2Namespace; 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.ExportView; @@ -56,6 +57,7 @@ private static final Comparator COMPARATOR = new IdentifiableObjectNameComparator(); + @Scanned private Set organisationUnitGroups = new HashSet(); private String description; === 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 2012-04-13 10:38:21 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/period/Period.java 2012-04-18 20:24:12 +0000 @@ -29,10 +29,15 @@ 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.JacksonXmlProperty; import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement; import org.hisp.dhis.common.BaseNameableObject; import org.hisp.dhis.common.Dxf2Namespace; import org.hisp.dhis.common.Weighted; +import org.hisp.dhis.common.adapter.JacksonPeriodTypeDeserializer; +import org.hisp.dhis.common.adapter.JacksonPeriodTypeSerializer; import org.hisp.dhis.common.view.DetailedView; import org.hisp.dhis.common.view.ExportView; @@ -246,9 +251,9 @@ int prime = 31; int result = 1; - result = result * prime + startDate.hashCode(); - result = result * prime + endDate.hashCode(); - result = result * prime + periodType.hashCode(); + result = result * prime + (startDate != null ? startDate.hashCode() : 0); + result = result * prime + (endDate != null ? endDate.hashCode() : 0); + result = result * prime + (periodType != null ? periodType.hashCode() : 0); return result; } @@ -300,7 +305,11 @@ this.endDate = endDate; } - // TODO FIX THIS! + @JsonProperty + @JsonSerialize( using = JacksonPeriodTypeSerializer.class ) + @JsonDeserialize( using = JacksonPeriodTypeDeserializer.class ) + @JsonView( {DetailedView.class, ExportView.class} ) + @JacksonXmlProperty( namespace = Dxf2Namespace.NAMESPACE ) public PeriodType getPeriodType() { return periodType; === modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/reporttable/ReportTable.java' --- dhis-2/dhis-api/src/main/java/org/hisp/dhis/reporttable/ReportTable.java 2012-04-13 10:38:21 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/reporttable/ReportTable.java 2012-04-18 20:24:12 +0000 @@ -30,12 +30,16 @@ import com.fasterxml.jackson.annotation.JsonIgnore; 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; import org.apache.commons.lang.StringUtils; import org.hisp.dhis.common.*; +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.ExportView; import org.hisp.dhis.dataelement.DataElement; @@ -190,31 +194,37 @@ /** * The list of DataElements the ReportTable contains. */ + @Scanned private List dataElements = new ArrayList(); /** * The list of Indicators the ReportTable contains. */ + @Scanned private List indicators = new ArrayList(); /** * The list of DataSets the ReportTable contains. */ + @Scanned private List dataSets = new ArrayList(); /** * The list of Periods the ReportTable contains. */ + @Scanned private List periods = new ArrayList(); /** * The list of OrganisationUnits the ReportTable contains. */ + @Scanned private List units = new ArrayList(); /** * The list of OrganisationUnitGroups the ReportTable contains. */ + @Scanned private List organisationUnitGroups = new ArrayList(); /** @@ -957,7 +967,8 @@ } @JsonProperty - @JsonSerialize( contentAs = BaseIdentifiableObject.class ) + @JsonSerialize( contentUsing = JacksonPeriodSerializer.class ) + @JsonDeserialize( contentUsing = JacksonPeriodDeserializer.class ) @JsonView( {DetailedView.class, ExportView.class} ) @JacksonXmlElementWrapper( localName = "periods", namespace = Dxf2Namespace.NAMESPACE ) @JacksonXmlProperty( localName = "period", namespace = Dxf2Namespace.NAMESPACE ) @@ -1158,6 +1169,7 @@ return allUnits; } + @JsonIgnore public I18nFormat getI18nFormat() { return i18nFormat; @@ -1266,11 +1278,22 @@ sortOrder = reportTable.getSortOrder() == null ? sortOrder : reportTable.getSortOrder(); topLimit = reportTable.getTopLimit() == null ? topLimit : reportTable.getTopLimit(); + organisationUnitGroups.clear(); organisationUnitGroups.addAll( reportTable.getOrganisationUnitGroups() ); + + units.clear(); units.addAll( reportTable.getUnits() ); + + periods.clear(); periods.addAll( reportTable.getPeriods() ); + + dataSets.clear(); dataSets.addAll( reportTable.getDataSets() ); + + indicators.clear(); indicators.addAll( reportTable.getIndicators() ); + + dataElements.clear(); dataElements.addAll( reportTable.getDataElements() ); } } === modified file 'dhis-2/dhis-dxf2/src/main/java/org/hisp/dhis/dxf2/metadata/DefaultImportService.java' --- dhis-2/dhis-dxf2/src/main/java/org/hisp/dhis/dxf2/metadata/DefaultImportService.java 2012-04-17 08:04:52 +0000 +++ dhis-2/dhis-dxf2/src/main/java/org/hisp/dhis/dxf2/metadata/DefaultImportService.java 2012-04-18 20:24:12 +0000 @@ -116,10 +116,12 @@ doImport( metaData.getValidationRuleGroups(), importOptions, importSummary ); doImport( metaData.getDataDictionaries(), importOptions, importSummary ); doImport( metaData.getReports(), importOptions, importSummary ); +*/ doImport( metaData.getReportTables(), importOptions, importSummary ); - doImport( metaData.getCharts(), importOptions, importSummary ); + +// doImport( metaData.getCharts(), importOptions, importSummary ); doImport( metaData.getDataSets(), importOptions, importSummary ); -*/ + return importSummary; } === modified file 'dhis-2/dhis-dxf2/src/main/java/org/hisp/dhis/dxf2/metadata/importers/DefaultImporter.java' --- dhis-2/dhis-dxf2/src/main/java/org/hisp/dhis/dxf2/metadata/importers/DefaultImporter.java 2012-04-17 08:04:52 +0000 +++ dhis-2/dhis-dxf2/src/main/java/org/hisp/dhis/dxf2/metadata/importers/DefaultImporter.java 2012-04-18 20:24:12 +0000 @@ -30,12 +30,14 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.hisp.dhis.common.*; +import org.hisp.dhis.common.annotation.Scanned; import org.hisp.dhis.dxf2.importsummary.ImportConflict; import org.hisp.dhis.dxf2.importsummary.ImportCount; import org.hisp.dhis.dxf2.metadata.ImportOptions; import org.hisp.dhis.dxf2.metadata.Importer; import org.hisp.dhis.importexport.ImportStrategy; import org.hisp.dhis.period.Period; +import org.hisp.dhis.period.PeriodService; import org.hisp.dhis.system.util.ReflectionUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -59,6 +61,9 @@ @Autowired protected IdentifiableObjectManager manager; + @Autowired + private PeriodService periodService; + //------------------------------------------------------------------------------------------------------- // Constructor //------------------------------------------------------------------------------------------------------- @@ -563,12 +568,20 @@ return matchedObject; } - // FIXME slow! some kind of global idMap would be needed here, that will also update itself from several importers + // FIXME slow! some kind of global idMap is needed here, that will also update itself from several importers private IdentifiableObject findObjectByReference( IdentifiableObject identifiableObject ) { IdentifiableObject match = null; - if ( identifiableObject.getUid() != null ) + if ( Period.class.isAssignableFrom( identifiableObject.getClass() ) ) + { + // FIXME this is not working.. + Period period = (Period) identifiableObject; + periodService.reloadPeriod( period ); + + match = period; + } + else if ( identifiableObject.getUid() != null ) { match = manager.get( identifiableObject.getClass(), identifiableObject.getUid() ); } @@ -590,7 +603,7 @@ log.info( "-> Finding and updating references." ); - Map> collectedCollections = new HashMap>(); + Map> collectedCollections = new HashMap>(); for ( Field field : fields ) { @@ -600,29 +613,21 @@ if ( identifiableObject != null ) { - if ( Period.class.isAssignableFrom( identifiableObject.getClass() ) ) + IdentifiableObject ref = findObjectByReference( identifiableObject ); + + if ( ref != null ) { - // FIXME - log.info( "Skipping Period.class" ); + ReflectionUtils.invokeSetterMethod( field.getName(), object, ref ); } else { - IdentifiableObject ref = findObjectByReference( identifiableObject ); - - if ( ref != null ) - { - ReflectionUtils.invokeSetterMethod( field.getName(), object, ref ); - } - else - { - log.info( "--> Ignored reference " + getDisplayName( identifiableObject ) + "." ); - } + log.info( "--> Ignored reference " + getDisplayName( identifiableObject ) + "." ); } } } else { - boolean b = ReflectionUtils.isCollection( field.getName(), object, IdentifiableObject.class ); + boolean b = ReflectionUtils.isCollection( field.getName(), object, IdentifiableObject.class, Scanned.class ); if ( b ) { @@ -631,7 +636,7 @@ if ( objects != null && !objects.isEmpty() ) { Set identifiableObjects = new HashSet( objects ); - collectedCollections.put( field.getName(), identifiableObjects ); + collectedCollections.put( field, identifiableObjects ); objects.clear(); } } @@ -643,10 +648,25 @@ manager.save( object ); } - for ( String collectionKey : collectedCollections.keySet() ) + for ( Field field : collectedCollections.keySet() ) { - Collection identifiableObjects = collectedCollections.get( collectionKey ); - Collection objects = new HashSet(); + log.info( field.getName() ); + + Collection identifiableObjects = collectedCollections.get( field ); + Collection objects = null; + + if ( List.class.isAssignableFrom( field.getType() ) ) + { + objects = new ArrayList(); + } + else if ( Set.class.isAssignableFrom( field.getType() ) ) + { + objects = new HashSet(); + } + else + { + log.warn( "Unknown Collection type!" ); + } for ( IdentifiableObject identifiableObject : identifiableObjects ) { @@ -662,7 +682,7 @@ } } - ReflectionUtils.invokeSetterMethod( collectionKey, object, objects ); + ReflectionUtils.invokeSetterMethod( field.getName(), object, objects ); } } } === modified file 'dhis-2/dhis-services/dhis-service-reporting/src/main/resources/org/hisp/dhis/reporttable/hibernate/ReportTable.hbm.xml' --- dhis-2/dhis-services/dhis-service-reporting/src/main/resources/org/hisp/dhis/reporttable/hibernate/ReportTable.hbm.xml 2012-03-30 13:32:44 +0000 +++ dhis-2/dhis-services/dhis-service-reporting/src/main/resources/org/hisp/dhis/reporttable/hibernate/ReportTable.hbm.xml 2012-04-18 20:24:12 +0000 @@ -4,7 +4,7 @@ "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd" [] > - + @@ -16,52 +16,59 @@ &identifiableProperties; - - + + - + - + - + - + - + - + - + @@ -84,12 +91,12 @@ - + - + === modified file 'dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/system/util/ReflectionUtils.java' --- dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/system/util/ReflectionUtils.java 2012-04-17 14:57:04 +0000 +++ dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/system/util/ReflectionUtils.java 2012-04-18 20:24:12 +0000 @@ -27,17 +27,14 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -import java.lang.reflect.Field; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.lang.reflect.ParameterizedType; -import java.lang.reflect.Type; -import java.util.Collection; - import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.util.StringUtils; +import java.lang.annotation.Annotation; +import java.lang.reflect.*; +import java.util.Collection; + /** * @author Lars Helge Overland */ @@ -48,7 +45,7 @@ /** * Invokes method getId() for this object and returns the return value. An * int return type is expected. If the operation fails -1 is returned. - * + * * @param object object to call getId() on. * @return The identifier. */ @@ -59,8 +56,7 @@ Method method = object.getClass().getMethod( "getId" ); return (Integer) method.invoke( object ); - } - catch ( Exception ex ) + } catch ( Exception ex ) { return -1; } @@ -68,8 +64,8 @@ /** * Fetch a property off the object. Returns null if the operation fails. - * - * @param object the object. + * + * @param object the object. * @param property name of the property to get. * @return the value of the property or null. */ @@ -82,8 +78,7 @@ Method method = object.getClass().getMethod( "get" + property ); return (String) method.invoke( object ); - } - catch ( Exception ex ) + } catch ( Exception ex ) { return null; } @@ -92,16 +87,16 @@ /** * Sets a property for the supplied object. Throws an * UnsupportedOperationException if the operation fails. - * + * * @param object Object to modify - * @param name Name of property to set - * @param value Value the property will be set to + * @param name Name of property to set + * @param value Value the property will be set to */ public static void setProperty( Object object, String name, String value ) { - Object[] arguments = new Object[] { value }; + Object[] arguments = new Object[]{value}; - Class[] parameterTypes = new Class[] { String.class }; + Class[] parameterTypes = new Class[]{String.class}; if ( name.length() > 0 ) { @@ -112,8 +107,7 @@ Method concatMethod = object.getClass().getMethod( name, parameterTypes ); concatMethod.invoke( object, arguments ); - } - catch ( Exception ex ) + } catch ( Exception ex ) { throw new UnsupportedOperationException( "Failed to set property", ex ); } @@ -123,11 +117,11 @@ /** * Sets a property for the supplied object. Throws an * UnsupportedOperationException if the operation fails. - * - * @param object Object to modify + * + * @param object Object to modify * @param namePrefix prefix of the property name to set - * @param name Name of property to set - * @param value Value the property will be set to + * @param name Name of property to set + * @param value Value the property will be set to */ public static void setProperty( Object object, String namePrefix, String name, String value ) { @@ -139,7 +133,7 @@ /** * Returns the name of the class that the object is an instance of * org.hisp.dhis.indicator.Indicactor returns Indicator. - * + * * @param object object to determine className for. * @return String containing the class name. */ @@ -150,7 +144,7 @@ /** * Test whether the object is an array or a Collection. - * + * * @param value the object. * @return true if the object is an array or a Collection, false otherwise. */ @@ -169,17 +163,29 @@ public static boolean isCollection( String fieldName, Object object, Class type ) { + return isCollection( fieldName, object, type, null ); + } + + public static boolean isCollection( String fieldName, Object object, Class type, Class annotation ) + { Field field; try { field = object.getClass().getDeclaredField( fieldName ); - } - catch ( NoSuchFieldException e ) + } catch ( NoSuchFieldException e ) { return false; } + if ( annotation != null ) + { + if ( !field.isAnnotationPresent( annotation ) ) + { + return false; + } + } + try { if ( Collection.class.isAssignableFrom( field.getType() ) ) @@ -196,8 +202,7 @@ } } - } - catch ( ClassCastException e ) + } catch ( ClassCastException e ) { return false; } @@ -210,8 +215,7 @@ try { return object.getClass().getMethod( "get" + StringUtils.capitalize( fieldName ), classes ); - } - catch ( NoSuchMethodException e ) + } catch ( NoSuchMethodException e ) { log.info( "Getter method was not found for fieldName: " + fieldName ); return null; @@ -225,21 +229,19 @@ try { method = object.getClass().getMethod( "set" + StringUtils.capitalize( fieldName ), classes ); - } - catch ( NoSuchMethodException e ) + } catch ( NoSuchMethodException e ) { } // If parameter classes was not given, we will retry using the field type - + if ( method == null && classes.length == 0 ) { try { Field field = object.getClass().getDeclaredField( fieldName ); method = findSetterMethod( fieldName, object, field.getType() ); - } - catch ( NoSuchFieldException ignored ) + } catch ( NoSuchFieldException ignored ) { } } @@ -265,13 +267,11 @@ try { return (T) method.invoke( object ); - } - catch ( InvocationTargetException e ) + } catch ( InvocationTargetException e ) { log.info( "InvocationTargetException for fieldName: " + fieldName ); return null; - } - catch ( IllegalAccessException e ) + } catch ( IllegalAccessException e ) { log.info( "IllegalAccessException for fieldName: " + fieldName ); return null; @@ -291,13 +291,11 @@ try { return (T) method.invoke( object, objects ); - } - catch ( InvocationTargetException e ) + } catch ( InvocationTargetException e ) { log.info( "InvocationTargetException for fieldName: " + fieldName ); return null; - } - catch ( IllegalAccessException e ) + } catch ( IllegalAccessException e ) { log.info( "IllegalAccessException for fieldName: " + fieldName ); return null;