use of io.apiman.gateway.engine.io.IApimanBuffer in project apiman by apiman.
the class CachingPolicy 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)
*/
@Deprecated
@Override
protected IReadWriteStream<ApiResponse> responseDataHandler(final ApiResponse response, IPolicyContext context, CachingConfig policyConfiguration) {
// Possibly cache the response for future posterity.
// Check the response code against list in config (empty/null list means cache all).
final boolean shouldCache = (context.getAttribute(SHOULD_CACHE_ATTR, Boolean.FALSE) && ofNullable(policyConfiguration.getStatusCodes()).map(statusCodes -> statusCodes.isEmpty() || statusCodes.contains(String.valueOf(response.getCode()))).orElse(true));
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) {
// TODO log error
return null;
}
} else {
return null;
}
}
use of io.apiman.gateway.engine.io.IApimanBuffer 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.io.IApimanBuffer in project apiman by apiman.
the class InfinispanCacheStoreComponent method getBinary.
/**
* @see io.apiman.gateway.engine.components.ICacheStoreComponent#getBinary(java.lang.String, java.lang.Class, io.apiman.gateway.engine.async.IAsyncResultHandler)
*/
@SuppressWarnings("unchecked")
@Override
public <T> void getBinary(String cacheKey, Class<T> type, IAsyncResultHandler<ISignalReadStream<T>> handler) {
ISignalReadStream<T> rval;
synchronized (mutex) {
InfinispanCacheEntry entry = (InfinispanCacheEntry) getCache().get(cacheKey);
if (entry != null) {
if (entry.getExpiresOn() <= System.currentTimeMillis()) {
getCache().remove(cacheKey);
rval = null;
} else {
final T head = (T) entry.getHead();
final IApimanBuffer dataBuffer = bufferFactory.createBuffer(entry.getData());
rval = new ISignalReadStream<T>() {
boolean finished = false;
IAsyncHandler<IApimanBuffer> bodyHandler;
IAsyncHandler<Void> endHandler;
@Override
public void bodyHandler(IAsyncHandler<IApimanBuffer> bodyHandler) {
this.bodyHandler = bodyHandler;
}
@Override
public void endHandler(IAsyncHandler<Void> endHandler) {
this.endHandler = endHandler;
}
@Override
public T getHead() {
return head;
}
@Override
public boolean isFinished() {
return finished;
}
@Override
public void abort(Throwable t) {
finished = true;
}
@Override
public void transmit() {
bodyHandler.handle(dataBuffer);
endHandler.handle(null);
}
};
}
} else {
rval = null;
}
}
handler.handle(AsyncResultImpl.create(rval));
}
use of io.apiman.gateway.engine.io.IApimanBuffer in project apiman by apiman.
the class AbstractCacheStoreComponent method putBinary.
/**
* @see ICacheStoreComponent#putBinary(String, Object, long)
*/
@Override
public <T> ISignalWriteStream putBinary(final String cacheKey, final T jsonObject, final long timeToLive) throws IOException {
final CacheEntry entry = new CacheEntry();
entry.setExpiresOn(System.currentTimeMillis() + (timeToLive * 1000));
entry.setHead(JSON_MAPPER.writeValueAsString(jsonObject));
final IApimanBuffer data = bufferFactory.createBuffer();
return new ISignalWriteStream() {
boolean finished = false;
boolean aborted = false;
@Override
public void abort(Throwable t) {
finished = true;
aborted = false;
}
@Override
public boolean isFinished() {
return finished;
}
@Override
public void write(IApimanBuffer chunk) {
data.append(chunk);
}
@Override
public void end() {
if (!aborted) {
entry.setData(Base64.encodeBase64String(data.getBytes()));
try {
getStore().put(cacheKey, entry, timeToLive);
} catch (Throwable e) {
LOGGER.error("Error writing binary cache entry with key: {}", cacheKey, e);
}
}
finished = true;
}
};
}
use of io.apiman.gateway.engine.io.IApimanBuffer in project apiman by apiman.
the class SimpleDataPolicy method getRequestDataHandler.
/**
* @see io.apiman.gateway.engine.policy.IDataPolicy#getRequestDataHandler(io.apiman.gateway.engine.beans.ApiRequest, io.apiman.gateway.engine.policy.IPolicyContext, java.lang.Object)
*/
@Override
public IReadWriteStream<ApiRequest> getRequestDataHandler(final ApiRequest request, final IPolicyContext context, final Object policyConfiguration) {
return new AbstractStream<ApiRequest>() {
@Override
public ApiRequest getHead() {
return request;
}
@Override
protected void handleHead(ApiRequest head) {
}
@Override
public void write(IApimanBuffer chunk) {
try {
String chunkstr = chunk.toString("UTF-8");
if (chunkstr.contains("$NAME")) {
chunkstr = chunkstr.replaceAll("\\$NAME", "Barry Allen");
IBufferFactoryComponent bufferFactory = context.<IBufferFactoryComponent>getComponent(IBufferFactoryComponent.class);
super.write(bufferFactory.createBuffer(chunkstr));
} else {
super.write(chunk);
}
} catch (UnsupportedEncodingException e) {
super.write(chunk);
}
}
};
}
Aggregations