Finalizing 1.2 release

This commit is contained in:
jamesagnew 2015-09-16 11:46:17 -04:00
parent 31934ff582
commit effe139325
9 changed files with 177 additions and 20 deletions

View File

@ -6,7 +6,7 @@
<parent> <parent>
<groupId>ca.uhn.hapi.fhir</groupId> <groupId>ca.uhn.hapi.fhir</groupId>
<artifactId>hapi-fhir</artifactId> <artifactId>hapi-fhir</artifactId>
<version>1.2-SNAPSHOT</version> <version>1.2</version>
<relativePath>../pom.xml</relativePath> <relativePath>../pom.xml</relativePath>
</parent> </parent>
@ -22,33 +22,33 @@
<dependency> <dependency>
<groupId>ca.uhn.hapi.fhir</groupId> <groupId>ca.uhn.hapi.fhir</groupId>
<artifactId>hapi-fhir-base</artifactId> <artifactId>hapi-fhir-base</artifactId>
<version>1.2-SNAPSHOT</version> <version>1.2</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>ca.uhn.hapi.fhir</groupId> <groupId>ca.uhn.hapi.fhir</groupId>
<artifactId>hapi-fhir-jpaserver-example</artifactId> <artifactId>hapi-fhir-jpaserver-example</artifactId>
<version>1.2-SNAPSHOT</version> <version>1.2</version>
<type>war</type> <type>war</type>
</dependency> </dependency>
<dependency> <dependency>
<groupId>ca.uhn.hapi.fhir</groupId> <groupId>ca.uhn.hapi.fhir</groupId>
<artifactId>hapi-fhir-structures-dstu</artifactId> <artifactId>hapi-fhir-structures-dstu</artifactId>
<version>1.2-SNAPSHOT</version> <version>1.2</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>ca.uhn.hapi.fhir</groupId> <groupId>ca.uhn.hapi.fhir</groupId>
<artifactId>hapi-fhir-structures-dstu2</artifactId> <artifactId>hapi-fhir-structures-dstu2</artifactId>
<version>1.2-SNAPSHOT</version> <version>1.2</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>ca.uhn.hapi.fhir</groupId> <groupId>ca.uhn.hapi.fhir</groupId>
<artifactId>hapi-fhir-structures-hl7org-dstu2</artifactId> <artifactId>hapi-fhir-structures-hl7org-dstu2</artifactId>
<version>1.2-SNAPSHOT</version> <version>1.2</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>ca.uhn.hapi.fhir</groupId> <groupId>ca.uhn.hapi.fhir</groupId>
<artifactId>hapi-fhir-validation-resources</artifactId> <artifactId>hapi-fhir-validation-resources-dstu2</artifactId>
<version>1.2-SNAPSHOT</version> <version>1.2</version>
</dependency> </dependency>
<dependency> <dependency>
@ -143,7 +143,7 @@
<artifactItem> <artifactItem>
<groupId>ca.uhn.hapi.fhir</groupId> <groupId>ca.uhn.hapi.fhir</groupId>
<artifactId>hapi-fhir-jpaserver-example</artifactId> <artifactId>hapi-fhir-jpaserver-example</artifactId>
<version>1.2-SNAPSHOT</version> <version>1.2</version>
<type>war</type> <type>war</type>
<overWrite>true</overWrite> <overWrite>true</overWrite>
<outputDirectory>target/classes</outputDirectory> <outputDirectory>target/classes</outputDirectory>

View File

@ -28,10 +28,13 @@ public class App {
private static List<BaseCommand> ourCommands; private static List<BaseCommand> ourCommands;
private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(App.class); private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(App.class);
public static final String LINESEP = System.getProperty("line.separator");
static { static {
ourCommands = new ArrayList<BaseCommand>(); ourCommands = new ArrayList<BaseCommand>();
ourCommands.add(new RunServerCommand()); ourCommands.add(new RunServerCommand());
ourCommands.add(new ExampleDataUploader()); ourCommands.add(new ExampleDataUploader());
ourCommands.add(new ValidateCommand());
Collections.sort(ourCommands); Collections.sort(ourCommands);
} }
@ -79,16 +82,22 @@ public class App {
System.out.println(" hapi-fhir-cli {command} [options]"); System.out.println(" hapi-fhir-cli {command} [options]");
System.out.println(); System.out.println();
System.out.println("Commands:"); System.out.println("Commands:");
int longestCommandLength = 0;
for (BaseCommand next : ourCommands) { for (BaseCommand next : ourCommands) {
String left = " " + next.getCommandName() + " - "; longestCommandLength = Math.max(longestCommandLength, next.getCommandName().length());
String[] rightParts = WordUtils.wrap(next.getCommandDescription(), 80 - left.length()).split("\\n");
for (int i = 1; i < rightParts.length; i++) {
rightParts[i] = StringUtils.leftPad("", left.length()) + rightParts[i];
} }
System.out.println(left + StringUtils.join(rightParts, '\n'));
for (BaseCommand next : ourCommands) {
String left = " " + StringUtils.rightPad(next.getCommandName(), longestCommandLength);
String[] rightParts = WordUtils.wrap(next.getCommandDescription(), 80 - (left.length() + 3)).split("\\n");
for (int i = 1; i < rightParts.length; i++) {
rightParts[i] = StringUtils.leftPad("", left.length() + 3) + rightParts[i];
}
System.out.println(ansi().bold().fg(Color.GREEN) + left + ansi().boldOff().fg(Color.WHITE) + " - " + ansi().bold() + StringUtils.join(rightParts, LINESEP));
} }
System.out.println(); System.out.println();
System.out.println("See what options are available:"); System.out.println(ansi().boldOff().fg(Color.WHITE) + "See what options are available:");
System.out.println(" hapi-fhir-cli help {command}"); System.out.println(" hapi-fhir-cli help {command}");
System.out.println(); System.out.println();
} }
@ -143,12 +152,14 @@ public class App {
Options options = command.getOptions(); Options options = command.getOptions();
DefaultParser parser = new DefaultParser(); DefaultParser parser = new DefaultParser();
CommandLine parsedOptions; CommandLine parsedOptions;
logAppHeader();
loggingConfigOn();
try { try {
String[] args = Arrays.asList(theArgs).subList(1, theArgs.length).toArray(new String[theArgs.length - 1]); String[] args = Arrays.asList(theArgs).subList(1, theArgs.length).toArray(new String[theArgs.length - 1]);
parsedOptions = parser.parse(options, args, true); parsedOptions = parser.parse(options, args, true);
logAppHeader();
loggingConfigOn();
// Actually execute the command // Actually execute the command
command.run(parsedOptions); command.run(parsedOptions);

View File

@ -9,6 +9,8 @@ import ca.uhn.fhir.rest.client.IGenericClient;
public abstract class BaseCommand implements Comparable<BaseCommand> { public abstract class BaseCommand implements Comparable<BaseCommand> {
private FhirContext myFhirCtx;
public BaseCommand() { public BaseCommand() {
super(); super();
} }
@ -32,4 +34,11 @@ public abstract class BaseCommand implements Comparable<BaseCommand> {
public abstract void run(CommandLine theCommandLine) throws ParseException, Exception; public abstract void run(CommandLine theCommandLine) throws ParseException, Exception;
public FhirContext getFhirCtx() {
if (myFhirCtx == null) {
myFhirCtx = FhirContext.forDstu2();
}
return myFhirCtx;
}
} }

View File

@ -0,0 +1,116 @@
package ca.uhn.fhir.cli;
import static org.apache.commons.lang3.StringUtils.defaultString;
import static org.apache.commons.lang3.StringUtils.isBlank;
import static org.apache.commons.lang3.StringUtils.isNotBlank;
import static org.fusesource.jansi.Ansi.*;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.Option;
import org.apache.commons.cli.OptionGroup;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException;
import org.apache.commons.io.IOUtils;
import org.fusesource.jansi.Ansi;
import com.phloc.commons.io.file.FileUtils;
import ca.uhn.fhir.rest.method.MethodUtil;
import ca.uhn.fhir.rest.server.EncodingEnum;
import ca.uhn.fhir.validation.FhirInstanceValidator;
import ca.uhn.fhir.validation.FhirValidator;
import ca.uhn.fhir.validation.SingleValidationMessage;
import ca.uhn.fhir.validation.ValidationResult;
public class ValidateCommand extends BaseCommand {
private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(ValidateCommand.class);
@Override
public String getCommandDescription() {
return "Validate a resource using the FHIR validation tools";
}
@Override
public String getCommandName() {
return "validate";
}
@Override
public Options getOptions() {
Options retVal = new Options();
OptionGroup source = new OptionGroup();
source.addOption(new Option("f", "file", true, "The name of the file to validate"));
source.addOption(new Option("d", "data", true, "The text to validate"));
retVal.addOptionGroup(source);
retVal.addOption("x", "xsd", false, "Validate using Schemas");
retVal.addOption("s", "sch", false, "Validate using Schematrons");
retVal.addOption("p", "profile", false, "Validate using Profiles (StructureDefinition / ValueSet)");
retVal.addOption("e", "encoding", false, "File encoding (default is UTF-8)");
return retVal;
}
@Override
public void run(CommandLine theCommandLine) throws ParseException, Exception {
String fileName = theCommandLine.getOptionValue("f");
String contents = theCommandLine.getOptionValue("c");
if (isNotBlank(fileName) && isNotBlank(contents)) {
throw new ParseException("Can not supply both a file (-f) and data (-d)");
}
if (isBlank(fileName) && isBlank(contents)) {
throw new ParseException("Must supply either a file (-f) or data (-d)");
}
if (isNotBlank(fileName)) {
String encoding = theCommandLine.getOptionValue("e", "UTF-8");
ourLog.info("Reading file '{}' using encoding {}", fileName, encoding);
contents = IOUtils.toString(new InputStreamReader(new FileInputStream(fileName), encoding));
ourLog.info("Fully read - Size is {}", FileUtils.getFileSizeDisplay(contents.length()));
}
EncodingEnum enc = MethodUtil.detectEncodingNoDefault(defaultString(contents));
if (enc == null) {
throw new ParseException("Could not detect encoding (json/xml) of contents");
}
FhirValidator val = getFhirCtx().newValidator();
if (theCommandLine.hasOption("p")) {
val.registerValidatorModule(new FhirInstanceValidator());
}
val.setValidateAgainstStandardSchema(theCommandLine.hasOption("x"));
val.setValidateAgainstStandardSchematron(theCommandLine.hasOption("s"));
ValidationResult results = val.validateWithResult(contents);
StringBuilder b = new StringBuilder("Validation results:" + ansi().boldOff());
int count = 0;
for (SingleValidationMessage next : results.getMessages()) {
count++;
b.append(App.LINESEP);
b.append("Issue ").append(count).append(": ");
b.append(next.getSeverity()).append(" - ").append(next.getLocationString());
b.append(App.LINESEP);
b.append(" ").append(next.getMessage());
}
if (count > 0) {
ourLog.info(b.toString());
}
if (results.isSuccessful()) {
ourLog.info("Validation successful!");
} else {
ourLog.warn("Validation FAILED");
}
}
}

View File

@ -5,7 +5,7 @@
<formats> <formats>
<format>zip</format> <format>zip</format>
<!--<format>tar.bz2</format>--> <format>tar.bz2</format>
</formats> </formats>
<includeBaseDirectory>false</includeBaseDirectory> <includeBaseDirectory>false</includeBaseDirectory>

View File

@ -5,7 +5,7 @@
<formats> <formats>
<format>zip</format> <format>zip</format>
<!--<format>tar.bz2</format>--> <format>tar.bz2</format>
</formats> </formats>
<includeBaseDirectory>false</includeBaseDirectory> <includeBaseDirectory>false</includeBaseDirectory>

View File

@ -1,11 +1,11 @@
<?xml version="1.0" encoding="ISO-8859-1"?> <?xml version="1.0" encoding="ISO-8859-1"?>
<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd"> <assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">
<id>hapi-fhir-standard-distribution</id> <id>standard-distribution</id>
<formats> <formats>
<format>zip</format> <format>zip</format>
<!--<format>tar.bz2</format>--> <format>tar.bz2</format>
</formats> </formats>
<includeBaseDirectory>false</includeBaseDirectory> <includeBaseDirectory>false</includeBaseDirectory>

View File

@ -1,5 +1,25 @@
package ca.uhn.fhir.jpa.dao; package ca.uhn.fhir.jpa.dao;
/*
* #%L
* HAPI FHIR JPA Server
* %%
* Copyright (C) 2014 - 2015 University Health Network
* %%
* 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.
* #L%
*/
import org.hl7.fhir.instance.model.ValueSet; import org.hl7.fhir.instance.model.ValueSet;
import org.hl7.fhir.instance.model.ValueSet.ConceptSetComponent; import org.hl7.fhir.instance.model.ValueSet.ConceptSetComponent;
import org.hl7.fhir.instance.model.ValueSet.ValueSetExpansionComponent; import org.hl7.fhir.instance.model.ValueSet.ValueSetExpansionComponent;

View File

@ -1287,6 +1287,7 @@
<module>hapi-fhir-testpage-overlay</module> <module>hapi-fhir-testpage-overlay</module>
<module>hapi-fhir-jpaserver-uhnfhirtest</module> <module>hapi-fhir-jpaserver-uhnfhirtest</module>
<module>hapi-fhir-android</module> <module>hapi-fhir-android</module>
<module>hapi-fhir-cli</module>
<module>hapi-fhir-dist</module> <module>hapi-fhir-dist</module>
<module>examples</module> <module>examples</module>
<!--<module>hapi-fhir-osgi-core</module>--> <!--<module>hapi-fhir-osgi-core</module>-->