/* * Copyright (c) 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: * Eike Stepper - initial API and implementation */ package org.eclipse.emf.cdo.server.internal.embedded; import org.eclipse.emf.cdo.common.branch.CDOBranchHandler; import org.eclipse.emf.cdo.server.IRepository; import org.eclipse.emf.cdo.server.ISessionManager; import org.eclipse.emf.cdo.server.StoreThreadLocal; import org.eclipse.emf.cdo.spi.common.branch.InternalCDOBranchManager.BranchLoader3; import org.eclipse.emf.cdo.spi.server.InternalSession; import org.eclipse.net4j.util.collection.Pair; /** * @author Eike Stepper */ public final class ServerBranchLoader implements BranchLoader3 { private final BranchLoader3 delegate; private final ISessionManager sessionManager; public ServerBranchLoader(BranchLoader3 delegate) { this.delegate = delegate; sessionManager = ((IRepository)delegate).getSessionManager(); } public BranchLoader3 getDelegate() { return delegate; } public Pair<Integer, Long> createBranch(int branchID, BranchInfo branchInfo) { if (!StoreThreadLocal.hasSession()) { try { StoreThreadLocal.setSession(getServerSession()); return delegate.createBranch(branchID, branchInfo); } finally { StoreThreadLocal.release(); } } return delegate.createBranch(branchID, branchInfo); } public BranchInfo loadBranch(int branchID) { if (!StoreThreadLocal.hasSession()) { try { StoreThreadLocal.setSession(getServerSession()); return delegate.loadBranch(branchID); } finally { StoreThreadLocal.release(); } } return delegate.loadBranch(branchID); } public SubBranchInfo[] loadSubBranches(int branchID) { if (!StoreThreadLocal.hasSession()) { try { StoreThreadLocal.setSession(getServerSession()); return delegate.loadSubBranches(branchID); } finally { StoreThreadLocal.release(); } } return delegate.loadSubBranches(branchID); } public int loadBranches(int startID, int endID, CDOBranchHandler branchHandler) { if (!StoreThreadLocal.hasSession()) { try { StoreThreadLocal.setSession(getServerSession()); return delegate.loadBranches(startID, endID, branchHandler); } finally { StoreThreadLocal.release(); } } return delegate.loadBranches(startID, endID, branchHandler); } public void renameBranch(int branchID, String oldName, String newName) { if (!StoreThreadLocal.hasSession()) { try { StoreThreadLocal.setSession(getServerSession()); delegate.renameBranch(branchID, oldName, newName); } finally { StoreThreadLocal.release(); } } else { delegate.renameBranch(branchID, oldName, newName); } } @Deprecated public void deleteBranch(int branchID) { } @Deprecated public void renameBranch(int branchID, String newName) { } private InternalSession getServerSession() { InternalSession serverSession = ServerSession.get(); if (serverSession == null) { // In contrast to revision loading the branch loading can happen through // parent branches and not explicitly through the delegating client branch manager. // In these cases the server session is not set, so use any open session. serverSession = (InternalSession)sessionManager.getSessions()[0]; } return serverSession; } }