Skip to content

Commit

Permalink
#288 - Fix Global Properties loading for OpenMRS 2.7+ (#289)
Browse files Browse the repository at this point in the history
  • Loading branch information
mseaton authored Feb 3, 2025
1 parent 3bfbc1f commit ada6a78
Show file tree
Hide file tree
Showing 6 changed files with 136 additions and 6 deletions.
3 changes: 3 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -206,6 +206,9 @@ See the [documentation on Initializer's logging properties](readme/rtprops.md#lo

## Releases notes

#### Version 2.9.0
* Fix for InitializerSerializer to ensure compatibility with OpenMRS version 2.7.0+

#### Version 2.8.0
* Ampath forms translation files will now generate checksums.
* Enhancement to ensure that when an Ampath forms file is loaded, a new resource with the existing Ampath forms translations is created.
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
/**
* This Source Code Form is subject to the terms of the Mozilla Public License,
* v. 2.0. If a copy of the MPL was not distributed with this file, You can
* obtain one at http://mozilla.org/MPL/2.0/. OpenMRS is also distributed under
* the terms of the Healthcare Disclaimer located at http://openmrs.org/license.
*
* Copyright (C) OpenMRS Inc. OpenMRS is a registered trademark and the OpenMRS
* graphic logo is a trademark of OpenMRS Inc.
*/
package org.openmrs.module.initializer.api.loaders;

import org.junit.Assert;
import org.junit.Test;
import org.openmrs.GlobalProperty;
import org.openmrs.api.context.Context;
import org.openmrs.module.initializer.DomainBaseModuleContextSensitive_2_7_Test;
import org.openmrs.module.initializer.api.gp.GlobalPropertiesLoader;
import org.springframework.beans.factory.annotation.Autowired;

/**
* This test is intended to be a copy of the GlobalPropertiesLoaderIntegrationTest from the api module,
* but included within the api-2.7 module to test that global properties loading from xml works successfully
* in an OpenMRS 2.7 environment
*/
public class GlobalPropertiesLoaderIntegration_2_7_Test extends DomainBaseModuleContextSensitive_2_7_Test {

@Autowired
private GlobalPropertiesLoader loader;

@Test
public void loadGlobalProperties_shouldLoadGlobalProperties() {

// Replay
loader.load();

// Verif
Assert.assertEquals("GP one one", Context.getAdministrationService().getGlobalProperty("gp.gp11"));
Assert.assertEquals("GP one two", Context.getAdministrationService().getGlobalProperty("gp.gp12"));
Assert.assertEquals("GP two one", Context.getAdministrationService().getGlobalProperty("gp.gp21"));
Assert.assertEquals("GP three one", Context.getAdministrationService().getGlobalProperty("gp.gp31"));
Assert.assertEquals("GP three two", Context.getAdministrationService().getGlobalProperty("gp.gp32"));
Assert.assertEquals("GP three three", Context.getAdministrationService().getGlobalProperty("gp.gp33"));
}

@Test
public void load_shouldOverrideGlobalProperties() {

// Setup
Context.getAdministrationService().saveGlobalProperty(new GlobalProperty("gp.gp11", "foobar"));
Assert.assertEquals("foobar", Context.getAdministrationService().getGlobalProperty("gp.gp11"));

// Replay
loader.load();

// Verif
Assert.assertEquals("GP one one", Context.getAdministrationService().getGlobalProperty("gp.gp11"));
}

@Test
public void load_shouldNotAffectOtherGlobalProperties() {

// Setup
Context.getAdministrationService().saveGlobalProperty(new GlobalProperty("gp.foo", "Foo"));
Context.getAdministrationService().saveGlobalProperty(new GlobalProperty("gp.bar", "Bar"));
Context.getAdministrationService().saveGlobalProperty(new GlobalProperty("gp.baz", "Baz"));

// Replay
loader.load();

// Verif
Assert.assertEquals("Foo", Context.getAdministrationService().getGlobalProperty("gp.foo"));
Assert.assertEquals("Bar", Context.getAdministrationService().getGlobalProperty("gp.bar"));
Assert.assertEquals("Baz", Context.getAdministrationService().getGlobalProperty("gp.baz"));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
<config>
<globalProperties>
<globalProperty>
<property>gp.gp11</property>
<value>GP one one</value>
</globalProperty>
<globalProperty>
<property>gp.gp12</property>
<value>GP one two</value>
</globalProperty>
</globalProperties>
</config>
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<config>
<globalProperties>
<globalProperty>
<property>gp.gp21</property>
<value>GP two one</value>
</globalProperty>
</globalProperties>
</config>
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
<config>
<comment>
It should be ok to just add some comments like this.
</comment>
<globalProperties>
<globalProperty>
<property>gp.gp31</property>
<value>GP three one</value>
</globalProperty>
<globalProperty>
<property>gp.gp32</property>
<value>GP three two</value>
</globalProperty>
<globalProperty>
<property>gp.gp33</property>
<value>GP three three</value>
</globalProperty>
</globalProperties>
</config>
Original file line number Diff line number Diff line change
@@ -1,11 +1,5 @@
package org.openmrs.module.initializer.api;

import java.io.InputStream;

import org.openmrs.GlobalProperty;
import org.openmrs.module.idgen.IdentifierSource;
import org.openmrs.module.initializer.api.gp.GlobalPropertiesConfig;

import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.converters.UnmarshallingContext;
import com.thoughtworks.xstream.converters.reflection.ReflectionConverter;
Expand All @@ -14,12 +8,22 @@
import com.thoughtworks.xstream.io.HierarchicalStreamReader;
import com.thoughtworks.xstream.mapper.Mapper;
import com.thoughtworks.xstream.mapper.MapperWrapper;
import org.openmrs.GlobalProperty;
import org.openmrs.module.idgen.IdentifierSource;
import org.openmrs.module.initializer.api.gp.GlobalPropertiesConfig;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.InputStream;
import java.lang.reflect.Method;

/**
* Use this serializer instead of a bare {@link XStream} if you want to ignore unmapped fields.
*/
public class InitializerSerializer extends XStream {

private static final Logger log = LoggerFactory.getLogger(InitializerSerializer.class);

public InitializerSerializer() {
super();
}
Expand Down Expand Up @@ -53,6 +57,15 @@ public static XStream getGlobalPropertiesConfigSerializer() {
xs.alias("config", GlobalPropertiesConfig.class);
xs.alias("globalProperty", GlobalProperty.class);
xs.aliasField("value", GlobalProperty.class, "propertyValue");
try {
Method allowTypeHierarchy = XStream.class.getMethod("allowTypeHierarchy", Class.class);
allowTypeHierarchy.invoke(xs, GlobalPropertiesConfig.class);
allowTypeHierarchy.invoke(xs, GlobalProperty.class);
log.debug("Successfully configured global properties config serializer with allowed types");
}
catch (Exception e) {
log.debug("Error configuring global properties config serializer with allowed types", e);
}
return xs;
}

Expand Down

0 comments on commit ada6a78

Please sign in to comment.