package io.apiman.plugins.uniqueheader; import io.apiman.gateway.engine.beans.ApiRequest; import io.apiman.gateway.engine.beans.exceptions.ConfigurationParseException; import io.apiman.gateway.engine.policies.AbstractMappedPolicy; import io.apiman.gateway.engine.policy.IPolicyChain; import io.apiman.gateway.engine.policy.IPolicyContext; import io.apiman.plugins.uniqueheader.beans.UniqueHeaderBean; import io.apiman.plugins.uniqueheader.util.Messages; import org.apache.commons.lang.StringUtils; import java.util.UUID; /** * A policy that sets a unique value in a named header. * * @author Pete Cornish {@literal <outofcoffee@gmail.com>} */ public class UniqueHeaderPolicy extends AbstractMappedPolicy<UniqueHeaderBean> { private static final Messages MESSAGES = new Messages("io.apiman.plugins.uniqueheader", "UniqueHeaderPolicy"); /** * @see io.apiman.gateway.engine.policies.AbstractMappedPolicy#getConfigurationClass() */ @Override protected Class<UniqueHeaderBean> getConfigurationClass() { return UniqueHeaderBean.class; } /** * @see io.apiman.gateway.engine.policies.AbstractMappedPolicy#parseConfiguration(String) */ @Override public UniqueHeaderBean parseConfiguration(String jsonConfiguration) throws ConfigurationParseException { final UniqueHeaderBean config = super.parseConfiguration(jsonConfiguration); // validate configuration if (StringUtils.isBlank(config.getHeaderName())) { throw new ConfigurationParseException(MESSAGES.format("Error.BlankHeaderName")); } return config; } /** * @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(ApiRequest request, IPolicyContext context, UniqueHeaderBean config, IPolicyChain<ApiRequest> chain) { request.getHeaders().put(config.getHeaderName(), generateUniqueString()); chain.doApply(request); } /** * @return a unique String to set in the header */ protected String generateUniqueString() { return UUID.randomUUID().toString(); } }