Skip to content

Commit

Permalink
Add a test for nested dependencies.
Browse files Browse the repository at this point in the history
  • Loading branch information
ktarasenko committed Nov 24, 2022
1 parent e97f2e6 commit 1fbae0f
Show file tree
Hide file tree
Showing 4 changed files with 98 additions and 14 deletions.
1 change: 1 addition & 0 deletions Src/java/cqf-fhir-npm/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,5 @@
dependencies {
implementation project(':cql-to-elm')
implementation group: 'com.google.code.gson', name: 'gson', version: '2.9.1'
implementation group:'org.apache.commons', name: 'commons-compress', version: '1.20'
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,18 +15,20 @@
import org.hl7.fhir.convertors.conv40_50.VersionConvertor_40_50;
import org.hl7.fhir.exceptions.FHIRException;
import org.hl7.fhir.r4.formats.FormatUtilities;
import org.hl7.fhir.r5.model.ImplementationGuide;
import org.hl7.fhir.r5.context.IWorkerContext;
import org.hl7.fhir.r5.model.Constants;
import org.hl7.fhir.r5.model.ImplementationGuide;
import org.hl7.fhir.r5.model.ImplementationGuide.ImplementationGuideDependsOnComponent;
import org.hl7.fhir.utilities.Utilities;
import org.hl7.fhir.utilities.VersionUtilities;
import org.hl7.fhir.utilities.json.JsonTrackingParser;
import org.hl7.fhir.utilities.npm.BasePackageCacheManager;
import org.hl7.fhir.utilities.npm.FilesystemPackageCacheManager;
import org.hl7.fhir.utilities.npm.NpmPackage;
import org.hl7.fhir.utilities.npm.ToolsVersion;

public class NpmPackageManager implements IWorkerContext.ILoggingService {
private FilesystemPackageCacheManager pcm;
private BasePackageCacheManager pcm;
private List<NpmPackage> npmList = new ArrayList<>();
public List<NpmPackage> getNpmList() {
return npmList;
Expand Down Expand Up @@ -58,7 +60,7 @@ public static NpmPackageManager fromStream(InputStream is, String version) throw
return new NpmPackageManager((ImplementationGuide) versionConvertor_40_50.convertResource(FormatUtilities.loadFile(is)), version);
}

public NpmPackageManager(ImplementationGuide sourceIg, String version) throws IOException {
NpmPackageManager(ImplementationGuide sourceIg, String version, BasePackageCacheManager pcm) throws IOException {
if (version == null || version.equals("")) {
throw new IllegalArgumentException("version is required");
}
Expand All @@ -71,15 +73,7 @@ public NpmPackageManager(ImplementationGuide sourceIg, String version) throws IO

this.sourceIg = sourceIg;

try {
// userMode indicates whether the packageCache is within the working directory or in the user home
pcm = new FilesystemPackageCacheManager(true, ToolsVersion.TOOLS_VERSION);
}
catch(IOException e) {
String message = "error creating the FilesystemPackageCacheManager";
logMessage(message);
throw new NpmPackageManagerException(message, e);
}
this.pcm = pcm;

loadCorePackage();

Expand All @@ -90,20 +84,36 @@ public NpmPackageManager(ImplementationGuide sourceIg, String version) throws IO
}
}


public NpmPackageManager(ImplementationGuide sourceIg, String version) throws IOException {
this(sourceIg, version, createPackageManager());
}

private static FilesystemPackageCacheManager createPackageManager() {
try {
// userMode indicates whether the packageCache is within the working directory or in the user home
return new FilesystemPackageCacheManager(true, ToolsVersion.TOOLS_VERSION);
}
catch(IOException e) {
String message = "error creating the FilesystemPackageCacheManager";
throw new NpmPackageManagerException(message, e);
}
}

private void loadCorePackage() {
NpmPackage pi = null;

String v = version.equals(Constants.VERSION) ? "current" : version;

logMessage("Core Package "+ VersionUtilities.packageForVersion(v)+"#"+v);
try {
pi = pcm.loadPackage(VersionUtilities.packageForVersion(v), v);
pi = pcm.loadPackage(VersionUtilities.packageForVersion(v), v);
}
catch(Exception e) {
try {
// Appears to be race condition in FHIR core where they are
// loading a custom cert provider.
pi = pcm.loadPackage(VersionUtilities.packageForVersion(v), v);
pi = pcm.loadPackage(VersionUtilities.packageForVersion(v), v);
}
catch (Exception ex) {
throw new NpmPackageManagerException("Error loading core package", e);
Expand Down Expand Up @@ -160,6 +170,12 @@ private void loadIg(ImplementationGuide.ImplementationGuideDependsOnComponent de
logMessage("The correct canonical URL for this dependency is "+cu);
}
}
// for (String dependency: pi.dependencies()) {
// String[] depParts = dependency.split("#");
// String depName = depParts[0];
// String depVersion = depParts[1];
// loadIg(new ImplementationGuideDependsOnComponent().setPackageId(depName).setVersion(depVersion), -1);
// }
}

private String determineCanonical(String url, String path) throws FHIRException {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,15 +1,29 @@
package org.cqframework.fhir.npm;

import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertNotNull;
import static org.testng.Assert.assertTrue;

import java.io.IOException;
import java.io.InputStream;

import java.util.Arrays;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;
import javax.annotation.Nullable;
import org.hl7.cql.model.ModelIdentifier;
import org.hl7.elm.r1.VersionedIdentifier;
import org.hl7.elm_modelinfo.r1.ModelInfo;
import org.hl7.fhir.exceptions.FHIRException;
import org.hl7.fhir.r5.context.IWorkerContext;
import org.hl7.fhir.r5.model.Enumerations.FHIRVersion;
import org.hl7.fhir.r5.model.Enumerations.PublicationStatus;
import org.hl7.fhir.r5.model.ImplementationGuide;
import org.hl7.fhir.r5.model.ImplementationGuide.ImplementationGuideDependsOnComponent;
import org.hl7.fhir.utilities.npm.BasePackageCacheManager;
import org.hl7.fhir.utilities.npm.NpmPackage;
import org.hl7.fhir.utilities.npm.PackageGenerator;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.testng.annotations.Ignore;
Expand Down Expand Up @@ -95,6 +109,58 @@ public void TestModelInfoProvider() throws IOException {
assertTrue(mi.getName().equals("QICore"));
}

@Test
public void TestNestedDependencies() throws IOException {
ImplementationGuide ig = new ImplementationGuide()
.setPackageId("test.source")
.addDependsOn(new ImplementationGuideDependsOnComponent()
.setPackageId("test.dep1").setVersion("1.0.0"))
.addDependsOn(new ImplementationGuideDependsOnComponent()
.setPackageId("test.dep2").setVersion("1.0.0"));

NpmPackageManager pm = new NpmPackageManager(ig, "4.0.1", new FakePackageManager());

List<String> packageNames = pm.getNpmList().stream().map(NpmPackage::name)
.collect(Collectors.toList());
List<String> expectedDependencies = Arrays.asList("hl7.fhir.r4.core", "test.dep1", "test.dep3",
"test.dep2", "test.dep4");
assertEquals(packageNames.toString(), expectedDependencies.toString());

}

private static class FakePackageManager extends BasePackageCacheManager {

@Override
public NpmPackage loadPackageFromCacheOnly(String id, @Nullable String version)
throws IOException {
return loadPackage(id, version);
}

@Override
public NpmPackage addPackageToCache(String id, String version,
InputStream packageTgzInputStream, String sourceDesc) throws IOException {
return loadPackage(id, version);
}

@Override
public NpmPackage loadPackage(String id, String version) throws FHIRException, IOException {
PackageGenerator packageGenerator = new PackageGenerator().name(id).version(version);
switch (id) {
case "test.dep1":
return NpmPackage.empty(packageGenerator.dependency("test.dep3", version));
case "test.dep2":
return NpmPackage.empty(packageGenerator.dependency("test.dep4", version));
default:
return NpmPackage.empty(packageGenerator);
}
}

@Override
public String getPackageUrl(String packageId) throws IOException {
return String.format("http:https://%s/ImplmentationGuide/", packageId);
}
}

@Override
public void logMessage(String msg) {
logger.info(msg);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3497,6 +3497,7 @@ else if (classType.getPrimaryCodePath() != null) {
return result;
}

@SuppressWarnings("unchecked")
private Retrieve buildRetrieve(cqlParser.RetrieveContext ctx, boolean useStrictRetrieveTyping, NamedType namedType,
ClassType classType, String codePath, String codeComparator, Property property,
DataType propertyType, Exception propertyException, Expression terminology) {
Expand Down

0 comments on commit 1fbae0f

Please sign in to comment.