blob: 43c5a038e8de5bc7f859d82f9e4f9549eb7f84c8 [file] [log] [blame]
package org.eclipse.emf.edapt.cdo.migration.execution;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.emf.cdo.common.model.CDOPackageRegistry;
import org.eclipse.emf.cdo.eresource.CDOResource;
import org.eclipse.emf.cdo.net4j.CDONet4jSessionConfiguration;
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.CDOURIData;
import org.eclipse.emf.cdo.util.CommitException;
import org.eclipse.emf.cdo.util.ConcurrentAccessException;
import org.eclipse.emf.cdo.view.AbstractCDOViewProvider;
import org.eclipse.emf.cdo.view.CDOView;
import org.eclipse.emf.cdo.view.CDOViewProvider;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.EPackage.Registry;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.net4j.Net4jUtil;
import org.eclipse.net4j.connector.IConnector;
import org.eclipse.net4j.tcp.TCPUtil;
import org.eclipse.net4j.util.container.IManagedContainer;
import org.eclipse.net4j.util.container.ManagedContainer;
import org.eclipse.net4j.util.lifecycle.LifecycleUtil;
import org.eclipse.net4j.util.security.IPasswordCredentialsProvider;
import org.eclipse.net4j.util.security.PasswordCredentials;
import org.eclipse.net4j.util.security.PasswordCredentialsProvider;
/**
* A CDO View provider for Edapt. It deals with {@link CDOURIData connection
* aware} and canonical URI. It also registers in CDO the {@link EPackage
* packages} from the {@link ResourceSet resourceset's} package registry. </br>
* Finally it stores the root resource. {@link CDOView#getRootResource} as there
* is no way to obtain it with a connection aware URI.
*
* @author Christophe Bouhier
*/
public class EdaptCDOViewProvider extends AbstractCDOViewProvider implements
CDOViewProvider {
// A Map holding containers specific to a repository.
private static Map<String, IManagedContainer> repoContainers = new HashMap<String, IManagedContainer>();
// A Map holding root resources
// CB Fixme, consider storing the canonical URI?
private static Map<String, CDOResource> rootResourceRegistry = new HashMap<String, CDOResource>();
public EdaptCDOViewProvider() {
}
public EdaptCDOViewProvider(String regex) {
super(regex);
}
public EdaptCDOViewProvider(String regex, int priority) {
super(regex, priority);
}
@Override
public CDOView getView(URI uri, ResourceSet resourceSet) {
final CDOURIData cdouriData = new CDOURIData(uri);
final String repoName = cdouriData.getRepositoryName();
IManagedContainer container = repoContainers.get(repoName);
if (container == null) {
container = new ManagedContainer();
Net4jUtil.prepareContainer(container);
TCPUtil.prepareContainer(container);
container.activate();
repoContainers.put(repoName, container);
} else {
for (final Object e : container.getElements()) {
System.out.println(e);
}
}
// TODO Base the connector on the schema.
final String uriSchema = cdouriData.getScheme();
System.out.println("EDAPT TODO: Schema requested is " + uriSchema //$NON-NLS-1$
+ " base connector on this requested schema. "); //$NON-NLS-1$
if (uriSchema.equals("cdo.net4j.tcp")) { //$NON-NLS-1$
// Base connector on TCP.
} else if (uriSchema.equals("cdo.net4j.jvm")) { //$NON-NLS-1$
// Base connector on JVM.
// Note, condition is a bundled which is server side.
// consider checks for this.
}
// Produce a TCPConnector which respects all params like UserID, Port,
// and Host.
final IConnector connector = (IConnector) container.getElement("org.eclipse.net4j.connectors", "tcp", //$NON-NLS-1$ //$NON-NLS-2$
cdouriData.getAuthority());
final CDONet4jSessionConfiguration config = CDONet4jUtil
.createNet4jSessionConfiguration();
config.setConnector(connector);
config.setRepositoryName(repoName);
if (cdouriData.getUserName() != null
&& cdouriData.getPassWord() != null) {
final PasswordCredentials passwordCredentials = new PasswordCredentials(
cdouriData.getUserName(), cdouriData.getPassWord()
.toCharArray());
final IPasswordCredentialsProvider credentialsProvider = new PasswordCredentialsProvider(
passwordCredentials);
config.setCredentialsProvider(credentialsProvider);
}
final CDOSession session = config.openNet4jSession();
// Make sure the packages are emulated.
session.options().setGeneratedPackageEmulationEnabled(true);
// Get the package registry for this resource set and make sure
// it is known in the repository. Note:
// CDO will also populate from the global registry when?
//
final Registry packageRegistry = resourceSet.getPackageRegistry();
boolean packagesAdded = false;
if (!packageRegistry.isEmpty()) {
final CDOPackageRegistry cdoPackageRegistry = session
.getPackageRegistry();
for (final String nsURI : packageRegistry.keySet()) {
final EPackage packageToAdd = packageRegistry.getEPackage(nsURI);
if (!cdoPackageRegistry.containsKey(nsURI)) {
cdoPackageRegistry.putEPackage(packageToAdd);
packagesAdded = true;
}
}
}
final CDOTransaction openTransaction = session.openTransaction(resourceSet);
// Commit the added EPackages to the registry.
if (packagesAdded) {
try {
openTransaction.commit();
} catch (final ConcurrentAccessException e) {
e.printStackTrace();
} catch (final CommitException e) {
e.printStackTrace();
}
}
if (rootResourceRegistry.get(repoName) == null) {
final CDOResource rootResource = openTransaction.getRootResource();
@SuppressWarnings("unused")
final URI uri2 = rootResource.getURI();
rootResourceRegistry.put(repoName, rootResource);
}
return openTransaction;
}
/**
* Get the root resource for a repository. This will only result if {@link EdaptCDOViewProvider this} provider was
* previously consulted.
*
* @param repoName
* @return the uri
*/
public CDOResource getRootResource(String repoName) {
final CDOResource cdoResource = rootResourceRegistry.get(repoName);
if (cdoResource != null) {
LifecycleUtil.checkActive(cdoResource);
return cdoResource;
}
return null;
}
}