/* * Copyright (c) 2010-2013, 2016 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: * Ibrahim Sallam - initial API and implementation */ package org.eclipse.emf.cdo.server.internal.objectivity.schema; import org.eclipse.emf.cdo.common.branch.CDOBranch; import org.eclipse.emf.cdo.spi.common.branch.InternalCDOBranchManager.BranchLoader; import org.eclipse.emf.cdo.spi.common.branch.InternalCDOBranchManager.BranchLoader.BranchInfo; import org.eclipse.net4j.util.collection.Pair; import com.objy.db.app.ooId; import com.objy.db.app.ooObj; import com.objy.db.util.ooTreeSetX; import java.util.ArrayList; import java.util.Iterator; import java.util.List; /** * @author Ibrahim Sallam */ public class ObjyBranchManager extends ooObj { protected int nextBranchId; protected int nextLocalBranchId; protected ooTreeSetX branchSet; private ObjyBranchManager() { nextBranchId = 0; nextLocalBranchId = 0; } protected void createTreeSet(ooObj clusterObject) { branchSet = new ooTreeSetX(); clusterObject.cluster(branchSet); } public int getLastBranchId() { fetch(); return nextBranchId; } public int nextBranchId() { markModified(); return ++nextBranchId; } public int getlastLocalBranchId() { fetch(); return nextLocalBranchId; } public int nextLocalBranchId() { markModified(); return --nextLocalBranchId; } public Pair<Integer, Long> createBranch(int branchId, BranchInfo branchInfo) { markModified(); if (branchId == BranchLoader.NEW_BRANCH) { branchId = nextBranchId(); } else if (branchId == BranchLoader.NEW_LOCAL_BRANCH) { branchId = nextLocalBranchId(); } ObjyBranch newObjyBranch = ObjyBranch.create(this, branchId, branchInfo); // if the baseBranchId is 0, then we just added to our branchSet, otherwise // we'll lookup the ObjyBranch with the id, and add the newly created // ObjyBranch to it's sub-branches set. // int baseBranchId = branchInfo.getBaseBranchID(); // Initially I thought we could make a tree of branches, but for the // first implementation we can just create a TreeSet of all branches, // then resolve sub-branches dynamically by checking baseBranchId. branchSet.add(newObjyBranch); // implicit clustering. // if (baseBranchId == 0) // main branch. // { // branchSet.add(newObjyBranch); // implicit clustering. // } // else // { // Iterator<ObjyBranch> treeItr = branchSet.iterator(); // ObjyBranch objyBranch = null; // boolean found = false; // while (treeItr.hasNext() && !found) // { // objyBranch = treeItr.next(); // if (baseBranchId == objyBranch.getBaseBranchId()) // { // found = true; // continue; // } // objyBranch = null; // } // // objyBranch.addSubBranch(newObjyBranch); // } return Pair.create(branchId, branchInfo.getBaseTimeStamp()); } public ObjyBranch getBranch(int branchId) { fetch(); @SuppressWarnings("unchecked") Iterator<ObjyBranch> treeItr = branchSet.iterator(); ObjyBranch objyBranch = null; while (treeItr.hasNext()) { ObjyBranch tempObjyBranch = treeItr.next(); if (branchId == tempObjyBranch.getBranchId()) { objyBranch = tempObjyBranch; break; } } return objyBranch; } public static ObjyBranchManager create(ooId scopeContOid) { ObjyBranchManager branchManager = new ObjyBranchManager(); ooObj clusterObject = ooObj.create_ooObj(scopeContOid); clusterObject.cluster(branchManager); branchManager.createTreeSet(branchManager); branchManager.createMainBranch(); return branchManager; } public void createMainBranch() { ObjyBranch newObjyBranch = ObjyBranch.create(this, CDOBranch.MAIN_BRANCH_ID, CDOBranch.MAIN_BRANCH_ID, CDOBranch.MAIN_BRANCH_NAME, 0); branchSet.add(newObjyBranch); // implicit clustering. } public boolean deleteBranch(int branchId) { boolean done = false; markModified(); @SuppressWarnings("unchecked") Iterator<ObjyBranch> treeItr = branchSet.iterator(); ObjyBranch objyBranch = null; while (treeItr.hasNext()) { objyBranch = treeItr.next(); if (branchId == objyBranch.getBranchId()) { done = branchSet.remove(objyBranch); break; } } return done; } public List<ObjyBranch> getSubBranches(int baseBranchId) { fetch(); List<ObjyBranch> objyBranchList = new ArrayList<ObjyBranch>(); Iterator<?> treeItr = branchSet.iterator(); ObjyBranch objyBranch = null; while (treeItr.hasNext()) { objyBranch = (ObjyBranch)treeItr.next(); if (objyBranch.getBranchId() == objyBranch.getBaseBranchId()) { continue; } if (objyBranch.getBaseBranchId() == baseBranchId) { objyBranchList.add(objyBranch); } } return objyBranchList; } public List<ObjyBranch> getBranches(int startId, int endId) { fetch(); List<ObjyBranch> objyBranchList = new ArrayList<ObjyBranch>(); int lastId = endId != 0 ? endId : Integer.MAX_VALUE; @SuppressWarnings("unchecked") Iterator<ObjyBranch> treeItr = branchSet.iterator(); ObjyBranch objyBranch = null; while (treeItr.hasNext()) { objyBranch = treeItr.next(); int id = objyBranch.getBranchId(); if (id >= startId && id <= lastId) { objyBranchList.add(objyBranch); } } return objyBranchList; } }