Skip to content

Commit

Permalink
OpenConceptLab/ocl_issues#339 codesystem validate-code operation and …
Browse files Browse the repository at this point in the history
…code cleanup
  • Loading branch information
Harsh Patel committed Nov 4, 2020
1 parent 8a8fb9e commit 0e69a76
Show file tree
Hide file tree
Showing 14 changed files with 272 additions and 118 deletions.
5 changes: 3 additions & 2 deletions docker-compose.override.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,12 @@ services:
restart: "no"
command: sh -c "/code/startup.sh"
ports:
- ${SERVER_PORT-7000}:${SERVER_PORT-7000}
- ${SERVER_PORT-8080}:${SERVER_PORT-8080}
environment:
- ENVIRONMENT=${ENVIRONMENT-dev}
- DATABASE_URL=jdbc:postgresql://host.docker.internal:5432/postgres
- DATABASE_USERNAME=${DATABASE_USERNAME-postgres}
- DATABASE_PASSWORD=${DATABASE_PASSWORD-Postgres123}
- DATABASE_DIALECT=${DATABASE_DIALECT-org.hibernate.dialect.ProgressDialect}
- SERVER_PORT=${SERVER_PORT-7000}
- SERVER_PORT=${SERVER_PORT-8080}
- OCL_SERVLET_BASEURL=${OCL_SERVLET_BASEURL-http://localhost:8080/fhir}
5 changes: 3 additions & 2 deletions docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,12 @@ services:
restart: "always"
command: sh -c "/code/startup.sh"
ports:
- ${SERVER_PORT-7000}:${SERVER_PORT-7000}
- ${SERVER_PORT-8080}:${SERVER_PORT-8080}
environment:
- ENVIRONMENT=${ENVIRONMENT-dev}
- DATABASE_URL=${DATABASE_URL-jdbc:postgresql://host.docker.internal:5432/postgres}
- DATABASE_USERNAME=${DATABASE_USERNAME-postgres}
- DATABASE_PASSWORD=${DATABASE_PASSWORD-Postgres123}
- DATABASE_DIALECT=${DATABASE_DIALECT-org.hibernate.dialect.ProgressDialect}
- SERVER_PORT=${SERVER_PORT-7000}
- SERVER_PORT=${SERVER_PORT-8080}
- OCL_SERVLET_BASEURL=${OCL_SERVLET_BASEURL-http://localhost:8080/fhir}
1 change: 1 addition & 0 deletions ocl-fhir-ts/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -142,6 +142,7 @@
</dependencies>

<build>
<finalName>oclfhir</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,13 @@
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.PropertySource;
import org.springframework.context.annotation.PropertySources;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;

import javax.annotation.PostConstruct;
Expand All @@ -39,7 +43,12 @@
})
@EnableJpaRepositories(basePackageClasses = {ConceptRepository.class})
@EntityScan(basePackageClasses = {BaseOclEntity.class})
public class OclFhirApplication {
public class OclFhirApplication extends SpringBootServletInitializer {

@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(OclFhirApplication.class);
}

UserProfile oclUser = null;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@
import org.openconceptlab.fhir.provider.ValueSetResourceProvider;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.PropertySource;
import org.springframework.context.annotation.PropertySources;
import org.springframework.stereotype.Component;

/**
Expand All @@ -24,20 +26,24 @@
@WebServlet(urlPatterns = "/fhir/*", loadOnStartup = 1)
public class OclFhirRestfulServer extends RestfulServer {

@Autowired
private CodeSystemResourceProvider codeSystemResourceProvider;

@Autowired
private ValueSetResourceProvider valueSetResourceProvider;

@Autowired
private OclCapabilityStatementProvider oclCapabilityStatementProvider;
private OclFhirAuthorizationInterceptor oclFhirAuthorizationInterceptor;
private OclFhirLoggingInterceptor oclFhirLoggingInterceptor;

@Autowired
OclFhirAuthorizationInterceptor oclFhirAuthorizationInterceptor;

@Autowired
OclFhirLoggingInterceptor oclFhirLoggingInterceptor;
public OclFhirRestfulServer(CodeSystemResourceProvider codeSystemResourceProvider,
ValueSetResourceProvider valueSetResourceProvider,
OclCapabilityStatementProvider oclCapabilityStatementProvider,
OclFhirAuthorizationInterceptor oclFhirAuthorizationInterceptor,
OclFhirLoggingInterceptor oclFhirLoggingInterceptor) {
this.codeSystemResourceProvider = codeSystemResourceProvider;
this.valueSetResourceProvider = valueSetResourceProvider;
this.oclCapabilityStatementProvider = oclCapabilityStatementProvider;
this.oclFhirAuthorizationInterceptor = oclFhirAuthorizationInterceptor;
this.oclFhirLoggingInterceptor = oclFhirLoggingInterceptor;
}

@Value("${ocl.servlet.baseurl}")
private String baseUrl;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,6 @@

import org.hibernate.boot.model.naming.ImplicitNamingStrategy;
import org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl;
import org.openconceptlab.fhir.model.UserProfile;
import org.openconceptlab.fhir.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -65,15 +65,33 @@ public ResponseEntity<String> lookUpCodeSystemsByOrg(@PathVariable String org,
@RequestParam(name = CODE) String code,
@RequestParam(name = VERSION, required = false) String version,
@RequestParam(name = DISP_LANG, required = false) String displayLanguage) {
Parameters parameters = generateParameters(system, code, version, displayLanguage, formatOrg(org));
return handleLookup(parameters);
Parameters parameters = lookupParameters(system, code, version, displayLanguage, formatOrg(org));
return handleFhirOperation(parameters, CodeSystem.class, LOOKUP);
}

@PostMapping(path = {"/orgs/{org}/CodeSystem/$lookup"}, produces = {MediaType.APPLICATION_JSON_VALUE})
public ResponseEntity<String> lookUpCodeSystemsByOrg(@PathVariable String org, @RequestBody String parameters){
Parameters params = (Parameters) getResource(parameters);
params.addParameter().setName(PROPERTY).setValue(new StringType(formatOrg(org)));
return handleLookup(params);
params.addParameter().setName(OWNER).setValue(newStringType(formatOrg(org)));
return handleFhirOperation(params, CodeSystem.class, LOOKUP);
}

@GetMapping(path = {"/orgs/{org}/CodeSystem/$validate-code"}, produces = {MediaType.APPLICATION_JSON_VALUE})
public ResponseEntity<String> validateCodeSystemsByOrg(@PathVariable String org,
@RequestParam(name = URL) String url,
@RequestParam(name = CODE) String code,
@RequestParam(name = VERSION, required = false) String version,
@RequestParam(name = DISPLAY, required = false) String display,
@RequestParam(name = DISP_LANG, required = false) String displayLanguage) {
Parameters parameters = validateCodeParameters(url, code, version, display, displayLanguage, formatOrg(org));
return handleFhirOperation(parameters, CodeSystem.class, VALIDATE_CODE);
}

@PostMapping(path = {"/orgs/{org}/CodeSystem/$validate-code"}, produces = {MediaType.APPLICATION_JSON_VALUE})
public ResponseEntity<String> validateCodeSystemsByOrg(@PathVariable String org, @RequestBody String parameters){
Parameters params = (Parameters) getResource(parameters);
params.addParameter().setName(OWNER).setValue(newStringType(formatOrg(org)));
return handleFhirOperation(params, CodeSystem.class, VALIDATE_CODE);
}

@GetMapping(path = {"/orgs/{org}/ValueSet/{id}"}, produces = {MediaType.APPLICATION_JSON_VALUE})
Expand Down Expand Up @@ -120,15 +138,33 @@ public ResponseEntity<String> lookUpCodeSystemsByUser(@PathVariable String user,
@RequestParam(name = CODE) String code,
@RequestParam(name = VERSION, required = false) String version,
@RequestParam(name = DISP_LANG, required = false) String displayLanguage) {
Parameters parameters = generateParameters(system, code, version, displayLanguage, formatUser(user));
return handleLookup(parameters);
Parameters parameters = lookupParameters(system, code, version, displayLanguage, formatUser(user));
return handleFhirOperation(parameters, CodeSystem.class, LOOKUP);
}

@PostMapping(path = {"/users/{user}/CodeSystem/$lookup"}, produces = {MediaType.APPLICATION_JSON_VALUE})
public ResponseEntity<String> lookUpCodeSystemsByUser(@PathVariable String user, @RequestBody String parameters){
Parameters params = (Parameters) getResource(parameters);
params.addParameter().setName(PROPERTY).setValue(new StringType(formatUser(user)));
return handleLookup(params);
params.addParameter().setName(OWNER).setValue(newStringType(formatUser(user)));
return handleFhirOperation(params, CodeSystem.class, LOOKUP);
}

@GetMapping(path = {"/users/{user}/CodeSystem/$validate-code"}, produces = {MediaType.APPLICATION_JSON_VALUE})
public ResponseEntity<String> validateCodeSystemsByUser(@PathVariable String user,
@RequestParam(name = URL) String url,
@RequestParam(name = CODE) String code,
@RequestParam(name = VERSION, required = false) String version,
@RequestParam(name = DISPLAY, required = false) String display,
@RequestParam(name = DISP_LANG, required = false) String displayLanguage) {
Parameters parameters = validateCodeParameters(url, code, version, display, displayLanguage, formatUser(user));
return handleFhirOperation(parameters, CodeSystem.class, VALIDATE_CODE);
}

@PostMapping(path = {"/users/{user}/CodeSystem/$validate-code"}, produces = {MediaType.APPLICATION_JSON_VALUE})
public ResponseEntity<String> validateCodeSystemsByUser(@PathVariable String user, @RequestBody String parameters){
Parameters params = (Parameters) getResource(parameters);
params.addParameter().setName(OWNER).setValue(newStringType(formatUser(user)));
return handleFhirOperation(params, CodeSystem.class, VALIDATE_CODE);
}

@GetMapping(path = {"/users/{user}/ValueSet/{id}"}, produces = {MediaType.APPLICATION_JSON_VALUE})
Expand Down Expand Up @@ -161,9 +197,9 @@ private ResponseEntity<String> handleSearchResource(final Class<? extends Metada
}
}

private ResponseEntity<String> handleLookup(Parameters parameters) {
private ResponseEntity<String> handleFhirOperation(Parameters parameters, Class<? extends Resource> type, String operation) {
try {
return ResponseEntity.ok(oclFhirUtil.getResourceAsString(lookUpCodeSystem(parameters)));
return ResponseEntity.ok(oclFhirUtil.getResourceAsString(performFhirOperation(parameters, type, operation)));
} catch (ResourceNotFoundException e) {
return notFound(e.getStatusCode(), e.getResponseBody());
} catch (Exception e) {
Expand All @@ -186,24 +222,38 @@ private String searchResource(final Class<? extends MetadataResource> resourceCl
return oclFhirUtil.getResourceAsString(bundle);
}

private Parameters lookUpCodeSystem(Parameters parameters) {
private Parameters performFhirOperation(Parameters parameters, Class<? extends Resource> type, String operation) {
return oclFhirUtil.getClient()
.operation()
.onType(CodeSystem.class)
.named(LOOKUP)
.onType(type)
.named(operation)
.withParameters(parameters)
.execute();
}

private Parameters generateParameters(String system, String code, String version, String displayLanguage, String owner) {
private Parameters generateParameters(String code, String version, String displayLanguage, String owner) {
Parameters parameters = new Parameters();
parameters.addParameter().setName(SYSTEM).setValue(new UriType(system));
parameters.addParameter().setName(CODE).setValue(new CodeType(code));
if (isValid(version))
parameters.addParameter().setName(VERSION).setValue(new StringType(version));
parameters.addParameter().setName(VERSION).setValue(newStringType(version));
if (isValid(displayLanguage))
parameters.addParameter().setName(DISP_LANG).setValue(new CodeType(displayLanguage));
parameters.addParameter().setName(PROPERTY).setValue(new StringType(owner));
parameters.addParameter().setName(OWNER).setValue(newStringType(owner));
return parameters;
}

private Parameters lookupParameters(String system, String code, String version, String displayLanguage, String owner) {
Parameters parameters = generateParameters(code, version, displayLanguage, owner);
parameters.addParameter().setName(SYSTEM).setValue(new UriType(system));
return parameters;
}

private Parameters validateCodeParameters(String url, String code, String version, String display, String displayLanguage,
String owner) {
Parameters parameters = generateParameters(code, version, displayLanguage, owner);
parameters.addParameter().setName(URL).setValue(new UriType(url));
if (isValid(display))
parameters.addParameter().setName(DISPLAY).setValue(newStringType(display));
return parameters;
}

Expand Down
Loading

0 comments on commit 0e69a76

Please sign in to comment.