package at.bestsolution.efxclipse.runtime.example.photoedit.resource.cdo;
import java.io.IOException;
import javax.inject.Inject;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.e4.core.services.events.IEventBroker;
import org.eclipse.emf.cdo.CDOObject;
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.CDOPostEventTransactionHandler;
import org.eclipse.emf.cdo.transaction.CDOTransaction;
import org.eclipse.emf.cdo.view.CDOAdapterPolicy;
import org.eclipse.emf.cdo.view.CDOInvalidationPolicy;
import org.eclipse.emf.cdo.view.CDOStaleReferencePolicy;
import org.eclipse.emf.cdo.view.CDOView;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
import org.eclipse.net4j.connector.IConnector;
import org.eclipse.net4j.util.container.IPluginContainer;
import at.bestsolution.efxclipse.runtime.example.photoedit.core.EventTopics;
import at.bestsolution.efxclipse.runtime.example.photoedit.core.ResourceStore;
import at.bestsolution.efxclipse.runtime.example.photoedit.model.photoedit.PhotoEditApp;
@SuppressWarnings("restriction")
public class CDOStorageResource implements ResourceStore {
@Inject
IEventBroker eventBroker;
private Resource resource;
private IConnector connector;
private String resourceName = "PhotoAppBusinessModel"; //$NON-NLS-1$
private String host = "192.168.2.105"; //$NON-NLS-1$
private CDOTransaction view;
public CDOStorageResource() {
host = System.getProperty("demoHost", "192.168.2.105"); //$NON-NLS-1$//$NON-NLS-2$
System.err.println("CDO !!!!!!!!");
}
@Override
public IStatus loadRoot(URI uri) {
resource = getView().getResource(resourceName);
// ResourceSet set = new ResourceSetImpl();
// resource = set.getResource(uri, true);
eventBroker.send(EventTopics.STORE_NEW_CONTENT, getPhotoEditApp());
return Status.OK_STATUS;
}
public PhotoEditApp getPhotoEditApp() {
if( resource == null ) {
loadRoot(null);
}
if( resource != null ) {
return (PhotoEditApp) resource.getContents().get(0);
}
return null;
}
@Override
public IStatus save() {
if (view instanceof CDOTransaction) {
try {
((CDOTransaction) view).commit();
} catch (Exception e) {
e.printStackTrace();
}
}
return Status.CANCEL_STATUS;
}
private CDOTransaction openTransaction(CDOSession session) {
final CDOTransaction transaction = session.openTransaction();
transaction.options().addChangeSubscriptionPolicy(CDOAdapterPolicy.ALL);
// transaction.addTransactionHandler(new CDOPostEventTransactionHandler.Default() {
// @Override
// protected void modifiedObject(CDOTransaction tx, CDOObject object, Notification msg) {
// try {
// transaction.commit();
// } catch (Exception e) {
// System.out.println("Commit problem. Conflicts: " + transaction.getConflicts()); //$NON-NLS-1$
// // e.printStackTrace();
// transaction.rollback();
// }
// }
// });
return transaction;
}
private CDOView getView() {
if( view != null ) {
return view;
}
CDOSession session = openSession();
view = openTransaction(session);
CDOView.Options options = view.options();
options.setStaleReferencePolicy(CDOStaleReferencePolicy.PROXY);
options.setInvalidationPolicy(CDOInvalidationPolicy.RELAXED);
return view;
}
private CDOSession openSession() {
connector = (IConnector) IPluginContainer.INSTANCE.getElement(
"org.eclipse.net4j.connectors", "tcp", host + ":2036"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
CDONet4jSessionConfiguration config = CDONet4jUtil.createNet4jSessionConfiguration();
config.setConnector(connector);
config.setRepositoryName("repo1"); //$NON-NLS-1$
return config.openNet4jSession();
}
}