/*******************************************************************************
* Copyright (c) 2009 Remy Chi Jian Suen 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:
* Remy Chi Jian Suen <remy.suen@gmail.com> - initial API and implementation
******************************************************************************/
package org.eclipse.ecf.internal.sync.resources.core;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import org.eclipse.core.runtime.Platform;
import org.eclipse.ecf.sync.IModelChange;
import org.eclipse.ecf.sync.IModelChangeMessage;
import org.eclipse.ecf.sync.IModelSynchronizationStrategy;
import org.eclipse.ecf.sync.SerializationException;
import org.eclipse.ecf.sync.resources.core.IResourceChange;
public class ResourcesSynchronizationStrategy implements
IModelSynchronizationStrategy {
private static final IModelSynchronizationStrategy strategy = new ResourcesSynchronizationStrategy();
public static IModelSynchronizationStrategy getInstance() {
return strategy;
}
public IModelChange deserializeRemoteChange(byte[] bytes)
throws SerializationException {
try {
Object object = new ObjectInputStream(new ByteArrayInputStream(
bytes)).readObject();
if (object instanceof BatchModelChange
|| object instanceof IResourceChange) {
return (IModelChange) object;
} else {
throw new SerializationException(
"Resources synchronization does not support deserializing "
+ object.getClass() + " instances");
}
} catch (IOException e) {
throw new SerializationException("Failed to read object");
} catch (ClassNotFoundException e) {
throw new SerializationException("Failed to load object class");
}
}
public IModelChangeMessage[] registerLocalChange(IModelChange localChange) {
if (localChange instanceof ResourceChangeMessage) {
return new IModelChangeMessage[] { (IModelChangeMessage) localChange };
}
return new IModelChangeMessage[0];
}
public IModelChange[] transformRemoteChange(IModelChange remoteChange) {
if (remoteChange instanceof BatchModelChange) {
IModelChangeMessage[] messages = ((BatchModelChange) remoteChange).getMessages();
IModelChange[] changes = new IModelChange[messages.length];
System.arraycopy(messages, 0, changes, 0, messages.length);
return changes;
}
return new IModelChange[] { remoteChange };
}
public Object getAdapter(Class adapter) {
return Platform.getAdapterManager().getAdapter(this, adapter);
}
}