blob: 3957a508633e701daac7d64026a47dc63d6816bd [file] [log] [blame]
/*
* Copyright (c) 2011-2013 Eike Stepper (Berlin, Germany) and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Eike Stepper - initial API and implementation
* Simon McDuff - bug 201266
* Simon McDuff - bug 230832
*/
package org.eclipse.emf.cdo.internal.common.revision;
import org.eclipse.emf.cdo.common.branch.CDOBranch;
import org.eclipse.emf.cdo.common.id.CDOID;
import org.eclipse.emf.cdo.common.id.CDOIDUtil;
import org.eclipse.emf.cdo.common.revision.CDOIDAndBranch;
import org.eclipse.emf.cdo.common.revision.CDORevision;
import org.eclipse.emf.cdo.spi.common.revision.InternalCDORevisionCache;
import org.eclipse.emf.ecore.EClass;
import java.util.Map;
/**
* @author Eike Stepper
*/
public class CDORevisionCacheBranching extends CDORevisionCacheAuditing
{
private Map<CDOID, TypeAndRefCounter> typeMap = CDOIDUtil.createMap();
public CDORevisionCacheBranching()
{
}
@Override
public InternalCDORevisionCache instantiate(CDORevision revision)
{
return new CDORevisionCacheBranching();
}
@Override
public EClass getObjectType(CDOID id)
{
synchronized (revisionLists)
{
TypeAndRefCounter typeCounter = typeMap.get(id);
if (typeCounter != null)
{
return typeCounter.getType();
}
return null;
}
}
@Override
protected void typeRefIncrease(CDOID id, EClass type)
{
TypeAndRefCounter typeCounter = typeMap.get(id);
if (typeCounter == null)
{
typeCounter = new TypeAndRefCounter(type);
typeMap.put(id, typeCounter);
}
typeCounter.increase();
}
@Override
protected void typeRefDecrease(CDOID id)
{
TypeAndRefCounter typeCounter = typeMap.get(id);
if (typeCounter != null && typeCounter.decreaseAndGet() == 0)
{
typeMap.remove(id);
}
}
@Override
protected void typeRefDispose()
{
typeMap.clear();
}
@Override
protected boolean isKeyInBranch(Object key, CDOBranch branch)
{
return ((CDOIDAndBranch)key).getBranch() == branch;
}
@Override
protected Object createKey(CDOID id, CDOBranch branch)
{
return CDOIDUtil.createIDAndBranch(id, branch);
}
/**
* @author Eike Stepper
*/
private static final class TypeAndRefCounter
{
private EClass type;
private int refCounter;
public TypeAndRefCounter(EClass type)
{
this.type = type;
}
public EClass getType()
{
return type;
}
public void increase()
{
++refCounter;
}
public int decreaseAndGet()
{
return --refCounter;
}
}
}