Package com.betfair.cougar.transport.api.protocol.http

Source Code of com.betfair.cougar.transport.api.protocol.http.ExecutionContextFactory

/*
* Copyright 2013, The Sporting Exchange Limited
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*     http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package com.betfair.cougar.transport.api.protocol.http;

import com.betfair.cougar.api.ExecutionContext;
import com.betfair.cougar.api.ExecutionContextWithTokens;
import com.betfair.cougar.api.RequestUUID;
import com.betfair.cougar.api.geolocation.GeoLocationDetails;
import com.betfair.cougar.api.security.IdentityChain;
import com.betfair.cougar.api.security.IdentityToken;
import com.betfair.cougar.util.RequestUUIDImpl;
import com.betfair.cougar.util.geolocation.GeoIPLocator;

import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
* Generate an execution context
*/
public class ExecutionContextFactory {

    public static final String TRACE_ME_HEADER_PARAM = "X-Trace-Me";


    public static ExecutionContextWithTokens resolveExecutionContext(final HttpCommand command, final List<IdentityToken> tokens,
                                                       final String uuidHeader, GeoLocationDeserializer geoLocationDeserializer,
                                                       final GeoIPLocator geoIPLocator,
                                                       final String inferredCountry,
                                                       final int transportSecurityStrengthFactor, final boolean ignoreSubsequentWritesOfIdentity, Date requestTime) {
        final HttpServletRequest request = command.getRequest();
        String uuidString = request.getHeader(uuidHeader);

        return resolveExecutionContext(tokens, uuidString, request.getRemoteAddr(), geoLocationDeserializer.deserialize(request, request.getRemoteAddr()), geoIPLocator, inferredCountry, request.getHeader(TRACE_ME_HEADER_PARAM), transportSecurityStrengthFactor, ignoreSubsequentWritesOfIdentity, requestTime);
    }

    private static ExecutionContextWithTokens resolveExecutionContext(List<IdentityToken> tokens,
                                                       final String uuidString,
                                                       final String remoteAddress,
                                                       final List<String> resolvedAddresses,
                                                       final GeoIPLocator geoIPLocator,
                                                       final String inferredCountry,
                                                       final String traceMeHeaderParamValue,
                                                       final int transportSecurityStrengthFactor,
                                                       final boolean ignoreSubsequentWritesOfIdentity,
                                                       final Date requestTime) {
        if (tokens == null) {
            tokens = new ArrayList<IdentityToken>();
        }
        final Date receivedTime = new Date();
        final RequestUUID requestUUID;
        if (uuidString != null) {
            requestUUID = new RequestUUIDImpl(uuidString);
        } else {
            requestUUID = new RequestUUIDImpl();
        }
        final boolean traceEnabled = traceMeHeaderParamValue != null;

        GeoLocationDetails geoDetails = geoIPLocator.getGeoLocation(remoteAddress, resolvedAddresses, inferredCountry);

        return resolveExecutionContext(tokens, requestUUID, geoDetails, receivedTime, traceEnabled, transportSecurityStrengthFactor, requestTime, ignoreSubsequentWritesOfIdentity);
    }

    public static ExecutionContextWithTokens resolveExecutionContext(final List<IdentityToken> tokens, final RequestUUID requestUUID, final GeoLocationDetails geoDetails, final Date receivedTime, final boolean traceEnabled, final int transportSecurityStrengthFactor, final Date requestTime, final boolean ignoreSubsequentWritesOfIdentity) {
        if (tokens == null) {
            throw new IllegalArgumentException("Tokens must not be null");
        }

        return new ExecutionContextWithTokens() {

            private IdentityChain identityChain;

            @Override
            public List<IdentityToken> getIdentityTokens() {
                return tokens;
            }

            @Override
            public IdentityChain getIdentity() {
                return identityChain;
            }

            @Override
            public GeoLocationDetails getLocation() {
                return geoDetails;
            }

            @Override
            public RequestUUID getRequestUUID() {
                return requestUUID;
            }

            @Override
            public Date getReceivedTime() {
                return receivedTime;
            }

            @Override
            public boolean traceLoggingEnabled() {
                return traceEnabled;
            }

            @Override
            public int getTransportSecurityStrengthFactor() {
                return transportSecurityStrengthFactor;
            }

            @Override
            public boolean isTransportSecure() {
                return transportSecurityStrengthFactor > 1;
            }

            @Override
            public void setIdentityChain(IdentityChain chain) {
                if (identityChain != null && !ignoreSubsequentWritesOfIdentity) {
                    throw new IllegalStateException("Can't overwrite identity chain once set");
                }
                identityChain = chain;
            }

            @Override
            public Date getRequestTime() {
                return requestTime;
            }

            public String toString() {
                StringBuilder sb = new StringBuilder();

                sb.append("geoLocationDetails=").append(getLocation()).append("|");
                sb.append("tokens=").append(tokens).append("|");
                sb.append("requestUUID=").append(requestUUID).append("|");
                sb.append("receivedTime=").append(receivedTime).append("|");
                sb.append("requestTime=").append(requestTime).append("|");
                sb.append("traceLoggingEnabled=").append(traceEnabled);

                return sb.toString();
            }
        };
    }

    public static ExecutionContext resolveExecutionContext(final ExecutionContextWithTokens tokenContext, final IdentityChain chain) {
        return new ExecutionContext() {
            @Override
            public GeoLocationDetails getLocation() {
                return tokenContext.getLocation();
            }

            @Override
            public IdentityChain getIdentity() {
                return chain;
            }

            @Override
            public RequestUUID getRequestUUID() {
                return tokenContext.getRequestUUID();
            }

            @Override
            public Date getReceivedTime() {
                return tokenContext.getReceivedTime();
            }

            @Override
            public boolean traceLoggingEnabled() {
                return tokenContext.traceLoggingEnabled();
            }

            @Override
            public int getTransportSecurityStrengthFactor() {
                return tokenContext.getTransportSecurityStrengthFactor();
            }

            @Override
            public boolean isTransportSecure() {
                return tokenContext.isTransportSecure();
            }

            @Override
            public Date getRequestTime() {
                return tokenContext.getRequestTime();
            }
        };
    }
}
TOP

Related Classes of com.betfair.cougar.transport.api.protocol.http.ExecutionContextFactory

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.