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


public class MetaData extends Task {
    private final static String TAG = MetaData.class.getSimpleName();

    private String mRelatedGid = null;

    public void setMeta(String gid, JSONObject metaInfo) {
        try {
            metaInfo.put(GTaskStringUtils.META_HEAD_GTASK_ID, gid);
        } catch (JSONException e) {
            Log.e(TAG, "failed to put related gid");
        }
        setNotes(metaInfo.toString());
        setName(GTaskStringUtils.META_NOTE_NAME);
    }
    /*
     这段代码定义了一个名为 MetaData 的类，它继承了 Task 类。
      Meta Data 类有一个私有的属性 mRelatedGid，它的值为 null。
      类中有两个方法，分别为 setMeta 和 getRelatedGid。
      setMeta 方法接受两个参数，一个字符串 gid 和一个 JSON 对象 metaInfo。
      此方法会尝试在 metaInfo 对象中添加一个以 GTaskStringUtils.META_HEAD_GTASK_ID 为键、gid 为值的键值对，如果添加失败则输出一个错误日志。
      随后该方法使用 setNotes 方法将 metaInfo 对象的字符串形式设置为任务的说明，并设置任务的名称为 GTaskStringUtils.META_NOTE_NAME。
      getRelatedGid 方法返回 mRelatedGid 属性的值。
    */

    public String getRelatedGid() {
        return mRelatedGid;
    }
    /*getRelatedGid() 方法：
    该方法返回 MetaData 对象的 mRelatedGid 字段，即任务的全局唯一标识符 gid。
     */

    @Override
    public boolean isWorthSaving() {
        return getNotes() != null;
    }
    /*isWorthSaving() 方法：该方法覆盖了 Task 类中的同名方法。
    该方法返回一个布尔值，指示任务是否值得保存。
    在这个实现中，如果任务的备注信息不为 null，则任务值得保存，返回 true；
    否则返回 false。
     */


    @Override
    public void setContentByRemoteJSON(JSONObject js) {// 调用父类的方法来设置 JSON 内容
        super.setContentByRemoteJSON(js);// 检查是否存在与对象相关联的注释（notes）
        if (getNotes() != null) {
            try {
                // 将注释内容解析为 JSON 对象
                JSONObject metaInfo = new JSONObject(getNotes().trim());
                // 从 JSON 对象中提取 GTASK_ID 字段的值，并将其存储在 mRelatedGid 变量中
                mRelatedGid = metaInfo.getString(GTaskStringUtils.META_HEAD_GTASK_ID);
            } catch (JSONException e) {
                ///如果在解析注释时出现异常，则将 mRelatedGid 变量设置为 null，并记录一个警告日志
                Log.w(TAG, "failed to get related gid");
                mRelatedGid = null;
            }
        }
    }
    /*这段代码是 MetaData 类的另外两个方法，isWorthSaving 和 setContentByRemoteJSON。

    isWorthSaving 方法覆盖了 Task 类中的同名方法。
    它返回一个布尔值，如果任务的说明不为 null，则返回 true，否则返回 false。

    setContentByRemoteJSON 方法覆盖了 Task 类中的同名方法。
    它接受一个 JSONObject 对象 js。首先，它调用了 Task 类中的 setContentByRemoteJSON 方法。
    然后，它检查任务的说明是否为 null。
    如果不是 null，则将它转换为一个 JSONObject 对象 metaInfo，然后从 metaInfo 对象中获取以 GTaskStringUtils.META_HEAD_GTASK_ID 为键的字符串值，
    将它赋值给 mRelatedGid 属性。如果无法从 metaInfo 对象中获取相关键值对，则将 mRelatedGid 属性赋值为 null，并输出一个警告日志。*/

    @Override
    public void setContentByLocalJSON(JSONObject js) {
        // this function should not be called
        throw new IllegalAccessError("MetaData:setContentByLocalJSON should not be called");
    }

    @Override
    public JSONObject getLocalJSONFromContent() {
        throw new IllegalAccessError("MetaData:getLocalJSONFromContent should not be called");
    }

    @Override
    public int getSyncAction(Cursor c) {
        throw new IllegalAccessError("MetaData:getSyncAction should not be called");
    }

}
/*这段代码定义了三个方法，均为覆盖（override）自父类 Task 的方法。这些方法被 MetaData 类重写，主要是为了禁止使用它们来保证程序的正确性。

setContentByLocalJSON 方法不应该被调用，因此该方法的实现中直接抛出了一个 IllegalAccessError 异常，提示该方法不应该被调用。

getLocalJSONFromContent 方法也不应该被调用，因此其实现方法与上述方法相同，也会抛出IllegalAccessError 异常。

getSyncAction 方法同样不应该被调用，并且其实现方法与前两个方法类似，会抛出一个IllegalAccessError 异常。

这些方法的目的是为了确保程序在运行时不会意外地调用这些方法，从而导致错误发生。如果有人在代码中尝试调用这些方法，将会得到明确的错误提示。*/