com.opengamma.engine.marketdata.live.LiveMarketDataPermissionProvider.java Source code

Java tutorial

Introduction

Here is the source code for com.opengamma.engine.marketdata.live.LiveMarketDataPermissionProvider.java

Source

/**
 * Copyright (C) 2011 - present by OpenGamma Inc. and the OpenGamma group of companies
 *
 * Please see distribution for license.
 */
package com.opengamma.engine.marketdata.live;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Map;
import java.util.Set;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
import com.opengamma.engine.marketdata.MarketDataPermissionProvider;
import com.opengamma.engine.value.ValueSpecification;
import com.opengamma.livedata.LiveDataSpecification;
import com.opengamma.livedata.UserPrincipal;
import com.opengamma.livedata.entitlement.LiveDataEntitlementChecker;
import com.opengamma.util.ArgumentChecker;

/**
 * Permission provider for live market data which delegates to a {@link LiveDataEntitlementChecker}.
 */
public class LiveMarketDataPermissionProvider implements MarketDataPermissionProvider {

    private static final Logger s_logger = LoggerFactory.getLogger(LiveMarketDataPermissionProvider.class);

    private final LiveDataEntitlementChecker _entitlementChecker;

    public LiveMarketDataPermissionProvider(final LiveDataEntitlementChecker entitlementChecker) {
        ArgumentChecker.notNull(entitlementChecker, "entitlementChecker");
        _entitlementChecker = entitlementChecker;
    }

    //-------------------------------------------------------------------------
    @Override
    public Set<ValueSpecification> checkMarketDataPermissions(final UserPrincipal user,
            final Set<ValueSpecification> specifications) {
        s_logger.info("Checking that {} is entitled to computation results", user);
        final Map<LiveDataSpecification, Collection<ValueSpecification>> requiredLiveData = getRequiredLiveDataSpecifications(
                specifications);
        Map<LiveDataSpecification, Boolean> entitlements;
        try {
            entitlements = _entitlementChecker.isEntitled(user, requiredLiveData.keySet());
        } catch (final Exception e) {
            // 2013-02-04 Andrew -- The message below said this was failing open, but it's returning the full set of specifications which is no access. I kept
            // this behaviour but changed the logging message.
            s_logger.warn("Failed to perform entitlement checking. Assuming no access to data.", e);
            return Sets.newHashSet(); //specifications;
        }
        final Set<ValueSpecification> failures = Sets.newHashSet();
        for (final Map.Entry<LiveDataSpecification, Boolean> entry : entitlements.entrySet()) {
            if (!entry.getValue()) {
                failures.addAll(requiredLiveData.get(entry.getKey()));
            }
        }
        if (!failures.isEmpty()) {
            s_logger.warn("User {} does not have permission to access {} out of {} market data values",
                    new Object[] { user, failures.size(), specifications.size() });
            s_logger.info("User {} does not have permission to access {}", user, failures);
        }
        return failures;
    }

    private Map<LiveDataSpecification, Collection<ValueSpecification>> getRequiredLiveDataSpecifications(
            final Set<ValueSpecification> specifications) {
        final Map<LiveDataSpecification, Collection<ValueSpecification>> returnValue = Maps
                .newHashMapWithExpectedSize(specifications.size());
        for (final ValueSpecification specification : specifications) {
            final LiveDataSpecification liveDataSpec = LiveMarketDataAvailabilityProvider
                    .getLiveDataSpecification(specification);
            Collection<ValueSpecification> specs = returnValue.get(liveDataSpec);
            if (specs == null) {
                specs = new ArrayList<ValueSpecification>();
                returnValue.put(liveDataSpec, specs);
            }
            specs.add(specification);
        }
        return returnValue;
    }

}