blob: 12d02e307f7bae10be7512f9fa8ea0bab0d34d24 [file] [log] [blame]
/*
* Copyright (c) 2010-2013, 2015 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:
* Martin Fluegge - initial API and implementation
*/
package org.eclipse.emf.cdo.dawn.util.connection;
import org.eclipse.emf.cdo.dawn.internal.util.bundle.OM;
import org.eclipse.emf.cdo.dawn.util.exceptions.DawnInvalidIdException;
import org.eclipse.emf.cdo.net4j.CDONet4jUtil;
import org.eclipse.emf.cdo.session.CDOSession;
import org.eclipse.emf.cdo.transaction.CDOTransaction;
import org.eclipse.emf.cdo.util.CDOUtil;
import org.eclipse.emf.cdo.view.CDOAdapterPolicy;
import org.eclipse.emf.cdo.view.CDOView;
import org.eclipse.emf.cdo.view.CDOViewSet;
import org.eclipse.net4j.Net4jUtil;
import org.eclipse.net4j.connector.IConnector;
import org.eclipse.net4j.tcp.TCPUtil;
import org.eclipse.net4j.util.container.IPluginContainer;
import org.eclipse.net4j.util.om.OMPlatform;
import org.eclipse.net4j.util.om.trace.ContextTracer;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.spi.cdo.InternalCDOView;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author Martin Fluegge
*/
public class CDOConnectionUtil
{
private static final ContextTracer TRACER = new ContextTracer(OM.DEBUG, CDOConnectionUtil.class);
public static CDOConnectionUtil instance = new CDOConnectionUtil();
private CDOSession currentSession;
private String repositoryName;
private String protocol;
private String host;
private Map<String, CDOTransaction> transactions;
private IConnector connector;
static
{
if (!OMPlatform.INSTANCE.isOSGiRunning())
{
Net4jUtil.prepareContainer(IPluginContainer.INSTANCE);
TCPUtil.prepareContainer(IPluginContainer.INSTANCE);
CDONet4jUtil.prepareContainer(IPluginContainer.INSTANCE);
}
}
public CDOConnectionUtil()
{
}
public void init(String repositoryName, String protocol, String host)
{
this.repositoryName = repositoryName;
this.protocol = protocol;
this.host = host;
setConnector(Net4jUtil.getConnector(IPluginContainer.INSTANCE, protocol, host));
}
public void registerPackages(List<EPackage> packages)
{
if (packages == null)
{
return;
}
for (EPackage pack : packages)
{
pack.eClass();
}
}
/**
* opens the session if it is not opened.
*/
public CDOSession openSession()
{
currentSession = (CDOSession)IPluginContainer.INSTANCE.getElement("org.eclipse.emf.cdo.sessions", "cdo",
protocol + "://" + host + "?repositoryName=" + repositoryName);
return currentSession;
}
public void closeCurrentSession()
{
getCurrentSession().close();
}
/**
* opens a transaction on the given resourceSet
*/
public CDOTransaction openCurrentTransaction(ResourceSet resourceSet, String id)
{
if (id == null)
{
throw new DawnInvalidIdException("The identifier '" + id + "' is invalid for openeing a transaction");
}
if (TRACER.isEnabled())
{
TRACER.format("Opening transaction for {0} on {1}", id, resourceSet); //$NON-NLS-1$
}
id = convert(id);
CDOTransaction transaction = getCurrentSession().openTransaction(resourceSet);
getTransactions().put(id, transaction);
return transaction;
}
public void setChangeSubscribtionPolicyForCurrentTransaction(CDOAdapterPolicy policy, String id)
{
id = convert(id);
getTransactions().get(id).options().addChangeSubscriptionPolicy(policy);
}
public CDOTransaction getCurrentTransaction(String id)
{
id = convert(id);
return getTransactions().get(id);
}
// TODO find a better way to solve this problem
private String convert(String id)
{
return id.replace("dawn", "cdo");
}
public CDOSession getCurrentSession()
{
if (currentSession == null)
{
currentSession = openSession();
}
return currentSession;
}
public Map<String, CDOTransaction> getTransactions()
{
if (transactions == null)
{
transactions = new HashMap<String, CDOTransaction>();
}
return transactions;
}
public CDOView openView(CDOSession session)
{
return session.openView();
}
public CDOTransaction openTransaction(CDOSession session)
{
return session.openTransaction();
}
@Deprecated
public static void closeSession(CDOSession session)
{
session.close();
}
@SuppressWarnings("deprecation")
public CDOTransaction getOrOpenCurrentTransaction(String id, ResourceSet resourceSet, String repositoryName)
{
CDOTransaction transaction = getCurrentTransaction(id);
CDOViewSet viewSet = CDOUtil.getViewSet(resourceSet);
if (viewSet != null)
{
return ((InternalCDOView)viewSet.resolveView(repositoryName)).toTransaction();
}
if (transaction == null)
{
transaction = openCurrentTransaction(resourceSet, id);
}
return transaction;
}
public void setConnector(IConnector connector)
{
this.connector = connector;
}
public IConnector getConnector()
{
return connector;
}
}