You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
git/java/net/micode/notes/gtask/data/MetaData.java

159 lines
6.5 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

/*
* Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
*
* 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 net.micode.notes.gtask.data;
import android.database.Cursor;
import android.util.Log;
import net.micode.notes.tool.GTaskStringUtils;
import org.json.JSONException;
import org.json.JSONObject;
/**
* GTask谷歌任务的元数据模型类
* 继承自抽象基类{@link Task}专门处理与GTask关联的元数据如关联的GTask ID
* 核心功能存储元数据的JSON信息、解析远程GTask的JSON数据获取关联ID、标记元数据是否值得保存
* 该类部分父类方法被重写为抛出异常因为元数据不需要本地JSON处理和同步动作判断的逻辑
*
* @author MiCode Open Source Community
* @date 2010-2011
* @see Task 抽象任务基类
*/
public class MetaData extends Task {
/**
* 日志标签使用类的简单名称MetaData便于Logcat中定位日志来源
*/
private final static String TAG = MetaData.class.getSimpleName();
/**
* 与当前元数据关联的GTask唯一标识Gid
* Gid是GTask系统中用于标识任务的唯一ID用于笔记与GTask的关联同步
*/
private String mRelatedGid = null;
/**
* 设置元数据内容将关联的GTask ID存入JSON对象并设置元数据的名称和笔记内容
* 步骤:
* 1. 向传入的JSON元数据对象中添加GTask ID的键值对
* 2. 将JSON对象转为字符串设置为当前任务的笔记内容notes字段
* 3. 设置当前任务的名称为元数据专用名称({@link GTaskStringUtils#META_NOTE_NAME}
*
* @param gid 关联的GTask唯一标识Gid
* @param metaInfo 存储元数据的JSON对象用于封装元数据键值对
*/
public void setMeta(String gid, JSONObject metaInfo) {
try {
// 向JSON对象中添加GTask ID的键值对键为META_HEAD_GTASK_ID
metaInfo.put(GTaskStringUtils.META_HEAD_GTASK_ID, gid);
} catch (JSONException e) {
// 捕获JSON操作异常输出错误日志
Log.e(TAG, "failed to put related gid");
}
// 将JSON对象转为字符串设置为任务的笔记内容父类Task的notes属性
setNotes(metaInfo.toString());
// 设置任务名称为元数据专用名称(区分普通任务和元数据任务)
setName(GTaskStringUtils.META_NOTE_NAME);
}
/**
* 获取与当前元数据关联的GTask ID
*
* @return 关联的GTask IDnull表示未设置或解析失败
*/
public String getRelatedGid() {
return mRelatedGid;
}
/**
* 重写父类方法,判断当前元数据是否值得保存到本地/远程
* 判定条件任务的笔记内容元数据JSON字符串不为null
* 该方法用于同步时过滤无意义的元数据,避免空数据存储
*
* @return true表示值得保存笔记内容非空false表示无需保存
*/
@Override
public boolean isWorthSaving() {
return getNotes() != null;
}
/**
* 重写父类方法根据远程GTask的JSON数据设置元数据内容
* 步骤:
* 1. 调用父类方法初始化基础任务内容
* 2. 若笔记内容元数据JSON字符串非空解析JSON获取关联的GTask ID
* 3. 捕获JSON解析异常输出警告日志并将GTask ID置为null
*
* @param js 远程GTask返回的JSON对象包含元数据信息
*/
@Override
public void setContentByRemoteJSON(JSONObject js) {
// 调用父类方法,处理基础的任务内容(如名称、笔记等)
super.setContentByRemoteJSON(js);
// 若笔记内容元数据JSON字符串非空则解析关联的GTask ID
if (getNotes() != null) {
try {
// 将笔记内容转为JSON对象去除首尾空格避免解析错误
JSONObject metaInfo = new JSONObject(getNotes().trim());
// 从JSON对象中获取GTask ID并赋值给成员变量
mRelatedGid = metaInfo.getString(GTaskStringUtils.META_HEAD_GTASK_ID);
} catch (JSONException e) {
// 捕获JSON解析异常输出警告日志将GTask ID置为null
Log.w(TAG, "failed to get related gid");
mRelatedGid = null;
}
}
}
/**
* 重写父类方法禁止调用该方法元数据不需要本地JSON处理
* 该方法被调用时会抛出非法访问错误,提示开发者该方法不适用
*
* @throws IllegalAccessError 调用该方法时立即抛出异常
*/
@Override
public void setContentByLocalJSON(JSONObject js) {
// 抛出异常说明该方法不应被调用元数据仅处理远程GTask的JSON不处理本地JSON
throw new IllegalAccessError("MetaData:setContentByLocalJSON should not be called");
}
/**
* 重写父类方法禁止调用该方法元数据不需要生成本地JSON
* 该方法被调用时会抛出非法访问错误,提示开发者该方法不适用
*
* @throws IllegalAccessError 调用该方法时立即抛出异常
* @return 无返回值(因为会直接抛出异常)
*/
@Override
public JSONObject getLocalJSONFromContent() {
throw new IllegalAccessError("MetaData:getLocalJSONFromContent should not be called");
}
/**
* 重写父类方法,禁止调用该方法(元数据不需要判断同步动作)
* 该方法被调用时会抛出非法访问错误,提示开发者该方法不适用
*
* @param c 数据库游标(用于查询本地数据),此处未使用
* @throws IllegalAccessError 调用该方法时立即抛出异常
* @return 无返回值(因为会直接抛出异常)
*/
@Override
public int getSyncAction(Cursor c) {
throw new IllegalAccessError("MetaData:getSyncAction should not be called");
}
}