platform35/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/SyncInfoWriter.java
changeset 40 eb3c938c7fef
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/platform35/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/SyncInfoWriter.java	Thu Jul 30 11:56:23 2009 -0500
@@ -0,0 +1,122 @@
+/*******************************************************************************
+ * 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);
+	}
+}