use of io.apiman.gateway.engine.policies.config.CachingResourcesSettingsEntry in project apiman by apiman.
the class CachingResourcesPolicy method responseDataHandler.
/**
* @see io.apiman.gateway.engine.policies.AbstractMappedDataPolicy#responseDataHandler(io.apiman.gateway.engine.beans.ApiResponse, io.apiman.gateway.engine.policy.IPolicyContext, java.lang.Object)
*/
@Override
protected IReadWriteStream<ApiResponse> responseDataHandler(final ApiResponse response, IPolicyContext context, CachingResourcesConfig policyConfiguration) {
if (response == null) {
// if the response is empty because of a policy failure before we end here and return null
return null;
}
List<CachingResourcesSettingsEntry> possibleMatchingCachingEntries = context.getAttribute(CACHE_POSSIBLE_MATCHING_ENTRIES, new ArrayList<CachingResourcesSettingsEntry>());
boolean isAMatch = false;
for (CachingResourcesSettingsEntry entry : possibleMatchingCachingEntries) {
isAMatch = isAMatch || matchesPolicyEntryVsActualValue(entry.getStatusCode(), String.valueOf(response.getCode()));
}
// Possibly cache the response for future posterity.
final boolean shouldCache = context.getAttribute(SHOULD_CACHE_ATTR, Boolean.FALSE) && isAMatch;
if (shouldCache) {
try {
String cacheId = context.getAttribute(CACHE_ID_ATTR, null);
ICacheStoreComponent cache = context.getComponent(ICacheStoreComponent.class);
final ISignalWriteStream writeStream = cache.putBinary(cacheId, response, policyConfiguration.getTtl());
return new AbstractStream<ApiResponse>() {
@Override
public ApiResponse getHead() {
return response;
}
@Override
protected void handleHead(ApiResponse head) {
}
@Override
public void write(IApimanBuffer chunk) {
writeStream.write(chunk);
super.write(chunk);
}
@Override
public void end() {
writeStream.end();
super.end();
}
};
} catch (ComponentNotFoundException | IOException e) {
throw new RuntimeException(e);
}
}
return null;
}
use of io.apiman.gateway.engine.policies.config.CachingResourcesSettingsEntry in project apiman by apiman.
the class CachingResourcesPolicy method doApply.
/**
* If the request is cached an {@link IConnectorInterceptor} is set in order to prevent the back-end connection to be established.
* Otherwise an empty {@link CachedResponse} will be added to the context, this will be used to cache the response once it has been
* received from the back-end API
*
* @see io.apiman.gateway.engine.policies.AbstractMappedPolicy#doApply(io.apiman.gateway.engine.beans.ApiRequest, io.apiman.gateway.engine.policy.IPolicyContext, java.lang.Object, io.apiman.gateway.engine.policy.IPolicyChain)
*/
@Override
protected void doApply(final ApiRequest request, final IPolicyContext context, final CachingResourcesConfig config, final IPolicyChain<ApiRequest> chain) {
List<CachingResourcesSettingsEntry> possibleMatchingEntries = new ArrayList<CachingResourcesSettingsEntry>();
if (config.getTtl() > 0) {
for (CachingResourcesSettingsEntry entry : config.getCachingResourcesSettingsEntries()) {
// check if caching policy allows wildcards for http method or path pattern or check if the corresponding policy entry matches the request http method or path pattern.
if (matchesHttpMethod(entry.getHttpMethod(), request.getType()) && matchesPolicyEntryVsActualValue(entry.getPathPattern(), request.getDestination())) {
possibleMatchingEntries.add(entry);
}
}
context.setAttribute(CACHE_POSSIBLE_MATCHING_ENTRIES, possibleMatchingEntries);
}
if (possibleMatchingEntries.size() > 0) {
// Check to see if there is a cache entry for this request.
// If so, we deliver the cached result by CacheConnectorInterceptor
String cacheId = buildCacheID(request, context);
context.setAttribute(CACHE_ID_ATTR, cacheId);
ICacheStoreComponent cache = context.getComponent(ICacheStoreComponent.class);
cache.getBinary(cacheId, ApiResponse.class, new IAsyncResultHandler<ISignalReadStream<ApiResponse>>() {
@Override
public void handle(IAsyncResult<ISignalReadStream<ApiResponse>> result) {
if (result.isError()) {
chain.throwError(result.getError());
} else {
ISignalReadStream<ApiResponse> cacheEntry = result.getResult();
if (cacheEntry != null) {
markCacheEntryAsCached(cacheEntry, config);
context.setConnectorInterceptor(new CacheConnectorInterceptor(cacheEntry));
context.setAttribute(SHOULD_CACHE_ATTR, Boolean.FALSE);
context.setAttribute(CACHED_RESPONSE, cacheEntry.getHead());
} else {
context.setAttribute(SHOULD_CACHE_ATTR, Boolean.TRUE);
}
chain.doApply(request);
}
}
});
} else {
context.setAttribute(SHOULD_CACHE_ATTR, Boolean.FALSE);
chain.doApply(request);
}
}
Aggregations