← Back to team overview

dhis2-devs team mailing list archive

[Branch ~dhis2-devs-core/dhis2/trunk] Rev 13201: Implemented option for turning off preheating object-bridge cache maps. Can be turned off with /a...

 

------------------------------------------------------------
revno: 13201
committer: Morten Olav Hansen <mortenoh@xxxxxxxxx>
branch nick: dhis2
timestamp: Wed 2013-12-11 13:28:53 +0100
message:
  Implemented option for turning off preheating object-bridge cache maps. Can be turned off with /api/metaData?preheatCache=false, should only be used for imports where the number of objects is small (a performance boost of 50x-100x can be expected).
added:
  dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/timer/
  dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/timer/SystemNanoTimer.java
  dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/timer/Timer.java
modified:
  dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/metadata/DefaultImportService.java
  dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/metadata/DefaultObjectBridge.java
  dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/metadata/ImportOptions.java
  dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/metadata/ObjectBridge.java
  dhis-2/dhis-services/dhis-service-dxf2/src/test/java/org/hisp/dhis/dxf2/datavalueset/DataValueSetServiceTest.java
  dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/api/controller/PDFFormController.java
  dhis-2/dhis-web/dhis-web-importexport/src/main/java/org/hisp/dhis/importexport/action/datavalue/ImportDataValueAction.java


--
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
=== modified file 'dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/metadata/DefaultImportService.java'
--- dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/metadata/DefaultImportService.java	2013-10-14 14:38:11 +0000
+++ dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/metadata/DefaultImportService.java	2013-12-11 12:28:53 +0000
@@ -33,6 +33,8 @@
 import org.hibernate.SessionFactory;
 import org.hisp.dhis.cache.HibernateCacheManager;
 import org.hisp.dhis.common.IdentifiableObject;
+import org.hisp.dhis.dxf2.timer.SystemNanoTimer;
+import org.hisp.dhis.dxf2.timer.Timer;
 import org.hisp.dhis.scheduling.TaskId;
 import org.hisp.dhis.system.notification.NotificationLevel;
 import org.hisp.dhis.system.notification.Notifier;
@@ -41,7 +43,6 @@
 import org.hisp.dhis.user.UserService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Transactional;
-import org.springframework.util.Assert;
 import org.springframework.util.StringUtils;
 
 import java.util.ArrayList;
@@ -67,7 +68,7 @@
     // Dependencies
     //-------------------------------------------------------------------------------------------------------
 
-    @Autowired( required = false )
+    @Autowired(required = false)
     private Set<Importer> importerClasses = new HashSet<Importer>();
 
     @Autowired
@@ -116,16 +117,15 @@
         log.info( "User '" + username + "' started import at " + new Date() );
 
         notifier.clear( taskId ).notify( taskId, "Importing meta-data" );
+        Timer timer = new SystemNanoTimer();
+        timer.start();
 
         ImportSummary importSummary = new ImportSummary();
 
+        objectBridge.setWriteEnabled( !importOptions.isDryRun() );
+        objectBridge.setPreheatCache( importOptions.isPreheatCache() );
         objectBridge.init();
 
-        if ( importOptions.isDryRun() )
-        {
-            objectBridge.setWriteEnabled( false );
-        }
-
         for ( Map.Entry<Class<? extends IdentifiableObject>, String> entry : ExchangeClasses.getImportMap().entrySet() )
         {
             Object value = ReflectionUtils.invokeGetterMethod( entry.getValue(), metaData );
@@ -177,14 +177,16 @@
         cacheManager.clearCache();
         objectBridge.destroy();
 
+        timer.stop();
+
         if ( taskId != null )
         {
-            notifier.notify( taskId, NotificationLevel.INFO, "Import done", true ).
+            notifier.notify( taskId, NotificationLevel.INFO, "Import done. Completed in " + timer.toString() + ".", true ).
                 addTaskSummary( taskId, importSummary );
         }
         else
         {
-            log.info( "Import done." );
+            log.info( "Import done. Completed in " + timer.toString() + "." );
         }
 
         return importSummary;

=== modified file 'dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/metadata/DefaultObjectBridge.java'
--- dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/metadata/DefaultObjectBridge.java	2013-10-14 14:38:11 +0000
+++ dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/metadata/DefaultObjectBridge.java	2013-12-11 12:28:53 +0000
@@ -32,6 +32,8 @@
 import org.apache.commons.logging.LogFactory;
 import org.hisp.dhis.common.IdentifiableObject;
 import org.hisp.dhis.common.IdentifiableObjectManager;
+import org.hisp.dhis.dxf2.timer.SystemNanoTimer;
+import org.hisp.dhis.dxf2.timer.Timer;
 import org.hisp.dhis.period.PeriodStore;
 import org.hisp.dhis.period.PeriodType;
 import org.hisp.dhis.user.User;
@@ -41,7 +43,6 @@
 
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.Date;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
@@ -89,6 +90,8 @@
 
     private boolean writeEnabled = true;
 
+    private boolean preheatCache = true;
+
     //-------------------------------------------------------------------------------------------------------
     // Build maps
     //-------------------------------------------------------------------------------------------------------
@@ -107,7 +110,9 @@
     @Override
     public void init()
     {
-        log.info( "Started updating lookup maps at " + new Date() );
+        log.info( "Building object-bridge maps (preheatCache: " + preheatCache + ")." );
+        Timer timer = new SystemNanoTimer();
+        timer.start();
 
         masterMap = new HashMap<Class<?>, Set<?>>();
         periodTypeMap = new HashMap<String, PeriodType>();
@@ -127,7 +132,8 @@
             populateIdentifiableObjectMap( type, IdentifiableObject.IdentifiableProperty.NAME );
         }
 
-        log.info( "Finished updating lookup maps at " + new Date() );
+        timer.stop();
+        log.info( "Building object-bridge maps took " + timer.toString() + "." );
     }
 
     @Override
@@ -140,6 +146,7 @@
         periodTypeMap = null;
 
         writeEnabled = true;
+        preheatCache = true;
     }
 
     //-------------------------------------------------------------------------------------------------------
@@ -151,7 +158,7 @@
     {
         Set<IdentifiableObject> map = new HashSet<IdentifiableObject>();
 
-        if ( IdentifiableObject.class.isAssignableFrom( clazz ) )
+        if ( preheatCache && IdentifiableObject.class.isAssignableFrom( clazz ) )
         {
             map = new HashSet<IdentifiableObject>( manager.getAll( (Class<IdentifiableObject>) clazz ) );
         }
@@ -164,12 +171,12 @@
     {
         Map<String, IdentifiableObject> map = new HashMap<String, IdentifiableObject>();
 
-        if ( IdentifiableObject.class.isAssignableFrom( clazz ) )
+        if ( preheatCache && IdentifiableObject.class.isAssignableFrom( clazz ) )
         {
             map = (Map<String, IdentifiableObject>) manager.getIdMap( (Class<? extends IdentifiableObject>) clazz, property );
         }
 
-        if ( map != null )
+        if ( !preheatCache || map != null )
         {
             if ( property == IdentifiableObject.IdentifiableProperty.UID )
             {
@@ -181,34 +188,41 @@
             }
             else if ( property == IdentifiableObject.IdentifiableProperty.NAME )
             {
-                try
-                {
-                    IdentifiableObject identifiableObject = (IdentifiableObject) clazz.newInstance();
-
-                    if ( identifiableObject.haveUniqueNames() )
-                    {
-                        nameMap.put( (Class<? extends IdentifiableObject>) clazz, map );
-                    }
-                    else
-                    {
-                        // add an empty map here, since we could still have some auto-generated properties
-                        nameMap.put( (Class<? extends IdentifiableObject>) clazz, new HashMap<String, IdentifiableObject>() );
-
-                        // find all auto-generated props and add them
-                        for ( Map.Entry<String, IdentifiableObject> entry : map.entrySet() )
-                        {
-                            if ( entry.getValue().isAutoGenerated() )
+                if ( !preheatCache )
+                {
+                    nameMap.put( (Class<? extends IdentifiableObject>) clazz, map );
+                }
+                else
+                {
+                    try
+                    {
+                        IdentifiableObject identifiableObject = (IdentifiableObject) clazz.newInstance();
+
+                        if ( identifiableObject.haveUniqueNames() )
+                        {
+                            nameMap.put( (Class<? extends IdentifiableObject>) clazz, map );
+                        }
+                        else
+                        {
+                            // add an empty map here, since we could still have some auto-generated properties
+                            nameMap.put( (Class<? extends IdentifiableObject>) clazz, new HashMap<String, IdentifiableObject>() );
+
+                            // find all auto-generated props and add them
+                            for ( Map.Entry<String, IdentifiableObject> entry : map.entrySet() )
                             {
-                                nameMap.get( clazz ).put( entry.getKey(), entry.getValue() );
+                                if ( entry.getValue().isAutoGenerated() )
+                                {
+                                    nameMap.get( clazz ).put( entry.getKey(), entry.getValue() );
+                                }
                             }
                         }
                     }
-                }
-                catch ( InstantiationException ignored )
-                {
-                }
-                catch ( IllegalAccessException ignored )
-                {
+                    catch ( InstantiationException ignored )
+                    {
+                    }
+                    catch ( IllegalAccessException ignored )
+                    {
+                    }
                 }
             }
         }
@@ -349,6 +363,18 @@
         return writeEnabled;
     }
 
+    @Override
+    public void setPreheatCache( boolean enabled )
+    {
+        this.preheatCache = enabled;
+    }
+
+    @Override
+    public boolean isPreheatCache()
+    {
+        return preheatCache;
+    }
+
     //-------------------------------------------------------------------------------------------------------
     // Internal Methods
     //-------------------------------------------------------------------------------------------------------
@@ -468,37 +494,55 @@
     private IdentifiableObject getUidMatch( IdentifiableObject identifiableObject )
     {
         Map<String, IdentifiableObject> map = uidMap.get( identifiableObject.getClass() );
+        IdentifiableObject entity = null;
 
         if ( map != null )
         {
-            return map.get( identifiableObject.getUid() );
-        }
-
-        return null;
+            entity = map.get( identifiableObject.getUid() );
+        }
+
+        if ( !preheatCache && entity == null )
+        {
+            entity = manager.get( identifiableObject.getClass(), identifiableObject.getUid() );
+        }
+
+        return entity;
     }
 
     private IdentifiableObject getCodeMatch( IdentifiableObject identifiableObject )
     {
         Map<String, IdentifiableObject> map = codeMap.get( identifiableObject.getClass() );
+        IdentifiableObject entity = null;
 
         if ( map != null )
         {
-            return map.get( identifiableObject.getCode() );
-        }
-
-        return null;
+            entity = map.get( identifiableObject.getCode() );
+        }
+
+        if ( !preheatCache && entity == null )
+        {
+            entity = manager.getByCode( identifiableObject.getClass(), identifiableObject.getCode() );
+        }
+
+        return entity;
     }
 
     private IdentifiableObject getNameMatch( IdentifiableObject identifiableObject )
     {
         Map<String, IdentifiableObject> map = nameMap.get( identifiableObject.getClass() );
+        IdentifiableObject entity = null;
 
         if ( map != null )
         {
-            return map.get( identifiableObject.getName() );
-        }
-
-        return null;
+            entity = map.get( identifiableObject.getName() );
+        }
+
+        if ( !preheatCache && identifiableObject.haveUniqueNames() && entity == null )
+        {
+            entity = manager.getByName( identifiableObject.getClass(), identifiableObject.getName() );
+        }
+
+        return entity;
     }
 
     private boolean _typeSupported( Class<?> clazz )

=== modified file 'dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/metadata/ImportOptions.java'
--- dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/metadata/ImportOptions.java	2013-09-04 11:58:22 +0000
+++ dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/metadata/ImportOptions.java	2013-12-11 12:28:53 +0000
@@ -42,13 +42,15 @@
 
     private boolean dryRun;
 
+    private boolean preheatCache = true;
+
     private boolean async;
 
     private ImportStrategy importStrategy;
 
     private boolean skipExistingCheck;
 
-    private static final ImportOptions DEFAULT_OPTIONS = new ImportOptions( IdentifiableProperty.UID, IdentifiableProperty.UID, false, ImportStrategy.NEW_AND_UPDATES, false );
+    private static final ImportOptions DEFAULT_OPTIONS = new ImportOptions( IdentifiableProperty.UID, IdentifiableProperty.UID, false, true, ImportStrategy.NEW_AND_UPDATES, false );
 
     public static ImportOptions getDefaultImportOptions()
     {
@@ -64,10 +66,11 @@
         this.importStrategy = importStrategy;
     }
 
-    public ImportOptions( IdentifiableProperty dataElementIdScheme, IdentifiableProperty orgUnitIdScheme, boolean dryRun, ImportStrategy importStrategy, boolean skipExistingCheck )
+    public ImportOptions( IdentifiableProperty dataElementIdScheme, IdentifiableProperty orgUnitIdScheme, boolean dryRun, boolean preheatCache, ImportStrategy importStrategy, boolean skipExistingCheck )
     {
         this.dataElementIdScheme = dataElementIdScheme;
         this.orgUnitIdScheme = orgUnitIdScheme;
+        this.preheatCache = preheatCache;
         this.dryRun = dryRun;
         this.importStrategy = importStrategy;
         this.skipExistingCheck = skipExistingCheck;
@@ -92,6 +95,11 @@
         return dryRun;
     }
 
+    public boolean isPreheatCache()
+    {
+        return preheatCache;
+    }
+
     public ImportStrategy getImportStrategy()
     {
         return importStrategy != null ? importStrategy : ImportStrategy.NEW_AND_UPDATES;
@@ -121,6 +129,11 @@
         this.dryRun = dryRun;
     }
 
+    public void setPreheatCache( boolean preheatCache )
+    {
+        this.preheatCache = preheatCache;
+    }
+
     public boolean isAsync()
     {
         return async;

=== modified file 'dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/metadata/ObjectBridge.java'
--- dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/metadata/ObjectBridge.java	2013-08-23 16:05:01 +0000
+++ dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/metadata/ObjectBridge.java	2013-12-11 12:28:53 +0000
@@ -97,4 +97,19 @@
      * @return {@code boolean} indicating status of {@code writeEnabled}
      */
     boolean isWriteEnabled();
+
+    /**
+     * Enable or disable preheating the internal cache. This should be left on for most cases,
+     * but for very small imports (1-10 objects) turning this off will generally speed up import by a factor of 100.
+     *
+     * @param enabled {@code boolean} turning preheating on or off
+     */
+    void setPreheatCache( boolean enabled );
+
+    /**
+     * Is preheat cache enabled?
+     *
+     * @return {@code boolean} indicating status of {@code preheatCache}
+     */
+    boolean isPreheatCache();
 }

=== added directory 'dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/timer'
=== added file 'dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/timer/SystemNanoTimer.java'
--- dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/timer/SystemNanoTimer.java	1970-01-01 00:00:00 +0000
+++ dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/timer/SystemNanoTimer.java	2013-12-11 12:28:53 +0000
@@ -0,0 +1,66 @@
+package org.hisp.dhis.dxf2.timer;
+
+/*
+ * Copyright (c) 2004-2013, 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.concurrent.TimeUnit;
+
+/**
+ * @author Morten Olav Hansen <mortenoh@xxxxxxxxx>
+ */
+public class SystemNanoTimer implements Timer<Long>
+{
+    private long _start = 0;
+
+    private long _end = 0;
+
+    @Override
+    public void start()
+    {
+        _start = System.nanoTime();
+    }
+
+    @Override
+    public void stop()
+    {
+        _end = System.nanoTime();
+    }
+
+    @Override
+    public Long getDuration()
+    {
+        return _end - _start;
+    }
+
+    @Override
+    public String toString()
+    {
+        double seconds = TimeUnit.MILLISECONDS.convert( getDuration(), TimeUnit.NANOSECONDS ) / 1000.0f;
+        return String.format( "%.2f seconds", seconds );
+    }
+}

=== added file 'dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/timer/Timer.java'
--- dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/timer/Timer.java	1970-01-01 00:00:00 +0000
+++ dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/timer/Timer.java	2013-12-11 12:28:53 +0000
@@ -0,0 +1,43 @@
+package org.hisp.dhis.dxf2.timer;
+
+/*
+ * Copyright (c) 2004-2013, 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.
+ */
+
+/**
+ * Simple interface that captures time, and pretty prints it back to you
+ *
+ * @author Morten Olav Hansen <mortenoh@xxxxxxxxx>
+ */
+public interface Timer<T>
+{
+    void start();
+
+    void stop();
+
+    T getDuration();
+}

=== modified file 'dhis-2/dhis-services/dhis-service-dxf2/src/test/java/org/hisp/dhis/dxf2/datavalueset/DataValueSetServiceTest.java'
--- dhis-2/dhis-services/dhis-service-dxf2/src/test/java/org/hisp/dhis/dxf2/datavalueset/DataValueSetServiceTest.java	2013-08-23 16:05:01 +0000
+++ dhis-2/dhis-services/dhis-service-dxf2/src/test/java/org/hisp/dhis/dxf2/datavalueset/DataValueSetServiceTest.java	2013-12-11 12:28:53 +0000
@@ -179,7 +179,7 @@
     public void testImportDataValuesXmlWithCode()
         throws Exception
     {
-        ImportOptions options = new ImportOptions( CODE, CODE, false, NEW_AND_UPDATES, false );
+        ImportOptions options = new ImportOptions( CODE, CODE, false, true, NEW_AND_UPDATES, false );
         ImportSummary summary = dataValueSetService.saveDataValueSet( new ClassPathResource( "datavalueset/dataValueSetBcode.xml" ).getInputStream(), options );
         
         assertImportDataValues( summary );
@@ -222,7 +222,7 @@
     public void testImportDataValuesXmlDryRun()
         throws Exception
     {
-        ImportOptions options = new ImportOptions( UID, UID, true, NEW_AND_UPDATES, false );
+        ImportOptions options = new ImportOptions( UID, UID, true, true, NEW_AND_UPDATES, false );
         
         dataValueSetService.saveDataValueSet( new ClassPathResource( "datavalueset/dataValueSetB.xml" ).getInputStream(), options );
         
@@ -236,7 +236,7 @@
     public void testImportDataValuesXmlUpdatesOnly()
         throws Exception
     {
-        ImportOptions options = new ImportOptions( UID, UID, false, UPDATES, false );
+        ImportOptions options = new ImportOptions( UID, UID, false, true, UPDATES, false );
         
         dataValueSetService.saveDataValueSet( new ClassPathResource( "datavalueset/dataValueSetB.xml" ).getInputStream(), options );
         

=== modified file 'dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/api/controller/PDFFormController.java'
--- dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/api/controller/PDFFormController.java	2013-08-23 16:00:30 +0000
+++ dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/api/controller/PDFFormController.java	2013-12-11 12:28:53 +0000
@@ -164,7 +164,7 @@
         boolean dryRun = false;
         boolean skipExistingCheck = false;
         
-        ImportOptions options = new ImportOptions( dataElementIdScheme, orgUnitIdScheme, dryRun, strategy,
+        ImportOptions options = new ImportOptions( dataElementIdScheme, orgUnitIdScheme, dryRun, true, strategy,
             skipExistingCheck );
                 
         log.info( options );

=== modified file 'dhis-2/dhis-web/dhis-web-importexport/src/main/java/org/hisp/dhis/importexport/action/datavalue/ImportDataValueAction.java'
--- dhis-2/dhis-web/dhis-web-importexport/src/main/java/org/hisp/dhis/importexport/action/datavalue/ImportDataValueAction.java	2013-08-28 07:27:01 +0000
+++ dhis-2/dhis-web/dhis-web-importexport/src/main/java/org/hisp/dhis/importexport/action/datavalue/ImportDataValueAction.java	2013-12-11 12:28:53 +0000
@@ -145,7 +145,7 @@
 
         in = StreamUtils.wrapAndCheckCompressionFormat( in );
 
-        ImportOptions options = new ImportOptions( dataElementIdScheme, orgUnitIdScheme, dryRun, strategy, skipExistingCheck );
+        ImportOptions options = new ImportOptions( dataElementIdScheme, orgUnitIdScheme, dryRun, true, strategy, skipExistingCheck );
 
         log.info( options );