← Back to team overview

dhis2-devs team mailing list archive

Re: Exception when importing User and User Role metadata in 2.24

 

Hi Lorill

Sorry for getting back to you on this so late, but I think this is fixed in
2.25+ now, could you have a look?

-- 
Morten Olav Hansen
Senior Engineer, DHIS 2
University of Oslo
http://www.dhis2.org

On Fri, Mar 31, 2017 at 11:31 PM, Lorill Crees <lcrees@xxxxxxxxxx> wrote:

> Hi there,
>
> In addition to the below import issues, now it seems that the passwords
> have not been imported correctly so nobody can log in. The password hashes
> in the old database are the same hashes that are contained in the password
> xml field in the exported file. However, when the file is imported into the
> system, the password hashes are not copied but are completely different in
> the user objects created.
>
> Is it the import process maybe taking a hash of the hash? Is this expected
> behaviour?
>
> In order to fix this I had to do a sql dump of the old user table, copy it
> to the new database, then do a join to update the passwords of the users in
> the new database.
>
> Do you have any advice here of what I should be doing to export users from
> one instance to populate a new empty instance, without having to do all
> these workarounds?
>
> Thanks,
>
> Lorill
>
> On Thu, Mar 30, 2017 at 2:20 PM, Lorill Crees <lcrees@xxxxxxxxxx> wrote:
>
>> Hi,
>>
>> I have tracked this down. In the User xml object, within the embedded
>> UserCredentials object, there is an embedded User object. It appears this
>> "user" object is meant to be the user that created the UserCredentials.
>>
>> In some of the entries, it is the user itself that is contained in the
>> embedded instance. In other entries, it contains a user that is elsewhere
>> in the xml file to be imported.
>>
>> In order to allow the import to run without exceptions, I need to either
>> delete this embedded user object, or change it to a user that already
>> exists in the system prior to the import.
>>
>> I basically have to delete all the embedded User objects, import the
>> file, then revert the deletion, and import the file again as an update.
>>
>> Below is an example of what is being exported.
>>
>> Is this expected behaviour? Is there any way that these cases can be
>> handled by the app, and not throw an exception? I am doing a straight
>> export from one instance to another, both of which are running the same
>> DHIS 2 version and build.
>>
>> Thanks,
>>
>> Lorill
>>
>>
>> <?xml version='1.0' encoding='UTF-8'?>
>> <metaData xmlns="http://dhis2.org/schema/dxf/2.0";
>> created="2017-03-30T20:22:15.342+0000">
>>     <users>
>>         <user name="xxx" created="2015-06-07T11:59:59.183+0000"
>> lastUpdated="2015-06-07T11:59:59.183+0000"
>>               id="UomqXpvKh8M">
>>             <externalAccess>false</externalAccess>
>>             <surname>xxx</surname>
>>             <firstName>xxx</firstName>
>>             <email>xxx@xxxxxxxxx</email>
>>             <userCredentials code="xxx" name="xxx"
>> created="2015-06-07T11:59:59.033+0000"
>>                              lastUpdated="2016-04-04T21:06:22.000+0000"
>> id="B8sCr5nOWro">
>>                 <externalAccess>false</externalAccess>
>> *                <user name="xxx" created="2015-06-07T11:59:59.183+0000"*
>> *                      lastUpdated="2015-06-07T11:59:59.183+0000"
>> id="UomqXpvKh8M">*
>> *                    <externalAccess>false</externalAccess>*
>> *                </user>*
>>                 <username>xxx</username>
>>                 <externalAuth>false</externalAuth>
>>                 <password>$2a$10$.nZpxupXABUpy
>> 3RNpAl.8uSg2OSsnZgxtSHKDTwjhTTPprSZ5W3vK</password>
>>                 <passwordLastUpdated>2015-06-0
>> 7T11:59:59.034+0000</passwordLastUpdated>
>>                 <lastLogin>2015-12-22T13:35:41.507+0000</lastLogin>
>>                 <selfRegistered>false</selfRegistered>
>>                 <invitation>false</invitation>
>>                 <disabled>false</disabled>
>>                 <userRoles>
>>                     <userRole name="Superuser"
>> created="2015-05-04T13:43:25.507+0000"
>>                               lastUpdated="2017-03-08T22:03:03.771+0000"
>> id="cjBTUmG9C9K">
>>                         <externalAccess>false</externalAccess>
>>                         <publicAccess>--------</publicAccess>
>>                         <user name="yyy" created="2015-05-29T06:54:42.0
>> 02+0000"
>>                               lastUpdated="2015-06-02T20:16:52.617+0000"
>> id="BcLOMAHqNDV">
>>                             <externalAccess>false</externalAccess>
>>                         </user>
>>                     </userRole>
>>                 </userRoles>
>>             </userCredentials>
>>             <organisationUnits>
>>                 <organisationUnit code="malawi" name="Malawi"
>> created="2013-06-10T18:34:22.000+0000"
>>                                   lastUpdated="2016-02-18T21:28:15.763+0000"
>> id="lZsCb6y0KDX">
>>                     <externalAccess>false</externalAccess>
>>                 </organisationUnit>
>>             </organisationUnits>
>>             <dataViewOrganisationUnits>
>>                 <dataViewOrganisationUnit code="malawi" name="Malawi"
>> created="2013-06-10T18:34:22.000+0000"
>>                                           lastUpdated="2016-02-18T21:28:15.763+0000"
>> id="lZsCb6y0KDX">
>>                     <externalAccess>false</externalAccess>
>>                 </dataViewOrganisationUnit>
>>             </dataViewOrganisationUnits>
>>         </user>
>>    </users>
>> </metaData>
>>
>> On Wed, Mar 29, 2017 at 1:42 AM, Marc Garnica <marcgarnica13@xxxxxxxxx>
>> wrote:
>>
>>> I assume you are not importing the user with which you are logged in,
>>> right? This might be the reason.. If not I don't have any clear idea.
>>>
>>> Marc Garnica
>>>
>>> 2017-03-29 0:56 GMT+02:00 Lorill Crees <lcrees@xxxxxxxxxx>:
>>>
>>>> Hi,
>>>>
>>>> I am attempting to set up a new empty 2.24 database and populate it
>>>> with an export of Org units and Users and User Roles from a different 2.24
>>>> database. I exported in xml format, with 2 separate export files for:
>>>>
>>>>    1. Org units / Org Unit Groups / Org Unit Group Sets / Org Unit
>>>>    Levels
>>>>    2. Users / User Groups / User Roles
>>>>
>>>>
>>>> I am able to import the org units just fine. However, when I attempt to
>>>> import the User/User Role xml file I get an exception and the metadata
>>>> import halts (stacktrace below).
>>>>
>>>> Both instances are running the exact same version of 2.24:
>>>>
>>>> Version:
>>>> 2.24
>>>> Build revision:
>>>> 294f578
>>>> Build date:
>>>> 2017-03-20 06:21
>>>>
>>>> Note that doing a dry run import shows successfully importing 19 users
>>>> and 2 UserRoles.
>>>>
>>>> Also note that doing the export and import via json has the same result.
>>>>
>>>> Any help resolving this would be appreciated.
>>>>
>>>> Thanks,
>>>>
>>>> Lorill
>>>>
>>>> * INFO  2017-03-28 15:20:37,221 [Level: INFO, category:
>>>> METADATA_IMPORT, time: Tue Mar 28 15:20:37 PDT 2017, message: Importing 19
>>>> Users] (InMemoryNotifier.java [taskScheduler-4])
>>>>
>>>> * INFO  2017-03-28 15:20:37,259 'admin' create org.hisp.dhis.user.User,
>>>> name: xxx, uid: spw11k0SXjJ (AuditLogUtil.java [taskScheduler-4])
>>>>
>>>> * INFO  2017-03-28 15:20:37,281 'admin' update org.hisp.dhis.user.User,
>>>> name: xxx, uid: spw11k0SXjJ (AuditLogUtil.java [taskScheduler-4])
>>>>
>>>> * INFO  2017-03-28 15:20:37,445 'admin' update org.hisp.dhis.user.User,
>>>> name: xxx, uid: spw11k0SXjJ (AuditLogUtil.java [taskScheduler-4])
>>>>
>>>> * ERROR 2017-03-28 15:20:37,460 Unexpected error occurred in scheduled
>>>> task. (TaskUtils.java [taskScheduler-4])
>>>>
>>>> org.hibernate.TransientObjectException: object references an unsaved
>>>> transient instance - save the transient instance before flushing:
>>>> org.hisp.dhis.user.User
>>>>
>>>> at org.hibernate.engine.internal.ForeignKeys.getEntityIdentifie
>>>> rIfNotUnsaved(ForeignKeys.java:279)
>>>>
>>>> at org.hibernate.type.EntityType.getIdentifier(EntityType.java:455)
>>>>
>>>> at org.hibernate.type.ManyToOneType.isDirty(ManyToOneType.java:281)
>>>>
>>>> at org.hibernate.type.ManyToOneType.isDirty(ManyToOneType.java:291)
>>>>
>>>> at org.hibernate.type.TypeHelper.findDirty(TypeHelper.java:296)
>>>>
>>>> at org.hibernate.persister.entity.AbstractEntityPersister.findD
>>>> irty(AbstractEntityPersister.java:4126)
>>>>
>>>> at org.hibernate.event.internal.DefaultFlushEntityEventListener
>>>> .dirtyCheck(DefaultFlushEntityEventListener.java:528)
>>>>
>>>> at org.hibernate.event.internal.DefaultFlushEntityEventListener
>>>> .isUpdateNecessary(DefaultFlushEntityEventListener.java:215)
>>>>
>>>> at org.hibernate.event.internal.DefaultFlushEntityEventListener
>>>> .onFlushEntity(DefaultFlushEntityEventListener.java:142)
>>>>
>>>> at org.hibernate.event.internal.AbstractFlushingEventListener.f
>>>> lushEntities(AbstractFlushingEventListener.java:216)
>>>>
>>>> at org.hibernate.event.internal.AbstractFlushingEventListener.f
>>>> lushEverythingToExecutions(AbstractFlushingEventListener.java:85)
>>>>
>>>> at org.hibernate.event.internal.DefaultAutoFlushEventListener.o
>>>> nAutoFlush(DefaultAutoFlushEventListener.java:44)
>>>>
>>>> at org.hibernate.internal.SessionImpl.autoFlushIfRequired(Sessi
>>>> onImpl.java:1264)
>>>>
>>>> at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1332)
>>>>
>>>> at org.hibernate.internal.QueryImpl.list(QueryImpl.java:87)
>>>>
>>>> at org.hibernate.internal.AbstractQueryImpl.uniqueResult(Abstra
>>>> ctQueryImpl.java:964)
>>>>
>>>> at org.hisp.dhis.user.hibernate.HibernateCurrentUserStore.getUs
>>>> erCredentialsByUsername(HibernateCurrentUserStore.java:55)
>>>>
>>>> at org.hisp.dhis.user.DefaultCurrentUserService.getCurrentUser(
>>>> DefaultCurrentUserService.java:93)
>>>>
>>>> at sun.reflect.GeneratedMethodAccessor92.invoke(Unknown Source)
>>>>
>>>> at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMe
>>>> thodAccessorImpl.java:43)
>>>>
>>>> at java.lang.reflect.Method.invoke(Method.java:483)
>>>>
>>>> at org.springframework.aop.support.AopUtils.invokeJoinpointUsin
>>>> gReflection(AopUtils.java:302)
>>>>
>>>> at org.springframework.aop.framework.ReflectiveMethodInvocation
>>>> .invokeJoinpoint(ReflectiveMethodInvocation.java:190)
>>>>
>>>> at org.springframework.aop.framework.ReflectiveMethodInvocation
>>>> .proceed(ReflectiveMethodInvocation.java:157)
>>>>
>>>> at org.springframework.transaction.interceptor.TransactionInter
>>>> ceptor$1.proceedWithInvocation(TransactionInterceptor.java:99)
>>>>
>>>> at org.springframework.transaction.interceptor.TransactionAspec
>>>> tSupport.invokeWithinTransaction(TransactionAspectSupport.java:281)
>>>>
>>>> at org.springframework.transaction.interceptor.TransactionInter
>>>> ceptor.invoke(TransactionInterceptor.java:96)
>>>>
>>>> at org.springframework.aop.framework.ReflectiveMethodInvocation
>>>> .proceed(ReflectiveMethodInvocation.java:179)
>>>>
>>>> at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(
>>>> JdkDynamicAopProxy.java:208)
>>>>
>>>> at com.sun.proxy.$Proxy54.getCurrentUser(Unknown Source)
>>>>
>>>> at org.hisp.dhis.hibernate.HibernateGenericStore.getSharingCrit
>>>> eria(HibernateGenericStore.java:208)
>>>>
>>>> at org.hisp.dhis.hibernate.HibernateGenericStore.getSharingCrit
>>>> eria(HibernateGenericStore.java:202)
>>>>
>>>> at org.hisp.dhis.hibernate.HibernateGenericStore.getSharingCrit
>>>> eria(HibernateGenericStore.java:287)
>>>>
>>>> at org.hisp.dhis.hibernate.HibernateGenericStore.getSharingObje
>>>> ct(HibernateGenericStore.java:319)
>>>>
>>>> at org.hisp.dhis.common.hibernate.HibernateIdentifiableObjectSt
>>>> ore.getByUid(HibernateIdentifiableObjectStore.java:108)
>>>>
>>>> at org.hisp.dhis.common.hibernate.HibernateIdentifiableObjectSt
>>>> ore.getByUid(HibernateIdentifiableObjectStore.java:58)
>>>>
>>>> at org.hisp.dhis.common.DefaultIdentifiableObjectManager.get(De
>>>> faultIdentifiableObjectManager.java:244)
>>>>
>>>> at sun.reflect.GeneratedMethodAccessor465.invoke(Unknown Source)
>>>>
>>>> at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMe
>>>> thodAccessorImpl.java:43)
>>>>
>>>> at java.lang.reflect.Method.invoke(Method.java:483)
>>>>
>>>> at org.springframework.aop.support.AopUtils.invokeJoinpointUsin
>>>> gReflection(AopUtils.java:302)
>>>>
>>>> at org.springframework.aop.framework.ReflectiveMethodInvocation
>>>> .invokeJoinpoint(ReflectiveMethodInvocation.java:190)
>>>>
>>>> at org.springframework.aop.framework.ReflectiveMethodInvocation
>>>> .proceed(ReflectiveMethodInvocation.java:157)
>>>>
>>>> at org.springframework.transaction.interceptor.TransactionInter
>>>> ceptor$1.proceedWithInvocation(TransactionInterceptor.java:99)
>>>>
>>>> at org.springframework.transaction.interceptor.TransactionAspec
>>>> tSupport.invokeWithinTransaction(TransactionAspectSupport.java:281)
>>>>
>>>> at org.springframework.transaction.interceptor.TransactionInter
>>>> ceptor.invoke(TransactionInterceptor.java:96)
>>>>
>>>> at org.springframework.aop.framework.ReflectiveMethodInvocation
>>>> .proceed(ReflectiveMethodInvocation.java:179)
>>>>
>>>> at org.springframework.aop.interceptor.ExposeInvocationIntercep
>>>> tor.invoke(ExposeInvocationInterceptor.java:92)
>>>>
>>>> at org.springframework.aop.framework.ReflectiveMethodInvocation
>>>> .proceed(ReflectiveMethodInvocation.java:179)
>>>>
>>>> at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(
>>>> JdkDynamicAopProxy.java:208)
>>>>
>>>> at com.sun.proxy.$Proxy68.get(Unknown Source)
>>>>
>>>> at org.hisp.dhis.dxf2.metadata.DefaultObjectBridge.getUidMatch(
>>>> DefaultObjectBridge.java:723)
>>>>
>>>> at org.hisp.dhis.dxf2.metadata.DefaultObjectBridge.findMatches(
>>>> DefaultObjectBridge.java:527)
>>>>
>>>> at org.hisp.dhis.dxf2.metadata.DefaultObjectBridge.getObjects(D
>>>> efaultObjectBridge.java:422)
>>>>
>>>> at org.hisp.dhis.dxf2.metadata.importers.DefaultIdentifiableObj
>>>> ectImporter.validateIdentifiableObject(DefaultIdentifiableOb
>>>> jectImporter.java:690)
>>>>
>>>> at org.hisp.dhis.dxf2.metadata.importers.DefaultIdentifiableObj
>>>> ectImporter.importObjectLocal(DefaultIdentifiableObjectImpor
>>>> ter.java:566)
>>>>
>>>> at org.hisp.dhis.dxf2.metadata.importers.DefaultIdentifiableObj
>>>> ectImporter.importObjects(DefaultIdentifiableObjectImporter.java:191)
>>>>
>>>> at org.hisp.dhis.dxf2.metadata.DefaultImportService.doImport(De
>>>> faultImportService.java:261)
>>>>
>>>> at org.hisp.dhis.dxf2.metadata.DefaultImportService.importMetaD
>>>> ata(DefaultImportService.java:177)
>>>>
>>>> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>>>>
>>>> at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAcce
>>>> ssorImpl.java:62)
>>>>
>>>> at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMe
>>>> thodAccessorImpl.java:43)
>>>>
>>>> at java.lang.reflect.Method.invoke(Method.java:483)
>>>>
>>>> at org.springframework.aop.support.AopUtils.invokeJoinpointUsin
>>>> gReflection(AopUtils.java:302)
>>>>
>>>> at org.springframework.aop.framework.ReflectiveMethodInvocation
>>>> .invokeJoinpoint(ReflectiveMethodInvocation.java:190)
>>>>
>>>> at org.springframework.aop.framework.ReflectiveMethodInvocation
>>>> .proceed(ReflectiveMethodInvocation.java:157)
>>>>
>>>> at org.springframework.transaction.interceptor.TransactionInter
>>>> ceptor$1.proceedWithInvocation(TransactionInterceptor.java:99)
>>>>
>>>> at org.springframework.transaction.interceptor.TransactionAspec
>>>> tSupport.invokeWithinTransaction(TransactionAspectSupport.java:281)
>>>>
>>>> at org.springframework.transaction.interceptor.TransactionInter
>>>> ceptor.invoke(TransactionInterceptor.java:96)
>>>>
>>>> at org.springframework.aop.framework.ReflectiveMethodInvocation
>>>> .proceed(ReflectiveMethodInvocation.java:179)
>>>>
>>>> at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(
>>>> JdkDynamicAopProxy.java:208)
>>>>
>>>> at com.sun.proxy.$Proxy241.importMetaData(Unknown Source)
>>>>
>>>> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>>>>
>>>> at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAcce
>>>> ssorImpl.java:62)
>>>>
>>>> at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMe
>>>> thodAccessorImpl.java:43)
>>>>
>>>> at java.lang.reflect.Method.invoke(Method.java:483)
>>>>
>>>> at org.springframework.aop.support.AopUtils.invokeJoinpointUsin
>>>> gReflection(AopUtils.java:302)
>>>>
>>>> at org.springframework.aop.framework.ReflectiveMethodInvocation
>>>> .invokeJoinpoint(ReflectiveMethodInvocation.java:190)
>>>>
>>>> at org.springframework.aop.framework.ReflectiveMethodInvocation
>>>> .proceed(ReflectiveMethodInvocation.java:157)
>>>>
>>>> at org.springframework.aop.support.DelegatingIntroductionInterc
>>>> eptor.doProceed(DelegatingIntroductionInterceptor.java:133)
>>>>
>>>> at org.springframework.aop.support.DelegatingIntroductionInterc
>>>> eptor.invoke(DelegatingIntroductionInterceptor.java:121)
>>>>
>>>> at org.springframework.aop.framework.ReflectiveMethodInvocation
>>>> .proceed(ReflectiveMethodInvocation.java:179)
>>>>
>>>> at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(
>>>> JdkDynamicAopProxy.java:208)
>>>>
>>>> at com.sun.proxy.$Proxy193.importMetaData(Unknown Source)
>>>>
>>>> at org.hisp.dhis.importexport.action.util.ImportMetaDataTask.ca
>>>> ll(ImportMetaDataTask.java:103)
>>>>
>>>> at org.hisp.dhis.security.SecurityContextRunnable.run(SecurityC
>>>> ontextRunnable.java:57)
>>>>
>>>> at org.springframework.scheduling.support.DelegatingErrorHandli
>>>> ngRunnable.run(DelegatingErrorHandlingRunnable.java:54)
>>>>
>>>> at java.util.concurrent.Executors$RunnableAdapter.call(Executor
>>>> s.java:511)
>>>>
>>>> at java.util.concurrent.FutureTask.run(FutureTask.java:266)
>>>>
>>>> at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFu
>>>> tureTask.access$201(ScheduledThreadPoolExecutor.java:180)
>>>>
>>>> at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFu
>>>> tureTask.run(ScheduledThreadPoolExecutor.java:293)
>>>>
>>>> at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPool
>>>> Executor.java:1142)
>>>>
>>>> at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoo
>>>> lExecutor.java:617)
>>>>
>>>> at java.lang.Thread.run(Thread.java:745)
>>>> --
>>>> Lorill Crees
>>>> Project Leader / Senior Developer
>>>> 2Paths Solutions Ltd. <http://www.2paths.com>
>>>>
>>>> lcrees@xxxxxxxxxx
>>>> skype: lorill2paths
>>>> (604) 689-4123 x 15 <(604)%20689-4123>
>>>>
>>>> _______________________________________________
>>>> Mailing list: https://launchpad.net/~dhis2-devs
>>>> Post to     : dhis2-devs@xxxxxxxxxxxxxxxxxxx
>>>> Unsubscribe : https://launchpad.net/~dhis2-devs
>>>> More help   : https://help.launchpad.net/ListHelp
>>>>
>>>>
>>>
>>
>>
>> --
>> Lorill Crees
>> Project Leader / Senior Developer
>> 2Paths Solutions Ltd. <http://www.2paths.com>
>>
>> lcrees@xxxxxxxxxx
>> skype: lorill2paths
>> (604) 689-4123 x 15 <(604)%20689-4123>
>>
>
>
>
> --
> Lorill Crees
> Project Leader / Senior Developer
> 2Paths Solutions Ltd. <http://www.2paths.com>
>
> lcrees@xxxxxxxxxx
> skype: lorill2paths
> (604) 689-4123 x 15
>
> _______________________________________________
> Mailing list: https://launchpad.net/~dhis2-devs
> Post to     : dhis2-devs@xxxxxxxxxxxxxxxxxxx
> Unsubscribe : https://launchpad.net/~dhis2-devs
> More help   : https://help.launchpad.net/ListHelp
>
>

References