platform35/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/SyncInfoWriter.java
--- /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);
+ }
+}