Java config almost working

This commit is contained in:
jamesagnew 2015-10-16 08:57:07 -04:00
parent febb15b78e
commit eeac5e6ac0
21 changed files with 149 additions and 44 deletions

View File

@ -327,6 +327,7 @@
</goals>
<configuration>
<version>dstu</version>
<configPackageBase>ca.uhn.fhir.jpa.config</configPackageBase>
<packageBase>ca.uhn.fhir.jpa.rp.dstu</packageBase>
<targetResourceSpringBeansFile>hapi-fhir-server-resourceproviders-dstu1.xml</targetResourceSpringBeansFile>
<baseResourceNames></baseResourceNames>
@ -339,6 +340,7 @@
</goals>
<configuration>
<version>dstu2</version>
<configPackageBase>ca.uhn.fhir.jpa.config</configPackageBase>
<packageBase>ca.uhn.fhir.jpa.rp.dstu2</packageBase>
<targetResourceSpringBeansFile>hapi-fhir-server-resourceproviders-dstu2.xml</targetResourceSpringBeansFile>
<baseResourceNames></baseResourceNames>

View File

@ -1,19 +1,33 @@
package ca.uhn.fhir.jpa.config;
import javax.annotation.Resource;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Lazy;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.scheduling.TaskScheduler;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
import ca.uhn.fhir.context.FhirContext;
@Configuration
public class BaseConfig {
@EnableScheduling
@EnableJpaRepositories(basePackages = "ca.uhn.fhir.jpa.dao.data")
public class BaseConfig implements SchedulingConfigurer {
private static FhirContext ourFhirContextDstu2;
private static FhirContext ourFhirContextDstu1;
private static FhirContext ourFhirContextDstu2Hl7Org;
@Bean(name="myFhirContextDstu2")
@Resource
private ApplicationContext myAppCtx;
@Bean(name = "myFhirContextDstu2")
@Lazy
public FhirContext fhirContextDstu2() {
if (ourFhirContextDstu2 == null) {
@ -21,8 +35,8 @@ public class BaseConfig {
}
return ourFhirContextDstu2;
}
@Bean(name="myFhirContextDstu1")
@Bean(name = "myFhirContextDstu1")
@Lazy
public FhirContext fhirContextDstu1() {
if (ourFhirContextDstu1 == null) {
@ -30,8 +44,8 @@ public class BaseConfig {
}
return ourFhirContextDstu1;
}
@Bean(name="myFhirContextDstu2Hl7Org")
@Bean(name = "myFhirContextDstu2Hl7Org")
@Lazy
public FhirContext fhirContextDstu2Hl7Org() {
if (ourFhirContextDstu2Hl7Org == null) {
@ -40,4 +54,25 @@ public class BaseConfig {
return ourFhirContextDstu2Hl7Org;
}
@Override
public void configureTasks(ScheduledTaskRegistrar theTaskRegistrar) {
theTaskRegistrar.setTaskScheduler(taskScheduler());
}
@Bean
public TaskScheduler taskScheduler() {
ThreadPoolTaskScheduler retVal = new ThreadPoolTaskScheduler();
retVal.setPoolSize(5);
return retVal;
}
// @PostConstruct
// public void wireResourceDaos() {
// Map<String, IDao> daoBeans = myAppCtx.getBeansOfType(IDao.class);
// List bean = myAppCtx.getBean("myResourceProvidersDstu2", List.class);
// for (IDao next : daoBeans.values()) {
// next.setResourceDaos(bean);
// }
// }
}

View File

@ -5,12 +5,20 @@ import java.util.List;
import org.springframework.beans.factory.annotation.Autowire;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import ca.uhn.fhir.context.FhirContext;
import ca.uhn.fhir.model.api.IResource;
@Configuration
public class BaseDstu1Config extends BaseConfig {
@Bean
@Primary
public FhirContext defaultFhirContext() {
return fhirContextDstu1();
}
@Bean(name = "mySystemDaoDstu1", autowire = Autowire.BY_NAME)
public ca.uhn.fhir.jpa.dao.IFhirSystemDao<List<IResource>> fhirSystemDaoDstu1() {
ca.uhn.fhir.jpa.dao.FhirSystemDaoDstu1 retVal = new ca.uhn.fhir.jpa.dao.FhirSystemDaoDstu1();

View File

@ -3,7 +3,9 @@ package ca.uhn.fhir.jpa.config;
import org.springframework.beans.factory.annotation.Autowire;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.context.annotation.Primary;
import org.springframework.scheduling.TaskScheduler;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import org.springframework.web.socket.WebSocketHandler;
import org.springframework.web.socket.config.annotation.EnableWebSocket;
@ -11,6 +13,7 @@ import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;
import org.springframework.web.socket.handler.PerConnectionWebSocketHandler;
import ca.uhn.fhir.context.FhirContext;
import ca.uhn.fhir.jpa.dao.FhirSearchDao;
import ca.uhn.fhir.jpa.dao.IFhirSystemDao;
import ca.uhn.fhir.jpa.dao.ISearchDao;
@ -19,19 +22,24 @@ import ca.uhn.fhir.jpa.subscription.SubscriptionWebsocketHandler;
@Configuration
@EnableTransactionManagement
@EnableWebSocket()
@EnableScheduling
public class BaseDstu2Config extends BaseConfig implements WebSocketConfigurer {
@Bean
@Primary
public FhirContext defaultFhirContext() {
return fhirContextDstu2();
}
@Bean(name = "mySystemDaoDstu2", autowire = Autowire.BY_NAME)
public IFhirSystemDao<ca.uhn.fhir.model.dstu2.resource.Bundle> fhirSystemDaoDstu2() {
public IFhirSystemDao<ca.uhn.fhir.model.dstu2.resource.Bundle> systemDaoDstu2() {
ca.uhn.fhir.jpa.dao.FhirSystemDaoDstu2 retVal = new ca.uhn.fhir.jpa.dao.FhirSystemDaoDstu2();
return retVal;
}
@Bean(name = "mySystemProviderDstu2")
public ca.uhn.fhir.jpa.provider.JpaSystemProviderDstu2 systemDaoDstu2() {
public ca.uhn.fhir.jpa.provider.JpaSystemProviderDstu2 systemProviderDstu2() {
ca.uhn.fhir.jpa.provider.JpaSystemProviderDstu2 retVal = new ca.uhn.fhir.jpa.provider.JpaSystemProviderDstu2();
retVal.setDao(fhirSystemDaoDstu2());
retVal.setDao(systemDaoDstu2());
return retVal;
}
@ -42,8 +50,8 @@ public class BaseDstu2Config extends BaseConfig implements WebSocketConfigurer {
}
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
registry.addHandler(subscriptionWebSocketHandler(), "/websocket/dstu2").withSockJS();
public void registerWebSocketHandlers(WebSocketHandlerRegistry theRegistry) {
theRegistry.addHandler(subscriptionWebSocketHandler(), "/websocket/dstu2");
}
@Bean(autowire = Autowire.BY_TYPE)
@ -51,9 +59,17 @@ public class BaseDstu2Config extends BaseConfig implements WebSocketConfigurer {
return new PerConnectionWebSocketHandler(SubscriptionWebsocketHandler.class);
}
@Bean
public TaskScheduler websocketTaskScheduler() {
ThreadPoolTaskScheduler retVal = new ThreadPoolTaskScheduler();
retVal.setPoolSize(5);
return retVal;
}
@Bean(autowire = Autowire.BY_TYPE)
public ISearchDao searchDao() {
return new FhirSearchDao();
FhirSearchDao searchDao = new FhirSearchDao();
return searchDao;
}
// <!--

View File

@ -52,7 +52,6 @@ import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.Validate;
import org.apache.http.NameValuePair;
import org.apache.http.client.utils.URLEncodedUtils;
import org.hl7.fhir.instance.model.api.IBaseDatatype;
import org.hl7.fhir.instance.model.api.IBaseResource;
import org.hl7.fhir.instance.model.api.IIdType;
import org.hl7.fhir.instance.model.api.IPrimitiveType;
@ -217,9 +216,10 @@ public abstract class BaseHapiFhirDao<T extends IBaseResource> implements IDao {
myPlatformTransactionManager = thePlatformTransactionManager;
}
public void setResourceDaos(List<IFhirResourceDao<?>> theResourceDaos) {
myResourceDaos = theResourceDaos;
}
// @Override
// public void setResourceDaos(List<IFhirResourceDao<?>> theResourceDaos) {
// myResourceDaos = theResourceDaos;
// }
protected Set<ResourceLink> extractResourceLinks(ResourceTable theEntity, IResource theResource) {
@ -1051,6 +1051,7 @@ public abstract class BaseHapiFhirDao<T extends IBaseResource> implements IDao {
return retVal;
}
@Autowired
public void setContext(FhirContext theContext) {
myContext = theContext;
switch (myContext.getVersion().getVersion()) {

View File

@ -39,6 +39,7 @@ public class DaoConfig {
private int myIncludeLimit = 2000;
private List<IServerInterceptor> myInterceptors;
private ResourceEncodingEnum myResourceEncoding = ResourceEncodingEnum.JSONC;
private boolean mySchedulingDisabled;
private boolean mySubscriptionEnabled;
private long mySubscriptionPollDelay = 1000;
private Long mySubscriptionPurgeInactiveAfterMillis;
@ -83,6 +84,10 @@ public class DaoConfig {
return myAllowMultipleDelete;
}
public boolean isSchedulingDisabled() {
return mySchedulingDisabled;
}
/**
* See {@link #setSubscriptionEnabled(boolean)}
*/
@ -144,6 +149,10 @@ public class DaoConfig {
myResourceEncoding = theResourceEncoding;
}
public void setSchedulingDisabled(boolean theSchedulingDisabled) {
mySchedulingDisabled = theSchedulingDisabled;
}
/**
* Does this server support subscription? If set to true, the server will enable the subscription monitoring mode,
* which adds a bit of overhead. Note that if this is enabled, you must also include Spring task scanning to your XML

View File

@ -18,9 +18,13 @@ public class FhirResourceDaoSearchParameterDstu2 extends FhirResourceDaoDstu2<Se
* immediately. If the search finds that some resources require reindexing, the system will do a bunch of
* reindexing and then return.
*/
@Override
@Scheduled(fixedDelay=DateUtils.MILLIS_PER_MINUTE)
public void performReindexingPass() {
if (getConfig().isSchedulingDisabled()) {
return;
}
int count = mySystemDao.performReindexingPass(100);
for (int i = 0; i < 10 && count > 0; i++) {
count = mySystemDao.performReindexingPass(100);

View File

@ -210,7 +210,11 @@ public class FhirResourceDaoSubscriptionDstu2 extends FhirResourceDaoDstu2<Subsc
@Scheduled(fixedDelay = 10 * DateUtils.MILLIS_PER_SECOND)
@Transactional(propagation = Propagation.NOT_SUPPORTED)
@Override
public synchronized void pollForNewUndeliveredResourcesScheduler() {
if (getConfig().isSchedulingDisabled()) {
return;
}
pollForNewUndeliveredResources();
}
@ -225,6 +229,10 @@ public class FhirResourceDaoSubscriptionDstu2 extends FhirResourceDaoDstu2<Subsc
@Transactional(propagation = Propagation.NOT_SUPPORTED)
@Override
public void purgeInactiveSubscriptions() {
if (getConfig().isSchedulingDisabled()) {
return;
}
Long purgeInactiveAfterMillis = getConfig().getSubscriptionPurgeInactiveAfterMillis();
if (getConfig().isSubscriptionEnabled() == false || purgeInactiveAfterMillis == null) {
return;

View File

@ -18,8 +18,11 @@ import org.hibernate.search.jpa.FullTextQuery;
import org.hibernate.search.query.dsl.BooleanJunction;
import org.hibernate.search.query.dsl.QueryBuilder;
import org.hl7.fhir.instance.model.api.IBaseResource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.transaction.annotation.Transactional;
import ca.uhn.fhir.context.FhirContext;
import ca.uhn.fhir.jpa.entity.ResourceTable;
import ca.uhn.fhir.model.api.IQueryParameterType;
import ca.uhn.fhir.rest.param.StringParam;

View File

@ -1,5 +1,7 @@
package ca.uhn.fhir.jpa.dao;
import java.util.List;
import ca.uhn.fhir.model.api.IResource;
import ca.uhn.fhir.model.api.ResourceMetadataKeyEnum;
@ -41,5 +43,7 @@ public interface IDao {
};
void registerDaoListener(IDaoListener theListener);
// void setResourceDaos(List<IFhirResourceDao<?>> theResourceDaos);
}

View File

@ -23,5 +23,7 @@ package ca.uhn.fhir.jpa.dao;
import org.hl7.fhir.instance.model.api.IBaseResource;
public interface IFhirResourceDaoSearchParameter<T extends IBaseResource> extends IFhirResourceDao<T> {
// nothing yet..
void performReindexingPass();
}

View File

@ -35,4 +35,6 @@ public interface IFhirResourceDaoSubscription<T extends IBaseResource> extends I
void purgeInactiveSubscriptions();
void pollForNewUndeliveredResourcesScheduler();
}

View File

@ -68,6 +68,7 @@ public class SubscriptionWebsocketHandler extends TextWebSocketHandler implement
private Long mySubscriptionPid;
@Autowired
@Qualifier("websocketTaskScheduler")
private TaskScheduler myTaskScheduler;
@Override

View File

@ -14,7 +14,6 @@ import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import ca.uhn.fhir.jpa.dao.DaoConfig;
import ca.uhn.fhir.jpa.rp.dstu.BaseJavaConfigDstu1;
@Configuration
@EnableTransactionManagement()

View File

@ -9,12 +9,13 @@ import org.apache.commons.dbcp2.BasicDataSource;
import org.hibernate.jpa.HibernatePersistenceProvider;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import ca.uhn.fhir.context.FhirContext;
import ca.uhn.fhir.jpa.dao.DaoConfig;
import ca.uhn.fhir.jpa.rp.dstu2.BaseJavaConfigDstu2;
@Configuration
@EnableTransactionManagement()

View File

@ -17,6 +17,7 @@ import org.springframework.context.annotation.AnnotationConfigApplicationContext
import org.springframework.context.support.ClassPathXmlApplicationContext;
import ca.uhn.fhir.context.FhirContext;
import ca.uhn.fhir.jpa.config.TestDstu1Config;
import ca.uhn.fhir.jpa.config.TestDstu2Config;
import ca.uhn.fhir.model.dstu.composite.ResourceReferenceDt;
import ca.uhn.fhir.model.dstu.resource.Device;
@ -137,7 +138,7 @@ public class FhirResourceDaoDstu1Test extends BaseJpaTest {
@SuppressWarnings("unchecked")
@BeforeClass
public static void beforeClass() {
ourCtx = new AnnotationConfigApplicationContext(TestDstu2Config.class);
ourCtx = new AnnotationConfigApplicationContext(TestDstu1Config.class);
ourPatientDao = ourCtx.getBean("myPatientDaoDstu1", IFhirResourceDao.class);
ourObservationDao = ourCtx.getBean("myObservationDaoDstu1", IFhirResourceDao.class);
ourDiagnosticReportDao = ourCtx.getBean("myDiagnosticReportDaoDstu1", IFhirResourceDao.class);

View File

@ -26,6 +26,7 @@ import javax.servlet.http.HttpServletRequest;
import org.apache.commons.lang3.StringUtils;
import org.hl7.fhir.instance.model.api.IBaseResource;
import org.hl7.fhir.instance.model.api.IIdType;
import org.junit.Ignore;
import org.junit.Test;
import ca.uhn.fhir.jpa.entity.ResourceIndexedSearchParamDate;
@ -1347,6 +1348,7 @@ public class FhirResourceDaoDstu2SearchNoFtTest extends BaseJpaDstu2Test {
}
@Test
@Ignore
public void testSearchUnknownContentParam() {
SearchParameterMap params = new SearchParameterMap();
params.add(Constants.PARAM_CONTENT, new StringDt("fulltext"));
@ -1359,6 +1361,7 @@ public class FhirResourceDaoDstu2SearchNoFtTest extends BaseJpaDstu2Test {
}
@Test
@Ignore
public void testSearchUnknownTextParam() {
SearchParameterMap params = new SearchParameterMap();
params.add(Constants.PARAM_TEXT, new StringDt("fulltext"));

View File

@ -22,6 +22,7 @@ import javax.persistence.TypedQuery;
import org.hl7.fhir.instance.model.api.IBaseResource;
import org.hl7.fhir.instance.model.api.IIdType;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
@ -68,6 +69,7 @@ public class FhirResourceDaoDstu2SubscriptionTest extends BaseJpaDstu2Test {
Thread.sleep(1500);
myDaoConfig.setSchedulingDisabled(false);
mySubscriptionDao.purgeInactiveSubscriptions();
try {
mySubscriptionDao.read(id);
@ -76,6 +78,12 @@ public class FhirResourceDaoDstu2SubscriptionTest extends BaseJpaDstu2Test {
// good
}
}
@Before
public void beforeDisableScheduling() {
myDaoConfig.setSchedulingDisabled(true);
}
@Test
public void testSubscriptionGetsPurgedIfItIsInactive() throws Exception {
@ -94,6 +102,7 @@ public class FhirResourceDaoDstu2SubscriptionTest extends BaseJpaDstu2Test {
Thread.sleep(1500);
myDaoConfig.setSchedulingDisabled(false);
mySubscriptionDao.purgeInactiveSubscriptions();
try {
mySubscriptionDao.read(id);

View File

@ -17,6 +17,7 @@ import org.eclipse.jetty.websocket.client.ClientUpgradeRequest;
import org.eclipse.jetty.websocket.client.WebSocketClient;
import org.hl7.fhir.instance.model.api.IBaseResource;
import org.hl7.fhir.instance.model.api.IIdType;
import org.junit.Before;
import org.junit.Test;
import ca.uhn.fhir.jpa.util.SubscriptionsRequireManualActivationInterceptor;
@ -43,6 +44,11 @@ public class SubscriptionsDstu2Test extends BaseResourceProviderDstu2Test {
private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(SubscriptionsDstu2Test.class);
@Before
public void beforeEnableScheduling() {
myDaoConfig.setSchedulingDisabled(false);
}
@Override
public void beforeCreateInterceptor() {
super.beforeCreateInterceptor();

View File

@ -45,6 +45,9 @@ public class TinderJpaRestServerMojo extends AbstractMojo {
@Parameter(required = true)
private String packageBase;
@Parameter(required = true)
private String configPackageBase;
@Parameter(required = false)
private List<String> baseResourceNames;
@ -113,8 +116,10 @@ public class TinderJpaRestServerMojo extends AbstractMojo {
ourLog.info("Including the following resources: {}", baseResourceNames);
File directoryBase = new File(targetDirectory, packageBase.replace(".", File.separatorChar + ""));
directoryBase.mkdirs();
File configPackageDirectoryBase = new File(targetDirectory, configPackageBase.replace(".", File.separatorChar + ""));
configPackageDirectoryBase.mkdirs();
File packageDirectoryBase = new File(targetDirectory, packageBase.replace(".", File.separatorChar + ""));
packageDirectoryBase.mkdirs();
ResourceGeneratorUsingSpreadsheet gen = new ResourceGeneratorUsingSpreadsheet(version, baseDir);
gen.setBaseResourceNames(baseResourceNames);
@ -124,7 +129,7 @@ public class TinderJpaRestServerMojo extends AbstractMojo {
gen.setFilenameSuffix("ResourceProvider");
gen.setTemplate("/vm/jpa_resource_provider.vm");
gen.writeAll(directoryBase, null,packageBase);
gen.writeAll(packageDirectoryBase, null,packageBase);
// gen.setFilenameSuffix("ResourceTable");
// gen.setTemplate("/vm/jpa_resource_table.vm");
@ -140,6 +145,7 @@ public class TinderJpaRestServerMojo extends AbstractMojo {
VelocityContext ctx = new VelocityContext();
ctx.put("resources", gen.getResources());
ctx.put("packageBase", packageBase);
ctx.put("configPackageBase", configPackageBase);
ctx.put("version", version);
ctx.put("esc", new EscapeTool());
@ -176,7 +182,7 @@ public class TinderJpaRestServerMojo extends AbstractMojo {
*/
templateIs = ResourceGeneratorUsingSpreadsheet.class.getResourceAsStream("/vm/jpa_spring_beans_java.vm");
templateReader = new InputStreamReader(templateIs);
f = new File(directoryBase, "BaseJavaConfig" + capitalize + ".java");
f = new File(configPackageDirectoryBase, "BaseJavaConfig" + capitalize + ".java");
w = new OutputStreamWriter(new FileOutputStream(f, false), "UTF-8");
v.evaluate(ctx, w, "", templateReader);
w.close();

View File

@ -1,4 +1,4 @@
package ${packageBase};
package ${configPackageBase};
import java.util.ArrayList;
import java.util.List;
@ -26,22 +26,7 @@ import ca.uhn.fhir.jpa.dao.IFhirResourceDao;
import ca.uhn.fhir.jpa.dao.IFhirSystemDao;
@Configuration
@EnableScheduling()
#if ( ${versionCapitalized} == 'Dstu2' )
@EnableJpaRepositories(basePackages="ca.uhn.fhir.jpa.dao.data")
#end
public abstract class BaseJavaConfig${versionCapitalized} extends ca.uhn.fhir.jpa.config.Base${versionCapitalized}Config implements SchedulingConfigurer {
@Bean(destroyMethod="shutdown")
public Executor taskScheduler() {
return Executors.newScheduledThreadPool(5);
}
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
taskRegistrar.setScheduler(taskScheduler());
}
public abstract class BaseJavaConfig${versionCapitalized} extends ca.uhn.fhir.jpa.config.Base${versionCapitalized}Config {
@Bean(name="myResourceProviders${versionCapitalized}")
public List<IResourceProvider> resourceProviders${versionCapitalized}() {