/** * Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.engine.resource; import java.util.concurrent.atomic.AtomicBoolean; /** * Default implementation of {@link EngineResourceReference} * * @param <T> the type of resource */ public class EngineResourceReferenceImpl<T extends EngineResource> implements EngineResourceReference<T> { private final EngineResourceManagerImpl<T> _manager; private final T _resource; private AtomicBoolean _isReleased = new AtomicBoolean(false); public EngineResourceReferenceImpl(EngineResourceManagerImpl<T> manager, T resource) { _manager = manager; _resource = resource; } @Override public T get() { assertNotReleased(); return _resource; } @Override public void release() { if (_isReleased.getAndSet(true)) { // Already released return; } _manager.decrementCycleReferenceCount(_resource.getUniqueId()); } //------------------------------------------------------------------------- private void assertNotReleased() { if (_isReleased.get()) { throw new IllegalStateException("The computation cycle reference has been been released"); } } }