=== 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 + */ +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, List> 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, List> 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> 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 objects, ObjectBundle bundle ) + private void handleCreatesAndUpdates( Session session, List objects, ObjectBundle bundle ) { } - private void handleCreates( List objects, ObjectBundle bundle ) + private void handleCreates( Session session, List 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 objects, ObjectBundle bundle ) + private void handleUpdates( Session session, List 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 objects, ObjectBundle bundle ) + private void handleDeletes( Session session, List 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, List> 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, List> getObjects() { return objects;