← Back to team overview

dhis2-devs team mailing list archive

[Branch ~dhis2-devs-core/dhis2/trunk] Rev 2886: - Made dataSet optional

 

------------------------------------------------------------
revno: 2886
committer: Jo Størset <storset@xxxxxxxxx>
branch nick: dhis2
timestamp: Mon 2011-02-21 16:02:35 +0530
message:
  - Made dataSet optional
  - Made storedBy default to current user name
  - Other cleanups, fixes
removed:
  dhis-2/dhis-web/dhis-web-api/src/main/webapp/dhis-web-case-api/
  dhis-2/dhis-web/dhis-web-api/src/main/webapp/dhis-web-case-api/main.vm
added:
  dhis-2/dhis-services/dhis-service-importexport/src/main/java/org/hisp/dhis/importexport/dxf2/model/DataElement.java
  dhis-2/dhis-services/dhis-service-importexport/src/main/java/org/hisp/dhis/importexport/dxf2/model/DataSet.java
  dhis-2/dhis-services/dhis-service-importexport/src/main/java/org/hisp/dhis/importexport/dxf2/model/Dxf.java
  dhis-2/dhis-services/dhis-service-importexport/src/main/java/org/hisp/dhis/importexport/dxf2/model/OrgUnit.java
  dhis-2/dhis-services/dhis-service-importexport/src/main/java/org/hisp/dhis/importexport/dxf2/service/DataSetMapper.java
  dhis-2/dhis-services/dhis-service-importexport/src/test/java/org/hisp/dhis/importexport/dxf2/service/DataSetMappingTest.java
modified:
  dhis-2/dhis-services/dhis-service-importexport/src/main/java/org/hisp/dhis/importexport/dxf2/model/DataValueSet.java
  dhis-2/dhis-services/dhis-service-importexport/src/main/java/org/hisp/dhis/importexport/dxf2/model/package-info.java
  dhis-2/dhis-services/dhis-service-importexport/src/main/java/org/hisp/dhis/importexport/dxf2/service/DataValueSetService.java
  dhis-2/dhis-services/dhis-service-importexport/src/main/resources/META-INF/dhis/beans.xml
  dhis-2/dhis-services/dhis-service-importexport/src/test/java/org/hisp/dhis/importexport/dxf2/service/DataValueSetServiceTest.java
  dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/web/api/resources/ApiResource.java
  dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/web/api/resources/DataSetResource.java
  dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/web/api/resources/DhisMediaType.java
  dhis-2/dhis-web/dhis-web-api/src/main/resources/META-INF/dhis/beans.xml
  dhis-2/dhis-web/dhis-web-api/src/main/webapp/WEB-INF/web.xml
  dhis-2/dhis-web/dhis-web-commons/src/main/resources/META-INF/dhis/beans.xml


--
lp:dhis2
https://code.launchpad.net/~dhis2-devs-core/dhis2/trunk

Your team DHIS 2 developers is subscribed to branch lp:dhis2.
To unsubscribe from this branch go to https://code.launchpad.net/~dhis2-devs-core/dhis2/trunk/+edit-subscription
=== added file 'dhis-2/dhis-services/dhis-service-importexport/src/main/java/org/hisp/dhis/importexport/dxf2/model/DataElement.java'
--- dhis-2/dhis-services/dhis-service-importexport/src/main/java/org/hisp/dhis/importexport/dxf2/model/DataElement.java	1970-01-01 00:00:00 +0000
+++ dhis-2/dhis-services/dhis-service-importexport/src/main/java/org/hisp/dhis/importexport/dxf2/model/DataElement.java	2011-02-21 10:32:35 +0000
@@ -0,0 +1,37 @@
+package org.hisp.dhis.importexport.dxf2.model;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAttribute;
+
+@XmlAccessorType(XmlAccessType.FIELD)
+public class DataElement
+{
+    @XmlAttribute(name="id")
+    private String uuid;
+        
+    @XmlAttribute
+    private String name;
+    
+    public String getUuid()
+    {
+        return uuid;
+    }
+
+    public void setUuid( String uuid )
+    {
+        this.uuid = uuid;
+    }
+
+    public String getName()
+    {
+        return name;
+    }
+
+    public void setName( String name )
+    {
+        this.name = name;
+    }
+
+    
+}

=== added file 'dhis-2/dhis-services/dhis-service-importexport/src/main/java/org/hisp/dhis/importexport/dxf2/model/DataSet.java'
--- dhis-2/dhis-services/dhis-service-importexport/src/main/java/org/hisp/dhis/importexport/dxf2/model/DataSet.java	1970-01-01 00:00:00 +0000
+++ dhis-2/dhis-services/dhis-service-importexport/src/main/java/org/hisp/dhis/importexport/dxf2/model/DataSet.java	2011-02-21 10:32:35 +0000
@@ -0,0 +1,96 @@
+package org.hisp.dhis.importexport.dxf2.model;
+
+import java.util.List;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlElementWrapper;
+import javax.xml.bind.annotation.XmlRootElement;
+
+@XmlRootElement
+@XmlAccessorType( XmlAccessType.FIELD )
+public class DataSet
+{
+    @XmlAttribute(name="id")
+    private String uuid;
+        
+    @XmlAttribute
+    private String name;
+    
+    @XmlAttribute
+    private String shortName;
+    
+    @XmlAttribute
+    private String code;
+    
+    @XmlAttribute
+    private String periodType;
+
+    @XmlElementWrapper(name="members")
+    @XmlElement(name="dataElement")
+    private List<DataElement> members;
+
+    public String getUuid()
+    {
+        return uuid;
+    }
+
+    public void setUuid( String uuid )
+    {
+        this.uuid = uuid;
+    }
+
+    public String getName()
+    {
+        return name;
+    }
+
+    public void setName( String name )
+    {
+        this.name = name;
+    }
+
+    public String getShortName()
+    {
+        return shortName;
+    }
+
+    public void setShortName( String shortName )
+    {
+        this.shortName = shortName;
+    }
+
+    public String getCode()
+    {
+        return code;
+    }
+
+    public void setCode( String code )
+    {
+        this.code = code;
+    }
+
+    public String getPeriodType()
+    {
+        return periodType;
+    }
+
+    public void setPeriodType( String periodType )
+    {
+        this.periodType = periodType;
+    }
+
+    public List<DataElement> getMembers()
+    {
+        return members;
+    }
+
+    public void setMembers( List<DataElement> members )
+    {
+        this.members = members;
+    }
+
+
+}

=== modified file 'dhis-2/dhis-services/dhis-service-importexport/src/main/java/org/hisp/dhis/importexport/dxf2/model/DataValueSet.java'
--- dhis-2/dhis-services/dhis-service-importexport/src/main/java/org/hisp/dhis/importexport/dxf2/model/DataValueSet.java	2011-02-18 20:17:34 +0000
+++ dhis-2/dhis-services/dhis-service-importexport/src/main/java/org/hisp/dhis/importexport/dxf2/model/DataValueSet.java	2011-02-21 10:32:35 +0000
@@ -27,7 +27,6 @@
  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-import java.util.Date;
 import java.util.List;
 
 import javax.xml.bind.annotation.XmlAccessType;
@@ -36,12 +35,12 @@
 import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlRootElement;
 
+@XmlRootElement
 @XmlAccessorType( XmlAccessType.FIELD )
-@XmlRootElement
 public class DataValueSet
 {
 
-    @XmlAttribute( name = "dataSet", required = true )
+    @XmlAttribute( name = "dataSet" )
     private String dataSetUuid;
 
     @XmlAttribute( name = "orgUnit", required = true )

=== added file 'dhis-2/dhis-services/dhis-service-importexport/src/main/java/org/hisp/dhis/importexport/dxf2/model/Dxf.java'
--- dhis-2/dhis-services/dhis-service-importexport/src/main/java/org/hisp/dhis/importexport/dxf2/model/Dxf.java	1970-01-01 00:00:00 +0000
+++ dhis-2/dhis-services/dhis-service-importexport/src/main/java/org/hisp/dhis/importexport/dxf2/model/Dxf.java	2011-02-21 10:32:35 +0000
@@ -0,0 +1,46 @@
+package org.hisp.dhis.importexport.dxf2.model;
+
+import java.util.List;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlElementWrapper;
+import javax.xml.bind.annotation.XmlRootElement;
+
+@XmlRootElement
+@XmlAccessorType( XmlAccessType.FIELD )
+public class Dxf
+{
+
+    
+    @XmlElementWrapper( name="dataSets" )
+    @XmlElement( name="dataSet" )
+    private List<DataSet> dataSets;
+
+    @XmlElementWrapper( name="dataValueSets" )
+    @XmlElement( name="dataValueSet" )
+    private List<DataValueSet> dataValueSets;
+
+    public void setDataValueSets( List<DataValueSet> dataValueSets )
+    {
+        this.dataValueSets = dataValueSets;
+    }
+
+    public List<DataValueSet> getDataValueSets()
+    {
+        return dataValueSets;
+    }
+
+    public List<DataSet> getDataSets()
+    {
+        return dataSets;
+    }
+
+    public void setDataSets( List<DataSet> dataSets )
+    {
+        this.dataSets = dataSets;
+    }
+
+    
+}

=== added file 'dhis-2/dhis-services/dhis-service-importexport/src/main/java/org/hisp/dhis/importexport/dxf2/model/OrgUnit.java'
--- dhis-2/dhis-services/dhis-service-importexport/src/main/java/org/hisp/dhis/importexport/dxf2/model/OrgUnit.java	1970-01-01 00:00:00 +0000
+++ dhis-2/dhis-services/dhis-service-importexport/src/main/java/org/hisp/dhis/importexport/dxf2/model/OrgUnit.java	2011-02-21 10:32:35 +0000
@@ -0,0 +1,37 @@
+package org.hisp.dhis.importexport.dxf2.model;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAttribute;
+
+@XmlAccessorType(XmlAccessType.FIELD)
+public class OrgUnit
+{
+
+    @XmlAttribute(name="id")
+    private String uuid;
+        
+    @XmlAttribute
+    private String name;
+
+    public String getUuid()
+    {
+        return uuid;
+    }
+
+    public void setUuid( String uuid )
+    {
+        this.uuid = uuid;
+    }
+
+    public void setName( String name )
+    {
+        this.name = name;
+    }
+
+    public String getName()
+    {
+        return name;
+    }
+
+}

=== modified file 'dhis-2/dhis-services/dhis-service-importexport/src/main/java/org/hisp/dhis/importexport/dxf2/model/package-info.java'
--- dhis-2/dhis-services/dhis-service-importexport/src/main/java/org/hisp/dhis/importexport/dxf2/model/package-info.java	2011-02-18 20:17:34 +0000
+++ dhis-2/dhis-services/dhis-service-importexport/src/main/java/org/hisp/dhis/importexport/dxf2/model/package-info.java	2011-02-21 10:32:35 +0000
@@ -1,6 +1,5 @@
 @javax.xml.bind.annotation.XmlSchema( 
-    namespace = "http://dhis2.org/schema/dxf/2.0-SNAPSHOT";, 
-    xmlns = { @javax.xml.bind.annotation.XmlNs( prefix = "xs", namespaceURI = "http://www.w3.org/2001/XMLSchema"; ) }, 
+    namespace = "http://dhis2.org/schema/dxf/2.0-SNAPSHOT";,
     elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED )
 package org.hisp.dhis.importexport.dxf2.model;
 

=== added file 'dhis-2/dhis-services/dhis-service-importexport/src/main/java/org/hisp/dhis/importexport/dxf2/service/DataSetMapper.java'
--- dhis-2/dhis-services/dhis-service-importexport/src/main/java/org/hisp/dhis/importexport/dxf2/service/DataSetMapper.java	1970-01-01 00:00:00 +0000
+++ dhis-2/dhis-services/dhis-service-importexport/src/main/java/org/hisp/dhis/importexport/dxf2/service/DataSetMapper.java	2011-02-21 10:32:35 +0000
@@ -0,0 +1,40 @@
+package org.hisp.dhis.importexport.dxf2.service;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+import org.hisp.dhis.importexport.dxf2.model.DataElement;
+import org.hisp.dhis.importexport.dxf2.model.DataSet;
+
+public class DataSetMapper
+{
+
+    public static DataSet convert(org.hisp.dhis.dataset.DataSet dataSet) {
+        DataSet dxfDataSet = new DataSet();
+        
+        dxfDataSet.setCode( dataSet.getCode() );
+        dxfDataSet.setMembers( getDataElements(dataSet.getDataElements()) );
+        dxfDataSet.setName( dataSet.getName() );
+        dxfDataSet.setPeriodType( dataSet.getPeriodType().getName() );
+        dxfDataSet.setShortName( dataSet.getShortName() );
+        dxfDataSet.setUuid( dataSet.getUuid() );
+        
+        return dxfDataSet;
+    }
+
+    public static List<DataElement> getDataElements( Collection<org.hisp.dhis.dataelement.DataElement> dataElements )
+    {
+        List<DataElement> dxfDataElements = new ArrayList<DataElement>();
+        
+        for ( org.hisp.dhis.dataelement.DataElement dataElement : dataElements )
+        {
+            DataElement dxfDataElement = new DataElement();
+            dxfDataElement.setName( dataElement.getName() );
+            dxfDataElement.setUuid( dataElement.getUuid() );
+            
+            dxfDataElements.add( dxfDataElement );
+        }
+        return dxfDataElements;
+    }
+}

=== modified file 'dhis-2/dhis-services/dhis-service-importexport/src/main/java/org/hisp/dhis/importexport/dxf2/service/DataValueSetService.java'
--- dhis-2/dhis-services/dhis-service-importexport/src/main/java/org/hisp/dhis/importexport/dxf2/service/DataValueSetService.java	2011-02-18 20:17:34 +0000
+++ dhis-2/dhis-services/dhis-service-importexport/src/main/java/org/hisp/dhis/importexport/dxf2/service/DataValueSetService.java	2011-02-21 10:32:35 +0000
@@ -29,9 +29,9 @@
 
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
-import java.util.ArrayList;
 import java.util.Date;
-import java.util.List;
+import java.util.HashSet;
+import java.util.Set;
 
 import org.hisp.dhis.dataelement.DataElement;
 import org.hisp.dhis.dataelement.DataElementCategoryOptionCombo;
@@ -49,6 +49,7 @@
 import org.hisp.dhis.period.DailyPeriodType;
 import org.hisp.dhis.period.Period;
 import org.hisp.dhis.period.PeriodType;
+import org.hisp.dhis.user.CurrentUserService;
 import org.springframework.beans.factory.annotation.Required;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -67,44 +68,58 @@
 
     private CompleteDataSetRegistrationService registrationService;
 
+    private CurrentUserService currentUserService;
+
     /**
-     * Save a dataValueSet if all of the following is valid
+     * Save a dataValueSet.
+     * <p>
+     * Handles the content in the following way
+     * <ul>
+     * <li>if data set is not specified, will resolve it through data elements if not ambigous.
+     * <li>optionCombo defaults to 'default' if not specified
+     * <li>storedBy defaults to currently logged in user's name
+     * </ul>
+     * <ul>
+     * Validates the following:
      * <p>
      * First checks that:
      * <ul>
-     * <li>dataSet exists
+     * <li>dataSet exists (tries to resolve it through the data elements if not specified)
      * <li>orgUnit exists
      * <li>orgunit reports dataSet
      * <li>period is a valid period
      * <li>the dataValueSet is not registered as complete or that if it is a
      * complete date is present
-     * <li>a present complete date is valid
+     * <li>if complete date present checks validity
      * </ul>
-     * For all dataValues it checks that:
+     * For all dataValues check that:
      * <ul>
      * <li>dataElement exists and is in dataSet
-     * <li>optionCombo exists (defaults to 'default' if not specified) and is in dataElement
+     * <li>optionCombo exists and is in dataElement
      * </ul>
      * What isn't checked yet:
      * <ul>
-     * <li>That there isn't duplicated value entries (will throw Constraint exception)
-     * <li>That the value is valid!
+     * <li>The value is valid!
+     * <li>There isn't duplicated value entries (will throw Constraint exception)
+     * <li>If multiple data sets are possible, evaluate if they are incompatible (complete, locking and possibly period)
      * </ul>
      * Concerns:
      * <ul>
      * <li>deletion through sending "empty string" value dependant on semantics of add/update in data value store
-     * <li>completed semantics, can't uncomplete but can complete and "recomplete"
-     * <li>what is 'comment' really?
+     * <li>completed semantics: can't uncomplete but can complete and "recomplete"
+     * <li>what is 'comment' good for really?
      * 
      * @param dataValueSet
-     * @throws IllegalArgumentException if 
+     * @throws IllegalArgumentException if there are any inconsistencies
      */
+    @Transactional
     public void saveDataValueSet( DataValueSet dataValueSet )
         throws IllegalArgumentException
     {
+
         Date timestamp = new Date();
 
-        DataSet dataSet = getDataSet( dataValueSet.getDataSetUuid() );
+        DataSet dataSet = getDataSet( dataValueSet );
 
         OrganisationUnit unit = getOrgUnit( dataValueSet.getOrganisationUnitUuid() );
 
@@ -116,6 +131,131 @@
 
         Period period = getPeriod( dataValueSet.getPeriodIsoDate(), dataSet.getPeriodType() );
 
+        handleComplete( dataValueSet, dataSet, unit, period );
+
+        for ( org.hisp.dhis.importexport.dxf2.model.DataValue dxfValue : dataValueSet.getDataValues() )
+        {
+            saveDataValue( timestamp, dataSet, unit, period, dxfValue );
+        }
+
+    }
+
+    private DataSet getDataSet( DataValueSet dataValueSet )
+    {
+        DataSet dataSet = null;
+        
+        String uuid = dataValueSet.getDataSetUuid();
+        if ( uuid != null )
+        {
+            dataSet = dataSetService.getDataSet( uuid );
+
+            if ( dataSet == null )
+            {
+                throw new IllegalArgumentException( "Data set with UUID " + uuid + " does not exist" );
+            }
+        }
+        else
+        {
+            dataSet = resolveDataSet( dataValueSet );
+        }
+        return dataSet;
+    }
+
+    private DataSet resolveDataSet( DataValueSet dataValueSet )
+    {
+        if ( dataValueSet.getDataValues() == null )
+        {
+            throw new IllegalArgumentException(
+                "Data value set doesn't specify data set and does not contain data values." );
+        }
+
+        Set<DataSet> potential = null;
+
+        for ( org.hisp.dhis.importexport.dxf2.model.DataValue value : dataValueSet.getDataValues() )
+        {
+            DataElement dataElement = getDataElement( value.getDataElementUuid() );
+            Set<DataSet> dataSets = dataElement.getDataSets();
+
+            if ( dataSets == null || dataSets.isEmpty() )
+            {
+                throw new IllegalArgumentException( "Data element '" + dataElement.getUuid()
+                    + "' isn't in a data set." );
+            }
+            else if ( dataSets.size() == 1 )
+            {
+                return dataSets.iterator().next();
+            }
+            else
+            {
+                if ( potential == null )
+                {
+                    potential = new HashSet<DataSet>( dataSets );
+                }
+                else
+                {
+                    for ( DataSet set : dataSets )
+                    {
+                        if ( !potential.contains( set ) )
+                        {
+                            potential.remove( set );
+                        }
+                    }
+                    if ( potential.size() == 1 )
+                    {
+                        return potential.iterator().next();
+                    }
+                }
+            }
+        }
+
+        // TODO: Check if potential data sets are compatible
+
+        String message = "Ambiguous which of these data set the data values belong to: ";
+        for ( DataSet p : potential )
+        {
+            message += p.getUuid() + ", ";
+        }
+        message.substring( 0, message.length() - 2 );
+        throw new IllegalArgumentException( message );
+    }
+
+    private void saveDataValue( Date timestamp, DataSet dataSet, OrganisationUnit unit, Period period,
+        org.hisp.dhis.importexport.dxf2.model.DataValue dxfValue )
+    {
+        DataElement dataElement = getDataElement( dxfValue.getDataElementUuid() );
+
+        if ( !dataSet.getDataElements().contains( dataElement ) )
+        {
+            throw new IllegalArgumentException( "Data element '" + dataElement.getUuid() + "' isn't in data set "
+                + dataSet.getUuid() );
+        }
+
+        DataElementCategoryOptionCombo combo = getOptionCombo( dxfValue.getCategoryOptionComboUuid(), dataElement );
+
+        DataValue dv = dataValueService.getDataValue( unit, dataElement, period, combo );
+
+        String value = dxfValue.getValue();
+
+        // dataElement.isValidValue(value);
+
+        String storedBy = getStoredBy( dxfValue );
+
+        if ( dv == null )
+        {
+            dv = new DataValue( dataElement, period, unit, value, storedBy, timestamp, null, combo );
+            dataValueService.addDataValue( dv );
+        }
+        else
+        {
+            dv.setValue( value );
+            dv.setTimestamp( timestamp );
+            dv.setStoredBy( storedBy );
+            dataValueService.updateDataValue( dv );
+        }
+    }
+
+    private void handleComplete( DataValueSet dataValueSet, DataSet dataSet, OrganisationUnit unit, Period period )
+    {
         CompleteDataSetRegistration alreadyComplete = registrationService.getCompleteDataSetRegistration( dataSet,
             period, unit );
         String completeDateString = dataValueSet.getCompleteDate();
@@ -126,6 +266,11 @@
                 "DataValueSet is complete, include a new complete date if you want to recomplete" );
         }
 
+        if ( alreadyComplete != null )
+        {
+            registrationService.deleteCompleteDataSetRegistration( alreadyComplete );
+        }
+
         CompleteDataSetRegistration complete = null;
 
         if ( completeDateString != null )
@@ -133,39 +278,21 @@
             complete = getComplete( dataSet, unit, period, completeDateString, complete );
         }
 
-        List<DataValue> newDataValues = new ArrayList<DataValue>( dataValueSet.getDataValues().size() );
-        List<DataValue> updatedDataValues = new ArrayList<DataValue>( dataValueSet.getDataValues().size() );
-
-        for ( org.hisp.dhis.importexport.dxf2.model.DataValue dxfValue : dataValueSet.getDataValues() )
-        {
-            DataElement dataElement = getDataElement( dxfValue.getDataElementUuid(), dataSet );
-
-            DataElementCategoryOptionCombo combo = getOptionCombo( dxfValue.getCategoryOptionComboUuid(), dataElement );
-
-            
-            
-            DataValue dv = dataValueService.getDataValue( unit, dataElement, period, combo );
-
-            String value = dxfValue.getValue();
-
-            // dataElement.isValidValue(value);
-            
-            if ( dv == null )
-            {
-                dv = new DataValue( dataElement, period, unit, value, dxfValue.getStoredBy(), timestamp,
-                    null, combo );
-                newDataValues.add( dv );
-            }
-            else
-            {
-                dv.setValue( value );
-                dv.setTimestamp( timestamp );
-                dv.setStoredBy( dxfValue.getStoredBy() );
-                updatedDataValues.add( dv );
-            }
-        }
-
-        save( alreadyComplete, complete, newDataValues, updatedDataValues );
+        if ( complete != null )
+        {
+            registrationService.saveCompleteDataSetRegistration( complete );
+        }
+    }
+
+    private String getStoredBy( org.hisp.dhis.importexport.dxf2.model.DataValue dxfValue )
+    {
+        String storedBy = dxfValue.getStoredBy();
+
+        if ( storedBy == null || storedBy.trim().equals( "" ) )
+        {
+            storedBy = currentUserService.getCurrentUsername();
+        }
+        return storedBy;
     }
 
     private CompleteDataSetRegistration getComplete( DataSet dataSet, OrganisationUnit unit, Period period,
@@ -211,18 +338,7 @@
         return unit;
     }
 
-    private DataSet getDataSet( String uuid )
-    {
-        DataSet dataSet = dataSetService.getDataSet( uuid );
-
-        if ( dataSet == null )
-        {
-            throw new IllegalArgumentException( "Data set with UUID " + uuid + " does not exist" );
-        }
-        return dataSet;
-    }
-
-    private DataElement getDataElement( String uuid, DataSet dataSet )
+    private DataElement getDataElement( String uuid )
     {
         DataElement dataElement = dataElementService.getDataElement( uuid );
 
@@ -231,11 +347,6 @@
             throw new IllegalArgumentException( "Data element with UUID " + uuid + " does not exist" );
         }
 
-        if ( !dataSet.getDataElements().contains( dataElement ) )
-        {
-            throw new IllegalArgumentException( "Data element '" + dataElement.getUuid() + "' isn't in data set "
-                + dataSet.getUuid() );
-        }
         return dataElement;
     }
 
@@ -266,31 +377,6 @@
         return combo;
     }
 
-    @Transactional
-    private void save( CompleteDataSetRegistration alreadyComplete, CompleteDataSetRegistration complete,
-        List<DataValue> newDataValues, List<DataValue> updatedDataValues )
-    {
-        if ( alreadyComplete != null )
-        {
-            registrationService.deleteCompleteDataSetRegistration( alreadyComplete );
-        }
-
-        for ( DataValue dataValue : newDataValues )
-        {
-            dataValueService.addDataValue( dataValue );
-        }
-
-        for ( DataValue dataValue : updatedDataValues )
-        {
-            dataValueService.updateDataValue( dataValue );
-        }
-
-        if ( complete != null )
-        {
-            registrationService.saveCompleteDataSetRegistration( complete );
-        }
-    }
-
     public void setOrganisationUnitService( OrganisationUnitService organisationUnitService )
     {
         this.organisationUnitService = organisationUnitService;
@@ -323,4 +409,10 @@
         this.registrationService = registrationService;
     }
 
+    @Required
+    public void setCurrentUserService( CurrentUserService currentUserService )
+    {
+        this.currentUserService = currentUserService;
+    }
+
 }

=== modified file 'dhis-2/dhis-services/dhis-service-importexport/src/main/resources/META-INF/dhis/beans.xml'
--- dhis-2/dhis-services/dhis-service-importexport/src/main/resources/META-INF/dhis/beans.xml	2011-02-18 20:17:34 +0000
+++ dhis-2/dhis-services/dhis-service-importexport/src/main/resources/META-INF/dhis/beans.xml	2011-02-21 10:32:35 +0000
@@ -416,6 +416,7 @@
     <property name="dataSetService" ref="org.hisp.dhis.dataset.DataSetService" />
     <property name="dataValueService" ref="org.hisp.dhis.datavalue.DataValueService" />
     <property name="registrationService" ref="org.hisp.dhis.dataset.CompleteDataSetRegistrationService" />
+    <property name="currentUserService" ref="org.hisp.dhis.user.CurrentUserService" />
   </bean>
 
 </beans>

=== added file 'dhis-2/dhis-services/dhis-service-importexport/src/test/java/org/hisp/dhis/importexport/dxf2/service/DataSetMappingTest.java'
--- dhis-2/dhis-services/dhis-service-importexport/src/test/java/org/hisp/dhis/importexport/dxf2/service/DataSetMappingTest.java	1970-01-01 00:00:00 +0000
+++ dhis-2/dhis-services/dhis-service-importexport/src/test/java/org/hisp/dhis/importexport/dxf2/service/DataSetMappingTest.java	2011-02-21 10:32:35 +0000
@@ -0,0 +1,113 @@
+package org.hisp.dhis.importexport.dxf2.service;
+
+/*
+ * Copyright (c) 2011, 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.io.IOException;
+import java.io.InputStream;
+import java.io.StringWriter;
+
+import javax.xml.bind.JAXBContext;
+import javax.xml.bind.JAXBException;
+import javax.xml.bind.Marshaller;
+
+import org.hisp.dhis.DhisTest;
+import org.hisp.dhis.dataelement.DataElementCategoryService;
+import org.hisp.dhis.dataelement.DataElementService;
+import org.hisp.dhis.dataset.DataSetService;
+import org.hisp.dhis.datavalue.DataValue;
+import org.hisp.dhis.datavalue.DataValueService;
+import org.hisp.dhis.importexport.ImportException;
+import org.hisp.dhis.importexport.ImportParams;
+import org.hisp.dhis.importexport.ImportService;
+import org.hisp.dhis.importexport.ImportStrategy;
+import org.hisp.dhis.importexport.dxf2.model.DataSet;
+import org.hisp.dhis.importexport.util.ImportExportUtils;
+import org.junit.Ignore;
+import org.junit.Test;
+
+/**
+ * Stub test class...
+ */
+public class DataSetMappingTest
+    extends DhisTest
+{
+
+    private static final String DATA_SET_UUID = "16B2299E-ECD6-46CF-A61F-817D350C180D";
+
+    private ImportService importService;
+
+    // -------------------------------------------------------------------------
+    // Fixture
+    // -------------------------------------------------------------------------
+
+    @Override
+    public void setUpTest()
+        throws JAXBException, IOException, ImportException
+    {
+        importService = (ImportService) getBean( "org.hisp.dhis.importexport.ImportService" );
+        categoryService = (DataElementCategoryService) getBean( DataElementCategoryService.ID );
+        dataElementService = (DataElementService) getBean( DataElementService.ID );
+        dataSetService = (DataSetService) getBean( DataSetService.ID );
+        dataValueService = (DataValueService) getBean( DataValueService.ID );
+
+        ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
+
+        InputStream is = classLoader.getResourceAsStream( "dxf2/base.xml" );
+        ImportParams importParams = ImportExportUtils.getImportParams( ImportStrategy.NEW_AND_UPDATES, false, false,
+            false );
+        importService.importData( importParams, is );
+        is.close();
+
+    }
+
+    // -------------------------------------------------------------------------
+    // Tests
+    // -------------------------------------------------------------------------
+
+    @Test @Ignore
+    public void testJaxb()
+        throws JAXBException, IOException
+    {
+        JAXBContext jc = JAXBContext.newInstance( DataSet.class );
+        Marshaller u = jc.createMarshaller();
+
+        StringWriter writer = new StringWriter();
+        org.hisp.dhis.dataset.DataSet dataSet = dataSetService.getDataSet( DATA_SET_UUID );
+        DataSet dxfDataSet = DataSetMapper.convert( dataSet );
+        u.marshal( dxfDataSet, writer );
+
+        System.out.println( writer.toString() );
+    }
+
+    @Override
+    protected boolean emptyDatabaseAfterTest()
+    {
+        return true;
+    }
+
+}

=== modified file 'dhis-2/dhis-services/dhis-service-importexport/src/test/java/org/hisp/dhis/importexport/dxf2/service/DataValueSetServiceTest.java'
--- dhis-2/dhis-services/dhis-service-importexport/src/test/java/org/hisp/dhis/importexport/dxf2/service/DataValueSetServiceTest.java	2011-02-18 20:17:34 +0000
+++ dhis-2/dhis-services/dhis-service-importexport/src/test/java/org/hisp/dhis/importexport/dxf2/service/DataValueSetServiceTest.java	2011-02-21 10:32:35 +0000
@@ -58,10 +58,11 @@
 import org.junit.Test;
 
 /**
- * Messy test class checking that jaxb produces the expected java 
- * @link{DataValueSet data value set} structure, that the set is converted, validated and
- * stored into a correct set of {@link DataValue data values}
- *                    .
+ * Messy test class checking that jaxb produces the expected java
+ * 
+ * @link{DataValueSet data value set} structure, that the set is converted,
+ *                    validated and stored into a correct set of
+ *                    {@link DataValue data values} .
  */
 public class DataValueSetServiceTest
     extends DhisTest
@@ -186,8 +187,10 @@
 
     }
 
-    @Test @Ignore
-    public void testValidvalue() {
+    @Test
+    @Ignore
+    public void testValidvalue()
+    {
         setValue( "" );
 
         try
@@ -198,21 +201,26 @@
         {
             // Expected
         }
-        
-    }
-    
-    @Test @Ignore
-    public void testDuplicatedDataValues() {
-        
-    }
-
-    @Test @Ignore
-    public void testExistingComboButNotInDataElement() {
-        
-    }
-    
-    @Test
-    public void deleteDataValue() {
+
+    }
+
+    @Test
+    @Ignore
+    public void testDuplicatedDataValues()
+    {
+
+    }
+
+    @Test
+    @Ignore
+    public void testExistingComboButNotInDataElement()
+    {
+
+    }
+
+    @Test
+    public void deleteDataValue()
+    {
         service.saveDataValueSet( dataValueSet );
 
         Collection<DataValue> dataValues = dataValueService.getAllDataValues();
@@ -227,23 +235,17 @@
 
         dataValues = dataValueService.getAllDataValues();
         assertEquals( 0, dataValues.size() );
-        
+
     }
-        
+
     @Test
     public void dataSetMissing()
     {
         dataValueSet.setDataSetUuid( null );
-        try
-        {
-            service.saveDataValueSet( dataValueSet );
-            fail( "Should miss data set" );
+        setValue( "999" );
+        
+        testSave( "999" );
 
-        }
-        catch ( IllegalArgumentException e )
-        {
-            // Expected
-        }
     }
 
     @Test
@@ -262,7 +264,7 @@
         }
 
         dataValueSet.setOrganisationUnitUuid( ORGANISATION_UNIT_NOT_IN_SET_UUID );
-        
+
         try
         {
             service.saveDataValueSet( dataValueSet );
@@ -276,7 +278,8 @@
     }
 
     @Test
-    public void illegalPeriod() {
+    public void illegalPeriod()
+    {
 
         dataValueSet.setPeriodIsoDate( "2011" );
 
@@ -291,9 +294,10 @@
             // Expected
         }
     }
-    
+
     @Test
-    public void completeness() {
+    public void completeness()
+    {
 
         service.saveDataValueSet( dataValueSet );
 
@@ -305,13 +309,13 @@
         try
         {
             service.saveDataValueSet( dataValueSet );
-            fail("Shouldn't allow saving to a completed set");
+            fail( "Shouldn't allow saving to a completed set" );
         }
         catch ( IllegalArgumentException e )
         {
             // TODO: Expected
         }
-        
+
         dataValueSet.setCompleteDate( "201lala" );
 
         try
@@ -325,11 +329,12 @@
 
         dataValueSet.setCompleteDate( "20101010" );
         service.saveDataValueSet( dataValueSet );
-        
+
     }
 
     @Test
-    public void elementExistsAndNotInSet() {
+    public void elementExistsAndNotInSet()
+    {
 
         org.hisp.dhis.importexport.dxf2.model.DataValue dv = new org.hisp.dhis.importexport.dxf2.model.DataValue();
         dv.setDataElementUuid( "ladida" );
@@ -360,7 +365,8 @@
     }
 
     @Test
-    public void optionComboExistsAndInDataElement() {
+    public void optionComboExistsAndInDataElement()
+    {
 
         dataValueSet.getDataValues().get( 0 ).setCategoryOptionComboUuid( DEFAULT_COMBO_UUID );
 
@@ -379,44 +385,39 @@
         }
 
     }
-    
 
-    
     @Test
     public void testUpdate()
     {
-        long before = new Date().getTime();
-
-        service.saveDataValueSet( dataValueSet );
-
-        long after = new Date().getTime();
-
-        Collection<DataValue> dataValues = dataValueService.getAllDataValues();
-        assertEquals( 1, dataValues.size() );
-
-        DataValue dataValue = dataValues.iterator().next();
-
-        verifyDataValue( before, after, dataValue );
+        testSave("11");
 
         // Update
-        setValue("101");
-
-        before = new Date().getTime();
+        setValue( "101" );
+        
+        testSave( "101" );
+
+    }
+
+    private void testSave( String value )
+    {
+        Collection<DataValue> dataValues;
+        DataValue dataValue;
+
+        long before = new Date().getTime();
 
         service.saveDataValueSet( dataValueSet );
 
-        after = new Date().getTime();
+        long after = new Date().getTime();
 
         dataValues = dataValueService.getAllDataValues();
         assertEquals( 1, dataValues.size() );
 
         dataValue = dataValues.iterator().next();
 
-        verifyDataValue( before, after, dataValue, "101" );
-
+        verifyDataValue( before, after, dataValue, value );
     }
 
-    private void setValue(String value)
+    private void setValue( String value )
     {
         dataValueSet.getDataValues().get( 0 ).setValue( value );
     }
@@ -447,5 +448,4 @@
         return true;
     }
 
-    
 }

=== modified file 'dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/web/api/resources/ApiResource.java'
--- dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/web/api/resources/ApiResource.java	2011-02-18 20:17:34 +0000
+++ dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/web/api/resources/ApiResource.java	2011-02-21 10:32:35 +0000
@@ -29,7 +29,7 @@
 
         sb.append( "<p>The api currently supports two specific pilot use cases, posting of data value sets and a mobile GPRS client." );
 
-        sb.append( "<h2>Posting data value sets (experimental)</h2>" );
+        sb.append( "<h2>Posting data value sets</h2>" );
         sb.append( "<p>To find the needed information about the data sets you want to post data about, go to " );
         URI uri = uriInfo.getBaseUriBuilder().path( DataSetResource.class ).build();
         sb.append( "<a href=\"" ).append( uri ).append( "\">the data set list</a>.</p>" );

=== modified file 'dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/web/api/resources/DataSetResource.java'
--- dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/web/api/resources/DataSetResource.java	2011-02-18 20:17:34 +0000
+++ dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/web/api/resources/DataSetResource.java	2011-02-21 10:32:35 +0000
@@ -15,6 +15,7 @@
 import org.hisp.dhis.dataelement.DataElementCategoryOptionCombo;
 import org.hisp.dhis.dataset.DataSet;
 import org.hisp.dhis.dataset.DataSetService;
+import org.hisp.dhis.importexport.dxf2.service.DataSetMapper;
 import org.hisp.dhis.organisationunit.OrganisationUnit;
 import org.springframework.beans.factory.annotation.Required;
 
@@ -26,7 +27,7 @@
 
     @Context
     UriInfo uriInfo;
-    
+
     @GET
     @Produces( MediaType.TEXT_HTML )
     public String getDataSetList()
@@ -49,6 +50,20 @@
     }
 
     @GET
+    @Produces( { MediaType.APPLICATION_XML, DhisMediaType.DXF } )
+    @Path( "{uuid}/dxf" )
+    public org.hisp.dhis.importexport.dxf2.model.DataSet getDataSetXml( @PathParam( "uuid" ) String uuid )
+    {
+        DataSet dataSet = dataSetService.getDataSet( uuid );
+
+        if ( dataSet == null )
+        {
+            throw new IllegalArgumentException( "No dataset with uuid " + uuid );
+        }
+        return DataSetMapper.convert( dataSet );
+    }
+
+    @GET
     @Path( "{uuid}" )
     @Produces( MediaType.TEXT_HTML )
     public String getDataSet( @PathParam( "uuid" ) String uuid )
@@ -64,6 +79,9 @@
         StringBuilder t = new StringBuilder();
 
         t.append( head( "Data set " + dataSet.getName() ) );
+        URI url = uriInfo.getAbsolutePathBuilder().path( "/dxf" ).build();
+        t.append( "<p>(There is also a <a href=\"" ).append( url )
+            .append( "\">prototype xml version</a> of this data set available)</p>\n" );
         t.append( "<p>Uuid: " ).append( dataSet.getUuid() ).append( "<br>\n" );
         t.append( "Period type: " ).append( dataSet.getPeriodType().getName() ).append( " - " )
             .append( dataSet.getPeriodType().getIsoFormat() );
@@ -116,14 +134,10 @@
         return "</body>\n</html>\n";
     }
 
-
-
     @Required
     public void setDataSetService( DataSetService dataSetService )
     {
         this.dataSetService = dataSetService;
     }
 
-
-    
 }

=== modified file 'dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/web/api/resources/DhisMediaType.java'
--- dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/web/api/resources/DhisMediaType.java	2011-01-12 09:13:36 +0000
+++ dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/web/api/resources/DhisMediaType.java	2011-02-21 10:32:35 +0000
@@ -29,6 +29,9 @@
 
 public class DhisMediaType
 {
+    public static final String DXF = "application/vnd.org.dhis2.dxf";
+
+    
     public static final String ACTIVITYVALUELIST_SERIALIZED = "application/vnd.org.dhis2.activityvaluelist+serialized";
 
     public static final String DATASETVALUE_SERIALIZED = "application/vnd.org.dhis2.datasetvalue+serialized";

=== modified file 'dhis-2/dhis-web/dhis-web-api/src/main/resources/META-INF/dhis/beans.xml'
--- dhis-2/dhis-web/dhis-web-api/src/main/resources/META-INF/dhis/beans.xml	2011-02-18 20:17:34 +0000
+++ dhis-2/dhis-web/dhis-web-api/src/main/resources/META-INF/dhis/beans.xml	2011-02-21 10:32:35 +0000
@@ -96,7 +96,8 @@
     <property name="categoryService" ref="org.hisp.dhis.dataelement.DataElementCategoryService" />
   </bean>
 
-	
+  <!-- bean id="org.hisp.dhis.web.api.mapping.VelocityViewProcessor" class="org.hisp.dhis.web.api.mapping.VelocityViewProcessor" scope="singleton" />	
+ -->
 </beans>
 
 

=== modified file 'dhis-2/dhis-web/dhis-web-api/src/main/webapp/WEB-INF/web.xml'
--- dhis-2/dhis-web/dhis-web-api/src/main/webapp/WEB-INF/web.xml	2011-02-18 20:17:34 +0000
+++ dhis-2/dhis-web/dhis-web-api/src/main/webapp/WEB-INF/web.xml	2011-02-21 10:32:35 +0000
@@ -95,5 +95,9 @@
 		<servlet-name>web-api</servlet-name>
 		<url-pattern>/api/*</url-pattern>
 	</servlet-mapping>
+  <servlet-mapping>
+    <servlet-name>web-api</servlet-name>
+    <url-pattern>/api</url-pattern>
+  </servlet-mapping>
 	
 </web-app>
\ No newline at end of file

=== removed directory 'dhis-2/dhis-web/dhis-web-api/src/main/webapp/dhis-web-case-api'
=== removed file 'dhis-2/dhis-web/dhis-web-api/src/main/webapp/dhis-web-case-api/main.vm'
=== modified file 'dhis-2/dhis-web/dhis-web-commons/src/main/resources/META-INF/dhis/beans.xml'
--- dhis-2/dhis-web/dhis-web-commons/src/main/resources/META-INF/dhis/beans.xml	2011-02-15 13:45:11 +0000
+++ dhis-2/dhis-web/dhis-web-commons/src/main/resources/META-INF/dhis/beans.xml	2011-02-21 10:32:35 +0000
@@ -297,7 +297,9 @@
         <sec:filter-chain pattern="/dhis-web-commons/security/**" filters="none"/>
         <sec:filter-chain pattern="/dhis-web-commons/javascripts/**" filters="none"/>
         <sec:filter-chain pattern="/dhis-web-commons/css/**" filters="none"/>
-        <sec:filter-chain pattern="/api/**/*" filters="httpSessionContextIntegrationFilter,basicAuthenticationRequiredFilter"/>
+<!--        <sec:filter-chain pattern="/api/**/*" filters="httpSessionContextIntegrationFilter,basicAuthenticationRequiredFilter"/>-->
+        <sec:filter-chain pattern="/api/**" filters="httpSessionContextIntegrationFilter,basicAuthenticationRequiredFilter"/>
+        <sec:filter-chain pattern="/api" filters="httpSessionContextIntegrationFilter,basicAuthenticationRequiredFilter"/>
         <sec:filter-chain pattern="/**" filters="httpSessionContextIntegrationFilter,authenticationProcessingFilter,logoutFilter,automaticAccessFilter,requiredLoginFilter"/>
         </sec:filter-chain-map>
     </bean>