/******************************************************************************* * 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); } }