| /* |
| * 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; |
| } |
| } |
| } |