/** * Copyright (C) 2012 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.engine.target.lazy; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; import java.util.concurrent.ConcurrentMap; import java.util.concurrent.atomic.AtomicInteger; import com.google.common.collect.MapMaker; import com.opengamma.engine.ComputationTargetResolver; /** * Base class for target resolver based object. */ public class TargetResolverObject implements Serializable { private static final AtomicInteger s_nextIdentifier = new AtomicInteger(); private static final ConcurrentMap<ComputationTargetResolver.AtVersionCorrection, Integer> s_resolver2identifier = new MapMaker().weakKeys().makeMap(); private static final ConcurrentMap<Integer, ComputationTargetResolver.AtVersionCorrection> s_identifier2resolver = new MapMaker().weakValues().makeMap(); private transient ComputationTargetResolver.AtVersionCorrection _targetResolver; protected TargetResolverObject(final ComputationTargetResolver.AtVersionCorrection targetResolver) { _targetResolver = targetResolver; } protected ComputationTargetResolver.AtVersionCorrection getTargetResolver() { return _targetResolver; } private void writeObject(final ObjectOutputStream out) throws IOException { Integer id = s_resolver2identifier.get(getTargetResolver()); if (id == null) { id = s_nextIdentifier.getAndIncrement(); s_identifier2resolver.put(id, getTargetResolver()); final Integer existing = s_resolver2identifier.putIfAbsent(getTargetResolver(), id); if (existing != null) { s_identifier2resolver.remove(id); id = existing; } } out.writeInt(id.intValue()); } private void readObject(final ObjectInputStream in) throws IOException { final int targetResolver = in.readInt(); _targetResolver = s_identifier2resolver.get(targetResolver); assert _targetResolver != null; } }