← Back to team overview

dhis2-devs team mailing list archive

[Branch ~dhis2-devs-core/dhis2/trunk] Rev 22234: Add FlushMmode to dxf2 importer, can be used to decide when hibernate flush occurs (OBJECT mode i...

 

------------------------------------------------------------
revno: 22234
committer: Morten Olav Hansen <morten@xxxxxxxxx>
branch nick: dhis2
timestamp: Thu 2016-03-10 18:35:51 +0700
message:
  Add FlushMmode to dxf2 importer, can be used to decide when hibernate flush occurs (OBJECT mode is useful for finding issues with metadata, as exceptions usually occur on flush). Also adds ATOMIC_* import modes, which will only commit the object bundle if there are no validation errors
added:
  dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/metadata2/FlushMode.java
modified:
  dhis-2/dhis-api/src/main/java/org/hisp/dhis/importexport/ImportStrategy.java
  dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/metadata2/DefaultMetadataImportService.java
  dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/metadata2/MetadataImportParams.java
  dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/metadata2/objectbundle/DefaultObjectBundleService.java
  dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/metadata2/objectbundle/ObjectBundle.java
  dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/metadata2/objectbundle/ObjectBundleParams.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-api/src/main/java/org/hisp/dhis/importexport/ImportStrategy.java'
--- dhis-2/dhis-api/src/main/java/org/hisp/dhis/importexport/ImportStrategy.java	2016-01-04 02:27:49 +0000
+++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/importexport/ImportStrategy.java	2016-03-10 11:35:51 +0000
@@ -38,6 +38,11 @@
     CREATE_AND_UPDATE,
     DELETE,
 
+    ATOMIC_CREATE,
+    ATOMIC_UPDATE,
+    ATOMIC_CREATE_AND_UPDATE,
+    ATOMIC_DELETE,
+
     NEW_AND_UPDATES,
     NEW,
     UPDATES,
@@ -62,4 +67,9 @@
     {
         return this == DELETE || this == DELETES;
     }
+
+    public boolean isAtomic()
+    {
+        return this == ATOMIC_CREATE_AND_UPDATE || this == ATOMIC_UPDATE || this == ATOMIC_CREATE || this == ATOMIC_DELETE;
+    }
 }

=== modified file 'dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/metadata2/DefaultMetadataImportService.java'
--- dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/metadata2/DefaultMetadataImportService.java	2016-03-10 11:11:14 +0000
+++ dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/metadata2/DefaultMetadataImportService.java	2016-03-10 11:35:51 +0000
@@ -76,7 +76,10 @@
         ObjectBundleValidation validation = objectBundleService.validate( bundle );
         report.setObjectErrorReports( validation.getObjectErrorReportsMap() );
 
-        objectBundleService.commit( bundle );
+        if ( !(bundleParams.getImportMode().isAtomic() && !validation.getObjectErrorReportsMap().isEmpty()) )
+        {
+            objectBundleService.commit( bundle );
+        }
 
         return report;
     }
@@ -90,6 +93,7 @@
         params.setPreheatIdentifier( getEnumWithDefault( PreheatIdentifier.class, parameters, "preheatIdentifier", PreheatIdentifier.UID ) );
         params.setImportMode( getEnumWithDefault( ImportStrategy.class, parameters, "importMode", ImportStrategy.CREATE_AND_UPDATE ) );
         params.setMergeMode( getEnumWithDefault( MergeMode.class, parameters, "mergeMode", MergeMode.MERGE ) );
+        params.setFlushMode( getEnumWithDefault( FlushMode.class, parameters, "flushMode", FlushMode.OBJECTS ) );
 
         return params;
     }

=== added file 'dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/metadata2/FlushMode.java'
--- dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/metadata2/FlushMode.java	1970-01-01 00:00:00 +0000
+++ dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/metadata2/FlushMode.java	2016-03-10 11:35:51 +0000
@@ -0,0 +1,55 @@
+package org.hisp.dhis.dxf2.metadata2;
+
+/*
+ * Copyright (c) 2004-2016, 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.
+ */
+
+/**
+ * @author Morten Olav Hansen <mortenoh@xxxxxxxxx>
+ */
+public enum FlushMode
+{
+    /**
+     * Flush for every db write (create, update)
+     */
+    OBJECT,
+
+    /**
+     * Flush when done with all db writes for a class type
+     */
+    OBJECTS,
+
+    /**
+     * Flush when import is done
+     */
+    DONE,
+
+    /**
+     * Don't flush (not recommended)
+     */
+    NONE
+}

=== modified file 'dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/metadata2/MetadataImportParams.java'
--- dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/metadata2/MetadataImportParams.java	2016-03-04 08:58:53 +0000
+++ dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/metadata2/MetadataImportParams.java	2016-03-10 11:35:51 +0000
@@ -60,6 +60,8 @@
 
     private MergeMode mergeMode = MergeMode.MERGE;
 
+    private FlushMode flushMode = FlushMode.OBJECTS;
+
     private Map<Class<? extends IdentifiableObject>, List<IdentifiableObject>> objects = new HashMap<>();
 
     public MetadataImportParams()
@@ -126,6 +128,16 @@
         this.mergeMode = mergeMode;
     }
 
+    public FlushMode getFlushMode()
+    {
+        return flushMode;
+    }
+
+    public void setFlushMode( FlushMode flushMode )
+    {
+        this.flushMode = flushMode;
+    }
+
     public Map<Class<? extends IdentifiableObject>, List<IdentifiableObject>> getObjects()
     {
         return objects;
@@ -181,6 +193,7 @@
         params.setPreheatMode( preheatMode );
         params.setObjectBundleMode( objectBundleMode );
         params.setMergeMode( mergeMode );
+        params.setFlushMode( flushMode );
 
         return params;
     }

=== modified file 'dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/metadata2/objectbundle/DefaultObjectBundleService.java'
--- dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/metadata2/objectbundle/DefaultObjectBundleService.java	2016-03-10 06:38:17 +0000
+++ dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/metadata2/objectbundle/DefaultObjectBundleService.java	2016-03-10 11:35:51 +0000
@@ -30,12 +30,14 @@
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+import org.hibernate.Session;
 import org.hibernate.SessionFactory;
 import org.hisp.dhis.common.BaseIdentifiableObject;
 import org.hisp.dhis.common.CodeGenerator;
 import org.hisp.dhis.common.IdentifiableObject;
 import org.hisp.dhis.common.IdentifiableObjectManager;
 import org.hisp.dhis.dbms.DbmsManager;
+import org.hisp.dhis.dxf2.metadata2.FlushMode;
 import org.hisp.dhis.dxf2.metadata2.objectbundle.hooks.ObjectBundleHook;
 import org.hisp.dhis.feedback.ErrorCode;
 import org.hisp.dhis.feedback.ErrorReport;
@@ -266,6 +268,7 @@
         }
 
         List<Class<? extends IdentifiableObject>> klasses = getSortedClasses( bundle );
+        Session session = sessionFactory.getCurrentSession();
 
         objectBundleHooks.forEach( hook -> hook.preImport( bundle ) );
 
@@ -281,46 +284,53 @@
             switch ( bundle.getImportMode() )
             {
                 case CREATE_AND_UPDATE:
+                case ATOMIC_CREATE_AND_UPDATE:
                 case NEW_AND_UPDATES:
                 {
-                    handleCreatesAndUpdates( objects, bundle );
+                    handleCreatesAndUpdates( session, objects, bundle );
                     break;
                 }
                 case CREATE:
+                case ATOMIC_CREATE:
                 case NEW:
                 {
-                    handleCreates( objects, bundle );
+                    handleCreates( session, objects, bundle );
                     break;
                 }
                 case UPDATE:
+                case ATOMIC_UPDATE:
                 case UPDATES:
                 {
-                    handleUpdates( objects, bundle );
+                    handleUpdates( session, objects, bundle );
                     break;
                 }
                 case DELETE:
+                case ATOMIC_DELETE:
                 case DELETES:
                 {
-                    handleDeletes( objects, bundle );
+                    handleDeletes( session, objects, bundle );
                     break;
                 }
             }
-
-            sessionFactory.getCurrentSession().flush();
         }
 
         objectBundleHooks.forEach( hook -> hook.postImport( bundle ) );
 
+        if ( FlushMode.DONE == bundle.getFlushMode() )
+        {
+            session.flush();
+        }
+
         dbmsManager.clearSession();
         bundle.setObjectBundleStatus( ObjectBundleStatus.COMMITTED );
     }
 
-    private void handleCreatesAndUpdates( List<IdentifiableObject> objects, ObjectBundle bundle )
+    private void handleCreatesAndUpdates( Session session, List<IdentifiableObject> objects, ObjectBundle bundle )
     {
 
     }
 
-    private void handleCreates( List<IdentifiableObject> objects, ObjectBundle bundle )
+    private void handleCreates( Session session, List<IdentifiableObject> objects, ObjectBundle bundle )
     {
         log.info( "Creating " + objects.size() + " object(s) of type " + objects.get( 0 ).getClass().getSimpleName() );
 
@@ -342,10 +352,14 @@
                 String msg = "Created object '" + bundle.getPreheatIdentifier().getIdentifiersWithName( object ) + "'";
                 log.debug( msg );
             }
+
+            if ( FlushMode.OBJECT == bundle.getFlushMode() ) session.flush();
         }
+
+        if ( FlushMode.OBJECTS == bundle.getFlushMode() ) session.flush();
     }
 
-    private void handleUpdates( List<IdentifiableObject> objects, ObjectBundle bundle )
+    private void handleUpdates( Session session, List<IdentifiableObject> objects, ObjectBundle bundle )
     {
         log.info( "Updating " + objects.size() + " object(s) of type " + objects.get( 0 ).getClass().getSimpleName() );
 
@@ -371,10 +385,14 @@
                 String msg = "Updated object '" + bundle.getPreheatIdentifier().getIdentifiersWithName( persistedObject ) + "'";
                 log.debug( msg );
             }
+
+            if ( FlushMode.OBJECT == bundle.getFlushMode() ) session.flush();
         }
+
+        if ( FlushMode.OBJECTS == bundle.getFlushMode() ) session.flush();
     }
 
-    private void handleDeletes( List<IdentifiableObject> objects, ObjectBundle bundle )
+    private void handleDeletes( Session session, List<IdentifiableObject> objects, ObjectBundle bundle )
     {
         log.info( "Deleting " + objects.size() + " object(s) of type " + objects.get( 0 ).getClass().getSimpleName() );
 
@@ -392,7 +410,11 @@
                 String msg = "Deleted object '" + bundle.getPreheatIdentifier().getIdentifiersWithName( object ) + "'";
                 log.debug( msg );
             }
+
+            if ( FlushMode.OBJECT == bundle.getFlushMode() ) session.flush();
         }
+
+        if ( FlushMode.OBJECTS == bundle.getFlushMode() ) session.flush();
     }
 
     @SuppressWarnings( "unchecked" )

=== modified file 'dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/metadata2/objectbundle/ObjectBundle.java'
--- dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/metadata2/objectbundle/ObjectBundle.java	2016-03-09 07:55:01 +0000
+++ dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/metadata2/objectbundle/ObjectBundle.java	2016-03-10 11:35:51 +0000
@@ -30,6 +30,7 @@
 
 import org.hisp.dhis.common.IdentifiableObject;
 import org.hisp.dhis.common.MergeMode;
+import org.hisp.dhis.dxf2.metadata2.FlushMode;
 import org.hisp.dhis.importexport.ImportStrategy;
 import org.hisp.dhis.preheat.Preheat;
 import org.hisp.dhis.preheat.PreheatIdentifier;
@@ -58,6 +59,8 @@
 
     private final MergeMode mergeMode;
 
+    private final FlushMode flushMode;
+
     private ObjectBundleStatus objectBundleStatus = ObjectBundleStatus.CREATED;
 
     private Preheat preheat = new Preheat();
@@ -74,6 +77,7 @@
         this.importMode = params.getImportMode();
         this.preheatMode = params.getPreheatMode();
         this.mergeMode = params.getMergeMode();
+        this.flushMode = params.getFlushMode();
     }
 
     public User getUser()
@@ -106,6 +110,11 @@
         return mergeMode;
     }
 
+    public FlushMode getFlushMode()
+    {
+        return flushMode;
+    }
+
     public ObjectBundleStatus getObjectBundleStatus()
     {
         return objectBundleStatus;

=== modified file 'dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/metadata2/objectbundle/ObjectBundleParams.java'
--- dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/metadata2/objectbundle/ObjectBundleParams.java	2016-03-10 11:11:14 +0000
+++ dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/metadata2/objectbundle/ObjectBundleParams.java	2016-03-10 11:35:51 +0000
@@ -31,6 +31,7 @@
 import com.google.common.base.MoreObjects;
 import org.hisp.dhis.common.IdentifiableObject;
 import org.hisp.dhis.common.MergeMode;
+import org.hisp.dhis.dxf2.metadata2.FlushMode;
 import org.hisp.dhis.importexport.ImportStrategy;
 import org.hisp.dhis.preheat.PreheatIdentifier;
 import org.hisp.dhis.preheat.PreheatMode;
@@ -59,6 +60,8 @@
 
     private MergeMode mergeMode = MergeMode.MERGE;
 
+    private FlushMode flushMode = FlushMode.OBJECTS;
+
     private Map<Class<? extends IdentifiableObject>, List<IdentifiableObject>> objects = new HashMap<>();
 
     public ObjectBundleParams()
@@ -128,6 +131,16 @@
         this.mergeMode = mergeMode;
     }
 
+    public FlushMode getFlushMode()
+    {
+        return flushMode;
+    }
+
+    public void setFlushMode( FlushMode flushMode )
+    {
+        this.flushMode = flushMode;
+    }
+
     public Map<Class<? extends IdentifiableObject>, List<IdentifiableObject>> getObjects()
     {
         return objects;