/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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.alibaba.jstorm.utils;

import java.io.Serializable;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.commons.lang.builder.ToStringStyle;
import org.json.simple.JSONAware;

//import com.alibaba.fastjson.JSONAware;

public class FileAttribute implements Serializable, JSONAware {

    /**  */
    private static final long serialVersionUID = -5131640995402822835L;

    private String fileName;
    private String isDir;
    private String modifyTime;
    private String size;

    public static final String FILE_NAME_FIELD = "fileName";
    public static final String IS_DIR_FIELD = "isDir";
    public static final String MODIFY_TIME_FIELD = "modifyTime";
    public static final String SIZE_FIELD = "size";

    public String getFileName() {
        return fileName;
    }

    public void setFileName(String fileName) {
        this.fileName = fileName;
    }

    public String getIsDir() {
        return isDir;
    }

    public void setIsDir(String isDir) {
        this.isDir = isDir;
    }

    public String getModifyTime() {
        return modifyTime;
    }

    public void setModifyTime(String modifyTime) {
        this.modifyTime = modifyTime;
    }

    public String getSize() {
        return size;
    }

    public void setSize(String size) {
        this.size = size;
    }

    @Override
    public String toString() {
        return ToStringBuilder.reflectionToString(this, ToStringStyle.SHORT_PREFIX_STYLE);
    }

    @Override
    public String toJSONString() {
        Map<String, String> map = new HashMap<String, String>();

        map.put(FILE_NAME_FIELD, fileName);
        map.put(IS_DIR_FIELD, isDir);
        map.put(MODIFY_TIME_FIELD, modifyTime);
        map.put(SIZE_FIELD, size);
        return JStormUtils.to_json(map);
    }

    public static FileAttribute fromJSONObject(Map jobj) {
        if (jobj == null) {
            return null;
        }

        FileAttribute attribute = new FileAttribute();

        attribute.setFileName((String) jobj.get(FILE_NAME_FIELD));
        attribute.setIsDir((String) jobj.get(IS_DIR_FIELD));
        attribute.setModifyTime((String) jobj.get(MODIFY_TIME_FIELD));
        attribute.setSize((String) jobj.get(SIZE_FIELD));

        return attribute;
    }

    public static void main(String[] args) {
        Map<String, FileAttribute> map = new HashMap<String, FileAttribute>();

        FileAttribute attribute = new FileAttribute();
        attribute.setFileName("test");
        attribute.setIsDir("true");
        attribute.setModifyTime(new Date().toString());
        attribute.setSize("4096");

        map.put("test", attribute);

        System.out.println("Before:" + map);

        String jsonString = JStormUtils.to_json(map);

        Map<String, Map> map2 = (Map<String, Map>) JStormUtils.from_json(jsonString);

        Map jObject = map2.get("test");

        FileAttribute attribute2 = FileAttribute.fromJSONObject(jObject);

        System.out.println("attribute2:" + attribute2);
    }

}
