Fix build

This commit is contained in:
James Agnew 2016-05-09 13:10:12 -04:00
parent 061243b5c7
commit 975dfe4fa4
24 changed files with 1694 additions and 220 deletions

View File

@ -13,6 +13,7 @@ import java.io.FileReader;
import java.io.FileWriter; import java.io.FileWriter;
import java.io.IOException; import java.io.IOException;
import java.io.UnsupportedEncodingException; import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.Date; import java.util.Date;
import java.util.HashMap; import java.util.HashMap;
@ -59,16 +60,19 @@ import ca.uhn.fhir.model.dstu2.resource.Bundle.Entry;
import ca.uhn.fhir.model.dstu2.resource.Bundle.EntryRequest; import ca.uhn.fhir.model.dstu2.resource.Bundle.EntryRequest;
import ca.uhn.fhir.model.dstu2.valueset.HTTPVerbEnum; import ca.uhn.fhir.model.dstu2.valueset.HTTPVerbEnum;
import ca.uhn.fhir.model.primitive.IdDt; import ca.uhn.fhir.model.primitive.IdDt;
import ca.uhn.fhir.model.valueset.BundleTypeEnum;
import ca.uhn.fhir.parser.DataFormatException; import ca.uhn.fhir.parser.DataFormatException;
import ca.uhn.fhir.rest.client.IGenericClient; import ca.uhn.fhir.rest.client.IGenericClient;
import ca.uhn.fhir.rest.client.apache.GZipContentInterceptor; import ca.uhn.fhir.rest.client.apache.GZipContentInterceptor;
import ca.uhn.fhir.rest.server.IVersionSpecificBundleFactory;
import ca.uhn.fhir.rest.server.exceptions.BaseServerResponseException;
import ca.uhn.fhir.util.BundleUtil;
import ca.uhn.fhir.util.ResourceReferenceInfo; import ca.uhn.fhir.util.ResourceReferenceInfo;
import ca.uhn.fhir.validation.FhirValidator; import ca.uhn.fhir.validation.FhirValidator;
import ca.uhn.fhir.validation.ValidationResult; import ca.uhn.fhir.validation.ValidationResult;
public class ExampleDataUploader extends BaseCommand { public class ExampleDataUploader extends BaseCommand {
private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(ExampleDataUploader.class); private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(ExampleDataUploader.class);
@Override @Override
@ -100,13 +104,15 @@ public class ExampleDataUploader extends BaseCommand {
opt.setRequired(false); opt.setRequired(false);
options.addOption(opt); options.addOption(opt);
opt = new Option("c", "cache", false, "Cache the downloaded examples-json.zip file in the ~/.hapi-fhir-cli/cache directory. Use this file for 12 hours if it exists, instead of fetching it from the internet."); opt = new Option("c", "cache", false,
"Cache the downloaded examples-json.zip file in the ~/.hapi-fhir-cli/cache directory. Use this file for 12 hours if it exists, instead of fetching it from the internet.");
opt.setRequired(false); opt.setRequired(false);
options.addOption(opt); options.addOption(opt);
// opt = new Option("c", "cache", true, "Store a copy of the downloaded example pack on the local disk using a file of the given name. Use this file instead of fetching it from the internet if the file already exists."); // opt = new Option("c", "cache", true, "Store a copy of the downloaded example pack on the local disk using a file of the given name. Use this file instead of fetching it from the internet if
// opt.setRequired(false); // the file already exists.");
// options.addOption(opt); // opt.setRequired(false);
// options.addOption(opt);
return options; return options;
} }
@ -135,19 +141,19 @@ public class ExampleDataUploader extends BaseCommand {
String specUrl; String specUrl;
switch (ctx.getVersion().getVersion()) { switch (ctx.getVersion().getVersion()) {
case DSTU2: case DSTU2:
specUrl = "http://hl7.org/fhir/dstu2/examples-json.zip"; specUrl = "http://hl7.org/fhir/dstu2/examples-json.zip";
break; break;
case DSTU3: case DSTU3:
specUrl = "http://hl7-fhir.github.io/examples-json.zip"; specUrl = "http://hl7-fhir.github.io/examples-json.zip";
break; break;
default: default:
throw new ParseException("Invalid spec version for this command: " + ctx.getVersion().getVersion()); throw new ParseException("Invalid spec version for this command: " + ctx.getVersion().getVersion());
} }
String filepath = theCommandLine.getOptionValue('d'); String filepath = theCommandLine.getOptionValue('d');
boolean cacheFile = theCommandLine.hasOption('c'); boolean cacheFile = theCommandLine.hasOption('c');
String userHomeDir = System.getProperty("user.home"); String userHomeDir = System.getProperty("user.home");
@ -163,9 +169,9 @@ public class ExampleDataUploader extends BaseCommand {
File suppliedFile = new File(FilenameUtils.normalize(filepath)); File suppliedFile = new File(FilenameUtils.normalize(filepath));
if(suppliedFile.isDirectory()){ if (suppliedFile.isDirectory()) {
Collection<File> inputFiles; Collection<File> inputFiles;
inputFiles = FileUtils.listFiles(suppliedFile, new String[] {"zip"}, false); inputFiles = FileUtils.listFiles(suppliedFile, new String[] { "zip" }, false);
for (File inputFile : inputFiles) { for (File inputFile : inputFiles) {
IBaseBundle bundle = getBundleFromFile(limit, inputFile, ctx); IBaseBundle bundle = getBundleFromFile(limit, inputFile, ctx);
@ -180,16 +186,16 @@ public class ExampleDataUploader extends BaseCommand {
} else { } else {
File cacheDir = new File(applicationDir, "cache" ); File cacheDir = new File(applicationDir, "cache");
FileUtils.forceMkdir(cacheDir); FileUtils.forceMkdir(cacheDir);
File inputFile = new File( cacheDir, "examples-json-" + ctx.getVersion().getVersion() + ".zip"); File inputFile = new File(cacheDir, "examples-json-" + ctx.getVersion().getVersion() + ".zip");
Date cacheExpiryDate = DateUtils.addHours(new Date(), -12); Date cacheExpiryDate = DateUtils.addHours(new Date(), -12);
if(!inputFile.exists() | (cacheFile && FileUtils.isFileOlder(inputFile, cacheExpiryDate))){ if (!inputFile.exists() | (cacheFile && FileUtils.isFileOlder(inputFile, cacheExpiryDate))) {
File exampleFileDownloading = new File( cacheDir, "examples-json-" + ctx.getVersion().getVersion() + ".zip.partial"); File exampleFileDownloading = new File(cacheDir, "examples-json-" + ctx.getVersion().getVersion() + ".zip.partial");
HttpGet get = new HttpGet(specUrl); HttpGet get = new HttpGet(specUrl);
CloseableHttpClient client = HttpClientBuilder.create().build(); CloseableHttpClient client = HttpClientBuilder.create().build();
@ -205,11 +211,11 @@ public class ExampleDataUploader extends BaseCommand {
FileUtils.deleteQuietly(inputFile); FileUtils.deleteQuietly(inputFile);
FileUtils.moveFile(exampleFileDownloading, inputFile); FileUtils.moveFile(exampleFileDownloading, inputFile);
if(!cacheFile) { if (!cacheFile) {
inputFile.deleteOnExit(); inputFile.deleteOnExit();
} }
ourLog.info("Successfully Loaded example pack ({})", FileUtils.byteCountToDisplaySize( FileUtils.sizeOf(inputFile))); ourLog.info("Successfully Loaded example pack ({})", FileUtils.byteCountToDisplaySize(FileUtils.sizeOf(inputFile)));
IOUtils.closeQuietly(result.getEntity().getContent()); IOUtils.closeQuietly(result.getEntity().getContent());
} }
@ -230,37 +236,111 @@ public class ExampleDataUploader extends BaseCommand {
return getBundleFromFileDstu3(theLimit, theSuppliedFile, theCtx); return getBundleFromFileDstu3(theLimit, theSuppliedFile, theCtx);
default: default:
throw new ParseException("Invalid spec version for this command: " + theCtx.getVersion().getVersion()); throw new ParseException("Invalid spec version for this command: " + theCtx.getVersion().getVersion());
} }
} }
private void sendBundleToTarget(String targetServer, FhirContext ctx, IBaseBundle bundle) throws Exception, IOException { private void sendBundleToTarget(String targetServer, FhirContext ctx, IBaseBundle bundle) throws Exception, IOException {
List<IBaseResource> resources = BundleUtil.toListOfResources(ctx, bundle);
String encoded = ctx.newXmlParser().setPrettyPrint(true).encodeResourceToString(bundle); for (Iterator<IBaseResource> iter = resources.iterator(); iter.hasNext(); ) {
ourLog.info("Final bundle: {}", FileUtils.byteCountToDisplaySize(encoded.length())); IBaseResource next = iter.next();
String nextType = ctx.getResourceDefinition(next).getName();
if (targetServer.startsWith("file://")) { if (nextType.endsWith("Definition")) {
String path = targetServer.substring("file://".length()); iter.remove();
ourLog.info("Writing bundle to: {}", path); } else if (nextType.contains("ValueSet")) {
File file = new File(path); iter.remove();
if (file.exists()) { } else if (nextType.equals("CodeSystem")) {
throw new Exception("File already exists: " + file.getAbsolutePath()); iter.remove();
} }
FileWriter w = new FileWriter(file, false);
w.append(encoded);
w.close();
} else {
ourLog.info("Uploading bundle to server: " + targetServer);
IGenericClient fhirClient = newClient(ctx, targetServer);
fhirClient.registerInterceptor(new GZipContentInterceptor());
long start = System.currentTimeMillis();
fhirClient.transaction().withBundle(bundle).execute();
long delay = System.currentTimeMillis() - start;
ourLog.info("Finished uploading bundle to server (took {} ms)", delay);
} }
List<IBaseResource> subResourceList = new ArrayList<IBaseResource>();
while (resources.size() > 0) {
subResourceList.add(resources.remove(0));
boolean found = false;
do {
for (IBaseResource nextTarget : subResourceList) {
for (int i = 0; i < resources.size(); i++) {
IBaseResource nextCandidateSource = resources.get(i);
for (ResourceReferenceInfo nextRef : ctx.newTerser().getAllResourceReferences(nextCandidateSource)) {
/*
* If we have a reference URL but not a resource, it's a reference
* to another server and we can't upload it
*/
if (isNotBlank(nextRef.getResourceReference().getReferenceElement().getValue())) {
if (nextRef.getResourceReference().getReferenceElement().getValue().contains("gsk.com")) {
nextRef.getResourceReference().setReference("");
}
}
String nextRes = nextRef.getResourceReference().getReferenceElement().toUnqualifiedVersionless().getValue();
if (isNotBlank(nextRes) && nextRes.equals(nextTarget.getIdElement().toUnqualifiedVersionless().getValue())) {
subResourceList.add(resources.remove(i));
i--;
found = true;
}
}
}
}
} while (found == true);
if (subResourceList.size() < 10 && resources.size() > 0) {
subResourceList.add(resources.remove(0));
continue;
}
ourLog.info("About to upload {} examples in a transaction, {} remaining", subResourceList.size(), resources.size());
if (true) {
subResourceList.clear();
continue;
}
IVersionSpecificBundleFactory bundleFactory = ctx.newBundleFactory();
bundleFactory.initializeBundleFromResourceList(null, subResourceList, null, null, 0, BundleTypeEnum.TRANSACTION);
IBaseResource subBundle = bundleFactory.getResourceBundle();
String encoded = ctx.newXmlParser().setPrettyPrint(true).encodeResourceToString(subBundle);
ourLog.info("Final bundle: {}", FileUtils.byteCountToDisplaySize(encoded.length()));
if (targetServer.startsWith("file://")) {
String path = targetServer.substring("file://".length());
ourLog.info("Writing bundle to: {}", path);
File file = new File(path);
if (file.exists()) {
throw new Exception("File already exists: " + file.getAbsolutePath());
}
FileWriter w = new FileWriter(file, false);
w.append(encoded);
w.close();
} else {
ourLog.info("Uploading bundle to server: " + targetServer);
IGenericClient fhirClient = newClient(ctx, targetServer);
fhirClient.registerInterceptor(new GZipContentInterceptor());
long start = System.currentTimeMillis();
try {
fhirClient.transaction().withBundle(encoded).execute();
} catch (BaseServerResponseException e) {
ourLog.error("Failed to upload", e);
ourLog.error("Failing bundle: {}", encoded);
}
long delay = System.currentTimeMillis() - start;
ourLog.info("Finished uploading bundle to server (took {} ms)", delay);
}
subResourceList.clear();
}
} }
private void processBundle(FhirContext ctx, IBaseBundle bundle) { private void processBundle(FhirContext ctx, IBaseBundle bundle) {
switch (ctx.getVersion().getVersion()) { switch (ctx.getVersion().getVersion()) {
case DSTU2: case DSTU2:
@ -283,7 +363,8 @@ public class ExampleDataUploader extends BaseCommand {
Entry next = iterator.next(); Entry next = iterator.next();
// DataElement have giant IDs that seem invalid, need to investigate this.. // DataElement have giant IDs that seem invalid, need to investigate this..
if ("DataElement".equals(next.getResource().getResourceName()) || "OperationOutcome".equals(next.getResource().getResourceName()) || "OperationDefinition".equals(next.getResource().getResourceName())) { if ("DataElement".equals(next.getResource().getResourceName()) || "OperationOutcome".equals(next.getResource().getResourceName())
|| "OperationDefinition".equals(next.getResource().getResourceName())) {
ourLog.info("Skipping " + next.getResource().getResourceName() + " example"); ourLog.info("Skipping " + next.getResource().getResourceName() + " example");
iterator.remove(); iterator.remove();
} else { } else {
@ -375,12 +456,12 @@ public class ExampleDataUploader extends BaseCommand {
Map<String, Integer> ids = new HashMap<String, Integer>(); Map<String, Integer> ids = new HashMap<String, Integer>();
Set<String> fullIds = new HashSet<String>(); Set<String> fullIds = new HashSet<String>();
for (Iterator<BundleEntryComponent> iterator = bundle.getEntry().iterator(); iterator.hasNext();) { for (Iterator<BundleEntryComponent> iterator = bundle.getEntry().iterator(); iterator.hasNext();) {
BundleEntryComponent next = iterator.next(); BundleEntryComponent next = iterator.next();
// DataElement have giant IDs that seem invalid, need to investigate this.. // DataElement have giant IDs that seem invalid, need to investigate this..
if ("DataElement".equals(next.getResource().getResourceType().name()) || "OperationOutcome".equals(next.getResource().getResourceType().name()) || "OperationDefinition".equals(next.getResource().getResourceType().name())) { if ("DataElement".equals(next.getResource().getResourceType().name()) || "OperationOutcome".equals(next.getResource().getResourceType().name())
|| "OperationDefinition".equals(next.getResource().getResourceType().name())) {
ourLog.info("Skipping " + next.getResource().getResourceType().name() + " example"); ourLog.info("Skipping " + next.getResource().getResourceType().name() + " example");
iterator.remove(); iterator.remove();
} else { } else {
@ -467,8 +548,7 @@ public class ExampleDataUploader extends BaseCommand {
} }
private Bundle getBundleFromFileDstu2(Integer limit, File inputFile, FhirContext ctx) private Bundle getBundleFromFileDstu2(Integer limit, File inputFile, FhirContext ctx) throws IOException, UnsupportedEncodingException {
throws IOException, UnsupportedEncodingException {
Bundle bundle = new Bundle(); Bundle bundle = new Bundle();
@ -533,95 +613,95 @@ public class ExampleDataUploader extends BaseCommand {
return bundle; return bundle;
} }
private org.hl7.fhir.dstu3.model.Bundle getBundleFromFileDstu3(Integer limit, File inputFile, FhirContext ctx) private org.hl7.fhir.dstu3.model.Bundle getBundleFromFileDstu3(Integer limit, File inputFile, FhirContext ctx) throws IOException, UnsupportedEncodingException {
throws IOException, UnsupportedEncodingException {
org.hl7.fhir.dstu3.model.Bundle bundle = new org.hl7.fhir.dstu3.model.Bundle(); org.hl7.fhir.dstu3.model.Bundle bundle = new org.hl7.fhir.dstu3.model.Bundle();
bundle.setType(BundleType.TRANSACTION); bundle.setType(BundleType.TRANSACTION);
FhirValidator val = ctx.newValidator(); FhirValidator val = ctx.newValidator();
val.registerValidatorModule(new FhirInstanceValidator(new DefaultProfileValidationSupport())); val.registerValidatorModule(new FhirInstanceValidator(new DefaultProfileValidationSupport()));
ZipInputStream zis = new ZipInputStream(FileUtils.openInputStream(inputFile)); ZipInputStream zis = new ZipInputStream(FileUtils.openInputStream(inputFile));
byte[] buffer = new byte[2048]; byte[] buffer = new byte[2048];
int count = 0; int count = 0;
while (true) { while (true) {
count++; count++;
if (limit != null && count > limit) { if (limit != null && count > limit) {
break; break;
} }
ZipEntry nextEntry = zis.getNextEntry(); ZipEntry nextEntry = zis.getNextEntry();
if (nextEntry == null) { if (nextEntry == null) {
break; break;
} }
int len = 0; int len = 0;
ByteArrayOutputStream bos = new ByteArrayOutputStream(); ByteArrayOutputStream bos = new ByteArrayOutputStream();
while ((len = zis.read(buffer)) > 0) { while ((len = zis.read(buffer)) > 0) {
bos.write(buffer, 0, len); bos.write(buffer, 0, len);
} }
byte[] exampleBytes = bos.toByteArray(); byte[] exampleBytes = bos.toByteArray();
String exampleString = new String(exampleBytes, "UTF-8"); String exampleString = new String(exampleBytes, "UTF-8");
if (ourLog.isTraceEnabled()) { if (ourLog.isTraceEnabled()) {
ourLog.trace("Next example: " + exampleString); ourLog.trace("Next example: " + exampleString);
} }
IBaseResource parsed; IBaseResource parsed;
try { try {
parsed = ctx.newJsonParser().parseResource(exampleString); parsed = ctx.newJsonParser().parseResource(exampleString);
} catch (Exception e) { } catch (Exception e) {
ourLog.info("FAILED to parse example {}", nextEntry.getName(), e); ourLog.info("FAILED to parse example {}", nextEntry.getName(), e);
continue; continue;
} }
ourLog.info("Found example {} - {} - {} chars", nextEntry.getName(), parsed.getClass().getSimpleName(), exampleString.length()); ourLog.info("Found example {} - {} - {} chars", nextEntry.getName(), parsed.getClass().getSimpleName(), exampleString.length());
ValidationResult result = val.validateWithResult(parsed); ValidationResult result = val.validateWithResult(parsed);
if (result.isSuccessful() == false) { if (result.isSuccessful() == false) {
ourLog.info("FAILED to validate example {}", nextEntry.getName()); ourLog.info("FAILED to validate example {}", nextEntry.getName());
continue; continue;
} }
if (ctx.getResourceDefinition(parsed).getName().equals("Bundle")) { if (ctx.getResourceDefinition(parsed).getName().equals("Bundle")) {
BaseRuntimeChildDefinition entryChildDef = ctx.getResourceDefinition(parsed).getChildByName("entry"); BaseRuntimeChildDefinition entryChildDef = ctx.getResourceDefinition(parsed).getChildByName("entry");
BaseRuntimeElementCompositeDefinition<?> entryDef = (BaseRuntimeElementCompositeDefinition<?>) entryChildDef.getChildByName("entry"); BaseRuntimeElementCompositeDefinition<?> entryDef = (BaseRuntimeElementCompositeDefinition<?>) entryChildDef.getChildByName("entry");
for (IBase nextEntry1 : entryChildDef.getAccessor().getValues(parsed)) { for (IBase nextEntry1 : entryChildDef.getAccessor().getValues(parsed)) {
List<IBase> resources = entryDef.getChildByName("resource").getAccessor().getValues(nextEntry1); List<IBase> resources = entryDef.getChildByName("resource").getAccessor().getValues(nextEntry1);
if (resources == null) { if (resources == null) {
continue;
}
for (IBase nextResource : resources) {
if (nextResource == null) {
continue;
}
if (!ctx.getResourceDefinition((Class<? extends IBaseResource>) nextResource.getClass()).getName().equals("Bundle") && ctx.getResourceDefinition((Class<? extends IBaseResource>) nextResource.getClass()).getName().equals("SearchParameter")) {
BundleEntryComponent entry = bundle.addEntry();
entry.getRequest().setMethod(HTTPVerb.POST);
entry.setResource((Resource) nextResource);
}
}
}
} else {
if (ctx.getResourceDefinition(parsed).getName().equals("SearchParameter")) {
continue; continue;
} }
BundleEntryComponent entry = bundle.addEntry(); for (IBase nextResource : resources) {
entry.getRequest().setMethod(HTTPVerb.POST); if (nextResource == null) {
entry.setResource((Resource) parsed); continue;
}
if (!ctx.getResourceDefinition((Class<? extends IBaseResource>) nextResource.getClass()).getName().equals("Bundle")
&& ctx.getResourceDefinition((Class<? extends IBaseResource>) nextResource.getClass()).getName().equals("SearchParameter")) {
BundleEntryComponent entry = bundle.addEntry();
entry.getRequest().setMethod(HTTPVerb.POST);
entry.setResource((Resource) nextResource);
}
}
} }
} else {
if (ctx.getResourceDefinition(parsed).getName().equals("SearchParameter")) {
continue;
}
BundleEntryComponent entry = bundle.addEntry();
entry.getRequest().setMethod(HTTPVerb.POST);
entry.setResource((Resource) parsed);
} }
return bundle;
} }
return bundle;
}
private void downloadFileFromInternet(CloseableHttpResponse result, File localFile ) throws IOException { private void downloadFileFromInternet(CloseableHttpResponse result, File localFile) throws IOException {
FileOutputStream buffer = FileUtils.openOutputStream(localFile); FileOutputStream buffer = FileUtils.openOutputStream(localFile);
long maxLength = result.getEntity().getContentLength(); long maxLength = result.getEntity().getContentLength();
long nextLog = -1; long nextLog = -1;
// ByteArrayOutputStream buffer = new ByteArrayOutputStream(); // ByteArrayOutputStream buffer = new ByteArrayOutputStream();
int nRead; int nRead;
byte[] data = new byte[16384]; byte[] data = new byte[16384];
while ((nRead = result.getEntity().getContent().read(data, 0, data.length)) != -1) { while ((nRead = result.getEntity().getContent().read(data, 0, data.length)) != -1) {
@ -632,7 +712,7 @@ public class ExampleDataUploader extends BaseCommand {
System.err.print(FileUtils.byteCountToDisplaySize(fileSize)); System.err.print(FileUtils.byteCountToDisplaySize(fileSize));
if (maxLength > 0) { if (maxLength > 0) {
System.err.print(" ["); System.err.print(" [");
int stars = (int)(50.0f * ((float)fileSize / (float)maxLength)); int stars = (int) (50.0f * ((float) fileSize / (float) maxLength));
for (int i = 0; i < stars; i++) { for (int i = 0; i < stars; i++) {
System.err.print("*"); System.err.print("*");
} }
@ -654,33 +734,33 @@ public class ExampleDataUploader extends BaseCommand {
private byte[] readStreamFromInternet(CloseableHttpResponse result) throws IOException { private byte[] readStreamFromInternet(CloseableHttpResponse result) throws IOException {
byte[] inputBytes; byte[] inputBytes;
{ {
long maxLength = result.getEntity().getContentLength(); long maxLength = result.getEntity().getContentLength();
int nextLog = -1; int nextLog = -1;
ByteArrayOutputStream buffer = new ByteArrayOutputStream(); ByteArrayOutputStream buffer = new ByteArrayOutputStream();
int nRead; int nRead;
byte[] data = new byte[16384]; byte[] data = new byte[16384];
while ((nRead = result.getEntity().getContent().read(data, 0, data.length)) != -1) { while ((nRead = result.getEntity().getContent().read(data, 0, data.length)) != -1) {
buffer.write(data, 0, nRead); buffer.write(data, 0, nRead);
if (buffer.size() > nextLog) { if (buffer.size() > nextLog) {
System.err.print("\r" + Ansi.ansi().eraseLine()); System.err.print("\r" + Ansi.ansi().eraseLine());
System.err.print(FileUtils.byteCountToDisplaySize(buffer.size())); System.err.print(FileUtils.byteCountToDisplaySize(buffer.size()));
if (maxLength > 0) { if (maxLength > 0) {
System.err.print(" ["); System.err.print(" [");
int stars = (int)(50.0f * ((float)buffer.size() / (float)maxLength)); int stars = (int) (50.0f * ((float) buffer.size() / (float) maxLength));
for (int i = 0; i < stars; i++) { for (int i = 0; i < stars; i++) {
System.err.print("*"); System.err.print("*");
} }
for (int i = stars; i < 50; i++) { for (int i = stars; i < 50; i++) {
System.err.print(" "); System.err.print(" ");
} }
System.err.print("]"); System.err.print("]");
} }
System.err.flush(); System.err.flush();
nextLog += 100000; nextLog += 100000;
} }
} }
buffer.flush(); buffer.flush();
inputBytes = buffer.toByteArray(); inputBytes = buffer.toByteArray();
} }
System.err.println(); System.err.println();
System.err.flush(); System.err.flush();

View File

@ -182,71 +182,71 @@ public class ValidationDataUploader extends BaseCommand {
int total = 0; int total = 0;
int count = 0; int count = 0;
org.hl7.fhir.dstu3.model.Bundle bundle; org.hl7.fhir.dstu3.model.Bundle bundle;
String vsContents;
// String vsContents; try {
// try { ctx.getVersion().getPathToSchemaDefinitions();
// ctx.getVersion().getPathToSchemaDefinitions(); vsContents = IOUtils.toString(ValidationDataUploader.class.getResourceAsStream("/org/hl7/fhir/instance/model/dstu3/valueset/"+"valuesets.xml"), "UTF-8");
// vsContents = IOUtils.toString(ValidationDataUploader.class.getResourceAsStream("/org/hl7/fhir/instance/model/dstu3/valueset/"+"valuesets.xml"), "UTF-8"); } catch (IOException e) {
// } catch (IOException e) { throw new CommandFailureException(e.toString());
// throw new CommandFailureException(e.toString()); }
// } bundle = ctx.newXmlParser().parseResource(org.hl7.fhir.dstu3.model.Bundle.class, vsContents);
// org.hl7.fhir.dstu3.model.Bundle bundle = ctx.newXmlParser().parseResource(org.hl7.fhir.dstu3.model.Bundle.class, vsContents);
// total = bundle.getEntry().size();
// total = bundle.getEntry().size(); count = 1;
// count = 1; for (BundleEntryComponent i : bundle.getEntry()) {
// for (BundleEntryComponent i : bundle.getEntry()) { org.hl7.fhir.dstu3.model.Resource next = i.getResource();
// org.hl7.fhir.dstu3.model.Resource next = i.getResource(); next.setId(next.getIdElement().toUnqualifiedVersionless());
// next.setId(next.getIdElement().toUnqualifiedVersionless());
// ourLog.info("Uploading ValueSet {}/{} : {}", new Object[] { count, total, next.getIdElement().getValue() });
// ourLog.info("Uploading ValueSet {}/{} : {}", new Object[] { count, total, next.getIdElement().getValue() }); try {
// try { client.update().resource(next).execute();
// client.update().resource(next).execute(); } catch (UnprocessableEntityException e) {
// } catch (UnprocessableEntityException e) { ourLog.warn("UnprocessableEntityException: " + e.toString());
// ourLog.warn("UnprocessableEntityException: " + e.toString()); }
// } count++;
// count++; }
// }
// try {
// try { vsContents = IOUtils.toString(ValidationDataUploader.class.getResourceAsStream("/org/hl7/fhir/instance/model/dstu3/valueset/"+"v3-codesystems.xml"), "UTF-8");
// vsContents = IOUtils.toString(ValidationDataUploader.class.getResourceAsStream("/org/hl7/fhir/instance/model/dstu3/valueset/"+"v3-codesystems.xml"), "UTF-8"); } catch (IOException e) {
// } catch (IOException e) { throw new CommandFailureException(e.toString());
// throw new CommandFailureException(e.toString()); }
// }
// bundle = ctx.newXmlParser().parseResource(org.hl7.fhir.dstu3.model.Bundle.class, vsContents);
// bundle = ctx.newXmlParser().parseResource(org.hl7.fhir.dstu3.model.Bundle.class, vsContents); total = bundle.getEntry().size();
// total = bundle.getEntry().size(); count = 1;
// count = 1; for (BundleEntryComponent i : bundle.getEntry()) {
// for (BundleEntryComponent i : bundle.getEntry()) { org.hl7.fhir.dstu3.model.Resource next = i.getResource();
// org.hl7.fhir.dstu3.model.Resource next = i.getResource(); next.setId(next.getIdElement().toUnqualifiedVersionless());
// next.setId(next.getIdElement().toUnqualifiedVersionless());
// ourLog.info("Uploading v3-codesystems ValueSet {}/{} : {}", new Object[] { count, total, next.getIdElement().getValue() });
// ourLog.info("Uploading v3-codesystems ValueSet {}/{} : {}", new Object[] { count, total, next.getIdElement().getValue() }); client.update().resource(next).execute();
// client.update().resource(next).execute();
// count++;
// count++; }
// }
// try {
// try { vsContents = IOUtils.toString(ValidationDataUploader.class.getResourceAsStream("/org/hl7/fhir/instance/model/dstu3/valueset/"+"v2-tables.xml"), "UTF-8");
// vsContents = IOUtils.toString(ValidationDataUploader.class.getResourceAsStream("/org/hl7/fhir/instance/model/dstu3/valueset/"+"v2-tables.xml"), "UTF-8"); } catch (IOException e) {
// } catch (IOException e) { throw new CommandFailureException(e.toString());
// throw new CommandFailureException(e.toString()); }
// } bundle = ctx.newXmlParser().parseResource(org.hl7.fhir.dstu3.model.Bundle.class, vsContents);
// bundle = ctx.newXmlParser().parseResource(org.hl7.fhir.dstu3.model.Bundle.class, vsContents); total = bundle.getEntry().size();
// total = bundle.getEntry().size(); count = 1;
// count = 1; for (BundleEntryComponent i : bundle.getEntry()) {
// for (BundleEntryComponent i : bundle.getEntry()) { org.hl7.fhir.dstu3.model.Resource next = i.getResource();
// org.hl7.fhir.dstu3.model.Resource next = i.getResource(); if (next.getIdElement().isIdPartValidLong()) {
// if (next.getIdElement().isIdPartValidLong()) { next.setIdElement(new IdType("v2-"+ next.getIdElement().getIdPart()));
// next.setIdElement(new IdType("v2-"+ next.getIdElement().getIdPart())); }
// } next.setId(next.getIdElement().toUnqualifiedVersionless());
// next.setId(next.getIdElement().toUnqualifiedVersionless());
// ourLog.info("Uploading v2-tables ValueSet {}/{} : {}", new Object[] { count, total, next.getIdElement().getValue() });
// ourLog.info("Uploading v2-tables ValueSet {}/{} : {}", new Object[] { count, total, next.getIdElement().getValue() }); client.update().resource(next).execute();
// client.update().resource(next).execute(); count++;
// count++; }
// }
// ourLog.info("Finished uploading ValueSets");
// ourLog.info("Finished uploading ValueSets");
uploadDstu3Profiles(ctx, client, "profiles-resources"); uploadDstu3Profiles(ctx, client, "profiles-resources");

View File

@ -454,7 +454,7 @@ public class FhirSystemDaoDstu3 extends BaseHapiFhirSystemDao<Bundle, Meta> {
for (Iterator<DeleteConflict> iter = deleteConflicts.iterator(); iter.hasNext(); ) { for (Iterator<DeleteConflict> iter = deleteConflicts.iterator(); iter.hasNext(); ) {
DeleteConflict next = iter.next(); DeleteConflict next = iter.next();
if (deletedResources.contains(next.getTargetId().toVersionless())) { if (deletedResources.contains(next.getTargetId().toUnqualifiedVersionless().getValue())) {
iter.remove(); iter.remove();
} }
} }

View File

@ -25,9 +25,11 @@ import static org.apache.commons.lang3.StringUtils.isNotBlank;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.Date;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
import java.util.TreeSet;
import javax.measure.unit.NonSI; import javax.measure.unit.NonSI;
import javax.measure.unit.Unit; import javax.measure.unit.Unit;
@ -44,6 +46,7 @@ import org.hl7.fhir.dstu3.model.CodeableConcept;
import org.hl7.fhir.dstu3.model.Coding; import org.hl7.fhir.dstu3.model.Coding;
import org.hl7.fhir.dstu3.model.Conformance.ConformanceRestSecurityComponent; import org.hl7.fhir.dstu3.model.Conformance.ConformanceRestSecurityComponent;
import org.hl7.fhir.dstu3.model.ContactPoint; import org.hl7.fhir.dstu3.model.ContactPoint;
import org.hl7.fhir.dstu3.model.DateTimeType;
import org.hl7.fhir.dstu3.model.Duration; import org.hl7.fhir.dstu3.model.Duration;
import org.hl7.fhir.dstu3.model.Enumeration; import org.hl7.fhir.dstu3.model.Enumeration;
import org.hl7.fhir.dstu3.model.HumanName; import org.hl7.fhir.dstu3.model.HumanName;
@ -55,13 +58,13 @@ import org.hl7.fhir.dstu3.model.Period;
import org.hl7.fhir.dstu3.model.Quantity; import org.hl7.fhir.dstu3.model.Quantity;
import org.hl7.fhir.dstu3.model.Questionnaire; import org.hl7.fhir.dstu3.model.Questionnaire;
import org.hl7.fhir.dstu3.model.StringType; import org.hl7.fhir.dstu3.model.StringType;
import org.hl7.fhir.dstu3.model.Timing;
import org.hl7.fhir.dstu3.model.UriType; import org.hl7.fhir.dstu3.model.UriType;
import org.hl7.fhir.dstu3.utils.FHIRPathEngine; import org.hl7.fhir.dstu3.utils.FHIRPathEngine;
import org.hl7.fhir.dstu3.utils.IWorkerContext; import org.hl7.fhir.dstu3.utils.IWorkerContext;
import org.hl7.fhir.instance.model.api.IBase; import org.hl7.fhir.instance.model.api.IBase;
import org.hl7.fhir.instance.model.api.IBaseResource; import org.hl7.fhir.instance.model.api.IBaseResource;
import org.hl7.fhir.instance.model.api.IPrimitiveType; import org.hl7.fhir.instance.model.api.IPrimitiveType;
import org.omg.PortableServer.ThreadPolicyValue;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import com.google.common.annotations.VisibleForTesting; import com.google.common.annotations.VisibleForTesting;
@ -176,6 +179,22 @@ public class SearchParamExtractorDstu3 extends BaseSearchParamExtractor implemen
continue; continue;
} }
nextEntity = new ResourceIndexedSearchParamDate(nextSpDef.getName(), nextValue.getStart(), nextValue.getEnd()); nextEntity = new ResourceIndexedSearchParamDate(nextSpDef.getName(), nextValue.getStart(), nextValue.getEnd());
} else if (nextObject instanceof Timing) {
Timing nextValue = (Timing) nextObject;
if (nextValue.isEmpty()) {
continue;
}
TreeSet<Date> dates = new TreeSet<Date>();
for (DateTimeType nextEvent : nextValue.getEvent()) {
if (nextEvent.getValue() != null) {
dates.add(nextEvent.getValue());
}
}
if (dates.isEmpty()) {
continue;
}
nextEntity = new ResourceIndexedSearchParamDate(nextSpDef.getName(), dates.first(), dates.last());
} else { } else {
if (!multiType) { if (!multiType) {
throw new ConfigurationException("Search param " + nextSpDef.getName() + " is of unexpected datatype: " + nextObject.getClass()); throw new ConfigurationException("Search param " + nextSpDef.getName() + " is of unexpected datatype: " + nextObject.getClass());

View File

@ -14,6 +14,7 @@ import org.hibernate.search.jpa.Search;
import org.hl7.fhir.dstu3.hapi.validation.IValidationSupport; import org.hl7.fhir.dstu3.hapi.validation.IValidationSupport;
import org.hl7.fhir.dstu3.model.Appointment; import org.hl7.fhir.dstu3.model.Appointment;
import org.hl7.fhir.dstu3.model.Bundle; import org.hl7.fhir.dstu3.model.Bundle;
import org.hl7.fhir.dstu3.model.CarePlan;
import org.hl7.fhir.dstu3.model.CodeSystem; import org.hl7.fhir.dstu3.model.CodeSystem;
import org.hl7.fhir.dstu3.model.CodeableConcept; import org.hl7.fhir.dstu3.model.CodeableConcept;
import org.hl7.fhir.dstu3.model.Coding; import org.hl7.fhir.dstu3.model.Coding;
@ -157,6 +158,9 @@ protected IFhirResourceDao<Observation> myObservationDao;
@Qualifier("myPatientDaoDstu3") @Qualifier("myPatientDaoDstu3")
protected IFhirResourceDaoPatient<Patient> myPatientDao; protected IFhirResourceDaoPatient<Patient> myPatientDao;
@Autowired @Autowired
@Qualifier("myCarePlanDaoDstu3")
protected IFhirResourceDao<CarePlan> myCarePlanDao;
@Autowired
@Qualifier("myPractitionerDaoDstu3") @Qualifier("myPractitionerDaoDstu3")
protected IFhirResourceDao<Practitioner> myPractitionerDao; protected IFhirResourceDao<Practitioner> myPractitionerDao;
@Autowired @Autowired

View File

@ -40,6 +40,7 @@ import org.hl7.fhir.dstu3.model.Bundle;
import org.hl7.fhir.dstu3.model.Bundle.BundleEntryComponent; import org.hl7.fhir.dstu3.model.Bundle.BundleEntryComponent;
import org.hl7.fhir.dstu3.model.Bundle.BundleType; import org.hl7.fhir.dstu3.model.Bundle.BundleType;
import org.hl7.fhir.dstu3.model.Bundle.HTTPVerb; import org.hl7.fhir.dstu3.model.Bundle.HTTPVerb;
import org.hl7.fhir.dstu3.model.CarePlan;
import org.hl7.fhir.dstu3.model.CodeType; import org.hl7.fhir.dstu3.model.CodeType;
import org.hl7.fhir.dstu3.model.CodeableConcept; import org.hl7.fhir.dstu3.model.CodeableConcept;
import org.hl7.fhir.dstu3.model.Coding; import org.hl7.fhir.dstu3.model.Coding;
@ -68,6 +69,7 @@ import org.hl7.fhir.dstu3.model.Questionnaire;
import org.hl7.fhir.dstu3.model.Reference; import org.hl7.fhir.dstu3.model.Reference;
import org.hl7.fhir.dstu3.model.StringType; import org.hl7.fhir.dstu3.model.StringType;
import org.hl7.fhir.dstu3.model.StructureDefinition; import org.hl7.fhir.dstu3.model.StructureDefinition;
import org.hl7.fhir.dstu3.model.Timing;
import org.hl7.fhir.dstu3.model.UriType; import org.hl7.fhir.dstu3.model.UriType;
import org.hl7.fhir.instance.model.api.IAnyResource; import org.hl7.fhir.instance.model.api.IAnyResource;
import org.hl7.fhir.instance.model.api.IBaseResource; import org.hl7.fhir.instance.model.api.IBaseResource;
@ -132,6 +134,7 @@ public class FhirResourceDaoDstu3Test extends BaseJpaDstu3Test {
} }
} }
@Test @Test
@Ignore @Ignore
public void testCreateBuiltInProfiles() throws Exception { public void testCreateBuiltInProfiles() throws Exception {
@ -569,6 +572,38 @@ public class FhirResourceDaoDstu3Test extends BaseJpaDstu3Test {
} }
} }
@Test
@Ignore
public void testTimingSearchParams() throws Exception {
Date before = new DateTimeType("2011-01-01T10:00:00Z").getValue();
Date middle = new DateTimeType("2011-01-02T10:00:00Z").getValue();
Date after = new DateTimeType("2011-01-03T10:00:00Z").getValue();
CarePlan cp = new CarePlan();
cp.addActivity().getDetail().setScheduled(new Timing().addEvent(before).addEvent(middle).addEvent(after));
cp.addActivity().getDetail();
IIdType id = myCarePlanDao.create(cp, mySrd).getId().toUnqualifiedVersionless();
CarePlan cp2 = new CarePlan();
cp2.addActivity().getDetail().setScheduled(new StringType("FOO"));
cp2.addActivity().getDetail();
IIdType id2 = myCarePlanDao.create(cp2, mySrd).getId().toUnqualifiedVersionless();
SearchParameterMap params;
params = new SearchParameterMap();
params.add(CarePlan.SP_ACTIVITYDATE, new DateRangeParam("2010-01-01T10:00:00Z", null));
assertThat(toUnqualifiedVersionlessIdValues(myCarePlanDao.search(params)), contains(id.getValue()));
params = new SearchParameterMap();
params.add(CarePlan.SP_ACTIVITYDATE, new DateRangeParam("2011-01-01T10:00:00Z", null));
assertThat(toUnqualifiedVersionlessIdValues(myCarePlanDao.search(params)), contains(id.getValue()));
params = new SearchParameterMap();
params.add(CarePlan.SP_ACTIVITYDATE, new DateRangeParam("2012-01-01T10:00:00Z", null));
assertThat(toUnqualifiedVersionlessIdValues(myCarePlanDao.search(params)), empty());
}
@Test @Test
public void testCreateWithIdFails() { public void testCreateWithIdFails() {
Patient p = new Patient(); Patient p = new Patient();
@ -677,6 +712,26 @@ public class FhirResourceDaoDstu3Test extends BaseJpaDstu3Test {
} }
@Test
public void testCreateWithIfNoneExistId() {
String methodName = "testCreateWithIfNoneExistId";
MethodOutcome results;
Patient p = new Patient();
p.addIdentifier().setSystem("urn:system").setValue(methodName);
IIdType id = myPatientDao.create(p, mySrd).getId().toUnqualified();
ourLog.info("Created patient, got it: {}", id);
p = new Patient();
p.addIdentifier().setSystem("urn:system").setValue(methodName);
p.addName().addFamily("Hello");
results = myPatientDao.create(p, "Patient?_id=" + id.toVersionless().getValue(), mySrd);
assertEquals(id.getIdPart(), results.getId().getIdPart());
assertEquals(id.getVersionIdPart(), results.getId().getVersionIdPart());
assertFalse(results.getCreated().booleanValue());
}
@Test @Test
public void testCreateWithIllegalReference() { public void testCreateWithIllegalReference() {
Observation o1 = new Observation(); Observation o1 = new Observation();

View File

@ -33,6 +33,7 @@ import java.util.List;
import org.apache.commons.io.IOUtils; import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.Validate;
import org.apache.http.client.ClientProtocolException; import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpDelete; import org.apache.http.client.methods.HttpDelete;
@ -123,6 +124,16 @@ public class ResourceProviderDstu3Test extends BaseResourceProviderDstu3Test {
TestUtil.clearAllStaticFieldsForUnitTest(); TestUtil.clearAllStaticFieldsForUnitTest();
} }
/**
* Issue submitted by Bryn
*/
@Test
public void testCreateBundle() throws IOException {
String input = IOUtils.toString(getClass().getResourceAsStream("/bryn-bundle.json"));
Validate.notNull(input);
ourClient.create().resource(input).execute().getResource();
}
@Test @Test
public void testSearchByExtendedChars() throws Exception { public void testSearchByExtendedChars() throws Exception {

View File

@ -232,6 +232,8 @@ public class SystemProviderDstu3Test extends BaseJpaDstu3Test {
ourClient.setLogRequestAndResponse(true); ourClient.setLogRequestAndResponse(true);
myRestServer = restServer; myRestServer = restServer;
} }
myRestServer.setDefaultResponseEncoding(EncodingEnum.XML);
} }
@SuppressWarnings("deprecation") @SuppressWarnings("deprecation")

View File

@ -0,0 +1,646 @@
{
"resourceType":"Bundle",
"type":"collection",
"entry":[
{
"fullUrl":"http://fhirtest.uhn.ca/baseDstu3/Observation/res0016/_history/1",
"resource":{
"resourceType":"Observation",
"id":"res0016",
"meta":{
"versionId":"1",
"lastUpdated":"2016-05-05T03:16:52.296-04:00"
},
"status":"final",
"code":{
"coding":[
{
"system":"http://loinc.org",
"code":"8480-6",
"display":"Systolic blood pressure"
}
]
},
"subject":{
"reference":"Patient/pat004",
"display":"Fred"
},
"effectiveDateTime":"2015-06-11",
"valueQuantity":{
"value":133,
"unit":"3092008",
"system":"http://unitsofmeasure.org",
"code":"mm[Hg]"
}
}
},
{
"fullUrl":"http://fhirtest.uhn.ca/baseDstu3/Observation/res0018/_history/1",
"resource":{
"resourceType":"Observation",
"id":"res0018",
"meta":{
"versionId":"1",
"lastUpdated":"2016-05-05T03:16:52.922-04:00"
},
"status":"final",
"code":{
"coding":[
{
"system":"http://loinc.org",
"code":"8480-6",
"display":"Systolic blood pressure"
}
]
},
"subject":{
"reference":"Patient/pat004",
"display":"Fred"
},
"effectiveDateTime":"2015-11-11",
"valueQuantity":{
"value":141,
"unit":"3092008",
"system":"http://unitsofmeasure.org",
"code":"mm[Hg]"
}
}
},
{
"fullUrl":"http://fhirtest.uhn.ca/baseDstu3/Observation/res0001/_history/2",
"resource":{
"resourceType":"Observation",
"id":"res0001",
"meta":{
"versionId":"2",
"lastUpdated":"2016-05-05T03:16:47.800-04:00"
},
"status":"final",
"code":{
"coding":[
{
"system":"http://loinc.org",
"code":"8480-6",
"display":"Systolic blood pressure"
}
]
},
"subject":{
"reference":"Patient/pat001",
"display":"Jim"
},
"effectiveDateTime":"2015-09-10",
"valueQuantity":{
"value":155,
"unit":"mmHg",
"system":"http://unitsofmeasure.org",
"code":"mm[Hg]"
}
}
},
{
"fullUrl":"http://fhirtest.uhn.ca/baseDstu3/Observation/res0021/_history/1",
"resource":{
"resourceType":"Observation",
"id":"res0021",
"meta":{
"versionId":"1",
"lastUpdated":"2016-05-05T03:16:53.928-04:00"
},
"status":"final",
"code":{
"coding":[
{
"system":"http://loinc.org",
"code":"8480-6",
"display":"Systolic blood pressure"
}
]
},
"subject":{
"reference":"Patient/pat005",
"display":"Ada"
},
"effectiveDateTime":"2016-02-11",
"valueQuantity":{
"value":148,
"unit":"3092008",
"system":"http://unitsofmeasure.org",
"code":"mm[Hg]"
}
}
},
{
"fullUrl":"http://fhirtest.uhn.ca/baseDstu3/Observation/res0003/_history/1",
"resource":{
"resourceType":"Observation",
"id":"res0003",
"meta":{
"versionId":"1",
"lastUpdated":"2016-05-05T03:16:48.457-04:00"
},
"status":"final",
"code":{
"coding":[
{
"system":"http://loinc.org",
"code":"8480-6",
"display":"Systolic blood pressure"
}
]
},
"subject":{
"reference":"Patient/pat001",
"display":"Jim"
},
"effectiveDateTime":"2016-01-10",
"valueQuantity":{
"value":138,
"unit":"3092008",
"system":"http://unitsofmeasure.org",
"code":"mm[Hg]"
}
}
},
{
"fullUrl":"http://fhirtest.uhn.ca/baseDstu3/Observation/res0023/_history/1",
"resource":{
"resourceType":"Observation",
"id":"res0023",
"meta":{
"versionId":"1",
"lastUpdated":"2016-05-05T03:16:55.084-04:00"
},
"status":"final",
"code":{
"coding":[
{
"system":"http://loinc.org",
"code":"8480-6",
"display":"Systolic blood pressure"
}
]
},
"subject":{
"reference":"Patient/pat005",
"display":"Ada"
},
"effectiveDateTime":"2015-12-11",
"valueQuantity":{
"value":140,
"unit":"3092008",
"system":"http://unitsofmeasure.org",
"code":"mm[Hg]"
}
}
},
{
"fullUrl":"http://fhirtest.uhn.ca/baseDstu3/Observation/res0006/_history/1",
"resource":{
"resourceType":"Observation",
"id":"res0006",
"meta":{
"versionId":"1",
"lastUpdated":"2016-05-05T03:16:49.312-04:00"
},
"status":"final",
"code":{
"coding":[
{
"system":"http://loinc.org",
"code":"8480-6",
"display":"Systolic blood pressure"
}
]
},
"subject":{
"reference":"Patient/pat002",
"display":"Chewie"
},
"effectiveDateTime":"2016-04-10",
"valueQuantity":{
"value":141,
"unit":"3092008",
"system":"http://unitsofmeasure.org",
"code":"mm[Hg]"
}
}
},
{
"fullUrl":"http://fhirtest.uhn.ca/baseDstu3/Observation/res0008/_history/1",
"resource":{
"resourceType":"Observation",
"id":"res0008",
"meta":{
"versionId":"1",
"lastUpdated":"2016-05-05T03:16:49.886-04:00"
},
"status":"final",
"code":{
"coding":[
{
"system":"http://loinc.org",
"code":"8480-6",
"display":"Systolic blood pressure"
}
]
},
"subject":{
"reference":"Patient/pat002",
"display":"Chewie"
},
"effectiveDateTime":"2015-08-10",
"valueQuantity":{
"value":140,
"unit":"3092008",
"system":"http://unitsofmeasure.org",
"code":"mm[Hg]"
}
}
},
{
"fullUrl":"http://fhirtest.uhn.ca/baseDstu3/Observation/res0011/_history/1",
"resource":{
"resourceType":"Observation",
"id":"res0011",
"meta":{
"versionId":"1",
"lastUpdated":"2016-05-05T03:16:50.746-04:00"
},
"status":"final",
"code":{
"coding":[
{
"system":"http://loinc.org",
"code":"8480-6",
"display":"Systolic blood pressure"
}
]
},
"subject":{
"reference":"Patient/pat003",
"display":"Esther"
},
"effectiveDateTime":"2015-12-10",
"valueQuantity":{
"value":144,
"unit":"3092008",
"system":"http://unitsofmeasure.org",
"code":"mm[Hg]"
}
}
},
{
"fullUrl":"http://fhirtest.uhn.ca/baseDstu3/Observation/res0013/_history/1",
"resource":{
"resourceType":"Observation",
"id":"res0013",
"meta":{
"versionId":"1",
"lastUpdated":"2016-05-05T03:16:51.339-04:00"
},
"status":"final",
"code":{
"coding":[
{
"system":"http://loinc.org",
"code":"8480-6",
"display":"Systolic blood pressure"
}
]
},
"subject":{
"reference":"Patient/pat003",
"display":"Esther"
},
"effectiveDateTime":"2016-02-10",
"valueQuantity":{
"value":170,
"unit":"3092008",
"system":"http://unitsofmeasure.org",
"code":"mm[Hg]"
}
}
},
{
"fullUrl":"http://fhirtest.uhn.ca/baseDstu3/Observation/res0017/_history/1",
"resource":{
"resourceType":"Observation",
"id":"res0017",
"meta":{
"versionId":"1",
"lastUpdated":"2016-05-05T03:16:52.652-04:00"
},
"status":"final",
"code":{
"coding":[
{
"system":"http://loinc.org",
"code":"8462-4",
"display":"Diastolic blood pressure"
}
]
},
"subject":{
"reference":"Patient/pat004",
"display":"Fred"
},
"effectiveDateTime":"2015-06-11",
"valueQuantity":{
"value":77,
"unit":"3092008",
"system":"http://unitsofmeasure.org",
"code":"mm[Hg]"
}
}
},
{
"fullUrl":"http://fhirtest.uhn.ca/baseDstu3/Observation/res0019/_history/1",
"resource":{
"resourceType":"Observation",
"id":"res0019",
"meta":{
"versionId":"1",
"lastUpdated":"2016-05-05T03:16:53.256-04:00"
},
"status":"final",
"code":{
"coding":[
{
"system":"http://loinc.org",
"code":"8462-4",
"display":"Diastolic blood pressure"
}
]
},
"subject":{
"reference":"Patient/pat004",
"display":"Fred"
},
"effectiveDateTime":"2015-11-11",
"valueQuantity":{
"value":92,
"unit":"3092008",
"system":"http://unitsofmeasure.org",
"code":"mm[Hg]"
}
}
},
{
"fullUrl":"http://fhirtest.uhn.ca/baseDstu3/Observation/res0002/_history/1",
"resource":{
"resourceType":"Observation",
"id":"res0002",
"meta":{
"versionId":"1",
"lastUpdated":"2016-05-05T03:16:48.168-04:00"
},
"status":"final",
"code":{
"coding":[
{
"system":"http://loinc.org",
"code":"8462-4",
"display":"Diastolic blood pressure"
}
]
},
"subject":{
"reference":"Patient/pat001",
"display":"Jim"
},
"effectiveDateTime":"2015-09-10",
"valueQuantity":{
"value":95,
"unit":"3092008",
"system":"http://unitsofmeasure.org",
"code":"mm[Hg]"
}
}
},
{
"fullUrl":"http://fhirtest.uhn.ca/baseDstu3/Observation/res0022/_history/1",
"resource":{
"resourceType":"Observation",
"id":"res0022",
"meta":{
"versionId":"1",
"lastUpdated":"2016-05-05T03:16:54.560-04:00"
},
"status":"final",
"code":{
"coding":[
{
"system":"http://loinc.org",
"code":"8462-4",
"display":"Diastolic blood pressure"
}
]
},
"subject":{
"reference":"Patient/pat005",
"display":"Ada"
},
"effectiveDateTime":"2016-02-11",
"valueQuantity":{
"value":80,
"unit":"3092008",
"system":"http://unitsofmeasure.org",
"code":"mm[Hg]"
}
}
},
{
"fullUrl":"http://fhirtest.uhn.ca/baseDstu3/Observation/res0004/_history/1",
"resource":{
"resourceType":"Observation",
"id":"res0004",
"meta":{
"versionId":"1",
"lastUpdated":"2016-05-05T03:16:48.760-04:00"
},
"status":"final",
"code":{
"coding":[
{
"system":"http://loinc.org",
"code":"8462-4",
"display":"Diastolic blood pressure"
}
]
},
"subject":{
"reference":"Patient/pat001",
"display":"Jim"
},
"effectiveDateTime":"2016-01-10",
"valueQuantity":{
"value":80,
"unit":"3092008",
"system":"http://unitsofmeasure.org",
"code":"mm[Hg]"
}
}
},
{
"fullUrl":"http://fhirtest.uhn.ca/baseDstu3/Observation/res0024/_history/1",
"resource":{
"resourceType":"Observation",
"id":"res0024",
"meta":{
"versionId":"1",
"lastUpdated":"2016-05-05T03:16:55.462-04:00"
},
"status":"final",
"code":{
"coding":[
{
"system":"http://loinc.org",
"code":"8462-4",
"display":"Diastolic blood pressure"
}
]
},
"subject":{
"reference":"Patient/pat005",
"display":"Ada"
},
"effectiveDateTime":"2015-12-11",
"valueQuantity":{
"value":92,
"unit":"3092008",
"system":"http://unitsofmeasure.org",
"code":"mm[Hg]"
}
}
},
{
"fullUrl":"http://fhirtest.uhn.ca/baseDstu3/Observation/res0007/_history/1",
"resource":{
"resourceType":"Observation",
"id":"res0007",
"meta":{
"versionId":"1",
"lastUpdated":"2016-05-05T03:16:49.575-04:00"
},
"status":"final",
"code":{
"coding":[
{
"system":"http://loinc.org",
"code":"8462-4",
"display":"Diastolic blood pressure"
}
]
},
"subject":{
"reference":"Patient/pat002",
"display":"Chewie"
},
"effectiveDateTime":"2016-04-10",
"valueQuantity":{
"value":88,
"unit":"3092008",
"system":"http://unitsofmeasure.org",
"code":"mm[Hg]"
}
}
},
{
"fullUrl":"http://fhirtest.uhn.ca/baseDstu3/Observation/res0009/_history/1",
"resource":{
"resourceType":"Observation",
"id":"res0009",
"meta":{
"versionId":"1",
"lastUpdated":"2016-05-05T03:16:50.190-04:00"
},
"status":"final",
"code":{
"coding":[
{
"system":"http://loinc.org",
"code":"8462-4",
"display":"Diastolic blood pressure"
}
]
},
"subject":{
"reference":"Patient/pat002",
"display":"Chewie"
},
"effectiveDateTime":"2015-08-10",
"valueQuantity":{
"value":90,
"unit":"3092008",
"system":"http://unitsofmeasure.org",
"code":"mm[Hg]"
}
}
},
{
"fullUrl":"http://fhirtest.uhn.ca/baseDstu3/Observation/res0012/_history/1",
"resource":{
"resourceType":"Observation",
"id":"res0012",
"meta":{
"versionId":"1",
"lastUpdated":"2016-05-05T03:16:51.060-04:00"
},
"status":"final",
"code":{
"coding":[
{
"system":"http://loinc.org",
"code":"8462-4",
"display":"Diastolic blood pressure"
}
]
},
"subject":{
"reference":"Patient/pat003",
"display":"Esther"
},
"effectiveDateTime":"2015-12-10",
"valueQuantity":{
"value":85,
"unit":"3092008",
"system":"http://unitsofmeasure.org",
"code":"mm[Hg]"
}
}
},
{
"fullUrl":"http://fhirtest.uhn.ca/baseDstu3/Observation/res0014/_history/1",
"resource":{
"resourceType":"Observation",
"id":"res0014",
"meta":{
"versionId":"1",
"lastUpdated":"2016-05-05T03:16:51.737-04:00"
},
"status":"final",
"code":{
"coding":[
{
"system":"http://loinc.org",
"code":"8462-4",
"display":"Diastolic blood pressure"
}
]
},
"subject":{
"reference":"Patient/pat003",
"display":"Esther"
},
"effectiveDateTime":"2016-02-10",
"valueQuantity":{
"value":92,
"unit":"3092008",
"system":"http://unitsofmeasure.org",
"code":"mm[Hg]"
}
}
}
]
}

View File

@ -0,0 +1,26 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" output="target/classes" path="src/main/java">
<attributes>
<attribute name="optional" value="true"/>
<attribute name="maven.pomderived" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="src" output="target/test-classes" path="src/test/java">
<attributes>
<attribute name="optional" value="true"/>
<attribute name="maven.pomderived" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7">
<attributes>
<attribute name="maven.pomderived" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
<attributes>
<attribute name="maven.pomderived" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="output" path="target/classes"/>
</classpath>

View File

@ -0,0 +1,5 @@
eclipse.preferences.version=1
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7
org.eclipse.jdt.core.compiler.compliance=1.7
org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
org.eclipse.jdt.core.compiler.source=1.7

View File

@ -0,0 +1,4 @@
activeProfiles=
eclipse.preferences.version=1
resolveWorkspaceProjects=true
version=1

View File

@ -0,0 +1,108 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<!-- <parent> <groupId>ca.uhn.hapi.fhir</groupId> <artifactId>hapi-fhir</artifactId> <version>1.6-SNAPSHOT</version> <relativePath>../pom.xml</relativePath> </parent> -->
<groupId>ca.uhn.hapi.fhir</groupId>
<artifactId>hapi-fhir-jpaserver-uhnfhirtest-auth</artifactId>
<version>1.0</version>
<packaging>war</packaging>
<name>HAPI FHIR - fhirtest.uhn.ca Auth Server</name>
<dependencies>
<dependency>
<groupId>org.mitre</groupId>
<artifactId>openid-connect-common</artifactId>
<version>1.2.6</version>
</dependency>
<dependency>
<groupId>org.mitre</groupId>
<artifactId>openid-connect-server-webapp</artifactId>
<type>war</type>
<version>1.2.6</version>
</dependency>
</dependencies>
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<configuration>
<webApp>
<contextPath>/</contextPath>
<allowDuplicateFragmentNames>true</allowDuplicateFragmentNames>
<jettyEnvXml>src/main/webapp/WEB-INF/jetty-configure.xml</jettyEnvXml>
</webApp>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
<!--This plugin's configuration is used to store Eclipse m2e settings only. It has no influence on the Maven build itself. -->
<plugin>
<groupId>org.eclipse.m2e</groupId>
<artifactId>lifecycle-mapping</artifactId>
<version>1.0.0</version>
<configuration>
<lifecycleMappingMetadata>
<pluginExecutions>
<pluginExecution>
<pluginExecutionFilter>
<groupId></groupId>
<artifactId></artifactId>
<versionRange>[0.4,)</versionRange>
<goals>
<goal></goal>
</goals>
</pluginExecutionFilter>
<action>
<ignore></ignore>
</action>
</pluginExecution>
</pluginExecutions>
</lifecycleMappingMetadata>
</configuration>
</plugin>
</plugins>
</pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<configuration>
<archive>
<manifestEntries>
<Build-Time>${maven.build.timestamp}</Build-Time>
</manifestEntries>
</archive>
<overlays>
<overlay>
<groupId>org.mitre</groupId>
<artifactId>openid-connect-server-webapp</artifactId>
<!-- <excludes> <exclude>WEB-INF/classes/keystore.jwks</exclude> </excludes> -->
</overlay>
</overlays>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-deploy-plugin</artifactId>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
</plugins>
<finalName>hapi-fhir-jpaserver-auth</finalName>
</build>
</project>

View File

@ -0,0 +1,49 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
Copyright 2016 The MITRE Corporation
and the MIT Internet Trust Consortium
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:security="http://www.springframework.org/schema/security"
xmlns:oauth="http://www.springframework.org/schema/security/oauth2"
xsi:schemaLocation="http://www.springframework.org/schema/security/oauth2 http://www.springframework.org/schema/security/spring-security-oauth2-2.0.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd
http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.2.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.1.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd">
<bean id="defaultKeyStore" class="org.mitre.jose.keystore.JWKSetKeyStore">
<property name="location" value="classpath:keystore.jwks" />
</bean>
<bean id="defaultsignerService" class="org.mitre.jwt.signer.service.impl.DefaultJWTSigningAndValidationService">
<constructor-arg name="keyStore" ref="defaultKeyStore" />
<property name="defaultSignerKeyId" value="rsa1" />
<property name="defaultSigningAlgorithmName" value="RS256" />
</bean>
<bean id="defaultEncryptionService" class="org.mitre.jwt.encryption.service.impl.DefaultJWTEncryptionAndDecryptionService">
<constructor-arg name="keyStore" ref="defaultKeyStore" />
<property name="defaultAlgorithm" value="RSA1_5" />
<property name="defaultDecryptionKeyId" value="rsa1" />
<property name="defaultEncryptionKeyId" value="rsa1" />
</bean>
</beans>

View File

@ -0,0 +1,82 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
Copyright 2016 The MITRE Corporation
and the MIT Internet Trust Consortium
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:jdbc="http://www.springframework.org/schema/jdbc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-4.1.xsd">
<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource" destroy-method="close">
<property name="driverClassName" value="org.hsqldb.jdbcDriver" />
<property name="jdbcUrl" value="jdbc:hsqldb:mem:oic;sql.syntax_mys=true" />
<!-- <property name="jdbcUrl" value="jdbc:hsqldb:file:/tmp/oic;sql.syntax_mys=true" /> -->
<property name="username" value="oic" />
<property name="password" value="oic" />
</bean>
<!-- Use the following to set up the OIC tables in the in-memory DB
If you are using a file based HSQLDB you should not run this every time. -->
<jdbc:initialize-database data-source="dataSource">
<jdbc:script location="classpath:/db/tables/hsql_database_tables.sql"/>
<!-- The following file is for the jdbc-user-service spring security implementation -->
<jdbc:script location="classpath:/db/tables/security-schema.sql"/>
<!-- The following files are for safely bootstrapping users and clients into the database -->
<jdbc:script location="classpath:/db/tables/loading_temp_tables.sql"/>
<jdbc:script location="classpath:/db/users.sql"/>
<jdbc:script location="classpath:/db/clients.sql"/>
<jdbc:script location="classpath:/db/scopes.sql"/>
</jdbc:initialize-database>
<bean id="jpaAdapter" class="org.springframework.orm.jpa.vendor.EclipseLinkJpaVendorAdapter">
<property name="databasePlatform" value="org.eclipse.persistence.platform.database.HSQLPlatform" />
<property name="showSql" value="true" />
</bean>
<!-- The following is for connecting to a MySQL database that has been initialized with
src/main/resources/db/tables/mysql_database_tables.sql -->
<!--
<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource" destroy-method="close">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="jdbcUrl" value="jdbc:mysql://localhost/oic" />
<property name="username" value="oic" />
<property name="password" value="oic" />
</bean>
<bean id="jpaAdapter" class="org.springframework.orm.jpa.vendor.EclipseLinkJpaVendorAdapter">
<property name="databasePlatform" value="org.eclipse.persistence.platform.database.MySQLPlatform" />
<property name="showSql" value="true" />
</bean>
-->
<!-- The following is for connecting to a PostgreSQL database that has been initialized with
src/main/resources/db/tables/psql_database_tables.sql -->
<!--
<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource" destroy-method="close">
<property name="driverClassName" value="org.postgresql.Driver" />
<property name="jdbcUrl" value="jdbc:postgresql://localhost/oic" />
<property name="username" value="oic" />
<property name="password" value="oic" />
</bean>
<bean id="jpaAdapter" class="org.springframework.orm.jpa.vendor.EclipseLinkJpaVendorAdapter">
<property name="databasePlatform" value="org.eclipse.persistence.platform.database.PostgreSQLPlatform" />
<property name="showSql" value="true" />
</bean>
-->
</beans>

View File

@ -0,0 +1,11 @@
<?xml version="1.0"?>
<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
<Configure class="org.eclipse.jetty.webapp.WebAppContext">
<Call name="setAttribute">
<Arg>org.eclipse.jetty.server.webapp.WebInfIncludeJarPattern</Arg>
<Arg>.*/foo-[^/]*\.jar$</Arg>
</Call>
</Configure>

View File

@ -0,0 +1,54 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
Copyright 2016 The MITRE Corporation
and the MIT Internet Trust Consortium
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:security="http://www.springframework.org/schema/security"
xmlns:oauth="http://www.springframework.org/schema/security/oauth2"
xsi:schemaLocation="http://www.springframework.org/schema/security/oauth2 http://www.springframework.org/schema/security/spring-security-oauth2-2.0.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd
http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.2.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.1.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd">
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory" />
<qualifier value="defaultTransactionManager" />
</bean>
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="packagesToScan" value="org.mitre" />
<property name="persistenceProviderClass" value="org.eclipse.persistence.jpa.PersistenceProvider" />
<property name="dataSource" ref="dataSource" />
<property name="jpaVendorAdapter" ref="jpaAdapter" />
<property name="jpaPropertyMap">
<map>
<entry key="eclipselink.weaving" value="false" />
<entry key="eclipselink.logging.level" value="INFO" />
<entry key="eclipselink.logging.level.sql" value="INFO" />
<entry key="eclipselink.cache.shared.default" value="false" />
</map>
</property>
<property name="persistenceUnitName" value="defaultPersistenceUnit" />
</bean>
</beans>

View File

@ -0,0 +1,35 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
Copyright 2016 The MITRE Corporation
and the MIT Internet Trust Consortium
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:security="http://www.springframework.org/schema/security"
xmlns:oauth="http://www.springframework.org/schema/security/oauth2"
xsi:schemaLocation="http://www.springframework.org/schema/security/oauth2 http://www.springframework.org/schema/security/spring-security-oauth2-2.0.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd
http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.2.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.1.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd">
<!-- Empty: Override this file in your local project to change configuration options. -->
</beans>

View File

@ -0,0 +1,72 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
Copyright 2016 The MITRE Corporation
and the MIT Internet Trust Consortium
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:security="http://www.springframework.org/schema/security"
xmlns:oauth="http://www.springframework.org/schema/security/oauth2"
xsi:schemaLocation="http://www.springframework.org/schema/security/oauth2 http://www.springframework.org/schema/security/spring-security-oauth2-2.0.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd
http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.2.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.1.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd">
<bean id="configBean" class="org.mitre.openid.connect.config.ConfigurationPropertiesBean">
<!-- This property sets the root URL of the server, known as the issuer -->
<property name="issuer" value="http://localhost:8080/openid-connect-server-webapp/" />
<!-- This property is a URL pointing to a logo image 24px high to be used in the top bar -->
<property name="logoImageUrl" value="resources/images/openid_connect_small.png" />
<!-- This property sets the display name of the server, displayed in the topbar and page title -->
<property name="topbarTitle" value="OpenID Connect Server" />
<!-- This property sets the lifetime of registration access tokens, in seconds. Leave it unset (null) for no rotation. -->
<!-- <property name="regTokenLifeTime" value="172800" /> -->
<!-- This property forces the issuer value to start with "https", recommended on production servers -->
<!-- <property name="forceHttps" value="true" /> -->
<!-- This property sets the locale for server text -->
<!-- <property name="locale" value="sv" /> -->
<!-- This property sets the set of namespaces for language translation files. The default is "messages". These are checked in the order presented here. -->
<!--
<property name="languageNamespaces">
<list>
<value>foo</value>
<value>bar</value>
<value>messages</value>
</list>
</property>
-->
<!-- This property indicates if a dynamically registered client supports dual flows, such as client_credentials
at the same time with authorization_code or implicit -->
<!-- <property name="dualClient" value="true" /> -->
<!-- This property turns on HEART compliance mode -->
<!-- <property name="heartMode" value="true" /> -->
</bean>
</beans>

View File

@ -0,0 +1,36 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
Copyright 2016 The MITRE Corporation
and the MIT Internet Trust Consortium
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:security="http://www.springframework.org/schema/security"
xmlns:oauth="http://www.springframework.org/schema/security/oauth2"
xsi:schemaLocation="http://www.springframework.org/schema/security/oauth2 http://www.springframework.org/schema/security/spring-security-oauth2-2.0.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd
http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.2.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.1.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd">
<!-- This file has been left blank -->
<!-- Feel free to override this by using a maven overlay. -->
<!-- see: https://github.com/mitreid-connect/OpenID-Connect-Java-Spring-Server/wiki/Maven-Overlay-Project-How-To/ -->
</beans>

View File

@ -0,0 +1,36 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
Copyright 2016 The MITRE Corporation
and the MIT Internet Trust Consortium
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:task="http://www.springframework.org/schema/task"
xsi:schemaLocation="http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-4.1.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd">
<!-- Configuration for scheduled tasks -->
<task:scheduler id="taskScheduler" pool-size="10" />
<task:executor id="taskExecutor" pool-size="5" />
<task:annotation-driven scheduler="taskScheduler" executor="taskExecutor" />
<!-- Schedule the token service and approved site service to clear out expired tokens and sites every 5 minutes -->
<task:scheduled-tasks scheduler="taskScheduler">
<task:scheduled ref="defaultOAuth2ProviderTokenService" method="clearExpiredTokens" fixed-delay="300000" initial-delay="600000"/>
<task:scheduled ref="defaultApprovedSiteService" method="clearExpiredSites" fixed-delay="300000" initial-delay="600000"/>
<task:scheduled ref="defaultOAuth2AuthorizationCodeService" method="clearExpiredAuthorizationCodes" fixed-delay="300000" initial-delay="600000"/>
</task:scheduled-tasks>
</beans>

View File

@ -0,0 +1,54 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
Copyright 2016 The MITRE Corporation
and the MIT Internet Trust Consortium
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:security="http://www.springframework.org/schema/security"
xmlns:oauth="http://www.springframework.org/schema/security/oauth2"
xsi:schemaLocation="http://www.springframework.org/schema/security/oauth2 http://www.springframework.org/schema/security/spring-security-oauth2-2.0.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd
http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.2.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.1.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd">
<security:authentication-manager alias="authenticationManager">
<security:authentication-provider>
<security:jdbc-user-service data-source-ref="dataSource"/>
</security:authentication-provider>
</security:authentication-manager>
<mvc:view-controller path="/login" view-name="login" />
<security:http disable-url-rewriting="true" use-expressions="true">
<security:form-login login-page="/login" authentication-failure-url="/login?error=failure" authentication-success-handler-ref="authenticationTimeStamper" />
<security:intercept-url pattern="/authorize" access="hasRole('ROLE_USER')" />
<security:intercept-url pattern="/**" access="permitAll" />
<security:custom-filter ref="authRequestFilter" after="SECURITY_CONTEXT_FILTER" />
<security:logout logout-url="/logout" />
<security:anonymous />
<security:expression-handler ref="oauthWebExpressionHandler" />
<security:headers>
<security:frame-options policy="DENY" />
</security:headers>
<security:csrf />
</security:http>
</beans>

View File

@ -0,0 +1,78 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
Copyright 2016 The MITRE Corporation
and the MIT Internet Trust Consortium
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
metadata-complete="true">
<absolute-ordering />
<!-- The definition of the Root Spring Container shared by all Servlets
and Filters -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/application-context.xml
</param-value>
</context-param>
<!-- Creates the Spring Container shared by all Servlets and Filters -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- filter through Spring Security -->
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
<init-param>
<param-name>contextAttribute</param-name>
<param-value>org.springframework.web.servlet.FrameworkServlet.CONTEXT.spring</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- Processes application requests -->
<servlet>
<servlet-name>spring</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>spring</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<jsp-config>
<jsp-property-group>
<url-pattern>*.jsp</url-pattern>
<trim-directive-whitespaces>true</trim-directive-whitespaces>
</jsp-property-group>
</jsp-config>
<error-page>
<location>/error</location>
</error-page>
</web-app>

View File

@ -3,7 +3,9 @@ package ca.uhn.fhir.validation;
import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.empty; import static org.hamcrest.Matchers.empty;
import static org.hamcrest.Matchers.greaterThan; import static org.hamcrest.Matchers.greaterThan;
import static org.junit.Assert.*; import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
import static org.mockito.Matchers.any; import static org.mockito.Matchers.any;
import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
@ -16,6 +18,7 @@ import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.TreeSet;
import java.util.zip.GZIPInputStream; import java.util.zip.GZIPInputStream;
import org.apache.commons.io.IOUtils; import org.apache.commons.io.IOUtils;
@ -89,17 +92,21 @@ public class FhirInstanceValidatorDstu3Test {
String vsContents; String vsContents;
vsContents = IOUtils.toString(FhirInstanceValidatorDstu3Test.class.getResourceAsStream("/org/hl7/fhir/instance/model/dstu3/profile/" + name + ".xml"), "UTF-8"); vsContents = IOUtils.toString(FhirInstanceValidatorDstu3Test.class.getResourceAsStream("/org/hl7/fhir/instance/model/dstu3/profile/" + name + ".xml"), "UTF-8");
TreeSet<String> ids = new TreeSet<String>();
bundle = ourCtx.newXmlParser().parseResource(org.hl7.fhir.dstu3.model.Bundle.class, vsContents); bundle = ourCtx.newXmlParser().parseResource(org.hl7.fhir.dstu3.model.Bundle.class, vsContents);
for (BundleEntryComponent i : bundle.getEntry()) { for (BundleEntryComponent i : bundle.getEntry()) {
org.hl7.fhir.dstu3.model.Resource next = i.getResource(); org.hl7.fhir.dstu3.model.Resource next = i.getResource();
ids.add(next.getId());
ourLog.info(ourCtx.newXmlParser().setPrettyPrint(true).encodeResourceToString(next)); ourLog.info("Validating {}", next.getId());
ValidationResult output = myVal.validateWithResult(next); ValidationResult output = myVal.validateWithResult(next);
List<SingleValidationMessage> errors = logResultsAndReturnNonInformationalOnes(output); List<SingleValidationMessage> errors = logResultsAndReturnNonInformationalOnes(output);
assertThat("Failed to validate " + i.getFullUrl(), errors, empty()); assertThat("Failed to validate " + i.getFullUrl(), errors, empty());
} }
ourLog.info("Validated the following:\n{}", ids);
} }
@Test @Test