/*******************************************************************************
* Copyright (c) 2000, 2005 IBM Corporation 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:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.core.internal.resources;
import java.io.DataOutputStream;
import java.io.IOException;
import java.util.*;
import org.eclipse.core.internal.watson.IPathRequestor;
import org.eclipse.core.runtime.QualifiedName;
public class SyncInfoWriter {
protected Synchronizer synchronizer;
protected Workspace workspace;
// version number
public static final int SYNCINFO_SAVE_VERSION= 3;
public static final int SYNCINFO_SNAP_VERSION= 3;
// for sync info
public static final byte INDEX= 1;
public static final byte QNAME= 2;
public SyncInfoWriter(Workspace workspace, Synchronizer synchronizer) {
super();
this.workspace= workspace;
this.synchronizer= synchronizer;
}
public void savePartners(DataOutputStream output) throws IOException {
Set registry= synchronizer.getRegistry();
output.writeInt(registry.size());
for (Iterator i= registry.iterator(); i.hasNext();) {
QualifiedName qname= (QualifiedName)i.next();
output.writeUTF(qname.getQualifier());
output.writeUTF(qname.getLocalName());
}
}
/**
* SAVE_FILE -> VERSION_ID RESOURCE+ VERSION_ID -> int RESOURCE -> RESOURCE_PATH SIZE SYNCINFO*
* RESOURCE_PATH -> String SIZE -> int SYNCINFO -> TYPE BYTES TYPE -> INDEX | QNAME INDEX ->
* byte int QNAME -> byte String BYTES -> byte[]
*/
public void saveSyncInfo(ResourceInfo info, IPathRequestor requestor, DataOutputStream output, List writtenPartners) throws IOException {
Map table= info.getSyncInfo(false);
if (table == null)
return;
// if this is the first sync info that we have written, then
// write the version id for the file.
if (output.size() == 0)
output.writeInt(SYNCINFO_SAVE_VERSION);
output.writeUTF(requestor.requestPath().toString());
output.writeInt(table.size());
for (Iterator i= table.entrySet().iterator(); i.hasNext();) {
Map.Entry entry= (Map.Entry)i.next();
QualifiedName name= (QualifiedName)entry.getKey();
// if we have already written the partner name once, then write an integer
// constant to represent it instead to remove duplication
int index= writtenPartners.indexOf(name);
if (index == -1) {
// FIXME: what to do about null qualifier?
output.writeByte(QNAME);
output.writeUTF(name.getQualifier());
output.writeUTF(name.getLocalName());
writtenPartners.add(name);
} else {
output.writeByte(INDEX);
output.writeInt(index);
}
byte[] bytes= (byte[])entry.getValue();
output.writeInt(bytes.length);
output.write(bytes);
}
}
/**
* SNAP_FILE -> [VERSION_ID RESOURCE]* VERSION_ID -> int RESOURCE -> RESOURCE_PATH SIZE
* SYNCINFO* RESOURCE_PATH -> String SIZE -> int SYNCINFO -> QNAME BYTES QNAME -> String String
* BYTES -> byte[]
*/
public void snapSyncInfo(ResourceInfo info, IPathRequestor requestor, DataOutputStream output) throws IOException {
if (!info.isSet(ICoreConstants.M_SYNCINFO_SNAP_DIRTY))
return;
Map table= info.getSyncInfo(false);
if (table == null)
return;
// write the version id for the snapshot.
output.writeInt(SYNCINFO_SNAP_VERSION);
output.writeUTF(requestor.requestPath().toString());
output.writeInt(table.size());
for (Iterator i= table.entrySet().iterator(); i.hasNext();) {
Map.Entry entry= (Map.Entry)i.next();
QualifiedName name= (QualifiedName)entry.getKey();
output.writeUTF(name.getQualifier());
output.writeUTF(name.getLocalName());
byte[] bytes= (byte[])entry.getValue();
output.writeInt(bytes.length);
output.write(bytes);
}
info.clear(ICoreConstants.M_SYNCINFO_SNAP_DIRTY);
}
}