Haiti Metadata Module

Moving from email… @mogoodrich, @mseaton

I agree that this module should be put in the openmrs org. We’re deploying against the latest version of the platform and reference application. What version of the platform should be targeted for this module?

We have a few items that are ready to be added to a metadata module:

  • Patient identifier types from legacy iSante
  • Person attributes
  • Location attributes (so we can communicate with the Master Facility List in the HIE)

Can we work to match these one-by-one?

Craig

FYI - @jamesfeshner, @guerschon, @jmaxy

Thanks @craigappl.

Great… I’ve got a skeleton created, so I will go ahead and create a repo on OpenMRS for this.

We are still running 1.10.x, so the module would have to support that. I’ve added 1.10.4 as the minimum required OpenMRS version in the module. Of course, we’d have t confirm that it still works with the latest version of the platform as well. I don’t think this will be problem, though–or, at least as first, for simple metadata deployment.

Yes, let’s look at standardizing and matching our metadata, and getting something in the Haiti Core module as a proof of concept.

For Patient Identifiers, it looks like we have 7 in our system:

ZL EMR ID – our main Zamni Lasante identifier; this should be unique across all our OpenMRS instances, and (ideally) each patient should only end up with one

Dossier Number – the number on a patient’s paper record in a clinic. Sequential, and each clinic has it’s own sequential set of numbers, with a unique prefix (ie A00001, A00002, etc). Because of the prefix, this ID should be unique across the entire ZL system, but we don’t 100% guarantee this.

External Dossier Number – I don’t 100% remember what this one does, but I believe it is used to store dossier numbers from another another ZL EMR instance. For instance, if we import a patient from our Lacolline system into Mirebalais, their Lacolline dossier number would be stored as a “external dossier number” and a new dossier number for Mirebalais would be stored as “dossier number”. This was something we set up awhile back for a quick-and-dirty import, and is not necesarily the path we’d want to take as we increase the data sharing between systems.

HIVEMR V1 – the identifier of a patient in our legacy (pre OpenMRS) HIV system

User Entered Reference Number – something we added for our Mental Health system; kind of a hack, a general-purpose place to store a number entered by the user.

Biometrics Reference Code – something we created for a spike we did on adding fingerprint functionality. I don’t think we currently use this, so this could be removed/changed.

Dental Dossier Number – I forget the exact use case for this, but I believe it was something our Dental team asked for and I believe it is manually entered.

Thoughts on what we might want to share? I’m thinking we might want to share the identifier types for our “main” identifiers in each system–ie, ZL EMR ID, HIV EMR ID, legacy eSante ID, new eSante Plus ID? We’d probably want a shared identifier type for biometrics, but we don’t necessarily need to use the one we have defined.

I could be able to easily add a bundle with a couple of these identifier types to “Haiti Identifier Bundle” to the new Haiti Core module, and then you could add your identifiers. Thoughts?

I’ll start looking at Person Attributes and Location Attributes and post a follow-on message about what we’ve go there.

Take care, Mark

@mogoodrich is correct as usual. Thanks for your description.

Just to clarify, the Dental Dossier Numbers were recorded at the Lacolline Health Center in the previous OpenMRS system. We find that a single health facility will have multiple archive rooms and dossier numbers – dental, hiv, primary care, women’s health, etc. It’s helpful to be able to capture this information as to minimize duplicate patients and keep all their records connected.

Thanks @mogoodrich

Here’s what we currently have in iSanté that we need to transfer to iSantéPlus:

Haiti NationalID - This is constructed based upon patient demographics : first last patient initials, month year of birth, mother’s first initial clinicPatientID - This is a clinic-assigned sequential number for HIV patients, usually prefixed with ST-. iSante PatientID - This is an auto-generated incremental key prefixed with the clinic’s sitecode. Because of the prefix, this can be regarded as a globally unique value within Haiti. patGuid - This is an auto-generated globally unique UUID. obgynID - This is a clinic-assigned number for ob-gyn patients. Not globally unique. primCareID - This is a clinic-assigned number for primary care patients. Not globally unique.

We will also be collecting a local fingerprint identifier in the future and a master patient ID. We’re working out the details on those identifiers.

I believe that the iSante PatientID maps to your ZL EMR ID. I think we should have some type of a Master Patient ID in the metadata fields that map to the MPI and some biometric patient id that maps to the national fingerprint server.

Person Attributes in iSantePlus

Hi Again,

Here are the fields we’re collecting as person attributes:

Birthplace(string): Location of person’s birth Civil Status(string): Marriage status of the person Occupation(string): Patient’s occupation

Emergency Contact name(string) Emergency Contact relation(string) Address of Emergency Contact(string) Phone of Emergency Contact (string)

First person responsible name (string): This is for patient caregivers. First person responsible relationship (string): Relationship to the patient First person responsible address (string): The address of the first person responsible First person responsible phone (string): The phone number of the first person responsible

Second person responsible name (string): This is for patient caregivers. Second person responsible relationship (string): Relationship to the patient Second person responsible address (string): The address of the second person responsible Second person responsible phone (string): The phone number of the second person responsible

Name of person authorized to make medical decisions for the patient (string) Address of person authorized to make medical decisions for the patient (string) Phone number of person authorized to make medical decisions for the patient (string)

I should also note that this builds off of the fields that are loaded in from the reference application: Telephone number Unknown patient flag Test patient

Looks like we only have the following 5 person attributes:

TELEPHONE_NUMBER TEST_PATIENT UNKNOWN_PATIENT MOTHERS_FIRST_NAME PROVIDER_IDENTIFIER

The first three seem the same as the three provided by the reference application (although we use most of the reference application modules, we don’t directly install its metadata). Mother’s first name is self-explanatory. Provider identifier is an identifier we assign to all of our providers, primarily for integration with out PACS system. This seems something that could stay ZL-specific for now.

We actually collect birthplace, civil status, occupation, and the four emergency contact fields using obs. We also collect religion (specifically requested by the ZL team) that way as well. We aren’t currently collecting first person responsible, second person responsible, and person authorized to make medical decisions, but if we added them we’d be likely to add them as obs as well. I don’t know if there’s be any interest/ability on your part to switch to modelling you data that way? I’ll look into digging up the actual concept bundles that we use.

Take care, Mark

Craig,

I’ve gotten the basic Haiti Core module set up and configured within our build pipeline. Right now it doesn’t do too much useful–just installs these four person attributes:

  • Telephone Number
  • Unknown Patient
  • Test Patient
  • Mother’s First Name

When you get a chance, it would be great if you could incorporate it into your pipeline, or at least confirm that you can add it to the eSante Plus set of modules and everything starts properly. We are running OpenMRS 1.10.x, so I have not tested it with anything but that yet.

Once we confirm everything works, we can start added new metadata (and perhaps functionality) we want to share to this module, and we also can look into migration other metadata from our PIH Core module to this module.

The module can be found here:

Take care, Mark

@craigappl @jamesfeshner @guerschon @jmaxy

Thanks Mark,

I just got back from 10 days of travel and will review this soon.

Craig

Hi @mogoodrich,

It looks like I’ll need to add a dependency to emrapi-api-1.12 and serialization.xstream-api-2.0 to get the module to work. What’s the best way to do this? Should I add a profile to the POM like we do with the patient flags module?

As a side note, I think it’s fine to use a fork and pull module for this repo as long as you’re alright reviewing the code we create :slight_smile:

Thanks, Craig

Where are you running into problems? You mean you just need to add them as provided dependencies?

You can just go ahead and add those (and any other dependencies you) need to the main pom where the other module dependencies are. I don’t think it will hurt our config.

Do you want to make the changes and issue a pull request and then I can test on my end?

Thanks! Mark

I’m getting a bean error on the obsmapper in EMR-API because of the changes in the API with the 1.12/2.0 upgrade. I’m happy to add these in as provided and create a PR.

This is the first time I’m working on multiple versions of OpenMRS and want to make sure I’m doing this correctly. I have the module loaded in eclipse. When targeting OpenMRS platform 2.0, I change the 1.10.4 to 2.0.1 in the main POM, save it and run maven clean install. Is this appropriate, or should I pass in the version in another way?

Thanks, Craig

Is that error when starting up OpenMRS, or when trying to compile and/or run tests. You shouldn’t have to change the OpenMRS version in the POM… that’s just the version it compiles under, and since we want the same omod to run against 1.10.x and 2.0 (this is common) we compile under the lowest version we want to be compatible with.

First thing to do would be to just build the omod as-is via maven clean install, and then add the omod to your current distribution and see if everything starts up okay. If you are seeing the above errors on startup, I’d add the dependencies to the pom and try to rebuild without changing the OpenMRS version.

Take care, Mark

Thanks Mark,

I was getting the errors when running the tests. I’ll try to what you suggest and write back.

Craig

Hi Mark,

I added the extra emrapi and xstream dependencies on my dev branch in GitHub and am getting an error when the API tests are run because the OpenMRS API for platform v1.10.4 doesn’t have the OrderSetService class that appears to be required by the emrapi module.

Here’s the stack trace:

OpenJDK 64-Bit Server VM warning: ignoring option MaxPermSize=512m; support was     removed in 8.0
Running org.openmrs.module.haiticore.HaitiCoreActivatorTest
Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 32.773 sec <<< FAILURE! - in  org.openmrs.module.haiticore.HaitiCoreActivatorTest
testMetadataBundles(org.openmrs.module.haiticore.HaitiCoreActivatorTest)  Time elapsed: 32.172 sec  <<< ERROR!
java.lang.NoClassDefFoundError: org/openmrs/api/OrderSetService
at java.lang.Class.getDeclaredConstructors0(Native Method)
at java.lang.Class.privateGetDeclaredConstructors(Class.java:2671)
at java.lang.Class.getDeclaredConstructors(Class.java:2020)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.determineCandidateConstructors(AutowiredAnnotationBeanPostProcessor.java:227)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.determineConstructorsFromBeanPostProcessors(AbstractAutowireCapableBeanFactory.java:930)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:903)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:485)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:291)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:288)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:190)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:580)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:895)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:425)
at org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:84)
at org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:1)
at org.springframework.test.context.TestContext.loadApplicationContext(TestContext.java:280)
at org.springframework.test.context.TestContext.getApplicationContext(TestContext.java:304)
at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:109)
at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.prepareTestInstance(DependencyInjectionTestExecutionListener.java:75)
at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:321)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:220)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner$1.runReflectiveCall(SpringJUnit4ClassRunner.java:301)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock(SpringJUnit4ClassRunner.java:303)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:240)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:180)
at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:264)
at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:153)
at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:124)
at org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:200)
at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:153)
at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:103)
Caused by: java.lang.ClassNotFoundException: org.openmrs.api.OrderSetService
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at java.lang.Class.getDeclaredConstructors0(Native Method)
at java.lang.Class.privateGetDeclaredConstructors(Class.java:2671)
at java.lang.Class.getDeclaredConstructors(Class.java:2020)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.determineCandidateConstructors(AutowiredAnnotationBeanPostProcessor.java:227)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.determineConstructorsFromBeanPostProcessors(AbstractAutowireCapableBeanFactory.java:930)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:903)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:485)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:291)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:288)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:190)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:580)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:895)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:425)
at org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:84)
at org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:1)
at org.springframework.test.context.TestContext.loadApplicationContext(TestContext.java:280)
at org.springframework.test.context.TestContext.getApplicationContext(TestContext.java:304)
at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:109)
at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.prepareTestInstance(DependencyInjectionTestExecutionListener.java:75)
at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:321)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:220)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner$1.runReflectiveCall(SpringJUnit4ClassRunner.java:301)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock(SpringJUnit4ClassRunner.java:303)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:240)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:180)
at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:264)
at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:153)
at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:124)
at org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:200)
at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:153)
at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:103)

@craigappl what i do is first change the platform version to any 2.x and compile. Then i fix any compiler errors in a way that should not break lower platform versions. After ensuring that all compiles well on platform 2.x, i revert to the original lower platform versions to compile again and confirm that i still get no errors. That is mostly it. If you give point me to your repository, i can show you a sample pull request.

Thanks @dkayiwa,

I updated the openmrs version for testing and am now getting a hibernate session factory error:

testMetadataBundles(org.openmrs.module.haiticore.HaitiCoreActivatorTest)  Time elapsed: 6.078 sec  <<< ERROR!
java.lang.NoSuchMethodError: org.hibernate.SessionFactory.getCurrentSession()Lorg/hibernate/classic/Session;
at org.openmrs.module.metadatadeploy.handler.impl.PersonAttributeTypeDeployHandler.save(PersonAttributeTypeDeployHandler.java:53)
at org.openmrs.module.metadatadeploy.handler.impl.PersonAttributeTypeDeployHandler.save(PersonAttributeTypeDeployHandler.java:28)
at org.openmrs.module.metadatadeploy.api.impl.MetadataDeployServiceImpl.installObject(MetadataDeployServiceImpl.java:192)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317)
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.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99)
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:281)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207)
at com.sun.proxy.$Proxy31.installObject(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317)
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.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99)
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:281)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207)
at com.sun.proxy.$Proxy170.installObject(Unknown Source)
at org.openmrs.module.metadatadeploy.bundle.AbstractMetadataBundle.install(AbstractMetadataBundle.java:98)
at org.openmrs.module.metadatadeploy.bundle.AbstractMetadataBundle.install(AbstractMetadataBundle.java:259)
at org.openmrs.module.haiticore.org.openmrs.module.haiticore.metadata.HaitiPersonAttributeTypeBundle.install(HaitiPersonAttributeTypeBundle.java:13)
at org.openmrs.module.metadatadeploy.api.impl.MetadataDeployServiceImpl.installBundle(MetadataDeployServiceImpl.java:111)
at org.openmrs.module.metadatadeploy.api.impl.MetadataDeployServiceImpl.installBundle(MetadataDeployServiceImpl.java:81)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317)
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.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99)
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:281)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207)
at com.sun.proxy.$Proxy31.installBundle(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317)
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.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99)
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:281)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207)
at com.sun.proxy.$Proxy170.installBundle(Unknown Source)
at org.openmrs.module.haiticore.HaitiCoreActivatorTest.testMetadataBundles(HaitiCoreActivatorTest.java:28)

Here’s the link to the branch that you can pull and build. I’m not sure if it’s an issue in the bean of the module or if it’s something in emrapi.

@craigappl don’t worry about the test failures. @dkayiwa suggestion does make sense–you can upgrade to 2.0.x and make sure everything compiles, but don’t worry about the tests running at this point. If everything compiles, revert back to the original version (without the extra dependencies), build the the omod, try to install it as part of your distro, and see if things start up correctly.

Take care, Mark

Thanks @mogoodrich The hibernate issue had to do with metadatadeploy v1.7 @dkayiwa fixed it in the latest release of 1.8.1

I just created a PR

Everything is working now on our end.

Cool… just to confirm, all the changes in the pull request you sent were required to get the module to start up within your implementation?

As you noticed, some of the tests aren’t passing now. I can work on fixing them, but wanted to make sure that all the dependency changes are necessary.

Take care, Mark

Specifically, it looks like the tests are failing due to the emrapi-1.12 dependency. If you remove that dependency and attempt to start up OpenMRS with the Haiti Core module installed, what errors are you seeing?

Take care, Mark