/*******************************************************************************
* Copyright (c) 2012 - 2013 Torkild U. Resheim.
*
* 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:
* Torkild U. Resheim - initial API and implementation
*******************************************************************************/
package no.resheim.elibrarium.library.core;
import no.resheim.elibrarium.library.Library;
import no.resheim.elibrarium.library.LibraryFactory;
import org.eclipse.emf.cdo.CDOObject;
import org.eclipse.emf.cdo.eresource.CDOResource;
import org.eclipse.emf.cdo.net4j.CDONet4jSession;
import org.eclipse.emf.cdo.net4j.CDONet4jSessionConfiguration;
import org.eclipse.emf.cdo.net4j.CDONet4jUtil;
import org.eclipse.emf.cdo.transaction.CDOTransaction;
import org.eclipse.emf.cdo.util.CommitException;
import org.eclipse.emf.cdo.view.CDOAdapterPolicy;
import org.eclipse.emf.cdo.view.CDOView;
import org.eclipse.net4j.Net4jUtil;
import org.eclipse.net4j.connector.IConnector;
import org.eclipse.net4j.tcp.TCPUtil;
import org.eclipse.net4j.util.WrappedException;
import org.eclipse.net4j.util.container.ContainerUtil;
import org.eclipse.net4j.util.container.IManagedContainer;
import org.eclipse.net4j.util.lifecycle.Lifecycle;
import org.eclipse.net4j.util.lifecycle.LifecycleUtil;
/**
*
* @author Torkild U. Resheim
* @since 1.0
*/
public class CdoLibraryCatalog extends Lifecycle implements ILibraryCatalog {
static final CdoLibraryCatalog INSTANCE = new CdoLibraryCatalog();
private CDONet4jSession session;
private CDOView view;
private Library library;
private CdoLibraryCatalog() {
}
/** Catalogue path */
private final String path = "/library";
private IConnector connector;
private String repository;
private IManagedContainer container;
public synchronized Library getLibrary() {
if (library == null) {
String name = Librarian.CDO_REPOSITORY_ID + path;
if (!view.hasResource(name)) {
CDOTransaction transaction = session.openTransaction();
Library newInstance = LibraryFactory.eINSTANCE.createLibrary();
try {
CDOResource resource = transaction.createResource(name);
resource.getContents().add(newInstance);
transaction.commit();
} catch (CommitException ex) {
throw WrappedException.wrap(ex);
} finally {
transaction.close();
}
}
CDOResource resource = view.getResource(name);
library = (Library) resource.getContents().get(0);
}
return library;
}
public <T extends CDOObject> Object modify(T object, ITransactionalOperation<T> operation) {
CDOTransaction transaction = session.openTransaction();
try {
T transactionalObject = transaction.getObject(object);
Object result = operation.execute(transactionalObject);
transaction.commit();
if (result instanceof CDOObject) {
return view.getObject((CDOObject) result);
}
return result;
} catch (CommitException ex) {
throw WrappedException.wrap(ex);
} finally {
transaction.close();
}
}
@Override
protected void doActivate() throws Exception {
super.doActivate();
repository = Librarian.CDO_REPOSITORY_ID;
container = ContainerUtil.createContainer();
Net4jUtil.prepareContainer(container); // Register Net4j factories
TCPUtil.prepareContainer(container); // Register TCP factories
CDONet4jUtil.prepareContainer(container); // Register CDO factories
container.activate();
connector = Net4jUtil.getConnector(container, "tcp", Librarian.getDbServerAddress());
CDONet4jSessionConfiguration config = CDONet4jUtil.createNet4jSessionConfiguration();
config.setConnector(connector);
config.setRepositoryName(repository);
session = config.openNet4jSession();
view = session.openView();
view.options().addChangeSubscriptionPolicy(CDOAdapterPolicy.ALL);
}
@Override
protected void doDeactivate() throws Exception {
super.doDeactivate();
LifecycleUtil.deactivate(session);
LifecycleUtil.deactivate(connector);
LifecycleUtil.deactivate(repository);
LifecycleUtil.deactivate(container);
}
}