/*******************************************************************************
* Copyright (c) 2004 Peter Nehrer and Composent, Inc.
* 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:
* Peter Nehrer - initial API and implementation
*******************************************************************************/
package org.eclipse.ecf.sdo.emf;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import org.eclipse.ecf.core.util.ECFException;
import org.eclipse.ecf.sdo.ISharedDataGraph;
import org.eclipse.ecf.sdo.IUpdateProvider;
import org.eclipse.ecf.sdo.SDOPlugin;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.sdo.EChangeSummary;
import org.eclipse.emf.ecore.sdo.EDataGraph;
import org.eclipse.emf.ecore.sdo.util.SDOUtil;
import commonj.sdo.DataGraph;
/**
* Update provider capable of handling EMF-based SDO data graphs.
*
* @author pnehrer
*/
public class EMFUpdateProvider implements IUpdateProvider {
public static final String TRACE_TAG = "EMFUpdateProvider";
private EDataGraph clone(EDataGraph source) throws IOException {
ByteArrayOutputStream buf = new ByteArrayOutputStream();
source.getDataGraphResource().save(buf, null);
return SDOUtil.loadDataGraph(
new ByteArrayInputStream(buf.toByteArray()), null);
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ecf.sdo.IUpdateProvider#createUpdate(org.eclipse.ecf.sdo.ISharedDataGraph)
*/
public byte[] createUpdate(ISharedDataGraph graph) throws ECFException {
EDataGraph clone;
try {
clone = clone((EDataGraph) graph.getDataGraph());
} catch (IOException e) {
throw new ECFException(e);
}
EChangeSummary changes = (EChangeSummary) clone.getChangeSummary();
changes.applyAndReverse();
ByteArrayOutputStream buf = new ByteArrayOutputStream();
try {
changes.eResource().save(buf, null);
if (SDOPlugin.isTracing(TRACE_TAG)) {
SDOPlugin.getTraceLog().println("commit:");
changes.eResource().save(SDOPlugin.getTraceLog(), null);
}
} catch (IOException e) {
throw new ECFException(e);
}
return buf.toByteArray();
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ecf.sdo.IUpdateProvider#applyUpdate(org.eclipse.ecf.sdo.ISharedDataGraph,
* byte[])
*/
public void applyUpdate(ISharedDataGraph graph, Object data)
throws ECFException {
EDataGraph dataGraph = (EDataGraph) graph.getDataGraph();
EChangeSummary changeSummary = (EChangeSummary) dataGraph
.getChangeSummary();
changeSummary.endLogging();
// throw away any local changes
changeSummary.apply();
Resource res = changeSummary.eResource();
res.unload();
// apply changes from the event
try {
res.load(new ByteArrayInputStream((byte[]) data), null);
if (SDOPlugin.isTracing(TRACE_TAG)) {
SDOPlugin.getTraceLog().println("processUpdate:");
res.save(SDOPlugin.getTraceLog(), null);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
changeSummary = (EChangeSummary) res.getContents().get(0);
dataGraph.setEChangeSummary(changeSummary);
// leave a change summary showing what has changed
changeSummary.applyAndReverse();
changeSummary.resumeLogging();
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ecf.sdo.IUpdateProvider#serializeDataGraph(commonj.sdo.DataGraph)
*/
public Object serializeDataGraph(DataGraph dataGraph) throws IOException {
EDataGraph clone = clone((EDataGraph) dataGraph);
EChangeSummary changeSummary = clone.getEChangeSummary();
if (changeSummary != null)
changeSummary.apply();
ByteArrayOutputStream buf = new ByteArrayOutputStream();
clone.getDataGraphResource().save(buf, null);
return buf.toByteArray();
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ecf.sdo.IUpdateProvider#deserializeDataGraph(Object)
*/
public DataGraph deserializeDataGraph(Object data) throws IOException,
ClassNotFoundException {
return SDOUtil.loadDataGraph(new ByteArrayInputStream((byte[]) data),
null);
}
}