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