Work on JPA
This commit is contained in:
parent
b4a362b8ee
commit
3191c907a3
|
@ -0,0 +1,23 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<projectDescription>
|
||||||
|
<name>hapi-fhir-android-realm</name>
|
||||||
|
<comment></comment>
|
||||||
|
<projects>
|
||||||
|
</projects>
|
||||||
|
<buildSpec>
|
||||||
|
<buildCommand>
|
||||||
|
<name>org.eclipse.jdt.core.javabuilder</name>
|
||||||
|
<arguments>
|
||||||
|
</arguments>
|
||||||
|
</buildCommand>
|
||||||
|
<buildCommand>
|
||||||
|
<name>org.eclipse.m2e.core.maven2Builder</name>
|
||||||
|
<arguments>
|
||||||
|
</arguments>
|
||||||
|
</buildCommand>
|
||||||
|
</buildSpec>
|
||||||
|
<natures>
|
||||||
|
<nature>org.eclipse.jdt.core.javanature</nature>
|
||||||
|
<nature>org.eclipse.m2e.core.maven2Nature</nature>
|
||||||
|
</natures>
|
||||||
|
</projectDescription>
|
|
@ -43,11 +43,9 @@ ca.uhn.fhir.rest.param.ResourceParameter.noContentTypeInRequest=No Content-Type
|
||||||
ca.uhn.fhir.rest.param.ResourceParameter.failedToParseRequest=Failed to parse request body as {0} resource. Error was: {1}
|
ca.uhn.fhir.rest.param.ResourceParameter.failedToParseRequest=Failed to parse request body as {0} resource. Error was: {1}
|
||||||
|
|
||||||
ca.uhn.fhir.parser.ParserState.wrongResourceTypeFound=Incorrect resource type found, expected "{0}" but found "{1}"
|
ca.uhn.fhir.parser.ParserState.wrongResourceTypeFound=Incorrect resource type found, expected "{0}" but found "{1}"
|
||||||
|
|
||||||
ca.uhn.fhir.rest.server.RestfulServer.getPagesNonHttpGet=Requests for _getpages must use HTTP GET
|
ca.uhn.fhir.rest.server.RestfulServer.getPagesNonHttpGet=Requests for _getpages must use HTTP GET
|
||||||
ca.uhn.fhir.rest.server.RestfulServer.unknownMethod=Invalid request: The FHIR endpoint on this server does not know how to handle {0} operation[{1}] with parameters [{2}]
|
ca.uhn.fhir.rest.server.RestfulServer.unknownMethod=Invalid request: The FHIR endpoint on this server does not know how to handle {0} operation[{1}] with parameters [{2}]
|
||||||
ca.uhn.fhir.rest.server.RestfulServer.rootRequest=This is the base URL of FHIR server. Unable to handle this request, as it does not contain a resource type or operation name.
|
ca.uhn.fhir.rest.server.RestfulServer.rootRequest=This is the base URL of FHIR server. Unable to handle this request, as it does not contain a resource type or operation name.
|
||||||
|
|
||||||
ca.uhn.fhir.validation.ValidationContext.unableToDetermineEncoding=Unable to determine encoding (e.g. XML / JSON) on validation input. Is this a valid FHIR resource body?
|
ca.uhn.fhir.validation.ValidationContext.unableToDetermineEncoding=Unable to determine encoding (e.g. XML / JSON) on validation input. Is this a valid FHIR resource body?
|
||||||
ca.uhn.fhir.validation.FhirValidator.noPhlocWarningOnStartup=Phloc-schematron library not found on classpath, will not attempt to perform schematron validation
|
ca.uhn.fhir.validation.FhirValidator.noPhlocWarningOnStartup=Phloc-schematron library not found on classpath, will not attempt to perform schematron validation
|
||||||
ca.uhn.fhir.validation.FhirValidator.noPhlocError=Phloc-schematron library not found on classpath, can not enable perform schematron validation
|
ca.uhn.fhir.validation.FhirValidator.noPhlocError=Phloc-schematron library not found on classpath, can not enable perform schematron validation
|
||||||
|
@ -81,6 +79,7 @@ ca.uhn.fhir.jpa.dao.BaseHapiFhirResourceDao.unableToDeleteNotFound=Unable to fin
|
||||||
ca.uhn.fhir.jpa.dao.BaseHapiFhirResourceDao.successfulCreate=Successfully created resource "{0}" in {1}ms
|
ca.uhn.fhir.jpa.dao.BaseHapiFhirResourceDao.successfulCreate=Successfully created resource "{0}" in {1}ms
|
||||||
ca.uhn.fhir.jpa.dao.BaseHapiFhirResourceDao.successfulUpdate=Successfully updated resource "{0}" in {1}ms
|
ca.uhn.fhir.jpa.dao.BaseHapiFhirResourceDao.successfulUpdate=Successfully updated resource "{0}" in {1}ms
|
||||||
ca.uhn.fhir.jpa.dao.BaseHapiFhirResourceDao.successfulDeletes=Successfully deleted {0} resource(s) in {1}ms
|
ca.uhn.fhir.jpa.dao.BaseHapiFhirResourceDao.successfulDeletes=Successfully deleted {0} resource(s) in {1}ms
|
||||||
|
ca.uhn.fhir.jpa.dao.BaseHapiFhirResourceDao.invalidSearchParameter=Unknown search parameter "{0}". Value search parameters for this search are: {1}
|
||||||
|
|
||||||
ca.uhn.fhir.jpa.dao.SearchBuilder.invalidQuantityPrefix=Unable to handle quantity prefix "{0}" for value: {1}
|
ca.uhn.fhir.jpa.dao.SearchBuilder.invalidQuantityPrefix=Unable to handle quantity prefix "{0}" for value: {1}
|
||||||
ca.uhn.fhir.jpa.dao.SearchBuilder.invalidNumberPrefix=Unable to handle number prefix "{0}" for value: {1}
|
ca.uhn.fhir.jpa.dao.SearchBuilder.invalidNumberPrefix=Unable to handle number prefix "{0}" for value: {1}
|
||||||
|
|
|
@ -57,6 +57,8 @@ import ca.uhn.fhir.rest.api.PatchTypeEnum;
|
||||||
import ca.uhn.fhir.rest.api.RestOperationTypeEnum;
|
import ca.uhn.fhir.rest.api.RestOperationTypeEnum;
|
||||||
import ca.uhn.fhir.rest.method.RequestDetails;
|
import ca.uhn.fhir.rest.method.RequestDetails;
|
||||||
import ca.uhn.fhir.rest.method.RestSearchParameterTypeEnum;
|
import ca.uhn.fhir.rest.method.RestSearchParameterTypeEnum;
|
||||||
|
import ca.uhn.fhir.rest.method.SearchMethodBinding;
|
||||||
|
import ca.uhn.fhir.rest.method.SearchMethodBinding.QualifierDetails;
|
||||||
import ca.uhn.fhir.rest.server.IBundleProvider;
|
import ca.uhn.fhir.rest.server.IBundleProvider;
|
||||||
import ca.uhn.fhir.rest.server.exceptions.*;
|
import ca.uhn.fhir.rest.server.exceptions.*;
|
||||||
import ca.uhn.fhir.rest.server.interceptor.IServerInterceptor;
|
import ca.uhn.fhir.rest.server.interceptor.IServerInterceptor;
|
||||||
|
@ -73,6 +75,7 @@ public abstract class BaseHapiFhirResourceDao<T extends IBaseResource> extends B
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private DaoConfig myDaoConfig;
|
private DaoConfig myDaoConfig;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
protected PlatformTransactionManager myPlatformTransactionManager;
|
protected PlatformTransactionManager myPlatformTransactionManager;
|
||||||
@Autowired
|
@Autowired
|
||||||
|
@ -86,6 +89,8 @@ public abstract class BaseHapiFhirResourceDao<T extends IBaseResource> extends B
|
||||||
@Autowired()
|
@Autowired()
|
||||||
protected ISearchResultDao mySearchResultDao;
|
protected ISearchResultDao mySearchResultDao;
|
||||||
private String mySecondaryPrimaryKeyParamName;
|
private String mySecondaryPrimaryKeyParamName;
|
||||||
|
@Autowired
|
||||||
|
private ISearchParamRegistry mySerarchParamRegistry;
|
||||||
@Autowired()
|
@Autowired()
|
||||||
protected IHapiTerminologySvc myTerminologySvc;
|
protected IHapiTerminologySvc myTerminologySvc;
|
||||||
|
|
||||||
|
@ -662,6 +667,30 @@ public abstract class BaseHapiFhirResourceDao<T extends IBaseResource> extends B
|
||||||
return retVal;
|
return retVal;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public DaoMethodOutcome patch(IIdType theId, PatchTypeEnum thePatchType, String thePatchBody, RequestDetails theRequestDetails) {
|
||||||
|
ResourceTable entityToUpdate = readEntityLatestVersion(theId);
|
||||||
|
if (theId.hasVersionIdPart()) {
|
||||||
|
if (theId.getVersionIdPartAsLong() != entityToUpdate.getVersion()) {
|
||||||
|
throw new ResourceVersionConflictException("Version " + theId.getVersionIdPart() + " is not the most recent version of this resource, unable to apply patch");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
validateResourceType(entityToUpdate);
|
||||||
|
|
||||||
|
IBaseResource resourceToUpdate = toResource(entityToUpdate, false);
|
||||||
|
IBaseResource destination;
|
||||||
|
if (thePatchType == PatchTypeEnum.JSON_PATCH) {
|
||||||
|
destination = JsonPatchUtils.apply(getContext(), resourceToUpdate, thePatchBody);
|
||||||
|
} else {
|
||||||
|
destination = XmlPatchUtils.apply(getContext(), resourceToUpdate, thePatchBody);
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
T destinationCasted = (T) destination;
|
||||||
|
return update(destinationCasted, null, true, theRequestDetails);
|
||||||
|
}
|
||||||
|
|
||||||
@PostConstruct
|
@PostConstruct
|
||||||
public void postConstruct() {
|
public void postConstruct() {
|
||||||
RuntimeResourceDefinition def = getContext().getResourceDefinition(myResourceType);
|
RuntimeResourceDefinition def = getContext().getResourceDefinition(myResourceType);
|
||||||
|
@ -863,9 +892,6 @@ public abstract class BaseHapiFhirResourceDao<T extends IBaseResource> extends B
|
||||||
return search(map);
|
return search(map);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private ISearchParamRegistry mySerarchParamRegistry;
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public IBundleProvider search(final SearchParameterMap theParams) {
|
public IBundleProvider search(final SearchParameterMap theParams) {
|
||||||
// Notify interceptors
|
// Notify interceptors
|
||||||
|
@ -988,6 +1014,23 @@ public abstract class BaseHapiFhirResourceDao<T extends IBaseResource> extends B
|
||||||
return retVal;
|
return retVal;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void translateRawParameters(Map<String, List<String>> theSource, SearchParameterMap theTarget) {
|
||||||
|
Map<String, RuntimeSearchParam> searchParams = mySerarchParamRegistry.getActiveSearchParams(getResourceName());
|
||||||
|
|
||||||
|
Set<String> paramNames = theSource.keySet();
|
||||||
|
for (String nextParamName : paramNames) {
|
||||||
|
QualifierDetails qualifiedParamName = SearchMethodBinding.extractQualifiersFromParameterName(nextParamName);
|
||||||
|
RuntimeSearchParam param = searchParams.get(qualifiedParamName.getParamName());
|
||||||
|
if (param == null) {
|
||||||
|
String msg = getContext().getLocalizer().getMessage(BaseHapiFhirResourceDao.class, "invalidSearchParameter", qualifiedParamName.getParamName(), new TreeSet<String>(searchParams.keySet()));
|
||||||
|
throw new InvalidRequestException(msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
aaaa
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public DaoMethodOutcome update(T theResource) {
|
public DaoMethodOutcome update(T theResource) {
|
||||||
return update(theResource, null, null);
|
return update(theResource, null, null);
|
||||||
|
@ -1078,30 +1121,6 @@ public abstract class BaseHapiFhirResourceDao<T extends IBaseResource> extends B
|
||||||
ourLog.info(msg);
|
ourLog.info(msg);
|
||||||
return outcome;
|
return outcome;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public DaoMethodOutcome patch(IIdType theId, PatchTypeEnum thePatchType, String thePatchBody, RequestDetails theRequestDetails) {
|
|
||||||
ResourceTable entityToUpdate = readEntityLatestVersion(theId);
|
|
||||||
if (theId.hasVersionIdPart()) {
|
|
||||||
if (theId.getVersionIdPartAsLong() != entityToUpdate.getVersion()) {
|
|
||||||
throw new ResourceVersionConflictException("Version " + theId.getVersionIdPart() + " is not the most recent version of this resource, unable to apply patch");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
validateResourceType(entityToUpdate);
|
|
||||||
|
|
||||||
IBaseResource resourceToUpdate = toResource(entityToUpdate, false);
|
|
||||||
IBaseResource destination;
|
|
||||||
if (thePatchType == PatchTypeEnum.JSON_PATCH) {
|
|
||||||
destination = JsonPatchUtils.apply(getContext(), resourceToUpdate, thePatchBody);
|
|
||||||
} else {
|
|
||||||
destination = XmlPatchUtils.apply(getContext(), resourceToUpdate, thePatchBody);
|
|
||||||
}
|
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
T destinationCasted = (T) destination;
|
|
||||||
return update(destinationCasted, null, true, theRequestDetails);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -39,8 +39,10 @@ import ca.uhn.fhir.rest.api.MethodOutcome;
|
||||||
import ca.uhn.fhir.rest.api.PatchTypeEnum;
|
import ca.uhn.fhir.rest.api.PatchTypeEnum;
|
||||||
import ca.uhn.fhir.rest.api.ValidationModeEnum;
|
import ca.uhn.fhir.rest.api.ValidationModeEnum;
|
||||||
import ca.uhn.fhir.rest.method.RequestDetails;
|
import ca.uhn.fhir.rest.method.RequestDetails;
|
||||||
|
import ca.uhn.fhir.rest.param.StringParam;
|
||||||
import ca.uhn.fhir.rest.server.EncodingEnum;
|
import ca.uhn.fhir.rest.server.EncodingEnum;
|
||||||
import ca.uhn.fhir.rest.server.IBundleProvider;
|
import ca.uhn.fhir.rest.server.IBundleProvider;
|
||||||
|
import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException;
|
||||||
import ca.uhn.fhir.rest.server.exceptions.ResourceNotFoundException;
|
import ca.uhn.fhir.rest.server.exceptions.ResourceNotFoundException;
|
||||||
|
|
||||||
public interface IFhirResourceDao<T extends IBaseResource> extends IDao {
|
public interface IFhirResourceDao<T extends IBaseResource> extends IDao {
|
||||||
|
@ -134,6 +136,8 @@ public interface IFhirResourceDao<T extends IBaseResource> extends IDao {
|
||||||
*/
|
*/
|
||||||
<MT extends IBaseMetaType> MT metaGetOperation(Class<MT> theType, RequestDetails theRequestDetails);
|
<MT extends IBaseMetaType> MT metaGetOperation(Class<MT> theType, RequestDetails theRequestDetails);
|
||||||
|
|
||||||
|
DaoMethodOutcome patch(IIdType theId, PatchTypeEnum thePatchType, String thePatchBody, RequestDetails theRequestDetails);
|
||||||
|
|
||||||
Set<Long> processMatchUrl(String theMatchUrl);
|
Set<Long> processMatchUrl(String theMatchUrl);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -181,6 +185,15 @@ public interface IFhirResourceDao<T extends IBaseResource> extends IDao {
|
||||||
|
|
||||||
Set<Long> searchForIdsWithAndOr(SearchParameterMap theParams);
|
Set<Long> searchForIdsWithAndOr(SearchParameterMap theParams);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Takes a map of incoming raw search parameters and translates/parses them into
|
||||||
|
* appropriate {@link IQueryParameterType} instances of the appropriate type
|
||||||
|
* for the given param
|
||||||
|
*
|
||||||
|
* @throws InvalidRequestException If any of the parameters are not known
|
||||||
|
*/
|
||||||
|
void translateRawParameters(Map<String, List<String>> theSource, SearchParameterMap theTarget);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Update a resource - Note that this variant of the method does not take in a {@link RequestDetails} and
|
* Update a resource - Note that this variant of the method does not take in a {@link RequestDetails} and
|
||||||
* therefore can not fire any interceptors. Use only for internal system calls
|
* therefore can not fire any interceptors. Use only for internal system calls
|
||||||
|
@ -211,8 +224,6 @@ public interface IFhirResourceDao<T extends IBaseResource> extends IDao {
|
||||||
*/
|
*/
|
||||||
MethodOutcome validate(T theResource, IIdType theId, String theRawResource, EncodingEnum theEncoding, ValidationModeEnum theMode, String theProfile, RequestDetails theRequestDetails);
|
MethodOutcome validate(T theResource, IIdType theId, String theRawResource, EncodingEnum theEncoding, ValidationModeEnum theMode, String theProfile, RequestDetails theRequestDetails);
|
||||||
|
|
||||||
DaoMethodOutcome patch(IIdType theId, PatchTypeEnum thePatchType, String thePatchBody, RequestDetails theRequestDetails);
|
|
||||||
|
|
||||||
// /**
|
// /**
|
||||||
// * Invoke the everything operation
|
// * Invoke the everything operation
|
||||||
// */
|
// */
|
||||||
|
|
|
@ -29,17 +29,28 @@ import org.springframework.scheduling.annotation.Scheduled;
|
||||||
|
|
||||||
import ca.uhn.fhir.jpa.dao.IFhirResourceDaoSearchParameter;
|
import ca.uhn.fhir.jpa.dao.IFhirResourceDaoSearchParameter;
|
||||||
import ca.uhn.fhir.jpa.dao.IFhirSystemDao;
|
import ca.uhn.fhir.jpa.dao.IFhirSystemDao;
|
||||||
|
import ca.uhn.fhir.jpa.entity.ResourceTable;
|
||||||
|
import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException;
|
||||||
|
|
||||||
public class FhirResourceDaoSearchParameterDstu3 extends FhirResourceDaoDstu3<SearchParameter>implements IFhirResourceDaoSearchParameter<SearchParameter> {
|
public class FhirResourceDaoSearchParameterDstu3 extends FhirResourceDaoDstu3<SearchParameter>implements IFhirResourceDaoSearchParameter<SearchParameter> {
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private IFhirSystemDao<Bundle, Meta> mySystemDao;
|
private IFhirSystemDao<Bundle, Meta> mySystemDao;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void validateResourceForStorage(SearchParameter theResource, ResourceTable theEntityToSave) {
|
||||||
|
super.validateResourceForStorage(theResource, theEntityToSave);
|
||||||
|
|
||||||
|
if (theResource.getStatus() == null) {
|
||||||
|
throw new InvalidRequestException("Resource.status is missing or invalid: " + theResource.getStatusElement().getValueAsString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This method is called once per minute to perform any required re-indexing. During most passes this will
|
* This method is called once per minute to perform any required re-indexing. During most passes this will
|
||||||
* just check and find that there are no resources requiring re-indexing. In that case the method just returns
|
* just check and find that there are no resources requiring re-indexing. In that case the method just returns
|
||||||
* immediately. If the search finds that some resources require reindexing, the system will do a bunch of
|
* immediately. If the search finds that some resources require reindexing, the system will do multiple
|
||||||
* reindexing and then return.
|
* reindexing passes and then return.
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
@Scheduled(fixedDelay=DateUtils.MILLIS_PER_MINUTE)
|
@Scheduled(fixedDelay=DateUtils.MILLIS_PER_MINUTE)
|
||||||
|
|
|
@ -0,0 +1,56 @@
|
||||||
|
package ca.uhn.fhir.jpa.provider.dstu3;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
import static org.junit.Assert.fail;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
import org.hl7.fhir.dstu3.model.SearchParameter;
|
||||||
|
import org.hl7.fhir.dstu3.model.SearchParameter.XPathUsageType;
|
||||||
|
import org.junit.After;
|
||||||
|
import org.junit.AfterClass;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import ca.uhn.fhir.jpa.dao.DaoConfig;
|
||||||
|
import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException;
|
||||||
|
import ca.uhn.fhir.util.TestUtil;
|
||||||
|
|
||||||
|
public class ResourceProviderCustomSearchParamDstu3Test extends BaseResourceProviderDstu3Test {
|
||||||
|
|
||||||
|
private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(ResourceProviderCustomSearchParamDstu3Test.class);
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@After
|
||||||
|
public void after() throws Exception {
|
||||||
|
super.after();
|
||||||
|
|
||||||
|
myDaoConfig.setDefaultSearchParamsCanBeOverridden(new DaoConfig().isDefaultSearchParamsCanBeOverridden());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void before() throws Exception {
|
||||||
|
super.before();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void saveCreateSearchParamInvalidWithMissingStatus() throws IOException {
|
||||||
|
SearchParameter sp = new SearchParameter();
|
||||||
|
sp.setCode("foo");
|
||||||
|
sp.setXpath("Patient.gender");
|
||||||
|
sp.setXpathUsage(XPathUsageType.NORMAL);
|
||||||
|
sp.setTitle("Foo Param");
|
||||||
|
|
||||||
|
try {
|
||||||
|
ourClient.create().resource(sp).execute();
|
||||||
|
fail();
|
||||||
|
} catch (InvalidRequestException e) {
|
||||||
|
assertEquals("", e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@AfterClass
|
||||||
|
public static void afterClassClearContext() {
|
||||||
|
TestUtil.clearAllStaticFieldsForUnitTest();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -99,6 +99,9 @@ public class ${className}ResourceProvider extends
|
||||||
#end
|
#end
|
||||||
#end
|
#end
|
||||||
|
|
||||||
|
@RawParam
|
||||||
|
Map<String, List<String>> theAdditionalRawParams,
|
||||||
|
|
||||||
#if ( $version != 'dstu' )
|
#if ( $version != 'dstu' )
|
||||||
@IncludeParam(reverse=true)
|
@IncludeParam(reverse=true)
|
||||||
Set<Include> theRevIncludes,
|
Set<Include> theRevIncludes,
|
||||||
|
|
Loading…
Reference in New Issue