// Copyright 2012 Google Inc. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package com.google.collide.client.document;
import com.google.collide.client.util.PathUtil;
import com.google.collide.dto.ConflictChunk;
import com.google.collide.dto.NodeConflictDto.ConflictHandle;
import com.google.collide.json.shared.JsonArray;
import com.google.collide.shared.document.Document;
/**
* Utility methods for retrieving metadata associated with a document.
*/
public final class DocumentMetadata {
private static final String TAG_LINKED_TO_FILE = DocumentManager.class.getName()
+ ":LinkedToFile";
private static final String TAG_FILE_EDIT_SESSION_KEY = DocumentManager.class.getName()
+ ":FileEditSessionKey";
private static final String TAG_BEGIN_CC_REVISION = DocumentManager.class.getName()
+ ":BeginCcRevision";
private static final String TAG_PATH = DocumentManager.class.getName() + ":Path";
// TODO: move conflicts and conflict handle out of metadata.
private static final String TAG_CONFLICTS = DocumentManager.class.getName() + ":Conflicts";
private static final String TAG_CONFLICT_HANDLE =
DocumentManager.class.getName() + ":ConflictHandle";
/**
* Returns whether the document is linked to a file.
*
* If a document is not linked to a file, it is a client-only document.
* Metadata such as {@link #getFileEditSessionKey(Document)},
* {@link #getBeginCcRevision(Document)}, {@link #getConflicts(Document)},
* {@link #getPath(Document)} will be invalid.
*/
public static boolean isLinkedToFile(Document document) {
return ((Boolean) document.getTag(TAG_LINKED_TO_FILE)).booleanValue();
}
static void putLinkedToFile(Document document, boolean isLinkedToFile) {
document.putTag(TAG_LINKED_TO_FILE, isLinkedToFile);
}
/**
* Only valid if {@link #isLinkedToFile(Document)} is true.
*/
public static String getFileEditSessionKey(Document document) {
ensureLinkedToFile(document);
return document.getTag(TAG_FILE_EDIT_SESSION_KEY);
}
static void putFileEditSessionKey(Document document, String fileEditSessionKey) {
document.putTag(TAG_FILE_EDIT_SESSION_KEY, fileEditSessionKey);
}
/**
* Only valid if {@link #isLinkedToFile(Document)} is true.
*/
public static int getBeginCcRevision(Document document) {
ensureLinkedToFile(document);
return ((Integer) document.getTag(TAG_BEGIN_CC_REVISION)).intValue();
}
static void putBeginCcRevision(Document document, int beginCcRevision) {
document.putTag(TAG_BEGIN_CC_REVISION, beginCcRevision);
}
/**
* Only valid if {@link #isLinkedToFile(Document)} is true.
*/
public static PathUtil getPath(Document document) {
ensureLinkedToFile(document);
return document.getTag(TAG_PATH);
}
static void putPath(Document document, PathUtil path) {
document.putTag(TAG_PATH, path);
}
/**
* Only valid if {@link #isLinkedToFile(Document)} is true.
*/
public static JsonArray<ConflictChunk> getConflicts(Document document) {
ensureLinkedToFile(document);
return document.getTag(TAG_CONFLICTS);
}
static void putConflicts(Document document, JsonArray<ConflictChunk> conflicts) {
document.putTag(TAG_CONFLICTS, conflicts);
}
/**
* Only valid if {@link #isLinkedToFile(Document)} is true.
*/
public static ConflictHandle getConflictHandle(Document document) {
ensureLinkedToFile(document);
return document.getTag(TAG_CONFLICT_HANDLE);
}
static void putConflictHandle(Document document, ConflictHandle conflictHandle) {
document.putTag(TAG_CONFLICT_HANDLE, conflictHandle);
}
private static void ensureLinkedToFile(Document document) {
if (!isLinkedToFile(document)) {
throw new IllegalStateException("Document must be linked to file");
}
}
public static void clearConflicts(Document document) {
document.putTag(TAG_CONFLICT_HANDLE, null);
document.putTag(TAG_CONFLICTS, null);
}
}