001package org.hl7.fhir.r5.liquid;
002
003import java.util.ArrayList;
004import java.util.List;
005
006import org.hl7.fhir.exceptions.FHIRException;
007import org.hl7.fhir.r5.fhirpath.FHIRPathEngine;
008import org.hl7.fhir.r5.fhirpath.FHIRPathFunctionDefinition;
009import org.hl7.fhir.r5.fhirpath.FHIRPathUtilityClasses.FunctionDetails;
010import org.hl7.fhir.r5.fhirpath.TypeDetails;
011import org.hl7.fhir.r5.fhirpath.ExpressionNode.CollectionStatus;
012import org.hl7.fhir.r5.model.Base;
013import org.hl7.fhir.r5.model.DateTimeType;
014import org.hl7.fhir.r5.model.IntegerType;
015import org.hl7.fhir.r5.model.StringType;
016import org.hl7.fhir.utilities.FhirPublication;
017import org.hl7.fhir.utilities.MarkedToMoveToAdjunctPackage;
018import org.hl7.fhir.utilities.Utilities;
019
020@MarkedToMoveToAdjunctPackage
021public class GlobalObject extends Base {
022
023  private DateTimeType dt;
024  private StringType pathToSpec;
025  
026  public GlobalObject(DateTimeType td, StringType pathToSpec) {
027    super();
028    this.dt = td;
029    this.pathToSpec = pathToSpec;
030  }
031
032  @Override
033  public String fhirType() {
034    return "GlobalObject";
035  }
036
037  @Override
038  public String getIdBase() {
039    return null;
040  }
041
042  @Override
043  public void setIdBase(String value) {
044    throw new Error("Read only"); 
045  }
046
047  @Override
048  public Base copy() {
049    return this;
050  }
051
052  @Override
053  public FhirPublication getFHIRPublicationVersion() {
054    return FhirPublication.R5;
055  }
056
057  public Base[] getProperty(int hash, String name, boolean checkValid) throws FHIRException {
058    if ("dateTime".equals(name)) {
059      return wrap(dt);
060    } else if ("path".equals(name)) {
061      return wrap(pathToSpec);
062    } else {
063      return super.getProperty(hash, name, checkValid);
064    }
065  }
066
067  private Base[] wrap(Base b) {
068    Base[] l = new Base[1];
069    l[0] = b;
070    return l;
071  }
072  
073  @Override
074  public List<Base> executeFunction(FHIRPathEngine engine, Object appContext, List<Base> focus, String functionName, List<List<Base>> parameters) {
075    return null;
076  }
077
078  public static class GlobalObjectRandomFunction extends FHIRPathFunctionDefinition {
079
080    @Override
081    public String name() {
082      return "random";
083    }
084
085    @Override
086    public FunctionDetails details() {
087      return new FunctionDetails("Generate a Random Number", 1, 1);
088    }
089
090    @Override
091    public TypeDetails check(FHIRPathEngine engine, Object appContext, TypeDetails focus, List<TypeDetails> parameters) {
092      if (focus.hasType("GlobalObject")) {
093        return new TypeDetails(CollectionStatus.SINGLETON, "integer");
094      } else {
095        return null;
096      }
097    }
098
099    @Override
100    public List<Base> execute(FHIRPathEngine engine, Object appContext, List<Base> focus, List<List<Base>> parameters) {
101      List<Base> list = new ArrayList<>();
102      int scale = Utilities.parseInt(parameters.get(0).get(0).primitiveValue(), 100)+ 1;
103      list.add(new IntegerType((int)(Math.random() * scale)));
104      return list;
105    }
106    
107  }
108}